]> oss.titaniummirror.com Git - msp430-libc.git/blobdiff - src/stdlib/setjmp.S
Imported msp430-libc-20100207
[msp430-libc.git] / src / stdlib / setjmp.S
index 53d9b3602658c1fbc4e37a603f8309561b55eb2b..81bb4e2c9a78fc185a03223cc9ee8a7c80ee6d12 100644 (file)
@@ -18,45 +18,48 @@ This file is distributed in the hope that it will be useful, but
 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 (sb-sf@users-sourceforge.net)
+     - 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...