Am 19.05.26 um 09:32 schrieb Denis Chertykov:
пн, 18 мая 2026 г. в 12:14, Georg-Johann Lay <[email protected]>:

This patch adds insns for 16-bit and 32-bit __builtin_bitreverse.
With the patch, the generated code has a better size / speed ratio.

The patch uses hard-reg constraints, which is possible since the
code generation doesn't rely on insn combine.

Passes without new regressions. Ok for trunk?

Ok.
Please apply.

Denis

Meanwhile, a patch has been applied that expresses bitreverse in
terms of wider / shorter bitreverse when there is no insn for the
former.  So the assumption is basically

  insn available <=> insn is cheap

https://gcc.gnu.org/r17-591

For the avr BE this means that the 8-bit bitreverse is now
expressed in terms of the 16-bit one.  Therefore, I also
added bitreverseqi2 insns.

https://gcc.gnu.org/r17-598

Johann

--

AVR: Add bitreverseqi2 insns.

Now that https://gcc.gnu.org/r17-591 has been applied, the
middle-end will express 8-bit bitreverse code in terms of
a 16-bit bitreverse.  Therefore, add bitreverseqi2 insns.

gcc/
        * config/avr/avr.md (bitreverseqi2): New insn-and-split.
        (*bitreverseqi2): New insn.

diff --git a/gcc/config/avr/avr.md b/gcc/config/avr/avr.md
--- a/gcc/config/avr/avr.md
+++ b/gcc/config/avr/avr.md
@@ -9039,6 +9039,43 @@ (define_insn_and_split "*popcountqihi2.libgcc"

 ;; Bit Reverse

+(define_insn_and_split "bitreverseqi2"
+  [(set (match_operand:QI 0 "register_operand"               "=r")
+        (bitreverse:QI (match_operand:QI 1 "register_operand" "r")))]
+  ""
+  "#"
+  "&& reload_completed"
+  [(scratch)]
+  { DONE_ADD_CCC })
+
+(define_insn "*bitreverseqi2"
+  [(set (match_operand:QI 0 "register_operand"               "=r")
+        (bitreverse:QI (match_operand:QI 1 "register_operand" "r")))
+   (clobber (reg:CC REG_CC))]
+  "reload_completed"
+  {
+    return REGNO (operands[0]) == REGNO (operands[1])
+      ? "mov __tmp_reg__,%0"            CR_TAB
+        "lsl %0"                        CR_TAB
+        "adc %0,__zero_reg__"           CR_TAB
+        "bst __tmp_reg__,0 $ bld %0,7"  CR_TAB
+        "bst __tmp_reg__,1 $ bld %0,6"  CR_TAB
+        "bst __tmp_reg__,2 $ bld %0,5"  CR_TAB
+        "bst __tmp_reg__,4 $ bld %0,3"  CR_TAB
+        "bst __tmp_reg__,5 $ bld %0,2"  CR_TAB
+        "bst __tmp_reg__,6 $ bld %0,1"
+      : "mov %0,%1"            CR_TAB
+        "lsl %0"               CR_TAB
+        "adc %0,__zero_reg__"  CR_TAB
+        "bst %1,0 $ bld %0,7"  CR_TAB
+        "bst %1,1 $ bld %0,6"  CR_TAB
+        "bst %1,2 $ bld %0,5"  CR_TAB
+        "bst %1,4 $ bld %0,3"  CR_TAB
+        "bst %1,5 $ bld %0,2"  CR_TAB
+        "bst %1,6 $ bld %0,1";
+  }
+  [(set_attr "length" "15")])
+
 (define_insn_and_split "bitreversehi2"
   [(set (match_operand:HI 0 "register_operand"               "={r24}")
         (bitreverse:HI (match_operand:HI 1 "register_operand" "{r24}")))]

Reply via email to