]> gcc.gnu.org Git - gcc.git/commitdiff
Merge commit 'refs/users/meissner/heads/work134-vsubreg' of git+ssh://gcc.gnu.org...
authorMichael Meissner <meissner@linux.ibm.com>
Fri, 15 Sep 2023 17:40:27 +0000 (13:40 -0400)
committerMichael Meissner <meissner@linux.ibm.com>
Fri, 15 Sep 2023 17:40:27 +0000 (13:40 -0400)
gcc/config/rs6000/mma.md
gcc/config/rs6000/rs6000.cc
gcc/config/rs6000/rs6000.md
gcc/config/rs6000/rs6000.opt
gcc/config/rs6000/vector.md
gcc/config/rs6000/vsx.md
gcc/testsuite/gcc.target/powerpc/p10-lxvp-stxvp.c [new file with mode: 0644]

index 575751d477e33716fce09f60a633b70027815491..70ba5b70c1b60e79fe8368b71c6a819aa917afa9 100644 (file)
 })
 
 (define_insn_and_split "*movoo"
-  [(set (match_operand:OO 0 "nonimmediate_operand" "=wa,ZwO,wa")
-       (match_operand:OO 1 "input_operand" "ZwO,wa,wa"))]
+  [(set (match_operand:OO 0 "nonimmediate_operand" "=wa,wa,ZwO,QwO,wa")
+       (match_operand:OO 1 "input_operand" "ZwO,QwO,wa,wa,wa"))]
   "TARGET_MMA
    && (gpc_reg_operand (operands[0], OOmode)
        || gpc_reg_operand (operands[1], OOmode))"
   "@
    lxvp%X1 %x0,%1
+   #
    stxvp%X0 %x1,%0
+   #
    #"
   "&& reload_completed
-   && (!MEM_P (operands[0]) && !MEM_P (operands[1]))"
+   && ((MEM_P (operands[0]) && !TARGET_STXVP)
+       || (MEM_P (operands[1]) && !TARGET_LXVP)
+       || (!MEM_P (operands[0]) && !MEM_P (operands[1])))"
   [(const_int 0)]
 {
   rs6000_split_multireg_move (operands[0], operands[1]);
   DONE;
 }
-  [(set_attr "type" "vecload,vecstore,veclogical")
+  [(set_attr "type" "vecload,vecload,vecstore,vecstore,veclogical")
    (set_attr "size" "256")
-   (set_attr "length" "*,*,8")])
+   (set_attr "length" "*,8,*,8,8")
+   (set_attr "isa" "lxvp,*,stxvp,*,*")])
 
 \f
 ;; Vector quad support.  XOmode can only live in FPRs.
index efe9adce1f8b21e381cd38baee3fe45f5eea1631..4bfc62d930bdda745aca3625df1535cbcdafe5ca 100644 (file)
@@ -2576,6 +2576,12 @@ rs6000_debug_reg_global (void)
   if (TARGET_DIRECT_MOVE_128)
     fprintf (stderr, DEBUG_FMT_D, "VSX easy 64-bit mfvsrld element",
             (int)VECTOR_ELEMENT_MFVSRLD_64BIT);
+
+  if (TARGET_MMA)
+    fprintf (stderr, DEBUG_FMT_ID "%s, %s\n",
+            "vector_pair",
+            TARGET_LXVP ? "lxvp" : "no-lxvp",
+            TARGET_STXVP ? "stxvp" : "no-stxvp");
 }
 
 \f
@@ -2711,7 +2717,9 @@ rs6000_setup_reg_addr_masks (void)
          /* Vector pairs can do both indexed and offset loads if the
             instructions are enabled, otherwise they can only do offset loads
             since it will be broken into two vector moves.  Vector quads can
-            only do offset loads.  */
+            only do offset loads.  If the user restricted generation of either
+            of the LXVP or STXVP instructions, do not allow indexed mode so
+            that we can split the load/store.  */
          else if ((addr_mask != 0) && TARGET_MMA
                   && (m2 == OOmode || m2 == XOmode))
            {
@@ -2719,7 +2727,7 @@ rs6000_setup_reg_addr_masks (void)
              if (rc == RELOAD_REG_FPR || rc == RELOAD_REG_VMX)
                {
                  addr_mask |= RELOAD_REG_QUAD_OFFSET;
-                 if (m2 == OOmode)
+                 if (m2 == OOmode && TARGET_LXVP && TARGET_STXVP)
                    addr_mask |= RELOAD_REG_INDEXED;
                }
            }
@@ -4405,6 +4413,18 @@ rs6000_option_override_internal (bool global_init_p)
       rs6000_isa_flags &= ~OPTION_MASK_MMA;
     }
 
+  /* Warn if -mlxvp or -mstxvp are used and MMA is not set.  */
+  if (!TARGET_MMA)
+    {
+      if (TARGET_LXVP && OPTION_SET_P(TARGET_LXVP))
+       warning (0, "%qs should not be used unless you use %qs",
+                "-mlxvp", "-mmma");
+
+      if (TARGET_STXVP && OPTION_SET_P(TARGET_STXVP))
+       warning (0, "%qs should not be used unless you use %qs",
+                "-mstxvp", "-mmma");
+    }
+
   /* Enable power10 fusion if we are tuning for power10, even if we aren't
      generating power10 instructions.  */
   if (!(rs6000_isa_flags_explicit & OPTION_MASK_P10_FUSION))
@@ -24324,6 +24344,12 @@ static struct rs6000_opt_var const rs6000_opt_vars[] =
   { "speculate-indirect-jumps",
     offsetof (struct gcc_options, x_rs6000_speculate_indirect_jumps),
     offsetof (struct cl_target_option, x_rs6000_speculate_indirect_jumps), },
+  { "lxvp",
+    offsetof (struct gcc_options, x_TARGET_LXVP),
+    offsetof (struct cl_target_option, x_TARGET_LXVP), },
+  { "stxvp",
+    offsetof (struct gcc_options, x_TARGET_STXVP),
+    offsetof (struct cl_target_option, x_TARGET_STXVP), },
 };
 
 /* Inner function to handle attribute((target("..."))) and #pragma GCC target
index 1a9a7b1a47918f39fc91038607f21a8ba9a2e740..02de5afcd18f7d9dee400d974c6667358600dbdf 100644 (file)
    UNSPEC_TOCREL
    UNSPEC_MACHOPIC_OFFSET
    UNSPEC_BPERM
-   UNSPEC_COPYSIGN
    UNSPEC_PARITY
    UNSPEC_CMPB
    UNSPEC_FCTIW
   (const (symbol_ref "(enum attr_cpu) rs6000_tune")))
 
 ;; The ISA we implement.
-(define_attr "isa" "any,p5,p6,p7,p7v,p8v,p9,p9v,p9kf,p9tf,p10"
+(define_attr "isa" "any,p5,p6,p7,p7v,p8v,p9,p9v,p9kf,p9tf,p10,lxvp,stxvp"
   (const_string "any"))
 
 ;; Is this alternative enabled for the current CPU/ISA/etc.?
      (and (eq_attr "isa" "p10")
          (match_test "TARGET_POWER10"))
      (const_int 1)
+
+     (and (eq_attr "isa" "lxvp")
+         (match_test "TARGET_LXVP"))
+     (const_int 1)
+
+     (and (eq_attr "isa" "stxvp")
+         (match_test "TARGET_STXVP"))
+     (const_int 1)
     ] (const_int 0)))
 
 ;; If this instruction is microcoded on the CELL processor
 ;; compiler from optimizing -0.0
 (define_insn "copysign<mode>3_fcpsgn"
   [(set (match_operand:SFDF 0 "gpc_reg_operand" "=d,wa")
-       (unspec:SFDF [(match_operand:SFDF 1 "gpc_reg_operand" "d,wa")
-                     (match_operand:SFDF 2 "gpc_reg_operand" "d,wa")]
-                    UNSPEC_COPYSIGN))]
+       (copysign:SFDF (match_operand:SFDF 1 "gpc_reg_operand" "d,wa") 
+                      (match_operand:SFDF 2 "gpc_reg_operand" "d,wa")))]
   "TARGET_HARD_FLOAT && (TARGET_CMPB || VECTOR_UNIT_VSX_P (<MODE>mode))"
   "@
    fcpsgn %0,%2,%1
 
 (define_insn "copysign<mode>3_hard"
   [(set (match_operand:IEEE128 0 "altivec_register_operand" "=v")
-       (unspec:IEEE128
-        [(match_operand:IEEE128 1 "altivec_register_operand" "v")
-         (match_operand:IEEE128 2 "altivec_register_operand" "v")]
-        UNSPEC_COPYSIGN))]
+       (copysign:IEEE128
+        (match_operand:IEEE128 1 "altivec_register_operand" "v")
+        (match_operand:IEEE128 2 "altivec_register_operand" "v")))]
   "TARGET_FLOAT128_HW && FLOAT128_IEEE_P (<MODE>mode)"
    "xscpsgnqp %0,%2,%1"
   [(set_attr "type" "vecmove")
 
 (define_insn "copysign<mode>3_soft"
   [(set (match_operand:IEEE128 0 "altivec_register_operand" "=v")
-       (unspec:IEEE128
-        [(match_operand:IEEE128 1 "altivec_register_operand" "v")
-         (match_operand:IEEE128 2 "altivec_register_operand" "v")]
-        UNSPEC_COPYSIGN))
+       (copysign:IEEE128
+        (match_operand:IEEE128 1 "altivec_register_operand" "v")
+        (match_operand:IEEE128 2 "altivec_register_operand" "v")))
    (clobber (match_scratch:IEEE128 3 "=&v"))]
   "!TARGET_FLOAT128_HW && FLOAT128_IEEE_P (<MODE>mode)"
    "xscpsgndp %x3,%x2,%x1\;xxpermdi %x0,%x3,%x1,1"
index bde6d3ff664bc6c53134cedbe44ad97b3fbe7bd1..663f0578f3055289db0484e21e37e39ded0f3758 100644 (file)
@@ -597,6 +597,14 @@ mmma
 Target Mask(MMA) Var(rs6000_isa_flags)
 Generate (do not generate) MMA instructions.
 
+mlxvp
+Target Undocumented Var(TARGET_LXVP) Init(1) Save
+Generate (do not generate) the LXVP instruction if -mmma is enabled.
+
+mstxvp
+Target Undocumented Var(TARGET_STXVP) Init(1) Save
+Generate (do not generate) the STXVP instruction if -mmma is enabled.
+
 mrelative-jumptables
 Target Undocumented Var(rs6000_relative_jumptables) Init(1) Save
 
index 1ae04c8e0a801bfe8ab7caeff9b465467e8ae62b..f4fc620b6531584c0d562229f8e689043e7873e3 100644 (file)
 
 (define_expand "vector_copysign<mode>3"
   [(set (match_operand:VEC_F 0 "vfloat_operand")
-       (unspec:VEC_F [(match_operand:VEC_F 1 "vfloat_operand")
-                      (match_operand:VEC_F 2 "vfloat_operand")] UNSPEC_COPYSIGN))]
+       (copysign:VEC_F (match_operand:VEC_F 1 "vfloat_operand")
+                       (match_operand:VEC_F 2 "vfloat_operand")))]
   "VECTOR_UNIT_ALTIVEC_OR_VSX_P (<MODE>mode)"
 {
   if (<MODE>mode == V4SFmode && VECTOR_UNIT_ALTIVEC_P (<MODE>mode))
index 19abfeb565a6fe201b0ff431ca5c23575a22e80e..9011a3f7e4099cc6ecc177ef35069a0cd19d127e 100644 (file)
 ;; Copy sign
 (define_insn "vsx_copysign<mode>3"
   [(set (match_operand:VSX_F 0 "vsx_register_operand" "=wa")
-       (unspec:VSX_F
-        [(match_operand:VSX_F 1 "vsx_register_operand" "wa")
-         (match_operand:VSX_F 2 "vsx_register_operand" "wa")]
-        UNSPEC_COPYSIGN))]
+       (copysign:VSX_F
+        (match_operand:VSX_F 1 "vsx_register_operand" "wa")
+        (match_operand:VSX_F 2 "vsx_register_operand" "wa")))]
   "VECTOR_UNIT_VSX_P (<MODE>mode)"
   "xvcpsgn<sd>p %x0,%x2,%x1"
   [(set_attr "type" "<VStype_simple>")])
diff --git a/gcc/testsuite/gcc.target/powerpc/p10-lxvp-stxvp.c b/gcc/testsuite/gcc.target/powerpc/p10-lxvp-stxvp.c
new file mode 100644 (file)
index 0000000..25f6df4
--- /dev/null
@@ -0,0 +1,56 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target power10_ok } */
+/* { dg-options "-mdejagnu-cpu=power10 -O2" } */
+
+#include <stddef.h>
+
+/* Test whether we can control lxvp and stxvp.  */
+
+#pragma GCC target ("no-lxvp,no-stxvp")
+
+void
+no_vector_pair (__vector_pair *dest,
+               __vector_pair *src,
+               size_t n,
+               size_t m)
+{
+  dest[n] = src[m];            /* 2 lxv + 2 stxv.  */
+}
+
+#pragma GCC target ("lxvp,no-stxvp")
+
+void
+vector_pair_load (__vector_pair *dest,
+                 __vector_pair *src,
+                 size_t n,
+                 size_t m)
+{
+  dest[n] = src[m];            /* 1 lxvpx + 2 stxv.  */
+}
+
+#pragma GCC target ("no-lxvp,stxvp")
+
+void
+vector_pair_store (__vector_pair *dest,
+                  __vector_pair *src,
+                  size_t n,
+                  size_t m)
+{
+  dest[n] = src[m];            /* 2 lxv + 1 stxvpx.  */
+}
+
+#pragma GCC target ("lxvp,stxvp")
+
+void
+vector_pair_both (__vector_pair *dest,
+                 __vector_pair *src,
+                 size_t n,
+                 size_t m)
+{
+  dest[n] = src[m];            /* 1 lxvpx + 1 stxvpx.  */
+}
+
+/* { dg-final { scan-assembler-times {\mlxv\M}    4 } } */
+/* { dg-final { scan-assembler-times {\mlxvpx\M}  2 } } */
+/* { dg-final { scan-assembler-times {\mstxv\M}   4 } } */
+/* { dg-final { scan-assembler-times {\mstxvpx\M} 2 } } */
This page took 0.094058 seconds and 5 git commands to generate.