summaryrefslogtreecommitdiff
path: root/newlib/libc/machine/fr30/setjmp.S
diff options
context:
space:
mode:
Diffstat (limited to 'newlib/libc/machine/fr30/setjmp.S')
-rw-r--r--newlib/libc/machine/fr30/setjmp.S64
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 00000000000..98ac44d48ae
--- /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