OSDN Git Service

9a74d97f76f3a85c2cce3817362d37e1bd9c97fa
[pf3gnuchains/gcc-fork.git] / libitm / config / x86 / sjlj.S
1 /* Copyright (C) 2008, 2009, 2011 Free Software Foundation, Inc.
2    Contributed by Richard Henderson <rth@redhat.com>.
3
4    This file is part of the GNU Transactional Memory Library (libitm).
5
6    Libitm is free software; you can redistribute it and/or modify it
7    under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 3 of the License, or
9    (at your option) any later version.
10
11    Libitm is distributed in the hope that it will be useful, but WITHOUT ANY
12    WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
13    FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
14    more details.
15
16    Under Section 7 of GPL version 3, you are granted additional
17    permissions described in the GCC Runtime Library Exception, version
18    3.1, as published by the Free Software Foundation.
19
20    You should have received a copy of the GNU General Public License and
21    a copy of the GCC Runtime Library Exception along with this program;
22    see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
23    <http://www.gnu.org/licenses/>.  */
24
25
26 #include "asmcfi.h"
27
28 #define CONCAT1(a, b) CONCAT2(a, b)
29 #define CONCAT2(a, b) a ## b
30
31 #ifdef __USER_LABEL_PREFIX__
32 #  define SYM(x) CONCAT1 (__USER_LABEL_PREFIX__, x)
33 #else
34 #  define SYM(x) x
35 #endif
36
37 #ifdef __ELF__
38 #  define TYPE(x) .type SYM(x), @function
39 #  define SIZE(x) .size SYM(x), . - SYM(x)
40 #  ifdef HAVE_ATTRIBUTE_VISIBILITY
41 #    define HIDDEN(x) .hidden SYM(x)
42 #  else
43 #    define HIDDEN(x)
44 #  endif
45 #else
46 #  define TYPE(x)
47 #  define SIZE(x)
48 #  ifdef __MACH__
49 #    define HIDDEN(x) .private_extern SYM(x)
50 #  else
51 #    define HIDDEN(x)
52 #  endif
53 #endif
54
55         .text
56
57         .align 4
58         .globl  SYM(_ITM_beginTransaction)
59
60 SYM(_ITM_beginTransaction):
61         cfi_startproc
62 #ifdef __x86_64__
63         leaq    8(%rsp), %rax
64         subq    $56, %rsp
65         cfi_def_cfa_offset(64)
66         movq    %rax, (%rsp)
67         movq    %rbx, 8(%rsp)
68         movq    %rbp, 16(%rsp)
69         movq    %r12, 24(%rsp)
70         movq    %r13, 32(%rsp)
71         movq    %r14, 40(%rsp)
72         movq    %r15, 48(%rsp)
73         movq    %rsp, %rsi
74         call    SYM(GTM_begin_transaction)
75         addq    $56, %rsp
76         cfi_def_cfa_offset(8)
77         ret
78 #else
79         leal    4(%esp), %ecx
80         movl    4(%esp), %eax
81         subl    $28, %esp
82         cfi_def_cfa_offset(32)
83         movl    %ecx, 8(%esp)
84         movl    %ebx, 12(%esp)
85         movl    %esi, 16(%esp)
86         movl    %edi, 20(%esp)
87         movl    %ebp, 24(%esp)
88         leal    8(%esp), %edx
89 #if defined HAVE_ATTRIBUTE_VISIBILITY || !defined __PIC__
90         call    SYM(GTM_begin_transaction)
91 #elif defined __ELF__
92         call    1f
93 1:      popl    %ebx
94         addl    $_GLOBAL_OFFSET_TABLE_+[.-1b], %ebx
95         call    SYM(GTM_begin_transaction)@PLT
96         movl    12(%esp), %ebx
97 #else
98 # error "Unsupported PIC sequence"
99 #endif
100         addl    $28, %esp
101         cfi_def_cfa_offset(4)
102         ret
103 #endif
104         cfi_endproc
105
106         TYPE(_ITM_beginTransaction)
107         SIZE(_ITM_beginTransaction)
108
109         .align 4
110         .globl  SYM(GTM_longjmp)
111
112 SYM(GTM_longjmp):
113         cfi_startproc
114 #ifdef __x86_64__
115         movq    (%rsi), %rcx
116         movq    8(%rsi), %rbx
117         movq    16(%rsi), %rbp
118         movq    24(%rsi), %r12
119         movq    32(%rsi), %r13
120         movq    40(%rsi), %r14
121         movq    48(%rsi), %r15
122         movl    %edi, %eax
123         cfi_offset(%rip, 56)
124         cfi_def_cfa(%rcx, 0)
125         movq    %rcx, %rsp
126         jmp     *56(%rsi)
127 #else
128         movl    (%edx), %ecx
129         movl    4(%edx), %ebx
130         movl    8(%edx), %esi
131         movl    12(%edx), %edi
132         movl    16(%edx), %ebp
133         cfi_offset(%eip, 20)
134         cfi_def_cfa(%ecx, 0)
135         movl    %ecx, %esp
136         jmp     *20(%edx)
137 #endif
138         cfi_endproc
139
140         TYPE(GTM_longjmp)
141         HIDDEN(GTM_longjmp)
142         SIZE(GTM_longjmp)
143
144 #ifdef __linux__
145 .section .note.GNU-stack, "", @progbits
146 #endif