Commit 714547bbc7db79a1d7e6544bf90c9ee1073d6881
1 parent
bcdf9b4d
Convert basic float32 ops to TCG
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5189 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
3 changed files
with
329 additions
and
190 deletions
target-sparc/helper.h
... | ... | @@ -58,12 +58,12 @@ DEF_HELPER(void, helper_st_asi, (target_ulong addr, uint64_t val, int asi, \ |
58 | 58 | DEF_HELPER(void, helper_ldfsr, (uint32_t new_fsr)) |
59 | 59 | DEF_HELPER(void, helper_check_ieee_exceptions, (void)) |
60 | 60 | DEF_HELPER(void, helper_clear_float_exceptions, (void)) |
61 | -DEF_HELPER(void, helper_fabss, (void)) | |
62 | -DEF_HELPER(void, helper_fsqrts, (void)) | |
61 | +DEF_HELPER(float32, helper_fabss, (float32 src)) | |
62 | +DEF_HELPER(float32, helper_fsqrts, (float32 src)) | |
63 | 63 | DEF_HELPER(void, helper_fsqrtd, (void)) |
64 | -DEF_HELPER(void, helper_fcmps, (void)) | |
64 | +DEF_HELPER(void, helper_fcmps, (float32 src1, float32 src2)) | |
65 | 65 | DEF_HELPER(void, helper_fcmpd, (void)) |
66 | -DEF_HELPER(void, helper_fcmpes, (void)) | |
66 | +DEF_HELPER(void, helper_fcmpes, (float32 src1, float32 src2)) | |
67 | 67 | DEF_HELPER(void, helper_fcmped, (void)) |
68 | 68 | DEF_HELPER(void, helper_fsqrtq, (void)) |
69 | 69 | DEF_HELPER(void, helper_fcmpq, (void)) |
... | ... | @@ -71,17 +71,17 @@ DEF_HELPER(void, helper_fcmpeq, (void)) |
71 | 71 | #ifdef TARGET_SPARC64 |
72 | 72 | DEF_HELPER(void, helper_ldxfsr, (uint64_t new_fsr)) |
73 | 73 | DEF_HELPER(void, helper_fabsd, (void)) |
74 | -DEF_HELPER(void, helper_fcmps_fcc1, (void)) | |
74 | +DEF_HELPER(void, helper_fcmps_fcc1, (float32 src1, float32 src2)) | |
75 | +DEF_HELPER(void, helper_fcmps_fcc2, (float32 src1, float32 src2)) | |
76 | +DEF_HELPER(void, helper_fcmps_fcc3, (float32 src1, float32 src2)) | |
75 | 77 | DEF_HELPER(void, helper_fcmpd_fcc1, (void)) |
76 | -DEF_HELPER(void, helper_fcmps_fcc2, (void)) | |
77 | 78 | DEF_HELPER(void, helper_fcmpd_fcc2, (void)) |
78 | -DEF_HELPER(void, helper_fcmps_fcc3, (void)) | |
79 | 79 | DEF_HELPER(void, helper_fcmpd_fcc3, (void)) |
80 | -DEF_HELPER(void, helper_fcmpes_fcc1, (void)) | |
80 | +DEF_HELPER(void, helper_fcmpes_fcc1, (float32 src1, float32 src2)) | |
81 | +DEF_HELPER(void, helper_fcmpes_fcc2, (float32 src1, float32 src2)) | |
82 | +DEF_HELPER(void, helper_fcmpes_fcc3, (float32 src1, float32 src2)) | |
81 | 83 | DEF_HELPER(void, helper_fcmped_fcc1, (void)) |
82 | -DEF_HELPER(void, helper_fcmpes_fcc2, (void)) | |
83 | 84 | DEF_HELPER(void, helper_fcmped_fcc2, (void)) |
84 | -DEF_HELPER(void, helper_fcmpes_fcc3, (void)) | |
85 | 85 | DEF_HELPER(void, helper_fcmped_fcc3, (void)) |
86 | 86 | DEF_HELPER(void, helper_fabsq, (void)) |
87 | 87 | DEF_HELPER(void, helper_fcmpq_fcc1, (void)) |
... | ... | @@ -97,17 +97,28 @@ DEF_HELPER(void, raise_exception, (int tt)) |
97 | 97 | F_HELPER_0_0(name ## s); \ |
98 | 98 | F_HELPER_0_0(name ## d); \ |
99 | 99 | F_HELPER_0_0(name ## q) |
100 | +#define F_HELPER_DQ_0_0(name) \ | |
101 | + F_HELPER_0_0(name ## d); \ | |
102 | + F_HELPER_0_0(name ## q) | |
103 | + | |
104 | +F_HELPER_DQ_0_0(add); | |
105 | +F_HELPER_DQ_0_0(sub); | |
106 | +F_HELPER_DQ_0_0(mul); | |
107 | +F_HELPER_DQ_0_0(div); | |
100 | 108 | |
101 | -F_HELPER_SDQ_0_0(add); | |
102 | -F_HELPER_SDQ_0_0(sub); | |
103 | -F_HELPER_SDQ_0_0(mul); | |
104 | -F_HELPER_SDQ_0_0(div); | |
109 | +DEF_HELPER(float32, helper_fadds, (float32 src1, float32 src2)) | |
110 | +DEF_HELPER(float32, helper_fsubs, (float32 src1, float32 src2)) | |
111 | +DEF_HELPER(float32, helper_fmuls, (float32 src1, float32 src2)) | |
112 | +DEF_HELPER(float32, helper_fdivs, (float32 src1, float32 src2)) | |
105 | 113 | |
106 | 114 | F_HELPER_0_0(smuld); |
107 | 115 | F_HELPER_0_0(dmulq); |
108 | 116 | |
109 | -DEF_HELPER(void, helper_fnegs, (void)) | |
110 | -F_HELPER_SDQ_0_0(ito); | |
117 | +DEF_HELPER(float32, helper_fnegs, (float32 src)) | |
118 | +F_HELPER_DQ_0_0(ito); | |
119 | + | |
120 | +DEF_HELPER(float32, helper_fitos, (int32_t src)) | |
121 | + | |
111 | 122 | #ifdef TARGET_SPARC64 |
112 | 123 | DEF_HELPER(void, helper_fnegd, (void)) |
113 | 124 | DEF_HELPER(void, helper_fnegq, (void)) |
... | ... | @@ -119,7 +130,7 @@ F_HELPER_0_0(qtos); |
119 | 130 | F_HELPER_0_0(stoq); |
120 | 131 | F_HELPER_0_0(qtod); |
121 | 132 | F_HELPER_0_0(dtoq); |
122 | -F_HELPER_0_0(stoi); | |
133 | +DEF_HELPER(int32_t, helper_fstoi, (float32 src)) | |
123 | 134 | F_HELPER_0_0(dtoi); |
124 | 135 | F_HELPER_0_0(qtoi); |
125 | 136 | #ifdef TARGET_SPARC64 |
... | ... | @@ -176,6 +187,6 @@ VIS_CMPHELPER(cmple); |
176 | 187 | VIS_CMPHELPER(cmpne); |
177 | 188 | #endif |
178 | 189 | #undef F_HELPER_0_0 |
179 | -#undef F_HELPER_SDQ_0_0 | |
190 | +#undef F_HELPER_DQ_0_0 | |
180 | 191 | #undef VIS_HELPER |
181 | 192 | #undef VIS_CMPHELPER | ... | ... |
target-sparc/op_helper.c
... | ... | @@ -87,9 +87,9 @@ void helper_check_align(target_ulong addr, uint32_t align) |
87 | 87 | #define F_HELPER(name, p) void helper_f##name##p(void) |
88 | 88 | |
89 | 89 | #define F_BINOP(name) \ |
90 | - F_HELPER(name, s) \ | |
90 | + float32 helper_f ## name ## s (float32 src1, float32 src2) \ | |
91 | 91 | { \ |
92 | - FT0 = float32_ ## name (FT0, FT1, &env->fp_status); \ | |
92 | + return float32_ ## name (src1, src2, &env->fp_status); \ | |
93 | 93 | } \ |
94 | 94 | F_HELPER(name, d) \ |
95 | 95 | { \ |
... | ... | @@ -120,9 +120,9 @@ void helper_fdmulq(void) |
120 | 120 | &env->fp_status); |
121 | 121 | } |
122 | 122 | |
123 | -F_HELPER(neg, s) | |
123 | +float32 helper_fnegs(float32 src) | |
124 | 124 | { |
125 | - FT0 = float32_chs(FT1); | |
125 | + return float32_chs(src); | |
126 | 126 | } |
127 | 127 | |
128 | 128 | #ifdef TARGET_SPARC64 |
... | ... | @@ -138,9 +138,9 @@ F_HELPER(neg, q) |
138 | 138 | #endif |
139 | 139 | |
140 | 140 | /* Integer to float conversion. */ |
141 | -F_HELPER(ito, s) | |
141 | +float32 helper_fitos(int32_t src) | |
142 | 142 | { |
143 | - FT0 = int32_to_float32(*((int32_t *)&FT1), &env->fp_status); | |
143 | + return int32_to_float32(src, &env->fp_status); | |
144 | 144 | } |
145 | 145 | |
146 | 146 | F_HELPER(ito, d) |
... | ... | @@ -203,9 +203,9 @@ void helper_fdtoq(void) |
203 | 203 | } |
204 | 204 | |
205 | 205 | /* Float to integer conversion. */ |
206 | -void helper_fstoi(void) | |
206 | +int32_t helper_fstoi(float32 src) | |
207 | 207 | { |
208 | - *((int32_t *)&FT0) = float32_to_int32_round_to_zero(FT1, &env->fp_status); | |
208 | + return float32_to_int32_round_to_zero(src, &env->fp_status); | |
209 | 209 | } |
210 | 210 | |
211 | 211 | void helper_fdtoi(void) |
... | ... | @@ -714,9 +714,9 @@ void helper_clear_float_exceptions(void) |
714 | 714 | set_float_exception_flags(0, &env->fp_status); |
715 | 715 | } |
716 | 716 | |
717 | -void helper_fabss(void) | |
717 | +float32 helper_fabss(float32 src) | |
718 | 718 | { |
719 | - FT0 = float32_abs(FT1); | |
719 | + return float32_abs(src); | |
720 | 720 | } |
721 | 721 | |
722 | 722 | #ifdef TARGET_SPARC64 |
... | ... | @@ -731,9 +731,9 @@ void helper_fabsq(void) |
731 | 731 | } |
732 | 732 | #endif |
733 | 733 | |
734 | -void helper_fsqrts(void) | |
734 | +float32 helper_fsqrts(float32 src) | |
735 | 735 | { |
736 | - FT0 = float32_sqrt(FT1, &env->fp_status); | |
736 | + return float32_sqrt(src, &env->fp_status); | |
737 | 737 | } |
738 | 738 | |
739 | 739 | void helper_fsqrtd(void) |
... | ... | @@ -776,41 +776,72 @@ void helper_fsqrtq(void) |
776 | 776 | } \ |
777 | 777 | env->fsr |= new_fsr; \ |
778 | 778 | } |
779 | +#define GEN_FCMPS(name, size, FS, TRAP) \ | |
780 | + void glue(helper_, name)(float32 src1, float32 src2) \ | |
781 | + { \ | |
782 | + target_ulong new_fsr; \ | |
783 | + \ | |
784 | + env->fsr &= ~((FSR_FCC1 | FSR_FCC0) << FS); \ | |
785 | + switch (glue(size, _compare) (src1, src2, &env->fp_status)) { \ | |
786 | + case float_relation_unordered: \ | |
787 | + new_fsr = (FSR_FCC1 | FSR_FCC0) << FS; \ | |
788 | + if ((env->fsr & FSR_NVM) || TRAP) { \ | |
789 | + env->fsr |= new_fsr; \ | |
790 | + env->fsr |= FSR_NVC; \ | |
791 | + env->fsr |= FSR_FTT_IEEE_EXCP; \ | |
792 | + raise_exception(TT_FP_EXCP); \ | |
793 | + } else { \ | |
794 | + env->fsr |= FSR_NVA; \ | |
795 | + } \ | |
796 | + break; \ | |
797 | + case float_relation_less: \ | |
798 | + new_fsr = FSR_FCC0 << FS; \ | |
799 | + break; \ | |
800 | + case float_relation_greater: \ | |
801 | + new_fsr = FSR_FCC1 << FS; \ | |
802 | + break; \ | |
803 | + default: \ | |
804 | + new_fsr = 0; \ | |
805 | + break; \ | |
806 | + } \ | |
807 | + env->fsr |= new_fsr; \ | |
808 | + } | |
779 | 809 | |
780 | -GEN_FCMP(fcmps, float32, FT0, FT1, 0, 0); | |
810 | +GEN_FCMPS(fcmps, float32, 0, 0); | |
781 | 811 | GEN_FCMP(fcmpd, float64, DT0, DT1, 0, 0); |
782 | 812 | |
783 | -GEN_FCMP(fcmpes, float32, FT0, FT1, 0, 1); | |
813 | +GEN_FCMPS(fcmpes, float32, 0, 1); | |
784 | 814 | GEN_FCMP(fcmped, float64, DT0, DT1, 0, 1); |
785 | 815 | |
786 | 816 | GEN_FCMP(fcmpq, float128, QT0, QT1, 0, 0); |
787 | 817 | GEN_FCMP(fcmpeq, float128, QT0, QT1, 0, 1); |
788 | 818 | |
789 | 819 | #ifdef TARGET_SPARC64 |
790 | -GEN_FCMP(fcmps_fcc1, float32, FT0, FT1, 22, 0); | |
820 | +GEN_FCMPS(fcmps_fcc1, float32, 22, 0); | |
791 | 821 | GEN_FCMP(fcmpd_fcc1, float64, DT0, DT1, 22, 0); |
792 | 822 | GEN_FCMP(fcmpq_fcc1, float128, QT0, QT1, 22, 0); |
793 | 823 | |
794 | -GEN_FCMP(fcmps_fcc2, float32, FT0, FT1, 24, 0); | |
824 | +GEN_FCMPS(fcmps_fcc2, float32, 24, 0); | |
795 | 825 | GEN_FCMP(fcmpd_fcc2, float64, DT0, DT1, 24, 0); |
796 | 826 | GEN_FCMP(fcmpq_fcc2, float128, QT0, QT1, 24, 0); |
797 | 827 | |
798 | -GEN_FCMP(fcmps_fcc3, float32, FT0, FT1, 26, 0); | |
828 | +GEN_FCMPS(fcmps_fcc3, float32, 26, 0); | |
799 | 829 | GEN_FCMP(fcmpd_fcc3, float64, DT0, DT1, 26, 0); |
800 | 830 | GEN_FCMP(fcmpq_fcc3, float128, QT0, QT1, 26, 0); |
801 | 831 | |
802 | -GEN_FCMP(fcmpes_fcc1, float32, FT0, FT1, 22, 1); | |
832 | +GEN_FCMPS(fcmpes_fcc1, float32, 22, 1); | |
803 | 833 | GEN_FCMP(fcmped_fcc1, float64, DT0, DT1, 22, 1); |
804 | 834 | GEN_FCMP(fcmpeq_fcc1, float128, QT0, QT1, 22, 1); |
805 | 835 | |
806 | -GEN_FCMP(fcmpes_fcc2, float32, FT0, FT1, 24, 1); | |
836 | +GEN_FCMPS(fcmpes_fcc2, float32, 24, 1); | |
807 | 837 | GEN_FCMP(fcmped_fcc2, float64, DT0, DT1, 24, 1); |
808 | 838 | GEN_FCMP(fcmpeq_fcc2, float128, QT0, QT1, 24, 1); |
809 | 839 | |
810 | -GEN_FCMP(fcmpes_fcc3, float32, FT0, FT1, 26, 1); | |
840 | +GEN_FCMPS(fcmpes_fcc3, float32, 26, 1); | |
811 | 841 | GEN_FCMP(fcmped_fcc3, float64, DT0, DT1, 26, 1); |
812 | 842 | GEN_FCMP(fcmpeq_fcc3, float128, QT0, QT1, 26, 1); |
813 | 843 | #endif |
844 | +#undef GEN_FCMPS | |
814 | 845 | |
815 | 846 | #if !defined(TARGET_SPARC64) && !defined(CONFIG_USER_ONLY) && \ |
816 | 847 | defined(DEBUG_MXCC) |
... | ... | @@ -2220,7 +2251,7 @@ void helper_ldf_asi(target_ulong addr, int asi, int size, int rd) |
2220 | 2251 | switch(size) { |
2221 | 2252 | default: |
2222 | 2253 | case 4: |
2223 | - *((uint32_t *)&FT0) = val; | |
2254 | + *((uint32_t *)&env->fpr[rd]) = val; | |
2224 | 2255 | break; |
2225 | 2256 | case 8: |
2226 | 2257 | *((int64_t *)&DT0) = val; |
... | ... | @@ -2261,7 +2292,7 @@ void helper_stf_asi(target_ulong addr, int asi, int size, int rd) |
2261 | 2292 | switch(size) { |
2262 | 2293 | default: |
2263 | 2294 | case 4: |
2264 | - val = *((uint32_t *)&FT0); | |
2295 | + val = *((uint32_t *)&env->fpr[rd]); | |
2265 | 2296 | break; |
2266 | 2297 | case 8: |
2267 | 2298 | val = *((int64_t *)&DT0); | ... | ... |
target-sparc/translate.c
... | ... | @@ -55,6 +55,8 @@ static TCGv cpu_wim; |
55 | 55 | #endif |
56 | 56 | /* local register indexes (only used inside old micro ops) */ |
57 | 57 | static TCGv cpu_tmp0, cpu_tmp32, cpu_tmp64; |
58 | +/* Floating point registers */ | |
59 | +static TCGv cpu_fpr[TARGET_FPREGS]; | |
58 | 60 | |
59 | 61 | #include "gen-icount.h" |
60 | 62 | |
... | ... | @@ -102,98 +104,77 @@ static int sign_extend(int x, int len) |
102 | 104 | /* floating point registers moves */ |
103 | 105 | static void gen_op_load_fpr_FT0(unsigned int src) |
104 | 106 | { |
105 | - tcg_gen_ld_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, fpr[src])); | |
106 | - tcg_gen_st_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, ft0)); | |
107 | + tcg_gen_st_i32(cpu_fpr[src], cpu_env, offsetof(CPUSPARCState, ft0)); | |
107 | 108 | } |
108 | 109 | |
109 | 110 | static void gen_op_load_fpr_FT1(unsigned int src) |
110 | 111 | { |
111 | - tcg_gen_ld_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, fpr[src])); | |
112 | - tcg_gen_st_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, ft1)); | |
112 | + tcg_gen_st_i32(cpu_fpr[src], cpu_env, offsetof(CPUSPARCState, ft1)); | |
113 | 113 | } |
114 | 114 | |
115 | 115 | static void gen_op_store_FT0_fpr(unsigned int dst) |
116 | 116 | { |
117 | - tcg_gen_ld_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, ft0)); | |
118 | - tcg_gen_st_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, fpr[dst])); | |
117 | + tcg_gen_ld_i32(cpu_fpr[dst], cpu_env, offsetof(CPUSPARCState, ft0)); | |
119 | 118 | } |
120 | 119 | |
121 | 120 | static void gen_op_load_fpr_DT0(unsigned int src) |
122 | 121 | { |
123 | - tcg_gen_ld_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, fpr[src])); | |
124 | - tcg_gen_st_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, dt0) + | |
122 | + tcg_gen_st_i32(cpu_fpr[src], cpu_env, offsetof(CPUSPARCState, dt0) + | |
125 | 123 | offsetof(CPU_DoubleU, l.upper)); |
126 | - tcg_gen_ld_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, fpr[src + 1])); | |
127 | - tcg_gen_st_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, dt0) + | |
124 | + tcg_gen_st_i32(cpu_fpr[src + 1], cpu_env, offsetof(CPUSPARCState, dt0) + | |
128 | 125 | offsetof(CPU_DoubleU, l.lower)); |
129 | 126 | } |
130 | 127 | |
131 | 128 | static void gen_op_load_fpr_DT1(unsigned int src) |
132 | 129 | { |
133 | - tcg_gen_ld_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, fpr[src])); | |
134 | - tcg_gen_st_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, dt1) + | |
130 | + tcg_gen_st_i32(cpu_fpr[src], cpu_env, offsetof(CPUSPARCState, dt1) + | |
135 | 131 | offsetof(CPU_DoubleU, l.upper)); |
136 | - tcg_gen_ld_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, fpr[src + 1])); | |
137 | - tcg_gen_st_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, dt1) + | |
132 | + tcg_gen_st_i32(cpu_fpr[src + 1], cpu_env, offsetof(CPUSPARCState, dt1) + | |
138 | 133 | offsetof(CPU_DoubleU, l.lower)); |
139 | 134 | } |
140 | 135 | |
141 | 136 | static void gen_op_store_DT0_fpr(unsigned int dst) |
142 | 137 | { |
143 | - tcg_gen_ld_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, dt0) + | |
138 | + tcg_gen_ld_i32(cpu_fpr[dst], cpu_env, offsetof(CPUSPARCState, dt0) + | |
144 | 139 | offsetof(CPU_DoubleU, l.upper)); |
145 | - tcg_gen_st_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, fpr[dst])); | |
146 | - tcg_gen_ld_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, dt0) + | |
140 | + tcg_gen_ld_i32(cpu_fpr[dst + 1], cpu_env, offsetof(CPUSPARCState, dt0) + | |
147 | 141 | offsetof(CPU_DoubleU, l.lower)); |
148 | - tcg_gen_st_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, fpr[dst + 1])); | |
149 | 142 | } |
150 | 143 | |
151 | 144 | static void gen_op_load_fpr_QT0(unsigned int src) |
152 | 145 | { |
153 | - tcg_gen_ld_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, fpr[src])); | |
154 | - tcg_gen_st_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, qt0) + | |
146 | + tcg_gen_st_i32(cpu_fpr[src], cpu_env, offsetof(CPUSPARCState, qt0) + | |
155 | 147 | offsetof(CPU_QuadU, l.upmost)); |
156 | - tcg_gen_ld_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, fpr[src + 1])); | |
157 | - tcg_gen_st_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, qt0) + | |
148 | + tcg_gen_st_i32(cpu_fpr[src + 1], cpu_env, offsetof(CPUSPARCState, qt0) + | |
158 | 149 | offsetof(CPU_QuadU, l.upper)); |
159 | - tcg_gen_ld_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, fpr[src + 2])); | |
160 | - tcg_gen_st_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, qt0) + | |
150 | + tcg_gen_st_i32(cpu_fpr[src + 2], cpu_env, offsetof(CPUSPARCState, qt0) + | |
161 | 151 | offsetof(CPU_QuadU, l.lower)); |
162 | - tcg_gen_ld_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, fpr[src + 3])); | |
163 | - tcg_gen_st_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, qt0) + | |
152 | + tcg_gen_st_i32(cpu_fpr[src + 3], cpu_env, offsetof(CPUSPARCState, qt0) + | |
164 | 153 | offsetof(CPU_QuadU, l.lowest)); |
165 | 154 | } |
166 | 155 | |
167 | 156 | static void gen_op_load_fpr_QT1(unsigned int src) |
168 | 157 | { |
169 | - tcg_gen_ld_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, fpr[src])); | |
170 | - tcg_gen_st_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, qt1) + | |
158 | + tcg_gen_st_i32(cpu_fpr[src], cpu_env, offsetof(CPUSPARCState, qt1) + | |
171 | 159 | offsetof(CPU_QuadU, l.upmost)); |
172 | - tcg_gen_ld_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, fpr[src + 1])); | |
173 | - tcg_gen_st_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, qt1) + | |
160 | + tcg_gen_st_i32(cpu_fpr[src + 1], cpu_env, offsetof(CPUSPARCState, qt1) + | |
174 | 161 | offsetof(CPU_QuadU, l.upper)); |
175 | - tcg_gen_ld_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, fpr[src + 2])); | |
176 | - tcg_gen_st_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, qt1) + | |
162 | + tcg_gen_st_i32(cpu_fpr[src + 2], cpu_env, offsetof(CPUSPARCState, qt1) + | |
177 | 163 | offsetof(CPU_QuadU, l.lower)); |
178 | - tcg_gen_ld_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, fpr[src + 3])); | |
179 | - tcg_gen_st_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, qt1) + | |
164 | + tcg_gen_st_i32(cpu_fpr[src + 3], cpu_env, offsetof(CPUSPARCState, qt1) + | |
180 | 165 | offsetof(CPU_QuadU, l.lowest)); |
181 | 166 | } |
182 | 167 | |
183 | 168 | static void gen_op_store_QT0_fpr(unsigned int dst) |
184 | 169 | { |
185 | - tcg_gen_ld_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, qt0) + | |
170 | + tcg_gen_ld_i32(cpu_fpr[dst], cpu_env, offsetof(CPUSPARCState, qt0) + | |
186 | 171 | offsetof(CPU_QuadU, l.upmost)); |
187 | - tcg_gen_st_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, fpr[dst])); | |
188 | - tcg_gen_ld_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, qt0) + | |
172 | + tcg_gen_ld_i32(cpu_fpr[dst + 1], cpu_env, offsetof(CPUSPARCState, qt0) + | |
189 | 173 | offsetof(CPU_QuadU, l.upper)); |
190 | - tcg_gen_st_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, fpr[dst + 1])); | |
191 | - tcg_gen_ld_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, qt0) + | |
174 | + tcg_gen_ld_i32(cpu_fpr[dst + 2], cpu_env, offsetof(CPUSPARCState, qt0) + | |
192 | 175 | offsetof(CPU_QuadU, l.lower)); |
193 | - tcg_gen_st_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, fpr[dst + 2])); | |
194 | - tcg_gen_ld_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, qt0) + | |
176 | + tcg_gen_ld_i32(cpu_fpr[dst + 3], cpu_env, offsetof(CPUSPARCState, qt0) + | |
195 | 177 | offsetof(CPU_QuadU, l.lowest)); |
196 | - tcg_gen_st_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, fpr[dst + 3])); | |
197 | 178 | } |
198 | 179 | |
199 | 180 | /* moves */ |
... | ... | @@ -1496,13 +1477,6 @@ static void do_branch_reg(DisasContext *dc, int32_t offset, uint32_t insn, |
1496 | 1477 | } |
1497 | 1478 | } |
1498 | 1479 | |
1499 | -static GenOpFunc * const gen_fcmps[4] = { | |
1500 | - helper_fcmps, | |
1501 | - helper_fcmps_fcc1, | |
1502 | - helper_fcmps_fcc2, | |
1503 | - helper_fcmps_fcc3, | |
1504 | -}; | |
1505 | - | |
1506 | 1480 | static GenOpFunc * const gen_fcmpd[4] = { |
1507 | 1481 | helper_fcmpd, |
1508 | 1482 | helper_fcmpd_fcc1, |
... | ... | @@ -1517,13 +1491,6 @@ static GenOpFunc * const gen_fcmpq[4] = { |
1517 | 1491 | helper_fcmpq_fcc3, |
1518 | 1492 | }; |
1519 | 1493 | |
1520 | -static GenOpFunc * const gen_fcmpes[4] = { | |
1521 | - helper_fcmpes, | |
1522 | - helper_fcmpes_fcc1, | |
1523 | - helper_fcmpes_fcc2, | |
1524 | - helper_fcmpes_fcc3, | |
1525 | -}; | |
1526 | - | |
1527 | 1494 | static GenOpFunc * const gen_fcmped[4] = { |
1528 | 1495 | helper_fcmped, |
1529 | 1496 | helper_fcmped_fcc1, |
... | ... | @@ -1538,9 +1505,22 @@ static GenOpFunc * const gen_fcmpeq[4] = { |
1538 | 1505 | helper_fcmpeq_fcc3, |
1539 | 1506 | }; |
1540 | 1507 | |
1541 | -static inline void gen_op_fcmps(int fccno) | |
1508 | +static inline void gen_op_fcmps(int fccno, TCGv r_rs1, TCGv r_rs2) | |
1542 | 1509 | { |
1543 | - tcg_gen_helper_0_0(gen_fcmps[fccno]); | |
1510 | + switch (fccno) { | |
1511 | + case 0: | |
1512 | + tcg_gen_helper_0_2(helper_fcmps, r_rs1, r_rs2); | |
1513 | + break; | |
1514 | + case 1: | |
1515 | + tcg_gen_helper_0_2(helper_fcmps_fcc1, r_rs1, r_rs2); | |
1516 | + break; | |
1517 | + case 2: | |
1518 | + tcg_gen_helper_0_2(helper_fcmps_fcc2, r_rs1, r_rs2); | |
1519 | + break; | |
1520 | + case 3: | |
1521 | + tcg_gen_helper_0_2(helper_fcmps_fcc3, r_rs1, r_rs2); | |
1522 | + break; | |
1523 | + } | |
1544 | 1524 | } |
1545 | 1525 | |
1546 | 1526 | static inline void gen_op_fcmpd(int fccno) |
... | ... | @@ -1553,9 +1533,22 @@ static inline void gen_op_fcmpq(int fccno) |
1553 | 1533 | tcg_gen_helper_0_0(gen_fcmpq[fccno]); |
1554 | 1534 | } |
1555 | 1535 | |
1556 | -static inline void gen_op_fcmpes(int fccno) | |
1536 | +static inline void gen_op_fcmpes(int fccno, TCGv r_rs1, TCGv r_rs2) | |
1557 | 1537 | { |
1558 | - tcg_gen_helper_0_0(gen_fcmpes[fccno]); | |
1538 | + switch (fccno) { | |
1539 | + case 0: | |
1540 | + tcg_gen_helper_0_2(helper_fcmpes, r_rs1, r_rs2); | |
1541 | + break; | |
1542 | + case 1: | |
1543 | + tcg_gen_helper_0_2(helper_fcmpes_fcc1, r_rs1, r_rs2); | |
1544 | + break; | |
1545 | + case 2: | |
1546 | + tcg_gen_helper_0_2(helper_fcmpes_fcc2, r_rs1, r_rs2); | |
1547 | + break; | |
1548 | + case 3: | |
1549 | + tcg_gen_helper_0_2(helper_fcmpes_fcc3, r_rs1, r_rs2); | |
1550 | + break; | |
1551 | + } | |
1559 | 1552 | } |
1560 | 1553 | |
1561 | 1554 | static inline void gen_op_fcmped(int fccno) |
... | ... | @@ -1570,9 +1563,9 @@ static inline void gen_op_fcmpeq(int fccno) |
1570 | 1563 | |
1571 | 1564 | #else |
1572 | 1565 | |
1573 | -static inline void gen_op_fcmps(int fccno) | |
1566 | +static inline void gen_op_fcmps(int fccno, TCGv r_rs1, TCGv r_rs2) | |
1574 | 1567 | { |
1575 | - tcg_gen_helper_0_0(helper_fcmps); | |
1568 | + tcg_gen_helper_0_2(helper_fcmps, r_rs1, r_rs2); | |
1576 | 1569 | } |
1577 | 1570 | |
1578 | 1571 | static inline void gen_op_fcmpd(int fccno) |
... | ... | @@ -1585,9 +1578,9 @@ static inline void gen_op_fcmpq(int fccno) |
1585 | 1578 | tcg_gen_helper_0_0(helper_fcmpq); |
1586 | 1579 | } |
1587 | 1580 | |
1588 | -static inline void gen_op_fcmpes(int fccno) | |
1581 | +static inline void gen_op_fcmpes(int fccno, TCGv r_rs1, TCGv r_rs2) | |
1589 | 1582 | { |
1590 | - tcg_gen_helper_0_0(helper_fcmpes); | |
1583 | + tcg_gen_helper_0_2(helper_fcmpes, r_rs1, r_rs2); | |
1591 | 1584 | } |
1592 | 1585 | |
1593 | 1586 | static inline void gen_op_fcmped(int fccno) |
... | ... | @@ -2349,26 +2342,23 @@ static void disas_sparc_insn(DisasContext * dc) |
2349 | 2342 | xop = GET_FIELD(insn, 18, 26); |
2350 | 2343 | switch (xop) { |
2351 | 2344 | case 0x1: /* fmovs */ |
2352 | - gen_op_load_fpr_FT0(rs2); | |
2353 | - gen_op_store_FT0_fpr(rd); | |
2345 | + tcg_gen_mov_i32(cpu_fpr[rd], cpu_fpr[rs2]); | |
2354 | 2346 | break; |
2355 | 2347 | case 0x5: /* fnegs */ |
2356 | - gen_op_load_fpr_FT1(rs2); | |
2357 | - tcg_gen_helper_0_0(helper_fnegs); | |
2358 | - gen_op_store_FT0_fpr(rd); | |
2348 | + tcg_gen_helper_1_1(helper_fnegs, cpu_fpr[rd], | |
2349 | + cpu_fpr[rs2]); | |
2359 | 2350 | break; |
2360 | 2351 | case 0x9: /* fabss */ |
2361 | - gen_op_load_fpr_FT1(rs2); | |
2362 | - tcg_gen_helper_0_0(helper_fabss); | |
2363 | - gen_op_store_FT0_fpr(rd); | |
2352 | + tcg_gen_helper_1_1(helper_fabss, cpu_fpr[rd], | |
2353 | + cpu_fpr[rs2]); | |
2364 | 2354 | break; |
2365 | 2355 | case 0x29: /* fsqrts */ |
2366 | 2356 | CHECK_FPU_FEATURE(dc, FSQRT); |
2367 | - gen_op_load_fpr_FT1(rs2); | |
2368 | 2357 | gen_clear_float_exceptions(); |
2369 | - tcg_gen_helper_0_0(helper_fsqrts); | |
2358 | + tcg_gen_helper_1_1(helper_fsqrts, cpu_tmp32, | |
2359 | + cpu_fpr[rs2]); | |
2370 | 2360 | tcg_gen_helper_0_0(helper_check_ieee_exceptions); |
2371 | - gen_op_store_FT0_fpr(rd); | |
2361 | + tcg_gen_mov_i32(cpu_fpr[rd], cpu_tmp32); | |
2372 | 2362 | break; |
2373 | 2363 | case 0x2a: /* fsqrtd */ |
2374 | 2364 | CHECK_FPU_FEATURE(dc, FSQRT); |
... | ... | @@ -2386,13 +2376,12 @@ static void disas_sparc_insn(DisasContext * dc) |
2386 | 2376 | tcg_gen_helper_0_0(helper_check_ieee_exceptions); |
2387 | 2377 | gen_op_store_QT0_fpr(QFPREG(rd)); |
2388 | 2378 | break; |
2389 | - case 0x41: | |
2390 | - gen_op_load_fpr_FT0(rs1); | |
2391 | - gen_op_load_fpr_FT1(rs2); | |
2379 | + case 0x41: /* fadds */ | |
2392 | 2380 | gen_clear_float_exceptions(); |
2393 | - tcg_gen_helper_0_0(helper_fadds); | |
2381 | + tcg_gen_helper_1_2(helper_fadds, cpu_tmp32, | |
2382 | + cpu_fpr[rs1], cpu_fpr[rs2]); | |
2394 | 2383 | tcg_gen_helper_0_0(helper_check_ieee_exceptions); |
2395 | - gen_op_store_FT0_fpr(rd); | |
2384 | + tcg_gen_mov_i32(cpu_fpr[rd], cpu_tmp32); | |
2396 | 2385 | break; |
2397 | 2386 | case 0x42: |
2398 | 2387 | gen_op_load_fpr_DT0(DFPREG(rs1)); |
... | ... | @@ -2411,13 +2400,12 @@ static void disas_sparc_insn(DisasContext * dc) |
2411 | 2400 | tcg_gen_helper_0_0(helper_check_ieee_exceptions); |
2412 | 2401 | gen_op_store_QT0_fpr(QFPREG(rd)); |
2413 | 2402 | break; |
2414 | - case 0x45: | |
2415 | - gen_op_load_fpr_FT0(rs1); | |
2416 | - gen_op_load_fpr_FT1(rs2); | |
2403 | + case 0x45: /* fsubs */ | |
2417 | 2404 | gen_clear_float_exceptions(); |
2418 | - tcg_gen_helper_0_0(helper_fsubs); | |
2405 | + tcg_gen_helper_1_2(helper_fsubs, cpu_tmp32, | |
2406 | + cpu_fpr[rs1], cpu_fpr[rs2]); | |
2419 | 2407 | tcg_gen_helper_0_0(helper_check_ieee_exceptions); |
2420 | - gen_op_store_FT0_fpr(rd); | |
2408 | + tcg_gen_mov_i32(cpu_fpr[rd], cpu_tmp32); | |
2421 | 2409 | break; |
2422 | 2410 | case 0x46: |
2423 | 2411 | gen_op_load_fpr_DT0(DFPREG(rs1)); |
... | ... | @@ -2438,12 +2426,11 @@ static void disas_sparc_insn(DisasContext * dc) |
2438 | 2426 | break; |
2439 | 2427 | case 0x49: /* fmuls */ |
2440 | 2428 | CHECK_FPU_FEATURE(dc, FMUL); |
2441 | - gen_op_load_fpr_FT0(rs1); | |
2442 | - gen_op_load_fpr_FT1(rs2); | |
2443 | 2429 | gen_clear_float_exceptions(); |
2444 | - tcg_gen_helper_0_0(helper_fmuls); | |
2430 | + tcg_gen_helper_1_2(helper_fmuls, cpu_tmp32, | |
2431 | + cpu_fpr[rs1], cpu_fpr[rs2]); | |
2445 | 2432 | tcg_gen_helper_0_0(helper_check_ieee_exceptions); |
2446 | - gen_op_store_FT0_fpr(rd); | |
2433 | + tcg_gen_mov_i32(cpu_fpr[rd], cpu_tmp32); | |
2447 | 2434 | break; |
2448 | 2435 | case 0x4a: /* fmuld */ |
2449 | 2436 | CHECK_FPU_FEATURE(dc, FMUL); |
... | ... | @@ -2464,13 +2451,12 @@ static void disas_sparc_insn(DisasContext * dc) |
2464 | 2451 | tcg_gen_helper_0_0(helper_check_ieee_exceptions); |
2465 | 2452 | gen_op_store_QT0_fpr(QFPREG(rd)); |
2466 | 2453 | break; |
2467 | - case 0x4d: | |
2468 | - gen_op_load_fpr_FT0(rs1); | |
2469 | - gen_op_load_fpr_FT1(rs2); | |
2454 | + case 0x4d: /* fdivs */ | |
2470 | 2455 | gen_clear_float_exceptions(); |
2471 | - tcg_gen_helper_0_0(helper_fdivs); | |
2456 | + tcg_gen_helper_1_2(helper_fdivs, cpu_tmp32, | |
2457 | + cpu_fpr[rs1], cpu_fpr[rs2]); | |
2472 | 2458 | tcg_gen_helper_0_0(helper_check_ieee_exceptions); |
2473 | - gen_op_store_FT0_fpr(rd); | |
2459 | + tcg_gen_mov_i32(cpu_fpr[rd], cpu_tmp32); | |
2474 | 2460 | break; |
2475 | 2461 | case 0x4e: |
2476 | 2462 | gen_op_load_fpr_DT0(DFPREG(rs1)); |
... | ... | @@ -2507,12 +2493,12 @@ static void disas_sparc_insn(DisasContext * dc) |
2507 | 2493 | tcg_gen_helper_0_0(helper_check_ieee_exceptions); |
2508 | 2494 | gen_op_store_QT0_fpr(QFPREG(rd)); |
2509 | 2495 | break; |
2510 | - case 0xc4: | |
2511 | - gen_op_load_fpr_FT1(rs2); | |
2496 | + case 0xc4: /* fitos */ | |
2512 | 2497 | gen_clear_float_exceptions(); |
2513 | - tcg_gen_helper_0_0(helper_fitos); | |
2498 | + tcg_gen_helper_1_1(helper_fitos, cpu_tmp32, | |
2499 | + cpu_fpr[rs2]); | |
2514 | 2500 | tcg_gen_helper_0_0(helper_check_ieee_exceptions); |
2515 | - gen_op_store_FT0_fpr(rd); | |
2501 | + tcg_gen_mov_i32(cpu_fpr[rd], cpu_tmp32); | |
2516 | 2502 | break; |
2517 | 2503 | case 0xc6: |
2518 | 2504 | gen_op_load_fpr_DT1(DFPREG(rs2)); |
... | ... | @@ -2565,12 +2551,12 @@ static void disas_sparc_insn(DisasContext * dc) |
2565 | 2551 | tcg_gen_helper_0_0(helper_fdtoq); |
2566 | 2552 | gen_op_store_QT0_fpr(QFPREG(rd)); |
2567 | 2553 | break; |
2568 | - case 0xd1: | |
2569 | - gen_op_load_fpr_FT1(rs2); | |
2554 | + case 0xd1: /* fstoi */ | |
2570 | 2555 | gen_clear_float_exceptions(); |
2571 | - tcg_gen_helper_0_0(helper_fstoi); | |
2556 | + tcg_gen_helper_1_1(helper_fstoi, cpu_tmp32, | |
2557 | + cpu_fpr[rs2]); | |
2572 | 2558 | tcg_gen_helper_0_0(helper_check_ieee_exceptions); |
2573 | - gen_op_store_FT0_fpr(rd); | |
2559 | + tcg_gen_mov_i32(cpu_fpr[rd], cpu_tmp32); | |
2574 | 2560 | break; |
2575 | 2561 | case 0xd2: |
2576 | 2562 | gen_op_load_fpr_DT1(DFPREG(rs2)); |
... | ... | @@ -2589,13 +2575,21 @@ static void disas_sparc_insn(DisasContext * dc) |
2589 | 2575 | break; |
2590 | 2576 | #ifdef TARGET_SPARC64 |
2591 | 2577 | case 0x2: /* V9 fmovd */ |
2592 | - gen_op_load_fpr_DT0(DFPREG(rs2)); | |
2593 | - gen_op_store_DT0_fpr(DFPREG(rd)); | |
2578 | + tcg_gen_mov_i32(cpu_fpr[DFPREG(rd)], | |
2579 | + cpu_fpr[DFPREG(rs2)]); | |
2580 | + tcg_gen_mov_i32(cpu_fpr[DFPREG(rd) + 1], | |
2581 | + cpu_fpr[DFPREG(rs2) + 1]); | |
2594 | 2582 | break; |
2595 | 2583 | case 0x3: /* V9 fmovq */ |
2596 | 2584 | CHECK_FPU_FEATURE(dc, FLOAT128); |
2597 | - gen_op_load_fpr_QT0(QFPREG(rs2)); | |
2598 | - gen_op_store_QT0_fpr(QFPREG(rd)); | |
2585 | + tcg_gen_mov_i32(cpu_fpr[QFPREG(rd)], | |
2586 | + cpu_fpr[QFPREG(rs2)]); | |
2587 | + tcg_gen_mov_i32(cpu_fpr[QFPREG(rd) + 1], | |
2588 | + cpu_fpr[QFPREG(rs2) + 1]); | |
2589 | + tcg_gen_mov_i32(cpu_fpr[QFPREG(rd) + 2], | |
2590 | + cpu_fpr[QFPREG(rs2) + 2]); | |
2591 | + tcg_gen_mov_i32(cpu_fpr[QFPREG(rd) + 3], | |
2592 | + cpu_fpr[QFPREG(rs2) + 3]); | |
2599 | 2593 | break; |
2600 | 2594 | case 0x6: /* V9 fnegd */ |
2601 | 2595 | gen_op_load_fpr_DT1(DFPREG(rs2)); |
... | ... | @@ -2686,8 +2680,7 @@ static void disas_sparc_insn(DisasContext * dc) |
2686 | 2680 | cpu_src1 = get_src1(insn, cpu_src1); |
2687 | 2681 | tcg_gen_brcondi_tl(gen_tcg_cond_reg[cond], cpu_src1, |
2688 | 2682 | 0, l1); |
2689 | - gen_op_load_fpr_FT0(rs2); | |
2690 | - gen_op_store_FT0_fpr(rd); | |
2683 | + tcg_gen_mov_i32(cpu_fpr[rd], cpu_fpr[rs2]); | |
2691 | 2684 | gen_set_label(l1); |
2692 | 2685 | break; |
2693 | 2686 | } else if ((xop & 0x11f) == 0x006) { // V9 fmovdr |
... | ... | @@ -2698,8 +2691,8 @@ static void disas_sparc_insn(DisasContext * dc) |
2698 | 2691 | cpu_src1 = get_src1(insn, cpu_src1); |
2699 | 2692 | tcg_gen_brcondi_tl(gen_tcg_cond_reg[cond], cpu_src1, |
2700 | 2693 | 0, l1); |
2701 | - gen_op_load_fpr_DT0(DFPREG(rs2)); | |
2702 | - gen_op_store_DT0_fpr(DFPREG(rd)); | |
2694 | + tcg_gen_mov_i32(cpu_fpr[DFPREG(rd)], cpu_fpr[DFPREG(rs2)]); | |
2695 | + tcg_gen_mov_i32(cpu_fpr[DFPREG(rd) + 1], cpu_fpr[DFPREG(rs2) + 1]); | |
2703 | 2696 | gen_set_label(l1); |
2704 | 2697 | break; |
2705 | 2698 | } else if ((xop & 0x11f) == 0x007) { // V9 fmovqr |
... | ... | @@ -2711,15 +2704,17 @@ static void disas_sparc_insn(DisasContext * dc) |
2711 | 2704 | cpu_src1 = get_src1(insn, cpu_src1); |
2712 | 2705 | tcg_gen_brcondi_tl(gen_tcg_cond_reg[cond], cpu_src1, |
2713 | 2706 | 0, l1); |
2714 | - gen_op_load_fpr_QT0(QFPREG(rs2)); | |
2715 | - gen_op_store_QT0_fpr(QFPREG(rd)); | |
2707 | + tcg_gen_mov_i32(cpu_fpr[QFPREG(rd)], cpu_fpr[QFPREG(rs2)]); | |
2708 | + tcg_gen_mov_i32(cpu_fpr[QFPREG(rd) + 1], cpu_fpr[QFPREG(rs2) + 1]); | |
2709 | + tcg_gen_mov_i32(cpu_fpr[QFPREG(rd) + 2], cpu_fpr[QFPREG(rs2) + 2]); | |
2710 | + tcg_gen_mov_i32(cpu_fpr[QFPREG(rd) + 3], cpu_fpr[QFPREG(rs2) + 3]); | |
2716 | 2711 | gen_set_label(l1); |
2717 | 2712 | break; |
2718 | 2713 | } |
2719 | 2714 | #endif |
2720 | 2715 | switch (xop) { |
2721 | 2716 | #ifdef TARGET_SPARC64 |
2722 | -#define FMOVCC(size_FDQ, fcc) \ | |
2717 | +#define FMOVSCC(fcc) \ | |
2723 | 2718 | { \ |
2724 | 2719 | TCGv r_cond; \ |
2725 | 2720 | int l1; \ |
... | ... | @@ -2730,54 +2725,93 @@ static void disas_sparc_insn(DisasContext * dc) |
2730 | 2725 | gen_fcond(r_cond, fcc, cond); \ |
2731 | 2726 | tcg_gen_brcondi_tl(TCG_COND_EQ, r_cond, \ |
2732 | 2727 | 0, l1); \ |
2733 | - glue(glue(gen_op_load_fpr_, size_FDQ), T0) \ | |
2734 | - (glue(size_FDQ, FPREG(rs2))); \ | |
2735 | - glue(glue(gen_op_store_, size_FDQ), T0_fpr) \ | |
2736 | - (glue(size_FDQ, FPREG(rd))); \ | |
2728 | + tcg_gen_mov_i32(cpu_fpr[rd], cpu_fpr[rs2]); \ | |
2729 | + gen_set_label(l1); \ | |
2730 | + tcg_temp_free(r_cond); \ | |
2731 | + } | |
2732 | +#define FMOVDCC(fcc) \ | |
2733 | + { \ | |
2734 | + TCGv r_cond; \ | |
2735 | + int l1; \ | |
2736 | + \ | |
2737 | + l1 = gen_new_label(); \ | |
2738 | + r_cond = tcg_temp_new(TCG_TYPE_TL); \ | |
2739 | + cond = GET_FIELD_SP(insn, 14, 17); \ | |
2740 | + gen_fcond(r_cond, fcc, cond); \ | |
2741 | + tcg_gen_brcondi_tl(TCG_COND_EQ, r_cond, \ | |
2742 | + 0, l1); \ | |
2743 | + tcg_gen_mov_i32(cpu_fpr[DFPREG(rd)], \ | |
2744 | + cpu_fpr[DFPREG(rs2)]); \ | |
2745 | + tcg_gen_mov_i32(cpu_fpr[DFPREG(rd) + 1], \ | |
2746 | + cpu_fpr[DFPREG(rs2) + 1]); \ | |
2747 | + gen_set_label(l1); \ | |
2748 | + tcg_temp_free(r_cond); \ | |
2749 | + } | |
2750 | +#define FMOVQCC(fcc) \ | |
2751 | + { \ | |
2752 | + TCGv r_cond; \ | |
2753 | + int l1; \ | |
2754 | + \ | |
2755 | + l1 = gen_new_label(); \ | |
2756 | + r_cond = tcg_temp_new(TCG_TYPE_TL); \ | |
2757 | + cond = GET_FIELD_SP(insn, 14, 17); \ | |
2758 | + gen_fcond(r_cond, fcc, cond); \ | |
2759 | + tcg_gen_brcondi_tl(TCG_COND_EQ, r_cond, \ | |
2760 | + 0, l1); \ | |
2761 | + tcg_gen_mov_i32(cpu_fpr[QFPREG(rd)], \ | |
2762 | + cpu_fpr[QFPREG(rs2)]); \ | |
2763 | + tcg_gen_mov_i32(cpu_fpr[QFPREG(rd) + 1], \ | |
2764 | + cpu_fpr[QFPREG(rs2) + 1]); \ | |
2765 | + tcg_gen_mov_i32(cpu_fpr[QFPREG(rd) + 2], \ | |
2766 | + cpu_fpr[QFPREG(rs2) + 2]); \ | |
2767 | + tcg_gen_mov_i32(cpu_fpr[QFPREG(rd) + 3], \ | |
2768 | + cpu_fpr[QFPREG(rs2) + 3]); \ | |
2737 | 2769 | gen_set_label(l1); \ |
2738 | 2770 | tcg_temp_free(r_cond); \ |
2739 | 2771 | } |
2740 | 2772 | case 0x001: /* V9 fmovscc %fcc0 */ |
2741 | - FMOVCC(F, 0); | |
2773 | + FMOVSCC(0); | |
2742 | 2774 | break; |
2743 | 2775 | case 0x002: /* V9 fmovdcc %fcc0 */ |
2744 | - FMOVCC(D, 0); | |
2776 | + FMOVDCC(0); | |
2745 | 2777 | break; |
2746 | 2778 | case 0x003: /* V9 fmovqcc %fcc0 */ |
2747 | 2779 | CHECK_FPU_FEATURE(dc, FLOAT128); |
2748 | - FMOVCC(Q, 0); | |
2780 | + FMOVQCC(0); | |
2749 | 2781 | break; |
2750 | 2782 | case 0x041: /* V9 fmovscc %fcc1 */ |
2751 | - FMOVCC(F, 1); | |
2783 | + FMOVSCC(1); | |
2752 | 2784 | break; |
2753 | 2785 | case 0x042: /* V9 fmovdcc %fcc1 */ |
2754 | - FMOVCC(D, 1); | |
2786 | + FMOVDCC(1); | |
2755 | 2787 | break; |
2756 | 2788 | case 0x043: /* V9 fmovqcc %fcc1 */ |
2757 | 2789 | CHECK_FPU_FEATURE(dc, FLOAT128); |
2758 | - FMOVCC(Q, 1); | |
2790 | + FMOVQCC(1); | |
2759 | 2791 | break; |
2760 | 2792 | case 0x081: /* V9 fmovscc %fcc2 */ |
2761 | - FMOVCC(F, 2); | |
2793 | + FMOVSCC(2); | |
2762 | 2794 | break; |
2763 | 2795 | case 0x082: /* V9 fmovdcc %fcc2 */ |
2764 | - FMOVCC(D, 2); | |
2796 | + FMOVDCC(2); | |
2765 | 2797 | break; |
2766 | 2798 | case 0x083: /* V9 fmovqcc %fcc2 */ |
2767 | 2799 | CHECK_FPU_FEATURE(dc, FLOAT128); |
2768 | - FMOVCC(Q, 2); | |
2800 | + FMOVQCC(2); | |
2769 | 2801 | break; |
2770 | 2802 | case 0x0c1: /* V9 fmovscc %fcc3 */ |
2771 | - FMOVCC(F, 3); | |
2803 | + FMOVSCC(3); | |
2772 | 2804 | break; |
2773 | 2805 | case 0x0c2: /* V9 fmovdcc %fcc3 */ |
2774 | - FMOVCC(D, 3); | |
2806 | + FMOVDCC(3); | |
2775 | 2807 | break; |
2776 | 2808 | case 0x0c3: /* V9 fmovqcc %fcc3 */ |
2777 | 2809 | CHECK_FPU_FEATURE(dc, FLOAT128); |
2778 | - FMOVCC(Q, 3); | |
2810 | + FMOVQCC(3); | |
2779 | 2811 | break; |
2780 | -#undef FMOVCC | |
2812 | +#undef FMOVSCC | |
2813 | +#undef FMOVDCC | |
2814 | +#undef FMOVQCC | |
2781 | 2815 | #define FMOVCC(size_FDQ, icc) \ |
2782 | 2816 | { \ |
2783 | 2817 | TCGv r_cond; \ |
... | ... | @@ -2796,32 +2830,87 @@ static void disas_sparc_insn(DisasContext * dc) |
2796 | 2830 | gen_set_label(l1); \ |
2797 | 2831 | tcg_temp_free(r_cond); \ |
2798 | 2832 | } |
2833 | +#define FMOVSCC(icc) \ | |
2834 | + { \ | |
2835 | + TCGv r_cond; \ | |
2836 | + int l1; \ | |
2837 | + \ | |
2838 | + l1 = gen_new_label(); \ | |
2839 | + r_cond = tcg_temp_new(TCG_TYPE_TL); \ | |
2840 | + cond = GET_FIELD_SP(insn, 14, 17); \ | |
2841 | + gen_cond(r_cond, icc, cond); \ | |
2842 | + tcg_gen_brcondi_tl(TCG_COND_EQ, r_cond, \ | |
2843 | + 0, l1); \ | |
2844 | + tcg_gen_mov_i32(cpu_fpr[rd], cpu_fpr[rs2]); \ | |
2845 | + gen_set_label(l1); \ | |
2846 | + tcg_temp_free(r_cond); \ | |
2847 | + } | |
2848 | +#define FMOVDCC(icc) \ | |
2849 | + { \ | |
2850 | + TCGv r_cond; \ | |
2851 | + int l1; \ | |
2852 | + \ | |
2853 | + l1 = gen_new_label(); \ | |
2854 | + r_cond = tcg_temp_new(TCG_TYPE_TL); \ | |
2855 | + cond = GET_FIELD_SP(insn, 14, 17); \ | |
2856 | + gen_cond(r_cond, icc, cond); \ | |
2857 | + tcg_gen_brcondi_tl(TCG_COND_EQ, r_cond, \ | |
2858 | + 0, l1); \ | |
2859 | + tcg_gen_mov_i32(cpu_fpr[DFPREG(rd)], \ | |
2860 | + cpu_fpr[DFPREG(rs2)]); \ | |
2861 | + tcg_gen_mov_i32(cpu_fpr[DFPREG(rd) + 1], \ | |
2862 | + cpu_fpr[DFPREG(rs2) + 1]); \ | |
2863 | + gen_set_label(l1); \ | |
2864 | + tcg_temp_free(r_cond); \ | |
2865 | + } | |
2866 | +#define FMOVQCC(icc) \ | |
2867 | + { \ | |
2868 | + TCGv r_cond; \ | |
2869 | + int l1; \ | |
2870 | + \ | |
2871 | + l1 = gen_new_label(); \ | |
2872 | + r_cond = tcg_temp_new(TCG_TYPE_TL); \ | |
2873 | + cond = GET_FIELD_SP(insn, 14, 17); \ | |
2874 | + gen_cond(r_cond, icc, cond); \ | |
2875 | + tcg_gen_brcondi_tl(TCG_COND_EQ, r_cond, \ | |
2876 | + 0, l1); \ | |
2877 | + tcg_gen_mov_i32(cpu_fpr[QFPREG(rd)], \ | |
2878 | + cpu_fpr[QFPREG(rs2)]); \ | |
2879 | + tcg_gen_mov_i32(cpu_fpr[QFPREG(rd) + 1], \ | |
2880 | + cpu_fpr[QFPREG(rs2) + 1]); \ | |
2881 | + tcg_gen_mov_i32(cpu_fpr[QFPREG(rd) + 2], \ | |
2882 | + cpu_fpr[QFPREG(rs2) + 2]); \ | |
2883 | + tcg_gen_mov_i32(cpu_fpr[QFPREG(rd) + 3], \ | |
2884 | + cpu_fpr[QFPREG(rs2) + 3]); \ | |
2885 | + gen_set_label(l1); \ | |
2886 | + tcg_temp_free(r_cond); \ | |
2887 | + } | |
2799 | 2888 | |
2800 | 2889 | case 0x101: /* V9 fmovscc %icc */ |
2801 | - FMOVCC(F, 0); | |
2890 | + FMOVSCC(0); | |
2802 | 2891 | break; |
2803 | 2892 | case 0x102: /* V9 fmovdcc %icc */ |
2804 | - FMOVCC(D, 0); | |
2893 | + FMOVDCC(0); | |
2805 | 2894 | case 0x103: /* V9 fmovqcc %icc */ |
2806 | 2895 | CHECK_FPU_FEATURE(dc, FLOAT128); |
2807 | - FMOVCC(Q, 0); | |
2896 | + FMOVQCC(0); | |
2808 | 2897 | break; |
2809 | 2898 | case 0x181: /* V9 fmovscc %xcc */ |
2810 | - FMOVCC(F, 1); | |
2899 | + FMOVSCC(1); | |
2811 | 2900 | break; |
2812 | 2901 | case 0x182: /* V9 fmovdcc %xcc */ |
2813 | - FMOVCC(D, 1); | |
2902 | + FMOVDCC(1); | |
2814 | 2903 | break; |
2815 | 2904 | case 0x183: /* V9 fmovqcc %xcc */ |
2816 | 2905 | CHECK_FPU_FEATURE(dc, FLOAT128); |
2817 | - FMOVCC(Q, 1); | |
2906 | + FMOVQCC(1); | |
2818 | 2907 | break; |
2819 | -#undef FMOVCC | |
2908 | +#undef FMOVSCC | |
2909 | +#undef FMOVDCC | |
2910 | +#undef FMOVQCC | |
2820 | 2911 | #endif |
2821 | 2912 | case 0x51: /* fcmps, V9 %fcc */ |
2822 | - gen_op_load_fpr_FT0(rs1); | |
2823 | - gen_op_load_fpr_FT1(rs2); | |
2824 | - gen_op_fcmps(rd & 3); | |
2913 | + gen_op_fcmps(rd & 3, cpu_fpr[rs1], cpu_fpr[rs2]); | |
2825 | 2914 | break; |
2826 | 2915 | case 0x52: /* fcmpd, V9 %fcc */ |
2827 | 2916 | gen_op_load_fpr_DT0(DFPREG(rs1)); |
... | ... | @@ -2835,9 +2924,7 @@ static void disas_sparc_insn(DisasContext * dc) |
2835 | 2924 | gen_op_fcmpq(rd & 3); |
2836 | 2925 | break; |
2837 | 2926 | case 0x55: /* fcmpes, V9 %fcc */ |
2838 | - gen_op_load_fpr_FT0(rs1); | |
2839 | - gen_op_load_fpr_FT1(rs2); | |
2840 | - gen_op_fcmpes(rd & 3); | |
2927 | + gen_op_fcmpes(rd & 3, cpu_fpr[rs1], cpu_fpr[rs2]); | |
2841 | 2928 | break; |
2842 | 2929 | case 0x56: /* fcmped, V9 %fcc */ |
2843 | 2930 | gen_op_load_fpr_DT0(DFPREG(rs1)); |
... | ... | @@ -4364,9 +4451,7 @@ static void disas_sparc_insn(DisasContext * dc) |
4364 | 4451 | switch (xop) { |
4365 | 4452 | case 0x20: /* load fpreg */ |
4366 | 4453 | gen_address_mask(dc, cpu_addr); |
4367 | - tcg_gen_qemu_ld32u(cpu_tmp32, cpu_addr, dc->mem_idx); | |
4368 | - tcg_gen_st_i32(cpu_tmp32, cpu_env, | |
4369 | - offsetof(CPUState, fpr[rd])); | |
4454 | + tcg_gen_qemu_ld32u(cpu_fpr[rd], cpu_addr, dc->mem_idx); | |
4370 | 4455 | break; |
4371 | 4456 | case 0x21: /* ldfsr, V9 ldxfsr */ |
4372 | 4457 | #ifdef TARGET_SPARC64 |
... | ... | @@ -4508,9 +4593,7 @@ static void disas_sparc_insn(DisasContext * dc) |
4508 | 4593 | switch (xop) { |
4509 | 4594 | case 0x24: /* store fpreg */ |
4510 | 4595 | gen_address_mask(dc, cpu_addr); |
4511 | - tcg_gen_ld_i32(cpu_tmp32, cpu_env, | |
4512 | - offsetof(CPUState, fpr[rd])); | |
4513 | - tcg_gen_qemu_st32(cpu_tmp32, cpu_addr, dc->mem_idx); | |
4596 | + tcg_gen_qemu_st32(cpu_fpr[rd], cpu_addr, dc->mem_idx); | |
4514 | 4597 | break; |
4515 | 4598 | case 0x25: /* stfsr, V9 stxfsr */ |
4516 | 4599 | #ifdef TARGET_SPARC64 |
... | ... | @@ -4570,7 +4653,6 @@ static void disas_sparc_insn(DisasContext * dc) |
4570 | 4653 | switch (xop) { |
4571 | 4654 | #ifdef TARGET_SPARC64 |
4572 | 4655 | case 0x34: /* V9 stfa */ |
4573 | - gen_op_load_fpr_FT0(rd); | |
4574 | 4656 | gen_stf_asi(cpu_addr, insn, 4, rd); |
4575 | 4657 | break; |
4576 | 4658 | case 0x36: /* V9 stqfa */ |
... | ... | @@ -4858,6 +4940,16 @@ void gen_intermediate_code_init(CPUSPARCState *env) |
4858 | 4940 | "g6", |
4859 | 4941 | "g7", |
4860 | 4942 | }; |
4943 | + static const char * const fregnames[64] = { | |
4944 | + "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", | |
4945 | + "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15", | |
4946 | + "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23", | |
4947 | + "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31", | |
4948 | + "f32", "f33", "f34", "f35", "f36", "f37", "f38", "f39", | |
4949 | + "f40", "f41", "f42", "f43", "f44", "f45", "f46", "f47", | |
4950 | + "f48", "f49", "f50", "f51", "f52", "f53", "f54", "f55", | |
4951 | + "f56", "f57", "f58", "f59", "f60", "f61", "f62", "f63", | |
4952 | + }; | |
4861 | 4953 | |
4862 | 4954 | /* init various static tables */ |
4863 | 4955 | if (!inited) { |
... | ... | @@ -4945,6 +5037,11 @@ void gen_intermediate_code_init(CPUSPARCState *env) |
4945 | 5037 | cpu_gregs[i] = tcg_global_mem_new(TCG_TYPE_TL, TCG_AREG0, |
4946 | 5038 | offsetof(CPUState, gregs[i]), |
4947 | 5039 | gregnames[i]); |
5040 | + for (i = 0; i < TARGET_FPREGS; i++) | |
5041 | + cpu_fpr[i] = tcg_global_mem_new(TCG_TYPE_I32, TCG_AREG0, | |
5042 | + offsetof(CPUState, fpr[i]), | |
5043 | + fregnames[i]); | |
5044 | + | |
4948 | 5045 | /* register helpers */ |
4949 | 5046 | |
4950 | 5047 | #undef DEF_HELPER | ... | ... |