X-Git-Url: https://oss.titaniummirror.com/gitweb?a=blobdiff_plain;f=src%2Fstdlib%2Fsetjmp.S;fp=src%2Fstdlib%2Fsetjmp.S;h=81bb4e2c9a78fc185a03223cc9ee8a7c80ee6d12;hb=6f720ff00773571c2fa2d35e67bff68547617639;hp=53d9b3602658c1fbc4e37a603f8309561b55eb2b;hpb=807b2dd5b7365eb87b482197af3b4a3f520c14f7;p=msp430-libc.git diff --git a/src/stdlib/setjmp.S b/src/stdlib/setjmp.S index 53d9b36..81bb4e2 100644 --- a/src/stdlib/setjmp.S +++ b/src/stdlib/setjmp.S @@ -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...