Commit 66ba317c90fc9b668374574e3dc4f45586f56dca

Authored by aurel32
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;
... ...