mirror of https://gitee.com/openkylin/qemu.git
tcg/mips: Unset TCG_TARGET_HAS_direct_jump
Only use indirect jumps. Finish weaning away from the unique alignment requirements for code_gen_buffer. Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
d7fc9f48c3
commit
5a8f0a5dd2
|
@ -1654,17 +1654,11 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc,
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case INDEX_op_goto_tb:
|
case INDEX_op_goto_tb:
|
||||||
if (s->tb_jmp_insn_offset) {
|
|
||||||
/* direct jump method */
|
|
||||||
s->tb_jmp_insn_offset[a0] = tcg_current_code_size(s);
|
|
||||||
/* Avoid clobbering the address during retranslation. */
|
|
||||||
tcg_out32(s, OPC_J | (*(uint32_t *)s->code_ptr & 0x3ffffff));
|
|
||||||
} else {
|
|
||||||
/* indirect jump method */
|
/* indirect jump method */
|
||||||
|
tcg_debug_assert(s->tb_jmp_insn_offset == 0);
|
||||||
tcg_out_ld(s, TCG_TYPE_PTR, TCG_TMP0, TCG_REG_ZERO,
|
tcg_out_ld(s, TCG_TYPE_PTR, TCG_TMP0, TCG_REG_ZERO,
|
||||||
(uintptr_t)(s->tb_jmp_target_addr + a0));
|
(uintptr_t)(s->tb_jmp_target_addr + a0));
|
||||||
tcg_out_opc_reg(s, OPC_JR, 0, TCG_TMP0, 0);
|
tcg_out_opc_reg(s, OPC_JR, 0, TCG_TMP0, 0);
|
||||||
}
|
|
||||||
tcg_out_nop(s);
|
tcg_out_nop(s);
|
||||||
set_jmp_reset_offset(s, a0);
|
set_jmp_reset_offset(s, a0);
|
||||||
break;
|
break;
|
||||||
|
@ -2538,13 +2532,6 @@ static void tcg_target_init(TCGContext *s)
|
||||||
tcg_regset_set_reg(s->reserved_regs, TCG_REG_GP); /* global pointer */
|
tcg_regset_set_reg(s->reserved_regs, TCG_REG_GP); /* global pointer */
|
||||||
}
|
}
|
||||||
|
|
||||||
void tb_target_set_jmp_target(uintptr_t tc_ptr, uintptr_t jmp_rx,
|
|
||||||
uintptr_t jmp_rw, uintptr_t addr)
|
|
||||||
{
|
|
||||||
qatomic_set((uint32_t *)jmp_rw, deposit32(OPC_J, 0, 26, addr >> 2));
|
|
||||||
flush_idcache_range(jmp_rx, jmp_rw, 4);
|
|
||||||
}
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
DebugFrameHeader h;
|
DebugFrameHeader h;
|
||||||
uint8_t fde_def_cfa[4];
|
uint8_t fde_def_cfa[4];
|
||||||
|
|
|
@ -39,11 +39,7 @@
|
||||||
#define TCG_TARGET_TLB_DISPLACEMENT_BITS 16
|
#define TCG_TARGET_TLB_DISPLACEMENT_BITS 16
|
||||||
#define TCG_TARGET_NB_REGS 32
|
#define TCG_TARGET_NB_REGS 32
|
||||||
|
|
||||||
/*
|
#define MAX_CODE_GEN_BUFFER_SIZE ((size_t)-1)
|
||||||
* We have a 256MB branch region, but leave room to make sure the
|
|
||||||
* main executable is also within that region.
|
|
||||||
*/
|
|
||||||
#define MAX_CODE_GEN_BUFFER_SIZE (128 * MiB)
|
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
TCG_REG_ZERO = 0,
|
TCG_REG_ZERO = 0,
|
||||||
|
@ -136,7 +132,7 @@ extern bool use_mips32r2_instructions;
|
||||||
#define TCG_TARGET_HAS_muluh_i32 1
|
#define TCG_TARGET_HAS_muluh_i32 1
|
||||||
#define TCG_TARGET_HAS_mulsh_i32 1
|
#define TCG_TARGET_HAS_mulsh_i32 1
|
||||||
#define TCG_TARGET_HAS_bswap32_i32 1
|
#define TCG_TARGET_HAS_bswap32_i32 1
|
||||||
#define TCG_TARGET_HAS_direct_jump 1
|
#define TCG_TARGET_HAS_direct_jump 0
|
||||||
|
|
||||||
#if TCG_TARGET_REG_BITS == 64
|
#if TCG_TARGET_REG_BITS == 64
|
||||||
#define TCG_TARGET_HAS_add2_i32 0
|
#define TCG_TARGET_HAS_add2_i32 0
|
||||||
|
@ -207,7 +203,9 @@ extern bool use_mips32r2_instructions;
|
||||||
#define TCG_TARGET_DEFAULT_MO (0)
|
#define TCG_TARGET_DEFAULT_MO (0)
|
||||||
#define TCG_TARGET_HAS_MEMORY_BSWAP 1
|
#define TCG_TARGET_HAS_MEMORY_BSWAP 1
|
||||||
|
|
||||||
void tb_target_set_jmp_target(uintptr_t, uintptr_t, uintptr_t, uintptr_t);
|
/* not defined -- call should be eliminated at compile time */
|
||||||
|
void tb_target_set_jmp_target(uintptr_t, uintptr_t, uintptr_t, uintptr_t)
|
||||||
|
QEMU_ERROR("code path is reachable");
|
||||||
|
|
||||||
#ifdef CONFIG_SOFTMMU
|
#ifdef CONFIG_SOFTMMU
|
||||||
#define TCG_TARGET_NEED_LDST_LABELS
|
#define TCG_TARGET_NEED_LDST_LABELS
|
||||||
|
|
Loading…
Reference in New Issue