summaryrefslogtreecommitdiff
path: root/newlib/libc/machine/d30v/setjmp.S
diff options
context:
space:
mode:
Diffstat (limited to 'newlib/libc/machine/d30v/setjmp.S')
-rw-r--r--newlib/libc/machine/d30v/setjmp.S106
1 files changed, 106 insertions, 0 deletions
diff --git a/newlib/libc/machine/d30v/setjmp.S b/newlib/libc/machine/d30v/setjmp.S
new file mode 100644
index 00000000000..c0ca8250b0f
--- /dev/null
+++ b/newlib/libc/machine/d30v/setjmp.S
@@ -0,0 +1,106 @@
+; 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