tcg: Move tcg epilogue pointer out of TCGContext

This value is constant across all thread-local copies of TCGContext,
so we might as well move it out of thread-local storage.

Reviewed-by: Joelle van Dyne <j@getutm.app>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
master
Richard Henderson 2020-10-28 14:48:55 -07:00
parent b91ccb3115
commit 8b5c2b6260
11 changed files with 16 additions and 15 deletions

View File

@ -154,7 +154,7 @@ void *HELPER(lookup_tb_ptr)(CPUArchState *env)
tb = tb_lookup__cpu_state(cpu, &pc, &cs_base, &flags, curr_cflags()); tb = tb_lookup__cpu_state(cpu, &pc, &cs_base, &flags, curr_cflags());
if (tb == NULL) { if (tb == NULL) {
return tcg_ctx->code_gen_epilogue; return tcg_code_gen_epilogue;
} }
qemu_log_mask_and_addr(CPU_LOG_EXEC, pc, qemu_log_mask_and_addr(CPU_LOG_EXEC, pc,
"Chain %d: %p [" "Chain %d: %p ["

View File

@ -621,7 +621,6 @@ struct TCGContext {
here, because there's too much arithmetic throughout that relies here, because there's too much arithmetic throughout that relies
on addition and subtraction working on bytes. Rely on the GCC on addition and subtraction working on bytes. Rely on the GCC
extension that allows arithmetic on void*. */ extension that allows arithmetic on void*. */
void *code_gen_epilogue;
void *code_gen_buffer; void *code_gen_buffer;
size_t code_gen_buffer_size; size_t code_gen_buffer_size;
void *code_gen_ptr; void *code_gen_ptr;
@ -678,6 +677,7 @@ struct TCGContext {
extern TCGContext tcg_init_ctx; extern TCGContext tcg_init_ctx;
extern __thread TCGContext *tcg_ctx; extern __thread TCGContext *tcg_ctx;
extern void *tcg_code_gen_epilogue;
extern TCGv_env cpu_env; extern TCGv_env cpu_env;
static inline size_t temp_idx(TCGTemp *ts) static inline size_t temp_idx(TCGTemp *ts)

View File

@ -1873,7 +1873,7 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc,
case INDEX_op_exit_tb: case INDEX_op_exit_tb:
/* Reuse the zeroing that exists for goto_ptr. */ /* Reuse the zeroing that exists for goto_ptr. */
if (a0 == 0) { if (a0 == 0) {
tcg_out_goto_long(s, s->code_gen_epilogue); tcg_out_goto_long(s, tcg_code_gen_epilogue);
} else { } else {
tcg_out_movi(s, TCG_TYPE_I64, TCG_REG_X0, a0); tcg_out_movi(s, TCG_TYPE_I64, TCG_REG_X0, a0);
tcg_out_goto_long(s, tb_ret_addr); tcg_out_goto_long(s, tb_ret_addr);
@ -2894,7 +2894,7 @@ static void tcg_target_qemu_prologue(TCGContext *s)
* Return path for goto_ptr. Set return value to 0, a-la exit_tb, * Return path for goto_ptr. Set return value to 0, a-la exit_tb,
* and fall through to the rest of the epilogue. * and fall through to the rest of the epilogue.
*/ */
s->code_gen_epilogue = s->code_ptr; tcg_code_gen_epilogue = s->code_ptr;
tcg_out_movi(s, TCG_TYPE_REG, TCG_REG_X0, 0); tcg_out_movi(s, TCG_TYPE_REG, TCG_REG_X0, 0);
/* TB epilogue */ /* TB epilogue */

View File

@ -2297,7 +2297,7 @@ static void tcg_target_qemu_prologue(TCGContext *s)
* Return path for goto_ptr. Set return value to 0, a-la exit_tb, * Return path for goto_ptr. Set return value to 0, a-la exit_tb,
* and fall through to the rest of the epilogue. * and fall through to the rest of the epilogue.
*/ */
s->code_gen_epilogue = s->code_ptr; tcg_code_gen_epilogue = s->code_ptr;
tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_R0, 0); tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_R0, 0);
tcg_out_epilogue(s); tcg_out_epilogue(s);
} }

View File

@ -2240,7 +2240,7 @@ static inline void tcg_out_op(TCGContext *s, TCGOpcode opc,
case INDEX_op_exit_tb: case INDEX_op_exit_tb:
/* Reuse the zeroing that exists for goto_ptr. */ /* Reuse the zeroing that exists for goto_ptr. */
if (a0 == 0) { if (a0 == 0) {
tcg_out_jmp(s, s->code_gen_epilogue); tcg_out_jmp(s, tcg_code_gen_epilogue);
} else { } else {
tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_EAX, a0); tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_EAX, a0);
tcg_out_jmp(s, tb_ret_addr); tcg_out_jmp(s, tb_ret_addr);
@ -3803,7 +3803,7 @@ static void tcg_target_qemu_prologue(TCGContext *s)
* Return path for goto_ptr. Set return value to 0, a-la exit_tb, * Return path for goto_ptr. Set return value to 0, a-la exit_tb,
* and fall through to the rest of the epilogue. * and fall through to the rest of the epilogue.
*/ */
s->code_gen_epilogue = s->code_ptr; tcg_code_gen_epilogue = s->code_ptr;
tcg_out_movi(s, TCG_TYPE_REG, TCG_REG_EAX, 0); tcg_out_movi(s, TCG_TYPE_REG, TCG_REG_EAX, 0);
/* TB epilogue */ /* TB epilogue */

View File

@ -2483,7 +2483,7 @@ static void tcg_target_qemu_prologue(TCGContext *s)
* Return path for goto_ptr. Set return value to 0, a-la exit_tb, * Return path for goto_ptr. Set return value to 0, a-la exit_tb,
* and fall through to the rest of the epilogue. * and fall through to the rest of the epilogue.
*/ */
s->code_gen_epilogue = s->code_ptr; tcg_code_gen_epilogue = s->code_ptr;
tcg_out_mov(s, TCG_TYPE_REG, TCG_REG_V0, TCG_REG_ZERO); tcg_out_mov(s, TCG_TYPE_REG, TCG_REG_V0, TCG_REG_ZERO);
/* TB epilogue */ /* TB epilogue */

View File

@ -2341,7 +2341,7 @@ static void tcg_target_qemu_prologue(TCGContext *s)
tcg_out32(s, BCCTR | BO_ALWAYS); tcg_out32(s, BCCTR | BO_ALWAYS);
/* Epilogue */ /* Epilogue */
s->code_gen_epilogue = tb_ret_addr = s->code_ptr; tcg_code_gen_epilogue = tb_ret_addr = s->code_ptr;
tcg_out_ld(s, TCG_TYPE_PTR, TCG_REG_R0, TCG_REG_R1, FRAME_SIZE+LR_OFFSET); tcg_out_ld(s, TCG_TYPE_PTR, TCG_REG_R0, TCG_REG_R1, FRAME_SIZE+LR_OFFSET);
for (i = 0; i < ARRAY_SIZE(tcg_target_callee_save_regs); ++i) { for (i = 0; i < ARRAY_SIZE(tcg_target_callee_save_regs); ++i) {

View File

@ -1288,7 +1288,7 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc,
case INDEX_op_exit_tb: case INDEX_op_exit_tb:
/* Reuse the zeroing that exists for goto_ptr. */ /* Reuse the zeroing that exists for goto_ptr. */
if (a0 == 0) { if (a0 == 0) {
tcg_out_call_int(s, s->code_gen_epilogue, true); tcg_out_call_int(s, tcg_code_gen_epilogue, true);
} else { } else {
tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_A0, a0); tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_A0, a0);
tcg_out_call_int(s, tb_ret_addr, true); tcg_out_call_int(s, tb_ret_addr, true);
@ -1822,7 +1822,7 @@ static void tcg_target_qemu_prologue(TCGContext *s)
tcg_out_opc_imm(s, OPC_JALR, TCG_REG_ZERO, tcg_target_call_iarg_regs[1], 0); tcg_out_opc_imm(s, OPC_JALR, TCG_REG_ZERO, tcg_target_call_iarg_regs[1], 0);
/* Return path for goto_ptr. Set return value to 0 */ /* Return path for goto_ptr. Set return value to 0 */
s->code_gen_epilogue = s->code_ptr; tcg_code_gen_epilogue = s->code_ptr;
tcg_out_mov(s, TCG_TYPE_REG, TCG_REG_A0, TCG_REG_ZERO); tcg_out_mov(s, TCG_TYPE_REG, TCG_REG_A0, TCG_REG_ZERO);
/* TB epilogue */ /* TB epilogue */

View File

@ -1756,7 +1756,7 @@ static inline void tcg_out_op(TCGContext *s, TCGOpcode opc,
/* Reuse the zeroing that exists for goto_ptr. */ /* Reuse the zeroing that exists for goto_ptr. */
a0 = args[0]; a0 = args[0];
if (a0 == 0) { if (a0 == 0) {
tgen_gotoi(s, S390_CC_ALWAYS, s->code_gen_epilogue); tgen_gotoi(s, S390_CC_ALWAYS, tcg_code_gen_epilogue);
} else { } else {
tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_R2, a0); tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_R2, a0);
tgen_gotoi(s, S390_CC_ALWAYS, tb_ret_addr); tgen_gotoi(s, S390_CC_ALWAYS, tb_ret_addr);
@ -2561,7 +2561,7 @@ static void tcg_target_qemu_prologue(TCGContext *s)
* Return path for goto_ptr. Set return value to 0, a-la exit_tb, * Return path for goto_ptr. Set return value to 0, a-la exit_tb,
* and fall through to the rest of the epilogue. * and fall through to the rest of the epilogue.
*/ */
s->code_gen_epilogue = s->code_ptr; tcg_code_gen_epilogue = s->code_ptr;
tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_R2, 0); tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_R2, 0);
/* TB epilogue */ /* TB epilogue */

View File

@ -1038,7 +1038,7 @@ static void tcg_target_qemu_prologue(TCGContext *s)
tcg_out_nop(s); tcg_out_nop(s);
/* Epilogue for goto_ptr. */ /* Epilogue for goto_ptr. */
s->code_gen_epilogue = s->code_ptr; tcg_code_gen_epilogue = 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);

View File

@ -161,6 +161,7 @@ static int tcg_out_ldst_finalize(TCGContext *s);
static TCGContext **tcg_ctxs; static TCGContext **tcg_ctxs;
static unsigned int n_tcg_ctxs; static unsigned int n_tcg_ctxs;
TCGv_env cpu_env = 0; TCGv_env cpu_env = 0;
void *tcg_code_gen_epilogue;
#ifndef CONFIG_TCG_INTERPRETER #ifndef CONFIG_TCG_INTERPRETER
tcg_prologue_fn *tcg_qemu_tb_exec; tcg_prologue_fn *tcg_qemu_tb_exec;
@ -1133,7 +1134,7 @@ void tcg_prologue_init(TCGContext *s)
/* Assert that goto_ptr is implemented completely. */ /* Assert that goto_ptr is implemented completely. */
if (TCG_TARGET_HAS_goto_ptr) { if (TCG_TARGET_HAS_goto_ptr) {
tcg_debug_assert(s->code_gen_epilogue != NULL); tcg_debug_assert(tcg_code_gen_epilogue != NULL);
} }
} }