Message ID | 20230411010512.5375-44-richard.henderson@linaro.org |
---|---|
State | New |
Headers | show |
Series | tcg: Simplify calls to load/store helpers | expand |
On 4/10/23 22:05, Richard Henderson wrote: > Use tcg_out_ld_helper_args, tcg_out_ld_helper_ret, > and tcg_out_st_helper_args. > > Signed-off-by: Richard Henderson <richard.henderson@linaro.org> > --- Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com> > tcg/riscv/tcg-target.c.inc | 37 ++++++++++--------------------------- > 1 file changed, 10 insertions(+), 27 deletions(-) > > diff --git a/tcg/riscv/tcg-target.c.inc b/tcg/riscv/tcg-target.c.inc > index d4134bc86f..425ea8902e 100644 > --- a/tcg/riscv/tcg-target.c.inc > +++ b/tcg/riscv/tcg-target.c.inc > @@ -994,14 +994,14 @@ static void add_qemu_ldst_label(TCGContext *s, int is_ld, MemOpIdx oi, > label->label_ptr[0] = label_ptr[0]; > } > > +/* We have three temps, we might as well expose them. */ > +static const TCGLdstHelperParam ldst_helper_param = { > + .ntmp = 3, .tmp = { TCG_REG_TMP0, TCG_REG_TMP1, TCG_REG_TMP2 } > +}; > + > static bool tcg_out_qemu_ld_slow_path(TCGContext *s, TCGLabelQemuLdst *l) > { > - MemOpIdx oi = l->oi; > - MemOp opc = get_memop(oi); > - TCGReg a0 = tcg_target_call_iarg_regs[0]; > - TCGReg a1 = tcg_target_call_iarg_regs[1]; > - TCGReg a2 = tcg_target_call_iarg_regs[2]; > - TCGReg a3 = tcg_target_call_iarg_regs[3]; > + MemOp opc = get_memop(l->oi); > > /* resolve label address */ > if (!reloc_sbimm12(l->label_ptr[0], tcg_splitwx_to_rx(s->code_ptr))) { > @@ -1009,13 +1009,9 @@ static bool tcg_out_qemu_ld_slow_path(TCGContext *s, TCGLabelQemuLdst *l) > } > > /* call load helper */ > - tcg_out_mov(s, TCG_TYPE_PTR, a0, TCG_AREG0); > - tcg_out_mov(s, TCG_TYPE_PTR, a1, l->addrlo_reg); > - tcg_out_movi(s, TCG_TYPE_PTR, a2, oi); > - tcg_out_movi(s, TCG_TYPE_PTR, a3, (tcg_target_long)l->raddr); > - > + tcg_out_ld_helper_args(s, l, &ldst_helper_param); > tcg_out_call_int(s, qemu_ld_helpers[opc & MO_SSIZE], false); > - tcg_out_mov(s, (opc & MO_SIZE) == MO_64, l->datalo_reg, a0); > + tcg_out_ld_helper_ret(s, l, true, &ldst_helper_param); > > tcg_out_goto(s, l->raddr); > return true; > @@ -1023,14 +1019,7 @@ static bool tcg_out_qemu_ld_slow_path(TCGContext *s, TCGLabelQemuLdst *l) > > static bool tcg_out_qemu_st_slow_path(TCGContext *s, TCGLabelQemuLdst *l) > { > - MemOpIdx oi = l->oi; > - MemOp opc = get_memop(oi); > - MemOp s_bits = opc & MO_SIZE; > - TCGReg a0 = tcg_target_call_iarg_regs[0]; > - TCGReg a1 = tcg_target_call_iarg_regs[1]; > - TCGReg a2 = tcg_target_call_iarg_regs[2]; > - TCGReg a3 = tcg_target_call_iarg_regs[3]; > - TCGReg a4 = tcg_target_call_iarg_regs[4]; > + MemOp opc = get_memop(l->oi); > > /* resolve label address */ > if (!reloc_sbimm12(l->label_ptr[0], tcg_splitwx_to_rx(s->code_ptr))) { > @@ -1038,13 +1027,7 @@ static bool tcg_out_qemu_st_slow_path(TCGContext *s, TCGLabelQemuLdst *l) > } > > /* call store helper */ > - tcg_out_mov(s, TCG_TYPE_PTR, a0, TCG_AREG0); > - tcg_out_mov(s, TCG_TYPE_PTR, a1, l->addrlo_reg); > - tcg_out_movext(s, s_bits == MO_64 ? TCG_TYPE_I64 : TCG_TYPE_I32, a2, > - l->type, s_bits, l->datalo_reg); > - tcg_out_movi(s, TCG_TYPE_PTR, a3, oi); > - tcg_out_movi(s, TCG_TYPE_PTR, a4, (tcg_target_long)l->raddr); > - > + tcg_out_st_helper_args(s, l, &ldst_helper_param); > tcg_out_call_int(s, qemu_st_helpers[opc & MO_SIZE], false); > > tcg_out_goto(s, l->raddr);
diff --git a/tcg/riscv/tcg-target.c.inc b/tcg/riscv/tcg-target.c.inc index d4134bc86f..425ea8902e 100644 --- a/tcg/riscv/tcg-target.c.inc +++ b/tcg/riscv/tcg-target.c.inc @@ -994,14 +994,14 @@ static void add_qemu_ldst_label(TCGContext *s, int is_ld, MemOpIdx oi, label->label_ptr[0] = label_ptr[0]; } +/* We have three temps, we might as well expose them. */ +static const TCGLdstHelperParam ldst_helper_param = { + .ntmp = 3, .tmp = { TCG_REG_TMP0, TCG_REG_TMP1, TCG_REG_TMP2 } +}; + static bool tcg_out_qemu_ld_slow_path(TCGContext *s, TCGLabelQemuLdst *l) { - MemOpIdx oi = l->oi; - MemOp opc = get_memop(oi); - TCGReg a0 = tcg_target_call_iarg_regs[0]; - TCGReg a1 = tcg_target_call_iarg_regs[1]; - TCGReg a2 = tcg_target_call_iarg_regs[2]; - TCGReg a3 = tcg_target_call_iarg_regs[3]; + MemOp opc = get_memop(l->oi); /* resolve label address */ if (!reloc_sbimm12(l->label_ptr[0], tcg_splitwx_to_rx(s->code_ptr))) { @@ -1009,13 +1009,9 @@ static bool tcg_out_qemu_ld_slow_path(TCGContext *s, TCGLabelQemuLdst *l) } /* call load helper */ - tcg_out_mov(s, TCG_TYPE_PTR, a0, TCG_AREG0); - tcg_out_mov(s, TCG_TYPE_PTR, a1, l->addrlo_reg); - tcg_out_movi(s, TCG_TYPE_PTR, a2, oi); - tcg_out_movi(s, TCG_TYPE_PTR, a3, (tcg_target_long)l->raddr); - + tcg_out_ld_helper_args(s, l, &ldst_helper_param); tcg_out_call_int(s, qemu_ld_helpers[opc & MO_SSIZE], false); - tcg_out_mov(s, (opc & MO_SIZE) == MO_64, l->datalo_reg, a0); + tcg_out_ld_helper_ret(s, l, true, &ldst_helper_param); tcg_out_goto(s, l->raddr); return true; @@ -1023,14 +1019,7 @@ static bool tcg_out_qemu_ld_slow_path(TCGContext *s, TCGLabelQemuLdst *l) static bool tcg_out_qemu_st_slow_path(TCGContext *s, TCGLabelQemuLdst *l) { - MemOpIdx oi = l->oi; - MemOp opc = get_memop(oi); - MemOp s_bits = opc & MO_SIZE; - TCGReg a0 = tcg_target_call_iarg_regs[0]; - TCGReg a1 = tcg_target_call_iarg_regs[1]; - TCGReg a2 = tcg_target_call_iarg_regs[2]; - TCGReg a3 = tcg_target_call_iarg_regs[3]; - TCGReg a4 = tcg_target_call_iarg_regs[4]; + MemOp opc = get_memop(l->oi); /* resolve label address */ if (!reloc_sbimm12(l->label_ptr[0], tcg_splitwx_to_rx(s->code_ptr))) { @@ -1038,13 +1027,7 @@ static bool tcg_out_qemu_st_slow_path(TCGContext *s, TCGLabelQemuLdst *l) } /* call store helper */ - tcg_out_mov(s, TCG_TYPE_PTR, a0, TCG_AREG0); - tcg_out_mov(s, TCG_TYPE_PTR, a1, l->addrlo_reg); - tcg_out_movext(s, s_bits == MO_64 ? TCG_TYPE_I64 : TCG_TYPE_I32, a2, - l->type, s_bits, l->datalo_reg); - tcg_out_movi(s, TCG_TYPE_PTR, a3, oi); - tcg_out_movi(s, TCG_TYPE_PTR, a4, (tcg_target_long)l->raddr); - + tcg_out_st_helper_args(s, l, &ldst_helper_param); tcg_out_call_int(s, qemu_st_helpers[opc & MO_SIZE], false); tcg_out_goto(s, l->raddr);
Use tcg_out_ld_helper_args, tcg_out_ld_helper_ret, and tcg_out_st_helper_args. Signed-off-by: Richard Henderson <richard.henderson@linaro.org> --- tcg/riscv/tcg-target.c.inc | 37 ++++++++++--------------------------- 1 file changed, 10 insertions(+), 27 deletions(-)