diff options
Diffstat (limited to 'libgcc')
-rw-r--r-- | libgcc/ChangeLog | 8 | ||||
-rw-r--r-- | libgcc/config/avr/lib1funcs.S | 90 | ||||
-rw-r--r-- | libgcc/config/avr/t-avr | 6 |
3 files changed, 101 insertions, 3 deletions
diff --git a/libgcc/ChangeLog b/libgcc/ChangeLog index 51cd717..7c7d438 100644 --- a/libgcc/ChangeLog +++ b/libgcc/ChangeLog @@ -1,3 +1,11 @@ +2012-01-02 Georg-Johann Lay <avr@gjlay.de> + + Implement light-weight DImode support. + * config/avr/t-avr (LIB1ASMFUNCS): Add _adddi3, _adddi3_s8, + _subdi3, _cmpdi2, _cmpdi2_s8, _rotldi3. + * config/avr/lib1funcs.S (__adddi3, __adddi3_s8, __subdi3, + __cmpdi2, __cmpdi2_s8, __rotldi3): New functions. + 2011-12-30 Nathan Sidwell <nathan@acm.org> * libgcov.c (gcov_crc32): Remove global var. diff --git a/libgcc/config/avr/lib1funcs.S b/libgcc/config/avr/lib1funcs.S index bc16cf2..f7f0865 100644 --- a/libgcc/config/avr/lib1funcs.S +++ b/libgcc/config/avr/lib1funcs.S @@ -1558,6 +1558,71 @@ ENDF __divdi3_moddi3 #endif /* L_divdi3 */ +.section .text.libgcc, "ax", @progbits + +#define TT __tmp_reg__ + +#if defined (L_adddi3) +;; (set (reg:DI 18) +;; (plus:DI (reg:DI 18) +;; (reg:DI 10))) +DEFUN __adddi3 + ADD A0,B0 $ adc A1,B1 $ adc A2,B2 $ adc A3,B3 + adc A4,B4 $ adc A5,B5 $ adc A6,B6 $ adc A7,B7 + ret +ENDF __adddi3 +#endif /* L_adddi3 */ + +#if defined (L_adddi3_s8) +;; (set (reg:DI 18) +;; (plus:DI (reg:DI 18) +;; (sign_extend:SI (reg:QI 26)))) +DEFUN __adddi3_s8 + clr TT + sbrc r26, 7 + com TT + ADD A0,r26 $ adc A1,TT $ adc A2,TT $ adc A3,TT + adc A4,TT $ adc A5,TT $ adc A6,TT $ adc A7,TT + ret +ENDF __adddi3_s8 +#endif /* L_adddi3_s8 */ + +#if defined (L_subdi3) +;; (set (reg:DI 18) +;; (minus:DI (reg:DI 18) +;; (reg:DI 10))) +DEFUN __subdi3 + SUB A0,B0 $ sbc A1,B1 $ sbc A2,B2 $ sbc A3,B3 + sbc A4,B4 $ sbc A5,B5 $ sbc A6,B6 $ sbc A7,B7 + ret +ENDF __subdi3 +#endif /* L_subdi3 */ + +#if defined (L_cmpdi2) +;; (set (cc0) +;; (compare (reg:DI 18) +;; (reg:DI 10))) +DEFUN __cmpdi2 + CP A0,B0 $ cpc A1,B1 $ cpc A2,B2 $ cpc A3,B3 + cpc A4,B4 $ cpc A5,B5 $ cpc A6,B6 $ cpc A7,B7 + ret +ENDF __cmpdi2 +#endif /* L_cmpdi2 */ + +#if defined (L_cmpdi2_s8) +;; (set (cc0) +;; (compare (reg:DI 18) +;; (sign_extend:SI (reg:QI 26)))) +DEFUN __cmpdi2_s8 + clr TT + sbrc r26, 7 + com TT + CP A0,r26 $ cpc A1,TT $ cpc A2,TT $ cpc A3,TT + cpc A4,TT $ cpc A5,TT $ cpc A6,TT $ cpc A7,TT + ret +ENDF __cmpdi2_s8 +#endif /* L_cmpdi2_s8 */ + #if defined (L_negdi2) DEFUN __negdi2 @@ -1571,6 +1636,8 @@ DEFUN __negdi2 ENDF __negdi2 #endif /* L_negdi2 */ +#undef TT + #undef C7 #undef C6 #undef C5 @@ -2470,6 +2537,29 @@ DEFUN __ashldi3 ENDF __ashldi3 #endif /* defined (L_ashldi3) */ +#if defined (L_rotldi3) +;; Shift left +;; r25:r18 = rotl64 (r25:r18, r17:r16) +DEFUN __rotldi3 + push r16 + andi r16, 63 + breq 2f +1: lsl r18 + rol r19 + rol r20 + rol r21 + rol r22 + rol r23 + rol r24 + rol r25 + adc r18, __zero_reg__ + dec r16 + brne 1b +2: pop r16 + ret +ENDF __rotldi3 +#endif /* defined (L_rotldi3) */ + .section .text.libgcc.fmul, "ax", @progbits diff --git a/libgcc/config/avr/t-avr b/libgcc/config/avr/t-avr index 7d7dc9e..6568160 100644 --- a/libgcc/config/avr/t-avr +++ b/libgcc/config/avr/t-avr @@ -49,9 +49,9 @@ LIB1ASMFUNCS = \ _popcountqi2 \ _bswapsi2 \ _bswapdi2 \ - _ashldi3 \ - _ashrdi3 \ - _lshrdi3 \ + _ashldi3 _ashrdi3 _lshrdi3 _rotldi3 \ + _adddi3 _adddi3_s8 _subdi3 \ + _cmpdi2 _cmpdi2_s8 \ _fmul _fmuls _fmulsu LIB2FUNCS_EXCLUDE = \ |