diff mbox series

[v2,21/36] tcg: Use tcg_out_dupi_vec from temp_load

Message ID 20200422011722.13287-22-richard.henderson@linaro.org
State Superseded
Headers show
Series tcg 5.1 omnibus patch set | expand

Commit Message

Richard Henderson April 22, 2020, 1:17 a.m. UTC
Having dupi pass though movi is confusing and arguably wrong.

Signed-off-by: Richard Henderson <richard.henderson@linaro.org>

---
 tcg/aarch64/tcg-target.inc.c |  7 ----
 tcg/i386/tcg-target.inc.c    | 63 ++++++++++++++++++++++++------------
 tcg/ppc/tcg-target.inc.c     |  6 ----
 tcg/tcg.c                    |  8 ++++-
 4 files changed, 49 insertions(+), 35 deletions(-)

-- 
2.20.1

Comments

Alex Bennée April 22, 2020, 7:28 p.m. UTC | #1
Richard Henderson <richard.henderson@linaro.org> writes:

> Having dupi pass though movi is confusing and arguably wrong.

>

> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>


Reviewed-by: Alex Bennée <alex.bennee@linaro.org>


> ---

>  tcg/aarch64/tcg-target.inc.c |  7 ----

>  tcg/i386/tcg-target.inc.c    | 63 ++++++++++++++++++++++++------------

>  tcg/ppc/tcg-target.inc.c     |  6 ----

>  tcg/tcg.c                    |  8 ++++-

>  4 files changed, 49 insertions(+), 35 deletions(-)

>

> diff --git a/tcg/aarch64/tcg-target.inc.c b/tcg/aarch64/tcg-target.inc.c

> index 7918aeb9d5..e5c9ab70a9 100644

> --- a/tcg/aarch64/tcg-target.inc.c

> +++ b/tcg/aarch64/tcg-target.inc.c

> @@ -1009,13 +1009,6 @@ static void tcg_out_movi(TCGContext *s, TCGType type, TCGReg rd,

>      case TCG_TYPE_I64:

>          tcg_debug_assert(rd < 32);

>          break;

> -

> -    case TCG_TYPE_V64:

> -    case TCG_TYPE_V128:

> -        tcg_debug_assert(rd >= 32);

> -        tcg_out_dupi_vec(s, type, rd, value);

> -        return;

> -

>      default:

>          g_assert_not_reached();

>      }

> diff --git a/tcg/i386/tcg-target.inc.c b/tcg/i386/tcg-target.inc.c

> index 320a4bddd1..07424f7ef9 100644

> --- a/tcg/i386/tcg-target.inc.c

> +++ b/tcg/i386/tcg-target.inc.c

> @@ -977,30 +977,32 @@ static void tcg_out_dupi_vec(TCGContext *s, TCGType type,

>      }

>  }

>  

> -static void tcg_out_movi(TCGContext *s, TCGType type,

> -                         TCGReg ret, tcg_target_long arg)

> +static void tcg_out_movi_vec(TCGContext *s, TCGType type,

> +                             TCGReg ret, tcg_target_long arg)

> +{

> +    if (arg == 0) {

> +        tcg_out_vex_modrm(s, OPC_PXOR, ret, ret, ret);

> +        return;

> +    }

> +    if (arg == -1) {

> +        tcg_out_vex_modrm(s, OPC_PCMPEQB, ret, ret, ret);

> +        return;

> +    }

> +

> +    int rexw = (type == TCG_TYPE_I32 ? 0 : P_REXW);

> +    tcg_out_vex_modrm_pool(s, OPC_MOVD_VyEy + rexw, ret);

> +    if (TCG_TARGET_REG_BITS == 64) {

> +        new_pool_label(s, arg, R_386_PC32, s->code_ptr - 4, -4);

> +    } else {

> +        new_pool_label(s, arg, R_386_32, s->code_ptr - 4, 0);

> +    }

> +}

> +

> +static void tcg_out_movi_int(TCGContext *s, TCGType type,

> +                             TCGReg ret, tcg_target_long arg)

>  {

>      tcg_target_long diff;

>  

> -    switch (type) {

> -    case TCG_TYPE_I32:

> -#if TCG_TARGET_REG_BITS == 64

> -    case TCG_TYPE_I64:

> -#endif

> -        if (ret < 16) {

> -            break;

> -        }

> -        /* fallthru */

> -    case TCG_TYPE_V64:

> -    case TCG_TYPE_V128:

> -    case TCG_TYPE_V256:

> -        tcg_debug_assert(ret >= 16);

> -        tcg_out_dupi_vec(s, type, ret, arg);

> -        return;

> -    default:

> -        g_assert_not_reached();

> -    }

> -

>      if (arg == 0) {

>          tgen_arithr(s, ARITH_XOR, ret, ret);

>          return;

> @@ -1029,6 +1031,25 @@ static void tcg_out_movi(TCGContext *s, TCGType type,

>      tcg_out64(s, arg);

>  }

>  

> +static void tcg_out_movi(TCGContext *s, TCGType type,

> +                         TCGReg ret, tcg_target_long arg)

> +{

> +    switch (type) {

> +    case TCG_TYPE_I32:

> +#if TCG_TARGET_REG_BITS == 64

> +    case TCG_TYPE_I64:

> +#endif

> +        if (ret < 16) {

> +            tcg_out_movi_int(s, type, ret, arg);

> +        } else {

> +            tcg_out_movi_vec(s, type, ret, arg);

> +        }

> +        break;

> +    default:

> +        g_assert_not_reached();

> +    }

> +}

> +

>  static inline void tcg_out_pushi(TCGContext *s, tcg_target_long val)

>  {

>      if (val == (int8_t)val) {

> diff --git a/tcg/ppc/tcg-target.inc.c b/tcg/ppc/tcg-target.inc.c

> index fb390ad978..7ab1e32064 100644

> --- a/tcg/ppc/tcg-target.inc.c

> +++ b/tcg/ppc/tcg-target.inc.c

> @@ -987,12 +987,6 @@ static void tcg_out_movi(TCGContext *s, TCGType type, TCGReg ret,

>          tcg_out_movi_int(s, type, ret, arg, false);

>          break;

>  

> -    case TCG_TYPE_V64:

> -    case TCG_TYPE_V128:

> -        tcg_debug_assert(ret >= TCG_REG_V0);

> -        tcg_out_dupi_vec(s, type, ret, arg);

> -        break;

> -

>      default:

>          g_assert_not_reached();

>      }

> diff --git a/tcg/tcg.c b/tcg/tcg.c

> index adb71f16ae..4f1ed1d2fe 100644

> --- a/tcg/tcg.c

> +++ b/tcg/tcg.c

> @@ -3359,7 +3359,13 @@ static void temp_load(TCGContext *s, TCGTemp *ts, TCGRegSet desired_regs,

>      case TEMP_VAL_CONST:

>          reg = tcg_reg_alloc(s, desired_regs, allocated_regs,

>                              preferred_regs, ts->indirect_base);

> -        tcg_out_movi(s, ts->type, reg, ts->val);

> +        if (ts->type <= TCG_TYPE_I64) {

> +            tcg_out_movi(s, ts->type, reg, ts->val);

> +        } else if (TCG_TARGET_REG_BITS == 64) {

> +            tcg_out_dupi_vec(s, ts->type, reg, ts->val);

> +        } else {

> +            tcg_out_dupi_vec(s, ts->type, reg, dup_const(MO_32, ts->val));

> +        }

>          ts->mem_coherent = 0;

>          break;

>      case TEMP_VAL_MEM:



-- 
Alex Bennée
diff mbox series

Patch

diff --git a/tcg/aarch64/tcg-target.inc.c b/tcg/aarch64/tcg-target.inc.c
index 7918aeb9d5..e5c9ab70a9 100644
--- a/tcg/aarch64/tcg-target.inc.c
+++ b/tcg/aarch64/tcg-target.inc.c
@@ -1009,13 +1009,6 @@  static void tcg_out_movi(TCGContext *s, TCGType type, TCGReg rd,
     case TCG_TYPE_I64:
         tcg_debug_assert(rd < 32);
         break;
-
-    case TCG_TYPE_V64:
-    case TCG_TYPE_V128:
-        tcg_debug_assert(rd >= 32);
-        tcg_out_dupi_vec(s, type, rd, value);
-        return;
-
     default:
         g_assert_not_reached();
     }
diff --git a/tcg/i386/tcg-target.inc.c b/tcg/i386/tcg-target.inc.c
index 320a4bddd1..07424f7ef9 100644
--- a/tcg/i386/tcg-target.inc.c
+++ b/tcg/i386/tcg-target.inc.c
@@ -977,30 +977,32 @@  static void tcg_out_dupi_vec(TCGContext *s, TCGType type,
     }
 }
 
-static void tcg_out_movi(TCGContext *s, TCGType type,
-                         TCGReg ret, tcg_target_long arg)
+static void tcg_out_movi_vec(TCGContext *s, TCGType type,
+                             TCGReg ret, tcg_target_long arg)
+{
+    if (arg == 0) {
+        tcg_out_vex_modrm(s, OPC_PXOR, ret, ret, ret);
+        return;
+    }
+    if (arg == -1) {
+        tcg_out_vex_modrm(s, OPC_PCMPEQB, ret, ret, ret);
+        return;
+    }
+
+    int rexw = (type == TCG_TYPE_I32 ? 0 : P_REXW);
+    tcg_out_vex_modrm_pool(s, OPC_MOVD_VyEy + rexw, ret);
+    if (TCG_TARGET_REG_BITS == 64) {
+        new_pool_label(s, arg, R_386_PC32, s->code_ptr - 4, -4);
+    } else {
+        new_pool_label(s, arg, R_386_32, s->code_ptr - 4, 0);
+    }
+}
+
+static void tcg_out_movi_int(TCGContext *s, TCGType type,
+                             TCGReg ret, tcg_target_long arg)
 {
     tcg_target_long diff;
 
-    switch (type) {
-    case TCG_TYPE_I32:
-#if TCG_TARGET_REG_BITS == 64
-    case TCG_TYPE_I64:
-#endif
-        if (ret < 16) {
-            break;
-        }
-        /* fallthru */
-    case TCG_TYPE_V64:
-    case TCG_TYPE_V128:
-    case TCG_TYPE_V256:
-        tcg_debug_assert(ret >= 16);
-        tcg_out_dupi_vec(s, type, ret, arg);
-        return;
-    default:
-        g_assert_not_reached();
-    }
-
     if (arg == 0) {
         tgen_arithr(s, ARITH_XOR, ret, ret);
         return;
@@ -1029,6 +1031,25 @@  static void tcg_out_movi(TCGContext *s, TCGType type,
     tcg_out64(s, arg);
 }
 
+static void tcg_out_movi(TCGContext *s, TCGType type,
+                         TCGReg ret, tcg_target_long arg)
+{
+    switch (type) {
+    case TCG_TYPE_I32:
+#if TCG_TARGET_REG_BITS == 64
+    case TCG_TYPE_I64:
+#endif
+        if (ret < 16) {
+            tcg_out_movi_int(s, type, ret, arg);
+        } else {
+            tcg_out_movi_vec(s, type, ret, arg);
+        }
+        break;
+    default:
+        g_assert_not_reached();
+    }
+}
+
 static inline void tcg_out_pushi(TCGContext *s, tcg_target_long val)
 {
     if (val == (int8_t)val) {
diff --git a/tcg/ppc/tcg-target.inc.c b/tcg/ppc/tcg-target.inc.c
index fb390ad978..7ab1e32064 100644
--- a/tcg/ppc/tcg-target.inc.c
+++ b/tcg/ppc/tcg-target.inc.c
@@ -987,12 +987,6 @@  static void tcg_out_movi(TCGContext *s, TCGType type, TCGReg ret,
         tcg_out_movi_int(s, type, ret, arg, false);
         break;
 
-    case TCG_TYPE_V64:
-    case TCG_TYPE_V128:
-        tcg_debug_assert(ret >= TCG_REG_V0);
-        tcg_out_dupi_vec(s, type, ret, arg);
-        break;
-
     default:
         g_assert_not_reached();
     }
diff --git a/tcg/tcg.c b/tcg/tcg.c
index adb71f16ae..4f1ed1d2fe 100644
--- a/tcg/tcg.c
+++ b/tcg/tcg.c
@@ -3359,7 +3359,13 @@  static void temp_load(TCGContext *s, TCGTemp *ts, TCGRegSet desired_regs,
     case TEMP_VAL_CONST:
         reg = tcg_reg_alloc(s, desired_regs, allocated_regs,
                             preferred_regs, ts->indirect_base);
-        tcg_out_movi(s, ts->type, reg, ts->val);
+        if (ts->type <= TCG_TYPE_I64) {
+            tcg_out_movi(s, ts->type, reg, ts->val);
+        } else if (TCG_TARGET_REG_BITS == 64) {
+            tcg_out_dupi_vec(s, ts->type, reg, ts->val);
+        } else {
+            tcg_out_dupi_vec(s, ts->type, reg, dup_const(MO_32, ts->val));
+        }
         ts->mem_coherent = 0;
         break;
     case TEMP_VAL_MEM: