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