Message ID | 20230408030359.3368868-6-richard.henderson@linaro.org |
---|---|
State | Superseded |
Headers | show |
Series | tcg/mips: Backend improvements | expand |
On 8/4/23 05:03, Richard Henderson wrote: > Emit all constants that can be loaded in exactly one insn. > > Signed-off-by: Richard Henderson <richard.henderson@linaro.org> > --- > tcg/mips/tcg-target.c.inc | 26 ++++++++++++++++++++------ > 1 file changed, 20 insertions(+), 6 deletions(-) Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
On 8/4/23 05:03, Richard Henderson wrote: > Emit all constants that can be loaded in exactly one insn. > > Signed-off-by: Richard Henderson <richard.henderson@linaro.org> > --- > tcg/mips/tcg-target.c.inc | 26 ++++++++++++++++++++------ > 1 file changed, 20 insertions(+), 6 deletions(-) > > diff --git a/tcg/mips/tcg-target.c.inc b/tcg/mips/tcg-target.c.inc > index c2f8d6550b..f0ae418ba6 100644 > --- a/tcg/mips/tcg-target.c.inc > +++ b/tcg/mips/tcg-target.c.inc > @@ -514,20 +514,34 @@ static bool tcg_out_mov(TCGContext *s, TCGType type, TCGReg ret, TCGReg arg) > return true; > } > > +static bool tcg_out_movi_one(TCGContext *s, TCGReg ret, tcg_target_long arg) > +{ > + if (arg == (int16_t)arg) { > + tcg_out_opc_imm(s, OPC_ADDIU, ret, TCG_REG_ZERO, arg); > + return true; > + } > + if (arg == (uint16_t)arg) { > + tcg_out_opc_imm(s, OPC_ORI, ret, TCG_REG_ZERO, arg); > + return true; > + } > + if (arg == (int32_t)arg && (arg & 0xffff) == 0) { > + tcg_out_opc_imm(s, OPC_LUI, ret, TCG_REG_ZERO, arg >> 16); > + return true; > + } > + return false; > +} > + > static void tcg_out_movi(TCGContext *s, TCGType type, > TCGReg ret, tcg_target_long arg) > { > if (TCG_TARGET_REG_BITS == 64 && type == TCG_TYPE_I32) { > arg = (int32_t)arg; > } > - if (arg == (int16_t)arg) { > - tcg_out_opc_imm(s, OPC_ADDIU, ret, TCG_REG_ZERO, arg); > - return; > - } > - if (arg == (uint16_t)arg) { > - tcg_out_opc_imm(s, OPC_ORI, ret, TCG_REG_ZERO, arg); > + > + if (tcg_out_movi_one(s, ret, arg)) { > return; > } > + > if (TCG_TARGET_REG_BITS == 32 || arg == (int32_t)arg) { > tcg_out_opc_imm(s, OPC_LUI, ret, TCG_REG_ZERO, arg >> 16); Shouldn't this block be removed in this patch? > } else {
On 4/11/23 14:34, Philippe Mathieu-Daudé wrote: >> + if (tcg_out_movi_one(s, ret, arg)) { >> return; >> } >> + >> if (TCG_TARGET_REG_BITS == 32 || arg == (int32_t)arg) { >> tcg_out_opc_imm(s, OPC_LUI, ret, TCG_REG_ZERO, arg >> 16); > > Shouldn't this block be removed in this patch? No, because it feeds into the lui+ori path. It gets cleaned up in the next patch. r~
diff --git a/tcg/mips/tcg-target.c.inc b/tcg/mips/tcg-target.c.inc index c2f8d6550b..f0ae418ba6 100644 --- a/tcg/mips/tcg-target.c.inc +++ b/tcg/mips/tcg-target.c.inc @@ -514,20 +514,34 @@ static bool tcg_out_mov(TCGContext *s, TCGType type, TCGReg ret, TCGReg arg) return true; } +static bool tcg_out_movi_one(TCGContext *s, TCGReg ret, tcg_target_long arg) +{ + if (arg == (int16_t)arg) { + tcg_out_opc_imm(s, OPC_ADDIU, ret, TCG_REG_ZERO, arg); + return true; + } + if (arg == (uint16_t)arg) { + tcg_out_opc_imm(s, OPC_ORI, ret, TCG_REG_ZERO, arg); + return true; + } + if (arg == (int32_t)arg && (arg & 0xffff) == 0) { + tcg_out_opc_imm(s, OPC_LUI, ret, TCG_REG_ZERO, arg >> 16); + return true; + } + return false; +} + static void tcg_out_movi(TCGContext *s, TCGType type, TCGReg ret, tcg_target_long arg) { if (TCG_TARGET_REG_BITS == 64 && type == TCG_TYPE_I32) { arg = (int32_t)arg; } - if (arg == (int16_t)arg) { - tcg_out_opc_imm(s, OPC_ADDIU, ret, TCG_REG_ZERO, arg); - return; - } - if (arg == (uint16_t)arg) { - tcg_out_opc_imm(s, OPC_ORI, ret, TCG_REG_ZERO, arg); + + if (tcg_out_movi_one(s, ret, arg)) { return; } + if (TCG_TARGET_REG_BITS == 32 || arg == (int32_t)arg) { tcg_out_opc_imm(s, OPC_LUI, ret, TCG_REG_ZERO, arg >> 16); } else {
Emit all constants that can be loaded in exactly one insn. Signed-off-by: Richard Henderson <richard.henderson@linaro.org> --- tcg/mips/tcg-target.c.inc | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-)