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,12 +58,12 @@ DEF_HELPER(void, helper_st_asi, (target_ulong addr, uint64_t val, int asi, \ | ||
| 58 | DEF_HELPER(void, helper_ldfsr, (uint32_t new_fsr)) | 58 | DEF_HELPER(void, helper_ldfsr, (uint32_t new_fsr)) |
| 59 | DEF_HELPER(void, helper_check_ieee_exceptions, (void)) | 59 | DEF_HELPER(void, helper_check_ieee_exceptions, (void)) |
| 60 | DEF_HELPER(void, helper_clear_float_exceptions, (void)) | 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 | DEF_HELPER(void, helper_fsqrtd, (void)) | 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 | DEF_HELPER(void, helper_fcmpd, (void)) | 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 | DEF_HELPER(void, helper_fcmped, (void)) | 67 | DEF_HELPER(void, helper_fcmped, (void)) |
| 68 | DEF_HELPER(void, helper_fsqrtq, (void)) | 68 | DEF_HELPER(void, helper_fsqrtq, (void)) |
| 69 | DEF_HELPER(void, helper_fcmpq, (void)) | 69 | DEF_HELPER(void, helper_fcmpq, (void)) |
| @@ -71,17 +71,17 @@ DEF_HELPER(void, helper_fcmpeq, (void)) | @@ -71,17 +71,17 @@ DEF_HELPER(void, helper_fcmpeq, (void)) | ||
| 71 | #ifdef TARGET_SPARC64 | 71 | #ifdef TARGET_SPARC64 |
| 72 | DEF_HELPER(void, helper_ldxfsr, (uint64_t new_fsr)) | 72 | DEF_HELPER(void, helper_ldxfsr, (uint64_t new_fsr)) |
| 73 | DEF_HELPER(void, helper_fabsd, (void)) | 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 | DEF_HELPER(void, helper_fcmpd_fcc1, (void)) | 77 | DEF_HELPER(void, helper_fcmpd_fcc1, (void)) |
| 76 | -DEF_HELPER(void, helper_fcmps_fcc2, (void)) | ||
| 77 | DEF_HELPER(void, helper_fcmpd_fcc2, (void)) | 78 | DEF_HELPER(void, helper_fcmpd_fcc2, (void)) |
| 78 | -DEF_HELPER(void, helper_fcmps_fcc3, (void)) | ||
| 79 | DEF_HELPER(void, helper_fcmpd_fcc3, (void)) | 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 | DEF_HELPER(void, helper_fcmped_fcc1, (void)) | 83 | DEF_HELPER(void, helper_fcmped_fcc1, (void)) |
| 82 | -DEF_HELPER(void, helper_fcmpes_fcc2, (void)) | ||
| 83 | DEF_HELPER(void, helper_fcmped_fcc2, (void)) | 84 | DEF_HELPER(void, helper_fcmped_fcc2, (void)) |
| 84 | -DEF_HELPER(void, helper_fcmpes_fcc3, (void)) | ||
| 85 | DEF_HELPER(void, helper_fcmped_fcc3, (void)) | 85 | DEF_HELPER(void, helper_fcmped_fcc3, (void)) |
| 86 | DEF_HELPER(void, helper_fabsq, (void)) | 86 | DEF_HELPER(void, helper_fabsq, (void)) |
| 87 | DEF_HELPER(void, helper_fcmpq_fcc1, (void)) | 87 | DEF_HELPER(void, helper_fcmpq_fcc1, (void)) |
| @@ -97,17 +97,28 @@ DEF_HELPER(void, raise_exception, (int tt)) | @@ -97,17 +97,28 @@ DEF_HELPER(void, raise_exception, (int tt)) | ||
| 97 | F_HELPER_0_0(name ## s); \ | 97 | F_HELPER_0_0(name ## s); \ |
| 98 | F_HELPER_0_0(name ## d); \ | 98 | F_HELPER_0_0(name ## d); \ |
| 99 | F_HELPER_0_0(name ## q) | 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 | F_HELPER_0_0(smuld); | 114 | F_HELPER_0_0(smuld); |
| 107 | F_HELPER_0_0(dmulq); | 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 | #ifdef TARGET_SPARC64 | 122 | #ifdef TARGET_SPARC64 |
| 112 | DEF_HELPER(void, helper_fnegd, (void)) | 123 | DEF_HELPER(void, helper_fnegd, (void)) |
| 113 | DEF_HELPER(void, helper_fnegq, (void)) | 124 | DEF_HELPER(void, helper_fnegq, (void)) |
| @@ -119,7 +130,7 @@ F_HELPER_0_0(qtos); | @@ -119,7 +130,7 @@ F_HELPER_0_0(qtos); | ||
| 119 | F_HELPER_0_0(stoq); | 130 | F_HELPER_0_0(stoq); |
| 120 | F_HELPER_0_0(qtod); | 131 | F_HELPER_0_0(qtod); |
| 121 | F_HELPER_0_0(dtoq); | 132 | F_HELPER_0_0(dtoq); |
| 122 | -F_HELPER_0_0(stoi); | 133 | +DEF_HELPER(int32_t, helper_fstoi, (float32 src)) |
| 123 | F_HELPER_0_0(dtoi); | 134 | F_HELPER_0_0(dtoi); |
| 124 | F_HELPER_0_0(qtoi); | 135 | F_HELPER_0_0(qtoi); |
| 125 | #ifdef TARGET_SPARC64 | 136 | #ifdef TARGET_SPARC64 |
| @@ -176,6 +187,6 @@ VIS_CMPHELPER(cmple); | @@ -176,6 +187,6 @@ VIS_CMPHELPER(cmple); | ||
| 176 | VIS_CMPHELPER(cmpne); | 187 | VIS_CMPHELPER(cmpne); |
| 177 | #endif | 188 | #endif |
| 178 | #undef F_HELPER_0_0 | 189 | #undef F_HELPER_0_0 |
| 179 | -#undef F_HELPER_SDQ_0_0 | 190 | +#undef F_HELPER_DQ_0_0 |
| 180 | #undef VIS_HELPER | 191 | #undef VIS_HELPER |
| 181 | #undef VIS_CMPHELPER | 192 | #undef VIS_CMPHELPER |
target-sparc/op_helper.c
| @@ -87,9 +87,9 @@ void helper_check_align(target_ulong addr, uint32_t align) | @@ -87,9 +87,9 @@ void helper_check_align(target_ulong addr, uint32_t align) | ||
| 87 | #define F_HELPER(name, p) void helper_f##name##p(void) | 87 | #define F_HELPER(name, p) void helper_f##name##p(void) |
| 88 | 88 | ||
| 89 | #define F_BINOP(name) \ | 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 | F_HELPER(name, d) \ | 94 | F_HELPER(name, d) \ |
| 95 | { \ | 95 | { \ |
| @@ -120,9 +120,9 @@ void helper_fdmulq(void) | @@ -120,9 +120,9 @@ void helper_fdmulq(void) | ||
| 120 | &env->fp_status); | 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 | #ifdef TARGET_SPARC64 | 128 | #ifdef TARGET_SPARC64 |
| @@ -138,9 +138,9 @@ F_HELPER(neg, q) | @@ -138,9 +138,9 @@ F_HELPER(neg, q) | ||
| 138 | #endif | 138 | #endif |
| 139 | 139 | ||
| 140 | /* Integer to float conversion. */ | 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 | F_HELPER(ito, d) | 146 | F_HELPER(ito, d) |
| @@ -203,9 +203,9 @@ void helper_fdtoq(void) | @@ -203,9 +203,9 @@ void helper_fdtoq(void) | ||
| 203 | } | 203 | } |
| 204 | 204 | ||
| 205 | /* Float to integer conversion. */ | 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 | void helper_fdtoi(void) | 211 | void helper_fdtoi(void) |
| @@ -714,9 +714,9 @@ void helper_clear_float_exceptions(void) | @@ -714,9 +714,9 @@ void helper_clear_float_exceptions(void) | ||
| 714 | set_float_exception_flags(0, &env->fp_status); | 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 | #ifdef TARGET_SPARC64 | 722 | #ifdef TARGET_SPARC64 |
| @@ -731,9 +731,9 @@ void helper_fabsq(void) | @@ -731,9 +731,9 @@ void helper_fabsq(void) | ||
| 731 | } | 731 | } |
| 732 | #endif | 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 | void helper_fsqrtd(void) | 739 | void helper_fsqrtd(void) |
| @@ -776,41 +776,72 @@ void helper_fsqrtq(void) | @@ -776,41 +776,72 @@ void helper_fsqrtq(void) | ||
| 776 | } \ | 776 | } \ |
| 777 | env->fsr |= new_fsr; \ | 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 | GEN_FCMP(fcmpd, float64, DT0, DT1, 0, 0); | 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 | GEN_FCMP(fcmped, float64, DT0, DT1, 0, 1); | 814 | GEN_FCMP(fcmped, float64, DT0, DT1, 0, 1); |
| 785 | 815 | ||
| 786 | GEN_FCMP(fcmpq, float128, QT0, QT1, 0, 0); | 816 | GEN_FCMP(fcmpq, float128, QT0, QT1, 0, 0); |
| 787 | GEN_FCMP(fcmpeq, float128, QT0, QT1, 0, 1); | 817 | GEN_FCMP(fcmpeq, float128, QT0, QT1, 0, 1); |
| 788 | 818 | ||
| 789 | #ifdef TARGET_SPARC64 | 819 | #ifdef TARGET_SPARC64 |
| 790 | -GEN_FCMP(fcmps_fcc1, float32, FT0, FT1, 22, 0); | 820 | +GEN_FCMPS(fcmps_fcc1, float32, 22, 0); |
| 791 | GEN_FCMP(fcmpd_fcc1, float64, DT0, DT1, 22, 0); | 821 | GEN_FCMP(fcmpd_fcc1, float64, DT0, DT1, 22, 0); |
| 792 | GEN_FCMP(fcmpq_fcc1, float128, QT0, QT1, 22, 0); | 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 | GEN_FCMP(fcmpd_fcc2, float64, DT0, DT1, 24, 0); | 825 | GEN_FCMP(fcmpd_fcc2, float64, DT0, DT1, 24, 0); |
| 796 | GEN_FCMP(fcmpq_fcc2, float128, QT0, QT1, 24, 0); | 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 | GEN_FCMP(fcmpd_fcc3, float64, DT0, DT1, 26, 0); | 829 | GEN_FCMP(fcmpd_fcc3, float64, DT0, DT1, 26, 0); |
| 800 | GEN_FCMP(fcmpq_fcc3, float128, QT0, QT1, 26, 0); | 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 | GEN_FCMP(fcmped_fcc1, float64, DT0, DT1, 22, 1); | 833 | GEN_FCMP(fcmped_fcc1, float64, DT0, DT1, 22, 1); |
| 804 | GEN_FCMP(fcmpeq_fcc1, float128, QT0, QT1, 22, 1); | 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 | GEN_FCMP(fcmped_fcc2, float64, DT0, DT1, 24, 1); | 837 | GEN_FCMP(fcmped_fcc2, float64, DT0, DT1, 24, 1); |
| 808 | GEN_FCMP(fcmpeq_fcc2, float128, QT0, QT1, 24, 1); | 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 | GEN_FCMP(fcmped_fcc3, float64, DT0, DT1, 26, 1); | 841 | GEN_FCMP(fcmped_fcc3, float64, DT0, DT1, 26, 1); |
| 812 | GEN_FCMP(fcmpeq_fcc3, float128, QT0, QT1, 26, 1); | 842 | GEN_FCMP(fcmpeq_fcc3, float128, QT0, QT1, 26, 1); |
| 813 | #endif | 843 | #endif |
| 844 | +#undef GEN_FCMPS | ||
| 814 | 845 | ||
| 815 | #if !defined(TARGET_SPARC64) && !defined(CONFIG_USER_ONLY) && \ | 846 | #if !defined(TARGET_SPARC64) && !defined(CONFIG_USER_ONLY) && \ |
| 816 | defined(DEBUG_MXCC) | 847 | defined(DEBUG_MXCC) |
| @@ -2220,7 +2251,7 @@ void helper_ldf_asi(target_ulong addr, int asi, int size, int rd) | @@ -2220,7 +2251,7 @@ void helper_ldf_asi(target_ulong addr, int asi, int size, int rd) | ||
| 2220 | switch(size) { | 2251 | switch(size) { |
| 2221 | default: | 2252 | default: |
| 2222 | case 4: | 2253 | case 4: |
| 2223 | - *((uint32_t *)&FT0) = val; | 2254 | + *((uint32_t *)&env->fpr[rd]) = val; |
| 2224 | break; | 2255 | break; |
| 2225 | case 8: | 2256 | case 8: |
| 2226 | *((int64_t *)&DT0) = val; | 2257 | *((int64_t *)&DT0) = val; |
| @@ -2261,7 +2292,7 @@ void helper_stf_asi(target_ulong addr, int asi, int size, int rd) | @@ -2261,7 +2292,7 @@ void helper_stf_asi(target_ulong addr, int asi, int size, int rd) | ||
| 2261 | switch(size) { | 2292 | switch(size) { |
| 2262 | default: | 2293 | default: |
| 2263 | case 4: | 2294 | case 4: |
| 2264 | - val = *((uint32_t *)&FT0); | 2295 | + val = *((uint32_t *)&env->fpr[rd]); |
| 2265 | break; | 2296 | break; |
| 2266 | case 8: | 2297 | case 8: |
| 2267 | val = *((int64_t *)&DT0); | 2298 | val = *((int64_t *)&DT0); |
target-sparc/translate.c
| @@ -55,6 +55,8 @@ static TCGv cpu_wim; | @@ -55,6 +55,8 @@ static TCGv cpu_wim; | ||
| 55 | #endif | 55 | #endif |
| 56 | /* local register indexes (only used inside old micro ops) */ | 56 | /* local register indexes (only used inside old micro ops) */ |
| 57 | static TCGv cpu_tmp0, cpu_tmp32, cpu_tmp64; | 57 | static TCGv cpu_tmp0, cpu_tmp32, cpu_tmp64; |
| 58 | +/* Floating point registers */ | ||
| 59 | +static TCGv cpu_fpr[TARGET_FPREGS]; | ||
| 58 | 60 | ||
| 59 | #include "gen-icount.h" | 61 | #include "gen-icount.h" |
| 60 | 62 | ||
| @@ -102,98 +104,77 @@ static int sign_extend(int x, int len) | @@ -102,98 +104,77 @@ static int sign_extend(int x, int len) | ||
| 102 | /* floating point registers moves */ | 104 | /* floating point registers moves */ |
| 103 | static void gen_op_load_fpr_FT0(unsigned int src) | 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 | static void gen_op_load_fpr_FT1(unsigned int src) | 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 | static void gen_op_store_FT0_fpr(unsigned int dst) | 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 | static void gen_op_load_fpr_DT0(unsigned int src) | 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 | offsetof(CPU_DoubleU, l.upper)); | 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 | offsetof(CPU_DoubleU, l.lower)); | 125 | offsetof(CPU_DoubleU, l.lower)); |
| 129 | } | 126 | } |
| 130 | 127 | ||
| 131 | static void gen_op_load_fpr_DT1(unsigned int src) | 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 | offsetof(CPU_DoubleU, l.upper)); | 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 | offsetof(CPU_DoubleU, l.lower)); | 133 | offsetof(CPU_DoubleU, l.lower)); |
| 139 | } | 134 | } |
| 140 | 135 | ||
| 141 | static void gen_op_store_DT0_fpr(unsigned int dst) | 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 | offsetof(CPU_DoubleU, l.upper)); | 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 | offsetof(CPU_DoubleU, l.lower)); | 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 | static void gen_op_load_fpr_QT0(unsigned int src) | 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 | offsetof(CPU_QuadU, l.upmost)); | 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 | offsetof(CPU_QuadU, l.upper)); | 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 | offsetof(CPU_QuadU, l.lower)); | 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 | offsetof(CPU_QuadU, l.lowest)); | 153 | offsetof(CPU_QuadU, l.lowest)); |
| 165 | } | 154 | } |
| 166 | 155 | ||
| 167 | static void gen_op_load_fpr_QT1(unsigned int src) | 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 | offsetof(CPU_QuadU, l.upmost)); | 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 | offsetof(CPU_QuadU, l.upper)); | 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 | offsetof(CPU_QuadU, l.lower)); | 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 | offsetof(CPU_QuadU, l.lowest)); | 165 | offsetof(CPU_QuadU, l.lowest)); |
| 181 | } | 166 | } |
| 182 | 167 | ||
| 183 | static void gen_op_store_QT0_fpr(unsigned int dst) | 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 | offsetof(CPU_QuadU, l.upmost)); | 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 | offsetof(CPU_QuadU, l.upper)); | 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 | offsetof(CPU_QuadU, l.lower)); | 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 | offsetof(CPU_QuadU, l.lowest)); | 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 | /* moves */ | 180 | /* moves */ |
| @@ -1496,13 +1477,6 @@ static void do_branch_reg(DisasContext *dc, int32_t offset, uint32_t insn, | @@ -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 | static GenOpFunc * const gen_fcmpd[4] = { | 1480 | static GenOpFunc * const gen_fcmpd[4] = { |
| 1507 | helper_fcmpd, | 1481 | helper_fcmpd, |
| 1508 | helper_fcmpd_fcc1, | 1482 | helper_fcmpd_fcc1, |
| @@ -1517,13 +1491,6 @@ static GenOpFunc * const gen_fcmpq[4] = { | @@ -1517,13 +1491,6 @@ static GenOpFunc * const gen_fcmpq[4] = { | ||
| 1517 | helper_fcmpq_fcc3, | 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 | static GenOpFunc * const gen_fcmped[4] = { | 1494 | static GenOpFunc * const gen_fcmped[4] = { |
| 1528 | helper_fcmped, | 1495 | helper_fcmped, |
| 1529 | helper_fcmped_fcc1, | 1496 | helper_fcmped_fcc1, |
| @@ -1538,9 +1505,22 @@ static GenOpFunc * const gen_fcmpeq[4] = { | @@ -1538,9 +1505,22 @@ static GenOpFunc * const gen_fcmpeq[4] = { | ||
| 1538 | helper_fcmpeq_fcc3, | 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 | static inline void gen_op_fcmpd(int fccno) | 1526 | static inline void gen_op_fcmpd(int fccno) |
| @@ -1553,9 +1533,22 @@ static inline void gen_op_fcmpq(int fccno) | @@ -1553,9 +1533,22 @@ static inline void gen_op_fcmpq(int fccno) | ||
| 1553 | tcg_gen_helper_0_0(gen_fcmpq[fccno]); | 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 | static inline void gen_op_fcmped(int fccno) | 1554 | static inline void gen_op_fcmped(int fccno) |
| @@ -1570,9 +1563,9 @@ static inline void gen_op_fcmpeq(int fccno) | @@ -1570,9 +1563,9 @@ static inline void gen_op_fcmpeq(int fccno) | ||
| 1570 | 1563 | ||
| 1571 | #else | 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 | static inline void gen_op_fcmpd(int fccno) | 1571 | static inline void gen_op_fcmpd(int fccno) |
| @@ -1585,9 +1578,9 @@ static inline void gen_op_fcmpq(int fccno) | @@ -1585,9 +1578,9 @@ static inline void gen_op_fcmpq(int fccno) | ||
| 1585 | tcg_gen_helper_0_0(helper_fcmpq); | 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 | static inline void gen_op_fcmped(int fccno) | 1586 | static inline void gen_op_fcmped(int fccno) |
| @@ -2349,26 +2342,23 @@ static void disas_sparc_insn(DisasContext * dc) | @@ -2349,26 +2342,23 @@ static void disas_sparc_insn(DisasContext * dc) | ||
| 2349 | xop = GET_FIELD(insn, 18, 26); | 2342 | xop = GET_FIELD(insn, 18, 26); |
| 2350 | switch (xop) { | 2343 | switch (xop) { |
| 2351 | case 0x1: /* fmovs */ | 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 | break; | 2346 | break; |
| 2355 | case 0x5: /* fnegs */ | 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 | break; | 2350 | break; |
| 2360 | case 0x9: /* fabss */ | 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 | break; | 2354 | break; |
| 2365 | case 0x29: /* fsqrts */ | 2355 | case 0x29: /* fsqrts */ |
| 2366 | CHECK_FPU_FEATURE(dc, FSQRT); | 2356 | CHECK_FPU_FEATURE(dc, FSQRT); |
| 2367 | - gen_op_load_fpr_FT1(rs2); | ||
| 2368 | gen_clear_float_exceptions(); | 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 | tcg_gen_helper_0_0(helper_check_ieee_exceptions); | 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 | break; | 2362 | break; |
| 2373 | case 0x2a: /* fsqrtd */ | 2363 | case 0x2a: /* fsqrtd */ |
| 2374 | CHECK_FPU_FEATURE(dc, FSQRT); | 2364 | CHECK_FPU_FEATURE(dc, FSQRT); |
| @@ -2386,13 +2376,12 @@ static void disas_sparc_insn(DisasContext * dc) | @@ -2386,13 +2376,12 @@ static void disas_sparc_insn(DisasContext * dc) | ||
| 2386 | tcg_gen_helper_0_0(helper_check_ieee_exceptions); | 2376 | tcg_gen_helper_0_0(helper_check_ieee_exceptions); |
| 2387 | gen_op_store_QT0_fpr(QFPREG(rd)); | 2377 | gen_op_store_QT0_fpr(QFPREG(rd)); |
| 2388 | break; | 2378 | break; |
| 2389 | - case 0x41: | ||
| 2390 | - gen_op_load_fpr_FT0(rs1); | ||
| 2391 | - gen_op_load_fpr_FT1(rs2); | 2379 | + case 0x41: /* fadds */ |
| 2392 | gen_clear_float_exceptions(); | 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 | tcg_gen_helper_0_0(helper_check_ieee_exceptions); | 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 | break; | 2385 | break; |
| 2397 | case 0x42: | 2386 | case 0x42: |
| 2398 | gen_op_load_fpr_DT0(DFPREG(rs1)); | 2387 | gen_op_load_fpr_DT0(DFPREG(rs1)); |
| @@ -2411,13 +2400,12 @@ static void disas_sparc_insn(DisasContext * dc) | @@ -2411,13 +2400,12 @@ static void disas_sparc_insn(DisasContext * dc) | ||
| 2411 | tcg_gen_helper_0_0(helper_check_ieee_exceptions); | 2400 | tcg_gen_helper_0_0(helper_check_ieee_exceptions); |
| 2412 | gen_op_store_QT0_fpr(QFPREG(rd)); | 2401 | gen_op_store_QT0_fpr(QFPREG(rd)); |
| 2413 | break; | 2402 | break; |
| 2414 | - case 0x45: | ||
| 2415 | - gen_op_load_fpr_FT0(rs1); | ||
| 2416 | - gen_op_load_fpr_FT1(rs2); | 2403 | + case 0x45: /* fsubs */ |
| 2417 | gen_clear_float_exceptions(); | 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 | tcg_gen_helper_0_0(helper_check_ieee_exceptions); | 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 | break; | 2409 | break; |
| 2422 | case 0x46: | 2410 | case 0x46: |
| 2423 | gen_op_load_fpr_DT0(DFPREG(rs1)); | 2411 | gen_op_load_fpr_DT0(DFPREG(rs1)); |
| @@ -2438,12 +2426,11 @@ static void disas_sparc_insn(DisasContext * dc) | @@ -2438,12 +2426,11 @@ static void disas_sparc_insn(DisasContext * dc) | ||
| 2438 | break; | 2426 | break; |
| 2439 | case 0x49: /* fmuls */ | 2427 | case 0x49: /* fmuls */ |
| 2440 | CHECK_FPU_FEATURE(dc, FMUL); | 2428 | CHECK_FPU_FEATURE(dc, FMUL); |
| 2441 | - gen_op_load_fpr_FT0(rs1); | ||
| 2442 | - gen_op_load_fpr_FT1(rs2); | ||
| 2443 | gen_clear_float_exceptions(); | 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 | tcg_gen_helper_0_0(helper_check_ieee_exceptions); | 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 | break; | 2434 | break; |
| 2448 | case 0x4a: /* fmuld */ | 2435 | case 0x4a: /* fmuld */ |
| 2449 | CHECK_FPU_FEATURE(dc, FMUL); | 2436 | CHECK_FPU_FEATURE(dc, FMUL); |
| @@ -2464,13 +2451,12 @@ static void disas_sparc_insn(DisasContext * dc) | @@ -2464,13 +2451,12 @@ static void disas_sparc_insn(DisasContext * dc) | ||
| 2464 | tcg_gen_helper_0_0(helper_check_ieee_exceptions); | 2451 | tcg_gen_helper_0_0(helper_check_ieee_exceptions); |
| 2465 | gen_op_store_QT0_fpr(QFPREG(rd)); | 2452 | gen_op_store_QT0_fpr(QFPREG(rd)); |
| 2466 | break; | 2453 | break; |
| 2467 | - case 0x4d: | ||
| 2468 | - gen_op_load_fpr_FT0(rs1); | ||
| 2469 | - gen_op_load_fpr_FT1(rs2); | 2454 | + case 0x4d: /* fdivs */ |
| 2470 | gen_clear_float_exceptions(); | 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 | tcg_gen_helper_0_0(helper_check_ieee_exceptions); | 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 | break; | 2460 | break; |
| 2475 | case 0x4e: | 2461 | case 0x4e: |
| 2476 | gen_op_load_fpr_DT0(DFPREG(rs1)); | 2462 | gen_op_load_fpr_DT0(DFPREG(rs1)); |
| @@ -2507,12 +2493,12 @@ static void disas_sparc_insn(DisasContext * dc) | @@ -2507,12 +2493,12 @@ static void disas_sparc_insn(DisasContext * dc) | ||
| 2507 | tcg_gen_helper_0_0(helper_check_ieee_exceptions); | 2493 | tcg_gen_helper_0_0(helper_check_ieee_exceptions); |
| 2508 | gen_op_store_QT0_fpr(QFPREG(rd)); | 2494 | gen_op_store_QT0_fpr(QFPREG(rd)); |
| 2509 | break; | 2495 | break; |
| 2510 | - case 0xc4: | ||
| 2511 | - gen_op_load_fpr_FT1(rs2); | 2496 | + case 0xc4: /* fitos */ |
| 2512 | gen_clear_float_exceptions(); | 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 | tcg_gen_helper_0_0(helper_check_ieee_exceptions); | 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 | break; | 2502 | break; |
| 2517 | case 0xc6: | 2503 | case 0xc6: |
| 2518 | gen_op_load_fpr_DT1(DFPREG(rs2)); | 2504 | gen_op_load_fpr_DT1(DFPREG(rs2)); |
| @@ -2565,12 +2551,12 @@ static void disas_sparc_insn(DisasContext * dc) | @@ -2565,12 +2551,12 @@ static void disas_sparc_insn(DisasContext * dc) | ||
| 2565 | tcg_gen_helper_0_0(helper_fdtoq); | 2551 | tcg_gen_helper_0_0(helper_fdtoq); |
| 2566 | gen_op_store_QT0_fpr(QFPREG(rd)); | 2552 | gen_op_store_QT0_fpr(QFPREG(rd)); |
| 2567 | break; | 2553 | break; |
| 2568 | - case 0xd1: | ||
| 2569 | - gen_op_load_fpr_FT1(rs2); | 2554 | + case 0xd1: /* fstoi */ |
| 2570 | gen_clear_float_exceptions(); | 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 | tcg_gen_helper_0_0(helper_check_ieee_exceptions); | 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 | break; | 2560 | break; |
| 2575 | case 0xd2: | 2561 | case 0xd2: |
| 2576 | gen_op_load_fpr_DT1(DFPREG(rs2)); | 2562 | gen_op_load_fpr_DT1(DFPREG(rs2)); |
| @@ -2589,13 +2575,21 @@ static void disas_sparc_insn(DisasContext * dc) | @@ -2589,13 +2575,21 @@ static void disas_sparc_insn(DisasContext * dc) | ||
| 2589 | break; | 2575 | break; |
| 2590 | #ifdef TARGET_SPARC64 | 2576 | #ifdef TARGET_SPARC64 |
| 2591 | case 0x2: /* V9 fmovd */ | 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 | break; | 2582 | break; |
| 2595 | case 0x3: /* V9 fmovq */ | 2583 | case 0x3: /* V9 fmovq */ |
| 2596 | CHECK_FPU_FEATURE(dc, FLOAT128); | 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 | break; | 2593 | break; |
| 2600 | case 0x6: /* V9 fnegd */ | 2594 | case 0x6: /* V9 fnegd */ |
| 2601 | gen_op_load_fpr_DT1(DFPREG(rs2)); | 2595 | gen_op_load_fpr_DT1(DFPREG(rs2)); |
| @@ -2686,8 +2680,7 @@ static void disas_sparc_insn(DisasContext * dc) | @@ -2686,8 +2680,7 @@ static void disas_sparc_insn(DisasContext * dc) | ||
| 2686 | cpu_src1 = get_src1(insn, cpu_src1); | 2680 | cpu_src1 = get_src1(insn, cpu_src1); |
| 2687 | tcg_gen_brcondi_tl(gen_tcg_cond_reg[cond], cpu_src1, | 2681 | tcg_gen_brcondi_tl(gen_tcg_cond_reg[cond], cpu_src1, |
| 2688 | 0, l1); | 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 | gen_set_label(l1); | 2684 | gen_set_label(l1); |
| 2692 | break; | 2685 | break; |
| 2693 | } else if ((xop & 0x11f) == 0x006) { // V9 fmovdr | 2686 | } else if ((xop & 0x11f) == 0x006) { // V9 fmovdr |
| @@ -2698,8 +2691,8 @@ static void disas_sparc_insn(DisasContext * dc) | @@ -2698,8 +2691,8 @@ static void disas_sparc_insn(DisasContext * dc) | ||
| 2698 | cpu_src1 = get_src1(insn, cpu_src1); | 2691 | cpu_src1 = get_src1(insn, cpu_src1); |
| 2699 | tcg_gen_brcondi_tl(gen_tcg_cond_reg[cond], cpu_src1, | 2692 | tcg_gen_brcondi_tl(gen_tcg_cond_reg[cond], cpu_src1, |
| 2700 | 0, l1); | 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 | gen_set_label(l1); | 2696 | gen_set_label(l1); |
| 2704 | break; | 2697 | break; |
| 2705 | } else if ((xop & 0x11f) == 0x007) { // V9 fmovqr | 2698 | } else if ((xop & 0x11f) == 0x007) { // V9 fmovqr |
| @@ -2711,15 +2704,17 @@ static void disas_sparc_insn(DisasContext * dc) | @@ -2711,15 +2704,17 @@ static void disas_sparc_insn(DisasContext * dc) | ||
| 2711 | cpu_src1 = get_src1(insn, cpu_src1); | 2704 | cpu_src1 = get_src1(insn, cpu_src1); |
| 2712 | tcg_gen_brcondi_tl(gen_tcg_cond_reg[cond], cpu_src1, | 2705 | tcg_gen_brcondi_tl(gen_tcg_cond_reg[cond], cpu_src1, |
| 2713 | 0, l1); | 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 | gen_set_label(l1); | 2711 | gen_set_label(l1); |
| 2717 | break; | 2712 | break; |
| 2718 | } | 2713 | } |
| 2719 | #endif | 2714 | #endif |
| 2720 | switch (xop) { | 2715 | switch (xop) { |
| 2721 | #ifdef TARGET_SPARC64 | 2716 | #ifdef TARGET_SPARC64 |
| 2722 | -#define FMOVCC(size_FDQ, fcc) \ | 2717 | +#define FMOVSCC(fcc) \ |
| 2723 | { \ | 2718 | { \ |
| 2724 | TCGv r_cond; \ | 2719 | TCGv r_cond; \ |
| 2725 | int l1; \ | 2720 | int l1; \ |
| @@ -2730,54 +2725,93 @@ static void disas_sparc_insn(DisasContext * dc) | @@ -2730,54 +2725,93 @@ static void disas_sparc_insn(DisasContext * dc) | ||
| 2730 | gen_fcond(r_cond, fcc, cond); \ | 2725 | gen_fcond(r_cond, fcc, cond); \ |
| 2731 | tcg_gen_brcondi_tl(TCG_COND_EQ, r_cond, \ | 2726 | tcg_gen_brcondi_tl(TCG_COND_EQ, r_cond, \ |
| 2732 | 0, l1); \ | 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 | gen_set_label(l1); \ | 2769 | gen_set_label(l1); \ |
| 2738 | tcg_temp_free(r_cond); \ | 2770 | tcg_temp_free(r_cond); \ |
| 2739 | } | 2771 | } |
| 2740 | case 0x001: /* V9 fmovscc %fcc0 */ | 2772 | case 0x001: /* V9 fmovscc %fcc0 */ |
| 2741 | - FMOVCC(F, 0); | 2773 | + FMOVSCC(0); |
| 2742 | break; | 2774 | break; |
| 2743 | case 0x002: /* V9 fmovdcc %fcc0 */ | 2775 | case 0x002: /* V9 fmovdcc %fcc0 */ |
| 2744 | - FMOVCC(D, 0); | 2776 | + FMOVDCC(0); |
| 2745 | break; | 2777 | break; |
| 2746 | case 0x003: /* V9 fmovqcc %fcc0 */ | 2778 | case 0x003: /* V9 fmovqcc %fcc0 */ |
| 2747 | CHECK_FPU_FEATURE(dc, FLOAT128); | 2779 | CHECK_FPU_FEATURE(dc, FLOAT128); |
| 2748 | - FMOVCC(Q, 0); | 2780 | + FMOVQCC(0); |
| 2749 | break; | 2781 | break; |
| 2750 | case 0x041: /* V9 fmovscc %fcc1 */ | 2782 | case 0x041: /* V9 fmovscc %fcc1 */ |
| 2751 | - FMOVCC(F, 1); | 2783 | + FMOVSCC(1); |
| 2752 | break; | 2784 | break; |
| 2753 | case 0x042: /* V9 fmovdcc %fcc1 */ | 2785 | case 0x042: /* V9 fmovdcc %fcc1 */ |
| 2754 | - FMOVCC(D, 1); | 2786 | + FMOVDCC(1); |
| 2755 | break; | 2787 | break; |
| 2756 | case 0x043: /* V9 fmovqcc %fcc1 */ | 2788 | case 0x043: /* V9 fmovqcc %fcc1 */ |
| 2757 | CHECK_FPU_FEATURE(dc, FLOAT128); | 2789 | CHECK_FPU_FEATURE(dc, FLOAT128); |
| 2758 | - FMOVCC(Q, 1); | 2790 | + FMOVQCC(1); |
| 2759 | break; | 2791 | break; |
| 2760 | case 0x081: /* V9 fmovscc %fcc2 */ | 2792 | case 0x081: /* V9 fmovscc %fcc2 */ |
| 2761 | - FMOVCC(F, 2); | 2793 | + FMOVSCC(2); |
| 2762 | break; | 2794 | break; |
| 2763 | case 0x082: /* V9 fmovdcc %fcc2 */ | 2795 | case 0x082: /* V9 fmovdcc %fcc2 */ |
| 2764 | - FMOVCC(D, 2); | 2796 | + FMOVDCC(2); |
| 2765 | break; | 2797 | break; |
| 2766 | case 0x083: /* V9 fmovqcc %fcc2 */ | 2798 | case 0x083: /* V9 fmovqcc %fcc2 */ |
| 2767 | CHECK_FPU_FEATURE(dc, FLOAT128); | 2799 | CHECK_FPU_FEATURE(dc, FLOAT128); |
| 2768 | - FMOVCC(Q, 2); | 2800 | + FMOVQCC(2); |
| 2769 | break; | 2801 | break; |
| 2770 | case 0x0c1: /* V9 fmovscc %fcc3 */ | 2802 | case 0x0c1: /* V9 fmovscc %fcc3 */ |
| 2771 | - FMOVCC(F, 3); | 2803 | + FMOVSCC(3); |
| 2772 | break; | 2804 | break; |
| 2773 | case 0x0c2: /* V9 fmovdcc %fcc3 */ | 2805 | case 0x0c2: /* V9 fmovdcc %fcc3 */ |
| 2774 | - FMOVCC(D, 3); | 2806 | + FMOVDCC(3); |
| 2775 | break; | 2807 | break; |
| 2776 | case 0x0c3: /* V9 fmovqcc %fcc3 */ | 2808 | case 0x0c3: /* V9 fmovqcc %fcc3 */ |
| 2777 | CHECK_FPU_FEATURE(dc, FLOAT128); | 2809 | CHECK_FPU_FEATURE(dc, FLOAT128); |
| 2778 | - FMOVCC(Q, 3); | 2810 | + FMOVQCC(3); |
| 2779 | break; | 2811 | break; |
| 2780 | -#undef FMOVCC | 2812 | +#undef FMOVSCC |
| 2813 | +#undef FMOVDCC | ||
| 2814 | +#undef FMOVQCC | ||
| 2781 | #define FMOVCC(size_FDQ, icc) \ | 2815 | #define FMOVCC(size_FDQ, icc) \ |
| 2782 | { \ | 2816 | { \ |
| 2783 | TCGv r_cond; \ | 2817 | TCGv r_cond; \ |
| @@ -2796,32 +2830,87 @@ static void disas_sparc_insn(DisasContext * dc) | @@ -2796,32 +2830,87 @@ static void disas_sparc_insn(DisasContext * dc) | ||
| 2796 | gen_set_label(l1); \ | 2830 | gen_set_label(l1); \ |
| 2797 | tcg_temp_free(r_cond); \ | 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 | case 0x101: /* V9 fmovscc %icc */ | 2889 | case 0x101: /* V9 fmovscc %icc */ |
| 2801 | - FMOVCC(F, 0); | 2890 | + FMOVSCC(0); |
| 2802 | break; | 2891 | break; |
| 2803 | case 0x102: /* V9 fmovdcc %icc */ | 2892 | case 0x102: /* V9 fmovdcc %icc */ |
| 2804 | - FMOVCC(D, 0); | 2893 | + FMOVDCC(0); |
| 2805 | case 0x103: /* V9 fmovqcc %icc */ | 2894 | case 0x103: /* V9 fmovqcc %icc */ |
| 2806 | CHECK_FPU_FEATURE(dc, FLOAT128); | 2895 | CHECK_FPU_FEATURE(dc, FLOAT128); |
| 2807 | - FMOVCC(Q, 0); | 2896 | + FMOVQCC(0); |
| 2808 | break; | 2897 | break; |
| 2809 | case 0x181: /* V9 fmovscc %xcc */ | 2898 | case 0x181: /* V9 fmovscc %xcc */ |
| 2810 | - FMOVCC(F, 1); | 2899 | + FMOVSCC(1); |
| 2811 | break; | 2900 | break; |
| 2812 | case 0x182: /* V9 fmovdcc %xcc */ | 2901 | case 0x182: /* V9 fmovdcc %xcc */ |
| 2813 | - FMOVCC(D, 1); | 2902 | + FMOVDCC(1); |
| 2814 | break; | 2903 | break; |
| 2815 | case 0x183: /* V9 fmovqcc %xcc */ | 2904 | case 0x183: /* V9 fmovqcc %xcc */ |
| 2816 | CHECK_FPU_FEATURE(dc, FLOAT128); | 2905 | CHECK_FPU_FEATURE(dc, FLOAT128); |
| 2817 | - FMOVCC(Q, 1); | 2906 | + FMOVQCC(1); |
| 2818 | break; | 2907 | break; |
| 2819 | -#undef FMOVCC | 2908 | +#undef FMOVSCC |
| 2909 | +#undef FMOVDCC | ||
| 2910 | +#undef FMOVQCC | ||
| 2820 | #endif | 2911 | #endif |
| 2821 | case 0x51: /* fcmps, V9 %fcc */ | 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 | break; | 2914 | break; |
| 2826 | case 0x52: /* fcmpd, V9 %fcc */ | 2915 | case 0x52: /* fcmpd, V9 %fcc */ |
| 2827 | gen_op_load_fpr_DT0(DFPREG(rs1)); | 2916 | gen_op_load_fpr_DT0(DFPREG(rs1)); |
| @@ -2835,9 +2924,7 @@ static void disas_sparc_insn(DisasContext * dc) | @@ -2835,9 +2924,7 @@ static void disas_sparc_insn(DisasContext * dc) | ||
| 2835 | gen_op_fcmpq(rd & 3); | 2924 | gen_op_fcmpq(rd & 3); |
| 2836 | break; | 2925 | break; |
| 2837 | case 0x55: /* fcmpes, V9 %fcc */ | 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 | break; | 2928 | break; |
| 2842 | case 0x56: /* fcmped, V9 %fcc */ | 2929 | case 0x56: /* fcmped, V9 %fcc */ |
| 2843 | gen_op_load_fpr_DT0(DFPREG(rs1)); | 2930 | gen_op_load_fpr_DT0(DFPREG(rs1)); |
| @@ -4364,9 +4451,7 @@ static void disas_sparc_insn(DisasContext * dc) | @@ -4364,9 +4451,7 @@ static void disas_sparc_insn(DisasContext * dc) | ||
| 4364 | switch (xop) { | 4451 | switch (xop) { |
| 4365 | case 0x20: /* load fpreg */ | 4452 | case 0x20: /* load fpreg */ |
| 4366 | gen_address_mask(dc, cpu_addr); | 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 | break; | 4455 | break; |
| 4371 | case 0x21: /* ldfsr, V9 ldxfsr */ | 4456 | case 0x21: /* ldfsr, V9 ldxfsr */ |
| 4372 | #ifdef TARGET_SPARC64 | 4457 | #ifdef TARGET_SPARC64 |
| @@ -4508,9 +4593,7 @@ static void disas_sparc_insn(DisasContext * dc) | @@ -4508,9 +4593,7 @@ static void disas_sparc_insn(DisasContext * dc) | ||
| 4508 | switch (xop) { | 4593 | switch (xop) { |
| 4509 | case 0x24: /* store fpreg */ | 4594 | case 0x24: /* store fpreg */ |
| 4510 | gen_address_mask(dc, cpu_addr); | 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 | break; | 4597 | break; |
| 4515 | case 0x25: /* stfsr, V9 stxfsr */ | 4598 | case 0x25: /* stfsr, V9 stxfsr */ |
| 4516 | #ifdef TARGET_SPARC64 | 4599 | #ifdef TARGET_SPARC64 |
| @@ -4570,7 +4653,6 @@ static void disas_sparc_insn(DisasContext * dc) | @@ -4570,7 +4653,6 @@ static void disas_sparc_insn(DisasContext * dc) | ||
| 4570 | switch (xop) { | 4653 | switch (xop) { |
| 4571 | #ifdef TARGET_SPARC64 | 4654 | #ifdef TARGET_SPARC64 |
| 4572 | case 0x34: /* V9 stfa */ | 4655 | case 0x34: /* V9 stfa */ |
| 4573 | - gen_op_load_fpr_FT0(rd); | ||
| 4574 | gen_stf_asi(cpu_addr, insn, 4, rd); | 4656 | gen_stf_asi(cpu_addr, insn, 4, rd); |
| 4575 | break; | 4657 | break; |
| 4576 | case 0x36: /* V9 stqfa */ | 4658 | case 0x36: /* V9 stqfa */ |
| @@ -4858,6 +4940,16 @@ void gen_intermediate_code_init(CPUSPARCState *env) | @@ -4858,6 +4940,16 @@ void gen_intermediate_code_init(CPUSPARCState *env) | ||
| 4858 | "g6", | 4940 | "g6", |
| 4859 | "g7", | 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 | /* init various static tables */ | 4954 | /* init various static tables */ |
| 4863 | if (!inited) { | 4955 | if (!inited) { |
| @@ -4945,6 +5037,11 @@ void gen_intermediate_code_init(CPUSPARCState *env) | @@ -4945,6 +5037,11 @@ void gen_intermediate_code_init(CPUSPARCState *env) | ||
| 4945 | cpu_gregs[i] = tcg_global_mem_new(TCG_TYPE_TL, TCG_AREG0, | 5037 | cpu_gregs[i] = tcg_global_mem_new(TCG_TYPE_TL, TCG_AREG0, |
| 4946 | offsetof(CPUState, gregs[i]), | 5038 | offsetof(CPUState, gregs[i]), |
| 4947 | gregnames[i]); | 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 | /* register helpers */ | 5045 | /* register helpers */ |
| 4949 | 5046 | ||
| 4950 | #undef DEF_HELPER | 5047 | #undef DEF_HELPER |