Revision c53be334 target-arm/translate.c

b/target-arm/translate.c
43 43

  
44 44
#define DISAS_JUMP_NEXT 4
45 45

  
46
#ifdef USE_DIRECT_JUMP
47
#define TBPARAM(x)
48
#else
49
#define TBPARAM(x) (long)(x)
50
#endif
51

  
46 52
/* XXX: move that elsewhere */
47 53
static uint16_t *gen_opc_ptr;
48 54
static uint32_t *gen_opparam_ptr;
......
897 903
    return 0;
898 904
}
899 905

  
906
static inline void gen_jmp_tb(long tb, int n, uint32_t dest)
907
{
908
    if (n == 0)
909
        gen_op_goto_tb0(TBPARAM(tb));
910
    else
911
        gen_op_goto_tb1(TBPARAM(tb));
912
    gen_op_movl_T0_im(dest);
913
    gen_op_movl_r15_T0();
914
    gen_op_movl_T0_im(tb + n);
915
    gen_op_exit_tb();
916
}
917

  
900 918
static inline void gen_jmp (DisasContext *s, uint32_t dest)
901 919
{
902 920
    if (__builtin_expect(s->singlestep_enabled, 0)) {
......
906 924
        gen_op_movl_T0_im(dest);
907 925
        gen_bx(s);
908 926
    } else {
909
        gen_op_jmp0((long)s->tb, dest);
927
        long tb = (long)s->tb;
928
        gen_jmp_tb(tb, 0, dest);
910 929
        s->is_jmp = DISAS_TB_JUMP;
911 930
    }
912 931
}
......
2118 2137
    } else {
2119 2138
        switch(dc->is_jmp) {
2120 2139
        case DISAS_NEXT:
2121
            gen_op_jmp1((long)dc->tb, (long)dc->pc);
2140
            gen_jmp_tb((long)dc->tb, 1, dc->pc);
2122 2141
            break;
2123 2142
        default:
2124 2143
        case DISAS_JUMP:
......
2133 2152
        }
2134 2153
        if (dc->condjmp) {
2135 2154
            gen_set_label(dc->condlabel);
2136
            gen_op_jmp1((long)dc->tb, (long)dc->pc);
2155
            gen_jmp_tb((long)dc->tb, 1, dc->pc);
2137 2156
            dc->condjmp = 0;
2138 2157
        }
2139 2158
    }

Also available in: Unified diff