Loading tcg/ppc/tcg-target.h +1 −0 Original line number Diff line number Diff line Loading @@ -132,5 +132,6 @@ void tb_target_set_jmp_target(uintptr_t, uintptr_t, uintptr_t); #ifdef CONFIG_SOFTMMU #define TCG_TARGET_NEED_LDST_LABELS #endif #define TCG_TARGET_NEED_POOL_LABELS #endif tcg/ppc/tcg-target.inc.c +30 −4 Original line number Diff line number Diff line Loading @@ -22,6 +22,9 @@ * THE SOFTWARE. */ #include "elf.h" #include "tcg-pool.inc.c" #if defined _CALL_DARWIN || defined __APPLE__ #define TCG_TARGET_CALL_DARWIN #endif Loading Loading @@ -58,8 +61,6 @@ static tcg_insn_unit *tb_ret_addr; #include "elf.h" bool have_isa_2_06; bool have_isa_3_00; Loading Loading @@ -224,9 +225,12 @@ static inline void tcg_out_bc_noaddr(TCGContext *s, int insn) static void patch_reloc(tcg_insn_unit *code_ptr, int type, intptr_t value, intptr_t addend) { tcg_insn_unit *target = (tcg_insn_unit *)value; tcg_insn_unit *target; tcg_insn_unit old; value += addend; target = (tcg_insn_unit *)value; tcg_debug_assert(addend == 0); switch (type) { case R_PPC_REL14: reloc_pc14(code_ptr, target); Loading @@ -234,6 +238,12 @@ static void patch_reloc(tcg_insn_unit *code_ptr, int type, case R_PPC_REL24: reloc_pc24(code_ptr, target); break; case R_PPC_ADDR16: assert(value == (int16_t)value); old = *code_ptr; old = deposit32(old, 0, 16, value); *code_ptr = old; break; default: tcg_abort(); } Loading Loading @@ -676,6 +686,14 @@ static void tcg_out_movi_int(TCGContext *s, TCGType type, TCGReg ret, return; } /* Use the constant pool, if possible. */ if (!in_prologue && USE_REG_TB) { new_pool_label(s, arg, R_PPC_ADDR16, s->code_ptr, -(intptr_t)s->code_gen_ptr); tcg_out32(s, LD | TAI(ret, TCG_REG_TB, 0)); return; } tmp = arg >> 31 >> 1; tcg_out_movi(s, TCG_TYPE_I32, ret, tmp); if (tmp) { Loading Loading @@ -1858,6 +1876,14 @@ static void tcg_out_qemu_st(TCGContext *s, const TCGArg *args, bool is_64) #endif } static void tcg_out_nop_fill(tcg_insn_unit *p, int count) { int i; for (i = 0; i < count; ++i) { p[i] = NOP; } } /* Parameters for function call generation, used in tcg.c. */ #define TCG_TARGET_STACK_ALIGN 16 #define TCG_TARGET_EXTEND_ARGS 1 Loading Loading
tcg/ppc/tcg-target.h +1 −0 Original line number Diff line number Diff line Loading @@ -132,5 +132,6 @@ void tb_target_set_jmp_target(uintptr_t, uintptr_t, uintptr_t); #ifdef CONFIG_SOFTMMU #define TCG_TARGET_NEED_LDST_LABELS #endif #define TCG_TARGET_NEED_POOL_LABELS #endif
tcg/ppc/tcg-target.inc.c +30 −4 Original line number Diff line number Diff line Loading @@ -22,6 +22,9 @@ * THE SOFTWARE. */ #include "elf.h" #include "tcg-pool.inc.c" #if defined _CALL_DARWIN || defined __APPLE__ #define TCG_TARGET_CALL_DARWIN #endif Loading Loading @@ -58,8 +61,6 @@ static tcg_insn_unit *tb_ret_addr; #include "elf.h" bool have_isa_2_06; bool have_isa_3_00; Loading Loading @@ -224,9 +225,12 @@ static inline void tcg_out_bc_noaddr(TCGContext *s, int insn) static void patch_reloc(tcg_insn_unit *code_ptr, int type, intptr_t value, intptr_t addend) { tcg_insn_unit *target = (tcg_insn_unit *)value; tcg_insn_unit *target; tcg_insn_unit old; value += addend; target = (tcg_insn_unit *)value; tcg_debug_assert(addend == 0); switch (type) { case R_PPC_REL14: reloc_pc14(code_ptr, target); Loading @@ -234,6 +238,12 @@ static void patch_reloc(tcg_insn_unit *code_ptr, int type, case R_PPC_REL24: reloc_pc24(code_ptr, target); break; case R_PPC_ADDR16: assert(value == (int16_t)value); old = *code_ptr; old = deposit32(old, 0, 16, value); *code_ptr = old; break; default: tcg_abort(); } Loading Loading @@ -676,6 +686,14 @@ static void tcg_out_movi_int(TCGContext *s, TCGType type, TCGReg ret, return; } /* Use the constant pool, if possible. */ if (!in_prologue && USE_REG_TB) { new_pool_label(s, arg, R_PPC_ADDR16, s->code_ptr, -(intptr_t)s->code_gen_ptr); tcg_out32(s, LD | TAI(ret, TCG_REG_TB, 0)); return; } tmp = arg >> 31 >> 1; tcg_out_movi(s, TCG_TYPE_I32, ret, tmp); if (tmp) { Loading Loading @@ -1858,6 +1876,14 @@ static void tcg_out_qemu_st(TCGContext *s, const TCGArg *args, bool is_64) #endif } static void tcg_out_nop_fill(tcg_insn_unit *p, int count) { int i; for (i = 0; i < count; ++i) { p[i] = NOP; } } /* Parameters for function call generation, used in tcg.c. */ #define TCG_TARGET_STACK_ALIGN 16 #define TCG_TARGET_EXTEND_ARGS 1 Loading