We were always doing an indirect jump anyway, and the sequence is never longer than the 6 insns we were reserving for the direct jump. Futher cleanups will reduce the length of the constant address load.
Signed-off-by: Richard Henderson <r...@twiddle.net> --- include/exec/exec-all.h | 3 ++- tcg/ppc64/tcg-target.c | 26 ++++++++------------------ 2 files changed, 10 insertions(+), 19 deletions(-) diff --git a/include/exec/exec-all.h b/include/exec/exec-all.h index b3402a1..26c3553 100644 --- a/include/exec/exec-all.h +++ b/include/exec/exec-all.h @@ -126,7 +126,8 @@ static inline void tlb_flush(CPUArchState *env, int flush_global) #define CODE_GEN_AVG_BLOCK_SIZE 64 #endif -#if defined(__arm__) || defined(_ARCH_PPC) \ +#if defined(__arm__) \ + || (defined(__powerpc__) && !defined(__powerpc64__)) \ || defined(__x86_64__) || defined(__i386__) \ || defined(__sparc__) || defined(__aarch64__) \ || defined(CONFIG_TCG_INTERPRETER) diff --git a/tcg/ppc64/tcg-target.c b/tcg/ppc64/tcg-target.c index e9c41fb..f69bc8f 100644 --- a/tcg/ppc64/tcg-target.c +++ b/tcg/ppc64/tcg-target.c @@ -1440,17 +1440,6 @@ static void tcg_out_movcond(TCGContext *s, TCGType type, TCGCond cond, } } -void ppc_tb_set_jmp_target (unsigned long jmp_addr, unsigned long addr) -{ - TCGContext s; - unsigned long patch_size; - - s.code_ptr = (uint8_t *) jmp_addr; - tcg_out_b (&s, 0, addr); - patch_size = s.code_ptr - (uint8_t *) jmp_addr; - flush_icache_range (jmp_addr, jmp_addr + patch_size); -} - static void tcg_out_op (TCGContext *s, TCGOpcode opc, const TCGArg *args, const int *const_args) { @@ -1464,13 +1453,14 @@ static void tcg_out_op (TCGContext *s, TCGOpcode opc, const TCGArg *args, break; case INDEX_op_goto_tb: if (s->tb_jmp_offset) { - /* direct jump method */ - - s->tb_jmp_offset[args[0]] = s->code_ptr - s->code_buf; - s->code_ptr += 28; - } - else { - tcg_abort (); + /* Direct jump method. */ + tcg_abort(); + } else { + /* Indirect jump method. */ + tcg_out_mem_long(s, LD, LDX, TCG_REG_R0, TCG_REG_R0, + (tcg_target_long)(s->tb_next + args[0])); + tcg_out32(s, MTSPR | RS(TCG_REG_R0) | CTR); + tcg_out32(s, BCCTR | BO_ALWAYS); } s->tb_next_offset[args[0]] = s->code_ptr - s->code_buf; break; -- 1.8.3.1