S/390: Fix a problem with the bswap vector pattern
authorAndreas Krebbel <krebbel@linux.ibm.com>
Fri, 12 Apr 2019 07:41:51 +0000 (07:41 +0000)
committerAndreas Krebbel <krebbel@gcc.gnu.org>
Fri, 12 Apr 2019 07:41:51 +0000 (07:41 +0000)
commit2541c40f06f6653a26cf465d961c39ab6398cfdf
treeb190bec60527e95430f227195b399d40fcc7ecd8
parent8e8225e69d1173cf0095a59ccf9bad219d016cdd
S/390: Fix a problem with the bswap vector pattern

arch13 introduced instructions to perform vector element-wise byte
swaps on the way from or to memory.  For a byte swap between vector
registers the vector permute instruction is required which needs a
permute pattern to be loaded into a vector register first.

With the current implementation there is a potential problem when the
decision for the reg-reg variant is made very late.  This patch is
supposed to fix that.

With the patch the required permute pattern is generated already in
the expander and attached to the bswap pattern as USE operand.  The
predicate in the insn_and_split pattern accepts it although the
permute constant as such is not a valid constant.  For the reg-reg
variant only the vector register constraint is used for the permute
constant forcing LRA to a) push the constant into literal pool and b)
load the literal pool constant into a vector register.

gcc/ChangeLog:

2019-04-12  Andreas Krebbel  <krebbel@linux.ibm.com>

* config/s390/predicates.md (permute_pattern_operand): New
predicate.
* config/s390/vector.md ("*vec_splats_bswap_vec<mode>"): Add USE
operand for the permute pattern.
("*vec_perm<mode>"): New insn definition.
("bswap<mode>"): Generate the permute pattern operand in the
expander and perform the operand reloads for pre arch13 level
already.
("*bswap<mode>_emu"): Rename to ...
("*bswap<mode>"): ... this. And make the splitter vxe2 only.
* config/s390/vx-builtins.md ("*vec_insert_and_zero_bswap<mode>"):
Add the USE operand for the permute pattern.
("*vec_set_bswap_vec<mode>"): Likewise.

From-SVN: r270306
gcc/ChangeLog
gcc/config/s390/predicates.md
gcc/config/s390/vector.md
gcc/config/s390/vx-builtins.md