Commit a5e26afa6130c122949039e9483bd0c2c588cc91
1 parent
1d542695
ppc: Convert FPR moves to TCG
Replace op_{load,store}_fpr with tcg_gen_mov_i64. Introduce i64 TCG variables cpu_fpr[0..31] and cpu_FT[0..2]. This obsoletes op_template.h for REG > 7. Signed-off-by: Andreas Faerber <andreas.faerber@web.de> Signed-off-by: Aurelien Jarno <aurelien@aurel32.net> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5156 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
3 changed files
with
65 additions
and
182 deletions
target-ppc/op.c
@@ -50,78 +50,6 @@ | @@ -50,78 +50,6 @@ | ||
50 | #define REG 7 | 50 | #define REG 7 |
51 | #include "op_template.h" | 51 | #include "op_template.h" |
52 | 52 | ||
53 | -#define REG 8 | ||
54 | -#include "op_template.h" | ||
55 | - | ||
56 | -#define REG 9 | ||
57 | -#include "op_template.h" | ||
58 | - | ||
59 | -#define REG 10 | ||
60 | -#include "op_template.h" | ||
61 | - | ||
62 | -#define REG 11 | ||
63 | -#include "op_template.h" | ||
64 | - | ||
65 | -#define REG 12 | ||
66 | -#include "op_template.h" | ||
67 | - | ||
68 | -#define REG 13 | ||
69 | -#include "op_template.h" | ||
70 | - | ||
71 | -#define REG 14 | ||
72 | -#include "op_template.h" | ||
73 | - | ||
74 | -#define REG 15 | ||
75 | -#include "op_template.h" | ||
76 | - | ||
77 | -#define REG 16 | ||
78 | -#include "op_template.h" | ||
79 | - | ||
80 | -#define REG 17 | ||
81 | -#include "op_template.h" | ||
82 | - | ||
83 | -#define REG 18 | ||
84 | -#include "op_template.h" | ||
85 | - | ||
86 | -#define REG 19 | ||
87 | -#include "op_template.h" | ||
88 | - | ||
89 | -#define REG 20 | ||
90 | -#include "op_template.h" | ||
91 | - | ||
92 | -#define REG 21 | ||
93 | -#include "op_template.h" | ||
94 | - | ||
95 | -#define REG 22 | ||
96 | -#include "op_template.h" | ||
97 | - | ||
98 | -#define REG 23 | ||
99 | -#include "op_template.h" | ||
100 | - | ||
101 | -#define REG 24 | ||
102 | -#include "op_template.h" | ||
103 | - | ||
104 | -#define REG 25 | ||
105 | -#include "op_template.h" | ||
106 | - | ||
107 | -#define REG 26 | ||
108 | -#include "op_template.h" | ||
109 | - | ||
110 | -#define REG 27 | ||
111 | -#include "op_template.h" | ||
112 | - | ||
113 | -#define REG 28 | ||
114 | -#include "op_template.h" | ||
115 | - | ||
116 | -#define REG 29 | ||
117 | -#include "op_template.h" | ||
118 | - | ||
119 | -#define REG 30 | ||
120 | -#include "op_template.h" | ||
121 | - | ||
122 | -#define REG 31 | ||
123 | -#include "op_template.h" | ||
124 | - | ||
125 | void OPPROTO op_print_mem_EA (void) | 53 | void OPPROTO op_print_mem_EA (void) |
126 | { | 54 | { |
127 | do_print_mem_EA(T0); | 55 | do_print_mem_EA(T0); |
target-ppc/op_template.h
@@ -18,7 +18,6 @@ | @@ -18,7 +18,6 @@ | ||
18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
19 | */ | 19 | */ |
20 | 20 | ||
21 | -#if REG <= 7 | ||
22 | /* Condition register moves */ | 21 | /* Condition register moves */ |
23 | void OPPROTO glue(op_load_crf_T0_crf, REG) (void) | 22 | void OPPROTO glue(op_load_crf_T0_crf, REG) (void) |
24 | { | 23 | { |
@@ -38,53 +37,4 @@ void OPPROTO glue(op_store_T0_crf_crf, REG) (void) | @@ -38,53 +37,4 @@ void OPPROTO glue(op_store_T0_crf_crf, REG) (void) | ||
38 | RETURN(); | 37 | RETURN(); |
39 | } | 38 | } |
40 | 39 | ||
41 | -#if 0 // Unused | ||
42 | -void OPPROTO glue(op_store_T1_crf_crf, REG) (void) | ||
43 | -{ | ||
44 | - env->crf[REG] = T1; | ||
45 | - RETURN(); | ||
46 | -} | ||
47 | -#endif | ||
48 | - | ||
49 | -#endif /* REG <= 7 */ | ||
50 | - | ||
51 | -/* floating point registers moves */ | ||
52 | -void OPPROTO glue(op_load_fpr_FT0_fpr, REG) (void) | ||
53 | -{ | ||
54 | - FT0 = env->fpr[REG]; | ||
55 | - RETURN(); | ||
56 | -} | ||
57 | - | ||
58 | -void OPPROTO glue(op_store_FT0_fpr_fpr, REG) (void) | ||
59 | -{ | ||
60 | - env->fpr[REG] = FT0; | ||
61 | - RETURN(); | ||
62 | -} | ||
63 | - | ||
64 | -void OPPROTO glue(op_load_fpr_FT1_fpr, REG) (void) | ||
65 | -{ | ||
66 | - FT1 = env->fpr[REG]; | ||
67 | - RETURN(); | ||
68 | -} | ||
69 | - | ||
70 | -void OPPROTO glue(op_store_FT1_fpr_fpr, REG) (void) | ||
71 | -{ | ||
72 | - env->fpr[REG] = FT1; | ||
73 | - RETURN(); | ||
74 | -} | ||
75 | - | ||
76 | -void OPPROTO glue(op_load_fpr_FT2_fpr, REG) (void) | ||
77 | -{ | ||
78 | - FT2 = env->fpr[REG]; | ||
79 | - RETURN(); | ||
80 | -} | ||
81 | - | ||
82 | -#if 0 // unused | ||
83 | -void OPPROTO glue(op_store_FT2_fpr_fpr, REG) (void) | ||
84 | -{ | ||
85 | - env->fpr[REG] = FT2; | ||
86 | - RETURN(); | ||
87 | -} | ||
88 | -#endif | ||
89 | - | ||
90 | #undef REG | 40 | #undef REG |
target-ppc/translate.c
@@ -50,11 +50,13 @@ static char cpu_reg_names[10*3 + 22*4 /* GPR */ | @@ -50,11 +50,13 @@ static char cpu_reg_names[10*3 + 22*4 /* GPR */ | ||
50 | #if !defined(TARGET_PPC64) | 50 | #if !defined(TARGET_PPC64) |
51 | + 10*4 + 22*5 /* SPE GPRh */ | 51 | + 10*4 + 22*5 /* SPE GPRh */ |
52 | #endif | 52 | #endif |
53 | + + 10*4 + 22*5 /* FPR */ | ||
53 | + 2*(10*6 + 22*7) /* AVRh, AVRl */]; | 54 | + 2*(10*6 + 22*7) /* AVRh, AVRl */]; |
54 | static TCGv cpu_gpr[32]; | 55 | static TCGv cpu_gpr[32]; |
55 | #if !defined(TARGET_PPC64) | 56 | #if !defined(TARGET_PPC64) |
56 | static TCGv cpu_gprh[32]; | 57 | static TCGv cpu_gprh[32]; |
57 | #endif | 58 | #endif |
59 | +static TCGv cpu_fpr[32]; | ||
58 | static TCGv cpu_avrh[32], cpu_avrl[32]; | 60 | static TCGv cpu_avrh[32], cpu_avrl[32]; |
59 | 61 | ||
60 | /* dyngen register indexes */ | 62 | /* dyngen register indexes */ |
@@ -64,6 +66,7 @@ static TCGv cpu_T[3]; | @@ -64,6 +66,7 @@ static TCGv cpu_T[3]; | ||
64 | #else | 66 | #else |
65 | static TCGv cpu_T64[3]; | 67 | static TCGv cpu_T64[3]; |
66 | #endif | 68 | #endif |
69 | +static TCGv cpu_FT[3]; | ||
67 | static TCGv cpu_AVRh[3], cpu_AVRl[3]; | 70 | static TCGv cpu_AVRh[3], cpu_AVRl[3]; |
68 | 71 | ||
69 | #include "gen-icount.h" | 72 | #include "gen-icount.h" |
@@ -101,6 +104,14 @@ void ppc_translate_init(void) | @@ -101,6 +104,14 @@ void ppc_translate_init(void) | ||
101 | TCG_AREG0, offsetof(CPUState, t2_64), | 104 | TCG_AREG0, offsetof(CPUState, t2_64), |
102 | "T2_64"); | 105 | "T2_64"); |
103 | #endif | 106 | #endif |
107 | + | ||
108 | + cpu_FT[0] = tcg_global_mem_new(TCG_TYPE_I64, TCG_AREG0, | ||
109 | + offsetof(CPUState, ft0), "FT0"); | ||
110 | + cpu_FT[1] = tcg_global_mem_new(TCG_TYPE_I64, TCG_AREG0, | ||
111 | + offsetof(CPUState, ft1), "FT1"); | ||
112 | + cpu_FT[2] = tcg_global_mem_new(TCG_TYPE_I64, TCG_AREG0, | ||
113 | + offsetof(CPUState, ft2), "FT2"); | ||
114 | + | ||
104 | cpu_AVRh[0] = tcg_global_mem_new(TCG_TYPE_I64, TCG_AREG0, | 115 | cpu_AVRh[0] = tcg_global_mem_new(TCG_TYPE_I64, TCG_AREG0, |
105 | offsetof(CPUState, avr0.u64[0]), "AVR0H"); | 116 | offsetof(CPUState, avr0.u64[0]), "AVR0H"); |
106 | cpu_AVRl[0] = tcg_global_mem_new(TCG_TYPE_I64, TCG_AREG0, | 117 | cpu_AVRl[0] = tcg_global_mem_new(TCG_TYPE_I64, TCG_AREG0, |
@@ -127,6 +138,10 @@ void ppc_translate_init(void) | @@ -127,6 +138,10 @@ void ppc_translate_init(void) | ||
127 | p += (i < 10) ? 4 : 5; | 138 | p += (i < 10) ? 4 : 5; |
128 | #endif | 139 | #endif |
129 | 140 | ||
141 | + sprintf(p, "fp%d", i); | ||
142 | + cpu_fpr[i] = tcg_global_mem_new(TCG_TYPE_I64, TCG_AREG0, | ||
143 | + offsetof(CPUState, fpr[i]), p); | ||
144 | + | ||
130 | sprintf(p, "avr%dH", i); | 145 | sprintf(p, "avr%dH", i); |
131 | cpu_avrh[i] = tcg_global_mem_new(TCG_TYPE_I64, TCG_AREG0, | 146 | cpu_avrh[i] = tcg_global_mem_new(TCG_TYPE_I64, TCG_AREG0, |
132 | offsetof(CPUState, avr[i].u64[0]), p); | 147 | offsetof(CPUState, avr[i].u64[0]), p); |
@@ -196,16 +211,6 @@ GEN8(gen_op_store_T0_crf, gen_op_store_T0_crf_crf); | @@ -196,16 +211,6 @@ GEN8(gen_op_store_T0_crf, gen_op_store_T0_crf_crf); | ||
196 | GEN8(gen_op_store_T1_crf, gen_op_store_T1_crf_crf); | 211 | GEN8(gen_op_store_T1_crf, gen_op_store_T1_crf_crf); |
197 | #endif | 212 | #endif |
198 | 213 | ||
199 | -/* floating point registers moves */ | ||
200 | -GEN32(gen_op_load_fpr_FT0, gen_op_load_fpr_FT0_fpr); | ||
201 | -GEN32(gen_op_load_fpr_FT1, gen_op_load_fpr_FT1_fpr); | ||
202 | -GEN32(gen_op_load_fpr_FT2, gen_op_load_fpr_FT2_fpr); | ||
203 | -GEN32(gen_op_store_FT0_fpr, gen_op_store_FT0_fpr_fpr); | ||
204 | -GEN32(gen_op_store_FT1_fpr, gen_op_store_FT1_fpr_fpr); | ||
205 | -#if 0 // unused | ||
206 | -GEN32(gen_op_store_FT2_fpr, gen_op_store_FT2_fpr_fpr); | ||
207 | -#endif | ||
208 | - | ||
209 | /* internal defines */ | 214 | /* internal defines */ |
210 | typedef struct DisasContext { | 215 | typedef struct DisasContext { |
211 | struct TranslationBlock *tb; | 216 | struct TranslationBlock *tb; |
@@ -1780,15 +1785,15 @@ GEN_HANDLER(f##name, op1, op2, 0xFF, 0x00000000, type) \ | @@ -1780,15 +1785,15 @@ GEN_HANDLER(f##name, op1, op2, 0xFF, 0x00000000, type) \ | ||
1780 | GEN_EXCP_NO_FP(ctx); \ | 1785 | GEN_EXCP_NO_FP(ctx); \ |
1781 | return; \ | 1786 | return; \ |
1782 | } \ | 1787 | } \ |
1783 | - gen_op_load_fpr_FT0(rA(ctx->opcode)); \ | ||
1784 | - gen_op_load_fpr_FT1(rC(ctx->opcode)); \ | ||
1785 | - gen_op_load_fpr_FT2(rB(ctx->opcode)); \ | 1788 | + tcg_gen_mov_i64(cpu_FT[0], cpu_fpr[rA(ctx->opcode)]); \ |
1789 | + tcg_gen_mov_i64(cpu_FT[1], cpu_fpr[rC(ctx->opcode)]); \ | ||
1790 | + tcg_gen_mov_i64(cpu_FT[2], cpu_fpr[rB(ctx->opcode)]); \ | ||
1786 | gen_reset_fpstatus(); \ | 1791 | gen_reset_fpstatus(); \ |
1787 | gen_op_f##op(); \ | 1792 | gen_op_f##op(); \ |
1788 | if (isfloat) { \ | 1793 | if (isfloat) { \ |
1789 | gen_op_frsp(); \ | 1794 | gen_op_frsp(); \ |
1790 | } \ | 1795 | } \ |
1791 | - gen_op_store_FT0_fpr(rD(ctx->opcode)); \ | 1796 | + tcg_gen_mov_i64(cpu_fpr[rD(ctx->opcode)], cpu_FT[0]); \ |
1792 | gen_compute_fprf(set_fprf, Rc(ctx->opcode) != 0); \ | 1797 | gen_compute_fprf(set_fprf, Rc(ctx->opcode) != 0); \ |
1793 | } | 1798 | } |
1794 | 1799 | ||
@@ -1803,14 +1808,14 @@ GEN_HANDLER(f##name, op1, op2, 0xFF, inval, type) \ | @@ -1803,14 +1808,14 @@ GEN_HANDLER(f##name, op1, op2, 0xFF, inval, type) \ | ||
1803 | GEN_EXCP_NO_FP(ctx); \ | 1808 | GEN_EXCP_NO_FP(ctx); \ |
1804 | return; \ | 1809 | return; \ |
1805 | } \ | 1810 | } \ |
1806 | - gen_op_load_fpr_FT0(rA(ctx->opcode)); \ | ||
1807 | - gen_op_load_fpr_FT1(rB(ctx->opcode)); \ | 1811 | + tcg_gen_mov_i64(cpu_FT[0], cpu_fpr[rA(ctx->opcode)]); \ |
1812 | + tcg_gen_mov_i64(cpu_FT[1], cpu_fpr[rB(ctx->opcode)]); \ | ||
1808 | gen_reset_fpstatus(); \ | 1813 | gen_reset_fpstatus(); \ |
1809 | gen_op_f##op(); \ | 1814 | gen_op_f##op(); \ |
1810 | if (isfloat) { \ | 1815 | if (isfloat) { \ |
1811 | gen_op_frsp(); \ | 1816 | gen_op_frsp(); \ |
1812 | } \ | 1817 | } \ |
1813 | - gen_op_store_FT0_fpr(rD(ctx->opcode)); \ | 1818 | + tcg_gen_mov_i64(cpu_fpr[rD(ctx->opcode)], cpu_FT[0]); \ |
1814 | gen_compute_fprf(set_fprf, Rc(ctx->opcode) != 0); \ | 1819 | gen_compute_fprf(set_fprf, Rc(ctx->opcode) != 0); \ |
1815 | } | 1820 | } |
1816 | #define GEN_FLOAT_AB(name, op2, inval, set_fprf, type) \ | 1821 | #define GEN_FLOAT_AB(name, op2, inval, set_fprf, type) \ |
@@ -1824,14 +1829,14 @@ GEN_HANDLER(f##name, op1, op2, 0xFF, inval, type) \ | @@ -1824,14 +1829,14 @@ GEN_HANDLER(f##name, op1, op2, 0xFF, inval, type) \ | ||
1824 | GEN_EXCP_NO_FP(ctx); \ | 1829 | GEN_EXCP_NO_FP(ctx); \ |
1825 | return; \ | 1830 | return; \ |
1826 | } \ | 1831 | } \ |
1827 | - gen_op_load_fpr_FT0(rA(ctx->opcode)); \ | ||
1828 | - gen_op_load_fpr_FT1(rC(ctx->opcode)); \ | 1832 | + tcg_gen_mov_i64(cpu_FT[0], cpu_fpr[rA(ctx->opcode)]); \ |
1833 | + tcg_gen_mov_i64(cpu_FT[1], cpu_fpr[rC(ctx->opcode)]); \ | ||
1829 | gen_reset_fpstatus(); \ | 1834 | gen_reset_fpstatus(); \ |
1830 | gen_op_f##op(); \ | 1835 | gen_op_f##op(); \ |
1831 | if (isfloat) { \ | 1836 | if (isfloat) { \ |
1832 | gen_op_frsp(); \ | 1837 | gen_op_frsp(); \ |
1833 | } \ | 1838 | } \ |
1834 | - gen_op_store_FT0_fpr(rD(ctx->opcode)); \ | 1839 | + tcg_gen_mov_i64(cpu_fpr[rD(ctx->opcode)], cpu_FT[0]); \ |
1835 | gen_compute_fprf(set_fprf, Rc(ctx->opcode) != 0); \ | 1840 | gen_compute_fprf(set_fprf, Rc(ctx->opcode) != 0); \ |
1836 | } | 1841 | } |
1837 | #define GEN_FLOAT_AC(name, op2, inval, set_fprf, type) \ | 1842 | #define GEN_FLOAT_AC(name, op2, inval, set_fprf, type) \ |
@@ -1845,10 +1850,10 @@ GEN_HANDLER(f##name, 0x3F, op2, op3, 0x001F0000, type) \ | @@ -1845,10 +1850,10 @@ GEN_HANDLER(f##name, 0x3F, op2, op3, 0x001F0000, type) \ | ||
1845 | GEN_EXCP_NO_FP(ctx); \ | 1850 | GEN_EXCP_NO_FP(ctx); \ |
1846 | return; \ | 1851 | return; \ |
1847 | } \ | 1852 | } \ |
1848 | - gen_op_load_fpr_FT0(rB(ctx->opcode)); \ | 1853 | + tcg_gen_mov_i64(cpu_FT[0], cpu_fpr[rB(ctx->opcode)]); \ |
1849 | gen_reset_fpstatus(); \ | 1854 | gen_reset_fpstatus(); \ |
1850 | gen_op_f##name(); \ | 1855 | gen_op_f##name(); \ |
1851 | - gen_op_store_FT0_fpr(rD(ctx->opcode)); \ | 1856 | + tcg_gen_mov_i64(cpu_fpr[rD(ctx->opcode)], cpu_FT[0]); \ |
1852 | gen_compute_fprf(set_fprf, Rc(ctx->opcode) != 0); \ | 1857 | gen_compute_fprf(set_fprf, Rc(ctx->opcode) != 0); \ |
1853 | } | 1858 | } |
1854 | 1859 | ||
@@ -1859,10 +1864,10 @@ GEN_HANDLER(f##name, op1, op2, 0xFF, 0x001F07C0, type) \ | @@ -1859,10 +1864,10 @@ GEN_HANDLER(f##name, op1, op2, 0xFF, 0x001F07C0, type) \ | ||
1859 | GEN_EXCP_NO_FP(ctx); \ | 1864 | GEN_EXCP_NO_FP(ctx); \ |
1860 | return; \ | 1865 | return; \ |
1861 | } \ | 1866 | } \ |
1862 | - gen_op_load_fpr_FT0(rB(ctx->opcode)); \ | 1867 | + tcg_gen_mov_i64(cpu_FT[0], cpu_fpr[rB(ctx->opcode)]); \ |
1863 | gen_reset_fpstatus(); \ | 1868 | gen_reset_fpstatus(); \ |
1864 | gen_op_f##name(); \ | 1869 | gen_op_f##name(); \ |
1865 | - gen_op_store_FT0_fpr(rD(ctx->opcode)); \ | 1870 | + tcg_gen_mov_i64(cpu_fpr[rD(ctx->opcode)], cpu_FT[0]); \ |
1866 | gen_compute_fprf(set_fprf, Rc(ctx->opcode) != 0); \ | 1871 | gen_compute_fprf(set_fprf, Rc(ctx->opcode) != 0); \ |
1867 | } | 1872 | } |
1868 | 1873 | ||
@@ -1902,10 +1907,10 @@ GEN_HANDLER(fsqrt, 0x3F, 0x16, 0xFF, 0x001F07C0, PPC_FLOAT_FSQRT) | @@ -1902,10 +1907,10 @@ GEN_HANDLER(fsqrt, 0x3F, 0x16, 0xFF, 0x001F07C0, PPC_FLOAT_FSQRT) | ||
1902 | GEN_EXCP_NO_FP(ctx); | 1907 | GEN_EXCP_NO_FP(ctx); |
1903 | return; | 1908 | return; |
1904 | } | 1909 | } |
1905 | - gen_op_load_fpr_FT0(rB(ctx->opcode)); | 1910 | + tcg_gen_mov_i64(cpu_FT[0], cpu_fpr[rB(ctx->opcode)]); |
1906 | gen_reset_fpstatus(); | 1911 | gen_reset_fpstatus(); |
1907 | gen_op_fsqrt(); | 1912 | gen_op_fsqrt(); |
1908 | - gen_op_store_FT0_fpr(rD(ctx->opcode)); | 1913 | + tcg_gen_mov_i64(cpu_fpr[rD(ctx->opcode)], cpu_FT[0]); |
1909 | gen_compute_fprf(1, Rc(ctx->opcode) != 0); | 1914 | gen_compute_fprf(1, Rc(ctx->opcode) != 0); |
1910 | } | 1915 | } |
1911 | 1916 | ||
@@ -1915,11 +1920,11 @@ GEN_HANDLER(fsqrts, 0x3B, 0x16, 0xFF, 0x001F07C0, PPC_FLOAT_FSQRT) | @@ -1915,11 +1920,11 @@ GEN_HANDLER(fsqrts, 0x3B, 0x16, 0xFF, 0x001F07C0, PPC_FLOAT_FSQRT) | ||
1915 | GEN_EXCP_NO_FP(ctx); | 1920 | GEN_EXCP_NO_FP(ctx); |
1916 | return; | 1921 | return; |
1917 | } | 1922 | } |
1918 | - gen_op_load_fpr_FT0(rB(ctx->opcode)); | 1923 | + tcg_gen_mov_i64(cpu_FT[0], cpu_fpr[rB(ctx->opcode)]); |
1919 | gen_reset_fpstatus(); | 1924 | gen_reset_fpstatus(); |
1920 | gen_op_fsqrt(); | 1925 | gen_op_fsqrt(); |
1921 | gen_op_frsp(); | 1926 | gen_op_frsp(); |
1922 | - gen_op_store_FT0_fpr(rD(ctx->opcode)); | 1927 | + tcg_gen_mov_i64(cpu_fpr[rD(ctx->opcode)], cpu_FT[0]); |
1923 | gen_compute_fprf(1, Rc(ctx->opcode) != 0); | 1928 | gen_compute_fprf(1, Rc(ctx->opcode) != 0); |
1924 | } | 1929 | } |
1925 | 1930 | ||
@@ -1966,8 +1971,8 @@ GEN_HANDLER(fcmpo, 0x3F, 0x00, 0x01, 0x00600001, PPC_FLOAT) | @@ -1966,8 +1971,8 @@ GEN_HANDLER(fcmpo, 0x3F, 0x00, 0x01, 0x00600001, PPC_FLOAT) | ||
1966 | GEN_EXCP_NO_FP(ctx); | 1971 | GEN_EXCP_NO_FP(ctx); |
1967 | return; | 1972 | return; |
1968 | } | 1973 | } |
1969 | - gen_op_load_fpr_FT0(rA(ctx->opcode)); | ||
1970 | - gen_op_load_fpr_FT1(rB(ctx->opcode)); | 1974 | + tcg_gen_mov_i64(cpu_FT[0], cpu_fpr[rA(ctx->opcode)]); |
1975 | + tcg_gen_mov_i64(cpu_FT[1], cpu_fpr[rB(ctx->opcode)]); | ||
1971 | gen_reset_fpstatus(); | 1976 | gen_reset_fpstatus(); |
1972 | gen_op_fcmpo(); | 1977 | gen_op_fcmpo(); |
1973 | gen_op_store_T0_crf(crfD(ctx->opcode)); | 1978 | gen_op_store_T0_crf(crfD(ctx->opcode)); |
@@ -1981,8 +1986,8 @@ GEN_HANDLER(fcmpu, 0x3F, 0x00, 0x00, 0x00600001, PPC_FLOAT) | @@ -1981,8 +1986,8 @@ GEN_HANDLER(fcmpu, 0x3F, 0x00, 0x00, 0x00600001, PPC_FLOAT) | ||
1981 | GEN_EXCP_NO_FP(ctx); | 1986 | GEN_EXCP_NO_FP(ctx); |
1982 | return; | 1987 | return; |
1983 | } | 1988 | } |
1984 | - gen_op_load_fpr_FT0(rA(ctx->opcode)); | ||
1985 | - gen_op_load_fpr_FT1(rB(ctx->opcode)); | 1989 | + tcg_gen_mov_i64(cpu_FT[0], cpu_fpr[rA(ctx->opcode)]); |
1990 | + tcg_gen_mov_i64(cpu_FT[1], cpu_fpr[rB(ctx->opcode)]); | ||
1986 | gen_reset_fpstatus(); | 1991 | gen_reset_fpstatus(); |
1987 | gen_op_fcmpu(); | 1992 | gen_op_fcmpu(); |
1988 | gen_op_store_T0_crf(crfD(ctx->opcode)); | 1993 | gen_op_store_T0_crf(crfD(ctx->opcode)); |
@@ -2002,8 +2007,8 @@ GEN_HANDLER(fmr, 0x3F, 0x08, 0x02, 0x001F0000, PPC_FLOAT) | @@ -2002,8 +2007,8 @@ GEN_HANDLER(fmr, 0x3F, 0x08, 0x02, 0x001F0000, PPC_FLOAT) | ||
2002 | GEN_EXCP_NO_FP(ctx); | 2007 | GEN_EXCP_NO_FP(ctx); |
2003 | return; | 2008 | return; |
2004 | } | 2009 | } |
2005 | - gen_op_load_fpr_FT0(rB(ctx->opcode)); | ||
2006 | - gen_op_store_FT0_fpr(rD(ctx->opcode)); | 2010 | + tcg_gen_mov_i64(cpu_FT[0], cpu_fpr[rB(ctx->opcode)]); |
2011 | + tcg_gen_mov_i64(cpu_fpr[rD(ctx->opcode)], cpu_FT[0]); | ||
2007 | gen_compute_fprf(0, Rc(ctx->opcode) != 0); | 2012 | gen_compute_fprf(0, Rc(ctx->opcode) != 0); |
2008 | } | 2013 | } |
2009 | 2014 | ||
@@ -2041,7 +2046,7 @@ GEN_HANDLER(mffs, 0x3F, 0x07, 0x12, 0x001FF800, PPC_FLOAT) | @@ -2041,7 +2046,7 @@ GEN_HANDLER(mffs, 0x3F, 0x07, 0x12, 0x001FF800, PPC_FLOAT) | ||
2041 | gen_optimize_fprf(); | 2046 | gen_optimize_fprf(); |
2042 | gen_reset_fpstatus(); | 2047 | gen_reset_fpstatus(); |
2043 | gen_op_load_fpscr_FT0(); | 2048 | gen_op_load_fpscr_FT0(); |
2044 | - gen_op_store_FT0_fpr(rD(ctx->opcode)); | 2049 | + tcg_gen_mov_i64(cpu_fpr[rD(ctx->opcode)], cpu_FT[0]); |
2045 | gen_compute_fprf(0, Rc(ctx->opcode) != 0); | 2050 | gen_compute_fprf(0, Rc(ctx->opcode) != 0); |
2046 | } | 2051 | } |
2047 | 2052 | ||
@@ -2096,7 +2101,7 @@ GEN_HANDLER(mtfsf, 0x3F, 0x07, 0x16, 0x02010000, PPC_FLOAT) | @@ -2096,7 +2101,7 @@ GEN_HANDLER(mtfsf, 0x3F, 0x07, 0x16, 0x02010000, PPC_FLOAT) | ||
2096 | return; | 2101 | return; |
2097 | } | 2102 | } |
2098 | gen_optimize_fprf(); | 2103 | gen_optimize_fprf(); |
2099 | - gen_op_load_fpr_FT0(rB(ctx->opcode)); | 2104 | + tcg_gen_mov_i64(cpu_FT[0], cpu_fpr[rB(ctx->opcode)]); |
2100 | gen_reset_fpstatus(); | 2105 | gen_reset_fpstatus(); |
2101 | gen_op_store_fpscr(FM(ctx->opcode)); | 2106 | gen_op_store_fpscr(FM(ctx->opcode)); |
2102 | if (unlikely(Rc(ctx->opcode) != 0)) { | 2107 | if (unlikely(Rc(ctx->opcode) != 0)) { |
@@ -2716,7 +2721,7 @@ GEN_HANDLER(l##width, opc, 0xFF, 0xFF, 0x00000000, type) \ | @@ -2716,7 +2721,7 @@ GEN_HANDLER(l##width, opc, 0xFF, 0xFF, 0x00000000, type) \ | ||
2716 | } \ | 2721 | } \ |
2717 | gen_addr_imm_index(ctx, 0); \ | 2722 | gen_addr_imm_index(ctx, 0); \ |
2718 | op_ldst(l##width); \ | 2723 | op_ldst(l##width); \ |
2719 | - gen_op_store_FT0_fpr(rD(ctx->opcode)); \ | 2724 | + tcg_gen_mov_i64(cpu_fpr[rD(ctx->opcode)], cpu_FT[0]); \ |
2720 | } | 2725 | } |
2721 | 2726 | ||
2722 | #define GEN_LDUF(width, opc, type) \ | 2727 | #define GEN_LDUF(width, opc, type) \ |
@@ -2732,7 +2737,7 @@ GEN_HANDLER(l##width##u, opc, 0xFF, 0xFF, 0x00000000, type) \ | @@ -2732,7 +2737,7 @@ GEN_HANDLER(l##width##u, opc, 0xFF, 0xFF, 0x00000000, type) \ | ||
2732 | } \ | 2737 | } \ |
2733 | gen_addr_imm_index(ctx, 0); \ | 2738 | gen_addr_imm_index(ctx, 0); \ |
2734 | op_ldst(l##width); \ | 2739 | op_ldst(l##width); \ |
2735 | - gen_op_store_FT0_fpr(rD(ctx->opcode)); \ | 2740 | + tcg_gen_mov_i64(cpu_fpr[rD(ctx->opcode)], cpu_FT[0]); \ |
2736 | tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], cpu_T[0]); \ | 2741 | tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], cpu_T[0]); \ |
2737 | } | 2742 | } |
2738 | 2743 | ||
@@ -2749,7 +2754,7 @@ GEN_HANDLER(l##width##ux, 0x1F, 0x17, opc, 0x00000001, type) \ | @@ -2749,7 +2754,7 @@ GEN_HANDLER(l##width##ux, 0x1F, 0x17, opc, 0x00000001, type) \ | ||
2749 | } \ | 2754 | } \ |
2750 | gen_addr_reg_index(ctx); \ | 2755 | gen_addr_reg_index(ctx); \ |
2751 | op_ldst(l##width); \ | 2756 | op_ldst(l##width); \ |
2752 | - gen_op_store_FT0_fpr(rD(ctx->opcode)); \ | 2757 | + tcg_gen_mov_i64(cpu_fpr[rD(ctx->opcode)], cpu_FT[0]); \ |
2753 | tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], cpu_T[0]); \ | 2758 | tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], cpu_T[0]); \ |
2754 | } | 2759 | } |
2755 | 2760 | ||
@@ -2762,7 +2767,7 @@ GEN_HANDLER(l##width##x, 0x1F, opc2, opc3, 0x00000001, type) \ | @@ -2762,7 +2767,7 @@ GEN_HANDLER(l##width##x, 0x1F, opc2, opc3, 0x00000001, type) \ | ||
2762 | } \ | 2767 | } \ |
2763 | gen_addr_reg_index(ctx); \ | 2768 | gen_addr_reg_index(ctx); \ |
2764 | op_ldst(l##width); \ | 2769 | op_ldst(l##width); \ |
2765 | - gen_op_store_FT0_fpr(rD(ctx->opcode)); \ | 2770 | + tcg_gen_mov_i64(cpu_fpr[rD(ctx->opcode)], cpu_FT[0]); \ |
2766 | } | 2771 | } |
2767 | 2772 | ||
2768 | #define GEN_LDFS(width, op, type) \ | 2773 | #define GEN_LDFS(width, op, type) \ |
@@ -2786,7 +2791,7 @@ GEN_HANDLER(st##width, opc, 0xFF, 0xFF, 0x00000000, type) \ | @@ -2786,7 +2791,7 @@ GEN_HANDLER(st##width, opc, 0xFF, 0xFF, 0x00000000, type) \ | ||
2786 | return; \ | 2791 | return; \ |
2787 | } \ | 2792 | } \ |
2788 | gen_addr_imm_index(ctx, 0); \ | 2793 | gen_addr_imm_index(ctx, 0); \ |
2789 | - gen_op_load_fpr_FT0(rS(ctx->opcode)); \ | 2794 | + tcg_gen_mov_i64(cpu_FT[0], cpu_fpr[rS(ctx->opcode)]); \ |
2790 | op_ldst(st##width); \ | 2795 | op_ldst(st##width); \ |
2791 | } | 2796 | } |
2792 | 2797 | ||
@@ -2802,7 +2807,7 @@ GEN_HANDLER(st##width##u, opc, 0xFF, 0xFF, 0x00000000, type) \ | @@ -2802,7 +2807,7 @@ GEN_HANDLER(st##width##u, opc, 0xFF, 0xFF, 0x00000000, type) \ | ||
2802 | return; \ | 2807 | return; \ |
2803 | } \ | 2808 | } \ |
2804 | gen_addr_imm_index(ctx, 0); \ | 2809 | gen_addr_imm_index(ctx, 0); \ |
2805 | - gen_op_load_fpr_FT0(rS(ctx->opcode)); \ | 2810 | + tcg_gen_mov_i64(cpu_FT[0], cpu_fpr[rS(ctx->opcode)]); \ |
2806 | op_ldst(st##width); \ | 2811 | op_ldst(st##width); \ |
2807 | tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], cpu_T[0]); \ | 2812 | tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], cpu_T[0]); \ |
2808 | } | 2813 | } |
@@ -2819,7 +2824,7 @@ GEN_HANDLER(st##width##ux, 0x1F, 0x17, opc, 0x00000001, type) \ | @@ -2819,7 +2824,7 @@ GEN_HANDLER(st##width##ux, 0x1F, 0x17, opc, 0x00000001, type) \ | ||
2819 | return; \ | 2824 | return; \ |
2820 | } \ | 2825 | } \ |
2821 | gen_addr_reg_index(ctx); \ | 2826 | gen_addr_reg_index(ctx); \ |
2822 | - gen_op_load_fpr_FT0(rS(ctx->opcode)); \ | 2827 | + tcg_gen_mov_i64(cpu_FT[0], cpu_fpr[rS(ctx->opcode)]); \ |
2823 | op_ldst(st##width); \ | 2828 | op_ldst(st##width); \ |
2824 | tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], cpu_T[0]); \ | 2829 | tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], cpu_T[0]); \ |
2825 | } | 2830 | } |
@@ -2832,7 +2837,7 @@ GEN_HANDLER(st##width##x, 0x1F, opc2, opc3, 0x00000001, type) \ | @@ -2832,7 +2837,7 @@ GEN_HANDLER(st##width##x, 0x1F, opc2, opc3, 0x00000001, type) \ | ||
2832 | return; \ | 2837 | return; \ |
2833 | } \ | 2838 | } \ |
2834 | gen_addr_reg_index(ctx); \ | 2839 | gen_addr_reg_index(ctx); \ |
2835 | - gen_op_load_fpr_FT0(rS(ctx->opcode)); \ | 2840 | + tcg_gen_mov_i64(cpu_FT[0], cpu_fpr[rS(ctx->opcode)]); \ |
2836 | op_ldst(st##width); \ | 2841 | op_ldst(st##width); \ |
2837 | } | 2842 | } |
2838 | 2843 | ||
@@ -4522,8 +4527,8 @@ GEN_HANDLER(lfq, 0x38, 0xFF, 0xFF, 0x00000003, PPC_POWER2) | @@ -4522,8 +4527,8 @@ GEN_HANDLER(lfq, 0x38, 0xFF, 0xFF, 0x00000003, PPC_POWER2) | ||
4522 | gen_update_nip(ctx, ctx->nip - 4); | 4527 | gen_update_nip(ctx, ctx->nip - 4); |
4523 | gen_addr_imm_index(ctx, 0); | 4528 | gen_addr_imm_index(ctx, 0); |
4524 | op_POWER2_lfq(); | 4529 | op_POWER2_lfq(); |
4525 | - gen_op_store_FT0_fpr(rD(ctx->opcode)); | ||
4526 | - gen_op_store_FT1_fpr(rD(ctx->opcode) + 1); | 4530 | + tcg_gen_mov_i64(cpu_fpr[rD(ctx->opcode)], cpu_FT[0]); |
4531 | + tcg_gen_mov_i64(cpu_fpr[rD(ctx->opcode) + 1], cpu_FT[1]); | ||
4527 | } | 4532 | } |
4528 | 4533 | ||
4529 | /* lfqu */ | 4534 | /* lfqu */ |
@@ -4535,8 +4540,8 @@ GEN_HANDLER(lfqu, 0x39, 0xFF, 0xFF, 0x00000003, PPC_POWER2) | @@ -4535,8 +4540,8 @@ GEN_HANDLER(lfqu, 0x39, 0xFF, 0xFF, 0x00000003, PPC_POWER2) | ||
4535 | gen_update_nip(ctx, ctx->nip - 4); | 4540 | gen_update_nip(ctx, ctx->nip - 4); |
4536 | gen_addr_imm_index(ctx, 0); | 4541 | gen_addr_imm_index(ctx, 0); |
4537 | op_POWER2_lfq(); | 4542 | op_POWER2_lfq(); |
4538 | - gen_op_store_FT0_fpr(rD(ctx->opcode)); | ||
4539 | - gen_op_store_FT1_fpr(rD(ctx->opcode) + 1); | 4543 | + tcg_gen_mov_i64(cpu_fpr[rD(ctx->opcode)], cpu_FT[0]); |
4544 | + tcg_gen_mov_i64(cpu_fpr[rD(ctx->opcode) + 1], cpu_FT[1]); | ||
4540 | if (ra != 0) | 4545 | if (ra != 0) |
4541 | tcg_gen_mov_tl(cpu_gpr[ra], cpu_T[0]); | 4546 | tcg_gen_mov_tl(cpu_gpr[ra], cpu_T[0]); |
4542 | } | 4547 | } |
@@ -4550,8 +4555,8 @@ GEN_HANDLER(lfqux, 0x1F, 0x17, 0x19, 0x00000001, PPC_POWER2) | @@ -4550,8 +4555,8 @@ GEN_HANDLER(lfqux, 0x1F, 0x17, 0x19, 0x00000001, PPC_POWER2) | ||
4550 | gen_update_nip(ctx, ctx->nip - 4); | 4555 | gen_update_nip(ctx, ctx->nip - 4); |
4551 | gen_addr_reg_index(ctx); | 4556 | gen_addr_reg_index(ctx); |
4552 | op_POWER2_lfq(); | 4557 | op_POWER2_lfq(); |
4553 | - gen_op_store_FT0_fpr(rD(ctx->opcode)); | ||
4554 | - gen_op_store_FT1_fpr(rD(ctx->opcode) + 1); | 4558 | + tcg_gen_mov_i64(cpu_fpr[rD(ctx->opcode)], cpu_FT[0]); |
4559 | + tcg_gen_mov_i64(cpu_fpr[rD(ctx->opcode) + 1], cpu_FT[1]); | ||
4555 | if (ra != 0) | 4560 | if (ra != 0) |
4556 | tcg_gen_mov_tl(cpu_gpr[ra], cpu_T[0]); | 4561 | tcg_gen_mov_tl(cpu_gpr[ra], cpu_T[0]); |
4557 | } | 4562 | } |
@@ -4563,8 +4568,8 @@ GEN_HANDLER(lfqx, 0x1F, 0x17, 0x18, 0x00000001, PPC_POWER2) | @@ -4563,8 +4568,8 @@ GEN_HANDLER(lfqx, 0x1F, 0x17, 0x18, 0x00000001, PPC_POWER2) | ||
4563 | gen_update_nip(ctx, ctx->nip - 4); | 4568 | gen_update_nip(ctx, ctx->nip - 4); |
4564 | gen_addr_reg_index(ctx); | 4569 | gen_addr_reg_index(ctx); |
4565 | op_POWER2_lfq(); | 4570 | op_POWER2_lfq(); |
4566 | - gen_op_store_FT0_fpr(rD(ctx->opcode)); | ||
4567 | - gen_op_store_FT1_fpr(rD(ctx->opcode) + 1); | 4571 | + tcg_gen_mov_i64(cpu_fpr[rD(ctx->opcode)], cpu_FT[0]); |
4572 | + tcg_gen_mov_i64(cpu_fpr[rD(ctx->opcode) + 1], cpu_FT[1]); | ||
4568 | } | 4573 | } |
4569 | 4574 | ||
4570 | /* stfq */ | 4575 | /* stfq */ |
@@ -4573,8 +4578,8 @@ GEN_HANDLER(stfq, 0x3C, 0xFF, 0xFF, 0x00000003, PPC_POWER2) | @@ -4573,8 +4578,8 @@ GEN_HANDLER(stfq, 0x3C, 0xFF, 0xFF, 0x00000003, PPC_POWER2) | ||
4573 | /* NIP cannot be restored if the memory exception comes from an helper */ | 4578 | /* NIP cannot be restored if the memory exception comes from an helper */ |
4574 | gen_update_nip(ctx, ctx->nip - 4); | 4579 | gen_update_nip(ctx, ctx->nip - 4); |
4575 | gen_addr_imm_index(ctx, 0); | 4580 | gen_addr_imm_index(ctx, 0); |
4576 | - gen_op_load_fpr_FT0(rS(ctx->opcode)); | ||
4577 | - gen_op_load_fpr_FT1(rS(ctx->opcode) + 1); | 4581 | + tcg_gen_mov_i64(cpu_FT[0], cpu_fpr[rS(ctx->opcode)]); |
4582 | + tcg_gen_mov_i64(cpu_FT[1], cpu_fpr[rS(ctx->opcode) + 1]); | ||
4578 | op_POWER2_stfq(); | 4583 | op_POWER2_stfq(); |
4579 | } | 4584 | } |
4580 | 4585 | ||
@@ -4586,8 +4591,8 @@ GEN_HANDLER(stfqu, 0x3D, 0xFF, 0xFF, 0x00000003, PPC_POWER2) | @@ -4586,8 +4591,8 @@ GEN_HANDLER(stfqu, 0x3D, 0xFF, 0xFF, 0x00000003, PPC_POWER2) | ||
4586 | /* NIP cannot be restored if the memory exception comes from an helper */ | 4591 | /* NIP cannot be restored if the memory exception comes from an helper */ |
4587 | gen_update_nip(ctx, ctx->nip - 4); | 4592 | gen_update_nip(ctx, ctx->nip - 4); |
4588 | gen_addr_imm_index(ctx, 0); | 4593 | gen_addr_imm_index(ctx, 0); |
4589 | - gen_op_load_fpr_FT0(rS(ctx->opcode)); | ||
4590 | - gen_op_load_fpr_FT1(rS(ctx->opcode) + 1); | 4594 | + tcg_gen_mov_i64(cpu_FT[0], cpu_fpr[rS(ctx->opcode)]); |
4595 | + tcg_gen_mov_i64(cpu_FT[1], cpu_fpr[rS(ctx->opcode) + 1]); | ||
4591 | op_POWER2_stfq(); | 4596 | op_POWER2_stfq(); |
4592 | if (ra != 0) | 4597 | if (ra != 0) |
4593 | tcg_gen_mov_tl(cpu_gpr[ra], cpu_T[0]); | 4598 | tcg_gen_mov_tl(cpu_gpr[ra], cpu_T[0]); |
@@ -4601,8 +4606,8 @@ GEN_HANDLER(stfqux, 0x1F, 0x17, 0x1D, 0x00000001, PPC_POWER2) | @@ -4601,8 +4606,8 @@ GEN_HANDLER(stfqux, 0x1F, 0x17, 0x1D, 0x00000001, PPC_POWER2) | ||
4601 | /* NIP cannot be restored if the memory exception comes from an helper */ | 4606 | /* NIP cannot be restored if the memory exception comes from an helper */ |
4602 | gen_update_nip(ctx, ctx->nip - 4); | 4607 | gen_update_nip(ctx, ctx->nip - 4); |
4603 | gen_addr_reg_index(ctx); | 4608 | gen_addr_reg_index(ctx); |
4604 | - gen_op_load_fpr_FT0(rS(ctx->opcode)); | ||
4605 | - gen_op_load_fpr_FT1(rS(ctx->opcode) + 1); | 4609 | + tcg_gen_mov_i64(cpu_FT[0], cpu_fpr[rS(ctx->opcode)]); |
4610 | + tcg_gen_mov_i64(cpu_FT[1], cpu_fpr[rS(ctx->opcode) + 1]); | ||
4606 | op_POWER2_stfq(); | 4611 | op_POWER2_stfq(); |
4607 | if (ra != 0) | 4612 | if (ra != 0) |
4608 | tcg_gen_mov_tl(cpu_gpr[ra], cpu_T[0]); | 4613 | tcg_gen_mov_tl(cpu_gpr[ra], cpu_T[0]); |
@@ -4614,8 +4619,8 @@ GEN_HANDLER(stfqx, 0x1F, 0x17, 0x1C, 0x00000001, PPC_POWER2) | @@ -4614,8 +4619,8 @@ GEN_HANDLER(stfqx, 0x1F, 0x17, 0x1C, 0x00000001, PPC_POWER2) | ||
4614 | /* NIP cannot be restored if the memory exception comes from an helper */ | 4619 | /* NIP cannot be restored if the memory exception comes from an helper */ |
4615 | gen_update_nip(ctx, ctx->nip - 4); | 4620 | gen_update_nip(ctx, ctx->nip - 4); |
4616 | gen_addr_reg_index(ctx); | 4621 | gen_addr_reg_index(ctx); |
4617 | - gen_op_load_fpr_FT0(rS(ctx->opcode)); | ||
4618 | - gen_op_load_fpr_FT1(rS(ctx->opcode) + 1); | 4622 | + tcg_gen_mov_i64(cpu_FT[0], cpu_fpr[rS(ctx->opcode)]); |
4623 | + tcg_gen_mov_i64(cpu_FT[1], cpu_fpr[rS(ctx->opcode) + 1]); | ||
4619 | op_POWER2_stfq(); | 4624 | op_POWER2_stfq(); |
4620 | } | 4625 | } |
4621 | 4626 |