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 = >id 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 = >id 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