Commit 3945462805beb52cdc3e42eff948afbe2e7c4683

Authored by ths
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
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 }