i386: Fix mode of ZERO_EXTRACT RTXes, remove ext_register_operand predicate.
authorUros Bizjak <ubizjak@gmail.com>
Thu, 18 Jun 2020 18:12:48 +0000 (20:12 +0200)
committerUros Bizjak <ubizjak@gmail.com>
Thu, 18 Jun 2020 18:12:48 +0000 (20:12 +0200)
commite95395926a84a2406faefe0995295d199d595440
treef74cbe8c782b094ca5c8635267af2d8f19656cf7
parent5acc654e380797bbf402bc3a0a67f9a6ac4c2a83
i386: Fix mode of ZERO_EXTRACT RTXes, remove ext_register_operand predicate.

The mode of ZERO_EXTRACT RTX should match the mode of its LOC register
operand.  The mode should be HI, SI or DImode to enable combine to synthesize
extractions from HImode and DImode operands, in addition to existing SImode.
Further, these changes tighten allowed modes for extv, extzv and insv
named patterns and finally enable removal of ext_register_operand
special predicate.

2020-18-06  Uroš Bizjak  <ubizjak@gmail.com>

gcc/ChangeLog:

* config/i386/i386.md (*cmpqi_ext<mode>_1): Use SWI248 mode
iterator instead of SImode for ZERO_EXTRACT RTX.  Use SWI248
mode iterator for the first operand of ZERO_EXTRACT RTX.
Change ext_register_operand predicate to register_operand.
Rename from *cmpqi_ext_1.
(*cmpqi_ext<mode>_2): Ditto.  Rename from *cmpqi_ext_2.
(*cmpqi_ext<mode>_3): Ditto.  Rename from *cmpqi_ext_3.
(*cmpqi_ext<mode>_4): Ditto.  Rename from *cmpqi_ext_4.
(cmpi_ext_3): Use HImode instead of SImode for ZERO_EXTRACT RTX.
(*extv<mode>): Use SWI24 mode iterator for the first operand
of ZERO_EXTRACT RTX.  Change ext_register_operand predicate
to register_operand.
(*extzv<mode>): Use SWI248 mode iterator for the first operand
of ZERO_EXTRACT RTX.  Change ext_register_operand predicate
to register_operand.
(*extzvqi): Use SWI248 mode iterator instead of SImode for
ZERO_EXTRACT RTX.  Use SWI248 mode iterator for the first operand
of ZERO_EXTRACT RTX.  Change ext_register_operand predicate to
register_operand.
(*extzvqi_mem_rex64 and corresponding peephole2):  Use SWI248 mode
iterator instead of SImode for ZERO_EXTRACT RTX.  Use SWI248
mode iterator for the first operand of ZERO_EXTRACT RTX.
Change ext_register_operand predicate to register_operand.
(@insv<mode>_1): Use SWI248 mode iterator for the first operand
of ZERO_EXTRACT RTX.  Change ext_register_operand predicate to
register_operand.
(*insvqi_1): Use SWI248 mode iterator instead of SImode
for ZERO_EXTRACT RTX.  Use SWI248 mode iterator for the
first operand of ZERO_EXTRACT RTX.  Change ext_register_operand
predicate to register_operand.
(*insvqi_2): Ditto.
(*insvqi_3): Ditto.
(*insvqi_1_mem_rex64 and corresponding peephole2):  Use SWI248 mode
iterator instead of SImode for ZERO_EXTRACT RTX.  Use SWI248
mode iterator for the first operand of ZERO_EXTRACT RTX.
Change ext_register_operand predicate to register_operand.
(addqi_ext_1): New expander.
(*addqi_ext<mode>_1): Use SWI248 mode iterator instead of SImode
for ZERO_EXTRACT RTX.  Use SWI248 mode iterator for the first
operand of ZERO_EXTRACT RTX.  Change ext_register_operand predicate
to register_operand.  Rename from *addqi_ext_1.
(*addqi_ext<mode>_2): Ditto. Rename from *addqi_ext_2.
(divmodqi4): Use HImode instead of SImode for ZERO_EXTRACT RTX.
(udivmodqi4): Ditto.
(testqi_ext_1): Use HImode instead of SImode for ZERO_EXTRACT RTX.
(*testqi_ext<mode>_1): Use SWI248 mode iterator instead of SImode
for ZERO_EXTRACT RTX.  Use SWI248 mode iterator for the first
operand of ZERO_EXTRACT RTX.  Change ext_register_operand predicate
to register_operand.  Rename from *testqi_ext_1.
(*testqi_ext<mode>_2): Ditto.  Rename from *testqi_ext_2.
(andqi_ext_1): New expander.
(*andqi_ext<mode>_1): Use SWI248 mode iterator instead of SImode
for ZERO_EXTRACT RTX.  Use SWI248 mode iterator for the first
operand of ZERO_EXTRACT RTX.  Change ext_register_operand predicate
to register_operand.  Rename from andqi_ext_1.
(*andqi_ext<mode>_1_cc): Ditto.  Rename from *andqi_ext_1_cc.
(*andqi_ext<mode>_2): Ditto.  Rename from *andqi_ext_2.
(*<code>qi_ext<mode>_1): Ditto.  Rename from *<code>qi_ext_1.
(*<code>qi_ext<mode>_2): Ditto.  Rename from *<code>qi_ext_2.
(xorqi_ext_1_cc): Use HImode instead of SImode for ZERO_EXTRACT RTX.
(*xorqi_ext<mode>_1_cc):  Use SWI248 mode iterator instead of SImode
for ZERO_EXTRACT RTX.  Use SWI248 mode iterator for the first
operand of ZERO_EXTRACT RTX.  Change ext_register_operand predicate
to register_operand.  Rename from *xorqi_ext_1_cc.
* config/i386/i386-expand.c (ix86_split_idivmod): Emit ZERO_EXTRACT
in mode, matching its first operand.
(promote_duplicated_reg): Update for renamed insv<mode>_1.
* config/i386/predicates.md (ext_register_operand): Remove predicate.

gcc/testsuite/ChangeLog:

* gcc.target/i386/pr78904-1a.c: New test.
* gcc.target/i386/pr78904-1b.c: Ditto.
* gcc.target/i386/pr78904-2a.c: Ditto.
* gcc.target/i386/pr78904-2b.c: Ditto.
* gcc.target/i386/pr78904-3a.c: Ditto.
* gcc.target/i386/pr78904-3b.c: Ditto.
* gcc.target/i386/pr78904-4a.c: Ditto.
* gcc.target/i386/pr78904-4b.c: Ditto.
* gcc.target/i386/pr78904-5a.c: Ditto.
* gcc.target/i386/pr78904-5b.c: Ditto.
* gcc.target/i386/pr78904-6a.c: Ditto.
* gcc.target/i386/pr78904-6b.c: Ditto.
* gcc.target/i386/pr78967-1a.c: Ditto.
* gcc.target/i386/pr78967-1b.c: Ditto.
* gcc.target/i386/pr78967-2a.c: Ditto.
* gcc.target/i386/pr78967-2b.c: Ditto.
19 files changed:
gcc/config/i386/i386-expand.c
gcc/config/i386/i386.md
gcc/config/i386/predicates.md
gcc/testsuite/gcc.target/i386/pr78904-1a.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr78904-1b.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr78904-2a.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr78904-2b.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr78904-3a.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr78904-3b.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr78904-4a.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr78904-4b.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr78904-5a.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr78904-5b.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr78904-6a.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr78904-6b.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr78967-1a.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr78967-1b.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr78967-2a.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr78967-2b.c [new file with mode: 0644]