doc: Remove i?86-*-linux* installation note from 2003
[official-gcc.git] / libitm / config / powerpc / sjlj.S
blob5fdb29d120fcd990e2b4c50be89056c948ece3d7
1 /* Copyright (C) 2012-2024 Free Software Foundation, Inc.
2    Contributed by Richard Henderson <rth@redhat.com>.
4    This file is part of the GNU Transactional Memory Library (libitm).
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.
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.
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.
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/>.  */
25         .text
27 #include "asmcfi.h"
29 #if defined(__powerpc64__) && _CALL_ELF == 2 && defined(__PCREL__)
30 .macro FUNC name
31         .globl  \name
32         .type   \name, @function
33 \name:
34         .localentry \name, 1
35 .endm
36 .macro END name
37         .size   \name, . - \name
38 .endm
39 .macro HIDDEN name
40         .hidden \name
41 .endm
42 .macro CALL name
43         bl      \name @notoc
44 .endm
45 #elif defined(__powerpc64__) && _CALL_ELF == 2
46 .macro FUNC name
47         .globl  \name
48         .type   \name, @function
49 \name:
50 0:      addis 2,12,(.TOC.-0b)@ha
51         addi 2,2,(.TOC.-0b)@l
52         .localentry \name, . - \name
53 .endm
54 .macro END name
55         .size   \name, . - \name
56 .endm
57 .macro HIDDEN name
58         .hidden \name
59 .endm
60 .macro CALL name
61         bl      \name
62         nop
63 .endm
64 #elif defined(__powerpc64__) && defined(__ELF__)
65 .macro FUNC name
66         .globl  \name, .\name
67         .section ".opd","aw"
68         .align  3
69 \name:
70         .quad   .\name, .TOC.@tocbase, 0
71         .size   \name, 24
72         .type   .\name, @function
73         .text
74 .\name:
75 .endm
76 .macro END name
77         .size   .\name, . - .\name
78 .endm
79 .macro HIDDEN name
80         .hidden \name, .\name
81 .endm
82 .macro CALL name
83         bl      \name
84         nop
85 .endm
86 #elif defined(__ELF__)
87 .macro FUNC name
88         .globl  \name
89         .type   \name, @function
90 \name:
91 .endm
92 .macro END name
93         .size   \name, . - \name
94 .endm
95 .macro HIDDEN name
96         .hidden \name
97 .endm
98 .macro CALL name
99         bl      \name
100 .endm
101 #elif defined(_CALL_DARWIN)
102 .macro FUNC
103         .globl  _$0
104 _$0:
105 .endmacro
106 .macro END
107 .endmacro
108 .macro HIDDEN
109         .private_extern _$0
110 .endmacro
111 .macro CALL
112         bl      _$0
113 .endmacro
114 # ifdef __ppc64__
115         .machine ppc64
116 # else
117         .machine ppc7400
118 # endif
119 #else
120 #error "unsupported system"
121 #endif
123 /* Parameterize the naming of registers.  */
124 #if defined(__ELF__)
125 # define r(N)   %r##N
126 # define f(N)   %f##N
127 # define v(N)   %v##N
128 #elif defined(__MACH__)
129 # define r(N)   r##N
130 # define f(N)   f##N
131 # define v(N)   v##N
132 #else
133 # define r(N)   N
134 # define f(N)   N
135 # define v(N)   N
136 #endif
138 /* Parameterize the code for 32-bit vs 64-bit.  */
139 #if defined(__powerpc64__) || defined(__ppc64__)
140 #define ldreg   ld
141 #define streg   std
142 #define stregu  stdu
143 #define WS      8
144 #else
145 #define ldreg   lwz
146 #define streg   stw
147 #define stregu  stwu
148 #define WS      4
149 #endif
151 /* Parameterize the code for call frame constants.  */
152 #if defined(_CALL_AIXDESC)
153 # define BASE           6*WS
154 # define LR_SAVE        2*WS
155 #elif _CALL_ELF == 2
156 # define BASE           6*WS
157 # define LR_SAVE        2*WS
158 #elif defined(_CALL_SYSV)
159 # define BASE           2*WS
160 # define LR_SAVE        1*WS
161 #elif defined(_CALL_DARWIN)
162 # define BASE           (6*WS + 2*WS)
163 # define LR_SAVE        2*WS
164 #else
165 # error "unsupported system"
166 #endif
168 #if defined(__ALTIVEC__) || defined(__VSX__)
169 # define OFS_VR         0
170 # define OFS_VSCR       12*16
171 # define OFS_VR_END     OFS_VSCR + 8
172 #else
173 # define OFS_VR_END     0
174 #endif
175 #ifndef _SOFT_FLOAT
176 # define OFS_FR         OFS_VR_END
177 # define OFS_FPSCR      OFS_FR + 18*8
178 # define OFS_FR_END     OFS_FPSCR + 8
179 #else
180 # define OFS_FR_END     OFS_VR_END
181 #endif
182 #define OFS_GR          OFS_FR_END
183 #define OFS_CFA         OFS_GR + 18*WS
184 #define OFS_LR          OFS_CFA + WS
185 #define OFS_TOC         OFS_LR + WS
186 #define OFS_CR          OFS_TOC + WS
187 #define OFS_END         (((OFS_CR + WS + 15) / 16) * 16)
189 #define FRAME           (((BASE + OFS_END + 15) / 16) * 16)
190 #define VRSAVE          256
192         .align  4
193 FUNC _ITM_beginTransaction
194         cfi_startproc
195         mflr    r(0)
196         mfcr    r(5)
197         addi    r(4), r(1), -OFS_END
198         mr      r(6), r(1)
199         streg   r(0), LR_SAVE(r(1))
200         stregu  r(1), -FRAME(r(1))
201         cfi_def_cfa_offset(FRAME)
202         cfi_offset(65, LR_SAVE)
203         streg   r(6),  OFS_CFA(r(4))
204         streg   r(0),   OFS_LR(r(4))
205 #ifdef _CALL_DARWIN
206         streg   r(13),  OFS_TOC(r(4))
207 #else
208         streg   r(2),   OFS_TOC(r(4))
209 #endif
210         streg   r(5),   OFS_CR(r(4))
211         streg   r(14),  0*WS+OFS_GR(r(4))
212         streg   r(15),  1*WS+OFS_GR(r(4))
213         streg   r(16),  2*WS+OFS_GR(r(4))
214         streg   r(17),  3*WS+OFS_GR(r(4))
215         streg   r(18),  4*WS+OFS_GR(r(4))
216         streg   r(19),  5*WS+OFS_GR(r(4))
217         streg   r(20),  6*WS+OFS_GR(r(4))
218         streg   r(21),  7*WS+OFS_GR(r(4))
219         streg   r(22),  8*WS+OFS_GR(r(4))
220         streg   r(23),  9*WS+OFS_GR(r(4))
221         streg   r(24), 10*WS+OFS_GR(r(4))
222         streg   r(25), 11*WS+OFS_GR(r(4))
223         streg   r(26), 12*WS+OFS_GR(r(4))
224         streg   r(27), 13*WS+OFS_GR(r(4))
225         streg   r(28), 14*WS+OFS_GR(r(4))
226         streg   r(29), 15*WS+OFS_GR(r(4))
227         streg   r(30), 16*WS+OFS_GR(r(4))
228         streg   r(31), 17*WS+OFS_GR(r(4))
230 #ifndef _SOFT_FLOAT
231         /* ??? Determine when FPRs not present.  */
232         /* ??? Test r(3) for pr_hasNoFloatUpdate and skip the fp save.
233            This is not yet set by the compiler.  */
234         mffs    f(0)
235         stfd    f(14),  0+OFS_FR(r(4))
236         stfd    f(15),  8+OFS_FR(r(4))
237         stfd    f(16), 16+OFS_FR(r(4))
238         stfd    f(17), 24+OFS_FR(r(4))
239         stfd    f(18), 32+OFS_FR(r(4))
240         stfd    f(19), 40+OFS_FR(r(4))
241         stfd    f(20), 48+OFS_FR(r(4))
242         stfd    f(21), 56+OFS_FR(r(4))
243         stfd    f(22), 64+OFS_FR(r(4))
244         stfd    f(23), 72+OFS_FR(r(4))
245         stfd    f(24), 80+OFS_FR(r(4))
246         stfd    f(25), 88+OFS_FR(r(4))
247         stfd    f(26), 96+OFS_FR(r(4))
248         stfd    f(27),104+OFS_FR(r(4))
249         stfd    f(28),112+OFS_FR(r(4))
250         stfd    f(29),120+OFS_FR(r(4))
251         stfd    f(30),128+OFS_FR(r(4))
252         stfd    f(31),136+OFS_FR(r(4))
253         stfd    f(0), OFS_FPSCR(r(4))
254 #endif
256 #if defined(__ALTIVEC__)
257         /* ??? Determine when VRs not present.  */
258         /* ??? Test r(3) for pr_hasNoVectorUpdate and skip the vr save.
259            This is not yet set by the compiler.  */
260         addi    r(5), r(4), OFS_VR
261         addi    r(6), r(4), OFS_VR+16
262         mfspr   r(0), VRSAVE
263         stvx    v(20), 0, r(5)
264         addi    r(5), r(5), 32
265         stvx    v(21), 0, r(6)
266         addi    r(6), r(6), 32
267         stvx    v(22), 0, r(5)
268         addi    r(5), r(5), 32
269         stvx    v(23), 0, r(6)
270         addi    r(6), r(6), 32
271         stvx    v(25), 0, r(5)
272         addi    r(5), r(5), 32
273         stvx    v(26), 0, r(6)
274         addi    r(6), r(6), 32
275         stvx    v(26), 0, r(5)
276         addi    r(5), r(5), 32
277         stvx    v(27), 0, r(6)
278         addi    r(6), r(6), 32
279         stvx    v(28), 0, r(5)
280         addi    r(5), r(5), 32
281         stvx    v(29), 0, r(6)
282         addi    r(6), r(6), 32
283         stvx    v(30), 0, r(5)
284         stvx    v(31), 0, r(6)
285         streg   r(0), OFS_VSCR(r(4))
286 #endif
288         CALL    GTM_begin_transaction
290         ldreg   r(0), LR_SAVE+FRAME(r(1))
291         mtlr    r(0)
292         addi    r(1), r(1), FRAME
293         cfi_def_cfa_offset(0)
294         cfi_restore(65)
295         blr
296         cfi_endproc
297 END _ITM_beginTransaction
299         .align 4
300         HIDDEN  GTM_longjmp
301 FUNC GTM_longjmp
302         cfi_startproc
303 #if defined(__ALTIVEC__) || defined(__VSX__)
304         /* ??? Determine when VRs not present.  */
305         /* ??? Test r(5) for pr_hasNoVectorUpdate and skip the vr restore.
306            This is not yet set by the compiler.  */
307         addi    r(6), r(4), OFS_VR
308         addi    r(7), r(4), OFS_VR+16
309         ldreg   r(0), OFS_VSCR(r(4))
310         cfi_undefined(v(20))
311         cfi_undefined(v(21))
312         cfi_undefined(v(22))
313         cfi_undefined(v(23))
314         cfi_undefined(v(24))
315         cfi_undefined(v(25))
316         cfi_undefined(v(26))
317         cfi_undefined(v(27))
318         cfi_undefined(v(28))
319         cfi_undefined(v(29))
320         cfi_undefined(v(30))
321         cfi_undefined(v(31))
322         lvx     v(20), 0, r(6)
323         addi    r(6), r(6), 32
324         lvx     v(21), 0, r(7)
325         addi    r(7), r(7), 32
326         lvx     v(22), 0, r(6)
327         addi    r(6), r(6), 32
328         lvx     v(23), 0, r(7)
329         addi    r(7), r(7), 32
330         lvx     v(24), 0, r(6)
331         addi    r(6), r(6), 32
332         lvx     v(25), 0, r(7)
333         addi    r(7), r(7), 32
334         lvx     v(26), 0, r(6)
335         addi    r(6), r(6), 32
336         lvx     v(27), 0, r(7)
337         addi    r(7), r(7), 32
338         lvx     v(28), 0, r(6)
339         addi    r(6), r(6), 32
340         lvx     v(29), 0, r(7)
341         addi    r(7), r(7), 32
342         lvx     v(30), 0, r(6)
343         lvx     v(31), 0, r(7)
344         mtspr   VRSAVE, r(0)
345 #endif
347 #ifndef _SOFT_FLOAT
348         /* ??? Determine when FPRs not present.  */
349         /* ??? Test r(5) for pr_hasNoFloatUpdate and skip the fp load.
350            This is not yet set by the compiler.  */
351         lfd     f(0), OFS_FPSCR(r(4))
352         cfi_undefined(f(14))
353         cfi_undefined(f(15))
354         cfi_undefined(f(16))
355         cfi_undefined(f(17))
356         cfi_undefined(f(18))
357         cfi_undefined(f(19))
358         cfi_undefined(f(20))
359         cfi_undefined(f(21))
360         cfi_undefined(f(22))
361         cfi_undefined(f(23))
362         cfi_undefined(f(24))
363         cfi_undefined(f(25))
364         cfi_undefined(f(26))
365         cfi_undefined(f(27))
366         cfi_undefined(f(28))
367         cfi_undefined(f(29))
368         cfi_undefined(f(30))
369         cfi_undefined(f(31))
370         lfd     f(14),  0+OFS_FR(r(4))
371         lfd     f(15),  8+OFS_FR(r(4))
372         lfd     f(16), 16+OFS_FR(r(4))
373         lfd     f(17), 24+OFS_FR(r(4))
374         lfd     f(18), 32+OFS_FR(r(4))
375         lfd     f(19), 40+OFS_FR(r(4))
376         lfd     f(20), 48+OFS_FR(r(4))
377         lfd     f(21), 56+OFS_FR(r(4))
378         lfd     f(22), 64+OFS_FR(r(4))
379         lfd     f(23), 72+OFS_FR(r(4))
380         lfd     f(24), 80+OFS_FR(r(4))
381         lfd     f(25), 88+OFS_FR(r(4))
382         lfd     f(26), 96+OFS_FR(r(4))
383         lfd     f(27),104+OFS_FR(r(4))
384         lfd     f(28),112+OFS_FR(r(4))
385         lfd     f(29),120+OFS_FR(r(4))
386         lfd     f(30),128+OFS_FR(r(4))
387         lfd     f(31),136+OFS_FR(r(4))
388         mtfsf   0xff, f(0)
389 #endif
391         ldreg   r(6),   OFS_CFA(r(4))
392         ldreg   r(0),   OFS_LR(r(4))
393 #ifdef _CALL_DARWIN
394         ldreg   r(13),  OFS_TOC(r(4))
395 #else
396         ldreg   r(2),   OFS_TOC(r(4))
397 #endif
398         ldreg   r(7),   OFS_CR(r(4))
399         /* At the instant we restore the LR, the only coherent view of
400            the world we have is into the new stack frame.  Define the
401            CFA in terms of the not-yet-restored stack pointer.  This will
402            last until the end of the function.  */
403         mtlr    r(0)
404         cfi_def_cfa(r(6), 0)
405         cfi_undefined(r(14))
406         cfi_undefined(r(15))
407         cfi_undefined(r(16))
408         cfi_undefined(r(17))
409         cfi_undefined(r(18))
410         cfi_undefined(r(19))
411         cfi_undefined(r(20))
412         cfi_undefined(r(21))
413         cfi_undefined(r(22))
414         cfi_undefined(r(23))
415         cfi_undefined(r(24))
416         cfi_undefined(r(25))
417         cfi_undefined(r(26))
418         cfi_undefined(r(27))
419         cfi_undefined(r(28))
420         cfi_undefined(r(29))
421         cfi_undefined(r(30))
422         cfi_undefined(r(31))
423         mtcr    r(7)
424         ldreg   r(14),  0*WS+OFS_GR(r(4))
425         ldreg   r(15),  1*WS+OFS_GR(r(4))
426         ldreg   r(16),  2*WS+OFS_GR(r(4))
427         ldreg   r(17),  3*WS+OFS_GR(r(4))
428         ldreg   r(18),  4*WS+OFS_GR(r(4))
429         ldreg   r(19),  5*WS+OFS_GR(r(4))
430         ldreg   r(20),  6*WS+OFS_GR(r(4))
431         ldreg   r(21),  7*WS+OFS_GR(r(4))
432         ldreg   r(22),  8*WS+OFS_GR(r(4))
433         ldreg   r(23),  9*WS+OFS_GR(r(4))
434         ldreg   r(24), 10*WS+OFS_GR(r(4))
435         ldreg   r(25), 11*WS+OFS_GR(r(4))
436         ldreg   r(26), 12*WS+OFS_GR(r(4))
437         ldreg   r(27), 13*WS+OFS_GR(r(4))
438         ldreg   r(28), 14*WS+OFS_GR(r(4))
439         ldreg   r(29), 15*WS+OFS_GR(r(4))
440         ldreg   r(30), 16*WS+OFS_GR(r(4))
441         ldreg   r(31), 17*WS+OFS_GR(r(4))
442         mr      r(1), r(6)
443         blr
444         cfi_endproc
445 END GTM_longjmp
447 #ifdef __linux__
448 .section .note.GNU-stack, "", @progbits
449 #endif