diff options
Diffstat (limited to 'newlib/libc/machine/d10v/setjmp.S')
-rw-r--r-- | newlib/libc/machine/d10v/setjmp.S | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/newlib/libc/machine/d10v/setjmp.S b/newlib/libc/machine/d10v/setjmp.S new file mode 100644 index 0000000..22287dd --- /dev/null +++ b/newlib/libc/machine/d10v/setjmp.S @@ -0,0 +1,55 @@ +; setjmp/longjmp for D10V. The jmpbuf looks like this: +; +; Register jmpbuf offset +; R6 0x00 +; R7 0x02 +; R8 0x04 +; R9 0x06 +; R10 0x08 +; R11 0x0a +; R13 (return address) 0x0c +; R15 (SP) 0x0E + + .text + .globl setjmp + .type setjmp,@function + .stabs "setjmp.S",100,0,0,setjmp + .stabs "int:t(0,1)=r(0,1);-65536;65535;",128,0,0,0 + .stabs "setjmp:F(0,1)",36,0,1,setjmp + +setjmp: +; Address of jmpbuf is passed in R0. Save the appropriate registers. + st2w r6, @r0+ + st2w r8, @r0+ + st2w r10, @r0+ + st r13, @r0+ + st r15, @r0+ + +; Return 0 to caller + ldi r0, 0 + jmp r13 +.Lsetjmp: + .size setjmp,.Lsetjmp-setjmp + .stabs "",36,0,0,.Lsetjmp-setjmp + + .globl longjmp + .type longjmp,@function + .stabs "longjmp:F(0,1)",36,0,1,longjmp +longjmp: +; Address of jmpbuf is in R0. Restore the registers. + ld2w r6, @r0+ + ld2w r8, @r0+ + ld2w r10, @r0+ + ld r13, @r0+ + ld r15, @r0+ + +; Value to return to caller is in R1. If caller attemped to return 0, +; return 1 instead. + + mv r0, r1 + cmpeqi r0, 0 + exef0t || ldi r0,1 + jmp r13 +.Llongjmp: + .size longjmp,.Llongjmp-longjmp + .stabs "",36,0,0,.Llongjmp-longjmp |