i386: Add *setcc_hi_1* define_insn_and_split [PR97950]
authorJakub Jelinek <jakub@redhat.com>
Tue, 24 Nov 2020 09:45:40 +0000 (10:45 +0100)
committerJakub Jelinek <jakub@redhat.com>
Tue, 24 Nov 2020 09:45:40 +0000 (10:45 +0100)
commita1dd66b108cba086f58448ccbe9bf57b0a342f9a
tree99ce7ab0567e177ed2422f49194689e11ee76b15
parent4adfcea0a1b0c6dcaefddca3d5f45dd5403b1a80
i386: Add *setcc_hi_1* define_insn_and_split [PR97950]

As the following testcase shows, unlike char, int or long long sized
__builtin_*_overflow{,_p}, for short sized one in most cases the ce1 pass
doesn't optimize the jo/jno or jc/jnc jumps with setting of a pseudo to 0/1
into seto/setc.  The reason is missing *setcc_hi_1* pattern.  The following
patch implements it using mode iterators so that on i486 and pentium?
one can get the zero extension through and instead of movzbw.

2020-11-24  Jakub Jelinek  <jakub@redhat.com>

PR target/97950
* config/i386/i386.md (*setcc_si_1_and): Macroize into...
(*setcc_<mode>_1_and): New define_insn_and_split with SWI24 iterator.
(*setcc_si_1_movzbl): Macroize into...
(*setcc_<mode>_1_movzbl): New define_insn_and_split with SWI24
iterator.

* gcc.target/i386/pr97950.c: New test.
gcc/config/i386/i386.md
gcc/testsuite/gcc.target/i386/pr97950.c [new file with mode: 0644]