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