Commit 87e92502c60c9a2c2c3c322c388a300a6df8b79a
1 parent
bb5529bb
Use a TCG global for fsr
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4068 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
22 additions
and
27 deletions
target-sparc/translate.c
| @@ -46,8 +46,8 @@ | @@ -46,8 +46,8 @@ | ||
| 46 | according to jump_pc[T2] */ | 46 | according to jump_pc[T2] */ |
| 47 | 47 | ||
| 48 | /* global register indexes */ | 48 | /* global register indexes */ |
| 49 | -static TCGv cpu_env, cpu_T[3], cpu_regwptr, cpu_cc_src, cpu_cc_dst, cpu_psr; | ||
| 50 | -static TCGv cpu_gregs[8]; | 49 | +static TCGv cpu_env, cpu_T[3], cpu_regwptr, cpu_cc_src, cpu_cc_dst; |
| 50 | +static TCGv cpu_psr, cpu_fsr, cpu_gregs[8]; | ||
| 51 | #ifdef TARGET_SPARC64 | 51 | #ifdef TARGET_SPARC64 |
| 52 | static TCGv cpu_xcc; | 52 | static TCGv cpu_xcc; |
| 53 | #endif | 53 | #endif |
| @@ -1269,12 +1269,8 @@ static inline void gen_cond(TCGv r_dst, unsigned int cc, unsigned int cond) | @@ -1269,12 +1269,8 @@ static inline void gen_cond(TCGv r_dst, unsigned int cc, unsigned int cond) | ||
| 1269 | 1269 | ||
| 1270 | static inline void gen_fcond(TCGv r_dst, unsigned int cc, unsigned int cond) | 1270 | static inline void gen_fcond(TCGv r_dst, unsigned int cc, unsigned int cond) |
| 1271 | { | 1271 | { |
| 1272 | - TCGv r_src; | ||
| 1273 | unsigned int offset; | 1272 | unsigned int offset; |
| 1274 | 1273 | ||
| 1275 | - r_src = tcg_temp_new(TCG_TYPE_TL); | ||
| 1276 | - tcg_gen_ld_tl(r_src, cpu_env, offsetof(CPUSPARCState, fsr)); | ||
| 1277 | - | ||
| 1278 | switch (cc) { | 1274 | switch (cc) { |
| 1279 | default: | 1275 | default: |
| 1280 | case 0x0: | 1276 | case 0x0: |
| @@ -1296,49 +1292,49 @@ static inline void gen_fcond(TCGv r_dst, unsigned int cc, unsigned int cond) | @@ -1296,49 +1292,49 @@ static inline void gen_fcond(TCGv r_dst, unsigned int cc, unsigned int cond) | ||
| 1296 | gen_op_eval_bn(r_dst); | 1292 | gen_op_eval_bn(r_dst); |
| 1297 | break; | 1293 | break; |
| 1298 | case 0x1: | 1294 | case 0x1: |
| 1299 | - gen_op_eval_fbne(r_dst, r_src, offset); | 1295 | + gen_op_eval_fbne(r_dst, cpu_fsr, offset); |
| 1300 | break; | 1296 | break; |
| 1301 | case 0x2: | 1297 | case 0x2: |
| 1302 | - gen_op_eval_fblg(r_dst, r_src, offset); | 1298 | + gen_op_eval_fblg(r_dst, cpu_fsr, offset); |
| 1303 | break; | 1299 | break; |
| 1304 | case 0x3: | 1300 | case 0x3: |
| 1305 | - gen_op_eval_fbul(r_dst, r_src, offset); | 1301 | + gen_op_eval_fbul(r_dst, cpu_fsr, offset); |
| 1306 | break; | 1302 | break; |
| 1307 | case 0x4: | 1303 | case 0x4: |
| 1308 | - gen_op_eval_fbl(r_dst, r_src, offset); | 1304 | + gen_op_eval_fbl(r_dst, cpu_fsr, offset); |
| 1309 | break; | 1305 | break; |
| 1310 | case 0x5: | 1306 | case 0x5: |
| 1311 | - gen_op_eval_fbug(r_dst, r_src, offset); | 1307 | + gen_op_eval_fbug(r_dst, cpu_fsr, offset); |
| 1312 | break; | 1308 | break; |
| 1313 | case 0x6: | 1309 | case 0x6: |
| 1314 | - gen_op_eval_fbg(r_dst, r_src, offset); | 1310 | + gen_op_eval_fbg(r_dst, cpu_fsr, offset); |
| 1315 | break; | 1311 | break; |
| 1316 | case 0x7: | 1312 | case 0x7: |
| 1317 | - gen_op_eval_fbu(r_dst, r_src, offset); | 1313 | + gen_op_eval_fbu(r_dst, cpu_fsr, offset); |
| 1318 | break; | 1314 | break; |
| 1319 | case 0x8: | 1315 | case 0x8: |
| 1320 | gen_op_eval_ba(r_dst); | 1316 | gen_op_eval_ba(r_dst); |
| 1321 | break; | 1317 | break; |
| 1322 | case 0x9: | 1318 | case 0x9: |
| 1323 | - gen_op_eval_fbe(r_dst, r_src, offset); | 1319 | + gen_op_eval_fbe(r_dst, cpu_fsr, offset); |
| 1324 | break; | 1320 | break; |
| 1325 | case 0xa: | 1321 | case 0xa: |
| 1326 | - gen_op_eval_fbue(r_dst, r_src, offset); | 1322 | + gen_op_eval_fbue(r_dst, cpu_fsr, offset); |
| 1327 | break; | 1323 | break; |
| 1328 | case 0xb: | 1324 | case 0xb: |
| 1329 | - gen_op_eval_fbge(r_dst, r_src, offset); | 1325 | + gen_op_eval_fbge(r_dst, cpu_fsr, offset); |
| 1330 | break; | 1326 | break; |
| 1331 | case 0xc: | 1327 | case 0xc: |
| 1332 | - gen_op_eval_fbuge(r_dst, r_src, offset); | 1328 | + gen_op_eval_fbuge(r_dst, cpu_fsr, offset); |
| 1333 | break; | 1329 | break; |
| 1334 | case 0xd: | 1330 | case 0xd: |
| 1335 | - gen_op_eval_fble(r_dst, r_src, offset); | 1331 | + gen_op_eval_fble(r_dst, cpu_fsr, offset); |
| 1336 | break; | 1332 | break; |
| 1337 | case 0xe: | 1333 | case 0xe: |
| 1338 | - gen_op_eval_fbule(r_dst, r_src, offset); | 1334 | + gen_op_eval_fbule(r_dst, cpu_fsr, offset); |
| 1339 | break; | 1335 | break; |
| 1340 | case 0xf: | 1336 | case 0xf: |
| 1341 | - gen_op_eval_fbo(r_dst, r_src, offset); | 1337 | + gen_op_eval_fbo(r_dst, cpu_fsr, offset); |
| 1342 | break; | 1338 | break; |
| 1343 | } | 1339 | } |
| 1344 | } | 1340 | } |
| @@ -1588,10 +1584,8 @@ static inline void gen_op_fcmpeq(int fccno) | @@ -1588,10 +1584,8 @@ static inline void gen_op_fcmpeq(int fccno) | ||
| 1588 | 1584 | ||
| 1589 | static inline void gen_op_fpexception_im(int fsr_flags) | 1585 | static inline void gen_op_fpexception_im(int fsr_flags) |
| 1590 | { | 1586 | { |
| 1591 | - tcg_gen_ld_tl(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, fsr)); | ||
| 1592 | - tcg_gen_andi_tl(cpu_tmp0, cpu_tmp0, ~FSR_FTT_MASK); | ||
| 1593 | - tcg_gen_ori_tl(cpu_tmp0, cpu_tmp0, fsr_flags); | ||
| 1594 | - tcg_gen_st_tl(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, fsr)); | 1587 | + tcg_gen_andi_tl(cpu_fsr, cpu_fsr, ~FSR_FTT_MASK); |
| 1588 | + tcg_gen_ori_tl(cpu_fsr, cpu_fsr, fsr_flags); | ||
| 1595 | gen_op_exception(TT_FP_EXCP); | 1589 | gen_op_exception(TT_FP_EXCP); |
| 1596 | } | 1590 | } |
| 1597 | 1591 | ||
| @@ -1610,9 +1604,7 @@ static int gen_trap_ifnofpu(DisasContext * dc) | @@ -1610,9 +1604,7 @@ static int gen_trap_ifnofpu(DisasContext * dc) | ||
| 1610 | 1604 | ||
| 1611 | static inline void gen_op_clear_ieee_excp_and_FTT(void) | 1605 | static inline void gen_op_clear_ieee_excp_and_FTT(void) |
| 1612 | { | 1606 | { |
| 1613 | - tcg_gen_ld_tl(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, fsr)); | ||
| 1614 | - tcg_gen_andi_tl(cpu_tmp0, cpu_tmp0, ~(FSR_FTT_MASK | FSR_CEXC_MASK)); | ||
| 1615 | - tcg_gen_st_tl(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, fsr)); | 1607 | + tcg_gen_andi_tl(cpu_fsr, cpu_fsr, ~(FSR_FTT_MASK | FSR_CEXC_MASK)); |
| 1616 | } | 1608 | } |
| 1617 | 1609 | ||
| 1618 | static inline void gen_clear_float_exceptions(void) | 1610 | static inline void gen_clear_float_exceptions(void) |
| @@ -4769,6 +4761,9 @@ CPUSPARCState *cpu_sparc_init(const char *cpu_model) | @@ -4769,6 +4761,9 @@ CPUSPARCState *cpu_sparc_init(const char *cpu_model) | ||
| 4769 | cpu_psr = tcg_global_mem_new(TCG_TYPE_I32, | 4761 | cpu_psr = tcg_global_mem_new(TCG_TYPE_I32, |
| 4770 | TCG_AREG0, offsetof(CPUState, psr), | 4762 | TCG_AREG0, offsetof(CPUState, psr), |
| 4771 | "psr"); | 4763 | "psr"); |
| 4764 | + cpu_fsr = tcg_global_mem_new(TCG_TYPE_TL, | ||
| 4765 | + TCG_AREG0, offsetof(CPUState, fsr), | ||
| 4766 | + "fsr"); | ||
| 4772 | for (i = 1; i < 8; i++) | 4767 | for (i = 1; i < 8; i++) |
| 4773 | cpu_gregs[i] = tcg_global_mem_new(TCG_TYPE_TL, TCG_AREG0, | 4768 | cpu_gregs[i] = tcg_global_mem_new(TCG_TYPE_TL, TCG_AREG0, |
| 4774 | offsetof(CPUState, gregs[i]), | 4769 | offsetof(CPUState, gregs[i]), |