diff mbox series

[05/12] tcg/mips: Split out tcg_out_movi_one

Message ID 20230408030359.3368868-6-richard.henderson@linaro.org
State New
Headers show
Series tcg/mips: Backend improvements | expand

Commit Message

Richard Henderson April 8, 2023, 3:03 a.m. UTC
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(-)

Comments

Philippe Mathieu-Daudé April 11, 2023, 12:29 p.m. UTC | #1
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>
Philippe Mathieu-Daudé April 11, 2023, 12:34 p.m. UTC | #2
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 {
Richard Henderson April 12, 2023, 6:55 a.m. UTC | #3
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 mbox series

Patch

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 {