diff mbox series

[avr,applied] PR target/114835 - Tweak __popcountqi2

Message ID 94a7ab92-30b5-4e05-8762-803a3954f888@gjlay.de
State New
Headers show
Series [avr,applied] PR target/114835 - Tweak __popcountqi2 | expand

Commit Message

Georg-Johann Lay May 7, 2024, 2:31 p.m. UTC
Applied this tweak as proposed in the PR.

Johann

--

commit 6b73a9879a4503ebee2cb1a3ad243f60c922ca31
Author: Wolfgang Hospital <Wolfgang.Hospital@arcor.de>
Date:   Tue May 7 16:24:39 2024 +0200

     AVR: target/114835 - Tweak popcountqi2

     libgcc/
             PR target/114835
             * config/avr/lib1funcs.S (__popcountqi2): Use code that
             is one instruction shorter / faster.
diff mbox series

Patch

diff --git a/libgcc/config/avr/lib1funcs.S b/libgcc/config/avr/lib1funcs.S
index af4d7d97016..4ac31fa104e 100644
--- a/libgcc/config/avr/lib1funcs.S
+++ b/libgcc/config/avr/lib1funcs.S
@@ -3050,21 +3050,21 @@  DEFUN __popcountdi2
  ;; r24 = popcount8 (r24)
  ;; clobbers: __tmp_reg__
  DEFUN __popcountqi2
-    mov  __tmp_reg__, r24
-    andi r24, 1
-    lsr  __tmp_reg__
-    lsr  __tmp_reg__
-    adc  r24, __zero_reg__
-    lsr  __tmp_reg__
-    adc  r24, __zero_reg__
-    lsr  __tmp_reg__
-    adc  r24, __zero_reg__
-    lsr  __tmp_reg__
-    adc  r24, __zero_reg__
-    lsr  __tmp_reg__
-    adc  r24, __zero_reg__
-    lsr  __tmp_reg__
-    adc  r24, __tmp_reg__
+    mov  __tmp_reg__, r24    ; oeoeoeoe
+    andi r24, 0xAA           ; o0o0o0o0
+    lsr  r24                 ; 0o0o0o0o
+    ;; Four values 0, 1 or 2: # bits set o+e
+    sub  __tmp_reg__, r24    ; 44332211
+    mov  r24, __tmp_reg__    ; 44332211
+    andi r24, 0x33           ; 00330011
+    eor  __tmp_reg__, r24    ; 44002200
+    lsr  __tmp_reg__         ; 04400220
+    lsr  __tmp_reg__         ; 00440022
+    add  r24, __tmp_reg__    ; 04210421
+    mov  __tmp_reg__, r24    ; h421l421
+    swap __tmp_reg__         ; l421h421
+    add  r24, __tmp_reg__    ; 84218421
+    andi r24, 0xf            ; 00008421 /17
      ret
  ENDF __popcountqi2
  #endif /* defined (L_popcountqi2) */