Revision 64a88d5d target-sparc/op_helper.c
b/target-sparc/op_helper.c | ||
---|---|---|
61 | 61 |
|
62 | 62 |
#define F_HELPER(name, p) void helper_f##name##p(void) |
63 | 63 |
|
64 |
#if defined(CONFIG_USER_ONLY) |
|
65 | 64 |
#define F_BINOP(name) \ |
66 | 65 |
F_HELPER(name, s) \ |
67 | 66 |
{ \ |
... | ... | |
75 | 74 |
{ \ |
76 | 75 |
QT0 = float128_ ## name (QT0, QT1, &env->fp_status); \ |
77 | 76 |
} |
78 |
#else |
|
79 |
#define F_BINOP(name) \ |
|
80 |
F_HELPER(name, s) \ |
|
81 |
{ \ |
|
82 |
FT0 = float32_ ## name (FT0, FT1, &env->fp_status); \ |
|
83 |
} \ |
|
84 |
F_HELPER(name, d) \ |
|
85 |
{ \ |
|
86 |
DT0 = float64_ ## name (DT0, DT1, &env->fp_status); \ |
|
87 |
} |
|
88 |
#endif |
|
89 | 77 |
|
90 | 78 |
F_BINOP(add); |
91 | 79 |
F_BINOP(sub); |
... | ... | |
100 | 88 |
&env->fp_status); |
101 | 89 |
} |
102 | 90 |
|
103 |
#if defined(CONFIG_USER_ONLY) |
|
104 | 91 |
void helper_fdmulq(void) |
105 | 92 |
{ |
106 | 93 |
QT0 = float128_mul(float64_to_float128(DT0, &env->fp_status), |
107 | 94 |
float64_to_float128(DT1, &env->fp_status), |
108 | 95 |
&env->fp_status); |
109 | 96 |
} |
110 |
#endif |
|
111 | 97 |
|
112 | 98 |
F_HELPER(neg, s) |
113 | 99 |
{ |
... | ... | |
120 | 106 |
DT0 = float64_chs(DT1); |
121 | 107 |
} |
122 | 108 |
|
123 |
#if defined(CONFIG_USER_ONLY) |
|
124 | 109 |
F_HELPER(neg, q) |
125 | 110 |
{ |
126 | 111 |
QT0 = float128_chs(QT1); |
127 | 112 |
} |
128 | 113 |
#endif |
129 |
#endif |
|
130 | 114 |
|
131 | 115 |
/* Integer to float conversion. */ |
132 | 116 |
F_HELPER(ito, s) |
... | ... | |
139 | 123 |
DT0 = int32_to_float64(*((int32_t *)&FT1), &env->fp_status); |
140 | 124 |
} |
141 | 125 |
|
142 |
#if defined(CONFIG_USER_ONLY) |
|
143 | 126 |
F_HELPER(ito, q) |
144 | 127 |
{ |
145 | 128 |
QT0 = int32_to_float128(*((int32_t *)&FT1), &env->fp_status); |
146 | 129 |
} |
147 |
#endif |
|
148 | 130 |
|
149 | 131 |
#ifdef TARGET_SPARC64 |
150 | 132 |
F_HELPER(xto, s) |
... | ... | |
156 | 138 |
{ |
157 | 139 |
DT0 = int64_to_float64(*((int64_t *)&DT1), &env->fp_status); |
158 | 140 |
} |
159 |
#if defined(CONFIG_USER_ONLY) |
|
141 |
|
|
160 | 142 |
F_HELPER(xto, q) |
161 | 143 |
{ |
162 | 144 |
QT0 = int64_to_float128(*((int64_t *)&DT1), &env->fp_status); |
163 | 145 |
} |
164 | 146 |
#endif |
165 |
#endif |
|
166 | 147 |
#undef F_HELPER |
167 | 148 |
|
168 | 149 |
/* floating point conversion */ |
... | ... | |
176 | 157 |
DT0 = float32_to_float64(FT1, &env->fp_status); |
177 | 158 |
} |
178 | 159 |
|
179 |
#if defined(CONFIG_USER_ONLY) |
|
180 | 160 |
void helper_fqtos(void) |
181 | 161 |
{ |
182 | 162 |
FT0 = float128_to_float32(QT1, &env->fp_status); |
... | ... | |
196 | 176 |
{ |
197 | 177 |
QT0 = float64_to_float128(DT1, &env->fp_status); |
198 | 178 |
} |
199 |
#endif |
|
200 | 179 |
|
201 | 180 |
/* Float to integer conversion. */ |
202 | 181 |
void helper_fstoi(void) |
... | ... | |
209 | 188 |
*((int32_t *)&FT0) = float64_to_int32_round_to_zero(DT1, &env->fp_status); |
210 | 189 |
} |
211 | 190 |
|
212 |
#if defined(CONFIG_USER_ONLY) |
|
213 | 191 |
void helper_fqtoi(void) |
214 | 192 |
{ |
215 | 193 |
*((int32_t *)&FT0) = float128_to_int32_round_to_zero(QT1, &env->fp_status); |
216 | 194 |
} |
217 |
#endif |
|
218 | 195 |
|
219 | 196 |
#ifdef TARGET_SPARC64 |
220 | 197 |
void helper_fstox(void) |
... | ... | |
227 | 204 |
*((int64_t *)&DT0) = float64_to_int64_round_to_zero(DT1, &env->fp_status); |
228 | 205 |
} |
229 | 206 |
|
230 |
#if defined(CONFIG_USER_ONLY) |
|
231 | 207 |
void helper_fqtox(void) |
232 | 208 |
{ |
233 | 209 |
*((int64_t *)&DT0) = float128_to_int64_round_to_zero(QT1, &env->fp_status); |
234 | 210 |
} |
235 |
#endif |
|
236 | 211 |
|
237 | 212 |
void helper_faligndata(void) |
238 | 213 |
{ |
... | ... | |
722 | 697 |
DT0 = float64_abs(DT1); |
723 | 698 |
} |
724 | 699 |
|
725 |
#if defined(CONFIG_USER_ONLY) |
|
726 | 700 |
void helper_fabsq(void) |
727 | 701 |
{ |
728 | 702 |
QT0 = float128_abs(QT1); |
729 | 703 |
} |
730 | 704 |
#endif |
731 |
#endif |
|
732 | 705 |
|
733 | 706 |
void helper_fsqrts(void) |
734 | 707 |
{ |
... | ... | |
740 | 713 |
DT0 = float64_sqrt(DT1, &env->fp_status); |
741 | 714 |
} |
742 | 715 |
|
743 |
#if defined(CONFIG_USER_ONLY) |
|
744 | 716 |
void helper_fsqrtq(void) |
745 | 717 |
{ |
746 | 718 |
QT0 = float128_sqrt(QT1, &env->fp_status); |
747 | 719 |
} |
748 |
#endif |
|
749 | 720 |
|
750 | 721 |
#define GEN_FCMP(name, size, reg1, reg2, FS, TRAP) \ |
751 | 722 |
void glue(helper_, name) (void) \ |
... | ... | |
784 | 755 |
GEN_FCMP(fcmpes, float32, FT0, FT1, 0, 1); |
785 | 756 |
GEN_FCMP(fcmped, float64, DT0, DT1, 0, 1); |
786 | 757 |
|
787 |
#ifdef CONFIG_USER_ONLY |
|
788 | 758 |
GEN_FCMP(fcmpq, float128, QT0, QT1, 0, 0); |
789 | 759 |
GEN_FCMP(fcmpeq, float128, QT0, QT1, 0, 1); |
790 |
#endif |
|
791 | 760 |
|
792 | 761 |
#ifdef TARGET_SPARC64 |
793 | 762 |
GEN_FCMP(fcmps_fcc1, float32, FT0, FT1, 22, 0); |
794 | 763 |
GEN_FCMP(fcmpd_fcc1, float64, DT0, DT1, 22, 0); |
764 |
GEN_FCMP(fcmpq_fcc1, float128, QT0, QT1, 22, 0); |
|
795 | 765 |
|
796 | 766 |
GEN_FCMP(fcmps_fcc2, float32, FT0, FT1, 24, 0); |
797 | 767 |
GEN_FCMP(fcmpd_fcc2, float64, DT0, DT1, 24, 0); |
768 |
GEN_FCMP(fcmpq_fcc2, float128, QT0, QT1, 24, 0); |
|
798 | 769 |
|
799 | 770 |
GEN_FCMP(fcmps_fcc3, float32, FT0, FT1, 26, 0); |
800 | 771 |
GEN_FCMP(fcmpd_fcc3, float64, DT0, DT1, 26, 0); |
772 |
GEN_FCMP(fcmpq_fcc3, float128, QT0, QT1, 26, 0); |
|
801 | 773 |
|
802 | 774 |
GEN_FCMP(fcmpes_fcc1, float32, FT0, FT1, 22, 1); |
803 | 775 |
GEN_FCMP(fcmped_fcc1, float64, DT0, DT1, 22, 1); |
776 |
GEN_FCMP(fcmpeq_fcc1, float128, QT0, QT1, 22, 1); |
|
804 | 777 |
|
805 | 778 |
GEN_FCMP(fcmpes_fcc2, float32, FT0, FT1, 24, 1); |
806 | 779 |
GEN_FCMP(fcmped_fcc2, float64, DT0, DT1, 24, 1); |
780 |
GEN_FCMP(fcmpeq_fcc2, float128, QT0, QT1, 24, 1); |
|
807 | 781 |
|
808 | 782 |
GEN_FCMP(fcmpes_fcc3, float32, FT0, FT1, 26, 1); |
809 | 783 |
GEN_FCMP(fcmped_fcc3, float64, DT0, DT1, 26, 1); |
810 |
#ifdef CONFIG_USER_ONLY |
|
811 |
GEN_FCMP(fcmpq_fcc1, float128, QT0, QT1, 22, 0); |
|
812 |
GEN_FCMP(fcmpq_fcc2, float128, QT0, QT1, 24, 0); |
|
813 |
GEN_FCMP(fcmpq_fcc3, float128, QT0, QT1, 26, 0); |
|
814 |
GEN_FCMP(fcmpeq_fcc1, float128, QT0, QT1, 22, 1); |
|
815 |
GEN_FCMP(fcmpeq_fcc2, float128, QT0, QT1, 24, 1); |
|
816 | 784 |
GEN_FCMP(fcmpeq_fcc3, float128, QT0, QT1, 26, 1); |
817 | 785 |
#endif |
818 |
#endif |
|
819 | 786 |
|
820 | 787 |
#if !defined(TARGET_SPARC64) && !defined(CONFIG_USER_ONLY) && defined(DEBUG_MXCC) |
821 | 788 |
static void dump_mxcc(CPUState *env) |
... | ... | |
2074 | 2041 |
case 8: |
2075 | 2042 |
*((int64_t *)&DT0) = val; |
2076 | 2043 |
break; |
2077 |
#if defined(CONFIG_USER_ONLY) |
|
2078 | 2044 |
case 16: |
2079 | 2045 |
// XXX |
2080 | 2046 |
break; |
2081 |
#endif |
|
2082 | 2047 |
} |
2083 | 2048 |
} |
2084 | 2049 |
|
... | ... | |
2119 | 2084 |
case 8: |
2120 | 2085 |
val = *((int64_t *)&DT0); |
2121 | 2086 |
break; |
2122 |
#if defined(CONFIG_USER_ONLY) |
|
2123 | 2087 |
case 16: |
2124 | 2088 |
// XXX |
2125 | 2089 |
break; |
2126 |
#endif |
|
2127 | 2090 |
} |
2128 | 2091 |
helper_st_asi(addr, val, asi, size); |
2129 | 2092 |
} |
... | ... | |
2299 | 2262 |
#endif |
2300 | 2263 |
} |
2301 | 2264 |
|
2302 |
#if defined(CONFIG_USER_ONLY) |
|
2303 |
void helper_ldqf(target_ulong addr) |
|
2265 |
void helper_ldqf(target_ulong addr, int mem_idx) |
|
2304 | 2266 |
{ |
2305 | 2267 |
// XXX add 128 bit load |
2306 | 2268 |
CPU_QuadU u; |
2307 | 2269 |
|
2270 |
#if !defined(CONFIG_USER_ONLY) |
|
2271 |
switch (mem_idx) { |
|
2272 |
case 0: |
|
2273 |
u.ll.upper = ldq_user(ADDR(addr)); |
|
2274 |
u.ll.lower = ldq_user(ADDR(addr + 8)); |
|
2275 |
QT0 = u.q; |
|
2276 |
break; |
|
2277 |
case 1: |
|
2278 |
u.ll.upper = ldq_kernel(ADDR(addr)); |
|
2279 |
u.ll.lower = ldq_kernel(ADDR(addr + 8)); |
|
2280 |
QT0 = u.q; |
|
2281 |
break; |
|
2282 |
#ifdef TARGET_SPARC64 |
|
2283 |
case 2: |
|
2284 |
u.ll.upper = ldq_hypv(ADDR(addr)); |
|
2285 |
u.ll.lower = ldq_hypv(ADDR(addr + 8)); |
|
2286 |
QT0 = u.q; |
|
2287 |
break; |
|
2288 |
#endif |
|
2289 |
default: |
|
2290 |
break; |
|
2291 |
} |
|
2292 |
#else |
|
2308 | 2293 |
u.ll.upper = ldq_raw(ADDR(addr)); |
2309 | 2294 |
u.ll.lower = ldq_raw(ADDR(addr + 8)); |
2310 | 2295 |
QT0 = u.q; |
2296 |
#endif |
|
2311 | 2297 |
} |
2312 | 2298 |
|
2313 |
void helper_stqf(target_ulong addr) |
|
2299 |
void helper_stqf(target_ulong addr, int mem_idx)
|
|
2314 | 2300 |
{ |
2315 | 2301 |
// XXX add 128 bit store |
2316 | 2302 |
CPU_QuadU u; |
2317 | 2303 |
|
2304 |
#if !defined(CONFIG_USER_ONLY) |
|
2305 |
switch (mem_idx) { |
|
2306 |
case 0: |
|
2307 |
u.q = QT0; |
|
2308 |
stq_user(ADDR(addr), u.ll.upper); |
|
2309 |
stq_user(ADDR(addr + 8), u.ll.lower); |
|
2310 |
break; |
|
2311 |
case 1: |
|
2312 |
u.q = QT0; |
|
2313 |
stq_kernel(ADDR(addr), u.ll.upper); |
|
2314 |
stq_kernel(ADDR(addr + 8), u.ll.lower); |
|
2315 |
break; |
|
2316 |
#ifdef TARGET_SPARC64 |
|
2317 |
case 2: |
|
2318 |
u.q = QT0; |
|
2319 |
stq_hypv(ADDR(addr), u.ll.upper); |
|
2320 |
stq_hypv(ADDR(addr + 8), u.ll.lower); |
|
2321 |
break; |
|
2322 |
#endif |
|
2323 |
default: |
|
2324 |
break; |
|
2325 |
} |
|
2326 |
#else |
|
2318 | 2327 |
u.q = QT0; |
2319 | 2328 |
stq_raw(ADDR(addr), u.ll.upper); |
2320 | 2329 |
stq_raw(ADDR(addr + 8), u.ll.lower); |
2321 |
} |
|
2322 | 2330 |
#endif |
2331 |
} |
|
2323 | 2332 |
|
2324 | 2333 |
#undef ADDR |
2325 | 2334 |
|
Also available in: Unified diff