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
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/>. */
29 #if defined(__powerpc64__) && _CALL_ELF == 2 && defined(__PCREL__)
32 .type \name, @function
37 .size \name, . - \name
45 #elif defined(__powerpc64__) && _CALL_ELF == 2
48 .type \name, @function
50 0: addis 2,12,(.TOC.-0b)@ha
52 .localentry \name, . - \name
55 .size \name, . - \name
64 #elif defined(__powerpc64__) && defined(__ELF__)
70 .quad .\name, .TOC.@tocbase, 0
72 .type .\name, @function
77 .size .\name, . - .\name
86 #elif defined(__ELF__)
89 .type \name, @function
93 .size \name, . - \name
101 #elif defined(_CALL_DARWIN)
120 #error "unsupported system"
123 /* Parameterize the naming of registers. */
128 #elif defined(__MACH__)
138 /* Parameterize the code for 32-bit vs 64-bit. */
139 #if defined(__powerpc64__) || defined(__ppc64__)
151 /* Parameterize the code for call frame constants. */
152 #if defined(_CALL_AIXDESC)
154 # define LR_SAVE 2*WS
157 # define LR_SAVE 2*WS
158 #elif defined(_CALL_SYSV)
160 # define LR_SAVE 1*WS
161 #elif defined(_CALL_DARWIN)
162 # define BASE (6*WS + 2*WS)
163 # define LR_SAVE 2*WS
165 # error "unsupported system"
168 #if defined(__ALTIVEC__) || defined(__VSX__)
170 # define OFS_VSCR 12*16
171 # define OFS_VR_END OFS_VSCR + 8
173 # define OFS_VR_END 0
176 # define OFS_FR OFS_VR_END
177 # define OFS_FPSCR OFS_FR + 18*8
178 # define OFS_FR_END OFS_FPSCR + 8
180 # define OFS_FR_END OFS_VR_END
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)
193 FUNC _ITM_beginTransaction
197 addi r(4), r(1), -OFS_END
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))
206 streg r(13), OFS_TOC(r(4))
208 streg r(2), OFS_TOC(r(4))
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))
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. */
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))
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
285 streg r(0), OFS_VSCR(r(4))
288 CALL GTM_begin_transaction
290 ldreg r(0), LR_SAVE+FRAME(r(1))
292 addi r(1), r(1), FRAME
293 cfi_def_cfa_offset(0)
297 END _ITM_beginTransaction
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))
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))
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))
391 ldreg r(6), OFS_CFA(r(4))
392 ldreg r(0), OFS_LR(r(4))
394 ldreg r(13), OFS_TOC(r(4))
396 ldreg r(2), OFS_TOC(r(4))
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. */
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))
448 .section .note.GNU-stack, "", @progbits