xref: /freebsd/contrib/llvm-project/openmp/runtime/src/z_AIX_asm.S (revision 56727255ad47072ec2cc81b4ae728a099697b0e4)
1*56727255SDimitry Andric//  z_AIX_asm.S:  - microtasking routines specifically
2*56727255SDimitry Andric//                  written for Power platforms running AIX OS
3*56727255SDimitry Andric
4*56727255SDimitry Andric//
5*56727255SDimitry Andric////===----------------------------------------------------------------------===//
6*56727255SDimitry Andric////
7*56727255SDimitry Andric//// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
8*56727255SDimitry Andric//// See https://llvm.org/LICENSE.txt for license information.
9*56727255SDimitry Andric//// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
10*56727255SDimitry Andric////
11*56727255SDimitry Andric////===----------------------------------------------------------------------===//
12*56727255SDimitry Andric//
13*56727255SDimitry Andric
14*56727255SDimitry Andric// -----------------------------------------------------------------------
15*56727255SDimitry Andric// macros
16*56727255SDimitry Andric// -----------------------------------------------------------------------
17*56727255SDimitry Andric
18*56727255SDimitry Andric#include "kmp_config.h"
19*56727255SDimitry Andric
20*56727255SDimitry Andric#if KMP_OS_AIX
21*56727255SDimitry Andric//------------------------------------------------------------------------
22*56727255SDimitry Andric// int
23*56727255SDimitry Andric// __kmp_invoke_microtask( void (*pkfn) (int *gtid, int *tid, ...),
24*56727255SDimitry Andric//                         int gtid, int tid,
25*56727255SDimitry Andric//                         int argc, void *p_argv[]
26*56727255SDimitry Andric// #if OMPT_SUPPORT
27*56727255SDimitry Andric//                         ,
28*56727255SDimitry Andric//                         void **exit_frame_ptr
29*56727255SDimitry Andric// #endif
30*56727255SDimitry Andric//                       ) {
31*56727255SDimitry Andric// #if OMPT_SUPPORT
32*56727255SDimitry Andric//   *exit_frame_ptr = OMPT_GET_FRAME_ADDRESS(0);
33*56727255SDimitry Andric// #endif
34*56727255SDimitry Andric//
35*56727255SDimitry Andric//   (*pkfn)( & gtid, & tid, p_argv[0], ... );
36*56727255SDimitry Andric//
37*56727255SDimitry Andric// // FIXME: This is done at call-site and can be removed here.
38*56727255SDimitry Andric// #if OMPT_SUPPORT
39*56727255SDimitry Andric//   *exit_frame_ptr = 0;
40*56727255SDimitry Andric// #endif
41*56727255SDimitry Andric//
42*56727255SDimitry Andric//   return 1;
43*56727255SDimitry Andric// }
44*56727255SDimitry Andric//
45*56727255SDimitry Andric// parameters:
46*56727255SDimitry Andric//   r3: pkfn
47*56727255SDimitry Andric//   r4: gtid
48*56727255SDimitry Andric//   r5: tid
49*56727255SDimitry Andric//   r6: argc
50*56727255SDimitry Andric//   r7: p_argv
51*56727255SDimitry Andric//   r8: &exit_frame
52*56727255SDimitry Andric//
53*56727255SDimitry Andric// return:  r3 (always 1/TRUE)
54*56727255SDimitry Andric//
55*56727255SDimitry Andric
56*56727255SDimitry Andric#if KMP_ARCH_PPC64_XCOFF
57*56727255SDimitry Andric
58*56727255SDimitry Andric    .globl  __kmp_invoke_microtask[DS]
59*56727255SDimitry Andric    .globl  .__kmp_invoke_microtask
60*56727255SDimitry Andric    .align  4
61*56727255SDimitry Andric    .csect __kmp_invoke_microtask[DS],3
62*56727255SDimitry Andric    .vbyte  8, .__kmp_invoke_microtask
63*56727255SDimitry Andric    .vbyte  8, TOC[TC0]
64*56727255SDimitry Andric    .vbyte  8, 0
65*56727255SDimitry Andric    .csect .text[PR],2
66*56727255SDimitry Andric    .machine "pwr7"
67*56727255SDimitry Andric.__kmp_invoke_microtask:
68*56727255SDimitry Andric
69*56727255SDimitry Andric
70*56727255SDimitry Andric// -- Begin __kmp_invoke_microtask
71*56727255SDimitry Andric// mark_begin;
72*56727255SDimitry Andric
73*56727255SDimitry Andric// We need to allocate a stack frame large enough to hold all of the parameters
74*56727255SDimitry Andric// on the stack for the microtask plus what this function needs. That's 48
75*56727255SDimitry Andric// bytes under the XCOFF64 ABI, plus max(64, 8*(2 + argc)) for
76*56727255SDimitry Andric// the parameters to the microtask (gtid, tid, argc elements of p_argv),
77*56727255SDimitry Andric// plus 8 bytes to store the values of r4 and r5, and 8 bytes to store r31.
78*56727255SDimitry Andric// With OMP-T support, we need an additional 8 bytes to save r30 to hold
79*56727255SDimitry Andric// a copy of r8.
80*56727255SDimitry Andric// Stack offsets relative to stack pointer:
81*56727255SDimitry Andric//   r31: -8, r30: -16, gtid: -20, tid: -24
82*56727255SDimitry Andric
83*56727255SDimitry Andric    mflr 0
84*56727255SDimitry Andric    std 31, -8(1)      # Save r31 to the stack
85*56727255SDimitry Andric    std 0, 16(1)       # Save LR to the linkage area
86*56727255SDimitry Andric
87*56727255SDimitry Andric// This is unusual because normally we'd set r31 equal to r1 after the stack
88*56727255SDimitry Andric// frame is established. In this case, however, we need to dynamically compute
89*56727255SDimitry Andric// the stack frame size, and so we keep a direct copy of r1 to access our
90*56727255SDimitry Andric// register save areas and restore the r1 value before returning.
91*56727255SDimitry Andric    mr 31, 1
92*56727255SDimitry Andric
93*56727255SDimitry Andric// Compute the size of the "argc" portion of the parameter save area.
94*56727255SDimitry Andric// The parameter save area is always at least 64 bytes long (i.e. 8 regs)
95*56727255SDimitry Andric// The microtask has (2 + argc) parameters, so if argc <= 6, we need to
96*56727255SDimitry Andric// to allocate 8*6 bytes, not 8*argc.
97*56727255SDimitry Andric    li 0, 6
98*56727255SDimitry Andric    cmpwi 0, 6, 6
99*56727255SDimitry Andric    iselgt 0, 6, 0     # r0 = (argc > 6)? argc : 6
100*56727255SDimitry Andric    sldi 0, 0, 3       # r0 = 8 * max(argc, 6)
101*56727255SDimitry Andric
102*56727255SDimitry Andric// Compute the size necessary for the local stack frame.
103*56727255SDimitry Andric// 88 = 48 + 4 (for r4) + 4 (for r5) + 8 (for r31) + 8 (for OMP-T r30) +
104*56727255SDimitry Andric//      8 (parameter gtid) + 8 (parameter tid)
105*56727255SDimitry Andric    li 12, 88
106*56727255SDimitry Andric    add 12, 0, 12
107*56727255SDimitry Andric    neg 12, 12
108*56727255SDimitry Andric
109*56727255SDimitry Andric// We need to make sure that the stack frame stays aligned (to 16 bytes).
110*56727255SDimitry Andric    li 0, -16
111*56727255SDimitry Andric    and 12, 0, 12
112*56727255SDimitry Andric
113*56727255SDimitry Andric// Establish the local stack frame.
114*56727255SDimitry Andric    stdux 1, 1, 12
115*56727255SDimitry Andric
116*56727255SDimitry Andric#if OMPT_SUPPORT
117*56727255SDimitry Andric    std 30, -16(31)    # Save r30 to the stack
118*56727255SDimitry Andric    std 1, 0(8)
119*56727255SDimitry Andric    mr 30, 8
120*56727255SDimitry Andric#endif
121*56727255SDimitry Andric
122*56727255SDimitry Andric// Store gtid and tid to the stack because they're passed by reference to the microtask.
123*56727255SDimitry Andric    stw 4, -20(31)     # Save gtid to the stack
124*56727255SDimitry Andric    stw 5, -24(31)     # Save tid to the stack
125*56727255SDimitry Andric
126*56727255SDimitry Andric    mr 12, 6           # r12 = argc
127*56727255SDimitry Andric    mr 4, 7            # r4 = p_argv
128*56727255SDimitry Andric
129*56727255SDimitry Andric    cmpwi 0, 12, 1
130*56727255SDimitry Andric    blt 0, .Lcall      # if (argc < 1) goto .Lcall
131*56727255SDimitry Andric
132*56727255SDimitry Andric    ld 5, 0(4)         # r5 = p_argv[0]
133*56727255SDimitry Andric
134*56727255SDimitry Andric    cmpwi 0, 12, 2
135*56727255SDimitry Andric    blt 0, .Lcall      # if (argc < 2) goto .Lcall
136*56727255SDimitry Andric
137*56727255SDimitry Andric    ld 6, 8(4)         # r6 = p_argv[1]
138*56727255SDimitry Andric
139*56727255SDimitry Andric    cmpwi 0, 12, 3
140*56727255SDimitry Andric    blt 0, .Lcall      # if (argc < 3) goto .Lcall
141*56727255SDimitry Andric
142*56727255SDimitry Andric    ld 7, 16(4)        # r7 = p_argv[2]
143*56727255SDimitry Andric
144*56727255SDimitry Andric    cmpwi 0, 12, 4
145*56727255SDimitry Andric    blt 0, .Lcall      # if (argc < 4) goto .Lcall
146*56727255SDimitry Andric
147*56727255SDimitry Andric    ld 8, 24(4)        # r8 = p_argv[3]
148*56727255SDimitry Andric
149*56727255SDimitry Andric    cmpwi 0, 12, 5
150*56727255SDimitry Andric    blt 0, .Lcall      # if (argc < 5) goto .Lcall
151*56727255SDimitry Andric
152*56727255SDimitry Andric    ld 9, 32(4)        # r9 = p_argv[4]
153*56727255SDimitry Andric
154*56727255SDimitry Andric    cmpwi 0, 12, 6
155*56727255SDimitry Andric    blt 0, .Lcall      # if (argc < 6) goto .Lcall
156*56727255SDimitry Andric
157*56727255SDimitry Andric    ld 10, 40(4)       # r10 = p_argv[5]
158*56727255SDimitry Andric
159*56727255SDimitry Andric    cmpwi 0, 12, 7
160*56727255SDimitry Andric    blt 0, .Lcall      # if (argc < 7) goto .Lcall
161*56727255SDimitry Andric
162*56727255SDimitry Andric// There are more than 6 microtask parameters, so we need to store the
163*56727255SDimitry Andric// remainder to the stack.
164*56727255SDimitry Andric    addi 12, 12, -6    # argc -= 6
165*56727255SDimitry Andric    mtctr 12
166*56727255SDimitry Andric
167*56727255SDimitry Andric// These are set to 8 bytes before the first desired store address (we're using
168*56727255SDimitry Andric// pre-increment loads and stores in the loop below). The parameter save area
169*56727255SDimitry Andric// for the microtask begins 48 + 8*8 == 112 bytes above r1 for XCOFF64.
170*56727255SDimitry Andric    addi 4, 4, 40      # p_argv = p_argv + 5
171*56727255SDimitry Andric                       # (i.e. skip the 5 elements we already processed)
172*56727255SDimitry Andric    addi 12, 1, 104    # r12 = stack offset (112 - 8)
173*56727255SDimitry Andric
174*56727255SDimitry Andric.Lnext:
175*56727255SDimitry Andric    ldu 0, 8(4)
176*56727255SDimitry Andric    stdu 0, 8(12)
177*56727255SDimitry Andric    bdnz .Lnext
178*56727255SDimitry Andric
179*56727255SDimitry Andric.Lcall:
180*56727255SDimitry Andric    std 2, 40(1)     # Save the TOC pointer to the linkage area
181*56727255SDimitry Andric// Load the actual function address from the function descriptor.
182*56727255SDimitry Andric    ld 12, 0(3)      # Function address
183*56727255SDimitry Andric    ld 2, 8(3)       # TOC pointer
184*56727255SDimitry Andric    ld 11, 16(3)     # Environment pointer
185*56727255SDimitry Andric
186*56727255SDimitry Andric    addi 3, 31, -20  # r3 = &gtid
187*56727255SDimitry Andric    addi 4, 31, -24  # r4 = &tid
188*56727255SDimitry Andric
189*56727255SDimitry Andric    mtctr 12         # CTR = function address
190*56727255SDimitry Andric    bctrl            # Branch to CTR
191*56727255SDimitry Andric    ld 2, 40(1)      # Restore TOC pointer from linkage area
192*56727255SDimitry Andric
193*56727255SDimitry Andric#if OMPT_SUPPORT
194*56727255SDimitry Andric    li 3, 0
195*56727255SDimitry Andric    std 3, 0(30)
196*56727255SDimitry Andric#endif
197*56727255SDimitry Andric
198*56727255SDimitry Andric    li 3, 1
199*56727255SDimitry Andric
200*56727255SDimitry Andric#if OMPT_SUPPORT
201*56727255SDimitry Andric    ld 30, -16(31)   # Restore r30 from the saved value on the stack
202*56727255SDimitry Andric#endif
203*56727255SDimitry Andric
204*56727255SDimitry Andric    mr 1, 31
205*56727255SDimitry Andric    ld 31, -8(1)     # Restore r31 from the saved value on the stack
206*56727255SDimitry Andric    ld 0, 16(1)
207*56727255SDimitry Andric    mtlr 0           # Restore LR from the linkage area
208*56727255SDimitry Andric    blr              # Branch to LR
209*56727255SDimitry Andric
210*56727255SDimitry Andric#else  // KMP_ARCH_PPC_XCOFF
211*56727255SDimitry Andric
212*56727255SDimitry Andric    .globl  __kmp_invoke_microtask[DS]
213*56727255SDimitry Andric    .globl  .__kmp_invoke_microtask
214*56727255SDimitry Andric    .align  4
215*56727255SDimitry Andric    .csect __kmp_invoke_microtask[DS],2
216*56727255SDimitry Andric    .vbyte  4, .__kmp_invoke_microtask
217*56727255SDimitry Andric    .vbyte  4, TOC[TC0]
218*56727255SDimitry Andric    .vbyte  4, 0
219*56727255SDimitry Andric    .csect .text[PR],2
220*56727255SDimitry Andric    .machine "pwr7"
221*56727255SDimitry Andric.__kmp_invoke_microtask:
222*56727255SDimitry Andric
223*56727255SDimitry Andric
224*56727255SDimitry Andric// -- Begin __kmp_invoke_microtask
225*56727255SDimitry Andric// mark_begin;
226*56727255SDimitry Andric
227*56727255SDimitry Andric// We need to allocate a stack frame large enough to hold all of the parameters
228*56727255SDimitry Andric// on the stack for the microtask plus what this function needs. That's 24
229*56727255SDimitry Andric// bytes under the XCOFF ABI, plus max(32, 8*(2 + argc)) for
230*56727255SDimitry Andric// the parameters to the microtask (gtid, tid, argc elements of p_argv),
231*56727255SDimitry Andric// plus 8 bytes to store the values of r4 and r5, and 4 bytes to store r31.
232*56727255SDimitry Andric// With OMP-T support, we need an additional 4 bytes to save r30 to hold
233*56727255SDimitry Andric// a copy of r8.
234*56727255SDimitry Andric// Stack offsets relative to stack pointer:
235*56727255SDimitry Andric//   r31: -4, r30: -8, gtid: -12, tid: -16
236*56727255SDimitry Andric
237*56727255SDimitry Andric    mflr 0
238*56727255SDimitry Andric    stw 31, -4(1)      # Save r31 to the stack
239*56727255SDimitry Andric    stw 0, 8(1)        # Save LR to the linkage area
240*56727255SDimitry Andric
241*56727255SDimitry Andric// This is unusual because normally we'd set r31 equal to r1 after the stack
242*56727255SDimitry Andric// frame is established. In this case, however, we need to dynamically compute
243*56727255SDimitry Andric// the stack frame size, and so we keep a direct copy of r1 to access our
244*56727255SDimitry Andric// register save areas and restore the r1 value before returning.
245*56727255SDimitry Andric    mr 31, 1
246*56727255SDimitry Andric
247*56727255SDimitry Andric// Compute the size of the "argc" portion of the parameter save area.
248*56727255SDimitry Andric// The parameter save area is always at least 32 bytes long (i.e. 8 regs)
249*56727255SDimitry Andric// The microtask has (2 + argc) parameters, so if argc <= 6, we need to
250*56727255SDimitry Andric// to allocate 4*6 bytes, not 4*argc.
251*56727255SDimitry Andric    li 0, 6
252*56727255SDimitry Andric    cmpwi 0, 6, 6
253*56727255SDimitry Andric    iselgt 0, 6, 0     # r0 = (argc > 6)? argc : 6
254*56727255SDimitry Andric    slwi 0, 0, 2       # r0 = 4 * max(argc, 6)
255*56727255SDimitry Andric
256*56727255SDimitry Andric// Compute the size necessary for the local stack frame.
257*56727255SDimitry Andric// 56 = 32 + 4 (for r4) + 4 (for r5) + 4 (for r31) + 4 (for OMP-T r30) +
258*56727255SDimitry Andric//      4 (parameter gtid) + 4 (parameter tid)
259*56727255SDimitry Andric    li 12, 56
260*56727255SDimitry Andric    add 12, 0, 12
261*56727255SDimitry Andric    neg 12, 12
262*56727255SDimitry Andric
263*56727255SDimitry Andric// We need to make sure that the stack frame stays aligned (to 16 bytes).
264*56727255SDimitry Andric    li 0, -16
265*56727255SDimitry Andric    and 12, 0, 12
266*56727255SDimitry Andric
267*56727255SDimitry Andric// Establish the local stack frame.
268*56727255SDimitry Andric    stwux 1, 1, 12
269*56727255SDimitry Andric
270*56727255SDimitry Andric#if OMPT_SUPPORT
271*56727255SDimitry Andric    stw 30, -8(31)     # Save r30 to the stack
272*56727255SDimitry Andric    stw 1, 0(8)
273*56727255SDimitry Andric    mr 30, 8
274*56727255SDimitry Andric#endif
275*56727255SDimitry Andric
276*56727255SDimitry Andric// Store gtid and tid to the stack because they're passed by reference to the microtask.
277*56727255SDimitry Andric    stw 4, -12(31)     # Save gtid to the stack
278*56727255SDimitry Andric    stw 5, -16(31)     # Save tid to the stack
279*56727255SDimitry Andric
280*56727255SDimitry Andric    mr 12, 6           # r12 = argc
281*56727255SDimitry Andric    mr 4, 7            # r4 = p_argv
282*56727255SDimitry Andric
283*56727255SDimitry Andric    cmpwi 0, 12, 1
284*56727255SDimitry Andric    blt 0, .Lcall      # if (argc < 1) goto .Lcall
285*56727255SDimitry Andric
286*56727255SDimitry Andric    lwz 5, 0(4)        # r5 = p_argv[0]
287*56727255SDimitry Andric
288*56727255SDimitry Andric    cmpwi 0, 12, 2
289*56727255SDimitry Andric    blt 0, .Lcall      # if (argc < 2) goto .Lcall
290*56727255SDimitry Andric
291*56727255SDimitry Andric    lwz 6, 4(4)        # r6 = p_argv[1]
292*56727255SDimitry Andric
293*56727255SDimitry Andric    cmpwi 0, 12, 3
294*56727255SDimitry Andric    blt 0, .Lcall      # if (argc < 3) goto .Lcall
295*56727255SDimitry Andric
296*56727255SDimitry Andric    lwz 7, 8(4)        # r7 = p_argv[2]
297*56727255SDimitry Andric
298*56727255SDimitry Andric    cmpwi 0, 12, 4
299*56727255SDimitry Andric    blt 0, .Lcall      # if (argc < 4) goto .Lcall
300*56727255SDimitry Andric
301*56727255SDimitry Andric    lwz 8, 12(4)       # r8 = p_argv[3]
302*56727255SDimitry Andric
303*56727255SDimitry Andric    cmpwi 0, 12, 5
304*56727255SDimitry Andric    blt 0, .Lcall      # if (argc < 5) goto .Lcall
305*56727255SDimitry Andric
306*56727255SDimitry Andric    lwz 9, 16(4)       # r9 = p_argv[4]
307*56727255SDimitry Andric
308*56727255SDimitry Andric    cmpwi 0, 12, 6
309*56727255SDimitry Andric    blt 0, .Lcall      # if (argc < 6) goto .Lcall
310*56727255SDimitry Andric
311*56727255SDimitry Andric    lwz 10, 20(4)      # r10 = p_argv[5]
312*56727255SDimitry Andric
313*56727255SDimitry Andric    cmpwi 0, 12, 7
314*56727255SDimitry Andric    blt 0, .Lcall      # if (argc < 7) goto .Lcall
315*56727255SDimitry Andric
316*56727255SDimitry Andric// There are more than 6 microtask parameters, so we need to store the
317*56727255SDimitry Andric// remainder to the stack.
318*56727255SDimitry Andric    addi 12, 12, -6    # argc -= 6
319*56727255SDimitry Andric    mtctr 12
320*56727255SDimitry Andric
321*56727255SDimitry Andric// These are set to 4 bytes before the first desired store address (we're using
322*56727255SDimitry Andric// pre-increment loads and stores in the loop below). The parameter save area
323*56727255SDimitry Andric// for the microtask begins 24 + 4*8 == 56 bytes above r1 for XCOFF.
324*56727255SDimitry Andric    addi 4, 4, 20      # p_argv = p_argv + 5
325*56727255SDimitry Andric                       # (i.e. skip the 5 elements we already processed)
326*56727255SDimitry Andric    addi 12, 1, 52     # r12 = stack offset (56 - 4)
327*56727255SDimitry Andric
328*56727255SDimitry Andric.Lnext:
329*56727255SDimitry Andric    lwzu 0, 4(4)
330*56727255SDimitry Andric    stwu 0, 4(12)
331*56727255SDimitry Andric    bdnz .Lnext
332*56727255SDimitry Andric
333*56727255SDimitry Andric.Lcall:
334*56727255SDimitry Andric    stw 2, 20(1)     # Save the TOC pointer to the linkage area
335*56727255SDimitry Andric// Load the actual function address from the function descriptor.
336*56727255SDimitry Andric    lwz 12, 0(3)     # Function address
337*56727255SDimitry Andric    lwz 2, 4(3)      # TOC pointer
338*56727255SDimitry Andric    lwz 11, 8(3)     # Environment pointer
339*56727255SDimitry Andric
340*56727255SDimitry Andric    addi 3, 31, -12  # r3 = &gtid
341*56727255SDimitry Andric    addi 4, 31, -16  # r4 = &tid
342*56727255SDimitry Andric
343*56727255SDimitry Andric    mtctr 12         # CTR = function address
344*56727255SDimitry Andric    bctrl            # Branch to CTR
345*56727255SDimitry Andric    lwz 2, 20(1)     # Restore TOC pointer from linkage area
346*56727255SDimitry Andric
347*56727255SDimitry Andric#if OMPT_SUPPORT
348*56727255SDimitry Andric    li 3, 0
349*56727255SDimitry Andric    stw 3, 0(30)
350*56727255SDimitry Andric#endif
351*56727255SDimitry Andric
352*56727255SDimitry Andric    li 3, 1
353*56727255SDimitry Andric
354*56727255SDimitry Andric#if OMPT_SUPPORT
355*56727255SDimitry Andric    lwz 30, -8(31)   # Restore r30 from the saved value on the stack
356*56727255SDimitry Andric#endif
357*56727255SDimitry Andric
358*56727255SDimitry Andric    mr 1, 31
359*56727255SDimitry Andric    lwz 31, -4(1)    # Restore r31 from the saved value on the stack
360*56727255SDimitry Andric    lwz 0, 8(1)
361*56727255SDimitry Andric    mtlr 0           # Restore LR from the linkage area
362*56727255SDimitry Andric    blr              # Branch to LR
363*56727255SDimitry Andric
364*56727255SDimitry Andric#endif // KMP_ARCH_PPC64_XCOFF
365*56727255SDimitry Andric
366*56727255SDimitry Andric.Lfunc_end0:
367*56727255SDimitry Andric    .vbyte  4, 0x00000000           # Traceback table begin
368*56727255SDimitry Andric    .byte   0x00                    # Version = 0
369*56727255SDimitry Andric    .byte   0x09                    # Language = CPlusPlus
370*56727255SDimitry Andric    .byte   0x20                    # -IsGlobaLinkage, -IsOutOfLineEpilogOrPrologue
371*56727255SDimitry Andric                                    # +HasTraceBackTableOffset, -IsInternalProcedure
372*56727255SDimitry Andric                                    # -HasControlledStorage, -IsTOCless
373*56727255SDimitry Andric                                    # -IsFloatingPointPresent
374*56727255SDimitry Andric                                    # -IsFloatingPointOperationLogOrAbortEnabled
375*56727255SDimitry Andric    .byte   0x61                    # -IsInterruptHandler, +IsFunctionNamePresent, +IsAllocaUsed
376*56727255SDimitry Andric                                    # OnConditionDirective = 0, -IsCRSaved, +IsLRSaved
377*56727255SDimitry Andric    .byte   0x80                    # +IsBackChainStored, -IsFixup, NumOfFPRsSaved = 0
378*56727255SDimitry Andric#if OMPT_SUPPORT
379*56727255SDimitry Andric    .byte   0x02                    # -HasExtensionTable, -HasVectorInfo, NumOfGPRsSaved = 2
380*56727255SDimitry Andric    .byte   0x06                    # NumberOfFixedParms = 6
381*56727255SDimitry Andric#else
382*56727255SDimitry Andric    .byte   0x01                    # -HasExtensionTable, -HasVectorInfo, NumOfGPRsSaved = 1
383*56727255SDimitry Andric    .byte   0x05                    # NumberOfFixedParms = 5
384*56727255SDimitry Andric#endif
385*56727255SDimitry Andric    .byte   0x01                    # NumberOfFPParms = 0, +HasParmsOnStack
386*56727255SDimitry Andric    .vbyte  4, 0x00000000           # Parameter type = i, i, i, i, i
387*56727255SDimitry Andric    .vbyte  4, .Lfunc_end0-.__kmp_invoke_microtask # Function size
388*56727255SDimitry Andric    .vbyte  2, 0x0016               # Function name len = 22
389*56727255SDimitry Andric    .byte   "__kmp_invoke_microtask" # Function Name
390*56727255SDimitry Andric    .byte   0x1f                    # AllocaRegister = 31
391*56727255SDimitry Andric                                    # -- End function
392*56727255SDimitry Andric
393*56727255SDimitry Andric// -- End  __kmp_invoke_microtask
394*56727255SDimitry Andric
395*56727255SDimitry Andric// Support for unnamed common blocks.
396*56727255SDimitry Andric
397*56727255SDimitry Andric    .comm .gomp_critical_user_, 32, 3
398*56727255SDimitry Andric#if KMP_ARCH_PPC64_XCOFF
399*56727255SDimitry Andric    .csect __kmp_unnamed_critical_addr[RW],3
400*56727255SDimitry Andric#else
401*56727255SDimitry Andric    .csect __kmp_unnamed_critical_addr[RW],2
402*56727255SDimitry Andric#endif
403*56727255SDimitry Andric    .globl __kmp_unnamed_critical_addr[RW]
404*56727255SDimitry Andric    .ptr .gomp_critical_user_
405*56727255SDimitry Andric
406*56727255SDimitry Andric// -- End unnamed common block
407*56727255SDimitry Andric
408*56727255SDimitry Andric    .toc
409*56727255SDimitry Andric
410*56727255SDimitry Andric#endif // KMP_OS_AIX
411