Commit 66ba317c90fc9b668374574e3dc4f45586f56dca
1 parent
9850d1e8
target-sh4: map FP registers as TCG variables
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5758 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
43 additions
and
106 deletions
target-sh4/translate.c
... | ... | @@ -72,6 +72,7 @@ static TCGv cpu_gregs[24]; |
72 | 72 | static TCGv cpu_pc, cpu_sr, cpu_ssr, cpu_spc, cpu_gbr; |
73 | 73 | static TCGv cpu_vbr, cpu_sgr, cpu_dbr, cpu_mach, cpu_macl; |
74 | 74 | static TCGv cpu_pr, cpu_fpscr, cpu_fpul, cpu_flags; |
75 | +static TCGv cpu_fregs[32]; | |
75 | 76 | |
76 | 77 | /* internal register indexes */ |
77 | 78 | static TCGv cpu_flags, cpu_delayed_pc; |
... | ... | @@ -89,6 +90,16 @@ static void sh4_translate_init(void) |
89 | 90 | "R0_BANK1", "R1_BANK1", "R2_BANK1", "R3_BANK1", |
90 | 91 | "R4_BANK1", "R5_BANK1", "R6_BANK1", "R7_BANK1" |
91 | 92 | }; |
93 | + static const char * const fregnames[32] = { | |
94 | + "FPR0_BANK0", "FPR1_BANK0", "FPR2_BANK0", "FPR3_BANK0", | |
95 | + "FPR4_BANK0", "FPR5_BANK0", "FPR6_BANK0", "FPR7_BANK0", | |
96 | + "FPR8_BANK0", "FPR9_BANK0", "FPR10_BANK0", "FPR11_BANK0", | |
97 | + "FPR12_BANK0", "FPR13_BANK0", "FPR14_BANK0", "FPR15_BANK0", | |
98 | + "FPR0_BANK1", "FPR1_BANK1", "FPR2_BANK1", "FPR3_BANK1", | |
99 | + "FPR4_BANK1", "FPR5_BANK1", "FPR6_BANK1", "FPR7_BANK1", | |
100 | + "FPR8_BANK1", "FPR9_BANK1", "FPR10_BANK1", "FPR11_BANK1", | |
101 | + "FPR12_BANK1", "FPR13_BANK1", "FPR14_BANK1", "FPR15_BANK1", | |
102 | + }; | |
92 | 103 | |
93 | 104 | if (done_init) |
94 | 105 | return; |
... | ... | @@ -97,8 +108,8 @@ static void sh4_translate_init(void) |
97 | 108 | |
98 | 109 | for (i = 0; i < 24; i++) |
99 | 110 | cpu_gregs[i] = tcg_global_mem_new_i32(TCG_AREG0, |
100 | - offsetof(CPUState, gregs[i]), | |
101 | - gregnames[i]); | |
111 | + offsetof(CPUState, gregs[i]), | |
112 | + gregnames[i]); | |
102 | 113 | |
103 | 114 | cpu_pc = tcg_global_mem_new_i32(TCG_AREG0, |
104 | 115 | offsetof(CPUState, pc), "PC"); |
... | ... | @@ -133,6 +144,11 @@ static void sh4_translate_init(void) |
133 | 144 | offsetof(CPUState, delayed_pc), |
134 | 145 | "_delayed_pc_"); |
135 | 146 | |
147 | + for (i = 0; i < 32; i++) | |
148 | + cpu_fregs[i] = tcg_global_mem_new_i32(TCG_AREG0, | |
149 | + offsetof(CPUState, fregs[i]), | |
150 | + fregnames[i]); | |
151 | + | |
136 | 152 | /* register helpers */ |
137 | 153 | #define GEN_HELPER 2 |
138 | 154 | #include "helper.h" |
... | ... | @@ -393,38 +409,19 @@ static inline void gen_copy_bit_i32(TCGv t0, int p0, TCGv t1, int p1) |
393 | 409 | tcg_temp_free(tmp); |
394 | 410 | } |
395 | 411 | |
396 | - | |
397 | -static inline void gen_load_fpr32(TCGv_i32 t, int reg) | |
398 | -{ | |
399 | - tcg_gen_ld_i32(t, cpu_env, offsetof(CPUState, fregs[reg])); | |
400 | -} | |
401 | - | |
402 | 412 | static inline void gen_load_fpr64(TCGv_i64 t, int reg) |
403 | 413 | { |
404 | - TCGv_i32 tmp1 = tcg_temp_new_i32(); | |
405 | - TCGv_i32 tmp2 = tcg_temp_new_i32(); | |
406 | - | |
407 | - tcg_gen_ld_i32(tmp1, cpu_env, offsetof(CPUState, fregs[reg])); | |
408 | - tcg_gen_ld_i32(tmp2, cpu_env, offsetof(CPUState, fregs[reg + 1])); | |
409 | - tcg_gen_concat_i32_i64(t, tmp2, tmp1); | |
410 | - tcg_temp_free_i32(tmp1); | |
411 | - tcg_temp_free_i32(tmp2); | |
412 | -} | |
413 | - | |
414 | -static inline void gen_store_fpr32(TCGv_i32 t, int reg) | |
415 | -{ | |
416 | - tcg_gen_st_i32(t, cpu_env, offsetof(CPUState, fregs[reg])); | |
414 | + tcg_gen_concat_i32_i64(t, cpu_fregs[reg + 1], cpu_fregs[reg]); | |
417 | 415 | } |
418 | 416 | |
419 | 417 | static inline void gen_store_fpr64 (TCGv_i64 t, int reg) |
420 | 418 | { |
421 | 419 | TCGv_i32 tmp = tcg_temp_new_i32(); |
422 | - | |
423 | 420 | tcg_gen_trunc_i64_i32(tmp, t); |
424 | - tcg_gen_st_i32(tmp, cpu_env, offsetof(CPUState, fregs[reg + 1])); | |
421 | + tcg_gen_mov_i32(cpu_fregs[reg + 1], tmp); | |
425 | 422 | tcg_gen_shri_i64(t, t, 32); |
426 | 423 | tcg_gen_trunc_i64_i32(tmp, t); |
427 | - tcg_gen_st_i32(tmp, cpu_env, offsetof(CPUState, fregs[reg])); | |
424 | + tcg_gen_mov_i32(cpu_fregs[reg], tmp); | |
428 | 425 | tcg_temp_free_i32(tmp); |
429 | 426 | } |
430 | 427 | |
... | ... | @@ -989,10 +986,7 @@ static void _decode_opc(DisasContext * ctx) |
989 | 986 | gen_store_fpr64(fp, XREG(B11_8)); |
990 | 987 | tcg_temp_free_i64(fp); |
991 | 988 | } else { |
992 | - TCGv_i32 fp = tcg_temp_new_i32(); | |
993 | - gen_load_fpr32(fp, FREG(B7_4)); | |
994 | - gen_store_fpr32(fp, FREG(B11_8)); | |
995 | - tcg_temp_free_i32(fp); | |
989 | + tcg_gen_mov_i32(cpu_fregs[FREG(B11_8)], cpu_fregs[FREG(B7_4)]); | |
996 | 990 | } |
997 | 991 | return; |
998 | 992 | case 0xf00a: /* fmov {F,D,X}Rm,@Rn - FPSCR: Nothing */ |
... | ... | @@ -1002,10 +996,7 @@ static void _decode_opc(DisasContext * ctx) |
1002 | 996 | tcg_gen_qemu_st64(fp, REG(B11_8), ctx->memidx); |
1003 | 997 | tcg_temp_free_i64(fp); |
1004 | 998 | } else { |
1005 | - TCGv_i32 fp = tcg_temp_new_i32(); | |
1006 | - gen_load_fpr32(fp, FREG(B7_4)); | |
1007 | - tcg_gen_qemu_st32(fp, REG(B11_8), ctx->memidx); | |
1008 | - tcg_temp_free_i32(fp); | |
999 | + tcg_gen_qemu_st32(cpu_fregs[FREG(B7_4)], REG(B11_8), ctx->memidx); | |
1009 | 1000 | } |
1010 | 1001 | return; |
1011 | 1002 | case 0xf008: /* fmov @Rm,{F,D,X}Rn - FPSCR: Nothing */ |
... | ... | @@ -1015,10 +1006,7 @@ static void _decode_opc(DisasContext * ctx) |
1015 | 1006 | gen_store_fpr64(fp, XREG(B11_8)); |
1016 | 1007 | tcg_temp_free_i64(fp); |
1017 | 1008 | } else { |
1018 | - TCGv_i32 fp = tcg_temp_new_i32(); | |
1019 | - tcg_gen_qemu_ld32u(fp, REG(B7_4), ctx->memidx); | |
1020 | - gen_store_fpr32(fp, FREG(B11_8)); | |
1021 | - tcg_temp_free_i32(fp); | |
1009 | + tcg_gen_qemu_ld32u(cpu_fregs[FREG(B11_8)], REG(B7_4), ctx->memidx); | |
1022 | 1010 | } |
1023 | 1011 | return; |
1024 | 1012 | case 0xf009: /* fmov @Rm+,{F,D,X}Rn - FPSCR: Nothing */ |
... | ... | @@ -1029,10 +1017,7 @@ static void _decode_opc(DisasContext * ctx) |
1029 | 1017 | tcg_temp_free_i64(fp); |
1030 | 1018 | tcg_gen_addi_i32(REG(B7_4),REG(B7_4), 8); |
1031 | 1019 | } else { |
1032 | - TCGv_i32 fp = tcg_temp_new_i32(); | |
1033 | - tcg_gen_qemu_ld32u(fp, REG(B7_4), ctx->memidx); | |
1034 | - gen_store_fpr32(fp, FREG(B11_8)); | |
1035 | - tcg_temp_free_i32(fp); | |
1020 | + tcg_gen_qemu_ld32u(cpu_fregs[FREG(B11_8)], REG(B7_4), ctx->memidx); | |
1036 | 1021 | tcg_gen_addi_i32(REG(B7_4), REG(B7_4), 4); |
1037 | 1022 | } |
1038 | 1023 | return; |
... | ... | @@ -1050,13 +1035,9 @@ static void _decode_opc(DisasContext * ctx) |
1050 | 1035 | tcg_gen_subi_i32(REG(B11_8), REG(B11_8), 8); |
1051 | 1036 | } else { |
1052 | 1037 | TCGv addr; |
1053 | - TCGv_i32 fp; | |
1054 | 1038 | addr = tcg_temp_new_i32(); |
1055 | 1039 | tcg_gen_subi_i32(addr, REG(B11_8), 4); |
1056 | - fp = tcg_temp_new_i32(); | |
1057 | - gen_load_fpr32(fp, FREG(B7_4)); | |
1058 | - tcg_gen_qemu_st32(fp, addr, ctx->memidx); | |
1059 | - tcg_temp_free_i32(fp); | |
1040 | + tcg_gen_qemu_st32(cpu_fregs[FREG(B7_4)], addr, ctx->memidx); | |
1060 | 1041 | tcg_temp_free(addr); |
1061 | 1042 | tcg_gen_subi_i32(REG(B11_8), REG(B11_8), 4); |
1062 | 1043 | } |
... | ... | @@ -1071,10 +1052,7 @@ static void _decode_opc(DisasContext * ctx) |
1071 | 1052 | gen_store_fpr64(fp, XREG(B11_8)); |
1072 | 1053 | tcg_temp_free_i64(fp); |
1073 | 1054 | } else { |
1074 | - TCGv_i32 fp = tcg_temp_new_i32(); | |
1075 | - tcg_gen_qemu_ld32u(fp, addr, ctx->memidx); | |
1076 | - gen_store_fpr32(fp, FREG(B11_8)); | |
1077 | - tcg_temp_free_i32(fp); | |
1055 | + tcg_gen_qemu_ld32u(cpu_fregs[FREG(B11_8)], addr, ctx->memidx); | |
1078 | 1056 | } |
1079 | 1057 | tcg_temp_free(addr); |
1080 | 1058 | } |
... | ... | @@ -1089,10 +1067,7 @@ static void _decode_opc(DisasContext * ctx) |
1089 | 1067 | tcg_gen_qemu_st64(fp, addr, ctx->memidx); |
1090 | 1068 | tcg_temp_free_i64(fp); |
1091 | 1069 | } else { |
1092 | - TCGv_i32 fp = tcg_temp_new_i32(); | |
1093 | - gen_load_fpr32(fp, FREG(B7_4)); | |
1094 | - tcg_gen_qemu_st32(fp, addr, ctx->memidx); | |
1095 | - tcg_temp_free_i32(fp); | |
1070 | + tcg_gen_qemu_st32(cpu_fregs[FREG(B7_4)], addr, ctx->memidx); | |
1096 | 1071 | } |
1097 | 1072 | tcg_temp_free(addr); |
1098 | 1073 | } |
... | ... | @@ -1137,36 +1112,26 @@ static void _decode_opc(DisasContext * ctx) |
1137 | 1112 | tcg_temp_free_i64(fp0); |
1138 | 1113 | tcg_temp_free_i64(fp1); |
1139 | 1114 | } else { |
1140 | - TCGv_i32 fp0, fp1; | |
1141 | - | |
1142 | - fp0 = tcg_temp_new_i32(); | |
1143 | - fp1 = tcg_temp_new_i32(); | |
1144 | - gen_load_fpr32(fp0, FREG(B11_8)); | |
1145 | - gen_load_fpr32(fp1, FREG(B7_4)); | |
1146 | - | |
1147 | 1115 | switch (ctx->opcode & 0xf00f) { |
1148 | 1116 | case 0xf000: /* fadd Rm,Rn */ |
1149 | - gen_helper_fadd_FT(fp0, fp0, fp1); | |
1117 | + gen_helper_fadd_FT(cpu_fregs[FREG(B11_8)], cpu_fregs[FREG(B11_8)], cpu_fregs[FREG(B7_4)]); | |
1150 | 1118 | break; |
1151 | 1119 | case 0xf001: /* fsub Rm,Rn */ |
1152 | - gen_helper_fsub_FT(fp0, fp0, fp1); | |
1120 | + gen_helper_fsub_FT(cpu_fregs[FREG(B11_8)], cpu_fregs[FREG(B11_8)], cpu_fregs[FREG(B7_4)]); | |
1153 | 1121 | break; |
1154 | 1122 | case 0xf002: /* fmul Rm,Rn */ |
1155 | - gen_helper_fmul_FT(fp0, fp0, fp1); | |
1123 | + gen_helper_fmul_FT(cpu_fregs[FREG(B11_8)], cpu_fregs[FREG(B11_8)], cpu_fregs[FREG(B7_4)]); | |
1156 | 1124 | break; |
1157 | 1125 | case 0xf003: /* fdiv Rm,Rn */ |
1158 | - gen_helper_fdiv_FT(fp0, fp0, fp1); | |
1126 | + gen_helper_fdiv_FT(cpu_fregs[FREG(B11_8)], cpu_fregs[FREG(B11_8)], cpu_fregs[FREG(B7_4)]); | |
1159 | 1127 | break; |
1160 | 1128 | case 0xf004: /* fcmp/eq Rm,Rn */ |
1161 | - gen_helper_fcmp_eq_FT(fp0, fp1); | |
1129 | + gen_helper_fcmp_eq_FT(cpu_fregs[FREG(B11_8)], cpu_fregs[FREG(B7_4)]); | |
1162 | 1130 | return; |
1163 | 1131 | case 0xf005: /* fcmp/gt Rm,Rn */ |
1164 | - gen_helper_fcmp_gt_FT(fp0, fp1); | |
1132 | + gen_helper_fcmp_gt_FT(cpu_fregs[FREG(B11_8)], cpu_fregs[FREG(B7_4)]); | |
1165 | 1133 | return; |
1166 | 1134 | } |
1167 | - gen_store_fpr32(fp0, FREG(B11_8)); | |
1168 | - tcg_temp_free_i32(fp0); | |
1169 | - tcg_temp_free_i32(fp1); | |
1170 | 1135 | } |
1171 | 1136 | } |
1172 | 1137 | return; |
... | ... | @@ -1633,18 +1598,12 @@ static void _decode_opc(DisasContext * ctx) |
1633 | 1598 | return; |
1634 | 1599 | case 0xf00d: /* fsts FPUL,FRn - FPSCR: Nothing */ |
1635 | 1600 | { |
1636 | - TCGv fp = tcg_temp_new(); | |
1637 | - tcg_gen_mov_i32(fp, cpu_fpul); | |
1638 | - gen_store_fpr32(fp, FREG(B11_8)); | |
1639 | - tcg_temp_free(fp); | |
1601 | + tcg_gen_mov_i32(cpu_fregs[FREG(B11_8)], cpu_fpul); | |
1640 | 1602 | } |
1641 | 1603 | return; |
1642 | 1604 | case 0xf01d: /* flds FRm,FPUL - FPSCR: Nothing */ |
1643 | 1605 | { |
1644 | - TCGv fp = tcg_temp_new(); | |
1645 | - gen_load_fpr32(fp, FREG(B11_8)); | |
1646 | - tcg_gen_mov_i32(cpu_fpul, fp); | |
1647 | - tcg_temp_free(fp); | |
1606 | + tcg_gen_mov_i32(cpu_fpul, cpu_fregs[FREG(B11_8)]); | |
1648 | 1607 | } |
1649 | 1608 | return; |
1650 | 1609 | case 0xf02d: /* float FPUL,FRn/DRn - FPSCR: R[PR,Enable.I]/W[Cause,Flag] */ |
... | ... | @@ -1658,10 +1617,7 @@ static void _decode_opc(DisasContext * ctx) |
1658 | 1617 | tcg_temp_free_i64(fp); |
1659 | 1618 | } |
1660 | 1619 | else { |
1661 | - TCGv_i32 fp = tcg_temp_new_i32(); | |
1662 | - gen_helper_float_FT(fp, cpu_fpul); | |
1663 | - gen_store_fpr32(fp, FREG(B11_8)); | |
1664 | - tcg_temp_free_i32(fp); | |
1620 | + gen_helper_float_FT(cpu_fregs[FREG(B11_8)], cpu_fpul); | |
1665 | 1621 | } |
1666 | 1622 | return; |
1667 | 1623 | case 0xf03d: /* ftrc FRm/DRm,FPUL - FPSCR: R[PR,Enable.V]/W[Cause,Flag] */ |
... | ... | @@ -1675,19 +1631,12 @@ static void _decode_opc(DisasContext * ctx) |
1675 | 1631 | tcg_temp_free_i64(fp); |
1676 | 1632 | } |
1677 | 1633 | else { |
1678 | - TCGv_i32 fp = tcg_temp_new_i32(); | |
1679 | - gen_load_fpr32(fp, FREG(B11_8)); | |
1680 | - gen_helper_ftrc_FT(cpu_fpul, fp); | |
1681 | - tcg_temp_free_i32(fp); | |
1634 | + gen_helper_ftrc_FT(cpu_fpul, cpu_fregs[FREG(B11_8)]); | |
1682 | 1635 | } |
1683 | 1636 | return; |
1684 | 1637 | case 0xf04d: /* fneg FRn/DRn - FPSCR: Nothing */ |
1685 | 1638 | { |
1686 | - TCGv_i32 fp = tcg_temp_new_i32(); | |
1687 | - gen_load_fpr32(fp, FREG(B11_8)); | |
1688 | - gen_helper_fneg_T(fp, fp); | |
1689 | - gen_store_fpr32(fp, FREG(B11_8)); | |
1690 | - tcg_temp_free_i32(fp); | |
1639 | + gen_helper_fneg_T(cpu_fregs[FREG(B11_8)], cpu_fregs[FREG(B11_8)]); | |
1691 | 1640 | } |
1692 | 1641 | return; |
1693 | 1642 | case 0xf05d: /* fabs FRn/DRn */ |
... | ... | @@ -1700,11 +1649,7 @@ static void _decode_opc(DisasContext * ctx) |
1700 | 1649 | gen_store_fpr64(fp, DREG(B11_8)); |
1701 | 1650 | tcg_temp_free_i64(fp); |
1702 | 1651 | } else { |
1703 | - TCGv_i32 fp = tcg_temp_new_i32(); | |
1704 | - gen_load_fpr32(fp, FREG(B11_8)); | |
1705 | - gen_helper_fabs_FT(fp, fp); | |
1706 | - gen_store_fpr32(fp, FREG(B11_8)); | |
1707 | - tcg_temp_free_i32(fp); | |
1652 | + gen_helper_fabs_FT(cpu_fregs[FREG(B11_8)], cpu_fregs[FREG(B11_8)]); | |
1708 | 1653 | } |
1709 | 1654 | return; |
1710 | 1655 | case 0xf06d: /* fsqrt FRn */ |
... | ... | @@ -1717,28 +1662,20 @@ static void _decode_opc(DisasContext * ctx) |
1717 | 1662 | gen_store_fpr64(fp, DREG(B11_8)); |
1718 | 1663 | tcg_temp_free_i64(fp); |
1719 | 1664 | } else { |
1720 | - TCGv_i32 fp = tcg_temp_new_i32(); | |
1721 | - gen_load_fpr32(fp, FREG(B11_8)); | |
1722 | - gen_helper_fsqrt_FT(fp, fp); | |
1723 | - gen_store_fpr32(fp, FREG(B11_8)); | |
1724 | - tcg_temp_free_i32(fp); | |
1665 | + gen_helper_fsqrt_FT(cpu_fregs[FREG(B11_8)], cpu_fregs[FREG(B11_8)]); | |
1725 | 1666 | } |
1726 | 1667 | return; |
1727 | 1668 | case 0xf07d: /* fsrra FRn */ |
1728 | 1669 | break; |
1729 | 1670 | case 0xf08d: /* fldi0 FRn - FPSCR: R[PR] */ |
1730 | 1671 | if (!(ctx->fpscr & FPSCR_PR)) { |
1731 | - TCGv_i32 val = tcg_const_i32(0); | |
1732 | - gen_load_fpr32(val, FREG(B11_8)); | |
1733 | - tcg_temp_free_i32(val); | |
1672 | + tcg_gen_movi_i32(cpu_fregs[FREG(B11_8)], 0); | |
1734 | 1673 | return; |
1735 | 1674 | } |
1736 | 1675 | break; |
1737 | 1676 | case 0xf09d: /* fldi1 FRn - FPSCR: R[PR] */ |
1738 | 1677 | if (!(ctx->fpscr & FPSCR_PR)) { |
1739 | - TCGv_i32 val = tcg_const_i32(0x3f800000); | |
1740 | - gen_load_fpr32(val, FREG(B11_8)); | |
1741 | - tcg_temp_free_i32(val); | |
1678 | + tcg_gen_movi_i32(cpu_fregs[FREG(B11_8)], 0x3f800000); | |
1742 | 1679 | return; |
1743 | 1680 | } |
1744 | 1681 | break; | ... | ... |