tcg/sparc: Support split-wx code generation

Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
Richard Henderson 2020-11-04 22:49:09 +03:00
parent 47c2206ba4
commit 0d8b6191ac
2 changed files with 14 additions and 12 deletions

View file

@ -291,14 +291,15 @@ static inline int check_fit_i32(int32_t val, unsigned int bits)
# define check_fit_ptr check_fit_i32 # define check_fit_ptr check_fit_i32
#endif #endif
static bool patch_reloc(tcg_insn_unit *code_ptr, int type, static bool patch_reloc(tcg_insn_unit *src_rw, int type,
intptr_t value, intptr_t addend) intptr_t value, intptr_t addend)
{ {
uint32_t insn = *code_ptr; const tcg_insn_unit *src_rx = tcg_splitwx_to_rx(src_rw);
uint32_t insn = *src_rw;
intptr_t pcrel; intptr_t pcrel;
value += addend; value += addend;
pcrel = tcg_ptr_byte_diff((tcg_insn_unit *)value, code_ptr); pcrel = tcg_ptr_byte_diff((tcg_insn_unit *)value, src_rx);
switch (type) { switch (type) {
case R_SPARC_WDISP16: case R_SPARC_WDISP16:
@ -315,7 +316,7 @@ static bool patch_reloc(tcg_insn_unit *code_ptr, int type,
g_assert_not_reached(); g_assert_not_reached();
} }
*code_ptr = insn; *src_rw = insn;
return true; return true;
} }
@ -868,8 +869,8 @@ static void tcg_out_mb(TCGContext *s, TCGArg a0)
} }
#ifdef CONFIG_SOFTMMU #ifdef CONFIG_SOFTMMU
static tcg_insn_unit *qemu_ld_trampoline[16]; static const tcg_insn_unit *qemu_ld_trampoline[16];
static tcg_insn_unit *qemu_st_trampoline[16]; static const tcg_insn_unit *qemu_st_trampoline[16];
static void emit_extend(TCGContext *s, TCGReg r, int op) static void emit_extend(TCGContext *s, TCGReg r, int op)
{ {
@ -930,7 +931,7 @@ static void build_trampolines(TCGContext *s)
while ((uintptr_t)s->code_ptr & 15) { while ((uintptr_t)s->code_ptr & 15) {
tcg_out_nop(s); tcg_out_nop(s);
} }
qemu_ld_trampoline[i] = s->code_ptr; qemu_ld_trampoline[i] = tcg_splitwx_to_rx(s->code_ptr);
if (SPARC64 || TARGET_LONG_BITS == 32) { if (SPARC64 || TARGET_LONG_BITS == 32) {
ra = TCG_REG_O3; ra = TCG_REG_O3;
@ -958,7 +959,7 @@ static void build_trampolines(TCGContext *s)
while ((uintptr_t)s->code_ptr & 15) { while ((uintptr_t)s->code_ptr & 15) {
tcg_out_nop(s); tcg_out_nop(s);
} }
qemu_st_trampoline[i] = s->code_ptr; qemu_st_trampoline[i] = tcg_splitwx_to_rx(s->code_ptr);
if (SPARC64) { if (SPARC64) {
emit_extend(s, TCG_REG_O2, i); emit_extend(s, TCG_REG_O2, i);
@ -1038,7 +1039,8 @@ static void tcg_target_qemu_prologue(TCGContext *s)
tcg_out_nop(s); tcg_out_nop(s);
/* Epilogue for goto_ptr. */ /* Epilogue for goto_ptr. */
tcg_code_gen_epilogue = s->code_ptr; /* TODO: Cast goes away when all hosts converted */
tcg_code_gen_epilogue = (void *)tcg_splitwx_to_rx(s->code_ptr);
tcg_out_arithi(s, TCG_REG_G0, TCG_REG_I7, 8, RETURN); tcg_out_arithi(s, TCG_REG_G0, TCG_REG_I7, 8, RETURN);
/* delay slot */ /* delay slot */
tcg_out_movi_imm13(s, TCG_REG_O0, 0); tcg_out_movi_imm13(s, TCG_REG_O0, 0);
@ -1163,7 +1165,7 @@ static void tcg_out_qemu_ld(TCGContext *s, TCGReg data, TCGReg addr,
#ifdef CONFIG_SOFTMMU #ifdef CONFIG_SOFTMMU
unsigned memi = get_mmuidx(oi); unsigned memi = get_mmuidx(oi);
TCGReg addrz, param; TCGReg addrz, param;
tcg_insn_unit *func; const tcg_insn_unit *func;
tcg_insn_unit *label_ptr; tcg_insn_unit *label_ptr;
addrz = tcg_out_tlb_load(s, addr, memi, memop, addrz = tcg_out_tlb_load(s, addr, memi, memop,
@ -1245,7 +1247,7 @@ static void tcg_out_qemu_st(TCGContext *s, TCGReg data, TCGReg addr,
#ifdef CONFIG_SOFTMMU #ifdef CONFIG_SOFTMMU
unsigned memi = get_mmuidx(oi); unsigned memi = get_mmuidx(oi);
TCGReg addrz, param; TCGReg addrz, param;
tcg_insn_unit *func; const tcg_insn_unit *func;
tcg_insn_unit *label_ptr; tcg_insn_unit *label_ptr;
addrz = tcg_out_tlb_load(s, addr, memi, memop, addrz = tcg_out_tlb_load(s, addr, memi, memop,

View file

@ -172,6 +172,6 @@ extern bool use_vis3_instructions;
void tb_target_set_jmp_target(uintptr_t, uintptr_t, uintptr_t, uintptr_t); void tb_target_set_jmp_target(uintptr_t, uintptr_t, uintptr_t, uintptr_t);
#define TCG_TARGET_NEED_POOL_LABELS #define TCG_TARGET_NEED_POOL_LABELS
#define TCG_TARGET_SUPPORT_MIRROR 0 #define TCG_TARGET_SUPPORT_MIRROR 1
#endif #endif