123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434 |
- /* Copyright (C) 2012-2015 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 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/>. */
- .text
- #include "asmcfi.h"
- #if defined(__powerpc64__) && _CALL_ELF == 2
- .macro FUNC name
- .globl \name
- .type \name, @function
- \name:
- 0: addis 2,12,(.TOC.-0b)@ha
- addi 2,2,(.TOC.-0b)@l
- .localentry \name, . - \name
- .endm
- .macro END name
- .size \name, . - \name
- .endm
- .macro HIDDEN name
- .hidden \name
- .endm
- .macro CALL name
- bl \name
- nop
- .endm
- #elif defined(__powerpc64__) && defined(__ELF__)
- .macro FUNC name
- .globl \name, .\name
- .section ".opd","aw"
- .align 3
- \name:
- .quad .\name, .TOC.@tocbase, 0
- .size \name, 24
- .type .\name, @function
- .text
- .\name:
- .endm
- .macro END name
- .size .\name, . - .\name
- .endm
- .macro HIDDEN name
- .hidden \name, .\name
- .endm
- .macro CALL name
- bl \name
- nop
- .endm
- #elif defined(__ELF__)
- .macro FUNC name
- .globl \name
- .type \name, @function
- \name:
- .endm
- .macro END name
- .size \name, . - \name
- .endm
- .macro HIDDEN name
- .hidden \name
- .endm
- .macro CALL name
- bl \name
- .endm
- #elif defined(_CALL_DARWIN)
- .macro FUNC
- .globl _$0
- _$0:
- .endmacro
- .macro END
- .endmacro
- .macro HIDDEN
- .private_extern _$0
- .endmacro
- .macro CALL
- bl _$0
- .endmacro
- # ifdef __ppc64__
- .machine ppc64
- # else
- .machine ppc7400
- # endif
- #else
- #error "unsupported system"
- #endif
- /* Parameterize the naming of registers. */
- #if defined(__ELF__)
- # define r(N) %r##N
- # define f(N) %f##N
- # define v(N) %v##N
- #elif defined(__MACH__)
- # define r(N) r##N
- # define f(N) f##N
- # define v(N) v##N
- #else
- # define r(N) N
- # define f(N) N
- # define v(N) N
- #endif
- /* Parameterize the code for 32-bit vs 64-bit. */
- #if defined(__powerpc64__) || defined(__ppc64__)
- #define ldreg ld
- #define streg std
- #define stregu stdu
- #define WS 8
- #else
- #define ldreg lwz
- #define streg stw
- #define stregu stwu
- #define WS 4
- #endif
- /* Parameterize the code for call frame constants. */
- #if defined(_CALL_AIXDESC)
- # define BASE 6*WS
- # define LR_SAVE 2*WS
- #elif _CALL_ELF == 2
- # define BASE 6*WS
- # define LR_SAVE 2*WS
- #elif defined(_CALL_SYSV)
- # define BASE 2*WS
- # define LR_SAVE 1*WS
- #elif defined(_CALL_DARWIN)
- # define BASE (6*WS + 2*WS)
- # define LR_SAVE 2*WS
- #else
- # error "unsupported system"
- #endif
- #if defined(__ALTIVEC__) || defined(__VSX__)
- # define OFS_VR 0
- # define OFS_VSCR 12*16
- # define OFS_VR_END OFS_VSCR + 8
- #else
- # define OFS_VR_END 0
- #endif
- #ifndef _SOFT_FLOAT
- # define OFS_FR OFS_VR_END
- # define OFS_FPSCR OFS_FR + 18*8
- # define OFS_FR_END OFS_FPSCR + 8
- #else
- # define OFS_FR_END OFS_VR_END
- #endif
- #define OFS_GR OFS_FR_END
- #define OFS_CFA OFS_GR + 18*WS
- #define OFS_LR OFS_CFA + WS
- #define OFS_TOC OFS_LR + WS
- #define OFS_CR OFS_TOC + WS
- #define OFS_END (((OFS_CR + WS + 15) / 16) * 16)
- #define FRAME (((BASE + OFS_END + 15) / 16) * 16)
- #define VRSAVE 256
- .align 4
- FUNC _ITM_beginTransaction
- cfi_startproc
- mflr r(0)
- mfcr r(5)
- addi r(4), r(1), -OFS_END
- mr r(6), r(1)
- streg r(0), LR_SAVE(r(1))
- stregu r(1), -FRAME(r(1))
- cfi_def_cfa_offset(FRAME)
- cfi_offset(65, LR_SAVE)
- streg r(6), OFS_CFA(r(4))
- streg r(0), OFS_LR(r(4))
- #ifdef _CALL_DARWIN
- streg r(13), OFS_TOC(r(4))
- #else
- streg r(2), OFS_TOC(r(4))
- #endif
- streg r(5), OFS_CR(r(4))
- streg r(14), 0*WS+OFS_GR(r(4))
- streg r(15), 1*WS+OFS_GR(r(4))
- streg r(16), 2*WS+OFS_GR(r(4))
- streg r(17), 3*WS+OFS_GR(r(4))
- streg r(18), 4*WS+OFS_GR(r(4))
- streg r(19), 5*WS+OFS_GR(r(4))
- streg r(20), 6*WS+OFS_GR(r(4))
- streg r(21), 7*WS+OFS_GR(r(4))
- streg r(22), 8*WS+OFS_GR(r(4))
- streg r(23), 9*WS+OFS_GR(r(4))
- streg r(24), 10*WS+OFS_GR(r(4))
- streg r(25), 11*WS+OFS_GR(r(4))
- streg r(26), 12*WS+OFS_GR(r(4))
- streg r(27), 13*WS+OFS_GR(r(4))
- streg r(28), 14*WS+OFS_GR(r(4))
- streg r(29), 15*WS+OFS_GR(r(4))
- streg r(30), 16*WS+OFS_GR(r(4))
- streg r(31), 17*WS+OFS_GR(r(4))
- #ifndef _SOFT_FLOAT
- /* ??? Determine when FPRs not present. */
- /* ??? Test r(3) for pr_hasNoFloatUpdate and skip the fp save.
- This is not yet set by the compiler. */
- mffs f(0)
- stfd f(14), 0+OFS_FR(r(4))
- stfd f(15), 8+OFS_FR(r(4))
- stfd f(16), 16+OFS_FR(r(4))
- stfd f(17), 24+OFS_FR(r(4))
- stfd f(18), 32+OFS_FR(r(4))
- stfd f(19), 40+OFS_FR(r(4))
- stfd f(20), 48+OFS_FR(r(4))
- stfd f(21), 56+OFS_FR(r(4))
- stfd f(22), 64+OFS_FR(r(4))
- stfd f(23), 72+OFS_FR(r(4))
- stfd f(24), 80+OFS_FR(r(4))
- stfd f(25), 88+OFS_FR(r(4))
- stfd f(26), 96+OFS_FR(r(4))
- stfd f(27),104+OFS_FR(r(4))
- stfd f(28),112+OFS_FR(r(4))
- stfd f(29),120+OFS_FR(r(4))
- stfd f(30),128+OFS_FR(r(4))
- stfd f(31),136+OFS_FR(r(4))
- stfd f(0), OFS_FPSCR(r(4))
- #endif
- #if defined(__ALTIVEC__)
- /* ??? Determine when VRs not present. */
- /* ??? Test r(3) for pr_hasNoVectorUpdate and skip the vr save.
- This is not yet set by the compiler. */
- addi r(5), r(4), OFS_VR
- addi r(6), r(4), OFS_VR+16
- mfspr r(0), VRSAVE
- stvx v(20), 0, r(5)
- addi r(5), r(5), 32
- stvx v(21), 0, r(6)
- addi r(6), r(6), 32
- stvx v(22), 0, r(5)
- addi r(5), r(5), 32
- stvx v(23), 0, r(6)
- addi r(6), r(6), 32
- stvx v(25), 0, r(5)
- addi r(5), r(5), 32
- stvx v(26), 0, r(6)
- addi r(6), r(6), 32
- stvx v(26), 0, r(5)
- addi r(5), r(5), 32
- stvx v(27), 0, r(6)
- addi r(6), r(6), 32
- stvx v(28), 0, r(5)
- addi r(5), r(5), 32
- stvx v(29), 0, r(6)
- addi r(6), r(6), 32
- stvx v(30), 0, r(5)
- stvx v(31), 0, r(6)
- streg r(0), OFS_VSCR(r(4))
- #endif
- CALL GTM_begin_transaction
- ldreg r(0), LR_SAVE+FRAME(r(1))
- mtlr r(0)
- addi r(1), r(1), FRAME
- cfi_def_cfa_offset(0)
- cfi_restore(65)
- blr
- cfi_endproc
- END _ITM_beginTransaction
- .align 4
- HIDDEN GTM_longjmp
- FUNC GTM_longjmp
- cfi_startproc
- #if defined(__ALTIVEC__) || defined(__VSX__)
- /* ??? Determine when VRs not present. */
- /* ??? Test r(5) for pr_hasNoVectorUpdate and skip the vr restore.
- This is not yet set by the compiler. */
- addi r(6), r(4), OFS_VR
- addi r(7), r(4), OFS_VR+16
- ldreg r(0), OFS_VSCR(r(4))
- cfi_undefined(v(20))
- cfi_undefined(v(21))
- cfi_undefined(v(22))
- cfi_undefined(v(23))
- cfi_undefined(v(24))
- cfi_undefined(v(25))
- cfi_undefined(v(26))
- cfi_undefined(v(27))
- cfi_undefined(v(28))
- cfi_undefined(v(29))
- cfi_undefined(v(30))
- cfi_undefined(v(31))
- lvx v(20), 0, r(6)
- addi r(6), r(6), 32
- lvx v(21), 0, r(7)
- addi r(7), r(7), 32
- lvx v(22), 0, r(6)
- addi r(6), r(6), 32
- lvx v(23), 0, r(7)
- addi r(7), r(7), 32
- lvx v(24), 0, r(6)
- addi r(6), r(6), 32
- lvx v(25), 0, r(7)
- addi r(7), r(7), 32
- lvx v(26), 0, r(6)
- addi r(6), r(6), 32
- lvx v(27), 0, r(7)
- addi r(7), r(7), 32
- lvx v(28), 0, r(6)
- addi r(6), r(6), 32
- lvx v(29), 0, r(7)
- addi r(7), r(7), 32
- lvx v(30), 0, r(6)
- lvx v(31), 0, r(7)
- mtspr VRSAVE, r(0)
- #endif
- #ifndef _SOFT_FLOAT
- /* ??? Determine when FPRs not present. */
- /* ??? Test r(5) for pr_hasNoFloatUpdate and skip the fp load.
- This is not yet set by the compiler. */
- lfd f(0), OFS_FPSCR(r(4))
- cfi_undefined(f(14))
- cfi_undefined(f(15))
- cfi_undefined(f(16))
- cfi_undefined(f(17))
- cfi_undefined(f(18))
- cfi_undefined(f(19))
- cfi_undefined(f(20))
- cfi_undefined(f(21))
- cfi_undefined(f(22))
- cfi_undefined(f(23))
- cfi_undefined(f(24))
- cfi_undefined(f(25))
- cfi_undefined(f(26))
- cfi_undefined(f(27))
- cfi_undefined(f(28))
- cfi_undefined(f(29))
- cfi_undefined(f(30))
- cfi_undefined(f(31))
- lfd f(14), 0+OFS_FR(r(4))
- lfd f(15), 8+OFS_FR(r(4))
- lfd f(16), 16+OFS_FR(r(4))
- lfd f(17), 24+OFS_FR(r(4))
- lfd f(18), 32+OFS_FR(r(4))
- lfd f(19), 40+OFS_FR(r(4))
- lfd f(20), 48+OFS_FR(r(4))
- lfd f(21), 56+OFS_FR(r(4))
- lfd f(22), 64+OFS_FR(r(4))
- lfd f(23), 72+OFS_FR(r(4))
- lfd f(24), 80+OFS_FR(r(4))
- lfd f(25), 88+OFS_FR(r(4))
- lfd f(26), 96+OFS_FR(r(4))
- lfd f(27),104+OFS_FR(r(4))
- lfd f(28),112+OFS_FR(r(4))
- lfd f(29),120+OFS_FR(r(4))
- lfd f(30),128+OFS_FR(r(4))
- lfd f(31),136+OFS_FR(r(4))
- mtfsf 0xff, f(0)
- #endif
- ldreg r(6), OFS_CFA(r(4))
- ldreg r(0), OFS_LR(r(4))
- #ifdef _CALL_DARWIN
- ldreg r(13), OFS_TOC(r(4))
- #else
- ldreg r(2), OFS_TOC(r(4))
- #endif
- ldreg r(7), OFS_CR(r(4))
- /* At the instant we restore the LR, the only coherent view of
- the world we have is into the new stack frame. Define the
- CFA in terms of the not-yet-restored stack pointer. This will
- last until the end of the function. */
- mtlr r(0)
- cfi_def_cfa(r(6), 0)
- cfi_undefined(r(14))
- cfi_undefined(r(15))
- cfi_undefined(r(16))
- cfi_undefined(r(17))
- cfi_undefined(r(18))
- cfi_undefined(r(19))
- cfi_undefined(r(20))
- cfi_undefined(r(21))
- cfi_undefined(r(22))
- cfi_undefined(r(23))
- cfi_undefined(r(24))
- cfi_undefined(r(25))
- cfi_undefined(r(26))
- cfi_undefined(r(27))
- cfi_undefined(r(28))
- cfi_undefined(r(29))
- cfi_undefined(r(30))
- cfi_undefined(r(31))
- mtcr r(7)
- ldreg r(14), 0*WS+OFS_GR(r(4))
- ldreg r(15), 1*WS+OFS_GR(r(4))
- ldreg r(16), 2*WS+OFS_GR(r(4))
- ldreg r(17), 3*WS+OFS_GR(r(4))
- ldreg r(18), 4*WS+OFS_GR(r(4))
- ldreg r(19), 5*WS+OFS_GR(r(4))
- ldreg r(20), 6*WS+OFS_GR(r(4))
- ldreg r(21), 7*WS+OFS_GR(r(4))
- ldreg r(22), 8*WS+OFS_GR(r(4))
- ldreg r(23), 9*WS+OFS_GR(r(4))
- ldreg r(24), 10*WS+OFS_GR(r(4))
- ldreg r(25), 11*WS+OFS_GR(r(4))
- ldreg r(26), 12*WS+OFS_GR(r(4))
- ldreg r(27), 13*WS+OFS_GR(r(4))
- ldreg r(28), 14*WS+OFS_GR(r(4))
- ldreg r(29), 15*WS+OFS_GR(r(4))
- ldreg r(30), 16*WS+OFS_GR(r(4))
- ldreg r(31), 17*WS+OFS_GR(r(4))
- mr r(1), r(6)
- blr
- cfi_endproc
- END GTM_longjmp
- #ifdef __linux__
- .section .note.GNU-stack, "", @progbits
- #endif
|