1*9880d681SAndroid Build Coastguard Worker//===-- ARMCallingConv.td - Calling Conventions for ARM ----*- 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// This describes the calling conventions for ARM architecture. 10*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 11*9880d681SAndroid Build Coastguard Worker 12*9880d681SAndroid Build Coastguard Worker/// CCIfAlign - Match of the original alignment of the arg 13*9880d681SAndroid Build Coastguard Workerclass CCIfAlign<string Align, CCAction A>: 14*9880d681SAndroid Build Coastguard Worker CCIf<!strconcat("ArgFlags.getOrigAlign() == ", Align), A>; 15*9880d681SAndroid Build Coastguard Worker 16*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 17*9880d681SAndroid Build Coastguard Worker// ARM APCS Calling Convention 18*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 19*9880d681SAndroid Build Coastguard Workerdef CC_ARM_APCS : CallingConv<[ 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Worker // Handles byval parameters. 22*9880d681SAndroid Build Coastguard Worker CCIfByVal<CCPassByVal<4, 4>>, 23*9880d681SAndroid Build Coastguard Worker 24*9880d681SAndroid Build Coastguard Worker CCIfType<[i1, i8, i16], CCPromoteToType<i32>>, 25*9880d681SAndroid Build Coastguard Worker 26*9880d681SAndroid Build Coastguard Worker // Pass SwiftSelf in a callee saved register. 27*9880d681SAndroid Build Coastguard Worker CCIfSwiftSelf<CCIfType<[i32], CCAssignToReg<[R10]>>>, 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Worker // A SwiftError is passed in R6. 30*9880d681SAndroid Build Coastguard Worker CCIfSwiftError<CCIfType<[i32], CCAssignToReg<[R6]>>>, 31*9880d681SAndroid Build Coastguard Worker 32*9880d681SAndroid Build Coastguard Worker // Handle all vector types as either f64 or v2f64. 33*9880d681SAndroid Build Coastguard Worker CCIfType<[v1i64, v2i32, v4i16, v8i8, v2f32], CCBitConvertToType<f64>>, 34*9880d681SAndroid Build Coastguard Worker CCIfType<[v2i64, v4i32, v8i16, v16i8, v4f32], CCBitConvertToType<v2f64>>, 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Worker // f64 and v2f64 are passed in adjacent GPRs, possibly split onto the stack 37*9880d681SAndroid Build Coastguard Worker CCIfType<[f64, v2f64], CCCustom<"CC_ARM_APCS_Custom_f64">>, 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Worker CCIfType<[f32], CCBitConvertToType<i32>>, 40*9880d681SAndroid Build Coastguard Worker CCIfType<[i32], CCAssignToReg<[R0, R1, R2, R3]>>, 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Worker CCIfType<[i32], CCAssignToStack<4, 4>>, 43*9880d681SAndroid Build Coastguard Worker CCIfType<[f64], CCAssignToStack<8, 4>>, 44*9880d681SAndroid Build Coastguard Worker CCIfType<[v2f64], CCAssignToStack<16, 4>> 45*9880d681SAndroid Build Coastguard Worker]>; 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Workerdef RetCC_ARM_APCS : CallingConv<[ 48*9880d681SAndroid Build Coastguard Worker CCIfType<[i1, i8, i16], CCPromoteToType<i32>>, 49*9880d681SAndroid Build Coastguard Worker CCIfType<[f32], CCBitConvertToType<i32>>, 50*9880d681SAndroid Build Coastguard Worker 51*9880d681SAndroid Build Coastguard Worker // Pass SwiftSelf in a callee saved register. 52*9880d681SAndroid Build Coastguard Worker CCIfSwiftSelf<CCIfType<[i32], CCAssignToReg<[R10]>>>, 53*9880d681SAndroid Build Coastguard Worker 54*9880d681SAndroid Build Coastguard Worker // A SwiftError is returned in R6. 55*9880d681SAndroid Build Coastguard Worker CCIfSwiftError<CCIfType<[i32], CCAssignToReg<[R6]>>>, 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Worker // Handle all vector types as either f64 or v2f64. 58*9880d681SAndroid Build Coastguard Worker CCIfType<[v1i64, v2i32, v4i16, v8i8, v2f32], CCBitConvertToType<f64>>, 59*9880d681SAndroid Build Coastguard Worker CCIfType<[v2i64, v4i32, v8i16, v16i8, v4f32], CCBitConvertToType<v2f64>>, 60*9880d681SAndroid Build Coastguard Worker 61*9880d681SAndroid Build Coastguard Worker CCIfType<[f64, v2f64], CCCustom<"RetCC_ARM_APCS_Custom_f64">>, 62*9880d681SAndroid Build Coastguard Worker 63*9880d681SAndroid Build Coastguard Worker CCIfType<[i32], CCAssignToReg<[R0, R1, R2, R3]>>, 64*9880d681SAndroid Build Coastguard Worker CCIfType<[i64], CCAssignToRegWithShadow<[R0, R2], [R1, R3]>> 65*9880d681SAndroid Build Coastguard Worker]>; 66*9880d681SAndroid Build Coastguard Worker 67*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 68*9880d681SAndroid Build Coastguard Worker// ARM APCS Calling Convention for FastCC (when VFP2 or later is available) 69*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 70*9880d681SAndroid Build Coastguard Workerdef FastCC_ARM_APCS : CallingConv<[ 71*9880d681SAndroid Build Coastguard Worker // Handle all vector types as either f64 or v2f64. 72*9880d681SAndroid Build Coastguard Worker CCIfType<[v1i64, v2i32, v4i16, v8i8, v2f32], CCBitConvertToType<f64>>, 73*9880d681SAndroid Build Coastguard Worker CCIfType<[v2i64, v4i32, v8i16, v16i8, v4f32], CCBitConvertToType<v2f64>>, 74*9880d681SAndroid Build Coastguard Worker 75*9880d681SAndroid Build Coastguard Worker CCIfType<[v2f64], CCAssignToReg<[Q0, Q1, Q2, Q3]>>, 76*9880d681SAndroid Build Coastguard Worker CCIfType<[f64], CCAssignToReg<[D0, D1, D2, D3, D4, D5, D6, D7]>>, 77*9880d681SAndroid Build Coastguard Worker CCIfType<[f32], CCAssignToReg<[S0, S1, S2, S3, S4, S5, S6, S7, S8, 78*9880d681SAndroid Build Coastguard Worker S9, S10, S11, S12, S13, S14, S15]>>, 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Worker // CPRCs may be allocated to co-processor registers or the stack - they 81*9880d681SAndroid Build Coastguard Worker // may never be allocated to core registers. 82*9880d681SAndroid Build Coastguard Worker CCIfType<[f32], CCAssignToStackWithShadow<4, 4, [Q0, Q1, Q2, Q3]>>, 83*9880d681SAndroid Build Coastguard Worker CCIfType<[f64], CCAssignToStackWithShadow<8, 4, [Q0, Q1, Q2, Q3]>>, 84*9880d681SAndroid Build Coastguard Worker CCIfType<[v2f64], CCAssignToStackWithShadow<16, 4, [Q0, Q1, Q2, Q3]>>, 85*9880d681SAndroid Build Coastguard Worker 86*9880d681SAndroid Build Coastguard Worker CCDelegateTo<CC_ARM_APCS> 87*9880d681SAndroid Build Coastguard Worker]>; 88*9880d681SAndroid Build Coastguard Worker 89*9880d681SAndroid Build Coastguard Workerdef RetFastCC_ARM_APCS : CallingConv<[ 90*9880d681SAndroid Build Coastguard Worker // Handle all vector types as either f64 or v2f64. 91*9880d681SAndroid Build Coastguard Worker CCIfType<[v1i64, v2i32, v4i16, v8i8, v2f32], CCBitConvertToType<f64>>, 92*9880d681SAndroid Build Coastguard Worker CCIfType<[v2i64, v4i32, v8i16, v16i8, v4f32], CCBitConvertToType<v2f64>>, 93*9880d681SAndroid Build Coastguard Worker 94*9880d681SAndroid Build Coastguard Worker CCIfType<[v2f64], CCAssignToReg<[Q0, Q1, Q2, Q3]>>, 95*9880d681SAndroid Build Coastguard Worker CCIfType<[f64], CCAssignToReg<[D0, D1, D2, D3, D4, D5, D6, D7]>>, 96*9880d681SAndroid Build Coastguard Worker CCIfType<[f32], CCAssignToReg<[S0, S1, S2, S3, S4, S5, S6, S7, S8, 97*9880d681SAndroid Build Coastguard Worker S9, S10, S11, S12, S13, S14, S15]>>, 98*9880d681SAndroid Build Coastguard Worker CCDelegateTo<RetCC_ARM_APCS> 99*9880d681SAndroid Build Coastguard Worker]>; 100*9880d681SAndroid Build Coastguard Worker 101*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 102*9880d681SAndroid Build Coastguard Worker// ARM APCS Calling Convention for GHC 103*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 104*9880d681SAndroid Build Coastguard Worker 105*9880d681SAndroid Build Coastguard Workerdef CC_ARM_APCS_GHC : CallingConv<[ 106*9880d681SAndroid Build Coastguard Worker // Handle all vector types as either f64 or v2f64. 107*9880d681SAndroid Build Coastguard Worker CCIfType<[v1i64, v2i32, v4i16, v8i8, v2f32], CCBitConvertToType<f64>>, 108*9880d681SAndroid Build Coastguard Worker CCIfType<[v2i64, v4i32, v8i16, v16i8, v4f32], CCBitConvertToType<v2f64>>, 109*9880d681SAndroid Build Coastguard Worker 110*9880d681SAndroid Build Coastguard Worker CCIfType<[v2f64], CCAssignToReg<[Q4, Q5]>>, 111*9880d681SAndroid Build Coastguard Worker CCIfType<[f64], CCAssignToReg<[D8, D9, D10, D11]>>, 112*9880d681SAndroid Build Coastguard Worker CCIfType<[f32], CCAssignToReg<[S16, S17, S18, S19, S20, S21, S22, S23]>>, 113*9880d681SAndroid Build Coastguard Worker 114*9880d681SAndroid Build Coastguard Worker // Promote i8/i16 arguments to i32. 115*9880d681SAndroid Build Coastguard Worker CCIfType<[i8, i16], CCPromoteToType<i32>>, 116*9880d681SAndroid Build Coastguard Worker 117*9880d681SAndroid Build Coastguard Worker // Pass in STG registers: Base, Sp, Hp, R1, R2, R3, R4, SpLim 118*9880d681SAndroid Build Coastguard Worker CCIfType<[i32], CCAssignToReg<[R4, R5, R6, R7, R8, R9, R10, R11]>> 119*9880d681SAndroid Build Coastguard Worker]>; 120*9880d681SAndroid Build Coastguard Worker 121*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 122*9880d681SAndroid Build Coastguard Worker// ARM AAPCS (EABI) Calling Convention, common parts 123*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 124*9880d681SAndroid Build Coastguard Worker 125*9880d681SAndroid Build Coastguard Workerdef CC_ARM_AAPCS_Common : CallingConv<[ 126*9880d681SAndroid Build Coastguard Worker 127*9880d681SAndroid Build Coastguard Worker CCIfType<[i1, i8, i16], CCPromoteToType<i32>>, 128*9880d681SAndroid Build Coastguard Worker 129*9880d681SAndroid Build Coastguard Worker // i64/f64 is passed in even pairs of GPRs 130*9880d681SAndroid Build Coastguard Worker // i64 is 8-aligned i32 here, so we may need to eat R1 as a pad register 131*9880d681SAndroid Build Coastguard Worker // (and the same is true for f64 if VFP is not enabled) 132*9880d681SAndroid Build Coastguard Worker CCIfType<[i32], CCIfAlign<"8", CCAssignToRegWithShadow<[R0, R2], [R0, R1]>>>, 133*9880d681SAndroid Build Coastguard Worker CCIfType<[i32], CCIf<"ArgFlags.getOrigAlign() != 8", 134*9880d681SAndroid Build Coastguard Worker CCAssignToReg<[R0, R1, R2, R3]>>>, 135*9880d681SAndroid Build Coastguard Worker 136*9880d681SAndroid Build Coastguard Worker CCIfType<[i32], CCIfAlign<"8", CCAssignToStackWithShadow<4, 8, [R0, R1, R2, R3]>>>, 137*9880d681SAndroid Build Coastguard Worker CCIfType<[i32], CCAssignToStackWithShadow<4, 4, [R0, R1, R2, R3]>>, 138*9880d681SAndroid Build Coastguard Worker CCIfType<[f32], CCAssignToStackWithShadow<4, 4, [Q0, Q1, Q2, Q3]>>, 139*9880d681SAndroid Build Coastguard Worker CCIfType<[f64], CCAssignToStackWithShadow<8, 8, [Q0, Q1, Q2, Q3]>>, 140*9880d681SAndroid Build Coastguard Worker CCIfType<[v2f64], CCIfAlign<"16", 141*9880d681SAndroid Build Coastguard Worker CCAssignToStackWithShadow<16, 16, [Q0, Q1, Q2, Q3]>>>, 142*9880d681SAndroid Build Coastguard Worker CCIfType<[v2f64], CCAssignToStackWithShadow<16, 8, [Q0, Q1, Q2, Q3]>> 143*9880d681SAndroid Build Coastguard Worker]>; 144*9880d681SAndroid Build Coastguard Worker 145*9880d681SAndroid Build Coastguard Workerdef RetCC_ARM_AAPCS_Common : CallingConv<[ 146*9880d681SAndroid Build Coastguard Worker CCIfType<[i1, i8, i16], CCPromoteToType<i32>>, 147*9880d681SAndroid Build Coastguard Worker CCIfType<[i32], CCAssignToReg<[R0, R1, R2, R3]>>, 148*9880d681SAndroid Build Coastguard Worker CCIfType<[i64], CCAssignToRegWithShadow<[R0, R2], [R1, R3]>> 149*9880d681SAndroid Build Coastguard Worker]>; 150*9880d681SAndroid Build Coastguard Worker 151*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 152*9880d681SAndroid Build Coastguard Worker// ARM AAPCS (EABI) Calling Convention 153*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 154*9880d681SAndroid Build Coastguard Worker 155*9880d681SAndroid Build Coastguard Workerdef CC_ARM_AAPCS : CallingConv<[ 156*9880d681SAndroid Build Coastguard Worker // Handles byval parameters. 157*9880d681SAndroid Build Coastguard Worker CCIfByVal<CCPassByVal<4, 4>>, 158*9880d681SAndroid Build Coastguard Worker 159*9880d681SAndroid Build Coastguard Worker // The 'nest' parameter, if any, is passed in R12. 160*9880d681SAndroid Build Coastguard Worker CCIfNest<CCAssignToReg<[R12]>>, 161*9880d681SAndroid Build Coastguard Worker 162*9880d681SAndroid Build Coastguard Worker // Handle all vector types as either f64 or v2f64. 163*9880d681SAndroid Build Coastguard Worker CCIfType<[v1i64, v2i32, v4i16, v8i8, v2f32], CCBitConvertToType<f64>>, 164*9880d681SAndroid Build Coastguard Worker CCIfType<[v2i64, v4i32, v8i16, v16i8, v4f32], CCBitConvertToType<v2f64>>, 165*9880d681SAndroid Build Coastguard Worker 166*9880d681SAndroid Build Coastguard Worker // Pass SwiftSelf in a callee saved register. 167*9880d681SAndroid Build Coastguard Worker CCIfSwiftSelf<CCIfType<[i32], CCAssignToReg<[R10]>>>, 168*9880d681SAndroid Build Coastguard Worker 169*9880d681SAndroid Build Coastguard Worker // A SwiftError is passed in R6. 170*9880d681SAndroid Build Coastguard Worker CCIfSwiftError<CCIfType<[i32], CCAssignToReg<[R6]>>>, 171*9880d681SAndroid Build Coastguard Worker 172*9880d681SAndroid Build Coastguard Worker CCIfType<[f64, v2f64], CCCustom<"CC_ARM_AAPCS_Custom_f64">>, 173*9880d681SAndroid Build Coastguard Worker CCIfType<[f32], CCBitConvertToType<i32>>, 174*9880d681SAndroid Build Coastguard Worker CCDelegateTo<CC_ARM_AAPCS_Common> 175*9880d681SAndroid Build Coastguard Worker]>; 176*9880d681SAndroid Build Coastguard Worker 177*9880d681SAndroid Build Coastguard Workerdef RetCC_ARM_AAPCS : CallingConv<[ 178*9880d681SAndroid Build Coastguard Worker // Handle all vector types as either f64 or v2f64. 179*9880d681SAndroid Build Coastguard Worker CCIfType<[v1i64, v2i32, v4i16, v8i8, v2f32], CCBitConvertToType<f64>>, 180*9880d681SAndroid Build Coastguard Worker CCIfType<[v2i64, v4i32, v8i16, v16i8, v4f32], CCBitConvertToType<v2f64>>, 181*9880d681SAndroid Build Coastguard Worker 182*9880d681SAndroid Build Coastguard Worker // Pass SwiftSelf in a callee saved register. 183*9880d681SAndroid Build Coastguard Worker CCIfSwiftSelf<CCIfType<[i32], CCAssignToReg<[R10]>>>, 184*9880d681SAndroid Build Coastguard Worker 185*9880d681SAndroid Build Coastguard Worker // A SwiftError is returned in R6. 186*9880d681SAndroid Build Coastguard Worker CCIfSwiftError<CCIfType<[i32], CCAssignToReg<[R6]>>>, 187*9880d681SAndroid Build Coastguard Worker 188*9880d681SAndroid Build Coastguard Worker CCIfType<[f64, v2f64], CCCustom<"RetCC_ARM_AAPCS_Custom_f64">>, 189*9880d681SAndroid Build Coastguard Worker CCIfType<[f32], CCBitConvertToType<i32>>, 190*9880d681SAndroid Build Coastguard Worker CCDelegateTo<RetCC_ARM_AAPCS_Common> 191*9880d681SAndroid Build Coastguard Worker]>; 192*9880d681SAndroid Build Coastguard Worker 193*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 194*9880d681SAndroid Build Coastguard Worker// ARM AAPCS-VFP (EABI) Calling Convention 195*9880d681SAndroid Build Coastguard Worker// Also used for FastCC (when VFP2 or later is available) 196*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 197*9880d681SAndroid Build Coastguard Worker 198*9880d681SAndroid Build Coastguard Workerdef CC_ARM_AAPCS_VFP : CallingConv<[ 199*9880d681SAndroid Build Coastguard Worker // Handles byval parameters. 200*9880d681SAndroid Build Coastguard Worker CCIfByVal<CCPassByVal<4, 4>>, 201*9880d681SAndroid Build Coastguard Worker 202*9880d681SAndroid Build Coastguard Worker // Handle all vector types as either f64 or v2f64. 203*9880d681SAndroid Build Coastguard Worker CCIfType<[v1i64, v2i32, v4i16, v8i8, v2f32], CCBitConvertToType<f64>>, 204*9880d681SAndroid Build Coastguard Worker CCIfType<[v2i64, v4i32, v8i16, v16i8, v4f32], CCBitConvertToType<v2f64>>, 205*9880d681SAndroid Build Coastguard Worker 206*9880d681SAndroid Build Coastguard Worker // Pass SwiftSelf in a callee saved register. 207*9880d681SAndroid Build Coastguard Worker CCIfSwiftSelf<CCIfType<[i32], CCAssignToReg<[R10]>>>, 208*9880d681SAndroid Build Coastguard Worker 209*9880d681SAndroid Build Coastguard Worker // A SwiftError is passed in R6. 210*9880d681SAndroid Build Coastguard Worker CCIfSwiftError<CCIfType<[i32], CCAssignToReg<[R6]>>>, 211*9880d681SAndroid Build Coastguard Worker 212*9880d681SAndroid Build Coastguard Worker // HFAs are passed in a contiguous block of registers, or on the stack 213*9880d681SAndroid Build Coastguard Worker CCIfConsecutiveRegs<CCCustom<"CC_ARM_AAPCS_Custom_Aggregate">>, 214*9880d681SAndroid Build Coastguard Worker 215*9880d681SAndroid Build Coastguard Worker CCIfType<[v2f64], CCAssignToReg<[Q0, Q1, Q2, Q3]>>, 216*9880d681SAndroid Build Coastguard Worker CCIfType<[f64], CCAssignToReg<[D0, D1, D2, D3, D4, D5, D6, D7]>>, 217*9880d681SAndroid Build Coastguard Worker CCIfType<[f32], CCAssignToReg<[S0, S1, S2, S3, S4, S5, S6, S7, S8, 218*9880d681SAndroid Build Coastguard Worker S9, S10, S11, S12, S13, S14, S15]>>, 219*9880d681SAndroid Build Coastguard Worker CCDelegateTo<CC_ARM_AAPCS_Common> 220*9880d681SAndroid Build Coastguard Worker]>; 221*9880d681SAndroid Build Coastguard Worker 222*9880d681SAndroid Build Coastguard Workerdef RetCC_ARM_AAPCS_VFP : CallingConv<[ 223*9880d681SAndroid Build Coastguard Worker // Handle all vector types as either f64 or v2f64. 224*9880d681SAndroid Build Coastguard Worker CCIfType<[v1i64, v2i32, v4i16, v8i8, v2f32], CCBitConvertToType<f64>>, 225*9880d681SAndroid Build Coastguard Worker CCIfType<[v2i64, v4i32, v8i16, v16i8, v4f32], CCBitConvertToType<v2f64>>, 226*9880d681SAndroid Build Coastguard Worker 227*9880d681SAndroid Build Coastguard Worker // Pass SwiftSelf in a callee saved register. 228*9880d681SAndroid Build Coastguard Worker CCIfSwiftSelf<CCIfType<[i32], CCAssignToReg<[R10]>>>, 229*9880d681SAndroid Build Coastguard Worker 230*9880d681SAndroid Build Coastguard Worker // A SwiftError is returned in R6. 231*9880d681SAndroid Build Coastguard Worker CCIfSwiftError<CCIfType<[i32], CCAssignToReg<[R6]>>>, 232*9880d681SAndroid Build Coastguard Worker 233*9880d681SAndroid Build Coastguard Worker CCIfType<[v2f64], CCAssignToReg<[Q0, Q1, Q2, Q3]>>, 234*9880d681SAndroid Build Coastguard Worker CCIfType<[f64], CCAssignToReg<[D0, D1, D2, D3, D4, D5, D6, D7]>>, 235*9880d681SAndroid Build Coastguard Worker CCIfType<[f32], CCAssignToReg<[S0, S1, S2, S3, S4, S5, S6, S7, S8, 236*9880d681SAndroid Build Coastguard Worker S9, S10, S11, S12, S13, S14, S15]>>, 237*9880d681SAndroid Build Coastguard Worker CCDelegateTo<RetCC_ARM_AAPCS_Common> 238*9880d681SAndroid Build Coastguard Worker]>; 239*9880d681SAndroid Build Coastguard Worker 240*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 241*9880d681SAndroid Build Coastguard Worker// Callee-saved register lists. 242*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 243*9880d681SAndroid Build Coastguard Worker 244*9880d681SAndroid Build Coastguard Workerdef CSR_NoRegs : CalleeSavedRegs<(add)>; 245*9880d681SAndroid Build Coastguard Worker 246*9880d681SAndroid Build Coastguard Workerdef CSR_AAPCS : CalleeSavedRegs<(add LR, R11, R10, R9, R8, R7, R6, R5, R4, 247*9880d681SAndroid Build Coastguard Worker (sequence "D%u", 15, 8))>; 248*9880d681SAndroid Build Coastguard Worker 249*9880d681SAndroid Build Coastguard Worker// The order of callee-saved registers needs to match the order we actually push 250*9880d681SAndroid Build Coastguard Worker// them in FrameLowering, because this order is what's used by 251*9880d681SAndroid Build Coastguard Worker// PrologEpilogInserter to allocate frame index slots. So when R7 is the frame 252*9880d681SAndroid Build Coastguard Worker// pointer, we use this AAPCS alternative. 253*9880d681SAndroid Build Coastguard Workerdef CSR_AAPCS_SplitPush : CalleeSavedRegs<(add LR, R7, R6, R5, R4, 254*9880d681SAndroid Build Coastguard Worker R11, R10, R9, R8, 255*9880d681SAndroid Build Coastguard Worker (sequence "D%u", 15, 8))>; 256*9880d681SAndroid Build Coastguard Worker 257*9880d681SAndroid Build Coastguard Worker// Constructors and destructors return 'this' in the ARM C++ ABI; since 'this' 258*9880d681SAndroid Build Coastguard Worker// and the pointer return value are both passed in R0 in these cases, this can 259*9880d681SAndroid Build Coastguard Worker// be partially modelled by treating R0 as a callee-saved register 260*9880d681SAndroid Build Coastguard Worker// Only the resulting RegMask is used; the SaveList is ignored 261*9880d681SAndroid Build Coastguard Workerdef CSR_AAPCS_ThisReturn : CalleeSavedRegs<(add LR, R11, R10, R9, R8, R7, R6, 262*9880d681SAndroid Build Coastguard Worker R5, R4, (sequence "D%u", 15, 8), 263*9880d681SAndroid Build Coastguard Worker R0)>; 264*9880d681SAndroid Build Coastguard Worker 265*9880d681SAndroid Build Coastguard Worker// iOS ABI deviates from ARM standard ABI. R9 is not a callee-saved register. 266*9880d681SAndroid Build Coastguard Worker// Also save R7-R4 first to match the stack frame fixed spill areas. 267*9880d681SAndroid Build Coastguard Workerdef CSR_iOS : CalleeSavedRegs<(add LR, R7, R6, R5, R4, (sub CSR_AAPCS, R9))>; 268*9880d681SAndroid Build Coastguard Worker 269*9880d681SAndroid Build Coastguard Worker// R6 is used to pass swifterror, remove it from CSR. 270*9880d681SAndroid Build Coastguard Workerdef CSR_iOS_SwiftError : CalleeSavedRegs<(sub CSR_iOS, R6)>; 271*9880d681SAndroid Build Coastguard Worker 272*9880d681SAndroid Build Coastguard Workerdef CSR_iOS_ThisReturn : CalleeSavedRegs<(add LR, R7, R6, R5, R4, 273*9880d681SAndroid Build Coastguard Worker (sub CSR_AAPCS_ThisReturn, R9))>; 274*9880d681SAndroid Build Coastguard Worker 275*9880d681SAndroid Build Coastguard Workerdef CSR_iOS_TLSCall : CalleeSavedRegs<(add LR, SP, 276*9880d681SAndroid Build Coastguard Worker (sequence "R%u", 12, 1), 277*9880d681SAndroid Build Coastguard Worker (sequence "D%u", 31, 0))>; 278*9880d681SAndroid Build Coastguard Worker 279*9880d681SAndroid Build Coastguard Worker// C++ TLS access function saves all registers except SP. Try to match 280*9880d681SAndroid Build Coastguard Worker// the order of CSRs in CSR_iOS. 281*9880d681SAndroid Build Coastguard Workerdef CSR_iOS_CXX_TLS : CalleeSavedRegs<(add CSR_iOS, (sequence "R%u", 12, 1), 282*9880d681SAndroid Build Coastguard Worker (sequence "D%u", 31, 0))>; 283*9880d681SAndroid Build Coastguard Worker 284*9880d681SAndroid Build Coastguard Worker// CSRs that are handled by prologue, epilogue. 285*9880d681SAndroid Build Coastguard Workerdef CSR_iOS_CXX_TLS_PE : CalleeSavedRegs<(add LR, R12, R11, R7, R5, R4)>; 286*9880d681SAndroid Build Coastguard Worker 287*9880d681SAndroid Build Coastguard Worker// CSRs that are handled explicitly via copies. 288*9880d681SAndroid Build Coastguard Workerdef CSR_iOS_CXX_TLS_ViaCopy : CalleeSavedRegs<(sub CSR_iOS_CXX_TLS, 289*9880d681SAndroid Build Coastguard Worker CSR_iOS_CXX_TLS_PE)>; 290*9880d681SAndroid Build Coastguard Worker 291*9880d681SAndroid Build Coastguard Worker// The "interrupt" attribute is used to generate code that is acceptable in 292*9880d681SAndroid Build Coastguard Worker// exception-handlers of various kinds. It makes us use a different return 293*9880d681SAndroid Build Coastguard Worker// instruction (handled elsewhere) and affects which registers we must return to 294*9880d681SAndroid Build Coastguard Worker// our "caller" in the same state as we receive them. 295*9880d681SAndroid Build Coastguard Worker 296*9880d681SAndroid Build Coastguard Worker// For most interrupts, all registers except SP and LR are shared with 297*9880d681SAndroid Build Coastguard Worker// user-space. We mark LR to be saved anyway, since this is what the ARM backend 298*9880d681SAndroid Build Coastguard Worker// generally does rather than tracking its liveness as a normal register. 299*9880d681SAndroid Build Coastguard Workerdef CSR_GenericInt : CalleeSavedRegs<(add LR, (sequence "R%u", 12, 0))>; 300*9880d681SAndroid Build Coastguard Worker 301*9880d681SAndroid Build Coastguard Worker// The fast interrupt handlers have more private state and get their own copies 302*9880d681SAndroid Build Coastguard Worker// of R8-R12, in addition to SP and LR. As before, mark LR for saving too. 303*9880d681SAndroid Build Coastguard Worker 304*9880d681SAndroid Build Coastguard Worker// FIXME: we mark R11 as callee-saved since it's often the frame-pointer, and 305*9880d681SAndroid Build Coastguard Worker// current frame lowering expects to encounter it while processing callee-saved 306*9880d681SAndroid Build Coastguard Worker// registers. 307*9880d681SAndroid Build Coastguard Workerdef CSR_FIQ : CalleeSavedRegs<(add LR, R11, (sequence "R%u", 7, 0))>; 308*9880d681SAndroid Build Coastguard Worker 309*9880d681SAndroid Build Coastguard Worker 310