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 28 #include "exec-all.h"
29 29 #include "disas.h"
30 30  
31   -#define MIPS_DEBUG_DISAS
  31 +//#define MIPS_DEBUG_DISAS
32 32 //#define MIPS_SINGLE_STEP
33 33  
34 34 #ifdef USE_DIRECT_JUMP
... ... @@ -1033,13 +1033,20 @@ static void gen_compute_branch (DisasContext *ctx, uint16_t opc,
1033 1033 case OPC_BNE: /* rx != rx */
1034 1034 case OPC_BGTZ: /* 0 > 0 */
1035 1035 case OPC_BLTZ: /* 0 < 0 */
1036   - case OPC_BLTZAL: /* 0 < 0 */
1037 1036 /* Treated as NOP */
1038 1037 MIPS_DEBUG("bnever (NOP)");
1039 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 1048 case OPC_BNEL: /* rx != rx likely */
1041 1049 case OPC_BGTZL: /* 0 > 0 likely */
1042   - case OPC_BLTZALL: /* 0 < 0 likely */
1043 1050 case OPC_BLTZL: /* 0 < 0 likely */
1044 1051 /* Skip the instruction in the delay slot */
1045 1052 MIPS_DEBUG("bnever and skip");
... ... @@ -1282,11 +1289,12 @@ static void gen_arith64 (DisasContext *ctx, uint16_t opc)
1282 1289  
1283 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 1300 static void decode_opc (DisasContext *ctx)
... ... @@ -1524,9 +1532,9 @@ static void decode_opc (DisasContext *ctx)
1524 1532 int l1;
1525 1533 l1 = gen_new_label();
1526 1534 gen_op_jnz_T2(l1);
1527   - gen_goto_tb(ctx, 0, ctx->btarget);
1528   - gen_set_label(l1);
1529 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 1539 break;
1532 1540 case MIPS_HFLAG_BR:
... ... @@ -1722,5 +1730,8 @@ CPUMIPSState *cpu_mips_init (void)
1722 1730 env->CP0_Debug = (1 << CP0DB_CNT) | (0x1 << CP0DB_VER);
1723 1731 env->CP0_PRid = MIPS_CPU;
1724 1732 env->exception_index = EXCP_NONE;
  1733 +#if defined(CONFIG_USER_ONLY)
  1734 + env->hflags |= MIPS_HFLAG_UM;
  1735 +#endif
1725 1736 return env;
1726 1737 }
... ...