diff mbox

[avr,committed] Minor tweak for 64-bit shifts.

Message ID 7297ac19-4519-9a06-23e8-865d34433976@gjlay.de
State New
Headers show

Commit Message

Georg-Johann Lay Dec. 12, 2016, 11:29 a.m. UTC
https://gcc.gnu.org/r243545

Applied this obvious tweak to trunk.

Johann


libgcc/
	* config/avr/lib1funcs.S (__ashldi3): Use __tmp_reg__ to restore
	R16 instead of push + pop.
	(__ashrdi3, __lshrdi3): Same. And use __zero_reg__ for signs.
diff mbox

Patch

Index: config/avr/lib1funcs.S
===================================================================
--- config/avr/lib1funcs.S	(revision 243542)
+++ config/avr/lib1funcs.S	(working copy)
@@ -3113,20 +3113,22 @@  ENDF __bswapdi2
  **********************************/
 
 #if defined (L_ashrdi3)
+
+#define SS __zero_reg__
+
 ;; Arithmetic shift right
 ;; r25:r18 = ashr64 (r25:r18, r17:r16)
 DEFUN __ashrdi3
-    bst     r25, 7
-    bld     __zero_reg__, 0
+    sbrc    r25, 7
+    neg     SS
     ;; FALLTHRU
 ENDF  __ashrdi3
 
 ;; Logic shift right
 ;; r25:r18 = lshr64 (r25:r18, r17:r16)
 DEFUN __lshrdi3
-    lsr     __zero_reg__
-    sbc     __tmp_reg__, __tmp_reg__
-    push    r16
+    ;; Signs are in SS (zero_reg)
+    mov     __tmp_reg__, r16
 0:  cpi     r16, 8
     brlo 2f
     subi    r16, 8
@@ -3137,9 +3139,9 @@  DEFUN __lshrdi3
     mov     r22, r23
     mov     r23, r24
     mov     r24, r25
-    mov     r25, __tmp_reg__
+    mov     r25, SS
     rjmp 0b
-1:  asr     __tmp_reg__
+1:  asr     SS
     ror     r25
     ror     r24
     ror     r23
@@ -3150,16 +3152,21 @@  DEFUN __lshrdi3
     ror     r18
 2:  dec     r16
     brpl 1b
-    pop     r16
+    clr     __zero_reg__
+    mov     r16, __tmp_reg__
     ret
 ENDF __lshrdi3
+
+#undef SS
+
 #endif /* defined (L_ashrdi3) */
 
 #if defined (L_ashldi3)
 ;; Shift left
 ;; r25:r18 = ashl64 (r25:r18, r17:r16)
+;; This function does not clobber T.
 DEFUN __ashldi3
-    push    r16
+    mov     __tmp_reg__, r16
 0:  cpi     r16, 8
     brlo 2f
     mov     r25, r24
@@ -3182,13 +3189,13 @@  DEFUN __ashldi3
     rol     r25
 2:  dec     r16
     brpl 1b
-    pop     r16
+    mov     r16, __tmp_reg__
     ret
 ENDF __ashldi3
 #endif /* defined (L_ashldi3) */
 
 #if defined (L_rotldi3)
-;; Shift left
+;; Rotate left
 ;; r25:r18 = rotl64 (r25:r18, r17:r16)
 DEFUN __rotldi3
     push    r16