summaryrefslogtreecommitdiff
path: root/libc/sysdeps/linux/metag/setjmp.S
diff options
context:
space:
mode:
Diffstat (limited to 'libc/sysdeps/linux/metag/setjmp.S')
-rw-r--r--libc/sysdeps/linux/metag/setjmp.S52
1 files changed, 52 insertions, 0 deletions
diff --git a/libc/sysdeps/linux/metag/setjmp.S b/libc/sysdeps/linux/metag/setjmp.S
new file mode 100644
index 000000000..f00b4a841
--- /dev/null
+++ b/libc/sysdeps/linux/metag/setjmp.S
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2013 Imagination Technologies Ltd.
+ *
+ * Licensed under the LGPL v2.1 or later, see the file COPYING.LIB in this tarball.
+ */
+
+!!! setjmp and variants
+ .text
+
+!! int _setjmp (jmp_buf __env)
+!! Store the calling environment in ENV, not saving the signal mask.
+!! Return 0. */
+ .global __setjmp
+ .type __setjmp,function
+__setjmp:
+ MOV D0Ar2,#0
+ B ___sigsetjmp1
+ .size __setjmp,.-__setjmp
+
+!! int setjmp (jmp_buf __env)
+!! Store the calling environment in ENV, also saving the signal mask.
+!! Return 0. */
+ .global _setjmp
+ .type _setjmp,function
+_setjmp:
+ MOV D0Ar2,#1
+ !! fall through to __sigsetjmp
+ .size _setjmp,.-_setjmp
+
+!! int __sigsetjmp (jmp_buf __env, int __savemask)
+!! Store the calling environment in ENV, also saving the
+!! signal mask if SAVEMASK is nonzero. Return 0.
+!! This is the internal name for `sigsetjmp'.
+ .global ___sigsetjmp
+ .type ___sigsetjmp,function
+___sigsetjmp:
+___sigsetjmp1:
+ !! Save A0/A1 regs
+ MSETL [D1Ar1++],A0.0,A0.1
+ !! Use A0.3 as temp
+ MOV A0.3,D1Ar1
+ !! Rewind D1Ar1 that was modified above
+ SUB D1Ar1,D1Ar1,#(2*8)
+ !! Save D0/D1 regs
+ MSETL [A0.3++],D0FrT,D0.5,D0.6,D0.7
+ !! Tail call __sigjmp_save
+#ifdef __PIC__
+ B ___sigjmp_save@PLT
+#else
+ B ___sigjmp_save
+#endif
+ .size ___sigsetjmp,.-___sigsetjmp