aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorg-Johann Lay <avr@gjlay.de>2011-08-02 12:17:43 +0000
committerGeorg-Johann Lay <gjl@gcc.gnu.org>2011-08-02 12:17:43 +0000
commit7ea56b2382568eec303549248a2c1986f2385fd2 (patch)
tree55644c9a560f5e78c58957f75ccb7031b9f150a8
parent62be5d0aad9a968382ad5299f47189ca2a8faa59 (diff)
downloadgcc-7ea56b2382568eec303549248a2c1986f2385fd2.zip
gcc-7ea56b2382568eec303549248a2c1986f2385fd2.tar.gz
gcc-7ea56b2382568eec303549248a2c1986f2385fd2.tar.bz2
libgcc.S: Gather related function in the same input section.
* config/avr/libgcc.S: Gather related function in the same input section. __divmodsi4): Use XCALL/XJMP instead of rcall/rjmp for external references. (__udivmodqi4, __divmodqi4, __udivmodhi4, __divmodhi4, __udivmodsi4, __divmodsi4, __prologue_saves__, __epilogue_restores__, _exit, __tablejump2__, __tablejump__, __do_copy_data, __do_clear_bss, __do_global_ctors, __do_global_dtors, __tablejump_elpm__): Enclose in DEFUN/ENDF. From-SVN: r177133
-rw-r--r--gcc/ChangeLog13
-rw-r--r--gcc/config/avr/libgcc.S126
2 files changed, 77 insertions, 62 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 55ba5b0..f525c95 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,16 @@
+2011-08-02 Georg-Johann Lay <avr@gjlay.de>
+
+ * config/avr/libgcc.S: Gather related function in the
+ same input section.
+ (__mulqihi3, __mulqihi3, __divmodqi4, __divmodhi4, __udivmodsi4,
+ __divmodsi4): Use XCALL/XJMP instead of rcall/rjmp for external
+ references.
+ (__udivmodqi4, __divmodqi4, __udivmodhi4, __divmodhi4,
+ __udivmodsi4, __divmodsi4, __prologue_saves__,
+ __epilogue_restores__, _exit, __tablejump2__, __tablejump__,
+ __do_copy_data, __do_clear_bss, __do_global_ctors,
+ __do_global_dtors, __tablejump_elpm__): Enclose in DEFUN/ENDF.
+
2011-08-02 Uros Bizjak <ubizjak@gmail.com>
PR target/47766
diff --git a/gcc/config/avr/libgcc.S b/gcc/config/avr/libgcc.S
index 7bd21a3..a4e4b42 100644
--- a/gcc/config/avr/libgcc.S
+++ b/gcc/config/avr/libgcc.S
@@ -34,7 +34,15 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
This can make better code because GCC knows exactly which
of the call-used registers (not all of them) are clobbered. */
- .section .text.libgcc, "ax", @progbits
+/* FIXME: At present, there is no SORT directive in the linker
+ script so that we must not assume that different modules
+ in the same input section like .libgcc.text.mul will be
+ located close together. Therefore, we cannot use
+ RCALL/RJMP to call a function like __udivmodhi4 from
+ __divmodhi4 and have to use lengthy XCALL/XJMP even
+ though they are in the same input section and all same
+ input sections together are small enough to reach every
+ location with a RCALL/RJMP instruction. */
.macro mov_l r_dest, r_src
#if defined (__AVR_HAVE_MOVW__)
@@ -72,6 +80,8 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
.endm
+.section .text.libgcc.mul, "ax", @progbits
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
/* Note: mulqi3, mulhi3 are open-coded on the enhanced core. */
#if !defined (__AVR_HAVE_MUL__)
@@ -112,7 +122,7 @@ DEFUN __mulqihi3
clr r23
sbrc r22, 7
dec r22
- rjmp __mulhi3
+ XJMP __mulhi3
ENDF __mulqihi3:
#endif /* defined (L_mulqihi3) */
@@ -120,7 +130,7 @@ ENDF __mulqihi3:
DEFUN __umulqihi3
clr r25
clr r23
- rjmp __mulhi3
+ XJMP __mulhi3
ENDF __umulqihi3
#endif /* defined (L_umulqihi3) */
@@ -447,6 +457,8 @@ ENDF __mulsi3
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+.section .text.libgcc.div, "ax", @progbits
+
/*******************************************************
Division 8 / 8 => (result + remainder)
*******************************************************/
@@ -456,9 +468,7 @@ ENDF __mulsi3
#define r_cnt r23 /* loop count */
#if defined (L_udivmodqi4)
- .global __udivmodqi4
- .func __udivmodqi4
-__udivmodqi4:
+DEFUN __udivmodqi4
sub r_rem,r_rem ; clear remainder and carry
ldi r_cnt,9 ; init loop counter
rjmp __udivmodqi4_ep ; jump to entry point
@@ -474,13 +484,11 @@ __udivmodqi4_ep:
com r_arg1 ; complement result
; because C flag was complemented in loop
ret
- .endfunc
+ENDF __udivmodqi4
#endif /* defined (L_udivmodqi4) */
#if defined (L_divmodqi4)
- .global __divmodqi4
- .func __divmodqi4
-__divmodqi4:
+DEFUN __divmodqi4
bst r_arg1,7 ; store sign of dividend
mov __tmp_reg__,r_arg1
eor __tmp_reg__,r_arg2; r0.7 is sign of result
@@ -488,7 +496,7 @@ __divmodqi4:
neg r_arg1 ; dividend negative : negate
sbrc r_arg2,7
neg r_arg2 ; divisor negative : negate
- rcall __udivmodqi4 ; do the unsigned div/mod
+ XCALL __udivmodqi4 ; do the unsigned div/mod
brtc __divmodqi4_1
neg r_rem ; correct remainder sign
__divmodqi4_1:
@@ -496,7 +504,7 @@ __divmodqi4_1:
neg r_arg1 ; correct result sign
__divmodqi4_exit:
ret
- .endfunc
+ENDF __divmodqi4
#endif /* defined (L_divmodqi4) */
#undef r_rem
@@ -522,9 +530,7 @@ __divmodqi4_exit:
#define r_cnt r21 /* loop count */
#if defined (L_udivmodhi4)
- .global __udivmodhi4
- .func __udivmodhi4
-__udivmodhi4:
+DEFUN __udivmodhi4
sub r_remL,r_remL
sub r_remH,r_remH ; clear remainder and carry
ldi r_cnt,17 ; init loop counter
@@ -550,13 +556,11 @@ __udivmodhi4_ep:
mov_l r_arg1L, r_remL ; remainder
mov_h r_arg1H, r_remH
ret
- .endfunc
+ENDF __udivmodhi4
#endif /* defined (L_udivmodhi4) */
#if defined (L_divmodhi4)
- .global __divmodhi4
- .func __divmodhi4
-__divmodhi4:
+DEFUN __divmodhi4
.global _div
_div:
bst r_arg1H,7 ; store sign of dividend
@@ -565,7 +569,7 @@ _div:
rcall __divmodhi4_neg1 ; dividend negative : negate
sbrc r_arg2H,7
rcall __divmodhi4_neg2 ; divisor negative : negate
- rcall __udivmodhi4 ; do the unsigned div/mod
+ XCALL __udivmodhi4 ; do the unsigned div/mod
rcall __divmodhi4_neg1 ; correct remainder sign
tst __tmp_reg__
brpl __divmodhi4_exit
@@ -581,7 +585,7 @@ __divmodhi4_neg1:
neg r_arg1L ; correct dividend/remainder sign
sbci r_arg1H,0xff
ret
- .endfunc
+ENDF __divmodhi4
#endif /* defined (L_divmodhi4) */
#undef r_remH
@@ -618,9 +622,7 @@ __divmodhi4_neg1:
#define r_cnt __zero_reg__ /* loop count (0 after the loop!) */
#if defined (L_udivmodsi4)
- .global __udivmodsi4
- .func __udivmodsi4
-__udivmodsi4:
+DEFUN __udivmodsi4
ldi r_remL, 33 ; init loop counter
mov r_cnt, r_remL
sub r_remL,r_remL
@@ -664,20 +666,18 @@ __udivmodsi4_ep:
mov_l r_arg1HL, r_remHL
mov_h r_arg1HH, r_remHH
ret
- .endfunc
+ENDF __udivmodsi4
#endif /* defined (L_udivmodsi4) */
#if defined (L_divmodsi4)
- .global __divmodsi4
- .func __divmodsi4
-__divmodsi4:
+DEFUN __divmodsi4
bst r_arg1HH,7 ; store sign of dividend
mov __tmp_reg__,r_arg1HH
eor __tmp_reg__,r_arg2HH ; r0.7 is sign of result
rcall __divmodsi4_neg1 ; dividend negative : negate
sbrc r_arg2HH,7
rcall __divmodsi4_neg2 ; divisor negative : negate
- rcall __udivmodsi4 ; do the unsigned div/mod
+ XCALL __udivmodsi4 ; do the unsigned div/mod
rcall __divmodsi4_neg1 ; correct remainder sign
rol __tmp_reg__
brcc __divmodsi4_exit
@@ -701,17 +701,18 @@ __divmodsi4_neg1:
sbci r_arg1HL,0xff
sbci r_arg1HH,0xff
ret
- .endfunc
+ENDF __divmodsi4
#endif /* defined (L_divmodsi4) */
+
+.section .text.libgcc.prologue, "ax", @progbits
+
/**********************************
* This is a prologue subroutine
**********************************/
#if defined (L_prologue)
- .global __prologue_saves__
- .func __prologue_saves__
-__prologue_saves__:
+DEFUN __prologue_saves__
push r2
push r3
push r4
@@ -745,7 +746,7 @@ __prologue_saves__:
ijmp
#endif
-.endfunc
+ENDF __prologue_saves__
#endif /* defined (L_prologue) */
/*
@@ -753,9 +754,7 @@ __prologue_saves__:
*/
#if defined (L_epilogue)
- .global __epilogue_restores__
- .func __epilogue_restores__
-__epilogue_restores__:
+DEFUN __epilogue_restores__
ldd r2,Y+18
ldd r3,Y+17
ldd r4,Y+16
@@ -784,17 +783,15 @@ __epilogue_restores__:
mov_l r28, r26
mov_h r29, r27
ret
-.endfunc
+ENDF __epilogue_restores__
#endif /* defined (L_epilogue) */
#ifdef L_exit
.section .fini9,"ax",@progbits
- .global _exit
- .func _exit
-_exit:
+DEFUN _exit
.weak exit
exit:
- .endfunc
+ENDF _exit
/* Code from .fini8 ... .fini1 sections inserted by ld script. */
@@ -812,14 +809,17 @@ _cleanup:
.endfunc
#endif /* defined (L_cleanup) */
+
+.section .text.libgcc, "ax", @progbits
+
#ifdef L_tablejump
- .global __tablejump2__
- .func __tablejump2__
-__tablejump2__:
+DEFUN __tablejump2__
lsl r30
rol r31
- .global __tablejump__
-__tablejump__:
+ ;; FALLTHRU
+ENDF __tablejump2__
+
+DEFUN __tablejump__
#if defined (__AVR_HAVE_LPMX__)
lpm __tmp_reg__, Z+
lpm r31, Z
@@ -842,13 +842,12 @@ __tablejump__:
#endif
ret
#endif
- .endfunc
+ENDF __tablejump__
#endif /* defined (L_tablejump) */
#ifdef L_copy_data
.section .init4,"ax",@progbits
- .global __do_copy_data
-__do_copy_data:
+DEFUN __do_copy_data
#if defined(__AVR_HAVE_ELPMX__)
ldi r17, hi8(__data_end)
ldi r26, lo8(__data_start)
@@ -905,14 +904,14 @@ __do_copy_data:
cpc r27, r17
brne .L__do_copy_data_loop
#endif /* !defined(__AVR_HAVE_ELPMX__) && !defined(__AVR_HAVE_ELPM__) */
+ENDF __do_copy_data
#endif /* L_copy_data */
/* __do_clear_bss is only necessary if there is anything in .bss section. */
#ifdef L_clear_bss
.section .init4,"ax",@progbits
- .global __do_clear_bss
-__do_clear_bss:
+DEFUN __do_clear_bss
ldi r17, hi8(__bss_end)
ldi r26, lo8(__bss_start)
ldi r27, hi8(__bss_start)
@@ -923,6 +922,7 @@ __do_clear_bss:
cpi r26, lo8(__bss_end)
cpc r27, r17
brne .do_clear_bss_loop
+ENDF __do_clear_bss
#endif /* L_clear_bss */
/* __do_global_ctors and __do_global_dtors are only necessary
@@ -930,9 +930,8 @@ __do_clear_bss:
#ifdef L_ctors
.section .init6,"ax",@progbits
- .global __do_global_ctors
+DEFUN __do_global_ctors
#if defined(__AVR_HAVE_RAMPZ__)
-__do_global_ctors:
ldi r17, hi8(__ctors_start)
ldi r28, lo8(__ctors_end)
ldi r29, hi8(__ctors_end)
@@ -952,7 +951,6 @@ __do_global_ctors:
cpc r16, r24
brne .L__do_global_ctors_loop
#else
-__do_global_ctors:
ldi r17, hi8(__ctors_start)
ldi r28, lo8(__ctors_end)
ldi r29, hi8(__ctors_end)
@@ -967,13 +965,13 @@ __do_global_ctors:
cpc r29, r17
brne .L__do_global_ctors_loop
#endif /* defined(__AVR_HAVE_RAMPZ__) */
+ENDF __do_global_ctors
#endif /* L_ctors */
#ifdef L_dtors
.section .fini6,"ax",@progbits
- .global __do_global_dtors
+DEFUN __do_global_dtors
#if defined(__AVR_HAVE_RAMPZ__)
-__do_global_dtors:
ldi r17, hi8(__dtors_end)
ldi r28, lo8(__dtors_start)
ldi r29, hi8(__dtors_start)
@@ -993,7 +991,6 @@ __do_global_dtors:
cpc r16, r24
brne .L__do_global_dtors_loop
#else
-__do_global_dtors:
ldi r17, hi8(__dtors_end)
ldi r28, lo8(__dtors_start)
ldi r29, hi8(__dtors_start)
@@ -1008,12 +1005,13 @@ __do_global_dtors:
cpc r29, r17
brne .L__do_global_dtors_loop
#endif /* defined(__AVR_HAVE_RAMPZ__) */
+ENDF __do_global_dtors
#endif /* L_dtors */
+.section .text.libgcc, "ax", @progbits
+
#ifdef L_tablejump_elpm
- .global __tablejump_elpm__
- .func __tablejump_elpm__
-__tablejump_elpm__:
+DEFUN __tablejump_elpm__
#if defined (__AVR_HAVE_ELPM__)
#if defined (__AVR_HAVE_LPMX__)
elpm __tmp_reg__, Z+
@@ -1037,10 +1035,12 @@ __tablejump_elpm__:
ret
#endif
#endif /* defined (__AVR_HAVE_ELPM__) */
- .endfunc
+ENDF __tablejump_elpm__
#endif /* defined (L_tablejump_elpm) */
+.section .text.libgcc.builtins, "ax", @progbits
+
/**********************************
* Find first set Bit (ffs)
**********************************/
@@ -1440,6 +1440,8 @@ DEFUN __ashldi3
ENDF __ashldi3
#endif /* defined (L_ashldi3) */
+
+.section .text.libgcc.fmul, "ax", @progbits
/***********************************************************/
;;; Softmul versions of FMUL, FMULS and FMULSU to implement