summaryrefslogtreecommitdiff
path: root/libgcc
diff options
context:
space:
mode:
authorgjl <gjl@138bc75d-0d04-0410-961f-82ee72b054a4>2016-12-12 11:25:51 +0000
committergjl <gjl@138bc75d-0d04-0410-961f-82ee72b054a4>2016-12-12 11:25:51 +0000
commit4d1d4dad0a4c6287ede5a707781fa6102123fbf8 (patch)
tree68bc34bf4049fac9c3b91df7ad1ba496975288c5 /libgcc
parent7828cab3754713ba6fa63b2c934beee6ac19fa1d (diff)
downloadgcc-4d1d4dad0a4c6287ede5a707781fa6102123fbf8.tar.gz
libgcc/
2016-12-12 George Spelvin <linux@sciencehorizons.net> * config/avr/lib1funcs.S (__ashldi3): Use __tmp_reg__ to restore R16 instead of push + pop. (__ashrdi3, __lshrdi3): Same. And use __zero_reg__ for signs. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@243545 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libgcc')
-rw-r--r--libgcc/ChangeLog6
-rw-r--r--libgcc/config/avr/lib1funcs.S29
2 files changed, 24 insertions, 11 deletions
diff --git a/libgcc/ChangeLog b/libgcc/ChangeLog
index b0ab79f2856..5f8854c6e0e 100644
--- a/libgcc/ChangeLog
+++ b/libgcc/ChangeLog
@@ -1,3 +1,9 @@
+2016-12-12 George Spelvin <linux@sciencehorizons.net>
+
+ * config/avr/lib1funcs.S (__ashldi3): Use __tmp_reg__ to restore
+ R16 instead of push + pop.
+ (__ashrdi3, __lshrdi3): Same. And use __zero_reg__ for signs.
+
2016-12-10 Krister Walfridsson <krister.walfridsson@gmail.com>
* config.host (i[34567]86-*-netbsdelf*): Add i386/t-crtstuff to
diff --git a/libgcc/config/avr/lib1funcs.S b/libgcc/config/avr/lib1funcs.S
index 82adfda4402..6ca2b82a8cd 100644
--- a/libgcc/config/avr/lib1funcs.S
+++ b/libgcc/config/avr/lib1funcs.S
@@ -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