On Mon, Jan 20, 2025 at 2:59 PM Stefan Schulze Frielinghaus
<stefa...@linux.ibm.com> wrote:
>
> On Mon, Jan 20, 2025 at 02:46:40PM +0100, Richard Biener wrote:
> > On Mon, Jan 20, 2025 at 11:04 AM Stefan Schulze Frielinghaus
> > <stefa...@gcc.gnu.org> wrote:
> > >
> > > gcc/ChangeLog:
> >
> > Interesting - I can't find anything about these in the PoP (though I can 
> > only
> > find the one from May 2022, 14th edition covering up to z16(?)).  Is there
> > a newer document?
>
> This instruction becomes available in a newer machine generation which
> wasn't released so far.  Therefore, there is also no updated PoP or
> other document which describes it.

Ah, thanks.  vector integer division/modulo sounds like fun, esp. for __int128

> I will try to keep this in mind and send you a link once a new document
> is released.
>
> Cheers,
> Stefan
>
> >
> > Richard.
> >
> > >         * config/s390/vector.md (div<mode>3): Add.
> > >         (udiv<mode>3): Add.
> > >         (mod<mode>3): Add.
> > >         (umod<mode>3): Add.
> > >
> > > gcc/testsuite/ChangeLog:
> > >
> > >         * gcc.target/s390/vxe3/vd-1.c: New test.
> > >         * gcc.target/s390/vxe3/vd-2.c: New test.
> > >         * gcc.target/s390/vxe3/vdl-1.c: New test.
> > >         * gcc.target/s390/vxe3/vdl-2.c: New test.
> > >         * gcc.target/s390/vxe3/vr-1.c: New test.
> > >         * gcc.target/s390/vxe3/vr-2.c: New test.
> > >         * gcc.target/s390/vxe3/vrl-1.c: New test.
> > >         * gcc.target/s390/vxe3/vrl-2.c: New test.
> > > ---
> > >  gcc/config/s390/vector.md                  | 36 ++++++++++++++++++++++
> > >  gcc/testsuite/gcc.target/s390/vxe3/vd-1.c  | 27 ++++++++++++++++
> > >  gcc/testsuite/gcc.target/s390/vxe3/vd-2.c  | 21 +++++++++++++
> > >  gcc/testsuite/gcc.target/s390/vxe3/vdl-1.c | 27 ++++++++++++++++
> > >  gcc/testsuite/gcc.target/s390/vxe3/vdl-2.c | 21 +++++++++++++
> > >  gcc/testsuite/gcc.target/s390/vxe3/vr-1.c  | 27 ++++++++++++++++
> > >  gcc/testsuite/gcc.target/s390/vxe3/vr-2.c  | 21 +++++++++++++
> > >  gcc/testsuite/gcc.target/s390/vxe3/vrl-1.c | 27 ++++++++++++++++
> > >  gcc/testsuite/gcc.target/s390/vxe3/vrl-2.c | 21 +++++++++++++
> > >  9 files changed, 228 insertions(+)
> > >  create mode 100644 gcc/testsuite/gcc.target/s390/vxe3/vd-1.c
> > >  create mode 100644 gcc/testsuite/gcc.target/s390/vxe3/vd-2.c
> > >  create mode 100644 gcc/testsuite/gcc.target/s390/vxe3/vdl-1.c
> > >  create mode 100644 gcc/testsuite/gcc.target/s390/vxe3/vdl-2.c
> > >  create mode 100644 gcc/testsuite/gcc.target/s390/vxe3/vr-1.c
> > >  create mode 100644 gcc/testsuite/gcc.target/s390/vxe3/vr-2.c
> > >  create mode 100644 gcc/testsuite/gcc.target/s390/vxe3/vrl-1.c
> > >  create mode 100644 gcc/testsuite/gcc.target/s390/vxe3/vrl-2.c
> > >
> > > diff --git a/gcc/config/s390/vector.md b/gcc/config/s390/vector.md
> > > index 2e7419c45c3..606c6826860 100644
> > > --- a/gcc/config/s390/vector.md
> > > +++ b/gcc/config/s390/vector.md
> > > @@ -1145,6 +1145,42 @@
> > >    "vml<bhfgq><w>\t%v0,%v1,%v2"
> > >    [(set_attr "op_type" "VRR")])
> > >
> > > +; vdf, vdg, vdq
> > > +(define_insn "div<mode>3"
> > > +  [(set (match_operand:VI_HW_SDT                0 "register_operand" 
> > > "=v")
> > > +       (div:VI_HW_SDT (match_operand:VI_HW_SDT 1 "register_operand"  "v")
> > > +                      (match_operand:VI_HW_SDT 2 "register_operand"  
> > > "v")))]
> > > +  "TARGET_VXE3"
> > > +  "vd<bhfgq>\t%v0,%v1,%v2,0"
> > > +  [(set_attr "op_type" "VRR")])
> > > +
> > > +; vdlf, vdlg, vdlq
> > > +(define_insn "udiv<mode>3"
> > > +  [(set (match_operand:VI_HW_SDT                 0 "register_operand" 
> > > "=v")
> > > +       (udiv:VI_HW_SDT (match_operand:VI_HW_SDT 1 "register_operand"  
> > > "v")
> > > +                       (match_operand:VI_HW_SDT 2 "register_operand"  
> > > "v")))]
> > > +  "TARGET_VXE3"
> > > +  "vdl<bhfgq>\t%v0,%v1,%v2,0"
> > > +  [(set_attr "op_type" "VRR")])
> > > +
> > > +; vrf, vrg, vrq
> > > +(define_insn "mod<mode>3"
> > > +  [(set (match_operand:VI_HW_SDT                0 "register_operand" 
> > > "=v")
> > > +       (mod:VI_HW_SDT (match_operand:VI_HW_SDT 1 "register_operand"  "v")
> > > +                      (match_operand:VI_HW_SDT 2 "register_operand"  
> > > "v")))]
> > > +  "TARGET_VXE3"
> > > +  "vr<bhfgq>\t%v0,%v1,%v2,0"
> > > +  [(set_attr "op_type" "VRR")])
> > > +
> > > +; vrlf, vrlg, vrlq
> > > +(define_insn "umod<mode>3"
> > > +  [(set (match_operand:VI_HW_SDT                 0 "register_operand" 
> > > "=v")
> > > +       (umod:VI_HW_SDT (match_operand:VI_HW_SDT 1 "register_operand"  
> > > "v")
> > > +                       (match_operand:VI_HW_SDT 2 "register_operand"  
> > > "v")))]
> > > +  "TARGET_VXE3"
> > > +  "vrl<bhfgq>\t%v0,%v1,%v2,0"
> > > +  [(set_attr "op_type" "VRR")])
> > > +
> > >  ; vlcb, vlch, vlcf, vlcg
> > >  (define_insn "neg<mode>2"
> > >    [(set (match_operand:VI         0 "register_operand" "=v")
> > > diff --git a/gcc/testsuite/gcc.target/s390/vxe3/vd-1.c 
> > > b/gcc/testsuite/gcc.target/s390/vxe3/vd-1.c
> > > new file mode 100644
> > > index 00000000000..43a2666788d
> > > --- /dev/null
> > > +++ b/gcc/testsuite/gcc.target/s390/vxe3/vd-1.c
> > > @@ -0,0 +1,27 @@
> > > +/* { dg-do compile } */
> > > +/* { dg-require-effective-target int128 } */
> > > +/* { dg-final { scan-assembler {\tvdf\t%v[0-9]+,%v[0-9]+,%v[0-9]+,0} } } 
> > > */
> > > +/* { dg-final { scan-assembler {\tvdg\t%v[0-9]+,%v[0-9]+,%v[0-9]+,0} } } 
> > > */
> > > +/* { dg-final { scan-assembler {\tvdq\t%v[0-9]+,%v[0-9]+,%v[0-9]+,0} } } 
> > > */
> > > +
> > > +typedef int __attribute__ ((vector_size (16))) V4SI;
> > > +typedef long long __attribute__ ((vector_size (16))) V2DI;
> > > +typedef __int128 __attribute__ ((vector_size (16))) V1TI;
> > > +
> > > +V4SI
> > > +vdf (V4SI x, V4SI y)
> > > +{
> > > +  return x / y;
> > > +}
> > > +
> > > +V2DI
> > > +vdg (V2DI x, V2DI y)
> > > +{
> > > +  return x / y;
> > > +}
> > > +
> > > +V1TI
> > > +vdq (V1TI x, V1TI y)
> > > +{
> > > +  return x / y;
> > > +}
> > > diff --git a/gcc/testsuite/gcc.target/s390/vxe3/vd-2.c 
> > > b/gcc/testsuite/gcc.target/s390/vxe3/vd-2.c
> > > new file mode 100644
> > > index 00000000000..49c7abd03f6
> > > --- /dev/null
> > > +++ b/gcc/testsuite/gcc.target/s390/vxe3/vd-2.c
> > > @@ -0,0 +1,21 @@
> > > +/* { dg-do compile } */
> > > +/* { dg-require-effective-target int128 } */
> > > +/* { dg-final { scan-assembler {\tvdf\t%v[0-9]+,%v[0-9]+,%v[0-9]+,0} } } 
> > > */
> > > +/* { dg-final { scan-assembler {\tvdg\t%v[0-9]+,%v[0-9]+,%v[0-9]+,0} } } 
> > > */
> > > +/* { dg-final { scan-assembler {\tvdq\t%v[0-9]+,%v[0-9]+,%v[0-9]+,0} } } 
> > > */
> > > +
> > > +typedef int int32;
> > > +typedef long long int64;
> > > +typedef __int128 int128;
> > > +
> > > +#define vd(T) \
> > > +void \
> > > +vd_##T (T *res, T *x, T *y) \
> > > +{ \
> > > +  for (int i = 0; i < 128; ++i) \
> > > +    res[i] = x[i] / *y; \
> > > +}
> > > +
> > > +vd(int32)
> > > +vd(int64)
> > > +vd(int128)
> > > diff --git a/gcc/testsuite/gcc.target/s390/vxe3/vdl-1.c 
> > > b/gcc/testsuite/gcc.target/s390/vxe3/vdl-1.c
> > > new file mode 100644
> > > index 00000000000..a2da0097a1c
> > > --- /dev/null
> > > +++ b/gcc/testsuite/gcc.target/s390/vxe3/vdl-1.c
> > > @@ -0,0 +1,27 @@
> > > +/* { dg-do compile } */
> > > +/* { dg-require-effective-target int128 } */
> > > +/* { dg-final { scan-assembler {\tvdlf\t%v[0-9]+,%v[0-9]+,%v[0-9]+,0} } 
> > > } */
> > > +/* { dg-final { scan-assembler {\tvdlg\t%v[0-9]+,%v[0-9]+,%v[0-9]+,0} } 
> > > } */
> > > +/* { dg-final { scan-assembler {\tvdlq\t%v[0-9]+,%v[0-9]+,%v[0-9]+,0} } 
> > > } */
> > > +
> > > +typedef unsigned int __attribute__ ((vector_size (16))) UV4SI;
> > > +typedef unsigned long long __attribute__ ((vector_size (16))) UV2DI;
> > > +typedef unsigned __int128 __attribute__ ((vector_size (16))) UV1TI;
> > > +
> > > +UV4SI
> > > +vdlf (UV4SI x, UV4SI y)
> > > +{
> > > +  return x / y;
> > > +}
> > > +
> > > +UV2DI
> > > +vdlg (UV2DI x, UV2DI y)
> > > +{
> > > +  return x / y;
> > > +}
> > > +
> > > +UV1TI
> > > +vdlq (UV1TI x, UV1TI y)
> > > +{
> > > +  return x / y;
> > > +}
> > > diff --git a/gcc/testsuite/gcc.target/s390/vxe3/vdl-2.c 
> > > b/gcc/testsuite/gcc.target/s390/vxe3/vdl-2.c
> > > new file mode 100644
> > > index 00000000000..9f45a85d026
> > > --- /dev/null
> > > +++ b/gcc/testsuite/gcc.target/s390/vxe3/vdl-2.c
> > > @@ -0,0 +1,21 @@
> > > +/* { dg-do compile } */
> > > +/* { dg-require-effective-target int128 } */
> > > +/* { dg-final { scan-assembler {\tvdlf\t%v[0-9]+,%v[0-9]+,%v[0-9]+,0} } 
> > > } */
> > > +/* { dg-final { scan-assembler {\tvdlg\t%v[0-9]+,%v[0-9]+,%v[0-9]+,0} } 
> > > } */
> > > +/* { dg-final { scan-assembler {\tvdlq\t%v[0-9]+,%v[0-9]+,%v[0-9]+,0} } 
> > > } */
> > > +
> > > +typedef unsigned int uint32;
> > > +typedef unsigned long long uint64;
> > > +typedef unsigned __int128 uint128;
> > > +
> > > +#define vdl(T) \
> > > +void \
> > > +vdl_##T (T *res, T *x, T *y) \
> > > +{ \
> > > +  for (int i = 0; i < 128; ++i) \
> > > +    res[i] = x[i] / *y; \
> > > +}
> > > +
> > > +vdl(uint32)
> > > +vdl(uint64)
> > > +vdl(uint128)
> > > diff --git a/gcc/testsuite/gcc.target/s390/vxe3/vr-1.c 
> > > b/gcc/testsuite/gcc.target/s390/vxe3/vr-1.c
> > > new file mode 100644
> > > index 00000000000..bd285e3bc43
> > > --- /dev/null
> > > +++ b/gcc/testsuite/gcc.target/s390/vxe3/vr-1.c
> > > @@ -0,0 +1,27 @@
> > > +/* { dg-do compile } */
> > > +/* { dg-require-effective-target int128 } */
> > > +/* { dg-final { scan-assembler {\tvrf\t%v[0-9]+,%v[0-9]+,%v[0-9]+,0} } } 
> > > */
> > > +/* { dg-final { scan-assembler {\tvrg\t%v[0-9]+,%v[0-9]+,%v[0-9]+,0} } } 
> > > */
> > > +/* { dg-final { scan-assembler {\tvrq\t%v[0-9]+,%v[0-9]+,%v[0-9]+,0} } } 
> > > */
> > > +
> > > +typedef int __attribute__ ((vector_size (16))) V4SI;
> > > +typedef long long __attribute__ ((vector_size (16))) V2DI;
> > > +typedef __int128 __attribute__ ((vector_size (16))) V1TI;
> > > +
> > > +V4SI
> > > +vrf (V4SI x, V4SI y)
> > > +{
> > > +  return x % y;
> > > +}
> > > +
> > > +V2DI
> > > +vrg (V2DI x, V2DI y)
> > > +{
> > > +  return x % y;
> > > +}
> > > +
> > > +V1TI
> > > +vrq (V1TI x, V1TI y)
> > > +{
> > > +  return x % y;
> > > +}
> > > diff --git a/gcc/testsuite/gcc.target/s390/vxe3/vr-2.c 
> > > b/gcc/testsuite/gcc.target/s390/vxe3/vr-2.c
> > > new file mode 100644
> > > index 00000000000..40baf099719
> > > --- /dev/null
> > > +++ b/gcc/testsuite/gcc.target/s390/vxe3/vr-2.c
> > > @@ -0,0 +1,21 @@
> > > +/* { dg-do compile } */
> > > +/* { dg-require-effective-target int128 } */
> > > +/* { dg-final { scan-assembler {\tvrf\t%v[0-9]+,%v[0-9]+,%v[0-9]+,0} } } 
> > > */
> > > +/* { dg-final { scan-assembler {\tvrg\t%v[0-9]+,%v[0-9]+,%v[0-9]+,0} } } 
> > > */
> > > +/* { dg-final { scan-assembler {\tvrq\t%v[0-9]+,%v[0-9]+,%v[0-9]+,0} } } 
> > > */
> > > +
> > > +typedef int int32;
> > > +typedef long long int64;
> > > +typedef __int128 int128;
> > > +
> > > +#define vr(T) \
> > > +void \
> > > +vr_##T (T *res, T *x, T *y) \
> > > +{ \
> > > +  for (int i = 0; i < 128; ++i) \
> > > +    res[i] = x[i] % *y; \
> > > +}
> > > +
> > > +vr(int32)
> > > +vr(int64)
> > > +vr(int128)
> > > diff --git a/gcc/testsuite/gcc.target/s390/vxe3/vrl-1.c 
> > > b/gcc/testsuite/gcc.target/s390/vxe3/vrl-1.c
> > > new file mode 100644
> > > index 00000000000..134f8fb6d6b
> > > --- /dev/null
> > > +++ b/gcc/testsuite/gcc.target/s390/vxe3/vrl-1.c
> > > @@ -0,0 +1,27 @@
> > > +/* { dg-do compile } */
> > > +/* { dg-require-effective-target int128 } */
> > > +/* { dg-final { scan-assembler {\tvrlf\t%v[0-9]+,%v[0-9]+,%v[0-9]+,0} } 
> > > } */
> > > +/* { dg-final { scan-assembler {\tvrlg\t%v[0-9]+,%v[0-9]+,%v[0-9]+,0} } 
> > > } */
> > > +/* { dg-final { scan-assembler {\tvrlq\t%v[0-9]+,%v[0-9]+,%v[0-9]+,0} } 
> > > } */
> > > +
> > > +typedef unsigned int __attribute__ ((vector_size (16))) UV4SI;
> > > +typedef unsigned long long __attribute__ ((vector_size (16))) UV2DI;
> > > +typedef unsigned __int128 __attribute__ ((vector_size (16))) UV1TI;
> > > +
> > > +UV4SI
> > > +vrlf (UV4SI x, UV4SI y)
> > > +{
> > > +  return x % y;
> > > +}
> > > +
> > > +UV2DI
> > > +vrlg (UV2DI x, UV2DI y)
> > > +{
> > > +  return x % y;
> > > +}
> > > +
> > > +UV1TI
> > > +vrlq (UV1TI x, UV1TI y)
> > > +{
> > > +  return x % y;
> > > +}
> > > diff --git a/gcc/testsuite/gcc.target/s390/vxe3/vrl-2.c 
> > > b/gcc/testsuite/gcc.target/s390/vxe3/vrl-2.c
> > > new file mode 100644
> > > index 00000000000..6ea8f712562
> > > --- /dev/null
> > > +++ b/gcc/testsuite/gcc.target/s390/vxe3/vrl-2.c
> > > @@ -0,0 +1,21 @@
> > > +/* { dg-do compile } */
> > > +/* { dg-require-effective-target int128 } */
> > > +/* { dg-final { scan-assembler {\tvrlf\t%v[0-9]+,%v[0-9]+,%v[0-9]+,0} } 
> > > } */
> > > +/* { dg-final { scan-assembler {\tvrlg\t%v[0-9]+,%v[0-9]+,%v[0-9]+,0} } 
> > > } */
> > > +/* { dg-final { scan-assembler {\tvrlq\t%v[0-9]+,%v[0-9]+,%v[0-9]+,0} } 
> > > } */
> > > +
> > > +typedef unsigned int uint32;
> > > +typedef unsigned long long uint64;
> > > +typedef unsigned __int128 uint128;
> > > +
> > > +#define vrl(T) \
> > > +void \
> > > +vrl_##T (T *res, T *x, T *y) \
> > > +{ \
> > > +  for (int i = 0; i < 128; ++i) \
> > > +    res[i] = x[i] % *y; \
> > > +}
> > > +
> > > +vrl(uint32)
> > > +vrl(uint64)
> > > +vrl(uint128)
> > > --
> > > 2.47.0
> > >

Reply via email to