summaryrefslogtreecommitdiff
path: root/newlib/libc/machine/sh/setjmp.S
diff options
context:
space:
mode:
Diffstat (limited to 'newlib/libc/machine/sh/setjmp.S')
-rw-r--r--newlib/libc/machine/sh/setjmp.S57
1 files changed, 57 insertions, 0 deletions
diff --git a/newlib/libc/machine/sh/setjmp.S b/newlib/libc/machine/sh/setjmp.S
new file mode 100644
index 00000000000..363e8f23ba2
--- /dev/null
+++ b/newlib/libc/machine/sh/setjmp.S
@@ -0,0 +1,57 @@
+#include "asm.h"
+
+ENTRY(setjmp)
+#if defined (__SH3E__) || defined(__SH4_SINGLE__) || defined(__SH4__) || defined(__SH4_SINGLE_ONLY__)
+ add #(13*4),r4
+#else
+ add #(9*4),r4
+#endif
+
+ sts.l pr,@-r4
+
+#if defined (__SH3E__) || defined(__SH4_SINGLE__) || defined(__SH4__) || defined(__SH4_SINGLE_ONLY__)
+ fmov.s fr15,@-r4 ! call saved floating point registers
+ fmov.s fr14,@-r4
+ fmov.s fr13,@-r4
+ fmov.s fr12,@-r4
+#endif
+
+ mov.l r15,@-r4 ! call saved integer registers
+ mov.l r14,@-r4
+ mov.l r13,@-r4
+ mov.l r12,@-r4
+
+ mov.l r11,@-r4
+ mov.l r10,@-r4
+ mov.l r9,@-r4
+ mov.l r8,@-r4
+
+ rts
+ mov #0,r0
+
+ENTRY(longjmp)
+ mov.l @r4+,r8
+ mov.l @r4+,r9
+ mov.l @r4+,r10
+ mov.l @r4+,r11
+
+ mov.l @r4+,r12
+ mov.l @r4+,r13
+ mov.l @r4+,r14
+ mov.l @r4+,r15
+
+#if defined (__SH3E__) || defined(__SH4_SINGLE__) || defined(__SH4__) || defined(__SH4_SINGLE_ONLY__)
+ fmov.s @r4+,fr12 ! call saved floating point registers
+ fmov.s @r4+,fr13
+ fmov.s @r4+,fr14
+ fmov.s @r4+,fr15
+#endif
+
+ lds.l @r4+,pr
+
+ mov r5,r0
+ tst r0,r0
+ bf retr4
+ movt r0
+retr4: rts
+ nop