]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
s390: Extend two element float vector
authorStefan Schulze Frielinghaus <stefansf@linux.ibm.com>
Mon, 17 Jun 2024 06:37:11 +0000 (08:37 +0200)
committerStefan Schulze Frielinghaus <stefansf@linux.ibm.com>
Mon, 17 Jun 2024 06:37:11 +0000 (08:37 +0200)
This implements a V2SF -> V2DF extend.

gcc/ChangeLog:

* config/s390/vector.md (*vmrhf_half<mode>): New.
(extendv2sfv2df2): New.

gcc/testsuite/ChangeLog:

* gcc.target/s390/vector/vec-extend-3.c: New test.

gcc/config/s390/vector.md
gcc/testsuite/gcc.target/s390/vector/vec-extend-3.c [new file with mode: 0644]
gcc/testsuite/gcc.target/s390/vector/vgm-df-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/s390/vector/vgm-di-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/s390/vector/vgm-hi-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/s390/vector/vgm-int128-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/s390/vector/vgm-longdouble-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/s390/vector/vgm-qi-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/s390/vector/vgm-sf-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/s390/vector/vgm-si-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/s390/vector/vgm-ti-1.c [new file with mode: 0644]

index a931a4b1b17e68f64da78bd37359b15748c36e69..40de0c75a7cf3d4c3a01a7d59c388da0cf07c873 100644 (file)
   "vmrhf\t%0,%1,%2";
   [(set_attr "op_type" "VRR")])
 
+(define_insn "*vmrhf_half<mode>"
+  [(set (match_operand:V_HW_4                                0 "register_operand" "=v")
+       (vec_select:V_HW_4
+        (vec_concat:V_HW_4 (match_operand:<vec_halfnumelts> 1 "register_operand"  "v")
+                           (match_operand:<vec_halfnumelts> 2 "register_operand"  "v"))
+        (parallel [(const_int 0) (const_int 2)
+                   (const_int 1) (const_int 3)])))]
+  "TARGET_VX"
+  "vmrhf\t%0,%1,%2";
+  [(set_attr "op_type" "VRR")])
+
 (define_insn "*vmrlf"
   [(set (match_operand:V_HW_4                              0 "register_operand" "=v")
         (vec_select:V_HW_4
   "vup<zero_extend>h<bhfgq>\t%0,%1"
   [(set_attr "op_type" "VRR")])
 
+(define_expand "extendv2sfv2df2"
+  [(set (match_dup 2)
+       (vec_select:V4SF
+        (vec_concat:V4SF (match_operand:V2SF 1 "register_operand")
+                         (match_dup 1))
+        (parallel [(const_int 0) (const_int 2)
+                   (const_int 1) (const_int 3)])))
+   (set (match_operand:V2DF 0 "register_operand")
+       (float_extend:V2DF
+        (vec_select:V2SF
+         (match_dup 2)
+         (parallel [(const_int 0) (const_int 2)]))))]
+  "TARGET_VX"
+{
+  operands[2] = gen_reg_rtx (V4SFmode);
+})
+
 ;; vector unpack v16qi
 
 ; signed
diff --git a/gcc/testsuite/gcc.target/s390/vector/vec-extend-3.c b/gcc/testsuite/gcc.target/s390/vector/vec-extend-3.c
new file mode 100644 (file)
index 0000000..2b02e7b
--- /dev/null
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -march=z13 -mzarch" } */
+/* { dg-final { check-function-bodies "**" "" "" } } */
+
+typedef float v2sf __attribute__ ((vector_size (8)));
+typedef double v2df __attribute__ ((vector_size (16)));
+
+/*
+** extendv2sfv2df2:
+**     vmrhf   %v24,%v24,%v24
+**     vldeb   %v24,%v24
+**     br      %r14
+*/
+
+v2df extendv2sfv2df2 (v2sf x)
+{
+  return __builtin_convertvector (x, v2df);
+}
diff --git a/gcc/testsuite/gcc.target/s390/vector/vgm-df-1.c b/gcc/testsuite/gcc.target/s390/vector/vgm-df-1.c
new file mode 100644 (file)
index 0000000..07aa6b9
--- /dev/null
@@ -0,0 +1,30 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -march=z13 -mzarch" } */
+/* { dg-final { check-function-bodies "**" "" "" } } */
+
+typedef double v1df __attribute__ ((vector_size (8)));
+typedef double v2df __attribute__ ((vector_size (16)));
+
+/*
+** test_v1df_via_vgmb:
+**     vgmb    %v24,0,1
+**     br      %r14
+*/
+
+v1df
+test_v1df_via_vgmb (void)
+{
+  return (v1df){-8577.505882352939806878566741943359375};
+}
+
+/*
+** test_v2df_via_vgmb:
+**     vgmb    %v24,0,1
+**     br      %r14
+*/
+
+v2df
+test_v2df_via_vgmb (void)
+{
+  return (v2df){-8577.505882352939806878566741943359375, -8577.505882352939806878566741943359375};
+}
diff --git a/gcc/testsuite/gcc.target/s390/vector/vgm-di-1.c b/gcc/testsuite/gcc.target/s390/vector/vgm-di-1.c
new file mode 100644 (file)
index 0000000..fa608f2
--- /dev/null
@@ -0,0 +1,102 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -march=z13 -mzarch" } */
+/* { dg-final { check-function-bodies "**" "" "" } } */
+
+typedef long long v1di __attribute__ ((vector_size (8)));
+typedef long long v2di __attribute__ ((vector_size (16)));
+
+/*
+** test_v1di_via_vgmb:
+**     vgmb    %v24,0,2
+**     br      %r14
+*/
+
+v1di
+test_v1di_via_vgmb (void)
+{
+  return (v1di){0xe0e0e0e0e0e0e0e0};
+}
+
+/*
+** test_v2di_via_vgmb:
+**     vgmb    %v24,0,2
+**     br      %r14
+*/
+
+v2di
+test_v2di_via_vgmb (void)
+{
+  return (v2di){0xe0e0e0e0e0e0e0e0, 0xe0e0e0e0e0e0e0e0};
+}
+
+/*
+** test_v1di_via_vgmb_wrap:
+**     vgmb    %v24,5,2
+**     br      %r14
+*/
+
+v1di
+test_v1di_via_vgmb_wrap (void)
+{
+  return (v1di){0xe7e7e7e7e7e7e7e7};
+}
+
+/*
+** test_v2di_via_vgmb_wrap:
+**     vgmb    %v24,5,2
+**     br      %r14
+*/
+
+v2di
+test_v2di_via_vgmb_wrap (void)
+{
+  return (v2di){0xe7e7e7e7e7e7e7e7, 0xe7e7e7e7e7e7e7e7};
+}
+
+/*
+** test_v1di_via_vgmh:
+**     vgmh    %v24,5,10
+**     br      %r14
+*/
+
+v1di
+test_v1di_via_vgmh (void)
+{
+  return (v1di){0x7e007e007e007e0};
+}
+
+/*
+** test_v2di_via_vgmh:
+**     vgmh    %v24,5,10
+**     br      %r14
+*/
+
+v2di
+test_v2di_via_vgmh (void)
+{
+  return (v2di){0x7e007e007e007e0, 0x7e007e007e007e0};
+}
+
+/*
+** test_v1di_via_vgmg:
+**     vgmg    %v24,17,46
+**     br      %r14
+*/
+
+v1di
+test_v1di_via_vgmg (void)
+{
+  return (v1di){0x7ffffffe0000};
+}
+
+/*
+** test_v2di_via_vgmg:
+**     vgmg    %v24,17,46
+**     br      %r14
+*/
+
+v2di
+test_v2di_via_vgmg (void)
+{
+  return (v2di){0x7ffffffe0000, 0x7ffffffe0000};
+}
diff --git a/gcc/testsuite/gcc.target/s390/vector/vgm-hi-1.c b/gcc/testsuite/gcc.target/s390/vector/vgm-hi-1.c
new file mode 100644 (file)
index 0000000..da06479
--- /dev/null
@@ -0,0 +1,212 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -march=z13 -mzarch" } */
+/* { dg-final { check-function-bodies "**" "" "" } } */
+
+typedef short  v1hi __attribute__ ((vector_size (2)));
+typedef short  v2hi __attribute__ ((vector_size (4)));
+typedef short  v4hi __attribute__ ((vector_size (8)));
+typedef short  v8hi __attribute__ ((vector_size (16)));
+
+/*
+** test_v1hi_via_vgmb:
+**     vgmb    %v24,0,2
+**     br      %r14
+*/
+
+v1hi
+test_v1hi_via_vgmb (void)
+{
+  return (v1hi){0xe0e0};
+}
+
+/*
+** test_v2hi_via_vgmb:
+**     vgmb    %v24,0,2
+**     br      %r14
+*/
+
+v2hi
+test_v2hi_via_vgmb (void)
+{
+  return (v2hi){0xe0e0, 0xe0e0};
+}
+
+/*
+** test_v4hi_via_vgmb:
+**     vgmb    %v24,0,2
+**     br      %r14
+*/
+
+v4hi
+test_v4hi_via_vgmb (void)
+{
+  return (v4hi){0xe0e0, 0xe0e0, 0xe0e0, 0xe0e0};
+}
+
+/*
+** test_v8hi_via_vgmb:
+**     vgmb    %v24,0,2
+**     br      %r14
+*/
+
+v8hi
+test_v8hi_via_vgmb (void)
+{
+  return (v8hi){0xe0e0, 0xe0e0, 0xe0e0, 0xe0e0, 0xe0e0, 0xe0e0, 0xe0e0, 0xe0e0};
+}
+
+/*
+** test_v1hi_via_vgmb_wrap:
+**     vgmb    %v24,5,2
+**     br      %r14
+*/
+
+v1hi
+test_v1hi_via_vgmb_wrap (void)
+{
+  return (v1hi){0xe7e7};
+}
+
+/*
+** test_v2hi_via_vgmb_wrap:
+**     vgmb    %v24,5,2
+**     br      %r14
+*/
+
+v2hi
+test_v2hi_via_vgmb_wrap (void)
+{
+  return (v2hi){0xe7e7, 0xe7e7};
+}
+
+/*
+** test_v4hi_via_vgmb_wrap:
+**     vgmb    %v24,5,2
+**     br      %r14
+*/
+
+v4hi
+test_v4hi_via_vgmb_wrap (void)
+{
+  return (v4hi){0xe7e7, 0xe7e7, 0xe7e7, 0xe7e7};
+}
+
+/*
+** test_v8hi_via_vgmb_wrap:
+**     vgmb    %v24,5,2
+**     br      %r14
+*/
+
+v8hi
+test_v8hi_via_vgmb_wrap (void)
+{
+  return (v8hi){0xe7e7, 0xe7e7, 0xe7e7, 0xe7e7, 0xe7e7, 0xe7e7, 0xe7e7, 0xe7e7};
+}
+
+/*
+** test_v1hi_via_vgmh:
+**     vgmh    %v24,5,10
+**     br      %r14
+*/
+
+v1hi
+test_v1hi_via_vgmh (void)
+{
+  return (v1hi){0x7e0};
+}
+
+/*
+** test_v2hi_via_vgmh:
+**     vgmh    %v24,5,10
+**     br      %r14
+*/
+
+v2hi
+test_v2hi_via_vgmh (void)
+{
+  return (v2hi){0x7e0, 0x7e0};
+}
+
+/*
+** test_v4hi_via_vgmh:
+**     vgmh    %v24,5,10
+**     br      %r14
+*/
+
+v4hi
+test_v4hi_via_vgmh (void)
+{
+  return (v4hi){0x7e0, 0x7e0, 0x7e0, 0x7e0};
+}
+
+/*
+** test_v8hi_via_vgmh:
+**     vgmh    %v24,5,10
+**     br      %r14
+*/
+
+v8hi
+test_v8hi_via_vgmh (void)
+{
+  return (v8hi){0x7e0, 0x7e0, 0x7e0, 0x7e0, 0x7e0, 0x7e0, 0x7e0, 0x7e0};
+}
+
+/*
+** test_v2hi_via_vgmf:
+**     vgmf    %v24,1,30
+**     br      %r14
+*/
+
+v2hi
+test_v2hi_via_vgmf (void)
+{
+  return (v2hi){0x7fff, 0xfffe};
+}
+
+/*
+** test_v4hi_via_vgmf:
+**     vgmf    %v24,1,30
+**     br      %r14
+*/
+
+v4hi
+test_v4hi_via_vgmf (void)
+{
+  return (v4hi){0x7fff, 0xfffe, 0x7fff, 0xfffe};
+}
+
+/*
+** test_v8hi_via_vgmf:
+**     vgmf    %v24,1,30
+**     br      %r14
+*/
+
+v8hi
+test_v8hi_via_vgmf (void)
+{
+  return (v8hi){0x7fff, 0xfffe, 0x7fff, 0xfffe, 0x7fff, 0xfffe, 0x7fff, 0xfffe};
+}
+
+/*
+** test_v4hi_via_vgmg:
+**     vgmg    %v24,1,62
+**     br      %r14
+*/
+
+v4hi
+test_v4hi_via_vgmg (void)
+{
+  return (v4hi){0x7fff, 0xffff, 0xffff, 0xfffe};
+}
+
+/*
+** test_v8hi_via_vgmg:
+**     vgmg    %v24,1,62
+**     br      %r14
+*/
+
+v8hi
+test_v8hi_via_vgmg (void)
+{
+  return (v8hi){0x7fff, 0xffff, 0xffff, 0xfffe, 0x7fff, 0xffff, 0xffff, 0xfffe};
+}
diff --git a/gcc/testsuite/gcc.target/s390/vector/vgm-int128-1.c b/gcc/testsuite/gcc.target/s390/vector/vgm-int128-1.c
new file mode 100644 (file)
index 0000000..a106013
--- /dev/null
@@ -0,0 +1,64 @@
+/* { dg-do compile { target lp64 } } */
+/* { dg-options "-O2 -march=z13 -mzarch -fdump-tree-optimized" } */
+/* { dg-final { check-function-bodies "**" "" "" } } */
+
+/* As time of writing this, there is no support for 128-bit integer literals.
+   Therefore, we have to emulate them as e.g. via two long literals.  However,
+   this test is all about __int128 constants.  Thus, ensure that we end up with
+   128-bit constants before expanding.  */
+/* { dg-final { scan-tree-dump "= 0xe0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e;" "optimized" } } */
+/* { dg-final { scan-tree-dump "= 0x7ffe7ffe7ffe7ffe7ffe7ffe7ffe7ffe;" "optimized" } } */
+/* { dg-final { scan-tree-dump "= 0x7ffffffe7ffffffe7ffffffe7ffffffe;" "optimized" } } */
+/* { dg-final { scan-tree-dump "= 0x7ffffffffffffffe7ffffffffffffffe;" "optimized" } } */
+
+/*
+** test_int128_via_vgmb:
+**     vgmb    (%v[0-9]+),4,6
+**     vst     \1,0\(%r2\),3
+**     br      %r14
+*/
+
+__int128
+test_int128_via_vgmb (void)
+{
+  return ((__int128) 0x0e0e0e0e0e0e0e0e << 64) | 0x0e0e0e0e0e0e0e0e;
+}
+
+/*
+** test_int128_via_vgmh:
+**     vgmh    (%v[0-9]+),1,14
+**     vst     \1,0\(%r2\),3
+**     br      %r14
+*/
+
+__int128
+test_int128_via_vgmh (void)
+{
+  return ((__int128) 0x7ffe7ffe7ffe7ffe << 64) | 0x7ffe7ffe7ffe7ffe;
+}
+
+/*
+** test_int128_via_vgmf:
+**     vgmf    (%v[0-9]+),1,30
+**     vst     \1,0\(%r2\),3
+**     br      %r14
+*/
+
+__int128
+test_int128_via_vgmf (void)
+{
+  return ((__int128) 0x7ffffffe7ffffffe << 64) | 0x7ffffffe7ffffffe;
+}
+
+/*
+** test_int128_via_vgmg:
+**     vgmg    (%v[0-9]+),1,62
+**     vst     \1,0\(%r2\),3
+**     br      %r14
+*/
+
+__int128
+test_int128_via_vgmg (void)
+{
+  return ((__int128) 0x7ffffffffffffffe << 64) | 0x7ffffffffffffffe;
+}
diff --git a/gcc/testsuite/gcc.target/s390/vector/vgm-longdouble-1.c b/gcc/testsuite/gcc.target/s390/vector/vgm-longdouble-1.c
new file mode 100644 (file)
index 0000000..0217815
--- /dev/null
@@ -0,0 +1,55 @@
+/* { dg-do compile { target lp64 } } */
+/* { dg-options "-O2 -march=z14 -mzarch -fdump-tree-optimized" } */
+/* { dg-final { check-function-bodies "**" "" "" } } */
+
+/*
+** test_longdouble_via_vgmb:
+**     vgmb    (%v[0-9]+),4,6
+**     vst     \1,0\(%r2\),3
+**     br      %r14
+*/
+
+long double
+test_longdouble_via_vgmb (void)
+{
+  return 2.263171865473961260249112278523378513150597635104e-3849L;
+}
+
+/*
+** test_longdouble_via_vgmh:
+**     vgmh    (%v[0-9]+),1,14
+**     vst     \1,0\(%r2\),3
+**     br      %r14
+*/
+
+long double
+test_longdouble_via_vgmh (void)
+{
+  return 8.9228500591371968978175957554634715383668519805586e+4931L;
+}
+
+/*
+** test_longdouble_via_vgmf:
+**     vgmf    (%v[0-9]+),9,30
+**     vst     \1,0\(%r2\),3
+**     br      %r14
+*/
+
+long double
+test_longdouble_via_vgmf (void)
+{
+  return 5.7202348769040302108562404806917908642856158381792e-4894L;
+}
+
+/*
+** test_longdouble_via_vgmg:
+**     vgmg    (%v[0-9]+),9,62
+**     vst     \1,0\(%r2\),3
+**     br      %r14
+*/
+
+long double
+test_longdouble_via_vgmg (void)
+{
+  return 5.7203220768525291179165318133287569460629228746232e-4894L;
+}
diff --git a/gcc/testsuite/gcc.target/s390/vector/vgm-qi-1.c b/gcc/testsuite/gcc.target/s390/vector/vgm-qi-1.c
new file mode 100644 (file)
index 0000000..06e7062
--- /dev/null
@@ -0,0 +1,213 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -march=z13 -mzarch" } */
+/* { dg-final { check-function-bodies "**" "" "" } } */
+
+typedef signed char  v1qi __attribute__ ((vector_size (1)));
+typedef signed char  v2qi __attribute__ ((vector_size (2)));
+typedef signed char  v4qi __attribute__ ((vector_size (4)));
+typedef signed char  v8qi __attribute__ ((vector_size (8)));
+typedef signed char  v16qi __attribute__ ((vector_size (16)));
+
+/*
+** test_v1qi_via_vgmb:
+**     vgmb    %v24,0,2
+**     br      %r14
+*/
+
+v1qi
+test_v1qi_via_vgmb (void)
+{
+  return (v1qi){0xe0};
+}
+
+/*
+** test_v2qi_via_vgmb:
+**     vgmb    %v24,0,2
+**     br      %r14
+*/
+
+v2qi
+test_v2qi_via_vgmb (void)
+{
+  return (v2qi){0xe0, 0xe0};
+}
+
+/*
+** test_v4qi_via_vgmb:
+**     vgmb    %v24,0,2
+**     br      %r14
+*/
+
+v4qi
+test_v4qi_via_vgmb (void)
+{
+  return (v4qi){0xe0, 0xe0, 0xe0, 0xe0};
+}
+
+/*
+** test_v8qi_via_vgmb:
+**     vgmb    %v24,0,2
+**     br      %r14
+*/
+
+v8qi
+test_v8qi_via_vgmb (void)
+{
+  return (v8qi){0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0};
+}
+
+/*
+** test_v16qi_via_vgmb:
+**     vgmb    %v24,0,2
+**     br      %r14
+*/
+
+v16qi
+test_v16qi_via_vgmb (void)
+{
+  return (v16qi){0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0};
+}
+
+/*
+** test_v1qi_via_vgmb_wrap:
+**     vgmb    %v24,5,2
+**     br      %r14
+*/
+
+v1qi
+test_v1qi_via_vgmb_wrap (void)
+{
+  return (v1qi){0xe7};
+}
+
+/*
+** test_v2qi_via_vgmb_wrap:
+**     vgmb    %v24,5,2
+**     br      %r14
+*/
+
+v2qi
+test_v2qi_via_vgmb_wrap (void)
+{
+  return (v2qi){0xe7, 0xe7};
+}
+
+/*
+** test_v4qi_via_vgmb_wrap:
+**     vgmb    %v24,5,2
+**     br      %r14
+*/
+
+v4qi
+test_v4qi_via_vgmb_wrap (void)
+{
+  return (v4qi){0xe7, 0xe7, 0xe7, 0xe7};
+}
+
+/*
+** test_v8qi_via_vgmb_wrap:
+**     vgmb    %v24,5,2
+**     br      %r14
+*/
+
+v8qi
+test_v8qi_via_vgmb_wrap (void)
+{
+  return (v8qi){0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7};
+}
+
+/*
+** test_v16qi_via_vgmb_wrap:
+**     vgmb    %v24,5,2
+**     br      %r14
+*/
+
+v16qi
+test_v16qi_via_vgmb_wrap (void)
+{
+  return (v16qi){0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7};
+}
+
+/*
+** test_v2qi_via_vgmh:
+**     vgmh    %v24,1,14
+**     br      %r14
+*/
+
+v2qi
+test_v2qi_via_vgmh (void)
+{
+  return (v2qi){0x7f, 0xfe};
+}
+
+/*
+** test_v4qi_via_vgmh:
+**     vgmh    %v24,1,14
+**     br      %r14
+*/
+
+v4qi
+test_v4qi_via_vgmh (void)
+{
+  return (v4qi){0x7f, 0xfe, 0x7f, 0xfe};
+}
+
+/*
+** test_v8qi_via_vgmh:
+**     vgmh    %v24,1,14
+**     br      %r14
+*/
+
+v8qi
+test_v8qi_via_vgmh (void)
+{
+  return (v8qi){0x7f, 0xfe, 0x7f, 0xfe, 0x7f, 0xfe, 0x7f, 0xfe};
+}
+
+/*
+** test_v16qi_via_vgmh:
+**     vgmh    %v24,1,14
+**     br      %r14
+*/
+
+v16qi
+test_v16qi_via_vgmh (void)
+{
+  return (v16qi){0x7f, 0xfe, 0x7f, 0xfe, 0x7f, 0xfe, 0x7f, 0xfe, 0x7f, 0xfe, 0x7f, 0xfe, 0x7f, 0xfe, 0x7f, 0xfe};
+}
+
+/*
+** test_v4qi_via_vgmf:
+**     vgmf    %v24,1,30
+**     br      %r14
+*/
+
+v4qi
+test_v4qi_via_vgmf (void)
+{
+  return (v4qi){0x7f, 0xff, 0xff, 0xfe};
+}
+
+/*
+** test_v8qi_via_vgmf:
+**     vgmf    %v24,1,30
+**     br      %r14
+*/
+
+v8qi
+test_v8qi_via_vgmf (void)
+{
+  return (v8qi){0x7f, 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xfe};
+}
+
+/*
+** test_v8qi_via_vgmg:
+**     vgmg    %v24,1,62
+**     br      %r14
+*/
+
+v8qi
+test_v8qi_via_vgmg (void)
+{
+  return (v8qi){0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe};
+}
diff --git a/gcc/testsuite/gcc.target/s390/vector/vgm-sf-1.c b/gcc/testsuite/gcc.target/s390/vector/vgm-sf-1.c
new file mode 100644 (file)
index 0000000..1beaec9
--- /dev/null
@@ -0,0 +1,43 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -march=z14 -mzarch" } */
+/* { dg-final { check-function-bodies "**" "" "" } } */
+
+typedef float v1sf __attribute__ ((vector_size (4)));
+typedef float v2sf __attribute__ ((vector_size (8)));
+typedef float v4sf __attribute__ ((vector_size (16)));
+
+/*
+** test_v1sf_via_vgmb:
+**     vgmb    %v24,0,3
+**     br      %r14
+*/
+
+v1sf
+test_v1sf_via_vgmb (void)
+{
+  return (v1sf){-5.9654142e29};
+}
+
+/*
+** test_v2sf_via_vgmb:
+**     vgmb    %v24,0,3
+**     br      %r14
+*/
+
+v2sf
+test_v2sf_via_vgmb (void)
+{
+  return (v2sf){-5.9654142e29, -5.9654142e29};
+}
+
+/*
+** test_v4sf_via_vgmb:
+**     vgmb    %v24,0,3
+**     br      %r14
+*/
+
+v4sf
+test_v4sf_via_vgmb (void)
+{
+  return (v4sf){-5.9654142e29, -5.9654142e29, -5.9654142e29, -5.9654142e29};
+}
diff --git a/gcc/testsuite/gcc.target/s390/vector/vgm-si-1.c b/gcc/testsuite/gcc.target/s390/vector/vgm-si-1.c
new file mode 100644 (file)
index 0000000..a3e9d57
--- /dev/null
@@ -0,0 +1,146 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -march=z13 -mzarch" } */
+/* { dg-final { check-function-bodies "**" "" "" } } */
+
+typedef int  v1si __attribute__ ((vector_size (4)));
+typedef int  v2si __attribute__ ((vector_size (8)));
+typedef int  v4si __attribute__ ((vector_size (16)));
+
+/*
+** test_v1si_via_vgmb:
+**     vgmb    %v24,0,2
+**     br      %r14
+*/
+
+v1si
+test_v1si_via_vgmb (void)
+{
+  return (v1si){0xe0e0e0e0};
+}
+
+/*
+** test_v2si_via_vgmb:
+**     vgmb    %v24,0,2
+**     br      %r14
+*/
+
+v2si
+test_v2si_via_vgmb (void)
+{
+  return (v2si){0xe0e0e0e0, 0xe0e0e0e0};
+}
+
+/*
+** test_v4si_via_vgmb:
+**     vgmb    %v24,0,2
+**     br      %r14
+*/
+
+v4si
+test_v4si_via_vgmb (void)
+{
+  return (v4si){0xe0e0e0e0, 0xe0e0e0e0, 0xe0e0e0e0, 0xe0e0e0e0};
+}
+
+/*
+** test_v1si_via_vgmb_wrap:
+**     vgmb    %v24,5,2
+**     br      %r14
+*/
+
+v1si
+test_v1si_via_vgmb_wrap (void)
+{
+  return (v1si){0xe7e7e7e7};
+}
+
+/*
+** test_v2si_via_vgmb_wrap:
+**     vgmb    %v24,5,2
+**     br      %r14
+*/
+
+v2si
+test_v2si_via_vgmb_wrap (void)
+{
+  return (v2si){0xe7e7e7e7, 0xe7e7e7e7};
+}
+
+/*
+** test_v4si_via_vgmb_wrap:
+**     vgmb    %v24,5,2
+**     br      %r14
+*/
+
+v4si
+test_v4si_via_vgmb_wrap (void)
+{
+  return (v4si){0xe7e7e7e7, 0xe7e7e7e7, 0xe7e7e7e7, 0xe7e7e7e7};
+}
+
+/*
+** test_v1si_via_vgmh:
+**     vgmh    %v24,5,10
+**     br      %r14
+*/
+
+v1si
+test_v1si_via_vgmh (void)
+{
+  return (v1si){0x7e007e0};
+}
+
+/*
+** test_v2si_via_vgmh:
+**     vgmh    %v24,5,10
+**     br      %r14
+*/
+
+__attribute__ ((noipa))
+v2si
+test_v2si_via_vgmh (void)
+{
+  return (v2si){0x7e007e0, 0x7e007e0};
+}
+
+/*
+** test_v4si_via_vgmh:
+**     vgmh    %v24,5,10
+**     br      %r14
+*/
+
+v4si
+test_v4si_via_vgmh (void)
+{
+  return (v4si){0x7e007e0, 0x7e007e0, 0x7e007e0, 0x7e007e0};
+}
+
+/*
+** test_v2si_via_vgmg:
+**     vgmg    %v24,17,46
+**     br      %r14
+*/
+
+__attribute__ ((noipa))
+v2si
+test_v2si_via_vgmg (void)
+{
+  return (v2si){0x7fff, 0xfffe0000};
+}
+
+/*
+** test_v4si_via_vgmg:
+**     vgmg    %v24,17,46
+**     br      %r14
+*/
+
+v4si
+test_v4si_via_vgmg (void)
+{
+  return (v4si){0x7fff, 0xfffe0000, 0x7fff, 0xfffe0000};
+}
+
+int main (void)
+{
+  test_v2si_via_vgmh ();
+}
diff --git a/gcc/testsuite/gcc.target/s390/vector/vgm-ti-1.c b/gcc/testsuite/gcc.target/s390/vector/vgm-ti-1.c
new file mode 100644 (file)
index 0000000..c77457c
--- /dev/null
@@ -0,0 +1,63 @@
+/* { dg-do compile { target lp64 } } */
+/* { dg-options "-O2 -march=z13 -mzarch -fdump-tree-optimized" } */
+/* { dg-final { check-function-bodies "**" "" "" } } */
+
+/* As time of writing this, there is no support for 128-bit integer literals.
+   Therefore, we have to emulate them as e.g. via two long literals.  However,
+   this test is all about V1TI const vectors.  Thus, ensure that we end up with
+   a V1TI const vector before expanding.  */
+/* { dg-final { scan-tree-dump "{ 0xe0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e }" "optimized" } } */
+/* { dg-final { scan-tree-dump "{ 0x7ffe7ffe7ffe7ffe7ffe7ffe7ffe7ffe }" "optimized" } } */
+/* { dg-final { scan-tree-dump "{ 0x7ffffffe7ffffffe7ffffffe7ffffffe }" "optimized" } } */
+/* { dg-final { scan-tree-dump "{ 0x7ffffffffffffffe7ffffffffffffffe }" "optimized" } } */
+
+typedef __int128  v1ti __attribute__ ((vector_size (16)));
+typedef long v2di __attribute__ ((vector_size (16)));
+
+/*
+** test_v1ti_via_vgmb:
+**     vgmb    %v24,4,6
+**     br      %r14
+*/
+
+v1ti
+test_v1ti_via_vgmb (void)
+{
+  return (v1ti)(v2di){0x0e0e0e0e0e0e0e0e, 0x0e0e0e0e0e0e0e0e};
+}
+
+/*
+** test_v1ti_via_vgmh:
+**     vgmh    %v24,1,14
+**     br      %r14
+*/
+
+v1ti
+test_v1ti_via_vgmh (void)
+{
+  return (v1ti)(v2di){0x7ffe7ffe7ffe7ffe, 0x7ffe7ffe7ffe7ffe};
+}
+
+/*
+** test_v1ti_via_vgmf:
+**     vgmf    %v24,1,30
+**     br      %r14
+*/
+
+v1ti
+test_v1ti_via_vgmf (void)
+{
+  return (v1ti)(v2di){0x7ffffffe7ffffffe, 0x7ffffffe7ffffffe};
+}
+
+/*
+** test_v1ti_via_vgmg:
+**     vgmg    %v24,1,62
+**     br      %r14
+*/
+
+v1ti
+test_v1ti_via_vgmg (void)
+{
+  return (v1ti)(v2di){0x7ffffffffffffffe, 0x7ffffffffffffffe};
+}