diff --git a/gcc/config/avr/avr.md b/gcc/config/avr/avr.md index 97f42be7729..d4fcff46123 100644 --- a/gcc/config/avr/avr.md +++ b/gcc/config/avr/avr.md @@ -8527,6 +8542,19 @@ (define_expand "popcountsi2" operands[2] = gen_reg_rtx (HImode); }) +(define_insn_and_split "*popcounthi2.split8" + [(set (reg:HI 24) + (zero_extend:HI (popcount:QI (match_operand:QI 0 "register_operand"))))] + "! reload_completed" + { gcc_unreachable(); } + "&& 1" + [(set (reg:QI 24) + (match_dup 0)) + (set (reg:QI 24) + (popcount:QI (reg:QI 24))) + (set (reg:QI 25) + (const_int 0))]) + (define_insn_and_split "*popcounthi2.libgcc_split" [(set (reg:HI 24) (popcount:HI (reg:HI 24)))] diff --git a/gcc/testsuite/gcc.target/avr/pr114975-popcount.c b/gcc/testsuite/gcc.target/avr/pr114975-popcount.c new file mode 100644 index 00000000000..87eb56b56c5 --- /dev/null +++ b/gcc/testsuite/gcc.target/avr/pr114975-popcount.c @@ -0,0 +1,17 @@ +/* { dg-do compile } */ +/* { dg-additional-options "-Os" } */ + +typedef __UINT8_TYPE__ uint8_t; + +uint8_t use_pop1 (int y, uint8_t x) +{ + return 1 + __builtin_popcount (x); +} + +uint8_t use_pop2 (uint8_t x) +{ + x += 1; + return 1 - __builtin_popcount (x); +} + +/* { dg-final { scan-assembler-times "__popcountqi2" 2 } } */