https://gcc.gnu.org/g:41bc359c322d45ec1adfb51f7a45c7ef02ce6ca9
commit r15-318-g41bc359c322d45ec1adfb51f7a45c7ef02ce6ca9 Author: Georg-Johann Lay <a...@gjlay.de> Date: Tue May 7 19:42:30 2024 +0200 AVR: target/114975 - Add combine-pattern for __parityqi2. PR target/114975 gcc/ * config/avr/avr.md: Add combine pattern for 8-bit parity detection. gcc/testsuite/ * gcc.target/avr/pr114975-parity.c: New test. Diff: --- gcc/config/avr/avr.md | 17 ++++++++++++++++- gcc/testsuite/gcc.target/avr/pr114975-parity.c | 17 +++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/gcc/config/avr/avr.md b/gcc/config/avr/avr.md index 36fe384828f9..d4fcff46123b 100644 --- a/gcc/config/avr/avr.md +++ b/gcc/config/avr/avr.md @@ -8418,7 +8418,22 @@ (set (match_dup 0) (reg:HI 24))]) -(define_insn_and_split "*parityqihi2" +(define_insn_and_split "*parityqihi2.1" + [(set (match_operand:HI 0 "register_operand" "=r") + (zero_extend:HI + (parity:QI (match_operand:QI 1 "register_operand" "r")))) + (clobber (reg:HI 24))] + "!reload_completed" + { gcc_unreachable(); } + "&& 1" + [(set (reg:QI 24) + (match_dup 1)) + (set (reg:HI 24) + (zero_extend:HI (parity:QI (reg:QI 24)))) + (set (match_dup 0) + (reg:HI 24))]) + +(define_insn_and_split "*parityqihi2.2" [(set (match_operand:HI 0 "register_operand" "=r") (parity:HI (match_operand:QI 1 "register_operand" "r"))) (clobber (reg:HI 24))] diff --git a/gcc/testsuite/gcc.target/avr/pr114975-parity.c b/gcc/testsuite/gcc.target/avr/pr114975-parity.c new file mode 100644 index 000000000000..767ced0a464d --- /dev/null +++ b/gcc/testsuite/gcc.target/avr/pr114975-parity.c @@ -0,0 +1,17 @@ +/* { dg-do compile } */ +/* { dg-additional-options "-Os" } */ + +typedef __UINT8_TYPE__ uint8_t; + +uint8_t use_pary1 (int y, uint8_t x) +{ + return 1 + __builtin_parity (x); +} + +uint8_t use_pary2 (uint8_t x) +{ + x += 1; + return 1 - __builtin_parity (x); +} + +/* { dg-final { scan-assembler-times "__parityqi2" 2 } } */