CVS: msp430-libc/src/stdlib __do_clear_bss.S, NONE, 1.1.2.1 __do_copy_data.S, NONE, 1.1.2.1 __do_global_ctors.S, NONE, 1.1.2.1 __do_global_dtors.S, NONE, 1.1.2.1 __init_stack.S, NONE, 1.1.2.1 __jump_to_main.S, NONE, 1.1.2.1 __low_level_init.S, NONE, 1.1.2.1 __stop_progexec__.S, NONE, 1.1.2.1 _unexpected_.S, NONE, 1.1.2.1 div.S, 1.3, 1.3.2.1 ldiv.S, 1.2, 1.2.2.1 mul10.S, 1.2, 1.2.2.1 setjmp.S, 1.3, 1.3.2.1

"Sergey A. Borshch" <[email protected]> Mon, 26 Jan 2009 15:47:15 +0000
Newsgroups gmane.comp.hardware.texas-instruments.msp430.gcc.cvs
Message-ID <[email protected]>
Update of /cvsroot/mspgcc/msp430-libc/src/stdlib
In directory 23jxhf1.ch3.sourceforge.com:/tmp/cvs-serv21574/src/stdlib

Modified Files:
      Tag: MSP430X
	div.S ldiv.S mul10.S setjmp.S 
Added Files:
      Tag: MSP430X
	__do_clear_bss.S __do_copy_data.S __do_global_ctors.S 
	__do_global_dtors.S __init_stack.S __jump_to_main.S 
	__low_level_init.S __stop_progexec__.S _unexpected_.S 
Log Message:
multilib support added. 
430X support added. 
crt functions moved from libgcc to libc.
setjmp rewritten.


--- NEW FILE: __do_clear_bss.S ---
/*****************************************************************
 * Initialize data: clear .bss
 * can be overwriten by user function with the same name
 *****************************************************************/
        .section .init4, "ax", @progbits

        .weak   __do_clear_bss
        .func   __do_clear_bss

__do_clear_bss:
        mov     #__bss_size, r15
        tst     r15
        jz      .L__clear_bss_end
.L__clear_bss_loop:
        dec     r15
        clr.b   __bss_start(r15)    ; RAM is always in lower 64K, so 430 instruction
                                    ; is acceptable here for 430X core too.
        jne     .L__clear_bss_loop
.L__clear_bss_end:

        .endfunc

--- NEW FILE: __do_copy_data.S ---
/*****************************************************************
 * Initialize data: copy data 
 * from __data_load_start ( = _etext) to __data_start
 * can be overwriten by user function with the same name
 *****************************************************************/
        .section .init4, "ax", @progbits

        .weak   __do_copy_data
        .func   __do_copy_data

__do_copy_data:
        mov     #__data_size, r15
        tst     r15
        jz      .L__copy_data_end
.L__copy_data_loop:
        decd    r15
#if defined(__MSP430X__) && !defined(__MSP430X_ADDR_16BIT__)
        ; __data_load_start can be anywhere, use 430X instruction
        movx.w  __data_load_start(r15), __data_start(r15)    ; data section is word-aligned, so word transfer is acceptable
#else
        ; __data_load_start is in lower 64K, RAM is in lower 64K, use 430 instruction
        mov.w   __data_load_start(r15), __data_start(r15)    ; data section is word-aligned, so word transfer is acceptable
#endif
        jne     .L__copy_data_loop
.L__copy_data_end:

        .endfunc

--- NEW FILE: __do_global_ctors.S ---
#include    "../core_common.inc"
/*****************************************************************
 * Call C++ global and static objects constructors
 * can be overwriten by user function with the same name
 *****************************************************************/
        .section .init6, "ax", @progbits

        .weak   __do_global_ctors
        .func   __do_global_ctors


__do_global_ctors:

        XMOVA   #__ctors_start, r11
        XMOVA   #__ctors_end,   r10
.L__ctors_loop:
        XCALL	@r11+	; call constructor
        XCMP    r10, r11
        jne     .L__ctors_loop

                                ; require linking of stack initialization
        .global	__init_stack    ; stack has to be set before constructors calling

        .endfunc

--- NEW FILE: __do_global_dtors.S ---
#include    "../core_common.inc"
/*****************************************************************
 * Call C++ global and static objects destructors
 * can be overwriten by user function with the same name
 *****************************************************************/
        .section .fini6,"ax",@progbits

        .weak   __do_global_dtors
        .func   __do_global_dtors

__do_global_dtors:
        XMOVA   #__dtors_start, r11
        XMOVA   #__dtors_end, r10
.L__dtors_loop:
        XCALL   @r11+
        XCMP    r10, r11
        jne     .L__dtors_loop

        .endfunc

--- NEW FILE: __init_stack.S ---
/*****************************************************************
 * Set stack pointer
 * can be overwriten by user function with the same name
 *****************************************************************/
        .section .init2, "ax", @progbits

        .weak   __init_stack
        .func   __init_stack

__init_stack:
        mov     #__stack, r1    ; stack always located on first 64K, so 430 instruction
                                ; is acceptable here for 430X core too.

        .endfunc

--- NEW FILE: __jump_to_main.S ---
#include    "../core_common.inc"
/*****************************************************************
 * jump to main.
 * can be overwriten by user function with the same name
 *****************************************************************/
        .section .init9, "ax", @progbits

        .weak   __jump_to_main
        .func   __jump_to_main

__jump_to_main:
        XBR      #main

        .endfunc

--- NEW FILE: __low_level_init.S ---
/*****************************************************************
 * Initialize peripherial, particularly disable watchdog
 * can be overwriten by user function with the same name
 *****************************************************************/
        .section .init3, "ax", @progbits

        .weak   __low_level_init
        .func   __low_level_init

__low_level_init:
        mov     #0x5a80, &__WDTCTL

        .endfunc

--- NEW FILE: __stop_progexec__.S ---
/*****************************************************************
 * return from main.
 * can be overwriten by user function with the same name
 *****************************************************************/
        .section .fini9, "ax", @progbits

        .weak	__stop_progExec__
        .func   __stop_progExec__

__stop_progExec__:

        .endfunc

/*****************************************************************
 * endless loop
 * can be overwriten by user together with __stop_progExec__
 * this function always linked together with __stop_progExec__,
 * because both are located in single source file.
 *****************************************************************/
        .section .fini0, "ax", @progbits

        .func   _endless_loop__
_endless_loop__:
        jmp  _endless_loop__

        .endfunc

--- NEW FILE: _unexpected_.S ---
/*****************************************************************
 * unexpected interrupt vector handler
 * can be overwriten by user function with the same name:
 * interrupt(NOVECTOR) _unexpected_() 
 * {
 *
 * }
 *
 *****************************************************************/

        .weak   _unexpected_

        .text
        .p2align 1,0
        
_unexpected_:
        reti

Index: div.S
===================================================================
RCS file: /cvsroot/mspgcc/msp430-libc/src/stdlib/div.S,v
retrieving revision 1.3
retrieving revision 1.3.2.1
diff -u -w -d -r1.3 -r1.3.2.1
--- div.S	24 Mar 2003 11:45:38 -0000	1.3
+++ div.S	26 Jan 2009 15:47:13 -0000	1.3.2.1
@@ -1,21 +1,32 @@
+#include    "../core_common.inc"
 /* ldiv() is the same as __divmodsi4() in libgcc */
 
 	.section .text
 	.global div
 div:
 ;; save clobbers first
-        push    r10
+#if defined(__MSP430X__)
+        XPUSHM  #2, r11
+#else
         push    r11
+        push    r10
+#endif
 ;; mov registers.
         mov     r14, r10	;; denom
         mov     r15, r12	;; num
 ;; divide
-        call    #__divmodhi4
+        XCALL   #__divmodhi4
 	mov	r14, r15
 	mov 	r12, r14
 ;; result is in there already...
 ;; restore regs and return.
-        pop     r11
+#if defined(__MSP430X__)
+        XPOPM   #2, r11
+        XRET
+#elif defined(__MSP430_SAVE_PROLOGUE__)
+        br      #__epilogue_restorer + 6 * 2
+#else
         pop     r10
+        pop     r11
         ret
-
+#endif

Index: ldiv.S
===================================================================
RCS file: /cvsroot/mspgcc/msp430-libc/src/stdlib/ldiv.S,v
retrieving revision 1.2
retrieving revision 1.2.2.1
diff -u -w -d -r1.2 -r1.2.2.1
--- ldiv.S	14 Oct 2002 07:53:42 -0000	1.2
+++ ldiv.S	26 Jan 2009 15:47:13 -0000	1.2.2.1
@@ -1,13 +1,18 @@
+#include    "../core_common.inc"
 /* ldiv() is the same as __divmodsi4() in libgcc */
 
 	.section .text
 	.global ldiv
 ldiv:
 ;; save clobbers first
-        push    r8
-        push    r9
-        push    r10
+#if defined(__MSP430X__)
+        XPUSHM  #2, r11
+#else
         push    r11
+        push    r10
+        push    r9
+        push    r8
+#endif
 ;; mov registers.
         mov     r13, r11	;; denom
         mov     r12, r10
@@ -17,9 +22,15 @@
         call    #__divmodsi4
 ;; result is in there already...
 ;; restore regs and return.
-        pop     r11
-        pop     r10
-        pop     r9
+#if defined(__MSP430X__)
+        XPOPM   #4, r11
+        XRET
+#elif defined(__MSP430_SAVE_PROLOGUE__)
+        br      #__epilogue_restorer + 4 * 2
+#else
         pop     r8
+        pop     r9
+        pop     r10
+        pop     r11
         ret
-
+#endif

Index: mul10.S
===================================================================
RCS file: /cvsroot/mspgcc/msp430-libc/src/stdlib/mul10.S,v
retrieving revision 1.2
retrieving revision 1.2.2.1
diff -u -w -d -r1.2 -r1.2.2.1
--- mul10.S	16 Jan 2002 14:06:35 -0000	1.2
+++ mul10.S	26 Jan 2009 15:47:13 -0000	1.2.2.1
@@ -32,7 +32,7 @@
  * int mul10(int)
  * Actually, the compiler does it better!
  */
-
+#include    "../core_common.inc"
 	.section .text
 	.global	__mulhi_const_10
 __mulhi_const_10:
@@ -41,5 +41,5 @@
 	rla	r15
 	add	r14, r15
 	rla	r15
-	ret
+	XRET
 

Index: setjmp.S
===================================================================
RCS file: /cvsroot/mspgcc/msp430-libc/src/stdlib/setjmp.S,v
retrieving revision 1.3
retrieving revision 1.3.2.1
diff -u -w -d -r1.3 -r1.3.2.1
--- setjmp.S	11 Jul 2002 12:28:36 -0000	1.3
+++ setjmp.S	26 Jan 2009 15:47:13 -0000	1.3.2.1
@@ -18,45 +18,48 @@
 WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 General Public License for more details.  */
+/*
+    2009-01-25 Sergey A. Borshch ([email protected])
+     - 430X compability added.
+     - storage order changed, code improved:
+        now: 87 cycles, 76 bytes (430) / 98 cycles, 78 bytes (430X)
+        was: 101 cycles, 98 bytes (430) / 120 cycles, 108 bytes (430X)
+*/
 
 /*
 extern int setjmp(jmp_buf __jmpb);
 extern void longjmp(jmp_buf __jmpb, int __ret) __ATTR_NORETURN__;
 */
-
+#include    "../core_common.inc"
 	.section .text
 	.global	setjmp
 	.global longjmp
-
 setjmp:
-	mov	@r1, 	0(r15)	;	save return address
-	mov	r1,	2(r15)	;	stack pointer
-	incd	2(r15)		;	postdec saved SP cause it contains ret addr
-	mov	r2,	4(r15)	;	status register
-	mov	r4,	6(r15)
-	mov	r5,	8(r15)
-	mov	r6,	10(r15)
-	mov	r7,	12(r15)
-	mov	r8,	14(r15)
-	mov	r9,	16(r15)
-	mov	r10,	18(r15)
-	mov	r11,	20(r15)
-	mov	#0, 	r15	;	return value
-	ret
-
-
-longjmp:
-	mov	r15,		r13
-	mov	r14, 		r15	; r15 now contains a return value
-	mov	2(r13),		r1	; restore registers
-	mov	4(r13),		r2
-	mov	6(r13),		r4
-	mov	8(r13),		r5
-	mov	10(r13),	r6
-	mov	12(r13),	r7
-	mov	14(r13),	r8
-	mov	16(r13),	r9
-	mov	18(r13),	r10
-	mov	20(r13),	r11
-	br	0(r13)			; jump...
+        XPOP    PUSH_BYTES * 10(r15)        ; save return address and adjust sp
+        XMOVA   r1,     PUSH_BYTES * 0(r15) ; stack pointer
+        XMOVA   r2,     PUSH_BYTES * 1(r15) ; status register
+        XMOVA   r4,     PUSH_BYTES * 2(r15)
+        XMOVA   r5,     PUSH_BYTES * 3(r15)
+        XMOVA   r6,     PUSH_BYTES * 4(r15)
+        XMOVA   r7,     PUSH_BYTES * 5(r15)
+        XMOVA   r8,     PUSH_BYTES * 6(r15)
+        XMOVA   r9,     PUSH_BYTES * 7(r15)
+        XMOVA   r10,    PUSH_BYTES * 8(r15)
+        XMOVA   r11,    PUSH_BYTES * 9(r15)
+        XMOVA   #0,     r15 ;   return value
+        XBR     -PUSH_BYTES(r1)
 
+longjump:
+        XMOVA   r15,    r13
+        XMOVA   r14,    r15     ; r15 now contains a return value
+        XMOVA   @r13+,  r1      ; restore registers
+        XMOVA   @R13+,  r2
+        XMOVA   @R13+,  r4
+        XMOVA   @R13+,  r5
+        XMOVA   @R13+,  r6
+        XMOVA   @R13+,  r7
+        XMOVA   @R13+,  r8
+        XMOVA   @R13+,  r9
+        XMOVA   @R13+,  r10
+        XMOVA   @R13+,  r11
+        XBR     @R13            ; jump...


------------------------------------------------------------------------------
This SF.net email is sponsored by:
SourcForge Community
SourceForge wants to tell your story.
http://p.sf.net/sfu/sf-spreadtheword