/* Copyright (C) 2012-2021 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
#if STACK_BIAS
	load	[%o1 + OFFSET (JB_CFA)], %g1
	sub	%g1, STACK_BIAS, %fp
#else
	load	[%o1 + OFFSET (JB_CFA)], %fp
#endif
	cfi_def_cfa(%fp, STACK_BIAS)
	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
