URL
https://opencores.org/ocsvn/openrisc/openrisc/trunk
Subversion Repositories openrisc
[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [libitm/] [config/] [arm/] [sjlj.S] - Rev 737
Compare with Previous | Blame | View Log
/* Copyright (C) 2011 Free Software Foundation, Inc.Contributed by Richard Henderson <rth@redhat.com>.This file is part of the GNU Transactional Memory Library (libitm).Libitm is free software; you can redistribute it and/or modify itunder the terms of the GNU General Public License as published bythe 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 ANYWARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESSFOR A PARTICULAR PURPOSE. See the GNU General Public License formore details.Under Section 7 of GPL version 3, you are granted additionalpermissions described in the GCC Runtime Library Exception, version3.1, as published by the Free Software Foundation.You should have received a copy of the GNU General Public License anda 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 "hwcap.h"#include "asmcfi.h".syntax unified#if defined(__thumb2__)# define PC_OFS 4.thumb.thumb_func#else# define PC_OFS 8#endif#if defined (__thumb2__) && defined(__ARM_ARCH_6T2__)# define HAVE_MOVT.arch armv6t2#elif defined (__ARM_ARCH_7A__)# define HAVE_MOVT.arch armv7-a#elif defined (__ARM_ARCH_7R__)# define HAVE_MOVT.arch armv7-r#elif defined (__ARM_ARCH_7M__)# define HAVE_MOVT.arch armv7-m#endif#if defined(HAVE_MOVT) && defined(PIC).macro ldaddr reg, addrmovw \reg, #:lower16:(\addr - (98f + PC_OFS))movt \reg, #:upper16:(\addr - (98f + PC_OFS))98: add \reg, \reg, pc.endm#elif defined(HAVE_MOVT).macro ldaddr reg, addrmovw \reg, #:lower16:\addrmovt \reg, #:upper16:\addr.endm#elif defined(PIC).macro ldaddr reg, addrldr \reg, 99f98: add \reg, \reg, pc.subsection 1.align 299: .word \addr - (98b + PC_OFS).subsection 0.endm#else.macro ldaddr reg, addrldr \reg, =\addr.endm#endif.text.align 2.global _ITM_beginTransaction.type _ITM_beginTransaction, %function_ITM_beginTransaction:.fnstartcfi_startprocmov ip, sppush { r4-r11, ip, lr }.save { lr }.pad #(9*4)cfi_adjust_cfa_offset(40)cfi_rel_offset(lr, 36)sub sp, sp, #(14*8).pad #(14*8)cfi_adjust_cfa_offset(14*8)ldaddr r2, GTM_hwcapldr r2, [r2]/* Store the VFP registers. Don't use VFP instructions directlybecause this code is used in non-VFP multilibs. */tst r2, #HWCAP_ARM_VFPbeq 1fstc p11, cr8, [sp], {16} /* vstm sp, {d8-d15} */1:/* Save the call-preserved iWMMXt registers. */tst r2, #HWCAP_ARM_IWMMXTbeq 1fstcl p1, cr10, [sp, #64] /* wstrd wr10, [sp, #64] */stcl p1, cr11, [sp, #72]stcl p1, cr12, [sp, #80]stcl p1, cr13, [sp, #88]stcl p1, cr14, [sp, #96]stcl p1, cr15, [sp, #104]1:/* Invoke GTM_begin_transaction with the struct we just built. */mov r1, spbl GTM_begin_transaction/* Return; we don't need to restore any of the call-saved regs. */add sp, sp, #(14*8 + 9*4)cfi_adjust_cfa_offset(-(14*8 + 9*4))pop { pc }.fnendcfi_endproc.size _ITM_beginTransaction, . - _ITM_beginTransaction.align 2.global GTM_longjmp.hidden GTM_longjmp.type GTM_longjmp, %functionGTM_longjmp:cfi_startprocldaddr r2, GTM_hwcapldr r2, [r2]tst r2, #HWCAP_ARM_VFPbeq 1fldc p11, cr8, [r1], {16} /* vldmia r1, {d8-d15} */1:tst r2, #HWCAP_ARM_IWMMXTbeq 1fldcl p1, cr10, [r1, #64] /* wldrd wr10, [r1, #64] */ldcl p1, cr11, [r1, #72]ldcl p1, cr12, [r1, #80]ldcl p1, cr13, [r1, #88]ldcl p1, cr14, [r1, #96]ldcl p1, cr15, [r1, #104]1:add r1, r1, #(14*8) /* Skip both VFP and iWMMXt blocks */#ifdef __thumb2__ldm r1, { r4-r11, ip, lr }cfi_def_cfa(ip, 0)mov sp, ipbx lr#elseldm r1, { r4-r11, sp, pc }#endifcfi_endproc.size GTM_longjmp, . - GTM_longjmp#ifdef __linux__.section .note.GNU-stack, "", %progbits#endif
