aboutsummaryrefslogtreecommitdiff
path: root/gcc/analyzer/engine.cc
diff options
context:
space:
mode:
authorUros Bizjak <ubizjak@gmail.com>2023-02-17 17:00:12 +0100
committerUros Bizjak <ubizjak@gmail.com>2023-02-17 17:00:12 +0100
commit6245441e124846d0c3551f312d2feef598fe251c (patch)
treedfe7182168c6286506401f44e0c29a32364c7ec9 /gcc/analyzer/engine.cc
parent6ac3ebed5ffbac0d81c5a1d0cb1e345cfad202a8 (diff)
downloadgcc-6245441e124846d0c3551f312d2feef598fe251c.zip
gcc-6245441e124846d0c3551f312d2feef598fe251c.tar.gz
gcc-6245441e124846d0c3551f312d2feef598fe251c.tar.bz2
ii386: Generate QImode binary ops with high-part input register [PR108831]
Following testcase: --cut here-- struct S { unsigned char pad1; unsigned char val; unsigned short pad2; }; unsigned char test_add (unsigned char a, struct S b) { a += b.val; return a; } --cut here-- should be compiled to something like: addb %dh, %al but is currently compiled to: movzbl %dh, %edx addl %edx, %eax The patch implements insn patterns that model QImode binary ops with high-part QImode input register. These ops can not be encoded with REX prefix, so only Q registers and constant memory output operands are allowed on x86_64 targets. 2023-02-17 Uroš Bizjak <ubizjak@gmail.com> gcc/ChangeLog: PR target/108831 * config/i386/predicates.md (nonimm_x64constmem_operand): New predicate. * config/i386/i386.md (*addqi_ext<mode>_0): New insn pattern. (*subqi_ext<mode>_0): Ditto. (*andqi_ext<mode>_0): Ditto. (*<any_or:code>qi_ext<mode>_0): Ditto. gcc/testsuite/ChangeLog: PR target/108831 * gcc.target/i386/pr108831-1.c: New test. * gcc.target/i386/pr108831-2.c: Ditto.
Diffstat (limited to 'gcc/analyzer/engine.cc')
0 files changed, 0 insertions, 0 deletions