target/i386: avoid using s->tmp0 for add to implicit registers
For updates to implicit registers (RCX in LOOP instructions, RSI or RDI in string instructions, or the stack pointer) do the add directly using the registers (with no temporary) if 32-bit or 64-bit, or use a temporary created for the occasion if 16-bit. This is more efficient and removes move instructions for the MO_TL case. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Link: https://lore.kernel.org/r/20241215090613.89588-14-pbonzini@redhat.com Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
82290c7647
commit
22063f03a7
@ -505,17 +505,24 @@ static inline void gen_op_jmp_v(DisasContext *s, TCGv dest)
|
||||
s->pc_save = -1;
|
||||
}
|
||||
|
||||
static inline void gen_op_add_reg(DisasContext *s, MemOp size, int reg, TCGv val)
|
||||
{
|
||||
/* Using cpu_regs[reg] does not work for xH registers. */
|
||||
assert(size >= MO_16);
|
||||
if (size == MO_16) {
|
||||
TCGv temp = tcg_temp_new();
|
||||
tcg_gen_add_tl(temp, cpu_regs[reg], val);
|
||||
gen_op_mov_reg_v(s, size, reg, temp);
|
||||
} else {
|
||||
tcg_gen_add_tl(cpu_regs[reg], cpu_regs[reg], val);
|
||||
tcg_gen_ext_tl(cpu_regs[reg], cpu_regs[reg], size);
|
||||
}
|
||||
}
|
||||
|
||||
static inline
|
||||
void gen_op_add_reg_im(DisasContext *s, MemOp size, int reg, int32_t val)
|
||||
{
|
||||
tcg_gen_addi_tl(s->tmp0, cpu_regs[reg], val);
|
||||
gen_op_mov_reg_v(s, size, reg, s->tmp0);
|
||||
}
|
||||
|
||||
static inline void gen_op_add_reg(DisasContext *s, MemOp size, int reg, TCGv val)
|
||||
{
|
||||
tcg_gen_add_tl(s->tmp0, cpu_regs[reg], val);
|
||||
gen_op_mov_reg_v(s, size, reg, s->tmp0);
|
||||
gen_op_add_reg(s, size, reg, tcg_constant_tl(val));
|
||||
}
|
||||
|
||||
static inline void gen_op_ld_v(DisasContext *s, int idx, TCGv t0, TCGv a0)
|
||||
|
Loading…
x
Reference in New Issue
Block a user