diff options
Diffstat (limited to 'libitm/config/sparc/sjlj.S')
-rw-r--r-- | libitm/config/sparc/sjlj.S | 96 |
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 |