Commit 7e8c2b6ca8bed50375fb5bb3363d46588c526ef9
1 parent
dcf24905
Convert float helpers to TCG, fix fabsq in the process
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4014 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
5 changed files
with
232 additions
and
281 deletions
target-sparc/exec.h
| @@ -52,53 +52,21 @@ register uint32_t T2 asm(AREG3); | @@ -52,53 +52,21 @@ register uint32_t T2 asm(AREG3); | ||
| 52 | void cpu_lock(void); | 52 | void cpu_lock(void); |
| 53 | void cpu_unlock(void); | 53 | void cpu_unlock(void); |
| 54 | void cpu_loop_exit(void); | 54 | void cpu_loop_exit(void); |
| 55 | -void helper_ldfsr(void); | ||
| 56 | void set_cwp(int new_cwp); | 55 | void set_cwp(int new_cwp); |
| 57 | void do_fitos(void); | 56 | void do_fitos(void); |
| 58 | void do_fitod(void); | 57 | void do_fitod(void); |
| 59 | -void do_fabss(void); | ||
| 60 | -void do_fsqrts(void); | ||
| 61 | -void do_fsqrtd(void); | ||
| 62 | -void do_fcmps(void); | ||
| 63 | -void do_fcmpd(void); | ||
| 64 | -void do_fcmpes(void); | ||
| 65 | -void do_fcmped(void); | ||
| 66 | #if defined(CONFIG_USER_ONLY) | 58 | #if defined(CONFIG_USER_ONLY) |
| 67 | void do_fitoq(void); | 59 | void do_fitoq(void); |
| 68 | -void do_fsqrtq(void); | ||
| 69 | -void do_fcmpq(void); | ||
| 70 | -void do_fcmpeq(void); | ||
| 71 | #endif | 60 | #endif |
| 72 | #ifdef TARGET_SPARC64 | 61 | #ifdef TARGET_SPARC64 |
| 73 | -void do_fabsd(void); | ||
| 74 | void do_fxtos(void); | 62 | void do_fxtos(void); |
| 75 | void do_fxtod(void); | 63 | void do_fxtod(void); |
| 76 | -void do_fcmps_fcc1(void); | ||
| 77 | -void do_fcmpd_fcc1(void); | ||
| 78 | -void do_fcmps_fcc2(void); | ||
| 79 | -void do_fcmpd_fcc2(void); | ||
| 80 | -void do_fcmps_fcc3(void); | ||
| 81 | -void do_fcmpd_fcc3(void); | ||
| 82 | -void do_fcmpes_fcc1(void); | ||
| 83 | -void do_fcmped_fcc1(void); | ||
| 84 | -void do_fcmpes_fcc2(void); | ||
| 85 | -void do_fcmped_fcc2(void); | ||
| 86 | -void do_fcmpes_fcc3(void); | ||
| 87 | -void do_fcmped_fcc3(void); | ||
| 88 | #if defined(CONFIG_USER_ONLY) | 64 | #if defined(CONFIG_USER_ONLY) |
| 89 | -void do_fabsq(void); | ||
| 90 | void do_fxtoq(void); | 65 | void do_fxtoq(void); |
| 91 | -void do_fcmpq_fcc1(void); | ||
| 92 | -void do_fcmpq_fcc2(void); | ||
| 93 | -void do_fcmpq_fcc3(void); | ||
| 94 | -void do_fcmpeq_fcc1(void); | ||
| 95 | -void do_fcmpeq_fcc2(void); | ||
| 96 | -void do_fcmpeq_fcc3(void); | ||
| 97 | #endif | 66 | #endif |
| 98 | #endif | 67 | #endif |
| 99 | void do_interrupt(int intno); | 68 | void do_interrupt(int intno); |
| 100 | void raise_exception(int tt); | 69 | void raise_exception(int tt); |
| 101 | -void check_ieee_exceptions(); | ||
| 102 | void memcpy32(target_ulong *dst, const target_ulong *src); | 70 | void memcpy32(target_ulong *dst, const target_ulong *src); |
| 103 | target_ulong mmu_probe(CPUState *env, target_ulong address, int mmulev); | 71 | target_ulong mmu_probe(CPUState *env, target_ulong address, int mmulev); |
| 104 | void dump_mmu(CPUState *env); | 72 | void dump_mmu(CPUState *env); |
target-sparc/helper.h
| @@ -33,3 +33,42 @@ uint64_t TCG_HELPER_PROTO helper_ld_asi(target_ulong addr, int asi, | @@ -33,3 +33,42 @@ uint64_t TCG_HELPER_PROTO helper_ld_asi(target_ulong addr, int asi, | ||
| 33 | int size, int sign); | 33 | int size, int sign); |
| 34 | void TCG_HELPER_PROTO helper_st_asi(target_ulong addr, uint64_t val, int asi, | 34 | void TCG_HELPER_PROTO helper_st_asi(target_ulong addr, uint64_t val, int asi, |
| 35 | int size); | 35 | int size); |
| 36 | +void TCG_HELPER_PROTO helper_ldfsr(void); | ||
| 37 | +void TCG_HELPER_PROTO helper_check_ieee_exceptions(void); | ||
| 38 | +void TCG_HELPER_PROTO helper_clear_float_exceptions(void); | ||
| 39 | +void TCG_HELPER_PROTO helper_fabss(void); | ||
| 40 | +void TCG_HELPER_PROTO helper_fsqrts(void); | ||
| 41 | +void TCG_HELPER_PROTO helper_fsqrtd(void); | ||
| 42 | +void TCG_HELPER_PROTO helper_fcmps(void); | ||
| 43 | +void TCG_HELPER_PROTO helper_fcmpd(void); | ||
| 44 | +void TCG_HELPER_PROTO helper_fcmpes(void); | ||
| 45 | +void TCG_HELPER_PROTO helper_fcmped(void); | ||
| 46 | +#if defined(CONFIG_USER_ONLY) | ||
| 47 | +void TCG_HELPER_PROTO helper_fsqrtq(void); | ||
| 48 | +void TCG_HELPER_PROTO helper_fcmpq(void); | ||
| 49 | +void TCG_HELPER_PROTO helper_fcmpeq(void); | ||
| 50 | +#endif | ||
| 51 | +#ifdef TARGET_SPARC64 | ||
| 52 | +void TCG_HELPER_PROTO helper_fabsd(void); | ||
| 53 | +void TCG_HELPER_PROTO helper_fcmps_fcc1(void); | ||
| 54 | +void TCG_HELPER_PROTO helper_fcmpd_fcc1(void); | ||
| 55 | +void TCG_HELPER_PROTO helper_fcmps_fcc2(void); | ||
| 56 | +void TCG_HELPER_PROTO helper_fcmpd_fcc2(void); | ||
| 57 | +void TCG_HELPER_PROTO helper_fcmps_fcc3(void); | ||
| 58 | +void TCG_HELPER_PROTO helper_fcmpd_fcc3(void); | ||
| 59 | +void TCG_HELPER_PROTO helper_fcmpes_fcc1(void); | ||
| 60 | +void TCG_HELPER_PROTO helper_fcmped_fcc1(void); | ||
| 61 | +void TCG_HELPER_PROTO helper_fcmpes_fcc2(void); | ||
| 62 | +void TCG_HELPER_PROTO helper_fcmped_fcc2(void); | ||
| 63 | +void TCG_HELPER_PROTO helper_fcmpes_fcc3(void); | ||
| 64 | +void TCG_HELPER_PROTO helper_fcmped_fcc3(void); | ||
| 65 | +#if defined(CONFIG_USER_ONLY) | ||
| 66 | +void TCG_HELPER_PROTO helper_fabsq(void); | ||
| 67 | +void TCG_HELPER_PROTO helper_fcmpq_fcc1(void); | ||
| 68 | +void TCG_HELPER_PROTO helper_fcmpq_fcc2(void); | ||
| 69 | +void TCG_HELPER_PROTO helper_fcmpq_fcc3(void); | ||
| 70 | +void TCG_HELPER_PROTO helper_fcmpeq_fcc1(void); | ||
| 71 | +void TCG_HELPER_PROTO helper_fcmpeq_fcc2(void); | ||
| 72 | +void TCG_HELPER_PROTO helper_fcmpeq_fcc3(void); | ||
| 73 | +#endif | ||
| 74 | +#endif |
target-sparc/op.c
| @@ -763,7 +763,6 @@ void OPPROTO op_logic_T0_cc(void) | @@ -763,7 +763,6 @@ void OPPROTO op_logic_T0_cc(void) | ||
| 763 | void OPPROTO op_ldfsr(void) | 763 | void OPPROTO op_ldfsr(void) |
| 764 | { | 764 | { |
| 765 | PUT_FSR32(env, *((uint32_t *) &FT0)); | 765 | PUT_FSR32(env, *((uint32_t *) &FT0)); |
| 766 | - helper_ldfsr(); | ||
| 767 | } | 766 | } |
| 768 | 767 | ||
| 769 | void OPPROTO op_stfsr(void) | 768 | void OPPROTO op_stfsr(void) |
| @@ -1157,46 +1156,31 @@ void OPPROTO op_jz_T2_label(void) | @@ -1157,46 +1156,31 @@ void OPPROTO op_jz_T2_label(void) | ||
| 1157 | FORCE_RET(); | 1156 | FORCE_RET(); |
| 1158 | } | 1157 | } |
| 1159 | 1158 | ||
| 1160 | -void OPPROTO op_clear_ieee_excp_and_FTT(void) | ||
| 1161 | -{ | ||
| 1162 | - env->fsr &= ~(FSR_FTT_MASK | FSR_CEXC_MASK);; | ||
| 1163 | -} | ||
| 1164 | - | ||
| 1165 | #define F_OP(name, p) void OPPROTO op_f##name##p(void) | 1159 | #define F_OP(name, p) void OPPROTO op_f##name##p(void) |
| 1166 | 1160 | ||
| 1167 | #if defined(CONFIG_USER_ONLY) | 1161 | #if defined(CONFIG_USER_ONLY) |
| 1168 | #define F_BINOP(name) \ | 1162 | #define F_BINOP(name) \ |
| 1169 | F_OP(name, s) \ | 1163 | F_OP(name, s) \ |
| 1170 | { \ | 1164 | { \ |
| 1171 | - set_float_exception_flags(0, &env->fp_status); \ | ||
| 1172 | FT0 = float32_ ## name (FT0, FT1, &env->fp_status); \ | 1165 | FT0 = float32_ ## name (FT0, FT1, &env->fp_status); \ |
| 1173 | - check_ieee_exceptions(); \ | ||
| 1174 | } \ | 1166 | } \ |
| 1175 | F_OP(name, d) \ | 1167 | F_OP(name, d) \ |
| 1176 | { \ | 1168 | { \ |
| 1177 | - set_float_exception_flags(0, &env->fp_status); \ | ||
| 1178 | DT0 = float64_ ## name (DT0, DT1, &env->fp_status); \ | 1169 | DT0 = float64_ ## name (DT0, DT1, &env->fp_status); \ |
| 1179 | - check_ieee_exceptions(); \ | ||
| 1180 | } \ | 1170 | } \ |
| 1181 | F_OP(name, q) \ | 1171 | F_OP(name, q) \ |
| 1182 | { \ | 1172 | { \ |
| 1183 | - set_float_exception_flags(0, &env->fp_status); \ | ||
| 1184 | QT0 = float128_ ## name (QT0, QT1, &env->fp_status); \ | 1173 | QT0 = float128_ ## name (QT0, QT1, &env->fp_status); \ |
| 1185 | - check_ieee_exceptions(); \ | ||
| 1186 | } | 1174 | } |
| 1187 | #else | 1175 | #else |
| 1188 | #define F_BINOP(name) \ | 1176 | #define F_BINOP(name) \ |
| 1189 | F_OP(name, s) \ | 1177 | F_OP(name, s) \ |
| 1190 | { \ | 1178 | { \ |
| 1191 | - set_float_exception_flags(0, &env->fp_status); \ | ||
| 1192 | FT0 = float32_ ## name (FT0, FT1, &env->fp_status); \ | 1179 | FT0 = float32_ ## name (FT0, FT1, &env->fp_status); \ |
| 1193 | - check_ieee_exceptions(); \ | ||
| 1194 | } \ | 1180 | } \ |
| 1195 | F_OP(name, d) \ | 1181 | F_OP(name, d) \ |
| 1196 | { \ | 1182 | { \ |
| 1197 | - set_float_exception_flags(0, &env->fp_status); \ | ||
| 1198 | DT0 = float64_ ## name (DT0, DT1, &env->fp_status); \ | 1183 | DT0 = float64_ ## name (DT0, DT1, &env->fp_status); \ |
| 1199 | - check_ieee_exceptions(); \ | ||
| 1200 | } | 1184 | } |
| 1201 | #endif | 1185 | #endif |
| 1202 | 1186 | ||
| @@ -1208,21 +1192,17 @@ F_BINOP(div); | @@ -1208,21 +1192,17 @@ F_BINOP(div); | ||
| 1208 | 1192 | ||
| 1209 | void OPPROTO op_fsmuld(void) | 1193 | void OPPROTO op_fsmuld(void) |
| 1210 | { | 1194 | { |
| 1211 | - set_float_exception_flags(0, &env->fp_status); | ||
| 1212 | DT0 = float64_mul(float32_to_float64(FT0, &env->fp_status), | 1195 | DT0 = float64_mul(float32_to_float64(FT0, &env->fp_status), |
| 1213 | float32_to_float64(FT1, &env->fp_status), | 1196 | float32_to_float64(FT1, &env->fp_status), |
| 1214 | &env->fp_status); | 1197 | &env->fp_status); |
| 1215 | - check_ieee_exceptions(); | ||
| 1216 | } | 1198 | } |
| 1217 | 1199 | ||
| 1218 | #if defined(CONFIG_USER_ONLY) | 1200 | #if defined(CONFIG_USER_ONLY) |
| 1219 | void OPPROTO op_fdmulq(void) | 1201 | void OPPROTO op_fdmulq(void) |
| 1220 | { | 1202 | { |
| 1221 | - set_float_exception_flags(0, &env->fp_status); | ||
| 1222 | QT0 = float128_mul(float64_to_float128(DT0, &env->fp_status), | 1203 | QT0 = float128_mul(float64_to_float128(DT0, &env->fp_status), |
| 1223 | float64_to_float128(DT1, &env->fp_status), | 1204 | float64_to_float128(DT1, &env->fp_status), |
| 1224 | &env->fp_status); | 1205 | &env->fp_status); |
| 1225 | - check_ieee_exceptions(); | ||
| 1226 | } | 1206 | } |
| 1227 | #endif | 1207 | #endif |
| 1228 | 1208 | ||
| @@ -1252,134 +1232,23 @@ void OPPROTO op_fdmulq(void) | @@ -1252,134 +1232,23 @@ void OPPROTO op_fdmulq(void) | ||
| 1252 | } | 1232 | } |
| 1253 | #endif | 1233 | #endif |
| 1254 | 1234 | ||
| 1255 | -F_HELPER(sqrt); | ||
| 1256 | - | ||
| 1257 | F_OP(neg, s) | 1235 | F_OP(neg, s) |
| 1258 | { | 1236 | { |
| 1259 | FT0 = float32_chs(FT1); | 1237 | FT0 = float32_chs(FT1); |
| 1260 | } | 1238 | } |
| 1261 | 1239 | ||
| 1262 | -F_OP(abs, s) | ||
| 1263 | -{ | ||
| 1264 | - do_fabss(); | ||
| 1265 | -} | ||
| 1266 | - | ||
| 1267 | -F_HELPER(cmp); | ||
| 1268 | -F_HELPER(cmpe); | ||
| 1269 | - | ||
| 1270 | #ifdef TARGET_SPARC64 | 1240 | #ifdef TARGET_SPARC64 |
| 1271 | F_OP(neg, d) | 1241 | F_OP(neg, d) |
| 1272 | { | 1242 | { |
| 1273 | DT0 = float64_chs(DT1); | 1243 | DT0 = float64_chs(DT1); |
| 1274 | } | 1244 | } |
| 1275 | 1245 | ||
| 1276 | -F_OP(abs, d) | ||
| 1277 | -{ | ||
| 1278 | - do_fabsd(); | ||
| 1279 | -} | ||
| 1280 | - | ||
| 1281 | #if defined(CONFIG_USER_ONLY) | 1246 | #if defined(CONFIG_USER_ONLY) |
| 1282 | F_OP(neg, q) | 1247 | F_OP(neg, q) |
| 1283 | { | 1248 | { |
| 1284 | QT0 = float128_chs(QT1); | 1249 | QT0 = float128_chs(QT1); |
| 1285 | } | 1250 | } |
| 1286 | 1251 | ||
| 1287 | -F_OP(abs, q) | ||
| 1288 | -{ | ||
| 1289 | - do_fabsd(); | ||
| 1290 | -} | ||
| 1291 | -#endif | ||
| 1292 | - | ||
| 1293 | -void OPPROTO op_fcmps_fcc1(void) | ||
| 1294 | -{ | ||
| 1295 | - do_fcmps_fcc1(); | ||
| 1296 | -} | ||
| 1297 | - | ||
| 1298 | -void OPPROTO op_fcmpd_fcc1(void) | ||
| 1299 | -{ | ||
| 1300 | - do_fcmpd_fcc1(); | ||
| 1301 | -} | ||
| 1302 | - | ||
| 1303 | -void OPPROTO op_fcmps_fcc2(void) | ||
| 1304 | -{ | ||
| 1305 | - do_fcmps_fcc2(); | ||
| 1306 | -} | ||
| 1307 | - | ||
| 1308 | -void OPPROTO op_fcmpd_fcc2(void) | ||
| 1309 | -{ | ||
| 1310 | - do_fcmpd_fcc2(); | ||
| 1311 | -} | ||
| 1312 | - | ||
| 1313 | -void OPPROTO op_fcmps_fcc3(void) | ||
| 1314 | -{ | ||
| 1315 | - do_fcmps_fcc3(); | ||
| 1316 | -} | ||
| 1317 | - | ||
| 1318 | -void OPPROTO op_fcmpd_fcc3(void) | ||
| 1319 | -{ | ||
| 1320 | - do_fcmpd_fcc3(); | ||
| 1321 | -} | ||
| 1322 | - | ||
| 1323 | -void OPPROTO op_fcmpes_fcc1(void) | ||
| 1324 | -{ | ||
| 1325 | - do_fcmpes_fcc1(); | ||
| 1326 | -} | ||
| 1327 | - | ||
| 1328 | -void OPPROTO op_fcmped_fcc1(void) | ||
| 1329 | -{ | ||
| 1330 | - do_fcmped_fcc1(); | ||
| 1331 | -} | ||
| 1332 | - | ||
| 1333 | -void OPPROTO op_fcmpes_fcc2(void) | ||
| 1334 | -{ | ||
| 1335 | - do_fcmpes_fcc2(); | ||
| 1336 | -} | ||
| 1337 | - | ||
| 1338 | -void OPPROTO op_fcmped_fcc2(void) | ||
| 1339 | -{ | ||
| 1340 | - do_fcmped_fcc2(); | ||
| 1341 | -} | ||
| 1342 | - | ||
| 1343 | -void OPPROTO op_fcmpes_fcc3(void) | ||
| 1344 | -{ | ||
| 1345 | - do_fcmpes_fcc3(); | ||
| 1346 | -} | ||
| 1347 | - | ||
| 1348 | -void OPPROTO op_fcmped_fcc3(void) | ||
| 1349 | -{ | ||
| 1350 | - do_fcmped_fcc3(); | ||
| 1351 | -} | ||
| 1352 | - | ||
| 1353 | -#if defined(CONFIG_USER_ONLY) | ||
| 1354 | -void OPPROTO op_fcmpq_fcc1(void) | ||
| 1355 | -{ | ||
| 1356 | - do_fcmpq_fcc1(); | ||
| 1357 | -} | ||
| 1358 | - | ||
| 1359 | -void OPPROTO op_fcmpq_fcc2(void) | ||
| 1360 | -{ | ||
| 1361 | - do_fcmpq_fcc2(); | ||
| 1362 | -} | ||
| 1363 | - | ||
| 1364 | -void OPPROTO op_fcmpq_fcc3(void) | ||
| 1365 | -{ | ||
| 1366 | - do_fcmpq_fcc3(); | ||
| 1367 | -} | ||
| 1368 | - | ||
| 1369 | -void OPPROTO op_fcmpeq_fcc1(void) | ||
| 1370 | -{ | ||
| 1371 | - do_fcmpeq_fcc1(); | ||
| 1372 | -} | ||
| 1373 | - | ||
| 1374 | -void OPPROTO op_fcmpeq_fcc2(void) | ||
| 1375 | -{ | ||
| 1376 | - do_fcmpeq_fcc2(); | ||
| 1377 | -} | ||
| 1378 | - | ||
| 1379 | -void OPPROTO op_fcmpeq_fcc3(void) | ||
| 1380 | -{ | ||
| 1381 | - do_fcmpeq_fcc3(); | ||
| 1382 | -} | ||
| 1383 | #endif | 1252 | #endif |
| 1384 | 1253 | ||
| 1385 | #endif | 1254 | #endif |
| @@ -1393,47 +1262,35 @@ F_HELPER(xto); | @@ -1393,47 +1262,35 @@ F_HELPER(xto); | ||
| 1393 | #else | 1262 | #else |
| 1394 | F_OP(ito, s) | 1263 | F_OP(ito, s) |
| 1395 | { | 1264 | { |
| 1396 | - set_float_exception_flags(0, &env->fp_status); | ||
| 1397 | FT0 = int32_to_float32(*((int32_t *)&FT1), &env->fp_status); | 1265 | FT0 = int32_to_float32(*((int32_t *)&FT1), &env->fp_status); |
| 1398 | - check_ieee_exceptions(); | ||
| 1399 | } | 1266 | } |
| 1400 | 1267 | ||
| 1401 | F_OP(ito, d) | 1268 | F_OP(ito, d) |
| 1402 | { | 1269 | { |
| 1403 | - set_float_exception_flags(0, &env->fp_status); | ||
| 1404 | DT0 = int32_to_float64(*((int32_t *)&FT1), &env->fp_status); | 1270 | DT0 = int32_to_float64(*((int32_t *)&FT1), &env->fp_status); |
| 1405 | - check_ieee_exceptions(); | ||
| 1406 | } | 1271 | } |
| 1407 | 1272 | ||
| 1408 | #if defined(CONFIG_USER_ONLY) | 1273 | #if defined(CONFIG_USER_ONLY) |
| 1409 | F_OP(ito, q) | 1274 | F_OP(ito, q) |
| 1410 | { | 1275 | { |
| 1411 | - set_float_exception_flags(0, &env->fp_status); | ||
| 1412 | QT0 = int32_to_float128(*((int32_t *)&FT1), &env->fp_status); | 1276 | QT0 = int32_to_float128(*((int32_t *)&FT1), &env->fp_status); |
| 1413 | - check_ieee_exceptions(); | ||
| 1414 | } | 1277 | } |
| 1415 | #endif | 1278 | #endif |
| 1416 | 1279 | ||
| 1417 | #ifdef TARGET_SPARC64 | 1280 | #ifdef TARGET_SPARC64 |
| 1418 | F_OP(xto, s) | 1281 | F_OP(xto, s) |
| 1419 | { | 1282 | { |
| 1420 | - set_float_exception_flags(0, &env->fp_status); | ||
| 1421 | FT0 = int64_to_float32(*((int64_t *)&DT1), &env->fp_status); | 1283 | FT0 = int64_to_float32(*((int64_t *)&DT1), &env->fp_status); |
| 1422 | - check_ieee_exceptions(); | ||
| 1423 | } | 1284 | } |
| 1424 | 1285 | ||
| 1425 | F_OP(xto, d) | 1286 | F_OP(xto, d) |
| 1426 | { | 1287 | { |
| 1427 | - set_float_exception_flags(0, &env->fp_status); | ||
| 1428 | DT0 = int64_to_float64(*((int64_t *)&DT1), &env->fp_status); | 1288 | DT0 = int64_to_float64(*((int64_t *)&DT1), &env->fp_status); |
| 1429 | - check_ieee_exceptions(); | ||
| 1430 | } | 1289 | } |
| 1431 | #if defined(CONFIG_USER_ONLY) | 1290 | #if defined(CONFIG_USER_ONLY) |
| 1432 | F_OP(xto, q) | 1291 | F_OP(xto, q) |
| 1433 | { | 1292 | { |
| 1434 | - set_float_exception_flags(0, &env->fp_status); | ||
| 1435 | QT0 = int64_to_float128(*((int64_t *)&DT1), &env->fp_status); | 1293 | QT0 = int64_to_float128(*((int64_t *)&DT1), &env->fp_status); |
| 1436 | - check_ieee_exceptions(); | ||
| 1437 | } | 1294 | } |
| 1438 | #endif | 1295 | #endif |
| 1439 | #endif | 1296 | #endif |
| @@ -1443,93 +1300,69 @@ F_OP(xto, q) | @@ -1443,93 +1300,69 @@ F_OP(xto, q) | ||
| 1443 | /* floating point conversion */ | 1300 | /* floating point conversion */ |
| 1444 | void OPPROTO op_fdtos(void) | 1301 | void OPPROTO op_fdtos(void) |
| 1445 | { | 1302 | { |
| 1446 | - set_float_exception_flags(0, &env->fp_status); | ||
| 1447 | FT0 = float64_to_float32(DT1, &env->fp_status); | 1303 | FT0 = float64_to_float32(DT1, &env->fp_status); |
| 1448 | - check_ieee_exceptions(); | ||
| 1449 | } | 1304 | } |
| 1450 | 1305 | ||
| 1451 | void OPPROTO op_fstod(void) | 1306 | void OPPROTO op_fstod(void) |
| 1452 | { | 1307 | { |
| 1453 | - set_float_exception_flags(0, &env->fp_status); | ||
| 1454 | DT0 = float32_to_float64(FT1, &env->fp_status); | 1308 | DT0 = float32_to_float64(FT1, &env->fp_status); |
| 1455 | - check_ieee_exceptions(); | ||
| 1456 | } | 1309 | } |
| 1457 | 1310 | ||
| 1458 | #if defined(CONFIG_USER_ONLY) | 1311 | #if defined(CONFIG_USER_ONLY) |
| 1459 | void OPPROTO op_fqtos(void) | 1312 | void OPPROTO op_fqtos(void) |
| 1460 | { | 1313 | { |
| 1461 | - set_float_exception_flags(0, &env->fp_status); | ||
| 1462 | FT0 = float128_to_float32(QT1, &env->fp_status); | 1314 | FT0 = float128_to_float32(QT1, &env->fp_status); |
| 1463 | - check_ieee_exceptions(); | ||
| 1464 | } | 1315 | } |
| 1465 | 1316 | ||
| 1466 | void OPPROTO op_fstoq(void) | 1317 | void OPPROTO op_fstoq(void) |
| 1467 | { | 1318 | { |
| 1468 | - set_float_exception_flags(0, &env->fp_status); | ||
| 1469 | QT0 = float32_to_float128(FT1, &env->fp_status); | 1319 | QT0 = float32_to_float128(FT1, &env->fp_status); |
| 1470 | - check_ieee_exceptions(); | ||
| 1471 | } | 1320 | } |
| 1472 | 1321 | ||
| 1473 | void OPPROTO op_fqtod(void) | 1322 | void OPPROTO op_fqtod(void) |
| 1474 | { | 1323 | { |
| 1475 | - set_float_exception_flags(0, &env->fp_status); | ||
| 1476 | DT0 = float128_to_float64(QT1, &env->fp_status); | 1324 | DT0 = float128_to_float64(QT1, &env->fp_status); |
| 1477 | - check_ieee_exceptions(); | ||
| 1478 | } | 1325 | } |
| 1479 | 1326 | ||
| 1480 | void OPPROTO op_fdtoq(void) | 1327 | void OPPROTO op_fdtoq(void) |
| 1481 | { | 1328 | { |
| 1482 | - set_float_exception_flags(0, &env->fp_status); | ||
| 1483 | QT0 = float64_to_float128(DT1, &env->fp_status); | 1329 | QT0 = float64_to_float128(DT1, &env->fp_status); |
| 1484 | - check_ieee_exceptions(); | ||
| 1485 | } | 1330 | } |
| 1486 | #endif | 1331 | #endif |
| 1487 | 1332 | ||
| 1488 | /* Float to integer conversion. */ | 1333 | /* Float to integer conversion. */ |
| 1489 | void OPPROTO op_fstoi(void) | 1334 | void OPPROTO op_fstoi(void) |
| 1490 | { | 1335 | { |
| 1491 | - set_float_exception_flags(0, &env->fp_status); | ||
| 1492 | *((int32_t *)&FT0) = float32_to_int32_round_to_zero(FT1, &env->fp_status); | 1336 | *((int32_t *)&FT0) = float32_to_int32_round_to_zero(FT1, &env->fp_status); |
| 1493 | - check_ieee_exceptions(); | ||
| 1494 | } | 1337 | } |
| 1495 | 1338 | ||
| 1496 | void OPPROTO op_fdtoi(void) | 1339 | void OPPROTO op_fdtoi(void) |
| 1497 | { | 1340 | { |
| 1498 | - set_float_exception_flags(0, &env->fp_status); | ||
| 1499 | *((int32_t *)&FT0) = float64_to_int32_round_to_zero(DT1, &env->fp_status); | 1341 | *((int32_t *)&FT0) = float64_to_int32_round_to_zero(DT1, &env->fp_status); |
| 1500 | - check_ieee_exceptions(); | ||
| 1501 | } | 1342 | } |
| 1502 | 1343 | ||
| 1503 | #if defined(CONFIG_USER_ONLY) | 1344 | #if defined(CONFIG_USER_ONLY) |
| 1504 | void OPPROTO op_fqtoi(void) | 1345 | void OPPROTO op_fqtoi(void) |
| 1505 | { | 1346 | { |
| 1506 | - set_float_exception_flags(0, &env->fp_status); | ||
| 1507 | *((int32_t *)&FT0) = float128_to_int32_round_to_zero(QT1, &env->fp_status); | 1347 | *((int32_t *)&FT0) = float128_to_int32_round_to_zero(QT1, &env->fp_status); |
| 1508 | - check_ieee_exceptions(); | ||
| 1509 | } | 1348 | } |
| 1510 | #endif | 1349 | #endif |
| 1511 | 1350 | ||
| 1512 | #ifdef TARGET_SPARC64 | 1351 | #ifdef TARGET_SPARC64 |
| 1513 | void OPPROTO op_fstox(void) | 1352 | void OPPROTO op_fstox(void) |
| 1514 | { | 1353 | { |
| 1515 | - set_float_exception_flags(0, &env->fp_status); | ||
| 1516 | *((int64_t *)&DT0) = float32_to_int64_round_to_zero(FT1, &env->fp_status); | 1354 | *((int64_t *)&DT0) = float32_to_int64_round_to_zero(FT1, &env->fp_status); |
| 1517 | - check_ieee_exceptions(); | ||
| 1518 | } | 1355 | } |
| 1519 | 1356 | ||
| 1520 | void OPPROTO op_fdtox(void) | 1357 | void OPPROTO op_fdtox(void) |
| 1521 | { | 1358 | { |
| 1522 | - set_float_exception_flags(0, &env->fp_status); | ||
| 1523 | *((int64_t *)&DT0) = float64_to_int64_round_to_zero(DT1, &env->fp_status); | 1359 | *((int64_t *)&DT0) = float64_to_int64_round_to_zero(DT1, &env->fp_status); |
| 1524 | - check_ieee_exceptions(); | ||
| 1525 | } | 1360 | } |
| 1526 | 1361 | ||
| 1527 | #if defined(CONFIG_USER_ONLY) | 1362 | #if defined(CONFIG_USER_ONLY) |
| 1528 | void OPPROTO op_fqtox(void) | 1363 | void OPPROTO op_fqtox(void) |
| 1529 | { | 1364 | { |
| 1530 | - set_float_exception_flags(0, &env->fp_status); | ||
| 1531 | *((int64_t *)&DT0) = float128_to_int64_round_to_zero(QT1, &env->fp_status); | 1365 | *((int64_t *)&DT0) = float128_to_int64_round_to_zero(QT1, &env->fp_status); |
| 1532 | - check_ieee_exceptions(); | ||
| 1533 | } | 1366 | } |
| 1534 | #endif | 1367 | #endif |
| 1535 | 1368 |
target-sparc/op_helper.c
| @@ -50,7 +50,7 @@ void helper_trapcc(target_ulong nb_trap, target_ulong do_trap) | @@ -50,7 +50,7 @@ void helper_trapcc(target_ulong nb_trap, target_ulong do_trap) | ||
| 50 | } | 50 | } |
| 51 | } | 51 | } |
| 52 | 52 | ||
| 53 | -void check_ieee_exceptions(void) | 53 | +void helper_check_ieee_exceptions(void) |
| 54 | { | 54 | { |
| 55 | target_ulong status; | 55 | target_ulong status; |
| 56 | 56 | ||
| @@ -79,12 +79,15 @@ void check_ieee_exceptions(void) | @@ -79,12 +79,15 @@ void check_ieee_exceptions(void) | ||
| 79 | } | 79 | } |
| 80 | } | 80 | } |
| 81 | 81 | ||
| 82 | +void helper_clear_float_exceptions(void) | ||
| 83 | +{ | ||
| 84 | + set_float_exception_flags(0, &env->fp_status); | ||
| 85 | +} | ||
| 86 | + | ||
| 82 | #ifdef USE_INT_TO_FLOAT_HELPERS | 87 | #ifdef USE_INT_TO_FLOAT_HELPERS |
| 83 | void do_fitos(void) | 88 | void do_fitos(void) |
| 84 | { | 89 | { |
| 85 | - set_float_exception_flags(0, &env->fp_status); | ||
| 86 | FT0 = int32_to_float32(*((int32_t *)&FT1), &env->fp_status); | 90 | FT0 = int32_to_float32(*((int32_t *)&FT1), &env->fp_status); |
| 87 | - check_ieee_exceptions(); | ||
| 88 | } | 91 | } |
| 89 | 92 | ||
| 90 | void do_fitod(void) | 93 | void do_fitod(void) |
| @@ -102,73 +105,61 @@ void do_fitoq(void) | @@ -102,73 +105,61 @@ void do_fitoq(void) | ||
| 102 | #ifdef TARGET_SPARC64 | 105 | #ifdef TARGET_SPARC64 |
| 103 | void do_fxtos(void) | 106 | void do_fxtos(void) |
| 104 | { | 107 | { |
| 105 | - set_float_exception_flags(0, &env->fp_status); | ||
| 106 | FT0 = int64_to_float32(*((int64_t *)&DT1), &env->fp_status); | 108 | FT0 = int64_to_float32(*((int64_t *)&DT1), &env->fp_status); |
| 107 | - check_ieee_exceptions(); | ||
| 108 | } | 109 | } |
| 109 | 110 | ||
| 110 | void do_fxtod(void) | 111 | void do_fxtod(void) |
| 111 | { | 112 | { |
| 112 | - set_float_exception_flags(0, &env->fp_status); | ||
| 113 | DT0 = int64_to_float64(*((int64_t *)&DT1), &env->fp_status); | 113 | DT0 = int64_to_float64(*((int64_t *)&DT1), &env->fp_status); |
| 114 | - check_ieee_exceptions(); | ||
| 115 | } | 114 | } |
| 116 | 115 | ||
| 117 | #if defined(CONFIG_USER_ONLY) | 116 | #if defined(CONFIG_USER_ONLY) |
| 118 | void do_fxtoq(void) | 117 | void do_fxtoq(void) |
| 119 | { | 118 | { |
| 120 | - set_float_exception_flags(0, &env->fp_status); | ||
| 121 | QT0 = int64_to_float128(*((int32_t *)&DT1), &env->fp_status); | 119 | QT0 = int64_to_float128(*((int32_t *)&DT1), &env->fp_status); |
| 122 | - check_ieee_exceptions(); | ||
| 123 | } | 120 | } |
| 124 | #endif | 121 | #endif |
| 125 | #endif | 122 | #endif |
| 126 | #endif | 123 | #endif |
| 127 | 124 | ||
| 128 | -void do_fabss(void) | 125 | +void helper_fabss(void) |
| 129 | { | 126 | { |
| 130 | FT0 = float32_abs(FT1); | 127 | FT0 = float32_abs(FT1); |
| 131 | } | 128 | } |
| 132 | 129 | ||
| 133 | #ifdef TARGET_SPARC64 | 130 | #ifdef TARGET_SPARC64 |
| 134 | -void do_fabsd(void) | 131 | +void helper_fabsd(void) |
| 135 | { | 132 | { |
| 136 | DT0 = float64_abs(DT1); | 133 | DT0 = float64_abs(DT1); |
| 137 | } | 134 | } |
| 138 | 135 | ||
| 139 | #if defined(CONFIG_USER_ONLY) | 136 | #if defined(CONFIG_USER_ONLY) |
| 140 | -void do_fabsq(void) | 137 | +void helper_fabsq(void) |
| 141 | { | 138 | { |
| 142 | QT0 = float128_abs(QT1); | 139 | QT0 = float128_abs(QT1); |
| 143 | } | 140 | } |
| 144 | #endif | 141 | #endif |
| 145 | #endif | 142 | #endif |
| 146 | 143 | ||
| 147 | -void do_fsqrts(void) | 144 | +void helper_fsqrts(void) |
| 148 | { | 145 | { |
| 149 | - set_float_exception_flags(0, &env->fp_status); | ||
| 150 | FT0 = float32_sqrt(FT1, &env->fp_status); | 146 | FT0 = float32_sqrt(FT1, &env->fp_status); |
| 151 | - check_ieee_exceptions(); | ||
| 152 | } | 147 | } |
| 153 | 148 | ||
| 154 | -void do_fsqrtd(void) | 149 | +void helper_fsqrtd(void) |
| 155 | { | 150 | { |
| 156 | - set_float_exception_flags(0, &env->fp_status); | ||
| 157 | DT0 = float64_sqrt(DT1, &env->fp_status); | 151 | DT0 = float64_sqrt(DT1, &env->fp_status); |
| 158 | - check_ieee_exceptions(); | ||
| 159 | } | 152 | } |
| 160 | 153 | ||
| 161 | #if defined(CONFIG_USER_ONLY) | 154 | #if defined(CONFIG_USER_ONLY) |
| 162 | -void do_fsqrtq(void) | 155 | +void helper_fsqrtq(void) |
| 163 | { | 156 | { |
| 164 | - set_float_exception_flags(0, &env->fp_status); | ||
| 165 | QT0 = float128_sqrt(QT1, &env->fp_status); | 157 | QT0 = float128_sqrt(QT1, &env->fp_status); |
| 166 | - check_ieee_exceptions(); | ||
| 167 | } | 158 | } |
| 168 | #endif | 159 | #endif |
| 169 | 160 | ||
| 170 | #define GEN_FCMP(name, size, reg1, reg2, FS, TRAP) \ | 161 | #define GEN_FCMP(name, size, reg1, reg2, FS, TRAP) \ |
| 171 | - void glue(do_, name) (void) \ | 162 | + void glue(helper_, name) (void) \ |
| 172 | { \ | 163 | { \ |
| 173 | target_ulong new_fsr; \ | 164 | target_ulong new_fsr; \ |
| 174 | \ | 165 | \ |
target-sparc/translate.c
| @@ -690,50 +690,121 @@ static void do_branch_reg(DisasContext * dc, int32_t offset, uint32_t insn) | @@ -690,50 +690,121 @@ static void do_branch_reg(DisasContext * dc, int32_t offset, uint32_t insn) | ||
| 690 | } | 690 | } |
| 691 | 691 | ||
| 692 | static GenOpFunc * const gen_fcmps[4] = { | 692 | static GenOpFunc * const gen_fcmps[4] = { |
| 693 | - gen_op_fcmps, | ||
| 694 | - gen_op_fcmps_fcc1, | ||
| 695 | - gen_op_fcmps_fcc2, | ||
| 696 | - gen_op_fcmps_fcc3, | 693 | + helper_fcmps, |
| 694 | + helper_fcmps_fcc1, | ||
| 695 | + helper_fcmps_fcc2, | ||
| 696 | + helper_fcmps_fcc3, | ||
| 697 | }; | 697 | }; |
| 698 | 698 | ||
| 699 | static GenOpFunc * const gen_fcmpd[4] = { | 699 | static GenOpFunc * const gen_fcmpd[4] = { |
| 700 | - gen_op_fcmpd, | ||
| 701 | - gen_op_fcmpd_fcc1, | ||
| 702 | - gen_op_fcmpd_fcc2, | ||
| 703 | - gen_op_fcmpd_fcc3, | 700 | + helper_fcmpd, |
| 701 | + helper_fcmpd_fcc1, | ||
| 702 | + helper_fcmpd_fcc2, | ||
| 703 | + helper_fcmpd_fcc3, | ||
| 704 | }; | 704 | }; |
| 705 | 705 | ||
| 706 | #if defined(CONFIG_USER_ONLY) | 706 | #if defined(CONFIG_USER_ONLY) |
| 707 | static GenOpFunc * const gen_fcmpq[4] = { | 707 | static GenOpFunc * const gen_fcmpq[4] = { |
| 708 | - gen_op_fcmpq, | ||
| 709 | - gen_op_fcmpq_fcc1, | ||
| 710 | - gen_op_fcmpq_fcc2, | ||
| 711 | - gen_op_fcmpq_fcc3, | 708 | + helper_fcmpq, |
| 709 | + helper_fcmpq_fcc1, | ||
| 710 | + helper_fcmpq_fcc2, | ||
| 711 | + helper_fcmpq_fcc3, | ||
| 712 | }; | 712 | }; |
| 713 | #endif | 713 | #endif |
| 714 | 714 | ||
| 715 | static GenOpFunc * const gen_fcmpes[4] = { | 715 | static GenOpFunc * const gen_fcmpes[4] = { |
| 716 | - gen_op_fcmpes, | ||
| 717 | - gen_op_fcmpes_fcc1, | ||
| 718 | - gen_op_fcmpes_fcc2, | ||
| 719 | - gen_op_fcmpes_fcc3, | 716 | + helper_fcmpes, |
| 717 | + helper_fcmpes_fcc1, | ||
| 718 | + helper_fcmpes_fcc2, | ||
| 719 | + helper_fcmpes_fcc3, | ||
| 720 | }; | 720 | }; |
| 721 | 721 | ||
| 722 | static GenOpFunc * const gen_fcmped[4] = { | 722 | static GenOpFunc * const gen_fcmped[4] = { |
| 723 | - gen_op_fcmped, | ||
| 724 | - gen_op_fcmped_fcc1, | ||
| 725 | - gen_op_fcmped_fcc2, | ||
| 726 | - gen_op_fcmped_fcc3, | 723 | + helper_fcmped, |
| 724 | + helper_fcmped_fcc1, | ||
| 725 | + helper_fcmped_fcc2, | ||
| 726 | + helper_fcmped_fcc3, | ||
| 727 | }; | 727 | }; |
| 728 | 728 | ||
| 729 | #if defined(CONFIG_USER_ONLY) | 729 | #if defined(CONFIG_USER_ONLY) |
| 730 | static GenOpFunc * const gen_fcmpeq[4] = { | 730 | static GenOpFunc * const gen_fcmpeq[4] = { |
| 731 | - gen_op_fcmpeq, | ||
| 732 | - gen_op_fcmpeq_fcc1, | ||
| 733 | - gen_op_fcmpeq_fcc2, | ||
| 734 | - gen_op_fcmpeq_fcc3, | 731 | + helper_fcmpeq, |
| 732 | + helper_fcmpeq_fcc1, | ||
| 733 | + helper_fcmpeq_fcc2, | ||
| 734 | + helper_fcmpeq_fcc3, | ||
| 735 | }; | 735 | }; |
| 736 | #endif | 736 | #endif |
| 737 | + | ||
| 738 | +static inline void gen_op_fcmps(int fccno) | ||
| 739 | +{ | ||
| 740 | + tcg_gen_helper_0_0(gen_fcmps[fccno]); | ||
| 741 | +} | ||
| 742 | + | ||
| 743 | +static inline void gen_op_fcmpd(int fccno) | ||
| 744 | +{ | ||
| 745 | + tcg_gen_helper_0_0(gen_fcmpd[fccno]); | ||
| 746 | +} | ||
| 747 | + | ||
| 748 | +#if defined(CONFIG_USER_ONLY) | ||
| 749 | +static inline void gen_op_fcmpq(int fccno) | ||
| 750 | +{ | ||
| 751 | + tcg_gen_helper_0_0(gen_fcmpq[fccno]); | ||
| 752 | +} | ||
| 753 | +#endif | ||
| 754 | + | ||
| 755 | +static inline void gen_op_fcmpes(int fccno) | ||
| 756 | +{ | ||
| 757 | + tcg_gen_helper_0_0(gen_fcmpes[fccno]); | ||
| 758 | +} | ||
| 759 | + | ||
| 760 | +static inline void gen_op_fcmped(int fccno) | ||
| 761 | +{ | ||
| 762 | + tcg_gen_helper_0_0(gen_fcmped[fccno]); | ||
| 763 | +} | ||
| 764 | + | ||
| 765 | +#if defined(CONFIG_USER_ONLY) | ||
| 766 | +static inline void gen_op_fcmpeq(int fccno) | ||
| 767 | +{ | ||
| 768 | + tcg_gen_helper_0_0(gen_fcmpeq[fccno]); | ||
| 769 | +} | ||
| 770 | +#endif | ||
| 771 | + | ||
| 772 | +#else | ||
| 773 | + | ||
| 774 | +static inline void gen_op_fcmps(int fccno) | ||
| 775 | +{ | ||
| 776 | + tcg_gen_helper_0_0(helper_fcmps); | ||
| 777 | +} | ||
| 778 | + | ||
| 779 | +static inline void gen_op_fcmpd(int fccno) | ||
| 780 | +{ | ||
| 781 | + tcg_gen_helper_0_0(helper_fcmpd); | ||
| 782 | +} | ||
| 783 | + | ||
| 784 | +#if defined(CONFIG_USER_ONLY) | ||
| 785 | +static inline void gen_op_fcmpq(int fccno) | ||
| 786 | +{ | ||
| 787 | + tcg_gen_helper_0_0(helper_fcmpq); | ||
| 788 | +} | ||
| 789 | +#endif | ||
| 790 | + | ||
| 791 | +static inline void gen_op_fcmpes(int fccno) | ||
| 792 | +{ | ||
| 793 | + tcg_gen_helper_0_0(helper_fcmpes); | ||
| 794 | +} | ||
| 795 | + | ||
| 796 | +static inline void gen_op_fcmped(int fccno) | ||
| 797 | +{ | ||
| 798 | + tcg_gen_helper_0_0(helper_fcmped); | ||
| 799 | +} | ||
| 800 | + | ||
| 801 | +#if defined(CONFIG_USER_ONLY) | ||
| 802 | +static inline void gen_op_fcmpeq(int fccno) | ||
| 803 | +{ | ||
| 804 | + tcg_gen_helper_0_0(helper_fcmpeq); | ||
| 805 | +} | ||
| 806 | +#endif | ||
| 807 | + | ||
| 737 | #endif | 808 | #endif |
| 738 | 809 | ||
| 739 | static int gen_trap_ifnofpu(DisasContext * dc) | 810 | static int gen_trap_ifnofpu(DisasContext * dc) |
| @@ -749,6 +820,18 @@ static int gen_trap_ifnofpu(DisasContext * dc) | @@ -749,6 +820,18 @@ static int gen_trap_ifnofpu(DisasContext * dc) | ||
| 749 | return 0; | 820 | return 0; |
| 750 | } | 821 | } |
| 751 | 822 | ||
| 823 | +static inline void gen_op_clear_ieee_excp_and_FTT(void) | ||
| 824 | +{ | ||
| 825 | + tcg_gen_ld_tl(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, fsr)); | ||
| 826 | + tcg_gen_andi_tl(cpu_tmp0, cpu_tmp0, ~(FSR_FTT_MASK | FSR_CEXC_MASK)); | ||
| 827 | + tcg_gen_st_tl(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, fsr)); | ||
| 828 | +} | ||
| 829 | + | ||
| 830 | +static inline void gen_clear_float_exceptions(void) | ||
| 831 | +{ | ||
| 832 | + tcg_gen_helper_0_0(helper_clear_float_exceptions); | ||
| 833 | +} | ||
| 834 | + | ||
| 752 | /* asi moves */ | 835 | /* asi moves */ |
| 753 | #ifdef TARGET_SPARC64 | 836 | #ifdef TARGET_SPARC64 |
| 754 | static inline void gen_ld_asi(int insn, int size, int sign) | 837 | static inline void gen_ld_asi(int insn, int size, int sign) |
| @@ -1406,23 +1489,29 @@ static void disas_sparc_insn(DisasContext * dc) | @@ -1406,23 +1489,29 @@ static void disas_sparc_insn(DisasContext * dc) | ||
| 1406 | break; | 1489 | break; |
| 1407 | case 0x9: /* fabss */ | 1490 | case 0x9: /* fabss */ |
| 1408 | gen_op_load_fpr_FT1(rs2); | 1491 | gen_op_load_fpr_FT1(rs2); |
| 1409 | - gen_op_fabss(); | 1492 | + tcg_gen_helper_0_0(helper_fabss); |
| 1410 | gen_op_store_FT0_fpr(rd); | 1493 | gen_op_store_FT0_fpr(rd); |
| 1411 | break; | 1494 | break; |
| 1412 | case 0x29: /* fsqrts */ | 1495 | case 0x29: /* fsqrts */ |
| 1413 | gen_op_load_fpr_FT1(rs2); | 1496 | gen_op_load_fpr_FT1(rs2); |
| 1414 | - gen_op_fsqrts(); | 1497 | + gen_clear_float_exceptions(); |
| 1498 | + tcg_gen_helper_0_0(helper_fsqrts); | ||
| 1499 | + tcg_gen_helper_0_0(helper_check_ieee_exceptions); | ||
| 1415 | gen_op_store_FT0_fpr(rd); | 1500 | gen_op_store_FT0_fpr(rd); |
| 1416 | break; | 1501 | break; |
| 1417 | case 0x2a: /* fsqrtd */ | 1502 | case 0x2a: /* fsqrtd */ |
| 1418 | gen_op_load_fpr_DT1(DFPREG(rs2)); | 1503 | gen_op_load_fpr_DT1(DFPREG(rs2)); |
| 1419 | - gen_op_fsqrtd(); | 1504 | + gen_clear_float_exceptions(); |
| 1505 | + tcg_gen_helper_0_0(helper_fsqrtd); | ||
| 1506 | + tcg_gen_helper_0_0(helper_check_ieee_exceptions); | ||
| 1420 | gen_op_store_DT0_fpr(DFPREG(rd)); | 1507 | gen_op_store_DT0_fpr(DFPREG(rd)); |
| 1421 | break; | 1508 | break; |
| 1422 | case 0x2b: /* fsqrtq */ | 1509 | case 0x2b: /* fsqrtq */ |
| 1423 | #if defined(CONFIG_USER_ONLY) | 1510 | #if defined(CONFIG_USER_ONLY) |
| 1424 | gen_op_load_fpr_QT1(QFPREG(rs2)); | 1511 | gen_op_load_fpr_QT1(QFPREG(rs2)); |
| 1425 | - gen_op_fsqrtq(); | 1512 | + gen_clear_float_exceptions(); |
| 1513 | + tcg_gen_helper_0_0(helper_fsqrtq); | ||
| 1514 | + tcg_gen_helper_0_0(helper_check_ieee_exceptions); | ||
| 1426 | gen_op_store_QT0_fpr(QFPREG(rd)); | 1515 | gen_op_store_QT0_fpr(QFPREG(rd)); |
| 1427 | break; | 1516 | break; |
| 1428 | #else | 1517 | #else |
| @@ -1431,20 +1520,26 @@ static void disas_sparc_insn(DisasContext * dc) | @@ -1431,20 +1520,26 @@ static void disas_sparc_insn(DisasContext * dc) | ||
| 1431 | case 0x41: | 1520 | case 0x41: |
| 1432 | gen_op_load_fpr_FT0(rs1); | 1521 | gen_op_load_fpr_FT0(rs1); |
| 1433 | gen_op_load_fpr_FT1(rs2); | 1522 | gen_op_load_fpr_FT1(rs2); |
| 1523 | + gen_clear_float_exceptions(); | ||
| 1434 | gen_op_fadds(); | 1524 | gen_op_fadds(); |
| 1525 | + tcg_gen_helper_0_0(helper_check_ieee_exceptions); | ||
| 1435 | gen_op_store_FT0_fpr(rd); | 1526 | gen_op_store_FT0_fpr(rd); |
| 1436 | break; | 1527 | break; |
| 1437 | case 0x42: | 1528 | case 0x42: |
| 1438 | gen_op_load_fpr_DT0(DFPREG(rs1)); | 1529 | gen_op_load_fpr_DT0(DFPREG(rs1)); |
| 1439 | gen_op_load_fpr_DT1(DFPREG(rs2)); | 1530 | gen_op_load_fpr_DT1(DFPREG(rs2)); |
| 1531 | + gen_clear_float_exceptions(); | ||
| 1440 | gen_op_faddd(); | 1532 | gen_op_faddd(); |
| 1533 | + tcg_gen_helper_0_0(helper_check_ieee_exceptions); | ||
| 1441 | gen_op_store_DT0_fpr(DFPREG(rd)); | 1534 | gen_op_store_DT0_fpr(DFPREG(rd)); |
| 1442 | break; | 1535 | break; |
| 1443 | case 0x43: /* faddq */ | 1536 | case 0x43: /* faddq */ |
| 1444 | #if defined(CONFIG_USER_ONLY) | 1537 | #if defined(CONFIG_USER_ONLY) |
| 1445 | gen_op_load_fpr_QT0(QFPREG(rs1)); | 1538 | gen_op_load_fpr_QT0(QFPREG(rs1)); |
| 1446 | gen_op_load_fpr_QT1(QFPREG(rs2)); | 1539 | gen_op_load_fpr_QT1(QFPREG(rs2)); |
| 1540 | + gen_clear_float_exceptions(); | ||
| 1447 | gen_op_faddq(); | 1541 | gen_op_faddq(); |
| 1542 | + tcg_gen_helper_0_0(helper_check_ieee_exceptions); | ||
| 1448 | gen_op_store_QT0_fpr(QFPREG(rd)); | 1543 | gen_op_store_QT0_fpr(QFPREG(rd)); |
| 1449 | break; | 1544 | break; |
| 1450 | #else | 1545 | #else |
| @@ -1453,20 +1548,26 @@ static void disas_sparc_insn(DisasContext * dc) | @@ -1453,20 +1548,26 @@ static void disas_sparc_insn(DisasContext * dc) | ||
| 1453 | case 0x45: | 1548 | case 0x45: |
| 1454 | gen_op_load_fpr_FT0(rs1); | 1549 | gen_op_load_fpr_FT0(rs1); |
| 1455 | gen_op_load_fpr_FT1(rs2); | 1550 | gen_op_load_fpr_FT1(rs2); |
| 1551 | + gen_clear_float_exceptions(); | ||
| 1456 | gen_op_fsubs(); | 1552 | gen_op_fsubs(); |
| 1553 | + tcg_gen_helper_0_0(helper_check_ieee_exceptions); | ||
| 1457 | gen_op_store_FT0_fpr(rd); | 1554 | gen_op_store_FT0_fpr(rd); |
| 1458 | break; | 1555 | break; |
| 1459 | case 0x46: | 1556 | case 0x46: |
| 1460 | gen_op_load_fpr_DT0(DFPREG(rs1)); | 1557 | gen_op_load_fpr_DT0(DFPREG(rs1)); |
| 1461 | gen_op_load_fpr_DT1(DFPREG(rs2)); | 1558 | gen_op_load_fpr_DT1(DFPREG(rs2)); |
| 1559 | + gen_clear_float_exceptions(); | ||
| 1462 | gen_op_fsubd(); | 1560 | gen_op_fsubd(); |
| 1561 | + tcg_gen_helper_0_0(helper_check_ieee_exceptions); | ||
| 1463 | gen_op_store_DT0_fpr(DFPREG(rd)); | 1562 | gen_op_store_DT0_fpr(DFPREG(rd)); |
| 1464 | break; | 1563 | break; |
| 1465 | case 0x47: /* fsubq */ | 1564 | case 0x47: /* fsubq */ |
| 1466 | #if defined(CONFIG_USER_ONLY) | 1565 | #if defined(CONFIG_USER_ONLY) |
| 1467 | gen_op_load_fpr_QT0(QFPREG(rs1)); | 1566 | gen_op_load_fpr_QT0(QFPREG(rs1)); |
| 1468 | gen_op_load_fpr_QT1(QFPREG(rs2)); | 1567 | gen_op_load_fpr_QT1(QFPREG(rs2)); |
| 1568 | + gen_clear_float_exceptions(); | ||
| 1469 | gen_op_fsubq(); | 1569 | gen_op_fsubq(); |
| 1570 | + tcg_gen_helper_0_0(helper_check_ieee_exceptions); | ||
| 1470 | gen_op_store_QT0_fpr(QFPREG(rd)); | 1571 | gen_op_store_QT0_fpr(QFPREG(rd)); |
| 1471 | break; | 1572 | break; |
| 1472 | #else | 1573 | #else |
| @@ -1475,20 +1576,26 @@ static void disas_sparc_insn(DisasContext * dc) | @@ -1475,20 +1576,26 @@ static void disas_sparc_insn(DisasContext * dc) | ||
| 1475 | case 0x49: | 1576 | case 0x49: |
| 1476 | gen_op_load_fpr_FT0(rs1); | 1577 | gen_op_load_fpr_FT0(rs1); |
| 1477 | gen_op_load_fpr_FT1(rs2); | 1578 | gen_op_load_fpr_FT1(rs2); |
| 1579 | + gen_clear_float_exceptions(); | ||
| 1478 | gen_op_fmuls(); | 1580 | gen_op_fmuls(); |
| 1581 | + tcg_gen_helper_0_0(helper_check_ieee_exceptions); | ||
| 1479 | gen_op_store_FT0_fpr(rd); | 1582 | gen_op_store_FT0_fpr(rd); |
| 1480 | break; | 1583 | break; |
| 1481 | case 0x4a: | 1584 | case 0x4a: |
| 1482 | gen_op_load_fpr_DT0(DFPREG(rs1)); | 1585 | gen_op_load_fpr_DT0(DFPREG(rs1)); |
| 1483 | gen_op_load_fpr_DT1(DFPREG(rs2)); | 1586 | gen_op_load_fpr_DT1(DFPREG(rs2)); |
| 1587 | + gen_clear_float_exceptions(); | ||
| 1484 | gen_op_fmuld(); | 1588 | gen_op_fmuld(); |
| 1589 | + tcg_gen_helper_0_0(helper_check_ieee_exceptions); | ||
| 1485 | gen_op_store_DT0_fpr(DFPREG(rd)); | 1590 | gen_op_store_DT0_fpr(DFPREG(rd)); |
| 1486 | break; | 1591 | break; |
| 1487 | case 0x4b: /* fmulq */ | 1592 | case 0x4b: /* fmulq */ |
| 1488 | #if defined(CONFIG_USER_ONLY) | 1593 | #if defined(CONFIG_USER_ONLY) |
| 1489 | gen_op_load_fpr_QT0(QFPREG(rs1)); | 1594 | gen_op_load_fpr_QT0(QFPREG(rs1)); |
| 1490 | gen_op_load_fpr_QT1(QFPREG(rs2)); | 1595 | gen_op_load_fpr_QT1(QFPREG(rs2)); |
| 1596 | + gen_clear_float_exceptions(); | ||
| 1491 | gen_op_fmulq(); | 1597 | gen_op_fmulq(); |
| 1598 | + tcg_gen_helper_0_0(helper_check_ieee_exceptions); | ||
| 1492 | gen_op_store_QT0_fpr(QFPREG(rd)); | 1599 | gen_op_store_QT0_fpr(QFPREG(rd)); |
| 1493 | break; | 1600 | break; |
| 1494 | #else | 1601 | #else |
| @@ -1497,20 +1604,26 @@ static void disas_sparc_insn(DisasContext * dc) | @@ -1497,20 +1604,26 @@ static void disas_sparc_insn(DisasContext * dc) | ||
| 1497 | case 0x4d: | 1604 | case 0x4d: |
| 1498 | gen_op_load_fpr_FT0(rs1); | 1605 | gen_op_load_fpr_FT0(rs1); |
| 1499 | gen_op_load_fpr_FT1(rs2); | 1606 | gen_op_load_fpr_FT1(rs2); |
| 1607 | + gen_clear_float_exceptions(); | ||
| 1500 | gen_op_fdivs(); | 1608 | gen_op_fdivs(); |
| 1609 | + tcg_gen_helper_0_0(helper_check_ieee_exceptions); | ||
| 1501 | gen_op_store_FT0_fpr(rd); | 1610 | gen_op_store_FT0_fpr(rd); |
| 1502 | break; | 1611 | break; |
| 1503 | case 0x4e: | 1612 | case 0x4e: |
| 1504 | gen_op_load_fpr_DT0(DFPREG(rs1)); | 1613 | gen_op_load_fpr_DT0(DFPREG(rs1)); |
| 1505 | gen_op_load_fpr_DT1(DFPREG(rs2)); | 1614 | gen_op_load_fpr_DT1(DFPREG(rs2)); |
| 1615 | + gen_clear_float_exceptions(); | ||
| 1506 | gen_op_fdivd(); | 1616 | gen_op_fdivd(); |
| 1617 | + tcg_gen_helper_0_0(helper_check_ieee_exceptions); | ||
| 1507 | gen_op_store_DT0_fpr(DFPREG(rd)); | 1618 | gen_op_store_DT0_fpr(DFPREG(rd)); |
| 1508 | break; | 1619 | break; |
| 1509 | case 0x4f: /* fdivq */ | 1620 | case 0x4f: /* fdivq */ |
| 1510 | #if defined(CONFIG_USER_ONLY) | 1621 | #if defined(CONFIG_USER_ONLY) |
| 1511 | gen_op_load_fpr_QT0(QFPREG(rs1)); | 1622 | gen_op_load_fpr_QT0(QFPREG(rs1)); |
| 1512 | gen_op_load_fpr_QT1(QFPREG(rs2)); | 1623 | gen_op_load_fpr_QT1(QFPREG(rs2)); |
| 1624 | + gen_clear_float_exceptions(); | ||
| 1513 | gen_op_fdivq(); | 1625 | gen_op_fdivq(); |
| 1626 | + tcg_gen_helper_0_0(helper_check_ieee_exceptions); | ||
| 1514 | gen_op_store_QT0_fpr(QFPREG(rd)); | 1627 | gen_op_store_QT0_fpr(QFPREG(rd)); |
| 1515 | break; | 1628 | break; |
| 1516 | #else | 1629 | #else |
| @@ -1519,14 +1632,18 @@ static void disas_sparc_insn(DisasContext * dc) | @@ -1519,14 +1632,18 @@ static void disas_sparc_insn(DisasContext * dc) | ||
| 1519 | case 0x69: | 1632 | case 0x69: |
| 1520 | gen_op_load_fpr_FT0(rs1); | 1633 | gen_op_load_fpr_FT0(rs1); |
| 1521 | gen_op_load_fpr_FT1(rs2); | 1634 | gen_op_load_fpr_FT1(rs2); |
| 1635 | + gen_clear_float_exceptions(); | ||
| 1522 | gen_op_fsmuld(); | 1636 | gen_op_fsmuld(); |
| 1637 | + tcg_gen_helper_0_0(helper_check_ieee_exceptions); | ||
| 1523 | gen_op_store_DT0_fpr(DFPREG(rd)); | 1638 | gen_op_store_DT0_fpr(DFPREG(rd)); |
| 1524 | break; | 1639 | break; |
| 1525 | case 0x6e: /* fdmulq */ | 1640 | case 0x6e: /* fdmulq */ |
| 1526 | #if defined(CONFIG_USER_ONLY) | 1641 | #if defined(CONFIG_USER_ONLY) |
| 1527 | gen_op_load_fpr_DT0(DFPREG(rs1)); | 1642 | gen_op_load_fpr_DT0(DFPREG(rs1)); |
| 1528 | gen_op_load_fpr_DT1(DFPREG(rs2)); | 1643 | gen_op_load_fpr_DT1(DFPREG(rs2)); |
| 1644 | + gen_clear_float_exceptions(); | ||
| 1529 | gen_op_fdmulq(); | 1645 | gen_op_fdmulq(); |
| 1646 | + tcg_gen_helper_0_0(helper_check_ieee_exceptions); | ||
| 1530 | gen_op_store_QT0_fpr(QFPREG(rd)); | 1647 | gen_op_store_QT0_fpr(QFPREG(rd)); |
| 1531 | break; | 1648 | break; |
| 1532 | #else | 1649 | #else |
| @@ -1534,18 +1651,24 @@ static void disas_sparc_insn(DisasContext * dc) | @@ -1534,18 +1651,24 @@ static void disas_sparc_insn(DisasContext * dc) | ||
| 1534 | #endif | 1651 | #endif |
| 1535 | case 0xc4: | 1652 | case 0xc4: |
| 1536 | gen_op_load_fpr_FT1(rs2); | 1653 | gen_op_load_fpr_FT1(rs2); |
| 1654 | + gen_clear_float_exceptions(); | ||
| 1537 | gen_op_fitos(); | 1655 | gen_op_fitos(); |
| 1656 | + tcg_gen_helper_0_0(helper_check_ieee_exceptions); | ||
| 1538 | gen_op_store_FT0_fpr(rd); | 1657 | gen_op_store_FT0_fpr(rd); |
| 1539 | break; | 1658 | break; |
| 1540 | case 0xc6: | 1659 | case 0xc6: |
| 1541 | gen_op_load_fpr_DT1(DFPREG(rs2)); | 1660 | gen_op_load_fpr_DT1(DFPREG(rs2)); |
| 1661 | + gen_clear_float_exceptions(); | ||
| 1542 | gen_op_fdtos(); | 1662 | gen_op_fdtos(); |
| 1663 | + tcg_gen_helper_0_0(helper_check_ieee_exceptions); | ||
| 1543 | gen_op_store_FT0_fpr(rd); | 1664 | gen_op_store_FT0_fpr(rd); |
| 1544 | break; | 1665 | break; |
| 1545 | case 0xc7: /* fqtos */ | 1666 | case 0xc7: /* fqtos */ |
| 1546 | #if defined(CONFIG_USER_ONLY) | 1667 | #if defined(CONFIG_USER_ONLY) |
| 1547 | gen_op_load_fpr_QT1(QFPREG(rs2)); | 1668 | gen_op_load_fpr_QT1(QFPREG(rs2)); |
| 1669 | + gen_clear_float_exceptions(); | ||
| 1548 | gen_op_fqtos(); | 1670 | gen_op_fqtos(); |
| 1671 | + tcg_gen_helper_0_0(helper_check_ieee_exceptions); | ||
| 1549 | gen_op_store_FT0_fpr(rd); | 1672 | gen_op_store_FT0_fpr(rd); |
| 1550 | break; | 1673 | break; |
| 1551 | #else | 1674 | #else |
| @@ -1564,7 +1687,9 @@ static void disas_sparc_insn(DisasContext * dc) | @@ -1564,7 +1687,9 @@ static void disas_sparc_insn(DisasContext * dc) | ||
| 1564 | case 0xcb: /* fqtod */ | 1687 | case 0xcb: /* fqtod */ |
| 1565 | #if defined(CONFIG_USER_ONLY) | 1688 | #if defined(CONFIG_USER_ONLY) |
| 1566 | gen_op_load_fpr_QT1(QFPREG(rs2)); | 1689 | gen_op_load_fpr_QT1(QFPREG(rs2)); |
| 1690 | + gen_clear_float_exceptions(); | ||
| 1567 | gen_op_fqtod(); | 1691 | gen_op_fqtod(); |
| 1692 | + tcg_gen_helper_0_0(helper_check_ieee_exceptions); | ||
| 1568 | gen_op_store_DT0_fpr(DFPREG(rd)); | 1693 | gen_op_store_DT0_fpr(DFPREG(rd)); |
| 1569 | break; | 1694 | break; |
| 1570 | #else | 1695 | #else |
| @@ -1599,18 +1724,24 @@ static void disas_sparc_insn(DisasContext * dc) | @@ -1599,18 +1724,24 @@ static void disas_sparc_insn(DisasContext * dc) | ||
| 1599 | #endif | 1724 | #endif |
| 1600 | case 0xd1: | 1725 | case 0xd1: |
| 1601 | gen_op_load_fpr_FT1(rs2); | 1726 | gen_op_load_fpr_FT1(rs2); |
| 1727 | + gen_clear_float_exceptions(); | ||
| 1602 | gen_op_fstoi(); | 1728 | gen_op_fstoi(); |
| 1729 | + tcg_gen_helper_0_0(helper_check_ieee_exceptions); | ||
| 1603 | gen_op_store_FT0_fpr(rd); | 1730 | gen_op_store_FT0_fpr(rd); |
| 1604 | break; | 1731 | break; |
| 1605 | case 0xd2: | 1732 | case 0xd2: |
| 1606 | gen_op_load_fpr_DT1(DFPREG(rs2)); | 1733 | gen_op_load_fpr_DT1(DFPREG(rs2)); |
| 1734 | + gen_clear_float_exceptions(); | ||
| 1607 | gen_op_fdtoi(); | 1735 | gen_op_fdtoi(); |
| 1736 | + tcg_gen_helper_0_0(helper_check_ieee_exceptions); | ||
| 1608 | gen_op_store_FT0_fpr(rd); | 1737 | gen_op_store_FT0_fpr(rd); |
| 1609 | break; | 1738 | break; |
| 1610 | case 0xd3: /* fqtoi */ | 1739 | case 0xd3: /* fqtoi */ |
| 1611 | #if defined(CONFIG_USER_ONLY) | 1740 | #if defined(CONFIG_USER_ONLY) |
| 1612 | gen_op_load_fpr_QT1(QFPREG(rs2)); | 1741 | gen_op_load_fpr_QT1(QFPREG(rs2)); |
| 1742 | + gen_clear_float_exceptions(); | ||
| 1613 | gen_op_fqtoi(); | 1743 | gen_op_fqtoi(); |
| 1744 | + tcg_gen_helper_0_0(helper_check_ieee_exceptions); | ||
| 1614 | gen_op_store_FT0_fpr(rd); | 1745 | gen_op_store_FT0_fpr(rd); |
| 1615 | break; | 1746 | break; |
| 1616 | #else | 1747 | #else |
| @@ -1645,13 +1776,13 @@ static void disas_sparc_insn(DisasContext * dc) | @@ -1645,13 +1776,13 @@ static void disas_sparc_insn(DisasContext * dc) | ||
| 1645 | #endif | 1776 | #endif |
| 1646 | case 0xa: /* V9 fabsd */ | 1777 | case 0xa: /* V9 fabsd */ |
| 1647 | gen_op_load_fpr_DT1(DFPREG(rs2)); | 1778 | gen_op_load_fpr_DT1(DFPREG(rs2)); |
| 1648 | - gen_op_fabsd(); | 1779 | + tcg_gen_helper_0_0(helper_fabsd); |
| 1649 | gen_op_store_DT0_fpr(DFPREG(rd)); | 1780 | gen_op_store_DT0_fpr(DFPREG(rd)); |
| 1650 | break; | 1781 | break; |
| 1651 | case 0xb: /* V9 fabsq */ | 1782 | case 0xb: /* V9 fabsq */ |
| 1652 | #if defined(CONFIG_USER_ONLY) | 1783 | #if defined(CONFIG_USER_ONLY) |
| 1653 | gen_op_load_fpr_QT1(QFPREG(rs2)); | 1784 | gen_op_load_fpr_QT1(QFPREG(rs2)); |
| 1654 | - gen_op_fabsq(); | 1785 | + tcg_gen_helper_0_0(helper_fabsq); |
| 1655 | gen_op_store_QT0_fpr(QFPREG(rd)); | 1786 | gen_op_store_QT0_fpr(QFPREG(rd)); |
| 1656 | break; | 1787 | break; |
| 1657 | #else | 1788 | #else |
| @@ -1659,18 +1790,24 @@ static void disas_sparc_insn(DisasContext * dc) | @@ -1659,18 +1790,24 @@ static void disas_sparc_insn(DisasContext * dc) | ||
| 1659 | #endif | 1790 | #endif |
| 1660 | case 0x81: /* V9 fstox */ | 1791 | case 0x81: /* V9 fstox */ |
| 1661 | gen_op_load_fpr_FT1(rs2); | 1792 | gen_op_load_fpr_FT1(rs2); |
| 1793 | + gen_clear_float_exceptions(); | ||
| 1662 | gen_op_fstox(); | 1794 | gen_op_fstox(); |
| 1795 | + tcg_gen_helper_0_0(helper_check_ieee_exceptions); | ||
| 1663 | gen_op_store_DT0_fpr(DFPREG(rd)); | 1796 | gen_op_store_DT0_fpr(DFPREG(rd)); |
| 1664 | break; | 1797 | break; |
| 1665 | case 0x82: /* V9 fdtox */ | 1798 | case 0x82: /* V9 fdtox */ |
| 1666 | gen_op_load_fpr_DT1(DFPREG(rs2)); | 1799 | gen_op_load_fpr_DT1(DFPREG(rs2)); |
| 1800 | + gen_clear_float_exceptions(); | ||
| 1667 | gen_op_fdtox(); | 1801 | gen_op_fdtox(); |
| 1802 | + tcg_gen_helper_0_0(helper_check_ieee_exceptions); | ||
| 1668 | gen_op_store_DT0_fpr(DFPREG(rd)); | 1803 | gen_op_store_DT0_fpr(DFPREG(rd)); |
| 1669 | break; | 1804 | break; |
| 1670 | case 0x83: /* V9 fqtox */ | 1805 | case 0x83: /* V9 fqtox */ |
| 1671 | #if defined(CONFIG_USER_ONLY) | 1806 | #if defined(CONFIG_USER_ONLY) |
| 1672 | gen_op_load_fpr_QT1(QFPREG(rs2)); | 1807 | gen_op_load_fpr_QT1(QFPREG(rs2)); |
| 1808 | + gen_clear_float_exceptions(); | ||
| 1673 | gen_op_fqtox(); | 1809 | gen_op_fqtox(); |
| 1810 | + tcg_gen_helper_0_0(helper_check_ieee_exceptions); | ||
| 1674 | gen_op_store_DT0_fpr(DFPREG(rd)); | 1811 | gen_op_store_DT0_fpr(DFPREG(rd)); |
| 1675 | break; | 1812 | break; |
| 1676 | #else | 1813 | #else |
| @@ -1678,18 +1815,24 @@ static void disas_sparc_insn(DisasContext * dc) | @@ -1678,18 +1815,24 @@ static void disas_sparc_insn(DisasContext * dc) | ||
| 1678 | #endif | 1815 | #endif |
| 1679 | case 0x84: /* V9 fxtos */ | 1816 | case 0x84: /* V9 fxtos */ |
| 1680 | gen_op_load_fpr_DT1(DFPREG(rs2)); | 1817 | gen_op_load_fpr_DT1(DFPREG(rs2)); |
| 1818 | + gen_clear_float_exceptions(); | ||
| 1681 | gen_op_fxtos(); | 1819 | gen_op_fxtos(); |
| 1820 | + tcg_gen_helper_0_0(helper_check_ieee_exceptions); | ||
| 1682 | gen_op_store_FT0_fpr(rd); | 1821 | gen_op_store_FT0_fpr(rd); |
| 1683 | break; | 1822 | break; |
| 1684 | case 0x88: /* V9 fxtod */ | 1823 | case 0x88: /* V9 fxtod */ |
| 1685 | gen_op_load_fpr_DT1(DFPREG(rs2)); | 1824 | gen_op_load_fpr_DT1(DFPREG(rs2)); |
| 1825 | + gen_clear_float_exceptions(); | ||
| 1686 | gen_op_fxtod(); | 1826 | gen_op_fxtod(); |
| 1827 | + tcg_gen_helper_0_0(helper_check_ieee_exceptions); | ||
| 1687 | gen_op_store_DT0_fpr(DFPREG(rd)); | 1828 | gen_op_store_DT0_fpr(DFPREG(rd)); |
| 1688 | break; | 1829 | break; |
| 1689 | case 0x8c: /* V9 fxtoq */ | 1830 | case 0x8c: /* V9 fxtoq */ |
| 1690 | #if defined(CONFIG_USER_ONLY) | 1831 | #if defined(CONFIG_USER_ONLY) |
| 1691 | gen_op_load_fpr_DT1(DFPREG(rs2)); | 1832 | gen_op_load_fpr_DT1(DFPREG(rs2)); |
| 1833 | + gen_clear_float_exceptions(); | ||
| 1692 | gen_op_fxtoq(); | 1834 | gen_op_fxtoq(); |
| 1835 | + tcg_gen_helper_0_0(helper_check_ieee_exceptions); | ||
| 1693 | gen_op_store_QT0_fpr(QFPREG(rd)); | 1836 | gen_op_store_QT0_fpr(QFPREG(rd)); |
| 1694 | break; | 1837 | break; |
| 1695 | #else | 1838 | #else |
| @@ -1953,30 +2096,18 @@ static void disas_sparc_insn(DisasContext * dc) | @@ -1953,30 +2096,18 @@ static void disas_sparc_insn(DisasContext * dc) | ||
| 1953 | case 0x51: /* fcmps, V9 %fcc */ | 2096 | case 0x51: /* fcmps, V9 %fcc */ |
| 1954 | gen_op_load_fpr_FT0(rs1); | 2097 | gen_op_load_fpr_FT0(rs1); |
| 1955 | gen_op_load_fpr_FT1(rs2); | 2098 | gen_op_load_fpr_FT1(rs2); |
| 1956 | -#ifdef TARGET_SPARC64 | ||
| 1957 | - gen_fcmps[rd & 3](); | ||
| 1958 | -#else | ||
| 1959 | - gen_op_fcmps(); | ||
| 1960 | -#endif | 2099 | + gen_op_fcmps(rd & 3); |
| 1961 | break; | 2100 | break; |
| 1962 | case 0x52: /* fcmpd, V9 %fcc */ | 2101 | case 0x52: /* fcmpd, V9 %fcc */ |
| 1963 | gen_op_load_fpr_DT0(DFPREG(rs1)); | 2102 | gen_op_load_fpr_DT0(DFPREG(rs1)); |
| 1964 | gen_op_load_fpr_DT1(DFPREG(rs2)); | 2103 | gen_op_load_fpr_DT1(DFPREG(rs2)); |
| 1965 | -#ifdef TARGET_SPARC64 | ||
| 1966 | - gen_fcmpd[rd & 3](); | ||
| 1967 | -#else | ||
| 1968 | - gen_op_fcmpd(); | ||
| 1969 | -#endif | 2104 | + gen_op_fcmpd(rd & 3); |
| 1970 | break; | 2105 | break; |
| 1971 | case 0x53: /* fcmpq, V9 %fcc */ | 2106 | case 0x53: /* fcmpq, V9 %fcc */ |
| 1972 | #if defined(CONFIG_USER_ONLY) | 2107 | #if defined(CONFIG_USER_ONLY) |
| 1973 | gen_op_load_fpr_QT0(QFPREG(rs1)); | 2108 | gen_op_load_fpr_QT0(QFPREG(rs1)); |
| 1974 | gen_op_load_fpr_QT1(QFPREG(rs2)); | 2109 | gen_op_load_fpr_QT1(QFPREG(rs2)); |
| 1975 | -#ifdef TARGET_SPARC64 | ||
| 1976 | - gen_fcmpq[rd & 3](); | ||
| 1977 | -#else | ||
| 1978 | - gen_op_fcmpq(); | ||
| 1979 | -#endif | 2110 | + gen_op_fcmpq(rd & 3); |
| 1980 | break; | 2111 | break; |
| 1981 | #else /* !defined(CONFIG_USER_ONLY) */ | 2112 | #else /* !defined(CONFIG_USER_ONLY) */ |
| 1982 | goto nfpu_insn; | 2113 | goto nfpu_insn; |
| @@ -1984,30 +2115,18 @@ static void disas_sparc_insn(DisasContext * dc) | @@ -1984,30 +2115,18 @@ static void disas_sparc_insn(DisasContext * dc) | ||
| 1984 | case 0x55: /* fcmpes, V9 %fcc */ | 2115 | case 0x55: /* fcmpes, V9 %fcc */ |
| 1985 | gen_op_load_fpr_FT0(rs1); | 2116 | gen_op_load_fpr_FT0(rs1); |
| 1986 | gen_op_load_fpr_FT1(rs2); | 2117 | gen_op_load_fpr_FT1(rs2); |
| 1987 | -#ifdef TARGET_SPARC64 | ||
| 1988 | - gen_fcmpes[rd & 3](); | ||
| 1989 | -#else | ||
| 1990 | - gen_op_fcmpes(); | ||
| 1991 | -#endif | 2118 | + gen_op_fcmpes(rd & 3); |
| 1992 | break; | 2119 | break; |
| 1993 | case 0x56: /* fcmped, V9 %fcc */ | 2120 | case 0x56: /* fcmped, V9 %fcc */ |
| 1994 | gen_op_load_fpr_DT0(DFPREG(rs1)); | 2121 | gen_op_load_fpr_DT0(DFPREG(rs1)); |
| 1995 | gen_op_load_fpr_DT1(DFPREG(rs2)); | 2122 | gen_op_load_fpr_DT1(DFPREG(rs2)); |
| 1996 | -#ifdef TARGET_SPARC64 | ||
| 1997 | - gen_fcmped[rd & 3](); | ||
| 1998 | -#else | ||
| 1999 | - gen_op_fcmped(); | ||
| 2000 | -#endif | 2123 | + gen_op_fcmped(rd & 3); |
| 2001 | break; | 2124 | break; |
| 2002 | case 0x57: /* fcmpeq, V9 %fcc */ | 2125 | case 0x57: /* fcmpeq, V9 %fcc */ |
| 2003 | #if defined(CONFIG_USER_ONLY) | 2126 | #if defined(CONFIG_USER_ONLY) |
| 2004 | gen_op_load_fpr_QT0(QFPREG(rs1)); | 2127 | gen_op_load_fpr_QT0(QFPREG(rs1)); |
| 2005 | gen_op_load_fpr_QT1(QFPREG(rs2)); | 2128 | gen_op_load_fpr_QT1(QFPREG(rs2)); |
| 2006 | -#ifdef TARGET_SPARC64 | ||
| 2007 | - gen_fcmpeq[rd & 3](); | ||
| 2008 | -#else | ||
| 2009 | - gen_op_fcmpeq(); | ||
| 2010 | -#endif | 2129 | + gen_op_fcmpeq(rd & 3); |
| 2011 | break; | 2130 | break; |
| 2012 | #else/* !defined(CONFIG_USER_ONLY) */ | 2131 | #else/* !defined(CONFIG_USER_ONLY) */ |
| 2013 | goto nfpu_insn; | 2132 | goto nfpu_insn; |
| @@ -3373,6 +3492,7 @@ static void disas_sparc_insn(DisasContext * dc) | @@ -3373,6 +3492,7 @@ static void disas_sparc_insn(DisasContext * dc) | ||
| 3373 | gen_op_check_align_T0_3(); | 3492 | gen_op_check_align_T0_3(); |
| 3374 | gen_op_ldst(ldf); | 3493 | gen_op_ldst(ldf); |
| 3375 | gen_op_ldfsr(); | 3494 | gen_op_ldfsr(); |
| 3495 | + tcg_gen_helper_0_0(helper_ldfsr); | ||
| 3376 | break; | 3496 | break; |
| 3377 | case 0x22: /* load quad fpreg */ | 3497 | case 0x22: /* load quad fpreg */ |
| 3378 | #if defined(CONFIG_USER_ONLY) | 3498 | #if defined(CONFIG_USER_ONLY) |