diff options
author | George Spelvin <linux@sciencehorizons.net> | 2016-12-12 11:25:51 +0000 |
---|---|---|
committer | Georg-Johann Lay <gjl@gcc.gnu.org> | 2016-12-12 11:25:51 +0000 |
commit | a5b947fa660dddce05e02f23de61d77063c2573b (patch) | |
tree | 68bc34bf4049fac9c3b91df7ad1ba496975288c5 /libgcc/config/avr | |
parent | 9e9034937bfc7a938a152e9fa9ecb806c7077602 (diff) | |
download | gcc-a5b947fa660dddce05e02f23de61d77063c2573b.zip gcc-a5b947fa660dddce05e02f23de61d77063c2573b.tar.gz gcc-a5b947fa660dddce05e02f23de61d77063c2573b.tar.bz2 |
lib1funcs.S (__ashldi3): Use __tmp_reg__ to restore R16 instead of push + pop.
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.
From-SVN: r243545
Diffstat (limited to 'libgcc/config/avr')
-rw-r--r-- | libgcc/config/avr/lib1funcs.S | 29 |
1 files changed, 18 insertions, 11 deletions
diff --git a/libgcc/config/avr/lib1funcs.S b/libgcc/config/avr/lib1funcs.S index 82adfda..6ca2b82 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 |