Commit eeef26cd428b584a8211cc42185585c840b778f4

Authored by bellard
1 parent cc9442b9

fixed BLTZAL and BLTZALL insns - fixed regressions from jmp opts


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1667 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 21 additions and 10 deletions
target-mips/translate.c
@@ -28,7 +28,7 @@ @@ -28,7 +28,7 @@
28 #include "exec-all.h" 28 #include "exec-all.h"
29 #include "disas.h" 29 #include "disas.h"
30 30
31 -#define MIPS_DEBUG_DISAS 31 +//#define MIPS_DEBUG_DISAS
32 //#define MIPS_SINGLE_STEP 32 //#define MIPS_SINGLE_STEP
33 33
34 #ifdef USE_DIRECT_JUMP 34 #ifdef USE_DIRECT_JUMP
@@ -1033,13 +1033,20 @@ static void gen_compute_branch (DisasContext *ctx, uint16_t opc, @@ -1033,13 +1033,20 @@ static void gen_compute_branch (DisasContext *ctx, uint16_t opc,
1033 case OPC_BNE: /* rx != rx */ 1033 case OPC_BNE: /* rx != rx */
1034 case OPC_BGTZ: /* 0 > 0 */ 1034 case OPC_BGTZ: /* 0 > 0 */
1035 case OPC_BLTZ: /* 0 < 0 */ 1035 case OPC_BLTZ: /* 0 < 0 */
1036 - case OPC_BLTZAL: /* 0 < 0 */  
1037 /* Treated as NOP */ 1036 /* Treated as NOP */
1038 MIPS_DEBUG("bnever (NOP)"); 1037 MIPS_DEBUG("bnever (NOP)");
1039 return; 1038 return;
  1039 + case OPC_BLTZAL: /* 0 < 0 */
  1040 + gen_op_set_T0(ctx->pc + 8);
  1041 + gen_op_store_T0_gpr(31);
  1042 + return;
  1043 + case OPC_BLTZALL: /* 0 < 0 likely */
  1044 + gen_op_set_T0(ctx->pc + 8);
  1045 + gen_op_store_T0_gpr(31);
  1046 + gen_goto_tb(ctx, 0, ctx->pc + 4);
  1047 + return;
1040 case OPC_BNEL: /* rx != rx likely */ 1048 case OPC_BNEL: /* rx != rx likely */
1041 case OPC_BGTZL: /* 0 > 0 likely */ 1049 case OPC_BGTZL: /* 0 > 0 likely */
1042 - case OPC_BLTZALL: /* 0 < 0 likely */  
1043 case OPC_BLTZL: /* 0 < 0 likely */ 1050 case OPC_BLTZL: /* 0 < 0 likely */
1044 /* Skip the instruction in the delay slot */ 1051 /* Skip the instruction in the delay slot */
1045 MIPS_DEBUG("bnever and skip"); 1052 MIPS_DEBUG("bnever and skip");
@@ -1282,11 +1289,12 @@ static void gen_arith64 (DisasContext *ctx, uint16_t opc) @@ -1282,11 +1289,12 @@ static void gen_arith64 (DisasContext *ctx, uint16_t opc)
1282 1289
1283 static void gen_blikely(DisasContext *ctx) 1290 static void gen_blikely(DisasContext *ctx)
1284 { 1291 {
1285 - int l1;  
1286 - l1 = gen_new_label();  
1287 - gen_op_jnz_T2(l1);  
1288 - gen_op_save_state(ctx->hflags & ~(MIPS_HFLAG_BMASK | MIPS_HFLAG_DS));  
1289 - gen_goto_tb(ctx, 1, ctx->pc + 4); 1292 + int l1;
  1293 + l1 = gen_new_label();
  1294 + gen_op_jnz_T2(l1);
  1295 + gen_op_save_state(ctx->hflags & ~(MIPS_HFLAG_BMASK | MIPS_HFLAG_DS));
  1296 + gen_goto_tb(ctx, 1, ctx->pc + 4);
  1297 + gen_set_label(l1);
1290 } 1298 }
1291 1299
1292 static void decode_opc (DisasContext *ctx) 1300 static void decode_opc (DisasContext *ctx)
@@ -1524,9 +1532,9 @@ static void decode_opc (DisasContext *ctx) @@ -1524,9 +1532,9 @@ static void decode_opc (DisasContext *ctx)
1524 int l1; 1532 int l1;
1525 l1 = gen_new_label(); 1533 l1 = gen_new_label();
1526 gen_op_jnz_T2(l1); 1534 gen_op_jnz_T2(l1);
1527 - gen_goto_tb(ctx, 0, ctx->btarget);  
1528 - gen_set_label(l1);  
1529 gen_goto_tb(ctx, 1, ctx->pc + 4); 1535 gen_goto_tb(ctx, 1, ctx->pc + 4);
  1536 + gen_set_label(l1);
  1537 + gen_goto_tb(ctx, 0, ctx->btarget);
1530 } 1538 }
1531 break; 1539 break;
1532 case MIPS_HFLAG_BR: 1540 case MIPS_HFLAG_BR:
@@ -1722,5 +1730,8 @@ CPUMIPSState *cpu_mips_init (void) @@ -1722,5 +1730,8 @@ CPUMIPSState *cpu_mips_init (void)
1722 env->CP0_Debug = (1 << CP0DB_CNT) | (0x1 << CP0DB_VER); 1730 env->CP0_Debug = (1 << CP0DB_CNT) | (0x1 << CP0DB_VER);
1723 env->CP0_PRid = MIPS_CPU; 1731 env->CP0_PRid = MIPS_CPU;
1724 env->exception_index = EXCP_NONE; 1732 env->exception_index = EXCP_NONE;
  1733 +#if defined(CONFIG_USER_ONLY)
  1734 + env->hflags |= MIPS_HFLAG_UM;
  1735 +#endif
1725 return env; 1736 return env;
1726 } 1737 }