Revision 714547bb target-sparc/op_helper.c
b/target-sparc/op_helper.c | ||
---|---|---|
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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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); |
Also available in: Unified diff