# 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 | |