Commit 3945462805beb52cdc3e42eff948afbe2e7c4683
1 parent
f730fd27
Simplify mips branch handling. Retire T2 from use. Use TCG for branches.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4320 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
5 changed files
with
55 additions
and
77 deletions
target-mips/cpu.h
@@ -148,7 +148,6 @@ struct CPUMIPSState { | @@ -148,7 +148,6 @@ struct CPUMIPSState { | ||
148 | #if TARGET_LONG_BITS > HOST_LONG_BITS | 148 | #if TARGET_LONG_BITS > HOST_LONG_BITS |
149 | target_ulong t0; | 149 | target_ulong t0; |
150 | target_ulong t1; | 150 | target_ulong t1; |
151 | - target_ulong t2; | ||
152 | #endif | 151 | #endif |
153 | target_ulong HI[MIPS_TC_MAX][MIPS_DSP_ACC]; | 152 | target_ulong HI[MIPS_TC_MAX][MIPS_DSP_ACC]; |
154 | target_ulong LO[MIPS_TC_MAX][MIPS_DSP_ACC]; | 153 | target_ulong LO[MIPS_TC_MAX][MIPS_DSP_ACC]; |
target-mips/exec.h
@@ -13,11 +13,9 @@ register struct CPUMIPSState *env asm(AREG0); | @@ -13,11 +13,9 @@ register struct CPUMIPSState *env asm(AREG0); | ||
13 | #if TARGET_LONG_BITS > HOST_LONG_BITS | 13 | #if TARGET_LONG_BITS > HOST_LONG_BITS |
14 | #define T0 (env->t0) | 14 | #define T0 (env->t0) |
15 | #define T1 (env->t1) | 15 | #define T1 (env->t1) |
16 | -#define T2 (env->t2) | ||
17 | #else | 16 | #else |
18 | -register target_ulong T0 asm(AREG1); | ||
19 | -register target_ulong T1 asm(AREG2); | ||
20 | -register target_ulong T2 asm(AREG3); | 17 | +register target_ulong T0 asm(AREG2); |
18 | +register target_ulong T1 asm(AREG3); | ||
21 | #endif | 19 | #endif |
22 | 20 | ||
23 | #if defined (USE_HOST_FLOAT_REGS) | 21 | #if defined (USE_HOST_FLOAT_REGS) |
target-mips/op.c
@@ -247,12 +247,6 @@ | @@ -247,12 +247,6 @@ | ||
247 | #include "fop_template.c" | 247 | #include "fop_template.c" |
248 | #undef FTN | 248 | #undef FTN |
249 | 249 | ||
250 | -void op_dup_T0 (void) | ||
251 | -{ | ||
252 | - T2 = T0; | ||
253 | - FORCE_RET(); | ||
254 | -} | ||
255 | - | ||
256 | void op_load_HI (void) | 250 | void op_load_HI (void) |
257 | { | 251 | { |
258 | T0 = env->HI[env->current_tc][PARAM1]; | 252 | T0 = env->HI[env->current_tc][PARAM1]; |
@@ -1096,19 +1090,13 @@ OP_COND(ltz, (target_long)T0 < 0); | @@ -1096,19 +1090,13 @@ OP_COND(ltz, (target_long)T0 < 0); | ||
1096 | /* Branch to register */ | 1090 | /* Branch to register */ |
1097 | void op_save_breg_target (void) | 1091 | void op_save_breg_target (void) |
1098 | { | 1092 | { |
1099 | - env->btarget = T2; | ||
1100 | - FORCE_RET(); | ||
1101 | -} | ||
1102 | - | ||
1103 | -void op_restore_breg_target (void) | ||
1104 | -{ | ||
1105 | - T2 = env->btarget; | 1093 | + env->btarget = T1; |
1106 | FORCE_RET(); | 1094 | FORCE_RET(); |
1107 | } | 1095 | } |
1108 | 1096 | ||
1109 | void op_breg (void) | 1097 | void op_breg (void) |
1110 | { | 1098 | { |
1111 | - env->PC[env->current_tc] = T2; | 1099 | + env->PC[env->current_tc] = env->btarget; |
1112 | FORCE_RET(); | 1100 | FORCE_RET(); |
1113 | } | 1101 | } |
1114 | 1102 | ||
@@ -1129,25 +1117,13 @@ void op_save_btarget64 (void) | @@ -1129,25 +1117,13 @@ void op_save_btarget64 (void) | ||
1129 | /* Conditional branch */ | 1117 | /* Conditional branch */ |
1130 | void op_set_bcond (void) | 1118 | void op_set_bcond (void) |
1131 | { | 1119 | { |
1132 | - T2 = T0; | ||
1133 | - FORCE_RET(); | ||
1134 | -} | ||
1135 | - | ||
1136 | -void op_save_bcond (void) | ||
1137 | -{ | ||
1138 | - env->bcond = T2; | ||
1139 | - FORCE_RET(); | ||
1140 | -} | ||
1141 | - | ||
1142 | -void op_restore_bcond (void) | ||
1143 | -{ | ||
1144 | - T2 = env->bcond; | 1120 | + env->bcond = T0; |
1145 | FORCE_RET(); | 1121 | FORCE_RET(); |
1146 | } | 1122 | } |
1147 | 1123 | ||
1148 | -void op_jnz_T2 (void) | 1124 | +void op_jnz_bcond (void) |
1149 | { | 1125 | { |
1150 | - if (T2) | 1126 | + if (env->bcond) |
1151 | GOTO_LABEL_PARAM(1); | 1127 | GOTO_LABEL_PARAM(1); |
1152 | FORCE_RET(); | 1128 | FORCE_RET(); |
1153 | } | 1129 | } |
@@ -3116,12 +3092,6 @@ void op_debug (void) | @@ -3116,12 +3092,6 @@ void op_debug (void) | ||
3116 | FORCE_RET(); | 3092 | FORCE_RET(); |
3117 | } | 3093 | } |
3118 | 3094 | ||
3119 | -void op_set_lladdr (void) | ||
3120 | -{ | ||
3121 | - env->CP0_LLAddr = T2; | ||
3122 | - FORCE_RET(); | ||
3123 | -} | ||
3124 | - | ||
3125 | void debug_pre_eret (void); | 3095 | void debug_pre_eret (void); |
3126 | void debug_post_eret (void); | 3096 | void debug_post_eret (void); |
3127 | void op_eret (void) | 3097 | void op_eret (void) |
target-mips/op_template.c
@@ -43,12 +43,6 @@ void glue(op_store_T1_gpr_gpr, REG) (void) | @@ -43,12 +43,6 @@ void glue(op_store_T1_gpr_gpr, REG) (void) | ||
43 | FORCE_RET(); | 43 | FORCE_RET(); |
44 | } | 44 | } |
45 | 45 | ||
46 | -void glue(op_load_gpr_T2_gpr, REG) (void) | ||
47 | -{ | ||
48 | - T2 = env->gpr[env->current_tc][REG]; | ||
49 | - FORCE_RET(); | ||
50 | -} | ||
51 | - | ||
52 | 46 | ||
53 | void glue(op_load_srsgpr_T0_gpr, REG) (void) | 47 | void glue(op_load_srsgpr_T0_gpr, REG) (void) |
54 | { | 48 | { |
@@ -78,7 +72,6 @@ void glue(op_store_T0_srsgpr_gpr, REG) (void) | @@ -78,7 +72,6 @@ void glue(op_store_T0_srsgpr_gpr, REG) (void) | ||
78 | 72 | ||
79 | SET_RESET(T0, _T0) | 73 | SET_RESET(T0, _T0) |
80 | SET_RESET(T1, _T1) | 74 | SET_RESET(T1, _T1) |
81 | -SET_RESET(T2, _T2) | ||
82 | 75 | ||
83 | #undef SET_RESET | 76 | #undef SET_RESET |
84 | 77 | ||
@@ -92,7 +85,6 @@ SET_RESET(T2, _T2) | @@ -92,7 +85,6 @@ SET_RESET(T2, _T2) | ||
92 | 85 | ||
93 | SET64(T0, _T0) | 86 | SET64(T0, _T0) |
94 | SET64(T1, _T1) | 87 | SET64(T1, _T1) |
95 | -SET64(T2, _T2) | ||
96 | 88 | ||
97 | #undef SET64 | 89 | #undef SET64 |
98 | 90 |
target-mips/translate.c
@@ -421,6 +421,8 @@ enum { | @@ -421,6 +421,8 @@ enum { | ||
421 | OPC_NMSUB_PS= 0x3E | OPC_CP3, | 421 | OPC_NMSUB_PS= 0x3E | OPC_CP3, |
422 | }; | 422 | }; |
423 | 423 | ||
424 | +/* global register indices */ | ||
425 | +static TCGv cpu_env, current_tc_regs, cpu_T[2]; | ||
424 | 426 | ||
425 | const unsigned char *regnames[] = | 427 | const unsigned char *regnames[] = |
426 | { "r0", "at", "v0", "v1", "a0", "a1", "a2", "a3", | 428 | { "r0", "at", "v0", "v1", "a0", "a1", "a2", "a3", |
@@ -448,7 +450,6 @@ static always_inline void func(int n) \ | @@ -448,7 +450,6 @@ static always_inline void func(int n) \ | ||
448 | /* General purpose registers moves */ | 450 | /* General purpose registers moves */ |
449 | GEN32(gen_op_load_gpr_T0, gen_op_load_gpr_T0_gpr); | 451 | GEN32(gen_op_load_gpr_T0, gen_op_load_gpr_T0_gpr); |
450 | GEN32(gen_op_load_gpr_T1, gen_op_load_gpr_T1_gpr); | 452 | GEN32(gen_op_load_gpr_T1, gen_op_load_gpr_T1_gpr); |
451 | -GEN32(gen_op_load_gpr_T2, gen_op_load_gpr_T2_gpr); | ||
452 | 453 | ||
453 | GEN32(gen_op_store_T0_gpr, gen_op_store_T0_gpr_gpr); | 454 | GEN32(gen_op_store_T0_gpr, gen_op_store_T0_gpr_gpr); |
454 | GEN32(gen_op_store_T1_gpr, gen_op_store_T1_gpr_gpr); | 455 | GEN32(gen_op_store_T1_gpr, gen_op_store_T1_gpr_gpr); |
@@ -599,15 +600,6 @@ do { \ | @@ -599,15 +600,6 @@ do { \ | ||
599 | } \ | 600 | } \ |
600 | } while (0) | 601 | } while (0) |
601 | 602 | ||
602 | -#define GEN_LOAD_REG_T2(Rn) \ | ||
603 | -do { \ | ||
604 | - if (Rn == 0) { \ | ||
605 | - gen_op_reset_T2(); \ | ||
606 | - } else { \ | ||
607 | - gen_op_load_gpr_T2(Rn); \ | ||
608 | - } \ | ||
609 | -} while (0) | ||
610 | - | ||
611 | #define GEN_LOAD_SRSREG_TN(Tn, Rn) \ | 603 | #define GEN_LOAD_SRSREG_TN(Tn, Rn) \ |
612 | do { \ | 604 | do { \ |
613 | if (Rn == 0) { \ | 605 | if (Rn == 0) { \ |
@@ -714,14 +706,9 @@ static always_inline void save_cpu_state (DisasContext *ctx, int do_save_pc) | @@ -714,14 +706,9 @@ static always_inline void save_cpu_state (DisasContext *ctx, int do_save_pc) | ||
714 | ctx->saved_hflags = ctx->hflags; | 706 | ctx->saved_hflags = ctx->hflags; |
715 | switch (ctx->hflags & MIPS_HFLAG_BMASK) { | 707 | switch (ctx->hflags & MIPS_HFLAG_BMASK) { |
716 | case MIPS_HFLAG_BR: | 708 | case MIPS_HFLAG_BR: |
717 | - gen_op_save_breg_target(); | ||
718 | break; | 709 | break; |
719 | case MIPS_HFLAG_BC: | 710 | case MIPS_HFLAG_BC: |
720 | - gen_op_save_bcond(); | ||
721 | - /* fall through */ | ||
722 | case MIPS_HFLAG_BL: | 711 | case MIPS_HFLAG_BL: |
723 | - /* bcond was already saved by the BL insn */ | ||
724 | - /* fall through */ | ||
725 | case MIPS_HFLAG_B: | 712 | case MIPS_HFLAG_B: |
726 | gen_save_btarget(ctx->btarget); | 713 | gen_save_btarget(ctx->btarget); |
727 | break; | 714 | break; |
@@ -734,15 +721,11 @@ static always_inline void restore_cpu_state (CPUState *env, DisasContext *ctx) | @@ -734,15 +721,11 @@ static always_inline void restore_cpu_state (CPUState *env, DisasContext *ctx) | ||
734 | ctx->saved_hflags = ctx->hflags; | 721 | ctx->saved_hflags = ctx->hflags; |
735 | switch (ctx->hflags & MIPS_HFLAG_BMASK) { | 722 | switch (ctx->hflags & MIPS_HFLAG_BMASK) { |
736 | case MIPS_HFLAG_BR: | 723 | case MIPS_HFLAG_BR: |
737 | - gen_op_restore_breg_target(); | ||
738 | - break; | ||
739 | - case MIPS_HFLAG_B: | ||
740 | - ctx->btarget = env->btarget; | ||
741 | break; | 724 | break; |
742 | case MIPS_HFLAG_BC: | 725 | case MIPS_HFLAG_BC: |
743 | case MIPS_HFLAG_BL: | 726 | case MIPS_HFLAG_BL: |
727 | + case MIPS_HFLAG_B: | ||
744 | ctx->btarget = env->btarget; | 728 | ctx->btarget = env->btarget; |
745 | - gen_op_restore_bcond(); | ||
746 | break; | 729 | break; |
747 | } | 730 | } |
748 | } | 731 | } |
@@ -1770,6 +1753,19 @@ static always_inline void gen_goto_tb(DisasContext *ctx, int n, target_ulong des | @@ -1770,6 +1753,19 @@ static always_inline void gen_goto_tb(DisasContext *ctx, int n, target_ulong des | ||
1770 | } | 1753 | } |
1771 | } | 1754 | } |
1772 | 1755 | ||
1756 | +static inline void tcg_gen_set_bcond(void) | ||
1757 | +{ | ||
1758 | + tcg_gen_st_tl(cpu_T[0], cpu_env, offsetof(CPUState, bcond)); | ||
1759 | +} | ||
1760 | + | ||
1761 | +static inline void tcg_gen_jnz_bcond(int label) | ||
1762 | +{ | ||
1763 | + int r_tmp = tcg_temp_new(TCG_TYPE_TL); | ||
1764 | + | ||
1765 | + tcg_gen_ld_tl(r_tmp, cpu_env, offsetof(CPUState, bcond)); | ||
1766 | + tcg_gen_brcond_tl(TCG_COND_NE, r_tmp, tcg_const_i32(0), label); | ||
1767 | +} | ||
1768 | + | ||
1773 | /* Branches (before delay slot) */ | 1769 | /* Branches (before delay slot) */ |
1774 | static void gen_compute_branch (DisasContext *ctx, uint32_t opc, | 1770 | static void gen_compute_branch (DisasContext *ctx, uint32_t opc, |
1775 | int rs, int rt, int32_t offset) | 1771 | int rs, int rt, int32_t offset) |
@@ -1838,7 +1834,8 @@ static void gen_compute_branch (DisasContext *ctx, uint32_t opc, | @@ -1838,7 +1834,8 @@ static void gen_compute_branch (DisasContext *ctx, uint32_t opc, | ||
1838 | generate_exception(ctx, EXCP_RI); | 1834 | generate_exception(ctx, EXCP_RI); |
1839 | return; | 1835 | return; |
1840 | } | 1836 | } |
1841 | - GEN_LOAD_REG_T2(rs); | 1837 | + GEN_LOAD_REG_T1(rs); |
1838 | + gen_op_save_breg_target(); | ||
1842 | break; | 1839 | break; |
1843 | default: | 1840 | default: |
1844 | MIPS_INVAL("branch/jump"); | 1841 | MIPS_INVAL("branch/jump"); |
@@ -1983,7 +1980,7 @@ static void gen_compute_branch (DisasContext *ctx, uint32_t opc, | @@ -1983,7 +1980,7 @@ static void gen_compute_branch (DisasContext *ctx, uint32_t opc, | ||
1983 | MIPS_DEBUG("bltzal %s, " TARGET_FMT_lx, regnames[rs], btarget); | 1980 | MIPS_DEBUG("bltzal %s, " TARGET_FMT_lx, regnames[rs], btarget); |
1984 | not_likely: | 1981 | not_likely: |
1985 | ctx->hflags |= MIPS_HFLAG_BC; | 1982 | ctx->hflags |= MIPS_HFLAG_BC; |
1986 | - gen_op_set_bcond(); | 1983 | + tcg_gen_set_bcond(); |
1987 | break; | 1984 | break; |
1988 | case OPC_BLTZALL: | 1985 | case OPC_BLTZALL: |
1989 | gen_op_ltz(); | 1986 | gen_op_ltz(); |
@@ -1991,8 +1988,7 @@ static void gen_compute_branch (DisasContext *ctx, uint32_t opc, | @@ -1991,8 +1988,7 @@ static void gen_compute_branch (DisasContext *ctx, uint32_t opc, | ||
1991 | MIPS_DEBUG("bltzall %s, " TARGET_FMT_lx, regnames[rs], btarget); | 1988 | MIPS_DEBUG("bltzall %s, " TARGET_FMT_lx, regnames[rs], btarget); |
1992 | likely: | 1989 | likely: |
1993 | ctx->hflags |= MIPS_HFLAG_BL; | 1990 | ctx->hflags |= MIPS_HFLAG_BL; |
1994 | - gen_op_set_bcond(); | ||
1995 | - gen_op_save_bcond(); | 1991 | + tcg_gen_set_bcond(); |
1996 | break; | 1992 | break; |
1997 | default: | 1993 | default: |
1998 | MIPS_INVAL("conditional branch/jump"); | 1994 | MIPS_INVAL("conditional branch/jump"); |
@@ -4863,8 +4859,7 @@ static void gen_compute_branch1 (CPUState *env, DisasContext *ctx, uint32_t op, | @@ -4863,8 +4859,7 @@ static void gen_compute_branch1 (CPUState *env, DisasContext *ctx, uint32_t op, | ||
4863 | opn = "bc1tl"; | 4859 | opn = "bc1tl"; |
4864 | likely: | 4860 | likely: |
4865 | ctx->hflags |= MIPS_HFLAG_BL; | 4861 | ctx->hflags |= MIPS_HFLAG_BL; |
4866 | - gen_op_set_bcond(); | ||
4867 | - gen_op_save_bcond(); | 4862 | + tcg_gen_set_bcond(); |
4868 | break; | 4863 | break; |
4869 | case OPC_BC1FANY2: | 4864 | case OPC_BC1FANY2: |
4870 | gen_op_bc1any2f(cc); | 4865 | gen_op_bc1any2f(cc); |
@@ -4883,7 +4878,7 @@ static void gen_compute_branch1 (CPUState *env, DisasContext *ctx, uint32_t op, | @@ -4883,7 +4878,7 @@ static void gen_compute_branch1 (CPUState *env, DisasContext *ctx, uint32_t op, | ||
4883 | opn = "bc1any4t"; | 4878 | opn = "bc1any4t"; |
4884 | not_likely: | 4879 | not_likely: |
4885 | ctx->hflags |= MIPS_HFLAG_BC; | 4880 | ctx->hflags |= MIPS_HFLAG_BC; |
4886 | - gen_op_set_bcond(); | 4881 | + tcg_gen_set_bcond(); |
4887 | break; | 4882 | break; |
4888 | default: | 4883 | default: |
4889 | MIPS_INVAL(opn); | 4884 | MIPS_INVAL(opn); |
@@ -6056,7 +6051,7 @@ static void decode_opc (CPUState *env, DisasContext *ctx) | @@ -6056,7 +6051,7 @@ static void decode_opc (CPUState *env, DisasContext *ctx) | ||
6056 | /* Handle blikely not taken case */ | 6051 | /* Handle blikely not taken case */ |
6057 | MIPS_DEBUG("blikely condition (" TARGET_FMT_lx ")", ctx->pc + 4); | 6052 | MIPS_DEBUG("blikely condition (" TARGET_FMT_lx ")", ctx->pc + 4); |
6058 | l1 = gen_new_label(); | 6053 | l1 = gen_new_label(); |
6059 | - gen_op_jnz_T2(l1); | 6054 | + tcg_gen_jnz_bcond(l1); |
6060 | gen_op_save_state(ctx->hflags & ~MIPS_HFLAG_BMASK); | 6055 | gen_op_save_state(ctx->hflags & ~MIPS_HFLAG_BMASK); |
6061 | gen_goto_tb(ctx, 1, ctx->pc + 4); | 6056 | gen_goto_tb(ctx, 1, ctx->pc + 4); |
6062 | gen_set_label(l1); | 6057 | gen_set_label(l1); |
@@ -6612,7 +6607,7 @@ static void decode_opc (CPUState *env, DisasContext *ctx) | @@ -6612,7 +6607,7 @@ static void decode_opc (CPUState *env, DisasContext *ctx) | ||
6612 | { | 6607 | { |
6613 | int l1; | 6608 | int l1; |
6614 | l1 = gen_new_label(); | 6609 | l1 = gen_new_label(); |
6615 | - gen_op_jnz_T2(l1); | 6610 | + tcg_gen_jnz_bcond(l1); |
6616 | gen_goto_tb(ctx, 1, ctx->pc + 4); | 6611 | gen_goto_tb(ctx, 1, ctx->pc + 4); |
6617 | gen_set_label(l1); | 6612 | gen_set_label(l1); |
6618 | gen_goto_tb(ctx, 0, ctx->btarget); | 6613 | gen_goto_tb(ctx, 0, ctx->btarget); |
@@ -6877,6 +6872,29 @@ void cpu_dump_state (CPUState *env, FILE *f, | @@ -6877,6 +6872,29 @@ void cpu_dump_state (CPUState *env, FILE *f, | ||
6877 | #endif | 6872 | #endif |
6878 | } | 6873 | } |
6879 | 6874 | ||
6875 | +static void mips_tcg_init(void) | ||
6876 | +{ | ||
6877 | + static int inited; | ||
6878 | + | ||
6879 | + /* Initialize various static tables. */ | ||
6880 | + if (inited) | ||
6881 | + return; | ||
6882 | + | ||
6883 | + cpu_env = tcg_global_reg_new(TCG_TYPE_PTR, TCG_AREG0, "env"); | ||
6884 | + current_tc_regs = tcg_global_reg_new(TCG_TYPE_PTR, TCG_AREG1, "current_tc_regs"); | ||
6885 | +#if TARGET_LONG_BITS > HOST_LONG_BITS | ||
6886 | + cpu_T[0] = tcg_global_mem_new(TCG_TYPE_TL, | ||
6887 | + TCG_AREG0, offsetof(CPUState, t0), "T0"); | ||
6888 | + cpu_T[1] = tcg_global_mem_new(TCG_TYPE_TL, | ||
6889 | + TCG_AREG0, offsetof(CPUState, t1), "T1"); | ||
6890 | +#else | ||
6891 | + cpu_T[0] = tcg_global_reg_new(TCG_TYPE_TL, TCG_AREG2, "T0"); | ||
6892 | + cpu_T[1] = tcg_global_reg_new(TCG_TYPE_TL, TCG_AREG3, "T1"); | ||
6893 | +#endif | ||
6894 | + | ||
6895 | + inited = 1; | ||
6896 | +} | ||
6897 | + | ||
6880 | #include "translate_init.c" | 6898 | #include "translate_init.c" |
6881 | 6899 | ||
6882 | CPUMIPSState *cpu_mips_init (const char *cpu_model) | 6900 | CPUMIPSState *cpu_mips_init (const char *cpu_model) |
@@ -6894,6 +6912,7 @@ CPUMIPSState *cpu_mips_init (const char *cpu_model) | @@ -6894,6 +6912,7 @@ CPUMIPSState *cpu_mips_init (const char *cpu_model) | ||
6894 | 6912 | ||
6895 | cpu_exec_init(env); | 6913 | cpu_exec_init(env); |
6896 | env->cpu_model_str = cpu_model; | 6914 | env->cpu_model_str = cpu_model; |
6915 | + mips_tcg_init(); | ||
6897 | cpu_reset(env); | 6916 | cpu_reset(env); |
6898 | return env; | 6917 | return env; |
6899 | } | 6918 | } |