diff options
author | gjl <gjl@138bc75d-0d04-0410-961f-82ee72b054a4> | 2016-12-12 11:25:51 +0000 |
---|---|---|
committer | gjl <gjl@138bc75d-0d04-0410-961f-82ee72b054a4> | 2016-12-12 11:25:51 +0000 |
commit | 4d1d4dad0a4c6287ede5a707781fa6102123fbf8 (patch) | |
tree | 68bc34bf4049fac9c3b91df7ad1ba496975288c5 /libgcc | |
parent | 7828cab3754713ba6fa63b2c934beee6ac19fa1d (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | libgcc/config/avr/lib1funcs.S | 29 |
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 |