1*9880d681SAndroid Build Coastguard Worker//=- AArch64CallingConv.td - Calling Conventions for AArch64 -*- 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 AArch64 architecture. 11*9880d681SAndroid Build Coastguard Worker// 12*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Worker/// CCIfAlign - Match of the original alignment of the arg 15*9880d681SAndroid Build Coastguard Workerclass CCIfAlign<string Align, CCAction A> : 16*9880d681SAndroid Build Coastguard Worker CCIf<!strconcat("ArgFlags.getOrigAlign() == ", Align), A>; 17*9880d681SAndroid Build Coastguard Worker/// CCIfBigEndian - Match only if we're in big endian mode. 18*9880d681SAndroid Build Coastguard Workerclass CCIfBigEndian<CCAction A> : 19*9880d681SAndroid Build Coastguard Worker CCIf<"State.getMachineFunction().getDataLayout().isBigEndian()", A>; 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 22*9880d681SAndroid Build Coastguard Worker// ARM AAPCS64 Calling Convention 23*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Workerdef CC_AArch64_AAPCS : CallingConv<[ 26*9880d681SAndroid Build Coastguard Worker CCIfType<[v2f32], CCBitConvertToType<v2i32>>, 27*9880d681SAndroid Build Coastguard Worker CCIfType<[v2f64, v4f32], CCBitConvertToType<v2i64>>, 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Worker // Big endian vectors must be passed as if they were 1-element vectors so that 30*9880d681SAndroid Build Coastguard Worker // their lanes are in a consistent order. 31*9880d681SAndroid Build Coastguard Worker CCIfBigEndian<CCIfType<[v2i32, v2f32, v4i16, v4f16, v8i8], 32*9880d681SAndroid Build Coastguard Worker CCBitConvertToType<f64>>>, 33*9880d681SAndroid Build Coastguard Worker CCIfBigEndian<CCIfType<[v2i64, v2f64, v4i32, v4f32, v8i16, v8f16, v16i8], 34*9880d681SAndroid Build Coastguard Worker CCBitConvertToType<f128>>>, 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Worker // An SRet is passed in X8, not X0 like a normal pointer parameter. 37*9880d681SAndroid Build Coastguard Worker CCIfSRet<CCIfType<[i64], CCAssignToRegWithShadow<[X8], [W8]>>>, 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Worker // Put ByVal arguments directly on the stack. Minimum size and alignment of a 40*9880d681SAndroid Build Coastguard Worker // slot is 64-bit. 41*9880d681SAndroid Build Coastguard Worker CCIfByVal<CCPassByVal<8, 8>>, 42*9880d681SAndroid Build Coastguard Worker 43*9880d681SAndroid Build Coastguard Worker // The 'nest' parameter, if any, is passed in X18. 44*9880d681SAndroid Build Coastguard Worker // Darwin uses X18 as the platform register and hence 'nest' isn't currently 45*9880d681SAndroid Build Coastguard Worker // supported there. 46*9880d681SAndroid Build Coastguard Worker CCIfNest<CCAssignToReg<[X18]>>, 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Worker // Pass SwiftSelf in a callee saved register. 49*9880d681SAndroid Build Coastguard Worker CCIfSwiftSelf<CCIfType<[i64], CCAssignToRegWithShadow<[X20], [W20]>>>, 50*9880d681SAndroid Build Coastguard Worker 51*9880d681SAndroid Build Coastguard Worker CCIfConsecutiveRegs<CCCustom<"CC_AArch64_Custom_Block">>, 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard Worker // Handle i1, i8, i16, i32, i64, f32, f64 and v2f64 by passing in registers, 54*9880d681SAndroid Build Coastguard Worker // up to eight each of GPR and FPR. 55*9880d681SAndroid Build Coastguard Worker CCIfType<[i1, i8, i16], CCPromoteToType<i32>>, 56*9880d681SAndroid Build Coastguard Worker CCIfType<[i32], CCAssignToRegWithShadow<[W0, W1, W2, W3, W4, W5, W6, W7], 57*9880d681SAndroid Build Coastguard Worker [X0, X1, X2, X3, X4, X5, X6, X7]>>, 58*9880d681SAndroid Build Coastguard Worker // i128 is split to two i64s, we can't fit half to register X7. 59*9880d681SAndroid Build Coastguard Worker CCIfType<[i64], CCIfSplit<CCAssignToRegWithShadow<[X0, X2, X4, X6], 60*9880d681SAndroid Build Coastguard Worker [X0, X1, X3, X5]>>>, 61*9880d681SAndroid Build Coastguard Worker 62*9880d681SAndroid Build Coastguard Worker // i128 is split to two i64s, and its stack alignment is 16 bytes. 63*9880d681SAndroid Build Coastguard Worker CCIfType<[i64], CCIfSplit<CCAssignToStackWithShadow<8, 16, [X7]>>>, 64*9880d681SAndroid Build Coastguard Worker 65*9880d681SAndroid Build Coastguard Worker CCIfType<[i64], CCAssignToRegWithShadow<[X0, X1, X2, X3, X4, X5, X6, X7], 66*9880d681SAndroid Build Coastguard Worker [W0, W1, W2, W3, W4, W5, W6, W7]>>, 67*9880d681SAndroid Build Coastguard Worker CCIfType<[f16], CCAssignToRegWithShadow<[H0, H1, H2, H3, H4, H5, H6, H7], 68*9880d681SAndroid Build Coastguard Worker [Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7]>>, 69*9880d681SAndroid Build Coastguard Worker CCIfType<[f32], CCAssignToRegWithShadow<[S0, S1, S2, S3, S4, S5, S6, S7], 70*9880d681SAndroid Build Coastguard Worker [Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7]>>, 71*9880d681SAndroid Build Coastguard Worker CCIfType<[f64], CCAssignToRegWithShadow<[D0, D1, D2, D3, D4, D5, D6, D7], 72*9880d681SAndroid Build Coastguard Worker [Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7]>>, 73*9880d681SAndroid Build Coastguard Worker CCIfType<[v1i64, v2i32, v4i16, v8i8, v1f64, v2f32, v4f16], 74*9880d681SAndroid Build Coastguard Worker CCAssignToRegWithShadow<[D0, D1, D2, D3, D4, D5, D6, D7], 75*9880d681SAndroid Build Coastguard Worker [Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7]>>, 76*9880d681SAndroid Build Coastguard Worker CCIfType<[f128, v2i64, v4i32, v8i16, v16i8, v4f32, v2f64, v8f16], 77*9880d681SAndroid Build Coastguard Worker CCAssignToReg<[Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7]>>, 78*9880d681SAndroid Build Coastguard Worker 79*9880d681SAndroid Build Coastguard Worker // If more than will fit in registers, pass them on the stack instead. 80*9880d681SAndroid Build Coastguard Worker CCIfType<[i1, i8, i16, f16], CCAssignToStack<8, 8>>, 81*9880d681SAndroid Build Coastguard Worker CCIfType<[i32, f32], CCAssignToStack<8, 8>>, 82*9880d681SAndroid Build Coastguard Worker CCIfType<[i64, f64, v1f64, v2f32, v1i64, v2i32, v4i16, v8i8, v4f16], 83*9880d681SAndroid Build Coastguard Worker CCAssignToStack<8, 8>>, 84*9880d681SAndroid Build Coastguard Worker CCIfType<[f128, v2i64, v4i32, v8i16, v16i8, v4f32, v2f64, v8f16], 85*9880d681SAndroid Build Coastguard Worker CCAssignToStack<16, 16>> 86*9880d681SAndroid Build Coastguard Worker]>; 87*9880d681SAndroid Build Coastguard Worker 88*9880d681SAndroid Build Coastguard Workerdef RetCC_AArch64_AAPCS : CallingConv<[ 89*9880d681SAndroid Build Coastguard Worker CCIfType<[v2f32], CCBitConvertToType<v2i32>>, 90*9880d681SAndroid Build Coastguard Worker CCIfType<[v2f64, v4f32], CCBitConvertToType<v2i64>>, 91*9880d681SAndroid Build Coastguard Worker 92*9880d681SAndroid Build Coastguard Worker CCIfSwiftError<CCIfType<[i64], CCAssignToRegWithShadow<[X19], [W19]>>>, 93*9880d681SAndroid Build Coastguard Worker 94*9880d681SAndroid Build Coastguard Worker // Big endian vectors must be passed as if they were 1-element vectors so that 95*9880d681SAndroid Build Coastguard Worker // their lanes are in a consistent order. 96*9880d681SAndroid Build Coastguard Worker CCIfBigEndian<CCIfType<[v2i32, v2f32, v4i16, v4f16, v8i8], 97*9880d681SAndroid Build Coastguard Worker CCBitConvertToType<f64>>>, 98*9880d681SAndroid Build Coastguard Worker CCIfBigEndian<CCIfType<[v2i64, v2f64, v4i32, v4f32, v8i16, v8f16, v16i8], 99*9880d681SAndroid Build Coastguard Worker CCBitConvertToType<f128>>>, 100*9880d681SAndroid Build Coastguard Worker 101*9880d681SAndroid Build Coastguard Worker CCIfType<[i32], CCAssignToRegWithShadow<[W0, W1, W2, W3, W4, W5, W6, W7], 102*9880d681SAndroid Build Coastguard Worker [X0, X1, X2, X3, X4, X5, X6, X7]>>, 103*9880d681SAndroid Build Coastguard Worker CCIfType<[i64], CCAssignToRegWithShadow<[X0, X1, X2, X3, X4, X5, X6, X7], 104*9880d681SAndroid Build Coastguard Worker [W0, W1, W2, W3, W4, W5, W6, W7]>>, 105*9880d681SAndroid Build Coastguard Worker CCIfType<[f16], CCAssignToRegWithShadow<[H0, H1, H2, H3, H4, H5, H6, H7], 106*9880d681SAndroid Build Coastguard Worker [Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7]>>, 107*9880d681SAndroid Build Coastguard Worker CCIfType<[f32], CCAssignToRegWithShadow<[S0, S1, S2, S3, S4, S5, S6, S7], 108*9880d681SAndroid Build Coastguard Worker [Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7]>>, 109*9880d681SAndroid Build Coastguard Worker CCIfType<[f64], CCAssignToRegWithShadow<[D0, D1, D2, D3, D4, D5, D6, D7], 110*9880d681SAndroid Build Coastguard Worker [Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7]>>, 111*9880d681SAndroid Build Coastguard Worker CCIfType<[v1i64, v2i32, v4i16, v8i8, v1f64, v2f32, v4f16], 112*9880d681SAndroid Build Coastguard Worker CCAssignToRegWithShadow<[D0, D1, D2, D3, D4, D5, D6, D7], 113*9880d681SAndroid Build Coastguard Worker [Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7]>>, 114*9880d681SAndroid Build Coastguard Worker CCIfType<[f128, v2i64, v4i32, v8i16, v16i8, v4f32, v2f64, v8f16], 115*9880d681SAndroid Build Coastguard Worker CCAssignToReg<[Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7]>> 116*9880d681SAndroid Build Coastguard Worker]>; 117*9880d681SAndroid Build Coastguard Worker 118*9880d681SAndroid Build Coastguard Worker 119*9880d681SAndroid Build Coastguard Worker// Darwin uses a calling convention which differs in only two ways 120*9880d681SAndroid Build Coastguard Worker// from the standard one at this level: 121*9880d681SAndroid Build Coastguard Worker// + i128s (i.e. split i64s) don't need even registers. 122*9880d681SAndroid Build Coastguard Worker// + Stack slots are sized as needed rather than being at least 64-bit. 123*9880d681SAndroid Build Coastguard Workerdef CC_AArch64_DarwinPCS : CallingConv<[ 124*9880d681SAndroid Build Coastguard Worker CCIfType<[v2f32], CCBitConvertToType<v2i32>>, 125*9880d681SAndroid Build Coastguard Worker CCIfType<[v2f64, v4f32, f128], CCBitConvertToType<v2i64>>, 126*9880d681SAndroid Build Coastguard Worker 127*9880d681SAndroid Build Coastguard Worker // An SRet is passed in X8, not X0 like a normal pointer parameter. 128*9880d681SAndroid Build Coastguard Worker CCIfSRet<CCIfType<[i64], CCAssignToRegWithShadow<[X8], [W8]>>>, 129*9880d681SAndroid Build Coastguard Worker 130*9880d681SAndroid Build Coastguard Worker // Put ByVal arguments directly on the stack. Minimum size and alignment of a 131*9880d681SAndroid Build Coastguard Worker // slot is 64-bit. 132*9880d681SAndroid Build Coastguard Worker CCIfByVal<CCPassByVal<8, 8>>, 133*9880d681SAndroid Build Coastguard Worker 134*9880d681SAndroid Build Coastguard Worker // Pass SwiftSelf in a callee saved register. 135*9880d681SAndroid Build Coastguard Worker CCIfSwiftSelf<CCIfType<[i64], CCAssignToRegWithShadow<[X20], [W20]>>>, 136*9880d681SAndroid Build Coastguard Worker 137*9880d681SAndroid Build Coastguard Worker // A SwiftError is passed in X19. 138*9880d681SAndroid Build Coastguard Worker CCIfSwiftError<CCIfType<[i64], CCAssignToRegWithShadow<[X19], [W19]>>>, 139*9880d681SAndroid Build Coastguard Worker 140*9880d681SAndroid Build Coastguard Worker CCIfConsecutiveRegs<CCCustom<"CC_AArch64_Custom_Block">>, 141*9880d681SAndroid Build Coastguard Worker 142*9880d681SAndroid Build Coastguard Worker // Handle i1, i8, i16, i32, i64, f32, f64 and v2f64 by passing in registers, 143*9880d681SAndroid Build Coastguard Worker // up to eight each of GPR and FPR. 144*9880d681SAndroid Build Coastguard Worker CCIfType<[i1, i8, i16], CCPromoteToType<i32>>, 145*9880d681SAndroid Build Coastguard Worker CCIfType<[i32], CCAssignToRegWithShadow<[W0, W1, W2, W3, W4, W5, W6, W7], 146*9880d681SAndroid Build Coastguard Worker [X0, X1, X2, X3, X4, X5, X6, X7]>>, 147*9880d681SAndroid Build Coastguard Worker // i128 is split to two i64s, we can't fit half to register X7. 148*9880d681SAndroid Build Coastguard Worker CCIfType<[i64], 149*9880d681SAndroid Build Coastguard Worker CCIfSplit<CCAssignToRegWithShadow<[X0, X1, X2, X3, X4, X5, X6], 150*9880d681SAndroid Build Coastguard Worker [W0, W1, W2, W3, W4, W5, W6]>>>, 151*9880d681SAndroid Build Coastguard Worker // i128 is split to two i64s, and its stack alignment is 16 bytes. 152*9880d681SAndroid Build Coastguard Worker CCIfType<[i64], CCIfSplit<CCAssignToStackWithShadow<8, 16, [X7]>>>, 153*9880d681SAndroid Build Coastguard Worker 154*9880d681SAndroid Build Coastguard Worker CCIfType<[i64], CCAssignToRegWithShadow<[X0, X1, X2, X3, X4, X5, X6, X7], 155*9880d681SAndroid Build Coastguard Worker [W0, W1, W2, W3, W4, W5, W6, W7]>>, 156*9880d681SAndroid Build Coastguard Worker CCIfType<[f16], CCAssignToRegWithShadow<[H0, H1, H2, H3, H4, H5, H6, H7], 157*9880d681SAndroid Build Coastguard Worker [Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7]>>, 158*9880d681SAndroid Build Coastguard Worker CCIfType<[f32], CCAssignToRegWithShadow<[S0, S1, S2, S3, S4, S5, S6, S7], 159*9880d681SAndroid Build Coastguard Worker [Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7]>>, 160*9880d681SAndroid Build Coastguard Worker CCIfType<[f64], CCAssignToRegWithShadow<[D0, D1, D2, D3, D4, D5, D6, D7], 161*9880d681SAndroid Build Coastguard Worker [Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7]>>, 162*9880d681SAndroid Build Coastguard Worker CCIfType<[v1i64, v2i32, v4i16, v8i8, v1f64, v2f32, v4f16], 163*9880d681SAndroid Build Coastguard Worker CCAssignToRegWithShadow<[D0, D1, D2, D3, D4, D5, D6, D7], 164*9880d681SAndroid Build Coastguard Worker [Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7]>>, 165*9880d681SAndroid Build Coastguard Worker CCIfType<[v2i64, v4i32, v8i16, v16i8, v4f32, v2f64, v8f16], 166*9880d681SAndroid Build Coastguard Worker CCAssignToReg<[Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7]>>, 167*9880d681SAndroid Build Coastguard Worker 168*9880d681SAndroid Build Coastguard Worker // If more than will fit in registers, pass them on the stack instead. 169*9880d681SAndroid Build Coastguard Worker CCIf<"ValVT == MVT::i1 || ValVT == MVT::i8", CCAssignToStack<1, 1>>, 170*9880d681SAndroid Build Coastguard Worker CCIf<"ValVT == MVT::i16 || ValVT == MVT::f16", CCAssignToStack<2, 2>>, 171*9880d681SAndroid Build Coastguard Worker CCIfType<[i32, f32], CCAssignToStack<4, 4>>, 172*9880d681SAndroid Build Coastguard Worker CCIfType<[i64, f64, v1f64, v2f32, v1i64, v2i32, v4i16, v8i8, v4f16], 173*9880d681SAndroid Build Coastguard Worker CCAssignToStack<8, 8>>, 174*9880d681SAndroid Build Coastguard Worker CCIfType<[v2i64, v4i32, v8i16, v16i8, v4f32, v2f64, v8f16], 175*9880d681SAndroid Build Coastguard Worker CCAssignToStack<16, 16>> 176*9880d681SAndroid Build Coastguard Worker]>; 177*9880d681SAndroid Build Coastguard Worker 178*9880d681SAndroid Build Coastguard Workerdef CC_AArch64_DarwinPCS_VarArg : CallingConv<[ 179*9880d681SAndroid Build Coastguard Worker CCIfType<[v2f32], CCBitConvertToType<v2i32>>, 180*9880d681SAndroid Build Coastguard Worker CCIfType<[v2f64, v4f32, f128], CCBitConvertToType<v2i64>>, 181*9880d681SAndroid Build Coastguard Worker 182*9880d681SAndroid Build Coastguard Worker CCIfConsecutiveRegs<CCCustom<"CC_AArch64_Custom_Stack_Block">>, 183*9880d681SAndroid Build Coastguard Worker 184*9880d681SAndroid Build Coastguard Worker // Handle all scalar types as either i64 or f64. 185*9880d681SAndroid Build Coastguard Worker CCIfType<[i8, i16, i32], CCPromoteToType<i64>>, 186*9880d681SAndroid Build Coastguard Worker CCIfType<[f16, f32], CCPromoteToType<f64>>, 187*9880d681SAndroid Build Coastguard Worker 188*9880d681SAndroid Build Coastguard Worker // Everything is on the stack. 189*9880d681SAndroid Build Coastguard Worker // i128 is split to two i64s, and its stack alignment is 16 bytes. 190*9880d681SAndroid Build Coastguard Worker CCIfType<[i64], CCIfSplit<CCAssignToStack<8, 16>>>, 191*9880d681SAndroid Build Coastguard Worker CCIfType<[i64, f64, v1i64, v2i32, v4i16, v8i8, v1f64, v2f32, v4f16], 192*9880d681SAndroid Build Coastguard Worker CCAssignToStack<8, 8>>, 193*9880d681SAndroid Build Coastguard Worker CCIfType<[v2i64, v4i32, v8i16, v16i8, v4f32, v2f64, v8f16], 194*9880d681SAndroid Build Coastguard Worker CCAssignToStack<16, 16>> 195*9880d681SAndroid Build Coastguard Worker]>; 196*9880d681SAndroid Build Coastguard Worker 197*9880d681SAndroid Build Coastguard Worker// The WebKit_JS calling convention only passes the first argument (the callee) 198*9880d681SAndroid Build Coastguard Worker// in register and the remaining arguments on stack. We allow 32bit stack slots, 199*9880d681SAndroid Build Coastguard Worker// so that WebKit can write partial values in the stack and define the other 200*9880d681SAndroid Build Coastguard Worker// 32bit quantity as undef. 201*9880d681SAndroid Build Coastguard Workerdef CC_AArch64_WebKit_JS : CallingConv<[ 202*9880d681SAndroid Build Coastguard Worker // Handle i1, i8, i16, i32, and i64 passing in register X0 (W0). 203*9880d681SAndroid Build Coastguard Worker CCIfType<[i1, i8, i16], CCPromoteToType<i32>>, 204*9880d681SAndroid Build Coastguard Worker CCIfType<[i32], CCAssignToRegWithShadow<[W0], [X0]>>, 205*9880d681SAndroid Build Coastguard Worker CCIfType<[i64], CCAssignToRegWithShadow<[X0], [W0]>>, 206*9880d681SAndroid Build Coastguard Worker 207*9880d681SAndroid Build Coastguard Worker // Pass the remaining arguments on the stack instead. 208*9880d681SAndroid Build Coastguard Worker CCIfType<[i32, f32], CCAssignToStack<4, 4>>, 209*9880d681SAndroid Build Coastguard Worker CCIfType<[i64, f64], CCAssignToStack<8, 8>> 210*9880d681SAndroid Build Coastguard Worker]>; 211*9880d681SAndroid Build Coastguard Worker 212*9880d681SAndroid Build Coastguard Workerdef RetCC_AArch64_WebKit_JS : CallingConv<[ 213*9880d681SAndroid Build Coastguard Worker CCIfType<[i32], CCAssignToRegWithShadow<[W0, W1, W2, W3, W4, W5, W6, W7], 214*9880d681SAndroid Build Coastguard Worker [X0, X1, X2, X3, X4, X5, X6, X7]>>, 215*9880d681SAndroid Build Coastguard Worker CCIfType<[i64], CCAssignToRegWithShadow<[X0, X1, X2, X3, X4, X5, X6, X7], 216*9880d681SAndroid Build Coastguard Worker [W0, W1, W2, W3, W4, W5, W6, W7]>>, 217*9880d681SAndroid Build Coastguard Worker CCIfType<[f32], CCAssignToRegWithShadow<[S0, S1, S2, S3, S4, S5, S6, S7], 218*9880d681SAndroid Build Coastguard Worker [Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7]>>, 219*9880d681SAndroid Build Coastguard Worker CCIfType<[f64], CCAssignToRegWithShadow<[D0, D1, D2, D3, D4, D5, D6, D7], 220*9880d681SAndroid Build Coastguard Worker [Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7]>> 221*9880d681SAndroid Build Coastguard Worker]>; 222*9880d681SAndroid Build Coastguard Worker 223*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 224*9880d681SAndroid Build Coastguard Worker// ARM64 Calling Convention for GHC 225*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 226*9880d681SAndroid Build Coastguard Worker 227*9880d681SAndroid Build Coastguard Worker// This calling convention is specific to the Glasgow Haskell Compiler. 228*9880d681SAndroid Build Coastguard Worker// The only documentation is the GHC source code, specifically the C header 229*9880d681SAndroid Build Coastguard Worker// file: 230*9880d681SAndroid Build Coastguard Worker// 231*9880d681SAndroid Build Coastguard Worker// https://github.com/ghc/ghc/blob/master/includes/stg/MachRegs.h 232*9880d681SAndroid Build Coastguard Worker// 233*9880d681SAndroid Build Coastguard Worker// which defines the registers for the Spineless Tagless G-Machine (STG) that 234*9880d681SAndroid Build Coastguard Worker// GHC uses to implement lazy evaluation. The generic STG machine has a set of 235*9880d681SAndroid Build Coastguard Worker// registers which are mapped to appropriate set of architecture specific 236*9880d681SAndroid Build Coastguard Worker// registers for each CPU architecture. 237*9880d681SAndroid Build Coastguard Worker// 238*9880d681SAndroid Build Coastguard Worker// The STG Machine is documented here: 239*9880d681SAndroid Build Coastguard Worker// 240*9880d681SAndroid Build Coastguard Worker// https://ghc.haskell.org/trac/ghc/wiki/Commentary/Compiler/GeneratedCode 241*9880d681SAndroid Build Coastguard Worker// 242*9880d681SAndroid Build Coastguard Worker// The AArch64 register mapping is under the heading "The ARMv8/AArch64 ABI 243*9880d681SAndroid Build Coastguard Worker// register mapping". 244*9880d681SAndroid Build Coastguard Worker 245*9880d681SAndroid Build Coastguard Workerdef CC_AArch64_GHC : CallingConv<[ 246*9880d681SAndroid Build Coastguard Worker // Handle all vector types as either f64 or v2f64. 247*9880d681SAndroid Build Coastguard Worker CCIfType<[v1i64, v2i32, v4i16, v8i8, v2f32], CCBitConvertToType<f64>>, 248*9880d681SAndroid Build Coastguard Worker CCIfType<[v2i64, v4i32, v8i16, v16i8, v4f32, f128], CCBitConvertToType<v2f64>>, 249*9880d681SAndroid Build Coastguard Worker 250*9880d681SAndroid Build Coastguard Worker CCIfType<[v2f64], CCAssignToReg<[Q4, Q5]>>, 251*9880d681SAndroid Build Coastguard Worker CCIfType<[f32], CCAssignToReg<[S8, S9, S10, S11]>>, 252*9880d681SAndroid Build Coastguard Worker CCIfType<[f64], CCAssignToReg<[D12, D13, D14, D15]>>, 253*9880d681SAndroid Build Coastguard Worker 254*9880d681SAndroid Build Coastguard Worker // Promote i8/i16/i32 arguments to i64. 255*9880d681SAndroid Build Coastguard Worker CCIfType<[i8, i16, i32], CCPromoteToType<i64>>, 256*9880d681SAndroid Build Coastguard Worker 257*9880d681SAndroid Build Coastguard Worker // Pass in STG registers: Base, Sp, Hp, R1, R2, R3, R4, R5, R6, SpLim 258*9880d681SAndroid Build Coastguard Worker CCIfType<[i64], CCAssignToReg<[X19, X20, X21, X22, X23, X24, X25, X26, X27, X28]>> 259*9880d681SAndroid Build Coastguard Worker]>; 260*9880d681SAndroid Build Coastguard Worker 261*9880d681SAndroid Build Coastguard Worker// FIXME: LR is only callee-saved in the sense that *we* preserve it and are 262*9880d681SAndroid Build Coastguard Worker// presumably a callee to someone. External functions may not do so, but this 263*9880d681SAndroid Build Coastguard Worker// is currently safe since BL has LR as an implicit-def and what happens after a 264*9880d681SAndroid Build Coastguard Worker// tail call doesn't matter. 265*9880d681SAndroid Build Coastguard Worker// 266*9880d681SAndroid Build Coastguard Worker// It would be better to model its preservation semantics properly (create a 267*9880d681SAndroid Build Coastguard Worker// vreg on entry, use it in RET & tail call generation; make that vreg def if we 268*9880d681SAndroid Build Coastguard Worker// end up saving LR as part of a call frame). Watch this space... 269*9880d681SAndroid Build Coastguard Workerdef CSR_AArch64_AAPCS : CalleeSavedRegs<(add LR, FP, X19, X20, X21, X22, 270*9880d681SAndroid Build Coastguard Worker X23, X24, X25, X26, X27, X28, 271*9880d681SAndroid Build Coastguard Worker D8, D9, D10, D11, 272*9880d681SAndroid Build Coastguard Worker D12, D13, D14, D15)>; 273*9880d681SAndroid Build Coastguard Worker 274*9880d681SAndroid Build Coastguard Worker// Constructors and destructors return 'this' in the iOS 64-bit C++ ABI; since 275*9880d681SAndroid Build Coastguard Worker// 'this' and the pointer return value are both passed in X0 in these cases, 276*9880d681SAndroid Build Coastguard Worker// this can be partially modelled by treating X0 as a callee-saved register; 277*9880d681SAndroid Build Coastguard Worker// only the resulting RegMask is used; the SaveList is ignored 278*9880d681SAndroid Build Coastguard Worker// 279*9880d681SAndroid Build Coastguard Worker// (For generic ARM 64-bit ABI code, clang will not generate constructors or 280*9880d681SAndroid Build Coastguard Worker// destructors with 'this' returns, so this RegMask will not be used in that 281*9880d681SAndroid Build Coastguard Worker// case) 282*9880d681SAndroid Build Coastguard Workerdef CSR_AArch64_AAPCS_ThisReturn : CalleeSavedRegs<(add CSR_AArch64_AAPCS, X0)>; 283*9880d681SAndroid Build Coastguard Worker 284*9880d681SAndroid Build Coastguard Workerdef CSR_AArch64_AAPCS_SwiftError 285*9880d681SAndroid Build Coastguard Worker : CalleeSavedRegs<(sub CSR_AArch64_AAPCS, X19)>; 286*9880d681SAndroid Build Coastguard Worker 287*9880d681SAndroid Build Coastguard Worker// The function used by Darwin to obtain the address of a thread-local variable 288*9880d681SAndroid Build Coastguard Worker// guarantees more than a normal AAPCS function. x16 and x17 are used on the 289*9880d681SAndroid Build Coastguard Worker// fast path for calculation, but other registers except X0 (argument/return) 290*9880d681SAndroid Build Coastguard Worker// and LR (it is a call, after all) are preserved. 291*9880d681SAndroid Build Coastguard Workerdef CSR_AArch64_TLS_Darwin 292*9880d681SAndroid Build Coastguard Worker : CalleeSavedRegs<(add (sub (sequence "X%u", 1, 28), X16, X17), 293*9880d681SAndroid Build Coastguard Worker FP, 294*9880d681SAndroid Build Coastguard Worker (sequence "Q%u", 0, 31))>; 295*9880d681SAndroid Build Coastguard Worker 296*9880d681SAndroid Build Coastguard Worker// We can only handle a register pair with adjacent registers, the register pair 297*9880d681SAndroid Build Coastguard Worker// should belong to the same class as well. Since the access function on the 298*9880d681SAndroid Build Coastguard Worker// fast path calls a function that follows CSR_AArch64_TLS_Darwin, 299*9880d681SAndroid Build Coastguard Worker// CSR_AArch64_CXX_TLS_Darwin should be a subset of CSR_AArch64_TLS_Darwin. 300*9880d681SAndroid Build Coastguard Workerdef CSR_AArch64_CXX_TLS_Darwin 301*9880d681SAndroid Build Coastguard Worker : CalleeSavedRegs<(add CSR_AArch64_AAPCS, 302*9880d681SAndroid Build Coastguard Worker (sub (sequence "X%u", 1, 28), X15, X16, X17, X18), 303*9880d681SAndroid Build Coastguard Worker (sequence "D%u", 0, 31))>; 304*9880d681SAndroid Build Coastguard Worker 305*9880d681SAndroid Build Coastguard Worker// CSRs that are handled by prologue, epilogue. 306*9880d681SAndroid Build Coastguard Workerdef CSR_AArch64_CXX_TLS_Darwin_PE 307*9880d681SAndroid Build Coastguard Worker : CalleeSavedRegs<(add LR, FP)>; 308*9880d681SAndroid Build Coastguard Worker 309*9880d681SAndroid Build Coastguard Worker// CSRs that are handled explicitly via copies. 310*9880d681SAndroid Build Coastguard Workerdef CSR_AArch64_CXX_TLS_Darwin_ViaCopy 311*9880d681SAndroid Build Coastguard Worker : CalleeSavedRegs<(sub CSR_AArch64_CXX_TLS_Darwin, LR, FP)>; 312*9880d681SAndroid Build Coastguard Worker 313*9880d681SAndroid Build Coastguard Worker// The ELF stub used for TLS-descriptor access saves every feasible 314*9880d681SAndroid Build Coastguard Worker// register. Only X0 and LR are clobbered. 315*9880d681SAndroid Build Coastguard Workerdef CSR_AArch64_TLS_ELF 316*9880d681SAndroid Build Coastguard Worker : CalleeSavedRegs<(add (sequence "X%u", 1, 28), FP, 317*9880d681SAndroid Build Coastguard Worker (sequence "Q%u", 0, 31))>; 318*9880d681SAndroid Build Coastguard Worker 319*9880d681SAndroid Build Coastguard Workerdef CSR_AArch64_AllRegs 320*9880d681SAndroid Build Coastguard Worker : CalleeSavedRegs<(add (sequence "W%u", 0, 30), WSP, 321*9880d681SAndroid Build Coastguard Worker (sequence "X%u", 0, 28), FP, LR, SP, 322*9880d681SAndroid Build Coastguard Worker (sequence "B%u", 0, 31), (sequence "H%u", 0, 31), 323*9880d681SAndroid Build Coastguard Worker (sequence "S%u", 0, 31), (sequence "D%u", 0, 31), 324*9880d681SAndroid Build Coastguard Worker (sequence "Q%u", 0, 31))>; 325*9880d681SAndroid Build Coastguard Worker 326*9880d681SAndroid Build Coastguard Workerdef CSR_AArch64_NoRegs : CalleeSavedRegs<(add)>; 327*9880d681SAndroid Build Coastguard Worker 328*9880d681SAndroid Build Coastguard Workerdef CSR_AArch64_RT_MostRegs : CalleeSavedRegs<(add CSR_AArch64_AAPCS, 329*9880d681SAndroid Build Coastguard Worker (sequence "X%u", 9, 15))>; 330*9880d681SAndroid Build Coastguard Worker 331