diff options
author | Georg-Johann Lay <avr@gjlay.de> | 2024-05-07 19:42:30 +0200 |
---|---|---|
committer | Georg-Johann Lay <avr@gjlay.de> | 2024-05-08 10:41:12 +0200 |
commit | 41bc359c322d45ec1adfb51f7a45c7ef02ce6ca9 (patch) | |
tree | 8be38c52ec3466a81f6f1cb848804ebb9fce3eb1 /gcc | |
parent | c8f4bbb824fafecf021a802324cd79e64b03b947 (diff) | |
download | gcc-41bc359c322d45ec1adfb51f7a45c7ef02ce6ca9.zip gcc-41bc359c322d45ec1adfb51f7a45c7ef02ce6ca9.tar.gz gcc-41bc359c322d45ec1adfb51f7a45c7ef02ce6ca9.tar.bz2 |
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.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/config/avr/avr.md | 17 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/avr/pr114975-parity.c | 17 |
2 files changed, 33 insertions, 1 deletions
diff --git a/gcc/config/avr/avr.md b/gcc/config/avr/avr.md index 36fe384..d4fcff4 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 0000000..767ced0 --- /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 } } */ |