]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
t-m68hc11-gas (LIB1ASMFUNCS): Build __far_trampoline.
authorStephane Carrez <ciceron@gcc.gnu.org>
Wed, 14 Aug 2002 07:32:52 +0000 (09:32 +0200)
committerStephane Carrez <ciceron@gcc.gnu.org>
Wed, 14 Aug 2002 07:32:52 +0000 (09:32 +0200)
* config/m68hc11/t-m68hc11-gas (LIB1ASMFUNCS): Build __far_trampoline.
(MULTILIB_OPTIONS): Must also generate for -mlong-calls.

* config/m68hc11/larith.asm: Put a mode for ELF ABI flags.
(ret, declare, farsym): New gas macros.
(__premain, exit, abort, _cleanup, memcpy, memset, ___adddi3,
___subdi3, ___notdi2, __mulhi32, __mulsi3): Use them to use 'rtc'
and declare the symbol far when compiled with -mlong-calls.
(__far_trampoline): New for 68HC12 trampoline code to invoke a
far handler using jsr/bsr.

* config/m68hc11/m68hc11-crt0.S: Put a mode for ELF ABI flags.
(jsr): New macro to transform a 'jsr' into a 'call'.

From-SVN: r56282

gcc/config/m68hc11/larith.asm
gcc/config/m68hc11/m68hc11-crt0.S
gcc/config/m68hc11/t-m68hc11-gas

index 2a0727b3d4ee403bb378a1651783904682b96337..80b881747370dcf7f9ec63a9b8f3b3bd5e47ac08 100644 (file)
@@ -35,23 +35,63 @@ Boston, MA 02111-1307, USA.  */
 
        .file "larith.asm"
 
+#ifdef __HAVE_SHORT_INT__
+       .mode mshort
+#else
+       .mode mlong
+#endif
+
+#if defined(__USE_RTC__) && defined(mc68hc12)
+# define ARG(N) N+1
+
+       .macro ret
+       rtc
+       .endm
+
+       .macro declare name
+       .globl \name
+       .type  \name,@function
+       .size  \name,.Lend-\name
+       .far   \name
+\name:
+       .endm
+
+       .macro farsym name
+       .far NAME
+       .endm
+
+#else
+# define ARG(N) N
+
+       .macro ret
+       rts
+       .endm
+
+       .macro farsym name
+       .endm
+
+       .macro declare name
+       .globl \name
+       .type  \name,@function
+       .size  \name,.Lend-\name
+\name:
+       .endm
+
+#endif
+
        .sect .text
        
 
 #define REG(NAME)                      \
-NAME:  .word 0;                        \
+NAME:  .dc.w   1;                      \
        .type NAME,@object ;            \
        .size NAME,2
 
 #ifdef L_regs_min
 /* Pseudo hard registers used by gcc.
-   They must be located in page0. 
-   They will normally appear at the end of .page0 section.  */
-#ifdef mc68hc12
-       .sect .bss
-#else
-       .sect .page0
-#endif
+   They should be located in page0.  */
+
+       .sect .softregs
        .globl _.tmp
        .globl _.z,_.xy
 REG(_.tmp)
@@ -61,54 +101,34 @@ REG(_.xy)
 #endif
 
 #ifdef L_regs_frame
-#ifdef mc68hc12
-       .sect .bss
-#else
-       .sect .page0
-#endif
+       .sect .softregs
        .globl _.frame
 REG(_.frame)
 #endif
 
 #ifdef L_regs_d1_2
-#ifdef mc68hc12
-       .sect .bss
-#else
-       .sect .page0
-#endif
+       .sect .softregs
        .globl _.d1,_.d2
 REG(_.d1)
 REG(_.d2)
 #endif
 
 #ifdef L_regs_d3_4
-#ifdef mc68hc12
-       .sect .bss
-#else
-       .sect .page0
-#endif
+       .sect .softregs
        .globl _.d3,_.d4
 REG(_.d3)
 REG(_.d4)
 #endif
 
 #ifdef L_regs_d5_6
-#ifdef mc68hc12
-       .sect .bss
-#else
-       .sect .page0
-#endif
+       .sect .softregs
        .globl _.d5,_.d6
 REG(_.d5)
 REG(_.d6)
 #endif
 
 #ifdef L_regs_d7_8
-#ifdef mc68hc12
-       .sect .bss
-#else
-       .sect .page0
-#endif
+       .sect .softregs
        .globl _.d7,_.d8
 REG(_.d7)
 REG(_.d8)
@@ -116,9 +136,8 @@ REG(_.d8)
 
 #ifdef L_regs_d9_16
 /* Pseudo hard registers used by gcc.
-   They must be located in page0. 
-   They will normally appear at the end of .page0 section.  */
-       .sect .page0
+   They should be located in page0.  */
+       .sect .softregs
        .globl _.d9,_.d10,_.d11,_.d12,_.d13,_.d14
        .globl _.d15,_.d16
 REG(_.d9)
@@ -134,13 +153,8 @@ REG(_.d16)
 
 #ifdef L_regs_d17_32
 /* Pseudo hard registers used by gcc.
-   They must be located in page0. 
-   They will normally appear at the end of .page0 section.  */
-#ifdef mc68hc12
-       .sect .bss
-#else
-       .sect .page0
-#endif
+   They should be located in page0.  */
+       .sect .softregs
        .globl _.d17,_.d18,_.d19,_.d20,_.d21,_.d22
        .globl _.d23,_.d24,_.d25,_.d26,_.d27,_.d28
        .globl _.d29,_.d30,_.d31,_.d32
@@ -167,12 +181,10 @@ REG(_.d32)
 ;; Specific initialization for 68hc11 before the main.
 ;; Nothing special for a generic routine; Just enable interrupts.
 ;;
-       .sect .text
-       .globl __premain
-__premain:
+       declare __premain
        clra
        tap     ; Clear both I and X.
-       rts
+       ret
 #endif
 
 #ifdef L__exit
@@ -195,6 +207,8 @@ __premain:
        .globl _exit
        .globl exit
        .weak  exit
+       farsym  exit
+       farsym  _exit
 exit:
 _exit:
 
@@ -209,9 +223,8 @@ fatal:
 ;;
 ;; Abort operation.  This is defined for the GCC testsuite.
 ;;
-       .sect .text
-       .globl abort
-abort:
+       declare abort
+
        ldd     #255            ; 
 #ifdef mc68hc12
        trap    #0x30
@@ -226,20 +239,19 @@ abort:
 ;;
 ;; Cleanup operation used by exit().
 ;;
-       .sect .text
-       .globl _cleanup
-_cleanup:
-       rts
+       declare _cleanup
+
+       ret
 #endif
 
 ;-----------------------------------------
 ; required gcclib code
 ;-----------------------------------------
 #ifdef L_memcpy
-       .sect .text
+       declare memcpy
+       declare __memcpy
+
        .weak memcpy
-       .globl memcpy
-       .globl __memcpy
 ;;;
 ;;; void* memcpy(void*, const void*, size_t)
 ;;; 
@@ -247,11 +259,9 @@ _cleanup:
 ;;; 2,sp = src Pmode
 ;;; 4,sp = size        HImode (size_t)
 ;;; 
-__memcpy:
-memcpy:
 #ifdef mc68hc12
-       ldx     2,sp
-       ldy     4,sp
+       ldx     ARG(2),sp
+       ldy     ARG(4),sp
        pshd
        xgdy
        lsrd
@@ -264,7 +274,7 @@ Loop:
        dbne    d,Loop
 Done:
        puld
-       rts
+       ret
 #else
        xgdy
        tsx
@@ -294,9 +304,8 @@ End:
 #endif
 
 #ifdef L_memset
-       .sect .text
-       .globl memset
-       .globl __memset
+       declare memset
+       declare __memset
 ;;;
 ;;; void* memset(void*, int value, size_t)
 ;;; 
@@ -304,17 +313,15 @@ End:
 ;;; D    = dst Pmode
 ;;; 2,sp = src SImode
 ;;; 6,sp = size        HImode (size_t)
-       val  = 5
-       size = 6
+       val  = ARG(5)
+       size = ARG(6)
 #else
 ;;; D    = dst Pmode
 ;;; 2,sp = src SImode
 ;;; 6,sp = size        HImode (size_t)
-       val  = 3
-       size = 4
+       val  = ARG(3)
+       size = ARG(4)
 #endif
-__memset:
-memset:
 #ifdef mc68hc12
        xgdx
        ldab    val,sp
@@ -326,7 +333,7 @@ Loop:
        dbne    y,Loop
 End:
        puld
-       rts
+       ret
 #else
        xgdx
        tsy
@@ -345,95 +352,89 @@ End:
        rts
 #endif
 #endif
-               
+
 #ifdef L_adddi3
-       .sect .text
-       .globl ___adddi3
+       declare ___adddi3
 
-___adddi3:
        tsx
        xgdy
-       ldd     8,x             ; Add LSB
-       addd    16,x
-       std     6,y             ; Save (carry preserved)
-
-       ldd     6,x
-       adcb    15,x
-       adca    14,x
-       std     4,y
-
-       ldd     4,x
-       adcb    13,x
-       adca    12,x
-       std     2,y
+       ldd     ARG(8),x                ; Add LSB
+       addd    ARG(16),x
+       std     ARG(6),y                ; Save (carry preserved)
+
+       ldd     ARG(6),x
+       adcb    ARG(15),x
+       adca    ARG(14),x
+       std     ARG(4),y
+
+       ldd     ARG(4),x
+       adcb    ARG(13),x
+       adca    ARG(12),x
+       std     ARG(2),y
        
-       ldd     2,x
-       adcb    11,x            ; Add MSB
-       adca    10,x
-       std     0,y
+       ldd     ARG(2),x
+       adcb    ARG(11),x               ; Add MSB
+       adca    ARG(10),x
+       std     ARG(0),y
 
        xgdy
-       rts
+       ret
 #endif
 
 #ifdef L_subdi3
-       .sect .text
-       .globl ___subdi3
+       declare ___subdi3
 
-___subdi3:
        tsx
        xgdy
-       ldd     8,x             ; Subtract LSB
-       subd    16,x
-       std     6,y             ; Save, borrow preserved
-
-       ldd     6,x
-       sbcb    15,x
-       sbca    14,x
-       std     4,y
-
-       ldd     4,x
-       sbcb    13,x
-       sbca    12,x
-       std     2,y
+       ldd     ARG(8),x                ; Subtract LSB
+       subd    ARG(16),x
+       std     ARG(6),y                ; Save, borrow preserved
+
+       ldd     ARG(6),x
+       sbcb    ARG(15),x
+       sbca    ARG(14),x
+       std     ARG(4),y
+
+       ldd     ARG(4),x
+       sbcb    ARG(13),x
+       sbca    ARG(12),x
+       std     ARG(2),y
        
-       ldd     2,x             ; Subtract MSB
-       sbcb    11,x
-       sbca    10,x
-       std     0,y
+       ldd     ARG(2),x                ; Subtract MSB
+       sbcb    ARG(11),x
+       sbca    ARG(10),x
+       std     ARG(0),y
 
        xgdy                    ;
-       rts
+       ret
 #endif
        
 #ifdef L_notdi2
-       .sect .text
-       .globl ___notdi2
+        declare        ___notdi2
 
-___notdi2:
        tsy
        xgdx
-       ldd     8,y
+       ldd     ARG(8),y
        coma
        comb
-       std     6,x
+       std     ARG(6),x
        
-       ldd     6,y
+       ldd     ARG(6),y
        coma
        comb
-       std     4,x
+       std     ARG(4),x
 
-       ldd     4,y
+       ldd     ARG(4),y
        coma
        comb
-       std     2,x
+       std     ARG(2),x
 
-       ldd     2,y
+       ldd     ARG(2),y
        coma
        comb
-       std     0,x
+       std     ARG(0),x
        xgdx
-       rts
+       ret
 #endif
        
 #ifdef L_negsi2
@@ -845,8 +846,6 @@ ___mulhi3:
 #endif
 
 #ifdef L_mulhi32
-       .sect .text
-       .globl __mulhi32
 
 ;
 ;
@@ -880,12 +879,13 @@ ___mulhi3:
 ;      <A-low>    1,x
 ;      <A-high>   0,x
 ;
-__mulhi32:
+       declare __mulhi32
+
 #ifdef mc68hc12
-       ldy     2,sp
+       ldy     ARG(2),sp
        emul
        exg     x,y
-       rts
+       ret
 #else
        pshx                    ; Room for temp value
        pshb
@@ -925,8 +925,6 @@ Ret:
 #endif
 
 #ifdef L_mulsi3
-       .sect .text
-       .globl __mulsi3
 
 ;
 ;      <B-low>    8,y
@@ -945,22 +943,23 @@ Ret:
 ;
 ;
 
-__mulsi3:
+       declare __mulsi3
+
 #ifdef mc68hc12
        pshd                            ; Save A.low
-       ldy     4,sp
+       ldy     ARG(4),sp
        emul                            ; A.low * B.high
-       ldy     6,sp
+       ldy     ARG(6),sp
        exg     x,d
        emul                            ; A.high * B.low
        leax    d,x
-       ldy     6,sp
+       ldy     ARG(6),sp
        puld
        emul                            ; A.low * B.low
        exg     d,y
        leax    d,x
        exg     d,y
-       rts
+       ret
 #else
 B_low  =       8
 B_high =       6
@@ -1186,6 +1185,39 @@ dtors_done:
 
 #endif
 
+#ifdef L_far_tramp
+#ifdef mc68hc12
+       .sect   .text
+       .globl  __far_trampoline
+
+;; This is a trampoline used by the linker to invoke a function
+;; using rtc to return and being called with jsr/bsr.
+;; The trampoline generated is:
+;;
+;;     foo_tramp:
+;;             ldy     #foo
+;;             call    __far_trampoline,page(foo)
+;;
+;; The linker transforms:
+;;
+;;             jsr     foo
+;;
+;; into
+;;             jsr     foo_tramp
+;;
+;; The linker generated trampoline and _far_trampoline must be in 
+;; non-banked memory.
+;;
+__far_trampoline:
+       movb    0,sp, 2,sp      ; Copy page register below the caller's return
+       leas    2,sp            ; address.
+       jmp     0,y             ; We have a 'call/rtc' stack layout now
+                               ; and can jump to the far handler
+                               ; (whose memory bank is mapped due to the
+                               ; call to the trampoline).
+#endif
+#endif
+.Lend:
 ;-----------------------------------------
 ; end required gcclib code
 ;-----------------------------------------
index 2e6a14476b9ae5253cf79739629a8e7f1fa8affd..9351ee69c49157c96919866bbf3639674e3320f8 100644 (file)
@@ -1,5 +1,5 @@
 /* Startup code for M68HC11.
-   Copyright (C) 1999, 2000 Free Software Foundation, Inc.
+   Copyright (C) 1999, 2000, 2002 Free Software Foundation, Inc.
 
 This file is free software; you can redistribute it and/or modify it
 under the terms of the GNU General Public License as published by the
@@ -36,6 +36,17 @@ Boston, MA 02111-1307, USA.  */
 ;-----------------------------------------
        .file   "crt0.s"
 
+#ifdef __HAVE_SHORT_INT__
+       .mode mshort
+#else
+       .mode mlong
+#endif
+
+#if defined(__USE_RTC__) && defined(mc68hc12)
+       .macro jsr name
+       call    \name
+       .endm
+#endif
 ;; 
 ;; 
 ;; The linker concatenate the .install* sections in the following order:
index 7dd74456d5743c311fb849c4897610f62b27e419..8201f3909bedbc527c1d1f43342153890a45bf1c 100644 (file)
@@ -25,7 +25,7 @@ LIB1ASMFUNCS = _mulsi3 \
        _premain __exit _abort _cleanup \
        _adddi3 _subdi3 _notdi2 \
        _ashrhi3 _lshrhi3 _lshlhi3 _ashrqi3 _lshlqi3 _map_data _init_bss \
-       _ctor _dtor
+       _ctor _dtor __far_trampoline
 
 TARGET_LIBGCC2_CFLAGS = -DUSE_GAS -DIN_GCC
 
@@ -37,10 +37,10 @@ LIB2FUNCS_EXTRA = $(srcdir)/config/udivmodsi4.c \
 LIBGCC2_DEBUG_CFLAGS =
 LIBGCC2_CFLAGS = -Os $(LIBGCC2_INCLUDES) $(TARGET_LIBGCC2_CFLAGS) $(LIBGCC2_DEBUG_CFLAGS) $(GTHREAD_FLAGS) -DIN_LIBGCC2
 
-MULTILIB_OPTIONS  = m68hc11/m68hc12 mshort fshort-double
+MULTILIB_OPTIONS  = m68hc11/m68hc12 mshort fshort-double mlong-calls
 MULTILIB_DIRNAMES =
 MULTILIB_MATCHES  = m68hc11=m6811 m68hc12=m6812
-MULTILIB_EXCEPTIONS = -mnoshort -mno68hc11
+MULTILIB_EXCEPTIONS = -mnoshort -mno68hc11 -mnolong-calls
 
 LIBGCC = stmp-multilib
 INSTALL_LIBGCC = install-multilib