diff options
Diffstat (limited to 'newlib/libc/machine/fr30/setjmp.S')
-rw-r--r-- | newlib/libc/machine/fr30/setjmp.S | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/newlib/libc/machine/fr30/setjmp.S b/newlib/libc/machine/fr30/setjmp.S new file mode 100644 index 0000000..98ac44d --- /dev/null +++ b/newlib/libc/machine/fr30/setjmp.S @@ -0,0 +1,64 @@ +# setjmp/longjmp for FR30. The jmpbuf looks like this: +# +# Register jmpbuf offset +# R8 0x00 +# R9 0x04 +# R10 0x08 +# R11 0x0c +# R12 0x10 +# R13 0x14 +# R14 (FP) 0x18 +# R15 (SP) 0x1c +# RP 0x20 + +.macro save reg + st \reg,@r4 + add #4,r4 +.endm + +.macro restore reg + ld @r4,\reg + add #4,r4 +.endm + + + .text + .global setjmp +setjmp: + save r8 + save r9 + save r10 + save r11 + save r12 + save r13 + save r14 + save r15 + mov RP,r5 + st r5,@r4 + +# Return 0 to caller. + ldi:8 #0,r4 + ret + + .global longjmp +longjmp: + restore r8 + restore r9 + restore r10 + restore r11 + restore r12 + restore r13 + restore r14 + restore r15 + ld @r4,r4 + mov r4,RP + +# If caller attempted to return 0, return 1 instead. + + mov r5,r4 + or r4,r4 + bne 1f + ldi:8 #1,r4 + 1: + ret +
\ No newline at end of file |