https://gcc.gnu.org/g:4cf5e261df34878033e20fb2b8a13ea643ab7f4c

commit r15-7052-g4cf5e261df34878033e20fb2b8a13ea643ab7f4c
Author: Stefan Schulze Frielinghaus <stefa...@gcc.gnu.org>
Date:   Mon Jan 20 10:01:10 2025 +0100

    s390: arch15: Vector load positive: Add 128-bit integer support
    
    For previous architectures emulate operation abs.
    
    gcc/ChangeLog:
    
            * config/s390/s390-builtins.def (s390_vec_abs_s128): Add.
            (s390_vlpq): Add.
            * config/s390/s390-builtin-types.def: Update accordingly.
            * config/s390/vector.md (abs<mode>2): Emulate w/o VXE3.
            (*abs<mode>2): Add 128-bit variant.
            (*vec_sel0<mode>): Make it a ...
            (vec_sel0<mode>): named pattern.
    
    gcc/testsuite/ChangeLog:
    
            * gcc.target/s390/vector/vec-abs-emu.c: New test.

Diff:
---
 gcc/config/s390/s390-builtin-types.def             |  1 +
 gcc/config/s390/s390-builtins.def                  |  2 +
 gcc/config/s390/vector.md                          | 29 +++++++++++---
 gcc/testsuite/gcc.target/s390/vector/vec-abs-emu.c | 46 ++++++++++++++++++++++
 4 files changed, 73 insertions(+), 5 deletions(-)

diff --git a/gcc/config/s390/s390-builtin-types.def 
b/gcc/config/s390/s390-builtin-types.def
index 7aeea343126a..398ea6eb60a1 100644
--- a/gcc/config/s390/s390-builtin-types.def
+++ b/gcc/config/s390/s390-builtin-types.def
@@ -136,6 +136,7 @@ DEF_OPAQUE_VECTOR_TYPE (BT_OV4SI, BT_INT, 4)
 DEF_FN_TYPE_0 (BT_FN_INT, BT_INT)
 DEF_FN_TYPE_0 (BT_FN_UINT, BT_UINT)
 DEF_FN_TYPE_0 (BT_FN_VOID, BT_VOID)
+DEF_FN_TYPE_1 (BT_FN_INT128_INT128, BT_INT128, BT_INT128)
 DEF_FN_TYPE_1 (BT_FN_INT128_V2DI, BT_INT128, BT_V2DI)
 DEF_FN_TYPE_1 (BT_FN_INT_INT, BT_INT, BT_INT)
 DEF_FN_TYPE_1 (BT_FN_INT_VOIDPTR, BT_INT, BT_VOIDPTR)
diff --git a/gcc/config/s390/s390-builtins.def 
b/gcc/config/s390/s390-builtins.def
index 9c3334453b81..32ec2eb8a416 100644
--- a/gcc/config/s390/s390-builtins.def
+++ b/gcc/config/s390/s390-builtins.def
@@ -1820,6 +1820,7 @@ OB_DEF_VAR (s390_vec_abs_s8,            s390_vlpb,        
  0,
 OB_DEF_VAR (s390_vec_abs_s16,           s390_vlph,          0,                 
 0,                  BT_OV_V8HI_V8HI)
 OB_DEF_VAR (s390_vec_abs_s32,           s390_vlpf,          0,                 
 0,                  BT_OV_V4SI_V4SI)
 OB_DEF_VAR (s390_vec_abs_s64,           s390_vlpg,          0,                 
 0,                  BT_OV_V2DI_V2DI)
+OB_DEF_VAR (s390_vec_abs_s128,          s390_vlpq,          0,                 
 0,                  BT_OV_V1TI_V1TI)    /* NOGEN */
 OB_DEF_VAR (s390_vec_abs_flt,           s390_vflpsb,        B_VXE,             
 0,                  BT_OV_V4SF_V4SF)
 OB_DEF_VAR (s390_vec_abs_dbl,           s390_vflpdb,        0,                 
 0,                  BT_OV_V2DF_V2DF)
 
@@ -1827,6 +1828,7 @@ B_DEF      (s390_vlpb,                  absv16qi2,        
  0,
 B_DEF      (s390_vlph,                  absv8hi2,           0,                 
 B_VX,               0,                  BT_FN_V8HI_V8HI)
 B_DEF      (s390_vlpf,                  absv4si2,           0,                 
 B_VX,               0,                  BT_FN_V4SI_V4SI)
 B_DEF      (s390_vlpg,                  absv2di2,           0,                 
 B_VX,               0,                  BT_FN_V2DI_V2DI)
+B_DEF      (s390_vlpq,                  absti2,             0,                 
 B_VX,               0,                  BT_FN_INT128_INT128)
 B_DEF      (s390_vflpsb,                absv4sf2,           0,                 
 B_VXE,              0,                  BT_FN_V4SF_V4SF)
 B_DEF      (s390_vflpdb,                absv2df2,           0,                 
 B_VX,               0,                  BT_FN_V2DF_V2DF)
 
diff --git a/gcc/config/s390/vector.md b/gcc/config/s390/vector.md
index 57a9d20f7f76..8824c4fbebdb 100644
--- a/gcc/config/s390/vector.md
+++ b/gcc/config/s390/vector.md
@@ -1191,10 +1191,29 @@
   "vlc<bhfgq>\t%v0,%v1"
   [(set_attr "op_type" "VRR")])
 
-; vlpb, vlph, vlpf, vlpg
-(define_insn "abs<mode>2"
-  [(set (match_operand:VI         0 "register_operand" "=v")
-       (abs:VI (match_operand:VI 1 "register_operand"  "v")))]
+(define_expand "abs<mode>2"
+  [(set (match_operand:VIT          0 "register_operand" "=v")
+       (abs:VIT (match_operand:VIT 1 "register_operand"  "v")))]
+  "TARGET_VX"
+{
+  // Emulate via vec_sel (op1, -op1, op1 < 0)
+  if ((<MODE>mode == V1TImode || <MODE>mode == TImode) && !TARGET_VXE3)
+    {
+      rtx zero = gen_reg_rtx (<MODE>mode);
+      rtx neg_op1 = gen_reg_rtx (<MODE>mode);
+      rtx lt = gen_reg_rtx (<MODE>mode);
+      emit_move_insn (zero, GEN_INT (0));
+      emit_move_insn (neg_op1, gen_rtx_MINUS (<MODE>mode, zero, operands[1]));
+      s390_expand_vec_compare (lt, LT, operands[1], zero);
+      emit_insn (gen_vec_sel0<mode> (operands[0], operands[1], neg_op1, lt, 
GEN_INT (0)));
+      DONE;
+    }
+})
+
+; vlpb, vlph, vlpf, vlpg, vlpq
+(define_insn "*abs<mode>2"
+  [(set (match_operand:VIT_VXE3               0 "register_operand" "=v")
+       (abs:VIT_VXE3 (match_operand:VIT_VXE3 1 "register_operand"  "v")))]
   "TARGET_VX"
   "vlp<bhfgq>\t%v0,%v1"
   [(set_attr "op_type" "VRR")])
@@ -2430,7 +2449,7 @@
 })
 
 ; op0 = op3 == 0 ? op1 : op2
-(define_insn "*vec_sel0<mode>"
+(define_insn "vec_sel0<mode>"
   [(set (match_operand:VT 0 "register_operand" "=v")
        (if_then_else:VT
         (eq (match_operand:<TOINTVEC> 3 "register_operand" "v")
diff --git a/gcc/testsuite/gcc.target/s390/vector/vec-abs-emu.c 
b/gcc/testsuite/gcc.target/s390/vector/vec-abs-emu.c
new file mode 100644
index 000000000000..8c1038a13d75
--- /dev/null
+++ b/gcc/testsuite/gcc.target/s390/vector/vec-abs-emu.c
@@ -0,0 +1,46 @@
+/* { dg-do run } */
+/* { dg-options "-O3 -mzarch -march=z13 -save-temps" } */
+/* { dg-require-effective-target int128 } */
+/* { dg-final { check-function-bodies "**" "" "" } } */
+/* { dg-final { scan-assembler-not {\tvlpq\t} } } */
+
+#include <assert.h>
+
+typedef __attribute__ ((vector_size (16))) signed long long v2di;
+typedef __attribute__ ((vector_size (16))) signed __int128 v1ti;
+
+/*
+** my_abs:
+**     vzero   %v[0-9]+
+**     vchlg   %v[0-9]+,%v[0-9]+,%v[0-9]+
+**     vceqg   %v[0-9]+,%v[0-9]+,%v[0-9]+
+**     vpdi    %v[0-9]+,%v[0-9]+,%v[0-9]+,4
+**     vchg    %v[0-9]+,%v[0-9]+,%v[0-9]+
+**     vn      %v[0-9]+,%v[0-9]+,%v[0-9]+
+**     vo      %v[0-9]+,%v[0-9]+,%v[0-9]+
+**     vrepg   %v[0-9]+,%v[0-9]+,1
+**     vsq     %v[0-9]+,%v[0-9]+,%v[0-9]+
+**     vsel    %v[0-9]+,%v[0-9]+,%v[0-9]+,%v[0-9]+
+**     br      %r14
+*/
+__attribute__ ((noipa)) v1ti
+my_abs (v1ti x)
+{
+  return __builtin_s390_vec_abs (x);
+}
+
+int
+main (void)
+{
+  v2di x;
+
+  x = (v2di){ -1, -42 };
+  x = (v2di) my_abs ((v1ti) x);
+  assert (x[0] == 0 && x[1] == 42);
+
+  x = (v2di){ 0, 42 };
+  x = (v2di) my_abs ((v1ti) x);
+  assert (x[0] == 0 && x[1] == 42);
+
+  return 0;
+}

Reply via email to