]> git.ipfire.org Git - thirdparty/gcc.git/commit
s390: Fully exploit vgm, vgbm, vrepi
authorStefan Schulze Frielinghaus <stefansf@gcc.gnu.org>
Fri, 12 Jul 2024 11:42:08 +0000 (13:42 +0200)
committerStefan Schulze Frielinghaus <stefansf@gcc.gnu.org>
Fri, 12 Jul 2024 11:42:08 +0000 (13:42 +0200)
commit61715e9340ab8941d40d62158fe437e9dbe3e068
tree2446e25e1b70a8be963119a9d6396917ca444070
parente6680d3f392f7f7cc2a1515276213e21e9eeab1c
s390: Fully exploit vgm, vgbm, vrepi

Currently instructions vgm and vrepi are utilized only for constant
vectors where the element mode equals the element mode of the
corresponding instruction.  This patch lifts this restriction by making
use of those instructions for constant vectors even if element modes
do not coincide.  For example, the constant vector

  (v2di){0x7ffffffe7ffffffe, 0x7ffffffe7ffffffe}

can be loaded via vgmf %v0,1,30.  Similar, the constant vector

  (v4si){0xaaaaaaaa, 0xaaaaaaaa, 0xaaaaaaaa, 0xaaaaaaaa}

can be loaded via vrepiq %v0,-86.

Analog, if the element mode of a constant vector is smaller than the
element mode of a corresponding instruction, we still may make use of
those instructions.  For example, the constant vector

  (v4si){0x7fff, 0xfffe0000, 0x7fff, 0xfffe0000}

can be loaded via vgmg %v0,17,46.  Similar, the constant vector

  (v4si){-1, -16643, -1, -16643}

can be loaded via vrepig %v0,-16643.

Additionally this patch enables vgm, vgbm, vrepi for partial vectors,
i.e., vectors of size less than 16 bytes.  Basically this is done by
treating a vector as a full vector resulting in replicating constants
into the ignored bits whereas vgbm sets those to zero.

Furthermore, there is no restriction to integer vectors anymore, i.e.,
supporting scalars of mode up to and including TI and TF and also
floating-point vectors.

Here are some numbers how often instructions are emitted for SPEC 2017:

        w/o patch     w/ patch
vgbm          140          365
vgm         17508        24452
vrepi        1360         2775

I expect most (maybe even all) to save us a load from the literal pool.

gcc/ChangeLog:

* config/s390/2964.md: Remove extended mnemonics for vgm.
* config/s390/3906.md: Remove extended mnemonics for vgm.
* config/s390/3931.md: Remove extended mnemonics for vgm.
* config/s390/8561.md: Remove extended mnemonics for vgm.
* config/s390/constraints.md (jKK): Remove constraint.
(jzz): Add constraint.
* config/s390/s390-protos.h (s390_contiguous_bitmask_vector_p):
Add prototype.
(s390_constant_via_vgm_p): Add prototype.
(s390_constant_via_vrepi_p): Add prototype.
* config/s390/s390.cc (s390_contiguous_bitmask_vector_p): New
function.
(s390_constant_via_vgm_vrepi_helper): New function.
(s390_constant_via_vgm_p): New function.
(s390_constant_via_vgbm_p): For the sake of symmetry rename
s390_bytemask_vector_p into s390_constant_via_vgbm_p.
(s390_bytemask_vector_p): Deal with non-integer and partial
vectors.
(s390_constant_via_vrepi_p): New function.
(s390_legitimate_constant_p): Allow partial vectors.
(legitimate_reload_constant_p): Fix indentation.
(legitimate_reload_vector_constant_p): Restrict to constraints
j00, jm1, jxx, jyy, jzz only, i.e., allow partial vectors.
(s390_expand_vec_init): Also make use of vrepi if possible.
(print_operand): Add q,p,r for vgm,vrepi,vgbm, respectively.
Remove e,s,t for constant vectors.
* config/s390/s390.md (movti): Add variants utilizing
vgbm,vgm,vrepi.
* config/s390/vector.md (mov<mode><tf_vr>): Adapt variants
for vgbm,vgm,vrepi for the new scheme.
(mov<mode>): Adapt variants for vgbm,vgm for the new
scheme and add vrepi variant for modes V_8,V_16,V_32,V_64.

gcc/testsuite/ChangeLog:

* gcc.target/s390/vector/vec-copysign.c: Change to non-extended
mnemonic.
* gcc.target/s390/vector/vec-genmask-1.c: Change to non-extended
mnemonic.
* gcc.target/s390/vector/vec-init-1.c: Change to non-extended
mnemonic.
* gcc.target/s390/vector/vec-vrepi-1.c: Change to non-extended
mnemonic.
* gcc.target/s390/zvector/autovec-double-quiet-uneq.c: Change to
non-extended mnemonic.
* gcc.target/s390/zvector/autovec-float-quiet-uneq.c: Change to
non-extended mnemonic.
* gcc.target/s390/zvector/vec-genmask-1.c: Change to
non-extended mnemonic.
* gcc.target/s390/zvector/vec-splat-1.c: Change to non-extended
mnemonic.
* gcc.target/s390/zvector/vec-splat-2.c: Change to non-extended
mnemonic.
* gcc.target/s390/vector/vgbm-double-1.c: New test.
* gcc.target/s390/vector/vgbm-float-1.c: New test.
* gcc.target/s390/vector/vgbm-int128-1.c: New test.
* gcc.target/s390/vector/vgbm-integer-1.c: New test.
* gcc.target/s390/vector/vgbm-longdouble-1.c: New test.
* gcc.target/s390/vector/vgm-df-1.c: New test.
* gcc.target/s390/vector/vgm-di-1.c: New test.
* gcc.target/s390/vector/vgm-hi-1.c: New test.
* gcc.target/s390/vector/vgm-int128-1.c: New test.
* gcc.target/s390/vector/vgm-longdouble-1.c: New test.
* gcc.target/s390/vector/vgm-qi-1.c: New test.
* gcc.target/s390/vector/vgm-sf-1.c: New test.
* gcc.target/s390/vector/vgm-si-1.c: New test.
* gcc.target/s390/vector/vgm-tf-1.c: New test.
* gcc.target/s390/vector/vgm-ti-1.c: New test.
* gcc.target/s390/vector/vrepi-df-1.c: New test.
* gcc.target/s390/vector/vrepi-di-1.c: New test.
* gcc.target/s390/vector/vrepi-hi-1.c: New test.
* gcc.target/s390/vector/vrepi-int128-1.c: New test.
* gcc.target/s390/vector/vrepi-qi-1.c: New test.
* gcc.target/s390/vector/vrepi-sf-1.c: New test.
* gcc.target/s390/vector/vrepi-si-1.c: New test.
* gcc.target/s390/vector/vrepi-tf-1.c: New test.
* gcc.target/s390/vector/vrepi-ti-1.c: New test.
42 files changed:
gcc/config/s390/2964.md
gcc/config/s390/3906.md
gcc/config/s390/3931.md
gcc/config/s390/8561.md
gcc/config/s390/constraints.md
gcc/config/s390/s390-protos.h
gcc/config/s390/s390.cc
gcc/config/s390/s390.md
gcc/config/s390/vector.md
gcc/testsuite/gcc.target/s390/vector/vec-copysign.c
gcc/testsuite/gcc.target/s390/vector/vec-genmask-1.c
gcc/testsuite/gcc.target/s390/vector/vec-init-1.c
gcc/testsuite/gcc.target/s390/vector/vec-vrepi-1.c
gcc/testsuite/gcc.target/s390/vector/vgbm-double-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/s390/vector/vgbm-float-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/s390/vector/vgbm-int128-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/s390/vector/vgbm-integer-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/s390/vector/vgbm-longdouble-1.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-tf-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/s390/vector/vgm-ti-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/s390/vector/vrepi-df-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/s390/vector/vrepi-di-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/s390/vector/vrepi-hi-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/s390/vector/vrepi-int128-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/s390/vector/vrepi-qi-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/s390/vector/vrepi-sf-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/s390/vector/vrepi-si-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/s390/vector/vrepi-tf-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/s390/vector/vrepi-ti-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/s390/zvector/autovec-double-quiet-uneq.c
gcc/testsuite/gcc.target/s390/zvector/autovec-float-quiet-uneq.c
gcc/testsuite/gcc.target/s390/zvector/vec-genmask-1.c
gcc/testsuite/gcc.target/s390/zvector/vec-splat-1.c
gcc/testsuite/gcc.target/s390/zvector/vec-splat-2.c