1*9880d681SAndroid Build Coastguard Worker//===-- X86CallingConv.td - Calling Conventions X86 32/64 --*- tablegen -*-===// 2*9880d681SAndroid Build Coastguard Worker// 3*9880d681SAndroid Build Coastguard Worker// The LLVM Compiler Infrastructure 4*9880d681SAndroid Build Coastguard Worker// 5*9880d681SAndroid Build Coastguard Worker// This file is distributed under the University of Illinois Open Source 6*9880d681SAndroid Build Coastguard Worker// License. See LICENSE.TXT for details. 7*9880d681SAndroid Build Coastguard Worker// 8*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 9*9880d681SAndroid Build Coastguard Worker// 10*9880d681SAndroid Build Coastguard Worker// This describes the calling conventions for the X86-32 and X86-64 11*9880d681SAndroid Build Coastguard Worker// architectures. 12*9880d681SAndroid Build Coastguard Worker// 13*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Worker/// CCIfSubtarget - Match if the current subtarget has a feature F. 16*9880d681SAndroid Build Coastguard Workerclass CCIfSubtarget<string F, CCAction A> 17*9880d681SAndroid Build Coastguard Worker : CCIf<!strconcat("static_cast<const X86Subtarget&>" 18*9880d681SAndroid Build Coastguard Worker "(State.getMachineFunction().getSubtarget()).", F), 19*9880d681SAndroid Build Coastguard Worker A>; 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 22*9880d681SAndroid Build Coastguard Worker// Return Value Calling Conventions 23*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Worker// Return-value conventions common to all X86 CC's. 26*9880d681SAndroid Build Coastguard Workerdef RetCC_X86Common : CallingConv<[ 27*9880d681SAndroid Build Coastguard Worker // Scalar values are returned in AX first, then DX. For i8, the ABI 28*9880d681SAndroid Build Coastguard Worker // requires the values to be in AL and AH, however this code uses AL and DL 29*9880d681SAndroid Build Coastguard Worker // instead. This is because using AH for the second register conflicts with 30*9880d681SAndroid Build Coastguard Worker // the way LLVM does multiple return values -- a return of {i16,i8} would end 31*9880d681SAndroid Build Coastguard Worker // up in AX and AH, which overlap. Front-ends wishing to conform to the ABI 32*9880d681SAndroid Build Coastguard Worker // for functions that return two i8 values are currently expected to pack the 33*9880d681SAndroid Build Coastguard Worker // values into an i16 (which uses AX, and thus AL:AH). 34*9880d681SAndroid Build Coastguard Worker // 35*9880d681SAndroid Build Coastguard Worker // For code that doesn't care about the ABI, we allow returning more than two 36*9880d681SAndroid Build Coastguard Worker // integer values in registers. 37*9880d681SAndroid Build Coastguard Worker CCIfType<[i1], CCPromoteToType<i8>>, 38*9880d681SAndroid Build Coastguard Worker CCIfType<[i8] , CCAssignToReg<[AL, DL, CL]>>, 39*9880d681SAndroid Build Coastguard Worker CCIfType<[i16], CCAssignToReg<[AX, DX, CX]>>, 40*9880d681SAndroid Build Coastguard Worker CCIfType<[i32], CCAssignToReg<[EAX, EDX, ECX]>>, 41*9880d681SAndroid Build Coastguard Worker CCIfType<[i64], CCAssignToReg<[RAX, RDX, RCX]>>, 42*9880d681SAndroid Build Coastguard Worker 43*9880d681SAndroid Build Coastguard Worker // Boolean vectors of AVX-512 are returned in SIMD registers. 44*9880d681SAndroid Build Coastguard Worker // The call from AVX to AVX-512 function should work, 45*9880d681SAndroid Build Coastguard Worker // since the boolean types in AVX/AVX2 are promoted by default. 46*9880d681SAndroid Build Coastguard Worker CCIfType<[v2i1], CCPromoteToType<v2i64>>, 47*9880d681SAndroid Build Coastguard Worker CCIfType<[v4i1], CCPromoteToType<v4i32>>, 48*9880d681SAndroid Build Coastguard Worker CCIfType<[v8i1], CCPromoteToType<v8i16>>, 49*9880d681SAndroid Build Coastguard Worker CCIfType<[v16i1], CCPromoteToType<v16i8>>, 50*9880d681SAndroid Build Coastguard Worker CCIfType<[v32i1], CCPromoteToType<v32i8>>, 51*9880d681SAndroid Build Coastguard Worker CCIfType<[v64i1], CCPromoteToType<v64i8>>, 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard Worker // Vector types are returned in XMM0 and XMM1, when they fit. XMM2 and XMM3 54*9880d681SAndroid Build Coastguard Worker // can only be used by ABI non-compliant code. If the target doesn't have XMM 55*9880d681SAndroid Build Coastguard Worker // registers, it won't have vector types. 56*9880d681SAndroid Build Coastguard Worker CCIfType<[v16i8, v8i16, v4i32, v2i64, v4f32, v2f64], 57*9880d681SAndroid Build Coastguard Worker CCAssignToReg<[XMM0,XMM1,XMM2,XMM3]>>, 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Worker // 256-bit vectors are returned in YMM0 and XMM1, when they fit. YMM2 and YMM3 60*9880d681SAndroid Build Coastguard Worker // can only be used by ABI non-compliant code. This vector type is only 61*9880d681SAndroid Build Coastguard Worker // supported while using the AVX target feature. 62*9880d681SAndroid Build Coastguard Worker CCIfType<[v32i8, v16i16, v8i32, v4i64, v8f32, v4f64], 63*9880d681SAndroid Build Coastguard Worker CCAssignToReg<[YMM0,YMM1,YMM2,YMM3]>>, 64*9880d681SAndroid Build Coastguard Worker 65*9880d681SAndroid Build Coastguard Worker // 512-bit vectors are returned in ZMM0 and ZMM1, when they fit. ZMM2 and ZMM3 66*9880d681SAndroid Build Coastguard Worker // can only be used by ABI non-compliant code. This vector type is only 67*9880d681SAndroid Build Coastguard Worker // supported while using the AVX-512 target feature. 68*9880d681SAndroid Build Coastguard Worker CCIfType<[v64i8, v32i16, v16i32, v8i64, v16f32, v8f64], 69*9880d681SAndroid Build Coastguard Worker CCAssignToReg<[ZMM0,ZMM1,ZMM2,ZMM3]>>, 70*9880d681SAndroid Build Coastguard Worker 71*9880d681SAndroid Build Coastguard Worker // MMX vector types are always returned in MM0. If the target doesn't have 72*9880d681SAndroid Build Coastguard Worker // MM0, it doesn't support these vector types. 73*9880d681SAndroid Build Coastguard Worker CCIfType<[x86mmx], CCAssignToReg<[MM0]>>, 74*9880d681SAndroid Build Coastguard Worker 75*9880d681SAndroid Build Coastguard Worker // Long double types are always returned in FP0 (even with SSE). 76*9880d681SAndroid Build Coastguard Worker CCIfType<[f80], CCAssignToReg<[FP0, FP1]>> 77*9880d681SAndroid Build Coastguard Worker]>; 78*9880d681SAndroid Build Coastguard Worker 79*9880d681SAndroid Build Coastguard Worker// X86-32 C return-value convention. 80*9880d681SAndroid Build Coastguard Workerdef RetCC_X86_32_C : CallingConv<[ 81*9880d681SAndroid Build Coastguard Worker // The X86-32 calling convention returns FP values in FP0, unless marked 82*9880d681SAndroid Build Coastguard Worker // with "inreg" (used here to distinguish one kind of reg from another, 83*9880d681SAndroid Build Coastguard Worker // weirdly; this is really the sse-regparm calling convention) in which 84*9880d681SAndroid Build Coastguard Worker // case they use XMM0, otherwise it is the same as the common X86 calling 85*9880d681SAndroid Build Coastguard Worker // conv. 86*9880d681SAndroid Build Coastguard Worker CCIfInReg<CCIfSubtarget<"hasSSE2()", 87*9880d681SAndroid Build Coastguard Worker CCIfType<[f32, f64], CCAssignToReg<[XMM0,XMM1,XMM2]>>>>, 88*9880d681SAndroid Build Coastguard Worker CCIfType<[f32,f64], CCAssignToReg<[FP0, FP1]>>, 89*9880d681SAndroid Build Coastguard Worker CCDelegateTo<RetCC_X86Common> 90*9880d681SAndroid Build Coastguard Worker]>; 91*9880d681SAndroid Build Coastguard Worker 92*9880d681SAndroid Build Coastguard Worker// X86-32 FastCC return-value convention. 93*9880d681SAndroid Build Coastguard Workerdef RetCC_X86_32_Fast : CallingConv<[ 94*9880d681SAndroid Build Coastguard Worker // The X86-32 fastcc returns 1, 2, or 3 FP values in XMM0-2 if the target has 95*9880d681SAndroid Build Coastguard Worker // SSE2. 96*9880d681SAndroid Build Coastguard Worker // This can happen when a float, 2 x float, or 3 x float vector is split by 97*9880d681SAndroid Build Coastguard Worker // target lowering, and is returned in 1-3 sse regs. 98*9880d681SAndroid Build Coastguard Worker CCIfType<[f32], CCIfSubtarget<"hasSSE2()", CCAssignToReg<[XMM0,XMM1,XMM2]>>>, 99*9880d681SAndroid Build Coastguard Worker CCIfType<[f64], CCIfSubtarget<"hasSSE2()", CCAssignToReg<[XMM0,XMM1,XMM2]>>>, 100*9880d681SAndroid Build Coastguard Worker 101*9880d681SAndroid Build Coastguard Worker // For integers, ECX can be used as an extra return register 102*9880d681SAndroid Build Coastguard Worker CCIfType<[i8], CCAssignToReg<[AL, DL, CL]>>, 103*9880d681SAndroid Build Coastguard Worker CCIfType<[i16], CCAssignToReg<[AX, DX, CX]>>, 104*9880d681SAndroid Build Coastguard Worker CCIfType<[i32], CCAssignToReg<[EAX, EDX, ECX]>>, 105*9880d681SAndroid Build Coastguard Worker 106*9880d681SAndroid Build Coastguard Worker // Otherwise, it is the same as the common X86 calling convention. 107*9880d681SAndroid Build Coastguard Worker CCDelegateTo<RetCC_X86Common> 108*9880d681SAndroid Build Coastguard Worker]>; 109*9880d681SAndroid Build Coastguard Worker 110*9880d681SAndroid Build Coastguard Worker// Intel_OCL_BI return-value convention. 111*9880d681SAndroid Build Coastguard Workerdef RetCC_Intel_OCL_BI : CallingConv<[ 112*9880d681SAndroid Build Coastguard Worker // Vector types are returned in XMM0,XMM1,XMMM2 and XMM3. 113*9880d681SAndroid Build Coastguard Worker CCIfType<[f32, f64, v4i32, v2i64, v4f32, v2f64], 114*9880d681SAndroid Build Coastguard Worker CCAssignToReg<[XMM0,XMM1,XMM2,XMM3]>>, 115*9880d681SAndroid Build Coastguard Worker 116*9880d681SAndroid Build Coastguard Worker // 256-bit FP vectors 117*9880d681SAndroid Build Coastguard Worker // No more than 4 registers 118*9880d681SAndroid Build Coastguard Worker CCIfType<[v8f32, v4f64, v8i32, v4i64], 119*9880d681SAndroid Build Coastguard Worker CCAssignToReg<[YMM0,YMM1,YMM2,YMM3]>>, 120*9880d681SAndroid Build Coastguard Worker 121*9880d681SAndroid Build Coastguard Worker // 512-bit FP vectors 122*9880d681SAndroid Build Coastguard Worker CCIfType<[v16f32, v8f64, v16i32, v8i64], 123*9880d681SAndroid Build Coastguard Worker CCAssignToReg<[ZMM0,ZMM1,ZMM2,ZMM3]>>, 124*9880d681SAndroid Build Coastguard Worker 125*9880d681SAndroid Build Coastguard Worker // i32, i64 in the standard way 126*9880d681SAndroid Build Coastguard Worker CCDelegateTo<RetCC_X86Common> 127*9880d681SAndroid Build Coastguard Worker]>; 128*9880d681SAndroid Build Coastguard Worker 129*9880d681SAndroid Build Coastguard Worker// X86-32 HiPE return-value convention. 130*9880d681SAndroid Build Coastguard Workerdef RetCC_X86_32_HiPE : CallingConv<[ 131*9880d681SAndroid Build Coastguard Worker // Promote all types to i32 132*9880d681SAndroid Build Coastguard Worker CCIfType<[i8, i16], CCPromoteToType<i32>>, 133*9880d681SAndroid Build Coastguard Worker 134*9880d681SAndroid Build Coastguard Worker // Return: HP, P, VAL1, VAL2 135*9880d681SAndroid Build Coastguard Worker CCIfType<[i32], CCAssignToReg<[ESI, EBP, EAX, EDX]>> 136*9880d681SAndroid Build Coastguard Worker]>; 137*9880d681SAndroid Build Coastguard Worker 138*9880d681SAndroid Build Coastguard Worker// X86-32 HiPE return-value convention. 139*9880d681SAndroid Build Coastguard Workerdef RetCC_X86_32_VectorCall : CallingConv<[ 140*9880d681SAndroid Build Coastguard Worker // Vector types are returned in XMM0,XMM1,XMMM2 and XMM3. 141*9880d681SAndroid Build Coastguard Worker CCIfType<[f32, f64, v16i8, v8i16, v4i32, v2i64, v4f32, v2f64], 142*9880d681SAndroid Build Coastguard Worker CCAssignToReg<[XMM0,XMM1,XMM2,XMM3]>>, 143*9880d681SAndroid Build Coastguard Worker 144*9880d681SAndroid Build Coastguard Worker // 256-bit FP vectors 145*9880d681SAndroid Build Coastguard Worker CCIfType<[v32i8, v16i16, v8i32, v4i64, v8f32, v4f64], 146*9880d681SAndroid Build Coastguard Worker CCAssignToReg<[YMM0,YMM1,YMM2,YMM3]>>, 147*9880d681SAndroid Build Coastguard Worker 148*9880d681SAndroid Build Coastguard Worker // 512-bit FP vectors 149*9880d681SAndroid Build Coastguard Worker CCIfType<[v64i8, v32i16, v16i32, v8i64, v16f32, v8f64], 150*9880d681SAndroid Build Coastguard Worker CCAssignToReg<[ZMM0,ZMM1,ZMM2,ZMM3]>>, 151*9880d681SAndroid Build Coastguard Worker 152*9880d681SAndroid Build Coastguard Worker // Return integers in the standard way. 153*9880d681SAndroid Build Coastguard Worker CCDelegateTo<RetCC_X86Common> 154*9880d681SAndroid Build Coastguard Worker]>; 155*9880d681SAndroid Build Coastguard Worker 156*9880d681SAndroid Build Coastguard Worker// X86-64 C return-value convention. 157*9880d681SAndroid Build Coastguard Workerdef RetCC_X86_64_C : CallingConv<[ 158*9880d681SAndroid Build Coastguard Worker // The X86-64 calling convention always returns FP values in XMM0. 159*9880d681SAndroid Build Coastguard Worker CCIfType<[f32], CCAssignToReg<[XMM0, XMM1]>>, 160*9880d681SAndroid Build Coastguard Worker CCIfType<[f64], CCAssignToReg<[XMM0, XMM1]>>, 161*9880d681SAndroid Build Coastguard Worker CCIfType<[f128], CCAssignToReg<[XMM0, XMM1]>>, 162*9880d681SAndroid Build Coastguard Worker 163*9880d681SAndroid Build Coastguard Worker // MMX vector types are always returned in XMM0. 164*9880d681SAndroid Build Coastguard Worker CCIfType<[x86mmx], CCAssignToReg<[XMM0, XMM1]>>, 165*9880d681SAndroid Build Coastguard Worker 166*9880d681SAndroid Build Coastguard Worker CCIfSwiftError<CCIfType<[i64], CCAssignToReg<[R12]>>>, 167*9880d681SAndroid Build Coastguard Worker 168*9880d681SAndroid Build Coastguard Worker CCDelegateTo<RetCC_X86Common> 169*9880d681SAndroid Build Coastguard Worker]>; 170*9880d681SAndroid Build Coastguard Worker 171*9880d681SAndroid Build Coastguard Worker// X86-Win64 C return-value convention. 172*9880d681SAndroid Build Coastguard Workerdef RetCC_X86_Win64_C : CallingConv<[ 173*9880d681SAndroid Build Coastguard Worker // The X86-Win64 calling convention always returns __m64 values in RAX. 174*9880d681SAndroid Build Coastguard Worker CCIfType<[x86mmx], CCBitConvertToType<i64>>, 175*9880d681SAndroid Build Coastguard Worker 176*9880d681SAndroid Build Coastguard Worker // Otherwise, everything is the same as 'normal' X86-64 C CC. 177*9880d681SAndroid Build Coastguard Worker CCDelegateTo<RetCC_X86_64_C> 178*9880d681SAndroid Build Coastguard Worker]>; 179*9880d681SAndroid Build Coastguard Worker 180*9880d681SAndroid Build Coastguard Worker// X86-64 HiPE return-value convention. 181*9880d681SAndroid Build Coastguard Workerdef RetCC_X86_64_HiPE : CallingConv<[ 182*9880d681SAndroid Build Coastguard Worker // Promote all types to i64 183*9880d681SAndroid Build Coastguard Worker CCIfType<[i8, i16, i32], CCPromoteToType<i64>>, 184*9880d681SAndroid Build Coastguard Worker 185*9880d681SAndroid Build Coastguard Worker // Return: HP, P, VAL1, VAL2 186*9880d681SAndroid Build Coastguard Worker CCIfType<[i64], CCAssignToReg<[R15, RBP, RAX, RDX]>> 187*9880d681SAndroid Build Coastguard Worker]>; 188*9880d681SAndroid Build Coastguard Worker 189*9880d681SAndroid Build Coastguard Worker// X86-64 WebKit_JS return-value convention. 190*9880d681SAndroid Build Coastguard Workerdef RetCC_X86_64_WebKit_JS : CallingConv<[ 191*9880d681SAndroid Build Coastguard Worker // Promote all types to i64 192*9880d681SAndroid Build Coastguard Worker CCIfType<[i8, i16, i32], CCPromoteToType<i64>>, 193*9880d681SAndroid Build Coastguard Worker 194*9880d681SAndroid Build Coastguard Worker // Return: RAX 195*9880d681SAndroid Build Coastguard Worker CCIfType<[i64], CCAssignToReg<[RAX]>> 196*9880d681SAndroid Build Coastguard Worker]>; 197*9880d681SAndroid Build Coastguard Worker 198*9880d681SAndroid Build Coastguard Workerdef RetCC_X86_64_Swift : CallingConv<[ 199*9880d681SAndroid Build Coastguard Worker // For integers, ECX, R8D can be used as extra return registers. 200*9880d681SAndroid Build Coastguard Worker CCIfType<[i1], CCPromoteToType<i8>>, 201*9880d681SAndroid Build Coastguard Worker CCIfType<[i8] , CCAssignToReg<[AL, DL, CL, R8B]>>, 202*9880d681SAndroid Build Coastguard Worker CCIfType<[i16], CCAssignToReg<[AX, DX, CX, R8W]>>, 203*9880d681SAndroid Build Coastguard Worker CCIfType<[i32], CCAssignToReg<[EAX, EDX, ECX, R8D]>>, 204*9880d681SAndroid Build Coastguard Worker CCIfType<[i64], CCAssignToReg<[RAX, RDX, RCX, R8]>>, 205*9880d681SAndroid Build Coastguard Worker 206*9880d681SAndroid Build Coastguard Worker // XMM0, XMM1, XMM2 and XMM3 can be used to return FP values. 207*9880d681SAndroid Build Coastguard Worker CCIfType<[f32], CCAssignToReg<[XMM0, XMM1, XMM2, XMM3]>>, 208*9880d681SAndroid Build Coastguard Worker CCIfType<[f64], CCAssignToReg<[XMM0, XMM1, XMM2, XMM3]>>, 209*9880d681SAndroid Build Coastguard Worker CCIfType<[f128], CCAssignToReg<[XMM0, XMM1, XMM2, XMM3]>>, 210*9880d681SAndroid Build Coastguard Worker 211*9880d681SAndroid Build Coastguard Worker // MMX vector types are returned in XMM0, XMM1, XMM2 and XMM3. 212*9880d681SAndroid Build Coastguard Worker CCIfType<[x86mmx], CCAssignToReg<[XMM0, XMM1, XMM2, XMM3]>>, 213*9880d681SAndroid Build Coastguard Worker CCDelegateTo<RetCC_X86Common> 214*9880d681SAndroid Build Coastguard Worker]>; 215*9880d681SAndroid Build Coastguard Worker 216*9880d681SAndroid Build Coastguard Worker// X86-64 AnyReg return-value convention. No explicit register is specified for 217*9880d681SAndroid Build Coastguard Worker// the return-value. The register allocator is allowed and expected to choose 218*9880d681SAndroid Build Coastguard Worker// any free register. 219*9880d681SAndroid Build Coastguard Worker// 220*9880d681SAndroid Build Coastguard Worker// This calling convention is currently only supported by the stackmap and 221*9880d681SAndroid Build Coastguard Worker// patchpoint intrinsics. All other uses will result in an assert on Debug 222*9880d681SAndroid Build Coastguard Worker// builds. On Release builds we fallback to the X86 C calling convention. 223*9880d681SAndroid Build Coastguard Workerdef RetCC_X86_64_AnyReg : CallingConv<[ 224*9880d681SAndroid Build Coastguard Worker CCCustom<"CC_X86_AnyReg_Error"> 225*9880d681SAndroid Build Coastguard Worker]>; 226*9880d681SAndroid Build Coastguard Worker 227*9880d681SAndroid Build Coastguard Worker// X86-64 HHVM return-value convention. 228*9880d681SAndroid Build Coastguard Workerdef RetCC_X86_64_HHVM: CallingConv<[ 229*9880d681SAndroid Build Coastguard Worker // Promote all types to i64 230*9880d681SAndroid Build Coastguard Worker CCIfType<[i8, i16, i32], CCPromoteToType<i64>>, 231*9880d681SAndroid Build Coastguard Worker 232*9880d681SAndroid Build Coastguard Worker // Return: could return in any GP register save RSP and R12. 233*9880d681SAndroid Build Coastguard Worker CCIfType<[i64], CCAssignToReg<[RBX, RBP, RDI, RSI, RDX, RCX, R8, R9, 234*9880d681SAndroid Build Coastguard Worker RAX, R10, R11, R13, R14, R15]>> 235*9880d681SAndroid Build Coastguard Worker]>; 236*9880d681SAndroid Build Coastguard Worker 237*9880d681SAndroid Build Coastguard Worker// This is the root return-value convention for the X86-32 backend. 238*9880d681SAndroid Build Coastguard Workerdef RetCC_X86_32 : CallingConv<[ 239*9880d681SAndroid Build Coastguard Worker // If FastCC, use RetCC_X86_32_Fast. 240*9880d681SAndroid Build Coastguard Worker CCIfCC<"CallingConv::Fast", CCDelegateTo<RetCC_X86_32_Fast>>, 241*9880d681SAndroid Build Coastguard Worker // If HiPE, use RetCC_X86_32_HiPE. 242*9880d681SAndroid Build Coastguard Worker CCIfCC<"CallingConv::HiPE", CCDelegateTo<RetCC_X86_32_HiPE>>, 243*9880d681SAndroid Build Coastguard Worker CCIfCC<"CallingConv::X86_VectorCall", CCDelegateTo<RetCC_X86_32_VectorCall>>, 244*9880d681SAndroid Build Coastguard Worker 245*9880d681SAndroid Build Coastguard Worker // Otherwise, use RetCC_X86_32_C. 246*9880d681SAndroid Build Coastguard Worker CCDelegateTo<RetCC_X86_32_C> 247*9880d681SAndroid Build Coastguard Worker]>; 248*9880d681SAndroid Build Coastguard Worker 249*9880d681SAndroid Build Coastguard Worker// This is the root return-value convention for the X86-64 backend. 250*9880d681SAndroid Build Coastguard Workerdef RetCC_X86_64 : CallingConv<[ 251*9880d681SAndroid Build Coastguard Worker // HiPE uses RetCC_X86_64_HiPE 252*9880d681SAndroid Build Coastguard Worker CCIfCC<"CallingConv::HiPE", CCDelegateTo<RetCC_X86_64_HiPE>>, 253*9880d681SAndroid Build Coastguard Worker 254*9880d681SAndroid Build Coastguard Worker // Handle JavaScript calls. 255*9880d681SAndroid Build Coastguard Worker CCIfCC<"CallingConv::WebKit_JS", CCDelegateTo<RetCC_X86_64_WebKit_JS>>, 256*9880d681SAndroid Build Coastguard Worker CCIfCC<"CallingConv::AnyReg", CCDelegateTo<RetCC_X86_64_AnyReg>>, 257*9880d681SAndroid Build Coastguard Worker 258*9880d681SAndroid Build Coastguard Worker // Handle Swift calls. 259*9880d681SAndroid Build Coastguard Worker CCIfCC<"CallingConv::Swift", CCDelegateTo<RetCC_X86_64_Swift>>, 260*9880d681SAndroid Build Coastguard Worker 261*9880d681SAndroid Build Coastguard Worker // Handle explicit CC selection 262*9880d681SAndroid Build Coastguard Worker CCIfCC<"CallingConv::X86_64_Win64", CCDelegateTo<RetCC_X86_Win64_C>>, 263*9880d681SAndroid Build Coastguard Worker CCIfCC<"CallingConv::X86_64_SysV", CCDelegateTo<RetCC_X86_64_C>>, 264*9880d681SAndroid Build Coastguard Worker 265*9880d681SAndroid Build Coastguard Worker // Handle HHVM calls. 266*9880d681SAndroid Build Coastguard Worker CCIfCC<"CallingConv::HHVM", CCDelegateTo<RetCC_X86_64_HHVM>>, 267*9880d681SAndroid Build Coastguard Worker 268*9880d681SAndroid Build Coastguard Worker // Mingw64 and native Win64 use Win64 CC 269*9880d681SAndroid Build Coastguard Worker CCIfSubtarget<"isTargetWin64()", CCDelegateTo<RetCC_X86_Win64_C>>, 270*9880d681SAndroid Build Coastguard Worker 271*9880d681SAndroid Build Coastguard Worker // Otherwise, drop to normal X86-64 CC 272*9880d681SAndroid Build Coastguard Worker CCDelegateTo<RetCC_X86_64_C> 273*9880d681SAndroid Build Coastguard Worker]>; 274*9880d681SAndroid Build Coastguard Worker 275*9880d681SAndroid Build Coastguard Worker// This is the return-value convention used for the entire X86 backend. 276*9880d681SAndroid Build Coastguard Workerdef RetCC_X86 : CallingConv<[ 277*9880d681SAndroid Build Coastguard Worker 278*9880d681SAndroid Build Coastguard Worker // Check if this is the Intel OpenCL built-ins calling convention 279*9880d681SAndroid Build Coastguard Worker CCIfCC<"CallingConv::Intel_OCL_BI", CCDelegateTo<RetCC_Intel_OCL_BI>>, 280*9880d681SAndroid Build Coastguard Worker 281*9880d681SAndroid Build Coastguard Worker CCIfSubtarget<"is64Bit()", CCDelegateTo<RetCC_X86_64>>, 282*9880d681SAndroid Build Coastguard Worker CCDelegateTo<RetCC_X86_32> 283*9880d681SAndroid Build Coastguard Worker]>; 284*9880d681SAndroid Build Coastguard Worker 285*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 286*9880d681SAndroid Build Coastguard Worker// X86-64 Argument Calling Conventions 287*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 288*9880d681SAndroid Build Coastguard Worker 289*9880d681SAndroid Build Coastguard Workerdef CC_X86_64_C : CallingConv<[ 290*9880d681SAndroid Build Coastguard Worker // Handles byval parameters. 291*9880d681SAndroid Build Coastguard Worker CCIfByVal<CCPassByVal<8, 8>>, 292*9880d681SAndroid Build Coastguard Worker 293*9880d681SAndroid Build Coastguard Worker // Promote i1/i8/i16 arguments to i32. 294*9880d681SAndroid Build Coastguard Worker CCIfType<[i1, i8, i16], CCPromoteToType<i32>>, 295*9880d681SAndroid Build Coastguard Worker 296*9880d681SAndroid Build Coastguard Worker // The 'nest' parameter, if any, is passed in R10. 297*9880d681SAndroid Build Coastguard Worker CCIfNest<CCIfSubtarget<"isTarget64BitILP32()", CCAssignToReg<[R10D]>>>, 298*9880d681SAndroid Build Coastguard Worker CCIfNest<CCAssignToReg<[R10]>>, 299*9880d681SAndroid Build Coastguard Worker 300*9880d681SAndroid Build Coastguard Worker // Pass SwiftSelf in a callee saved register. 301*9880d681SAndroid Build Coastguard Worker CCIfSwiftSelf<CCIfType<[i64], CCAssignToReg<[R13]>>>, 302*9880d681SAndroid Build Coastguard Worker 303*9880d681SAndroid Build Coastguard Worker // A SwiftError is passed in R12. 304*9880d681SAndroid Build Coastguard Worker CCIfSwiftError<CCIfType<[i64], CCAssignToReg<[R12]>>>, 305*9880d681SAndroid Build Coastguard Worker 306*9880d681SAndroid Build Coastguard Worker // For Swift Calling Convention, pass sret in %RAX. 307*9880d681SAndroid Build Coastguard Worker CCIfCC<"CallingConv::Swift", 308*9880d681SAndroid Build Coastguard Worker CCIfSRet<CCIfType<[i64], CCAssignToReg<[RAX]>>>>, 309*9880d681SAndroid Build Coastguard Worker 310*9880d681SAndroid Build Coastguard Worker // The first 6 integer arguments are passed in integer registers. 311*9880d681SAndroid Build Coastguard Worker CCIfType<[i32], CCAssignToReg<[EDI, ESI, EDX, ECX, R8D, R9D]>>, 312*9880d681SAndroid Build Coastguard Worker CCIfType<[i64], CCAssignToReg<[RDI, RSI, RDX, RCX, R8 , R9 ]>>, 313*9880d681SAndroid Build Coastguard Worker 314*9880d681SAndroid Build Coastguard Worker // The first 8 MMX vector arguments are passed in XMM registers on Darwin. 315*9880d681SAndroid Build Coastguard Worker CCIfType<[x86mmx], 316*9880d681SAndroid Build Coastguard Worker CCIfSubtarget<"isTargetDarwin()", 317*9880d681SAndroid Build Coastguard Worker CCIfSubtarget<"hasSSE2()", 318*9880d681SAndroid Build Coastguard Worker CCPromoteToType<v2i64>>>>, 319*9880d681SAndroid Build Coastguard Worker 320*9880d681SAndroid Build Coastguard Worker // Boolean vectors of AVX-512 are passed in SIMD registers. 321*9880d681SAndroid Build Coastguard Worker // The call from AVX to AVX-512 function should work, 322*9880d681SAndroid Build Coastguard Worker // since the boolean types in AVX/AVX2 are promoted by default. 323*9880d681SAndroid Build Coastguard Worker CCIfType<[v2i1], CCPromoteToType<v2i64>>, 324*9880d681SAndroid Build Coastguard Worker CCIfType<[v4i1], CCPromoteToType<v4i32>>, 325*9880d681SAndroid Build Coastguard Worker CCIfType<[v8i1], CCPromoteToType<v8i16>>, 326*9880d681SAndroid Build Coastguard Worker CCIfType<[v16i1], CCPromoteToType<v16i8>>, 327*9880d681SAndroid Build Coastguard Worker CCIfType<[v32i1], CCPromoteToType<v32i8>>, 328*9880d681SAndroid Build Coastguard Worker CCIfType<[v64i1], CCPromoteToType<v64i8>>, 329*9880d681SAndroid Build Coastguard Worker 330*9880d681SAndroid Build Coastguard Worker // The first 8 FP/Vector arguments are passed in XMM registers. 331*9880d681SAndroid Build Coastguard Worker CCIfType<[f32, f64, f128, v16i8, v8i16, v4i32, v2i64, v4f32, v2f64], 332*9880d681SAndroid Build Coastguard Worker CCIfSubtarget<"hasSSE1()", 333*9880d681SAndroid Build Coastguard Worker CCAssignToReg<[XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6, XMM7]>>>, 334*9880d681SAndroid Build Coastguard Worker 335*9880d681SAndroid Build Coastguard Worker // The first 8 256-bit vector arguments are passed in YMM registers, unless 336*9880d681SAndroid Build Coastguard Worker // this is a vararg function. 337*9880d681SAndroid Build Coastguard Worker // FIXME: This isn't precisely correct; the x86-64 ABI document says that 338*9880d681SAndroid Build Coastguard Worker // fixed arguments to vararg functions are supposed to be passed in 339*9880d681SAndroid Build Coastguard Worker // registers. Actually modeling that would be a lot of work, though. 340*9880d681SAndroid Build Coastguard Worker CCIfNotVarArg<CCIfType<[v32i8, v16i16, v8i32, v4i64, v8f32, v4f64], 341*9880d681SAndroid Build Coastguard Worker CCIfSubtarget<"hasFp256()", 342*9880d681SAndroid Build Coastguard Worker CCAssignToReg<[YMM0, YMM1, YMM2, YMM3, 343*9880d681SAndroid Build Coastguard Worker YMM4, YMM5, YMM6, YMM7]>>>>, 344*9880d681SAndroid Build Coastguard Worker 345*9880d681SAndroid Build Coastguard Worker // The first 8 512-bit vector arguments are passed in ZMM registers. 346*9880d681SAndroid Build Coastguard Worker CCIfNotVarArg<CCIfType<[v64i8, v32i16, v16i32, v8i64, v16f32, v8f64], 347*9880d681SAndroid Build Coastguard Worker CCIfSubtarget<"hasAVX512()", 348*9880d681SAndroid Build Coastguard Worker CCAssignToReg<[ZMM0, ZMM1, ZMM2, ZMM3, ZMM4, ZMM5, ZMM6, ZMM7]>>>>, 349*9880d681SAndroid Build Coastguard Worker 350*9880d681SAndroid Build Coastguard Worker // Integer/FP values get stored in stack slots that are 8 bytes in size and 351*9880d681SAndroid Build Coastguard Worker // 8-byte aligned if there are no more registers to hold them. 352*9880d681SAndroid Build Coastguard Worker CCIfType<[i32, i64, f32, f64], CCAssignToStack<8, 8>>, 353*9880d681SAndroid Build Coastguard Worker 354*9880d681SAndroid Build Coastguard Worker // Long doubles get stack slots whose size and alignment depends on the 355*9880d681SAndroid Build Coastguard Worker // subtarget. 356*9880d681SAndroid Build Coastguard Worker CCIfType<[f80, f128], CCAssignToStack<0, 0>>, 357*9880d681SAndroid Build Coastguard Worker 358*9880d681SAndroid Build Coastguard Worker // Vectors get 16-byte stack slots that are 16-byte aligned. 359*9880d681SAndroid Build Coastguard Worker CCIfType<[v16i8, v8i16, v4i32, v2i64, v4f32, v2f64], CCAssignToStack<16, 16>>, 360*9880d681SAndroid Build Coastguard Worker 361*9880d681SAndroid Build Coastguard Worker // 256-bit vectors get 32-byte stack slots that are 32-byte aligned. 362*9880d681SAndroid Build Coastguard Worker CCIfType<[v32i8, v16i16, v8i32, v4i64, v8f32, v4f64], 363*9880d681SAndroid Build Coastguard Worker CCAssignToStack<32, 32>>, 364*9880d681SAndroid Build Coastguard Worker 365*9880d681SAndroid Build Coastguard Worker // 512-bit vectors get 64-byte stack slots that are 64-byte aligned. 366*9880d681SAndroid Build Coastguard Worker CCIfType<[v16i32, v8i64, v16f32, v8f64], 367*9880d681SAndroid Build Coastguard Worker CCAssignToStack<64, 64>> 368*9880d681SAndroid Build Coastguard Worker]>; 369*9880d681SAndroid Build Coastguard Worker 370*9880d681SAndroid Build Coastguard Worker// Calling convention for X86-64 HHVM. 371*9880d681SAndroid Build Coastguard Workerdef CC_X86_64_HHVM : CallingConv<[ 372*9880d681SAndroid Build Coastguard Worker // Use all/any GP registers for args, except RSP. 373*9880d681SAndroid Build Coastguard Worker CCIfType<[i64], CCAssignToReg<[RBX, R12, RBP, R15, 374*9880d681SAndroid Build Coastguard Worker RDI, RSI, RDX, RCX, R8, R9, 375*9880d681SAndroid Build Coastguard Worker RAX, R10, R11, R13, R14]>> 376*9880d681SAndroid Build Coastguard Worker]>; 377*9880d681SAndroid Build Coastguard Worker 378*9880d681SAndroid Build Coastguard Worker// Calling convention for helper functions in HHVM. 379*9880d681SAndroid Build Coastguard Workerdef CC_X86_64_HHVM_C : CallingConv<[ 380*9880d681SAndroid Build Coastguard Worker // Pass the first argument in RBP. 381*9880d681SAndroid Build Coastguard Worker CCIfType<[i64], CCAssignToReg<[RBP]>>, 382*9880d681SAndroid Build Coastguard Worker 383*9880d681SAndroid Build Coastguard Worker // Otherwise it's the same as the regular C calling convention. 384*9880d681SAndroid Build Coastguard Worker CCDelegateTo<CC_X86_64_C> 385*9880d681SAndroid Build Coastguard Worker]>; 386*9880d681SAndroid Build Coastguard Worker 387*9880d681SAndroid Build Coastguard Worker// Calling convention used on Win64 388*9880d681SAndroid Build Coastguard Workerdef CC_X86_Win64_C : CallingConv<[ 389*9880d681SAndroid Build Coastguard Worker // FIXME: Handle byval stuff. 390*9880d681SAndroid Build Coastguard Worker // FIXME: Handle varargs. 391*9880d681SAndroid Build Coastguard Worker 392*9880d681SAndroid Build Coastguard Worker // Promote i1/i8/i16 arguments to i32. 393*9880d681SAndroid Build Coastguard Worker CCIfType<[i1, i8, i16], CCPromoteToType<i32>>, 394*9880d681SAndroid Build Coastguard Worker 395*9880d681SAndroid Build Coastguard Worker // The 'nest' parameter, if any, is passed in R10. 396*9880d681SAndroid Build Coastguard Worker CCIfNest<CCAssignToReg<[R10]>>, 397*9880d681SAndroid Build Coastguard Worker 398*9880d681SAndroid Build Coastguard Worker // 128 bit vectors are passed by pointer 399*9880d681SAndroid Build Coastguard Worker CCIfType<[v16i8, v8i16, v4i32, v2i64, v4f32, v2f64], CCPassIndirect<i64>>, 400*9880d681SAndroid Build Coastguard Worker 401*9880d681SAndroid Build Coastguard Worker 402*9880d681SAndroid Build Coastguard Worker // 256 bit vectors are passed by pointer 403*9880d681SAndroid Build Coastguard Worker CCIfType<[v32i8, v16i16, v8i32, v4i64, v8f32, v4f64], CCPassIndirect<i64>>, 404*9880d681SAndroid Build Coastguard Worker 405*9880d681SAndroid Build Coastguard Worker // 512 bit vectors are passed by pointer 406*9880d681SAndroid Build Coastguard Worker CCIfType<[v16i32, v16f32, v8f64, v8i64], CCPassIndirect<i64>>, 407*9880d681SAndroid Build Coastguard Worker 408*9880d681SAndroid Build Coastguard Worker // The first 4 MMX vector arguments are passed in GPRs. 409*9880d681SAndroid Build Coastguard Worker CCIfType<[x86mmx], CCBitConvertToType<i64>>, 410*9880d681SAndroid Build Coastguard Worker 411*9880d681SAndroid Build Coastguard Worker // The first 4 integer arguments are passed in integer registers. 412*9880d681SAndroid Build Coastguard Worker CCIfType<[i32], CCAssignToRegWithShadow<[ECX , EDX , R8D , R9D ], 413*9880d681SAndroid Build Coastguard Worker [XMM0, XMM1, XMM2, XMM3]>>, 414*9880d681SAndroid Build Coastguard Worker 415*9880d681SAndroid Build Coastguard Worker // Do not pass the sret argument in RCX, the Win64 thiscall calling 416*9880d681SAndroid Build Coastguard Worker // convention requires "this" to be passed in RCX. 417*9880d681SAndroid Build Coastguard Worker CCIfCC<"CallingConv::X86_ThisCall", 418*9880d681SAndroid Build Coastguard Worker CCIfSRet<CCIfType<[i64], CCAssignToRegWithShadow<[RDX , R8 , R9 ], 419*9880d681SAndroid Build Coastguard Worker [XMM1, XMM2, XMM3]>>>>, 420*9880d681SAndroid Build Coastguard Worker 421*9880d681SAndroid Build Coastguard Worker CCIfType<[i64], CCAssignToRegWithShadow<[RCX , RDX , R8 , R9 ], 422*9880d681SAndroid Build Coastguard Worker [XMM0, XMM1, XMM2, XMM3]>>, 423*9880d681SAndroid Build Coastguard Worker 424*9880d681SAndroid Build Coastguard Worker // The first 4 FP/Vector arguments are passed in XMM registers. 425*9880d681SAndroid Build Coastguard Worker CCIfType<[f32, f64, v16i8, v8i16, v4i32, v2i64, v4f32, v2f64], 426*9880d681SAndroid Build Coastguard Worker CCAssignToRegWithShadow<[XMM0, XMM1, XMM2, XMM3], 427*9880d681SAndroid Build Coastguard Worker [RCX , RDX , R8 , R9 ]>>, 428*9880d681SAndroid Build Coastguard Worker 429*9880d681SAndroid Build Coastguard Worker // Integer/FP values get stored in stack slots that are 8 bytes in size and 430*9880d681SAndroid Build Coastguard Worker // 8-byte aligned if there are no more registers to hold them. 431*9880d681SAndroid Build Coastguard Worker CCIfType<[i32, i64, f32, f64], CCAssignToStack<8, 8>>, 432*9880d681SAndroid Build Coastguard Worker 433*9880d681SAndroid Build Coastguard Worker // Long doubles get stack slots whose size and alignment depends on the 434*9880d681SAndroid Build Coastguard Worker // subtarget. 435*9880d681SAndroid Build Coastguard Worker CCIfType<[f80], CCAssignToStack<0, 0>> 436*9880d681SAndroid Build Coastguard Worker]>; 437*9880d681SAndroid Build Coastguard Worker 438*9880d681SAndroid Build Coastguard Workerdef CC_X86_Win64_VectorCall : CallingConv<[ 439*9880d681SAndroid Build Coastguard Worker // The first 6 floating point and vector types of 128 bits or less use 440*9880d681SAndroid Build Coastguard Worker // XMM0-XMM5. 441*9880d681SAndroid Build Coastguard Worker CCIfType<[f32, f64, v16i8, v8i16, v4i32, v2i64, v4f32, v2f64], 442*9880d681SAndroid Build Coastguard Worker CCAssignToReg<[XMM0, XMM1, XMM2, XMM3, XMM4, XMM5]>>, 443*9880d681SAndroid Build Coastguard Worker 444*9880d681SAndroid Build Coastguard Worker // 256-bit vectors use YMM registers. 445*9880d681SAndroid Build Coastguard Worker CCIfType<[v32i8, v16i16, v8i32, v4i64, v8f32, v4f64], 446*9880d681SAndroid Build Coastguard Worker CCAssignToReg<[YMM0, YMM1, YMM2, YMM3, YMM4, YMM5]>>, 447*9880d681SAndroid Build Coastguard Worker 448*9880d681SAndroid Build Coastguard Worker // 512-bit vectors use ZMM registers. 449*9880d681SAndroid Build Coastguard Worker CCIfType<[v64i8, v32i16, v16i32, v8i64, v16f32, v8f64], 450*9880d681SAndroid Build Coastguard Worker CCAssignToReg<[ZMM0, ZMM1, ZMM2, ZMM3, ZMM4, ZMM5]>>, 451*9880d681SAndroid Build Coastguard Worker 452*9880d681SAndroid Build Coastguard Worker // Delegate to fastcall to handle integer types. 453*9880d681SAndroid Build Coastguard Worker CCDelegateTo<CC_X86_Win64_C> 454*9880d681SAndroid Build Coastguard Worker]>; 455*9880d681SAndroid Build Coastguard Worker 456*9880d681SAndroid Build Coastguard Worker 457*9880d681SAndroid Build Coastguard Workerdef CC_X86_64_GHC : CallingConv<[ 458*9880d681SAndroid Build Coastguard Worker // Promote i8/i16/i32 arguments to i64. 459*9880d681SAndroid Build Coastguard Worker CCIfType<[i8, i16, i32], CCPromoteToType<i64>>, 460*9880d681SAndroid Build Coastguard Worker 461*9880d681SAndroid Build Coastguard Worker // Pass in STG registers: Base, Sp, Hp, R1, R2, R3, R4, R5, R6, SpLim 462*9880d681SAndroid Build Coastguard Worker CCIfType<[i64], 463*9880d681SAndroid Build Coastguard Worker CCAssignToReg<[R13, RBP, R12, RBX, R14, RSI, RDI, R8, R9, R15]>>, 464*9880d681SAndroid Build Coastguard Worker 465*9880d681SAndroid Build Coastguard Worker // Pass in STG registers: F1, F2, F3, F4, D1, D2 466*9880d681SAndroid Build Coastguard Worker CCIfType<[f32, f64, v16i8, v8i16, v4i32, v2i64, v4f32, v2f64], 467*9880d681SAndroid Build Coastguard Worker CCIfSubtarget<"hasSSE1()", 468*9880d681SAndroid Build Coastguard Worker CCAssignToReg<[XMM1, XMM2, XMM3, XMM4, XMM5, XMM6]>>> 469*9880d681SAndroid Build Coastguard Worker]>; 470*9880d681SAndroid Build Coastguard Worker 471*9880d681SAndroid Build Coastguard Workerdef CC_X86_64_HiPE : CallingConv<[ 472*9880d681SAndroid Build Coastguard Worker // Promote i8/i16/i32 arguments to i64. 473*9880d681SAndroid Build Coastguard Worker CCIfType<[i8, i16, i32], CCPromoteToType<i64>>, 474*9880d681SAndroid Build Coastguard Worker 475*9880d681SAndroid Build Coastguard Worker // Pass in VM's registers: HP, P, ARG0, ARG1, ARG2, ARG3 476*9880d681SAndroid Build Coastguard Worker CCIfType<[i64], CCAssignToReg<[R15, RBP, RSI, RDX, RCX, R8]>>, 477*9880d681SAndroid Build Coastguard Worker 478*9880d681SAndroid Build Coastguard Worker // Integer/FP values get stored in stack slots that are 8 bytes in size and 479*9880d681SAndroid Build Coastguard Worker // 8-byte aligned if there are no more registers to hold them. 480*9880d681SAndroid Build Coastguard Worker CCIfType<[i32, i64, f32, f64], CCAssignToStack<8, 8>> 481*9880d681SAndroid Build Coastguard Worker]>; 482*9880d681SAndroid Build Coastguard Worker 483*9880d681SAndroid Build Coastguard Workerdef CC_X86_64_WebKit_JS : CallingConv<[ 484*9880d681SAndroid Build Coastguard Worker // Promote i8/i16 arguments to i32. 485*9880d681SAndroid Build Coastguard Worker CCIfType<[i8, i16], CCPromoteToType<i32>>, 486*9880d681SAndroid Build Coastguard Worker 487*9880d681SAndroid Build Coastguard Worker // Only the first integer argument is passed in register. 488*9880d681SAndroid Build Coastguard Worker CCIfType<[i32], CCAssignToReg<[EAX]>>, 489*9880d681SAndroid Build Coastguard Worker CCIfType<[i64], CCAssignToReg<[RAX]>>, 490*9880d681SAndroid Build Coastguard Worker 491*9880d681SAndroid Build Coastguard Worker // The remaining integer arguments are passed on the stack. 32bit integer and 492*9880d681SAndroid Build Coastguard Worker // floating-point arguments are aligned to 4 byte and stored in 4 byte slots. 493*9880d681SAndroid Build Coastguard Worker // 64bit integer and floating-point arguments are aligned to 8 byte and stored 494*9880d681SAndroid Build Coastguard Worker // in 8 byte stack slots. 495*9880d681SAndroid Build Coastguard Worker CCIfType<[i32, f32], CCAssignToStack<4, 4>>, 496*9880d681SAndroid Build Coastguard Worker CCIfType<[i64, f64], CCAssignToStack<8, 8>> 497*9880d681SAndroid Build Coastguard Worker]>; 498*9880d681SAndroid Build Coastguard Worker 499*9880d681SAndroid Build Coastguard Worker// No explicit register is specified for the AnyReg calling convention. The 500*9880d681SAndroid Build Coastguard Worker// register allocator may assign the arguments to any free register. 501*9880d681SAndroid Build Coastguard Worker// 502*9880d681SAndroid Build Coastguard Worker// This calling convention is currently only supported by the stackmap and 503*9880d681SAndroid Build Coastguard Worker// patchpoint intrinsics. All other uses will result in an assert on Debug 504*9880d681SAndroid Build Coastguard Worker// builds. On Release builds we fallback to the X86 C calling convention. 505*9880d681SAndroid Build Coastguard Workerdef CC_X86_64_AnyReg : CallingConv<[ 506*9880d681SAndroid Build Coastguard Worker CCCustom<"CC_X86_AnyReg_Error"> 507*9880d681SAndroid Build Coastguard Worker]>; 508*9880d681SAndroid Build Coastguard Worker 509*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 510*9880d681SAndroid Build Coastguard Worker// X86 C Calling Convention 511*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 512*9880d681SAndroid Build Coastguard Worker 513*9880d681SAndroid Build Coastguard Worker/// CC_X86_32_Vector_Common - In all X86-32 calling conventions, extra vector 514*9880d681SAndroid Build Coastguard Worker/// values are spilled on the stack. 515*9880d681SAndroid Build Coastguard Workerdef CC_X86_32_Vector_Common : CallingConv<[ 516*9880d681SAndroid Build Coastguard Worker // Other SSE vectors get 16-byte stack slots that are 16-byte aligned. 517*9880d681SAndroid Build Coastguard Worker CCIfType<[v16i8, v8i16, v4i32, v2i64, v4f32, v2f64], CCAssignToStack<16, 16>>, 518*9880d681SAndroid Build Coastguard Worker 519*9880d681SAndroid Build Coastguard Worker // 256-bit AVX vectors get 32-byte stack slots that are 32-byte aligned. 520*9880d681SAndroid Build Coastguard Worker CCIfType<[v32i8, v16i16, v8i32, v4i64, v8f32, v4f64], 521*9880d681SAndroid Build Coastguard Worker CCAssignToStack<32, 32>>, 522*9880d681SAndroid Build Coastguard Worker 523*9880d681SAndroid Build Coastguard Worker // 512-bit AVX 512-bit vectors get 64-byte stack slots that are 64-byte aligned. 524*9880d681SAndroid Build Coastguard Worker CCIfType<[v64i8, v32i16, v16i32, v8i64, v16f32, v8f64], 525*9880d681SAndroid Build Coastguard Worker CCAssignToStack<64, 64>> 526*9880d681SAndroid Build Coastguard Worker]>; 527*9880d681SAndroid Build Coastguard Worker 528*9880d681SAndroid Build Coastguard Worker// CC_X86_32_Vector_Standard - The first 3 vector arguments are passed in 529*9880d681SAndroid Build Coastguard Worker// vector registers 530*9880d681SAndroid Build Coastguard Workerdef CC_X86_32_Vector_Standard : CallingConv<[ 531*9880d681SAndroid Build Coastguard Worker // SSE vector arguments are passed in XMM registers. 532*9880d681SAndroid Build Coastguard Worker CCIfNotVarArg<CCIfType<[v16i8, v8i16, v4i32, v2i64, v4f32, v2f64], 533*9880d681SAndroid Build Coastguard Worker CCAssignToReg<[XMM0, XMM1, XMM2]>>>, 534*9880d681SAndroid Build Coastguard Worker 535*9880d681SAndroid Build Coastguard Worker // AVX 256-bit vector arguments are passed in YMM registers. 536*9880d681SAndroid Build Coastguard Worker CCIfNotVarArg<CCIfType<[v32i8, v16i16, v8i32, v4i64, v8f32, v4f64], 537*9880d681SAndroid Build Coastguard Worker CCIfSubtarget<"hasFp256()", 538*9880d681SAndroid Build Coastguard Worker CCAssignToReg<[YMM0, YMM1, YMM2]>>>>, 539*9880d681SAndroid Build Coastguard Worker 540*9880d681SAndroid Build Coastguard Worker // AVX 512-bit vector arguments are passed in ZMM registers. 541*9880d681SAndroid Build Coastguard Worker CCIfNotVarArg<CCIfType<[v64i8, v32i16, v16i32, v8i64, v16f32, v8f64], 542*9880d681SAndroid Build Coastguard Worker CCAssignToReg<[ZMM0, ZMM1, ZMM2]>>>, 543*9880d681SAndroid Build Coastguard Worker 544*9880d681SAndroid Build Coastguard Worker CCDelegateTo<CC_X86_32_Vector_Common> 545*9880d681SAndroid Build Coastguard Worker]>; 546*9880d681SAndroid Build Coastguard Worker 547*9880d681SAndroid Build Coastguard Worker// CC_X86_32_Vector_Darwin - The first 4 vector arguments are passed in 548*9880d681SAndroid Build Coastguard Worker// vector registers. 549*9880d681SAndroid Build Coastguard Workerdef CC_X86_32_Vector_Darwin : CallingConv<[ 550*9880d681SAndroid Build Coastguard Worker // SSE vector arguments are passed in XMM registers. 551*9880d681SAndroid Build Coastguard Worker CCIfNotVarArg<CCIfType<[v16i8, v8i16, v4i32, v2i64, v4f32, v2f64], 552*9880d681SAndroid Build Coastguard Worker CCAssignToReg<[XMM0, XMM1, XMM2, XMM3]>>>, 553*9880d681SAndroid Build Coastguard Worker 554*9880d681SAndroid Build Coastguard Worker // AVX 256-bit vector arguments are passed in YMM registers. 555*9880d681SAndroid Build Coastguard Worker CCIfNotVarArg<CCIfType<[v32i8, v16i16, v8i32, v4i64, v8f32, v4f64], 556*9880d681SAndroid Build Coastguard Worker CCIfSubtarget<"hasFp256()", 557*9880d681SAndroid Build Coastguard Worker CCAssignToReg<[YMM0, YMM1, YMM2, YMM3]>>>>, 558*9880d681SAndroid Build Coastguard Worker 559*9880d681SAndroid Build Coastguard Worker // AVX 512-bit vector arguments are passed in ZMM registers. 560*9880d681SAndroid Build Coastguard Worker CCIfNotVarArg<CCIfType<[v64i8, v32i16, v16i32, v8i64, v16f32, v8f64], 561*9880d681SAndroid Build Coastguard Worker CCAssignToReg<[ZMM0, ZMM1, ZMM2, ZMM3]>>>, 562*9880d681SAndroid Build Coastguard Worker 563*9880d681SAndroid Build Coastguard Worker CCDelegateTo<CC_X86_32_Vector_Common> 564*9880d681SAndroid Build Coastguard Worker]>; 565*9880d681SAndroid Build Coastguard Worker 566*9880d681SAndroid Build Coastguard Worker/// CC_X86_32_Common - In all X86-32 calling conventions, extra integers and FP 567*9880d681SAndroid Build Coastguard Worker/// values are spilled on the stack. 568*9880d681SAndroid Build Coastguard Workerdef CC_X86_32_Common : CallingConv<[ 569*9880d681SAndroid Build Coastguard Worker // Handles byval parameters. 570*9880d681SAndroid Build Coastguard Worker CCIfByVal<CCPassByVal<4, 4>>, 571*9880d681SAndroid Build Coastguard Worker 572*9880d681SAndroid Build Coastguard Worker // The first 3 float or double arguments, if marked 'inreg' and if the call 573*9880d681SAndroid Build Coastguard Worker // is not a vararg call and if SSE2 is available, are passed in SSE registers. 574*9880d681SAndroid Build Coastguard Worker CCIfNotVarArg<CCIfInReg<CCIfType<[f32,f64], 575*9880d681SAndroid Build Coastguard Worker CCIfSubtarget<"hasSSE2()", 576*9880d681SAndroid Build Coastguard Worker CCAssignToReg<[XMM0,XMM1,XMM2]>>>>>, 577*9880d681SAndroid Build Coastguard Worker 578*9880d681SAndroid Build Coastguard Worker // The first 3 __m64 vector arguments are passed in mmx registers if the 579*9880d681SAndroid Build Coastguard Worker // call is not a vararg call. 580*9880d681SAndroid Build Coastguard Worker CCIfNotVarArg<CCIfType<[x86mmx], 581*9880d681SAndroid Build Coastguard Worker CCAssignToReg<[MM0, MM1, MM2]>>>, 582*9880d681SAndroid Build Coastguard Worker 583*9880d681SAndroid Build Coastguard Worker // Integer/Float values get stored in stack slots that are 4 bytes in 584*9880d681SAndroid Build Coastguard Worker // size and 4-byte aligned. 585*9880d681SAndroid Build Coastguard Worker CCIfType<[i32, f32], CCAssignToStack<4, 4>>, 586*9880d681SAndroid Build Coastguard Worker 587*9880d681SAndroid Build Coastguard Worker // Doubles get 8-byte slots that are 4-byte aligned. 588*9880d681SAndroid Build Coastguard Worker CCIfType<[f64], CCAssignToStack<8, 4>>, 589*9880d681SAndroid Build Coastguard Worker 590*9880d681SAndroid Build Coastguard Worker // Long doubles get slots whose size depends on the subtarget. 591*9880d681SAndroid Build Coastguard Worker CCIfType<[f80], CCAssignToStack<0, 4>>, 592*9880d681SAndroid Build Coastguard Worker 593*9880d681SAndroid Build Coastguard Worker // Boolean vectors of AVX-512 are passed in SIMD registers. 594*9880d681SAndroid Build Coastguard Worker // The call from AVX to AVX-512 function should work, 595*9880d681SAndroid Build Coastguard Worker // since the boolean types in AVX/AVX2 are promoted by default. 596*9880d681SAndroid Build Coastguard Worker CCIfType<[v2i1], CCPromoteToType<v2i64>>, 597*9880d681SAndroid Build Coastguard Worker CCIfType<[v4i1], CCPromoteToType<v4i32>>, 598*9880d681SAndroid Build Coastguard Worker CCIfType<[v8i1], CCPromoteToType<v8i16>>, 599*9880d681SAndroid Build Coastguard Worker CCIfType<[v16i1], CCPromoteToType<v16i8>>, 600*9880d681SAndroid Build Coastguard Worker CCIfType<[v32i1], CCPromoteToType<v32i8>>, 601*9880d681SAndroid Build Coastguard Worker CCIfType<[v64i1], CCPromoteToType<v64i8>>, 602*9880d681SAndroid Build Coastguard Worker 603*9880d681SAndroid Build Coastguard Worker // __m64 vectors get 8-byte stack slots that are 4-byte aligned. They are 604*9880d681SAndroid Build Coastguard Worker // passed in the parameter area. 605*9880d681SAndroid Build Coastguard Worker CCIfType<[x86mmx], CCAssignToStack<8, 4>>, 606*9880d681SAndroid Build Coastguard Worker 607*9880d681SAndroid Build Coastguard Worker // Darwin passes vectors in a form that differs from the i386 psABI 608*9880d681SAndroid Build Coastguard Worker CCIfSubtarget<"isTargetDarwin()", CCDelegateTo<CC_X86_32_Vector_Darwin>>, 609*9880d681SAndroid Build Coastguard Worker 610*9880d681SAndroid Build Coastguard Worker // Otherwise, drop to 'normal' X86-32 CC 611*9880d681SAndroid Build Coastguard Worker CCDelegateTo<CC_X86_32_Vector_Standard> 612*9880d681SAndroid Build Coastguard Worker]>; 613*9880d681SAndroid Build Coastguard Worker 614*9880d681SAndroid Build Coastguard Workerdef CC_X86_32_C : CallingConv<[ 615*9880d681SAndroid Build Coastguard Worker // Promote i1/i8/i16 arguments to i32. 616*9880d681SAndroid Build Coastguard Worker CCIfType<[i1, i8, i16], CCPromoteToType<i32>>, 617*9880d681SAndroid Build Coastguard Worker 618*9880d681SAndroid Build Coastguard Worker // The 'nest' parameter, if any, is passed in ECX. 619*9880d681SAndroid Build Coastguard Worker CCIfNest<CCAssignToReg<[ECX]>>, 620*9880d681SAndroid Build Coastguard Worker 621*9880d681SAndroid Build Coastguard Worker // The first 3 integer arguments, if marked 'inreg' and if the call is not 622*9880d681SAndroid Build Coastguard Worker // a vararg call, are passed in integer registers. 623*9880d681SAndroid Build Coastguard Worker CCIfNotVarArg<CCIfInReg<CCIfType<[i32], CCAssignToReg<[EAX, EDX, ECX]>>>>, 624*9880d681SAndroid Build Coastguard Worker 625*9880d681SAndroid Build Coastguard Worker // Otherwise, same as everything else. 626*9880d681SAndroid Build Coastguard Worker CCDelegateTo<CC_X86_32_Common> 627*9880d681SAndroid Build Coastguard Worker]>; 628*9880d681SAndroid Build Coastguard Worker 629*9880d681SAndroid Build Coastguard Workerdef CC_X86_32_MCU : CallingConv<[ 630*9880d681SAndroid Build Coastguard Worker // Handles byval parameters. Note that, like FastCC, we can't rely on 631*9880d681SAndroid Build Coastguard Worker // the delegation to CC_X86_32_Common because that happens after code that 632*9880d681SAndroid Build Coastguard Worker // puts arguments in registers. 633*9880d681SAndroid Build Coastguard Worker CCIfByVal<CCPassByVal<4, 4>>, 634*9880d681SAndroid Build Coastguard Worker 635*9880d681SAndroid Build Coastguard Worker // Promote i1/i8/i16 arguments to i32. 636*9880d681SAndroid Build Coastguard Worker CCIfType<[i1, i8, i16], CCPromoteToType<i32>>, 637*9880d681SAndroid Build Coastguard Worker 638*9880d681SAndroid Build Coastguard Worker // If the call is not a vararg call, some arguments may be passed 639*9880d681SAndroid Build Coastguard Worker // in integer registers. 640*9880d681SAndroid Build Coastguard Worker CCIfNotVarArg<CCIfType<[i32], CCCustom<"CC_X86_32_MCUInReg">>>, 641*9880d681SAndroid Build Coastguard Worker 642*9880d681SAndroid Build Coastguard Worker // Otherwise, same as everything else. 643*9880d681SAndroid Build Coastguard Worker CCDelegateTo<CC_X86_32_Common> 644*9880d681SAndroid Build Coastguard Worker]>; 645*9880d681SAndroid Build Coastguard Worker 646*9880d681SAndroid Build Coastguard Workerdef CC_X86_32_FastCall : CallingConv<[ 647*9880d681SAndroid Build Coastguard Worker // Promote i1/i8/i16 arguments to i32. 648*9880d681SAndroid Build Coastguard Worker CCIfType<[i1, i8, i16], CCPromoteToType<i32>>, 649*9880d681SAndroid Build Coastguard Worker 650*9880d681SAndroid Build Coastguard Worker // The 'nest' parameter, if any, is passed in EAX. 651*9880d681SAndroid Build Coastguard Worker CCIfNest<CCAssignToReg<[EAX]>>, 652*9880d681SAndroid Build Coastguard Worker 653*9880d681SAndroid Build Coastguard Worker // The first 2 integer arguments are passed in ECX/EDX 654*9880d681SAndroid Build Coastguard Worker CCIfInReg<CCIfType<[i32], CCAssignToReg<[ECX, EDX]>>>, 655*9880d681SAndroid Build Coastguard Worker 656*9880d681SAndroid Build Coastguard Worker // Otherwise, same as everything else. 657*9880d681SAndroid Build Coastguard Worker CCDelegateTo<CC_X86_32_Common> 658*9880d681SAndroid Build Coastguard Worker]>; 659*9880d681SAndroid Build Coastguard Worker 660*9880d681SAndroid Build Coastguard Workerdef CC_X86_32_VectorCall : CallingConv<[ 661*9880d681SAndroid Build Coastguard Worker // The first 6 floating point and vector types of 128 bits or less use 662*9880d681SAndroid Build Coastguard Worker // XMM0-XMM5. 663*9880d681SAndroid Build Coastguard Worker CCIfType<[f32, f64, v16i8, v8i16, v4i32, v2i64, v4f32, v2f64], 664*9880d681SAndroid Build Coastguard Worker CCAssignToReg<[XMM0, XMM1, XMM2, XMM3, XMM4, XMM5]>>, 665*9880d681SAndroid Build Coastguard Worker 666*9880d681SAndroid Build Coastguard Worker // 256-bit vectors use YMM registers. 667*9880d681SAndroid Build Coastguard Worker CCIfType<[v32i8, v16i16, v8i32, v4i64, v8f32, v4f64], 668*9880d681SAndroid Build Coastguard Worker CCAssignToReg<[YMM0, YMM1, YMM2, YMM3, YMM4, YMM5]>>, 669*9880d681SAndroid Build Coastguard Worker 670*9880d681SAndroid Build Coastguard Worker // 512-bit vectors use ZMM registers. 671*9880d681SAndroid Build Coastguard Worker CCIfType<[v64i8, v32i16, v16i32, v8i64, v16f32, v8f64], 672*9880d681SAndroid Build Coastguard Worker CCAssignToReg<[ZMM0, ZMM1, ZMM2, ZMM3, ZMM4, ZMM5]>>, 673*9880d681SAndroid Build Coastguard Worker 674*9880d681SAndroid Build Coastguard Worker // Otherwise, pass it indirectly. 675*9880d681SAndroid Build Coastguard Worker CCIfType<[v16i8, v8i16, v4i32, v2i64, v4f32, v2f64, 676*9880d681SAndroid Build Coastguard Worker v32i8, v16i16, v8i32, v4i64, v8f32, v4f64, 677*9880d681SAndroid Build Coastguard Worker v64i8, v32i16, v16i32, v8i64, v16f32, v8f64], 678*9880d681SAndroid Build Coastguard Worker CCCustom<"CC_X86_32_VectorCallIndirect">>, 679*9880d681SAndroid Build Coastguard Worker 680*9880d681SAndroid Build Coastguard Worker // Delegate to fastcall to handle integer types. 681*9880d681SAndroid Build Coastguard Worker CCDelegateTo<CC_X86_32_FastCall> 682*9880d681SAndroid Build Coastguard Worker]>; 683*9880d681SAndroid Build Coastguard Worker 684*9880d681SAndroid Build Coastguard Workerdef CC_X86_32_ThisCall_Common : CallingConv<[ 685*9880d681SAndroid Build Coastguard Worker // The first integer argument is passed in ECX 686*9880d681SAndroid Build Coastguard Worker CCIfType<[i32], CCAssignToReg<[ECX]>>, 687*9880d681SAndroid Build Coastguard Worker 688*9880d681SAndroid Build Coastguard Worker // Otherwise, same as everything else. 689*9880d681SAndroid Build Coastguard Worker CCDelegateTo<CC_X86_32_Common> 690*9880d681SAndroid Build Coastguard Worker]>; 691*9880d681SAndroid Build Coastguard Worker 692*9880d681SAndroid Build Coastguard Workerdef CC_X86_32_ThisCall_Mingw : CallingConv<[ 693*9880d681SAndroid Build Coastguard Worker // Promote i1/i8/i16 arguments to i32. 694*9880d681SAndroid Build Coastguard Worker CCIfType<[i1, i8, i16], CCPromoteToType<i32>>, 695*9880d681SAndroid Build Coastguard Worker 696*9880d681SAndroid Build Coastguard Worker CCDelegateTo<CC_X86_32_ThisCall_Common> 697*9880d681SAndroid Build Coastguard Worker]>; 698*9880d681SAndroid Build Coastguard Worker 699*9880d681SAndroid Build Coastguard Workerdef CC_X86_32_ThisCall_Win : CallingConv<[ 700*9880d681SAndroid Build Coastguard Worker // Promote i1/i8/i16 arguments to i32. 701*9880d681SAndroid Build Coastguard Worker CCIfType<[i1, i8, i16], CCPromoteToType<i32>>, 702*9880d681SAndroid Build Coastguard Worker 703*9880d681SAndroid Build Coastguard Worker // Pass sret arguments indirectly through stack. 704*9880d681SAndroid Build Coastguard Worker CCIfSRet<CCAssignToStack<4, 4>>, 705*9880d681SAndroid Build Coastguard Worker 706*9880d681SAndroid Build Coastguard Worker CCDelegateTo<CC_X86_32_ThisCall_Common> 707*9880d681SAndroid Build Coastguard Worker]>; 708*9880d681SAndroid Build Coastguard Worker 709*9880d681SAndroid Build Coastguard Workerdef CC_X86_32_ThisCall : CallingConv<[ 710*9880d681SAndroid Build Coastguard Worker CCIfSubtarget<"isTargetCygMing()", CCDelegateTo<CC_X86_32_ThisCall_Mingw>>, 711*9880d681SAndroid Build Coastguard Worker CCDelegateTo<CC_X86_32_ThisCall_Win> 712*9880d681SAndroid Build Coastguard Worker]>; 713*9880d681SAndroid Build Coastguard Worker 714*9880d681SAndroid Build Coastguard Workerdef CC_X86_32_FastCC : CallingConv<[ 715*9880d681SAndroid Build Coastguard Worker // Handles byval parameters. Note that we can't rely on the delegation 716*9880d681SAndroid Build Coastguard Worker // to CC_X86_32_Common for this because that happens after code that 717*9880d681SAndroid Build Coastguard Worker // puts arguments in registers. 718*9880d681SAndroid Build Coastguard Worker CCIfByVal<CCPassByVal<4, 4>>, 719*9880d681SAndroid Build Coastguard Worker 720*9880d681SAndroid Build Coastguard Worker // Promote i1/i8/i16 arguments to i32. 721*9880d681SAndroid Build Coastguard Worker CCIfType<[i1, i8, i16], CCPromoteToType<i32>>, 722*9880d681SAndroid Build Coastguard Worker 723*9880d681SAndroid Build Coastguard Worker // The 'nest' parameter, if any, is passed in EAX. 724*9880d681SAndroid Build Coastguard Worker CCIfNest<CCAssignToReg<[EAX]>>, 725*9880d681SAndroid Build Coastguard Worker 726*9880d681SAndroid Build Coastguard Worker // The first 2 integer arguments are passed in ECX/EDX 727*9880d681SAndroid Build Coastguard Worker CCIfType<[i32], CCAssignToReg<[ECX, EDX]>>, 728*9880d681SAndroid Build Coastguard Worker 729*9880d681SAndroid Build Coastguard Worker // The first 3 float or double arguments, if the call is not a vararg 730*9880d681SAndroid Build Coastguard Worker // call and if SSE2 is available, are passed in SSE registers. 731*9880d681SAndroid Build Coastguard Worker CCIfNotVarArg<CCIfType<[f32,f64], 732*9880d681SAndroid Build Coastguard Worker CCIfSubtarget<"hasSSE2()", 733*9880d681SAndroid Build Coastguard Worker CCAssignToReg<[XMM0,XMM1,XMM2]>>>>, 734*9880d681SAndroid Build Coastguard Worker 735*9880d681SAndroid Build Coastguard Worker // Doubles get 8-byte slots that are 8-byte aligned. 736*9880d681SAndroid Build Coastguard Worker CCIfType<[f64], CCAssignToStack<8, 8>>, 737*9880d681SAndroid Build Coastguard Worker 738*9880d681SAndroid Build Coastguard Worker // Otherwise, same as everything else. 739*9880d681SAndroid Build Coastguard Worker CCDelegateTo<CC_X86_32_Common> 740*9880d681SAndroid Build Coastguard Worker]>; 741*9880d681SAndroid Build Coastguard Worker 742*9880d681SAndroid Build Coastguard Workerdef CC_X86_32_GHC : CallingConv<[ 743*9880d681SAndroid Build Coastguard Worker // Promote i8/i16 arguments to i32. 744*9880d681SAndroid Build Coastguard Worker CCIfType<[i8, i16], CCPromoteToType<i32>>, 745*9880d681SAndroid Build Coastguard Worker 746*9880d681SAndroid Build Coastguard Worker // Pass in STG registers: Base, Sp, Hp, R1 747*9880d681SAndroid Build Coastguard Worker CCIfType<[i32], CCAssignToReg<[EBX, EBP, EDI, ESI]>> 748*9880d681SAndroid Build Coastguard Worker]>; 749*9880d681SAndroid Build Coastguard Worker 750*9880d681SAndroid Build Coastguard Workerdef CC_X86_32_HiPE : CallingConv<[ 751*9880d681SAndroid Build Coastguard Worker // Promote i8/i16 arguments to i32. 752*9880d681SAndroid Build Coastguard Worker CCIfType<[i8, i16], CCPromoteToType<i32>>, 753*9880d681SAndroid Build Coastguard Worker 754*9880d681SAndroid Build Coastguard Worker // Pass in VM's registers: HP, P, ARG0, ARG1, ARG2 755*9880d681SAndroid Build Coastguard Worker CCIfType<[i32], CCAssignToReg<[ESI, EBP, EAX, EDX, ECX]>>, 756*9880d681SAndroid Build Coastguard Worker 757*9880d681SAndroid Build Coastguard Worker // Integer/Float values get stored in stack slots that are 4 bytes in 758*9880d681SAndroid Build Coastguard Worker // size and 4-byte aligned. 759*9880d681SAndroid Build Coastguard Worker CCIfType<[i32, f32], CCAssignToStack<4, 4>> 760*9880d681SAndroid Build Coastguard Worker]>; 761*9880d681SAndroid Build Coastguard Worker 762*9880d681SAndroid Build Coastguard Worker// X86-64 Intel OpenCL built-ins calling convention. 763*9880d681SAndroid Build Coastguard Workerdef CC_Intel_OCL_BI : CallingConv<[ 764*9880d681SAndroid Build Coastguard Worker 765*9880d681SAndroid Build Coastguard Worker CCIfType<[i32], CCIfSubtarget<"isTargetWin64()", CCAssignToReg<[ECX, EDX, R8D, R9D]>>>, 766*9880d681SAndroid Build Coastguard Worker CCIfType<[i64], CCIfSubtarget<"isTargetWin64()", CCAssignToReg<[RCX, RDX, R8, R9 ]>>>, 767*9880d681SAndroid Build Coastguard Worker 768*9880d681SAndroid Build Coastguard Worker CCIfType<[i32], CCIfSubtarget<"is64Bit()", CCAssignToReg<[EDI, ESI, EDX, ECX]>>>, 769*9880d681SAndroid Build Coastguard Worker CCIfType<[i64], CCIfSubtarget<"is64Bit()", CCAssignToReg<[RDI, RSI, RDX, RCX]>>>, 770*9880d681SAndroid Build Coastguard Worker 771*9880d681SAndroid Build Coastguard Worker CCIfType<[i32], CCAssignToStack<4, 4>>, 772*9880d681SAndroid Build Coastguard Worker 773*9880d681SAndroid Build Coastguard Worker // The SSE vector arguments are passed in XMM registers. 774*9880d681SAndroid Build Coastguard Worker CCIfType<[f32, f64, v4i32, v2i64, v4f32, v2f64], 775*9880d681SAndroid Build Coastguard Worker CCAssignToReg<[XMM0, XMM1, XMM2, XMM3]>>, 776*9880d681SAndroid Build Coastguard Worker 777*9880d681SAndroid Build Coastguard Worker // The 256-bit vector arguments are passed in YMM registers. 778*9880d681SAndroid Build Coastguard Worker CCIfType<[v8f32, v4f64, v8i32, v4i64], 779*9880d681SAndroid Build Coastguard Worker CCAssignToReg<[YMM0, YMM1, YMM2, YMM3]>>, 780*9880d681SAndroid Build Coastguard Worker 781*9880d681SAndroid Build Coastguard Worker // The 512-bit vector arguments are passed in ZMM registers. 782*9880d681SAndroid Build Coastguard Worker CCIfType<[v16f32, v8f64, v16i32, v8i64], 783*9880d681SAndroid Build Coastguard Worker CCAssignToReg<[ZMM0, ZMM1, ZMM2, ZMM3]>>, 784*9880d681SAndroid Build Coastguard Worker 785*9880d681SAndroid Build Coastguard Worker // Pass masks in mask registers 786*9880d681SAndroid Build Coastguard Worker CCIfType<[v16i1, v8i1], CCAssignToReg<[K1]>>, 787*9880d681SAndroid Build Coastguard Worker 788*9880d681SAndroid Build Coastguard Worker CCIfSubtarget<"isTargetWin64()", CCDelegateTo<CC_X86_Win64_C>>, 789*9880d681SAndroid Build Coastguard Worker CCIfSubtarget<"is64Bit()", CCDelegateTo<CC_X86_64_C>>, 790*9880d681SAndroid Build Coastguard Worker CCDelegateTo<CC_X86_32_C> 791*9880d681SAndroid Build Coastguard Worker]>; 792*9880d681SAndroid Build Coastguard Worker 793*9880d681SAndroid Build Coastguard Workerdef CC_X86_32_Intr : CallingConv<[ 794*9880d681SAndroid Build Coastguard Worker CCAssignToStack<4, 4> 795*9880d681SAndroid Build Coastguard Worker]>; 796*9880d681SAndroid Build Coastguard Worker 797*9880d681SAndroid Build Coastguard Workerdef CC_X86_64_Intr : CallingConv<[ 798*9880d681SAndroid Build Coastguard Worker CCAssignToStack<8, 8> 799*9880d681SAndroid Build Coastguard Worker]>; 800*9880d681SAndroid Build Coastguard Worker 801*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 802*9880d681SAndroid Build Coastguard Worker// X86 Root Argument Calling Conventions 803*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 804*9880d681SAndroid Build Coastguard Worker 805*9880d681SAndroid Build Coastguard Worker// This is the root argument convention for the X86-32 backend. 806*9880d681SAndroid Build Coastguard Workerdef CC_X86_32 : CallingConv<[ 807*9880d681SAndroid Build Coastguard Worker // X86_INTR calling convention is valid in MCU target and should override the 808*9880d681SAndroid Build Coastguard Worker // MCU calling convention. Thus, this should be checked before isTargetMCU(). 809*9880d681SAndroid Build Coastguard Worker CCIfCC<"CallingConv::X86_INTR", CCDelegateTo<CC_X86_32_Intr>>, 810*9880d681SAndroid Build Coastguard Worker CCIfSubtarget<"isTargetMCU()", CCDelegateTo<CC_X86_32_MCU>>, 811*9880d681SAndroid Build Coastguard Worker CCIfCC<"CallingConv::X86_FastCall", CCDelegateTo<CC_X86_32_FastCall>>, 812*9880d681SAndroid Build Coastguard Worker CCIfCC<"CallingConv::X86_VectorCall", CCDelegateTo<CC_X86_32_VectorCall>>, 813*9880d681SAndroid Build Coastguard Worker CCIfCC<"CallingConv::X86_ThisCall", CCDelegateTo<CC_X86_32_ThisCall>>, 814*9880d681SAndroid Build Coastguard Worker CCIfCC<"CallingConv::Fast", CCDelegateTo<CC_X86_32_FastCC>>, 815*9880d681SAndroid Build Coastguard Worker CCIfCC<"CallingConv::GHC", CCDelegateTo<CC_X86_32_GHC>>, 816*9880d681SAndroid Build Coastguard Worker CCIfCC<"CallingConv::HiPE", CCDelegateTo<CC_X86_32_HiPE>>, 817*9880d681SAndroid Build Coastguard Worker 818*9880d681SAndroid Build Coastguard Worker // Otherwise, drop to normal X86-32 CC 819*9880d681SAndroid Build Coastguard Worker CCDelegateTo<CC_X86_32_C> 820*9880d681SAndroid Build Coastguard Worker]>; 821*9880d681SAndroid Build Coastguard Worker 822*9880d681SAndroid Build Coastguard Worker// This is the root argument convention for the X86-64 backend. 823*9880d681SAndroid Build Coastguard Workerdef CC_X86_64 : CallingConv<[ 824*9880d681SAndroid Build Coastguard Worker CCIfCC<"CallingConv::GHC", CCDelegateTo<CC_X86_64_GHC>>, 825*9880d681SAndroid Build Coastguard Worker CCIfCC<"CallingConv::HiPE", CCDelegateTo<CC_X86_64_HiPE>>, 826*9880d681SAndroid Build Coastguard Worker CCIfCC<"CallingConv::WebKit_JS", CCDelegateTo<CC_X86_64_WebKit_JS>>, 827*9880d681SAndroid Build Coastguard Worker CCIfCC<"CallingConv::AnyReg", CCDelegateTo<CC_X86_64_AnyReg>>, 828*9880d681SAndroid Build Coastguard Worker CCIfCC<"CallingConv::X86_64_Win64", CCDelegateTo<CC_X86_Win64_C>>, 829*9880d681SAndroid Build Coastguard Worker CCIfCC<"CallingConv::X86_64_SysV", CCDelegateTo<CC_X86_64_C>>, 830*9880d681SAndroid Build Coastguard Worker CCIfCC<"CallingConv::X86_VectorCall", CCDelegateTo<CC_X86_Win64_VectorCall>>, 831*9880d681SAndroid Build Coastguard Worker CCIfCC<"CallingConv::HHVM", CCDelegateTo<CC_X86_64_HHVM>>, 832*9880d681SAndroid Build Coastguard Worker CCIfCC<"CallingConv::HHVM_C", CCDelegateTo<CC_X86_64_HHVM_C>>, 833*9880d681SAndroid Build Coastguard Worker CCIfCC<"CallingConv::X86_INTR", CCDelegateTo<CC_X86_64_Intr>>, 834*9880d681SAndroid Build Coastguard Worker 835*9880d681SAndroid Build Coastguard Worker // Mingw64 and native Win64 use Win64 CC 836*9880d681SAndroid Build Coastguard Worker CCIfSubtarget<"isTargetWin64()", CCDelegateTo<CC_X86_Win64_C>>, 837*9880d681SAndroid Build Coastguard Worker 838*9880d681SAndroid Build Coastguard Worker // Otherwise, drop to normal X86-64 CC 839*9880d681SAndroid Build Coastguard Worker CCDelegateTo<CC_X86_64_C> 840*9880d681SAndroid Build Coastguard Worker]>; 841*9880d681SAndroid Build Coastguard Worker 842*9880d681SAndroid Build Coastguard Worker// This is the argument convention used for the entire X86 backend. 843*9880d681SAndroid Build Coastguard Workerdef CC_X86 : CallingConv<[ 844*9880d681SAndroid Build Coastguard Worker CCIfCC<"CallingConv::Intel_OCL_BI", CCDelegateTo<CC_Intel_OCL_BI>>, 845*9880d681SAndroid Build Coastguard Worker CCIfSubtarget<"is64Bit()", CCDelegateTo<CC_X86_64>>, 846*9880d681SAndroid Build Coastguard Worker CCDelegateTo<CC_X86_32> 847*9880d681SAndroid Build Coastguard Worker]>; 848*9880d681SAndroid Build Coastguard Worker 849*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 850*9880d681SAndroid Build Coastguard Worker// Callee-saved Registers. 851*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 852*9880d681SAndroid Build Coastguard Worker 853*9880d681SAndroid Build Coastguard Workerdef CSR_NoRegs : CalleeSavedRegs<(add)>; 854*9880d681SAndroid Build Coastguard Worker 855*9880d681SAndroid Build Coastguard Workerdef CSR_32 : CalleeSavedRegs<(add ESI, EDI, EBX, EBP)>; 856*9880d681SAndroid Build Coastguard Workerdef CSR_64 : CalleeSavedRegs<(add RBX, R12, R13, R14, R15, RBP)>; 857*9880d681SAndroid Build Coastguard Worker 858*9880d681SAndroid Build Coastguard Workerdef CSR_64_SwiftError : CalleeSavedRegs<(sub CSR_64, R12)>; 859*9880d681SAndroid Build Coastguard Worker 860*9880d681SAndroid Build Coastguard Workerdef CSR_32EHRet : CalleeSavedRegs<(add EAX, EDX, CSR_32)>; 861*9880d681SAndroid Build Coastguard Workerdef CSR_64EHRet : CalleeSavedRegs<(add RAX, RDX, CSR_64)>; 862*9880d681SAndroid Build Coastguard Worker 863*9880d681SAndroid Build Coastguard Workerdef CSR_Win64 : CalleeSavedRegs<(add RBX, RBP, RDI, RSI, R12, R13, R14, R15, 864*9880d681SAndroid Build Coastguard Worker (sequence "XMM%u", 6, 15))>; 865*9880d681SAndroid Build Coastguard Worker 866*9880d681SAndroid Build Coastguard Worker// The function used by Darwin to obtain the address of a thread-local variable 867*9880d681SAndroid Build Coastguard Worker// uses rdi to pass a single parameter and rax for the return value. All other 868*9880d681SAndroid Build Coastguard Worker// GPRs are preserved. 869*9880d681SAndroid Build Coastguard Workerdef CSR_64_TLS_Darwin : CalleeSavedRegs<(add CSR_64, RCX, RDX, RSI, 870*9880d681SAndroid Build Coastguard Worker R8, R9, R10, R11)>; 871*9880d681SAndroid Build Coastguard Worker 872*9880d681SAndroid Build Coastguard Worker// CSRs that are handled by prologue, epilogue. 873*9880d681SAndroid Build Coastguard Workerdef CSR_64_CXX_TLS_Darwin_PE : CalleeSavedRegs<(add RBP)>; 874*9880d681SAndroid Build Coastguard Worker 875*9880d681SAndroid Build Coastguard Worker// CSRs that are handled explicitly via copies. 876*9880d681SAndroid Build Coastguard Workerdef CSR_64_CXX_TLS_Darwin_ViaCopy : CalleeSavedRegs<(sub CSR_64_TLS_Darwin, RBP)>; 877*9880d681SAndroid Build Coastguard Worker 878*9880d681SAndroid Build Coastguard Worker// All GPRs - except r11 879*9880d681SAndroid Build Coastguard Workerdef CSR_64_RT_MostRegs : CalleeSavedRegs<(add CSR_64, RAX, RCX, RDX, RSI, RDI, 880*9880d681SAndroid Build Coastguard Worker R8, R9, R10, RSP)>; 881*9880d681SAndroid Build Coastguard Worker 882*9880d681SAndroid Build Coastguard Worker// All registers - except r11 883*9880d681SAndroid Build Coastguard Workerdef CSR_64_RT_AllRegs : CalleeSavedRegs<(add CSR_64_RT_MostRegs, 884*9880d681SAndroid Build Coastguard Worker (sequence "XMM%u", 0, 15))>; 885*9880d681SAndroid Build Coastguard Workerdef CSR_64_RT_AllRegs_AVX : CalleeSavedRegs<(add CSR_64_RT_MostRegs, 886*9880d681SAndroid Build Coastguard Worker (sequence "YMM%u", 0, 15))>; 887*9880d681SAndroid Build Coastguard Worker 888*9880d681SAndroid Build Coastguard Workerdef CSR_64_MostRegs : CalleeSavedRegs<(add RBX, RCX, RDX, RSI, RDI, R8, R9, R10, 889*9880d681SAndroid Build Coastguard Worker R11, R12, R13, R14, R15, RBP, 890*9880d681SAndroid Build Coastguard Worker (sequence "XMM%u", 0, 15))>; 891*9880d681SAndroid Build Coastguard Worker 892*9880d681SAndroid Build Coastguard Workerdef CSR_32_AllRegs : CalleeSavedRegs<(add EAX, EBX, ECX, EDX, EBP, ESI, 893*9880d681SAndroid Build Coastguard Worker EDI)>; 894*9880d681SAndroid Build Coastguard Workerdef CSR_32_AllRegs_SSE : CalleeSavedRegs<(add CSR_32_AllRegs, 895*9880d681SAndroid Build Coastguard Worker (sequence "XMM%u", 0, 7))>; 896*9880d681SAndroid Build Coastguard Workerdef CSR_32_AllRegs_AVX : CalleeSavedRegs<(add CSR_32_AllRegs, 897*9880d681SAndroid Build Coastguard Worker (sequence "YMM%u", 0, 7))>; 898*9880d681SAndroid Build Coastguard Workerdef CSR_32_AllRegs_AVX512 : CalleeSavedRegs<(add CSR_32_AllRegs, 899*9880d681SAndroid Build Coastguard Worker (sequence "ZMM%u", 0, 7), 900*9880d681SAndroid Build Coastguard Worker (sequence "K%u", 0, 7))>; 901*9880d681SAndroid Build Coastguard Worker 902*9880d681SAndroid Build Coastguard Workerdef CSR_64_AllRegs : CalleeSavedRegs<(add CSR_64_MostRegs, RAX)>; 903*9880d681SAndroid Build Coastguard Workerdef CSR_64_AllRegs_AVX : CalleeSavedRegs<(sub (add CSR_64_MostRegs, RAX, 904*9880d681SAndroid Build Coastguard Worker (sequence "YMM%u", 0, 15)), 905*9880d681SAndroid Build Coastguard Worker (sequence "XMM%u", 0, 15))>; 906*9880d681SAndroid Build Coastguard Workerdef CSR_64_AllRegs_AVX512 : CalleeSavedRegs<(sub (add CSR_64_MostRegs, RAX, 907*9880d681SAndroid Build Coastguard Worker (sequence "ZMM%u", 0, 31), 908*9880d681SAndroid Build Coastguard Worker (sequence "K%u", 0, 7)), 909*9880d681SAndroid Build Coastguard Worker (sequence "XMM%u", 0, 15))>; 910*9880d681SAndroid Build Coastguard Worker 911*9880d681SAndroid Build Coastguard Worker// Standard C + YMM6-15 912*9880d681SAndroid Build Coastguard Workerdef CSR_Win64_Intel_OCL_BI_AVX : CalleeSavedRegs<(add RBX, RBP, RDI, RSI, R12, 913*9880d681SAndroid Build Coastguard Worker R13, R14, R15, 914*9880d681SAndroid Build Coastguard Worker (sequence "YMM%u", 6, 15))>; 915*9880d681SAndroid Build Coastguard Worker 916*9880d681SAndroid Build Coastguard Workerdef CSR_Win64_Intel_OCL_BI_AVX512 : CalleeSavedRegs<(add RBX, RBP, RDI, RSI, 917*9880d681SAndroid Build Coastguard Worker R12, R13, R14, R15, 918*9880d681SAndroid Build Coastguard Worker (sequence "ZMM%u", 6, 21), 919*9880d681SAndroid Build Coastguard Worker K4, K5, K6, K7)>; 920*9880d681SAndroid Build Coastguard Worker//Standard C + XMM 8-15 921*9880d681SAndroid Build Coastguard Workerdef CSR_64_Intel_OCL_BI : CalleeSavedRegs<(add CSR_64, 922*9880d681SAndroid Build Coastguard Worker (sequence "XMM%u", 8, 15))>; 923*9880d681SAndroid Build Coastguard Worker 924*9880d681SAndroid Build Coastguard Worker//Standard C + YMM 8-15 925*9880d681SAndroid Build Coastguard Workerdef CSR_64_Intel_OCL_BI_AVX : CalleeSavedRegs<(add CSR_64, 926*9880d681SAndroid Build Coastguard Worker (sequence "YMM%u", 8, 15))>; 927*9880d681SAndroid Build Coastguard Worker 928*9880d681SAndroid Build Coastguard Workerdef CSR_64_Intel_OCL_BI_AVX512 : CalleeSavedRegs<(add RBX, RDI, RSI, R14, R15, 929*9880d681SAndroid Build Coastguard Worker (sequence "ZMM%u", 16, 31), 930*9880d681SAndroid Build Coastguard Worker K4, K5, K6, K7)>; 931*9880d681SAndroid Build Coastguard Worker 932*9880d681SAndroid Build Coastguard Worker// Only R12 is preserved for PHP calls in HHVM. 933*9880d681SAndroid Build Coastguard Workerdef CSR_64_HHVM : CalleeSavedRegs<(add R12)>; 934