aboutsummaryrefslogtreecommitdiff
path: root/libitm/config/sparc/sjlj.S
diff options
context:
space:
mode:
Diffstat (limited to 'libitm/config/sparc/sjlj.S')
-rw-r--r--libitm/config/sparc/sjlj.S96
1 files changed, 96 insertions, 0 deletions
diff --git a/libitm/config/sparc/sjlj.S b/libitm/config/sparc/sjlj.S
new file mode 100644
index 0000000..a42040f
--- /dev/null
+++ b/libitm/config/sparc/sjlj.S
@@ -0,0 +1,96 @@
+/* Copyright (C) 2012 Free Software Foundation, Inc.
+
+ This file is part of the GNU Transactional Memory Library (libitm).
+
+ Libitm is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ Libitm is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ more details.
+
+ Under Section 7 of GPL version 3, you are granted additional
+ permissions described in the GCC Runtime Library Exception, version
+ 3.1, as published by the Free Software Foundation.
+
+ You should have received a copy of the GNU General Public License and
+ a copy of the GCC Runtime Library Exception along with this program;
+ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include "asmcfi.h"
+
+#ifdef __arch64__
+# define WORD_SIZE 8
+# define MIN_FRAME_SIZE 176
+# define STACK_BIAS 2047
+# define load ldx
+# define store stx
+#else
+# define WORD_SIZE 4
+# define MIN_FRAME_SIZE 96
+# define STACK_BIAS 0
+# define load ld
+# define store st
+#endif
+
+/* Fields of the JmpBuf structure. */
+#define JB_CFA 0
+#define JB_PC 1
+#define OFFSET(FIELD) ((FIELD) * WORD_SIZE)
+
+/* The frame size must be a multiple of the double-word size. */
+#define FRAME_SIZE (MIN_FRAME_SIZE + 2 * WORD_SIZE)
+#define JB_OFFSET (STACK_BIAS + MIN_FRAME_SIZE)
+
+ .text
+ .align 4
+ .globl _ITM_beginTransaction
+ .type _ITM_beginTransaction, #function
+ .proc 016
+_ITM_beginTransaction:
+ cfi_startproc
+ add %sp, STACK_BIAS, %g1
+ sub %sp, FRAME_SIZE, %sp
+ cfi_def_cfa_offset(STACK_BIAS + FRAME_SIZE)
+ store %g1, [%sp + JB_OFFSET + OFFSET (JB_CFA)]
+ store %o7, [%sp + JB_OFFSET + OFFSET (JB_PC)]
+ /* ??? This triggers an internal error in GDB. */
+ cfi_offset(%o7, -WORD_SIZE)
+ call GTM_begin_transaction
+ add %sp, JB_OFFSET, %o1
+ load [%sp + JB_OFFSET + OFFSET (JB_PC)], %o7
+ jmp %o7+8
+ add %sp, FRAME_SIZE, %sp
+ cfi_def_cfa_offset(STACK_BIAS)
+ cfi_endproc
+ .size _ITM_beginTransaction, . - _ITM_beginTransaction
+
+ .align 4
+ .globl GTM_longjmp
+#ifdef HAVE_ATTRIBUTE_VISIBILITY
+ .hidden GTM_longjmp
+#endif
+ .type GTM_longjmp, #function
+ .proc 016
+GTM_longjmp:
+ cfi_startproc
+ flushw
+ load [%o1 + OFFSET (JB_CFA)], %fp
+ cfi_def_cfa(%fp, 0)
+#if STACK_BIAS
+ sub %fp, STACK_BIAS, %fp
+ cfi_def_cfa_offset(STACK_BIAS)
+#endif
+ load [%o1 + OFFSET (JB_PC)], %o7
+ jmp %o7+8
+ restore %g0, %o0, %o0
+ cfi_endproc
+ .size GTM_longjmp, . - GTM_longjmp
+
+#ifdef __linux__
+ .section .note.GNU-stack, "", @progbits
+#endif