107 lines
2.1 KiB
ArmAsm
107 lines
2.1 KiB
ArmAsm
|
; setjmp/longjmp for D30V.
|
||
|
|
||
|
.text
|
||
|
.globl setjmp
|
||
|
.type setjmp,@function
|
||
|
.stabs "setjmp.S",100,0,0,setjmp
|
||
|
.stabs "int:t(0,1)=r(0,1);-2147483648;2147483647;",128,0,0,0
|
||
|
.stabs "setjmp:F(0,1)",36,0,1,setjmp
|
||
|
|
||
|
setjmp:
|
||
|
; Address of jmpbuf is passed in R2. Save the appropriate registers.
|
||
|
st2w r26, @(r2+,r0)
|
||
|
st2w r28, @(r2+,r0)
|
||
|
st2w r30, @(r2+,r0)
|
||
|
st2w r32, @(r2+,r0)
|
||
|
st2w r34, @(r2+,r0)
|
||
|
st2w r36, @(r2+,r0)
|
||
|
st2w r38, @(r2+,r0)
|
||
|
st2w r40, @(r2+,r0)
|
||
|
st2w r42, @(r2+,r0)
|
||
|
st2w r44, @(r2+,r0)
|
||
|
st2w r46, @(r2+,r0)
|
||
|
st2w r48, @(r2+,r0)
|
||
|
st2w r50, @(r2+,r0)
|
||
|
st2w r52, @(r2+,r0)
|
||
|
st2w r54, @(r2+,r0)
|
||
|
st2w r56, @(r2+,r0)
|
||
|
st2w r58, @(r2+,r0)
|
||
|
st2w r60, @(r2+,r0)
|
||
|
st2w r62, @(r2+,r0)
|
||
|
|
||
|
mvfacc r4, a1, 16
|
||
|
mvfacc r5, a1, 0
|
||
|
st2w r4, @(r2+,r0)
|
||
|
|
||
|
mvfsys r4, psw
|
||
|
mvfsys r5, rpt_c
|
||
|
st2w r4, @(r2+,r0)
|
||
|
|
||
|
mvfsys r4, rpt_s
|
||
|
mvfsys r5, rpt_e
|
||
|
st2w r4, @(r2+,r0)
|
||
|
|
||
|
mvfsys r4, mod_s
|
||
|
mvfsys r5, mod_e
|
||
|
st2w r4, @(r2+,r0)
|
||
|
|
||
|
; Return 0 to caller
|
||
|
add r2, r0, r0
|
||
|
jmp link
|
||
|
.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 R2. Restore the registers.
|
||
|
ld2w r26, @(r2+,r0)
|
||
|
ld2w r28, @(r2+,r0)
|
||
|
ld2w r30, @(r2+,r0)
|
||
|
ld2w r32, @(r2+,r0)
|
||
|
ld2w r34, @(r2+,r0)
|
||
|
ld2w r36, @(r2+,r0)
|
||
|
ld2w r38, @(r2+,r0)
|
||
|
ld2w r40, @(r2+,r0)
|
||
|
ld2w r42, @(r2+,r0)
|
||
|
ld2w r44, @(r2+,r0)
|
||
|
ld2w r46, @(r2+,r0)
|
||
|
ld2w r48, @(r2+,r0)
|
||
|
ld2w r50, @(r2+,r0)
|
||
|
ld2w r52, @(r2+,r0)
|
||
|
ld2w r54, @(r2+,r0)
|
||
|
ld2w r56, @(r2+,r0)
|
||
|
ld2w r58, @(r2+,r0)
|
||
|
ld2w r60, @(r2+,r0)
|
||
|
ld2w r62, @(r2+,r0)
|
||
|
|
||
|
ld2w r4, @(r2+,r0)
|
||
|
mvtacc a1, r4, r5
|
||
|
|
||
|
mvfsys r6, psw
|
||
|
ld2w r4, @(r2+,r0) /* psw, rpt_c */
|
||
|
and r6, r6, 0xfcff /* set rp, md bits from setjmp, leave */
|
||
|
and r4, r4, 0x0300 /* all other psw bits the same */
|
||
|
or r4, r4, r6
|
||
|
mvtsys psw, r4
|
||
|
mvtsys rpt_c, r5
|
||
|
|
||
|
ld2w r4, @(r2+,r0)
|
||
|
mvtsys rpt_s, r4
|
||
|
mvtsys rpt_e, r5
|
||
|
|
||
|
ld2w r4, @(r2+,r0)
|
||
|
mvtsys mod_s, r4
|
||
|
mvtsys mod_e, r5
|
||
|
|
||
|
; Value to return to caller is in R3. If caller attemped to return 0,
|
||
|
; return 1 instead.
|
||
|
|
||
|
cmpeq f0, r3, 0 || add r2, r3, r0
|
||
|
jmp link || add/tx r2, r2, 1
|
||
|
.Llongjmp:
|
||
|
.size longjmp,.Llongjmp-longjmp
|
||
|
.stabs "",36,0,0,.Llongjmp-longjmp
|