Retro68/gcc/newlib/libc/machine/m32r/setjmp.S
2012-03-27 01:51:53 +02:00

53 lines
802 B
ArmAsm

# setjmp/longjmp for m32r. The jmpbuf looks like this:
#
# Register jmpbuf offset
# reserved 0x00
# R8 0x04
# R9 0x08
# R10 0x0c
# R11 0x10
# R12 0x14
# R13 (FP) 0x18
# R14 (LR) 0x1c
# R15 (SP) 0x20
# reserved 0x24
.text
.global setjmp
setjmp:
;addi r0, #-4 ; commented out as first word is reserved
;st r1, @+r0
st r8, @+r0
st r9, @+r0
st r10, @+r0
st r11, @+r0
st r12, @+r0
st r13, @+r0
st r14, @+r0
st r15, @+r0
# Return 0 to caller.
ldi r0, #0
jmp lr
.global longjmp
longjmp:
addi r0, #4 ; first word is reserved
;ld r1, @r0+
ld r8, @r0+
ld r9, @r0+
ld r10, @r0+
ld r11, @r0+
ld r12, @r0+
ld r13, @r0+
ld r2, @r0+ ; return address
ld r15, @r0+
# If caller attempted to return 0, return 1 instead.
mv r0, r1
bnez r0, .Lnonzero
ldi r0, #1
.Lnonzero:
jmp r2