AArch64ISelLowering.h revision f04a4d74b86733b853b7445ab6d5a3bde025a30d
1//==-- AArch64ISelLowering.h - AArch64 DAG Lowering Interface ----*- C++ -*-==// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file defines the interfaces that AArch64 uses to lower LLVM code into a 11// selection DAG. 12// 13//===----------------------------------------------------------------------===// 14 15#ifndef LLVM_TARGET_AARCH64_ISELLOWERING_H 16#define LLVM_TARGET_AARCH64_ISELLOWERING_H 17 18#include "Utils/AArch64BaseInfo.h" 19#include "llvm/CodeGen/CallingConvLower.h" 20#include "llvm/CodeGen/SelectionDAG.h" 21#include "llvm/Target/TargetLowering.h" 22#include "llvm/IR/Intrinsics.h" 23 24namespace llvm { 25namespace AArch64ISD { 26 enum NodeType { 27 // Start the numbering from where ISD NodeType finishes. 28 FIRST_NUMBER = ISD::BUILTIN_OP_END, 29 30 // This is a conditional branch which also notes the flag needed 31 // (eq/sgt/...). A64 puts this information on the branches rather than 32 // compares as LLVM does. 33 BR_CC, 34 35 // A node to be selected to an actual call operation: either BL or BLR in 36 // the absence of tail calls. 37 Call, 38 39 // Indicates a floating-point immediate which fits into the format required 40 // by the FMOV instructions. First (and only) operand is the 8-bit encoded 41 // value of that immediate. 42 FPMOV, 43 44 // Corresponds directly to an EXTR instruction. Operands are an LHS an RHS 45 // and an LSB. 46 EXTR, 47 48 // Wraps a load from the GOT, which should always be performed with a 64-bit 49 // load instruction. This prevents the DAG combiner folding a truncate to 50 // form a smaller memory access. 51 GOTLoad, 52 53 // Performs a bitfield insert. Arguments are: the value being inserted into; 54 // the value being inserted; least significant bit changed; width of the 55 // field. 56 BFI, 57 58 // Simply a convenient node inserted during ISelLowering to represent 59 // procedure return. Will almost certainly be selected to "RET". 60 Ret, 61 62 /// Extracts a field of contiguous bits from the source and sign extends 63 /// them into a single register. Arguments are: source; immr; imms. Note 64 /// these are pre-encoded since DAG matching can't cope with combining LSB 65 /// and Width into these values itself. 66 SBFX, 67 68 /// This is an A64-ification of the standard LLVM SELECT_CC operation. The 69 /// main difference is that it only has the values and an A64 condition, 70 /// which will be produced by a setcc instruction. 71 SELECT_CC, 72 73 /// This serves most of the functions of the LLVM SETCC instruction, for two 74 /// purposes. First, it prevents optimisations from fiddling with the 75 /// compare after we've moved the CondCode information onto the SELECT_CC or 76 /// BR_CC instructions. Second, it gives a legal instruction for the actual 77 /// comparison. 78 /// 79 /// It keeps a record of the condition flags asked for because certain 80 /// instructions are only valid for a subset of condition codes. 81 SETCC, 82 83 // Designates a node which is a tail call: both a call and a return 84 // instruction as far as selction is concerned. It should be selected to an 85 // unconditional branch. Has the usual plethora of call operands, but: 1st 86 // is callee, 2nd is stack adjustment required immediately before branch. 87 TC_RETURN, 88 89 // Designates a call used to support the TLS descriptor ABI. The call itself 90 // will be indirect ("BLR xN") but a relocation-specifier (".tlsdesccall 91 // var") must be attached somehow during code generation. It takes two 92 // operands: the callee and the symbol to be relocated against. 93 TLSDESCCALL, 94 95 // Leaf node which will be lowered to an appropriate MRS to obtain the 96 // thread pointer: TPIDR_EL0. 97 THREAD_POINTER, 98 99 /// Extracts a field of contiguous bits from the source and zero extends 100 /// them into a single register. Arguments are: source; immr; imms. Note 101 /// these are pre-encoded since DAG matching can't cope with combining LSB 102 /// and Width into these values itself. 103 UBFX, 104 105 // Wraps an address which the ISelLowering phase has decided should be 106 // created using the large memory model style: i.e. a sequence of four 107 // movz/movk instructions. 108 WrapperLarge, 109 110 // Wraps an address which the ISelLowering phase has decided should be 111 // created using the small memory model style: i.e. adrp/add or 112 // adrp/mem-op. This exists to prevent bare TargetAddresses which may never 113 // get selected. 114 WrapperSmall, 115 116 // Vector bitwise select 117 NEON_BSL, 118 119 // Vector move immediate 120 NEON_MOVIMM, 121 122 // Vector Move Inverted Immediate 123 NEON_MVNIMM, 124 125 // Vector FP move immediate 126 NEON_FMOVIMM, 127 128 // Vector permute 129 NEON_UZP1, 130 NEON_UZP2, 131 NEON_ZIP1, 132 NEON_ZIP2, 133 NEON_TRN1, 134 NEON_TRN2, 135 136 // Vector Element reverse 137 NEON_REV64, 138 NEON_REV32, 139 NEON_REV16, 140 141 // Vector compare 142 NEON_CMP, 143 144 // Vector compare zero 145 NEON_CMPZ, 146 147 // Vector compare bitwise test 148 NEON_TST, 149 150 // Vector saturating shift 151 NEON_QSHLs, 152 NEON_QSHLu, 153 154 // Vector dup 155 NEON_VDUP, 156 157 // Vector dup by lane 158 NEON_VDUPLANE, 159 160 // Vector extract 161 NEON_VEXTRACT, 162 163 // NEON duplicate lane loads 164 NEON_LD2DUP = ISD::FIRST_TARGET_MEMORY_OPCODE, 165 NEON_LD3DUP, 166 NEON_LD4DUP, 167 168 // NEON loads with post-increment base updates: 169 NEON_LD1_UPD, 170 NEON_LD2_UPD, 171 NEON_LD3_UPD, 172 NEON_LD4_UPD, 173 NEON_LD1x2_UPD, 174 NEON_LD1x3_UPD, 175 NEON_LD1x4_UPD, 176 177 // NEON stores with post-increment base updates: 178 NEON_ST1_UPD, 179 NEON_ST2_UPD, 180 NEON_ST3_UPD, 181 NEON_ST4_UPD, 182 NEON_ST1x2_UPD, 183 NEON_ST1x3_UPD, 184 NEON_ST1x4_UPD, 185 186 // NEON duplicate lane loads with post-increment base updates: 187 NEON_LD2DUP_UPD, 188 NEON_LD3DUP_UPD, 189 NEON_LD4DUP_UPD, 190 191 // NEON lane loads with post-increment base updates: 192 NEON_LD2LN_UPD, 193 NEON_LD3LN_UPD, 194 NEON_LD4LN_UPD, 195 196 // NEON lane store with post-increment base updates: 197 NEON_ST2LN_UPD, 198 NEON_ST3LN_UPD, 199 NEON_ST4LN_UPD 200 }; 201} 202 203 204class AArch64Subtarget; 205class AArch64TargetMachine; 206 207class AArch64TargetLowering : public TargetLowering { 208public: 209 explicit AArch64TargetLowering(AArch64TargetMachine &TM); 210 211 const char *getTargetNodeName(unsigned Opcode) const; 212 213 CCAssignFn *CCAssignFnForNode(CallingConv::ID CC) const; 214 215 SDValue LowerFormalArguments(SDValue Chain, 216 CallingConv::ID CallConv, bool isVarArg, 217 const SmallVectorImpl<ISD::InputArg> &Ins, 218 SDLoc dl, SelectionDAG &DAG, 219 SmallVectorImpl<SDValue> &InVals) const; 220 221 SDValue LowerReturn(SDValue Chain, 222 CallingConv::ID CallConv, bool isVarArg, 223 const SmallVectorImpl<ISD::OutputArg> &Outs, 224 const SmallVectorImpl<SDValue> &OutVals, 225 SDLoc dl, SelectionDAG &DAG) const; 226 227 SDValue LowerCall(CallLoweringInfo &CLI, 228 SmallVectorImpl<SDValue> &InVals) const; 229 230 SDValue LowerCallResult(SDValue Chain, SDValue InFlag, 231 CallingConv::ID CallConv, bool IsVarArg, 232 const SmallVectorImpl<ISD::InputArg> &Ins, 233 SDLoc dl, SelectionDAG &DAG, 234 SmallVectorImpl<SDValue> &InVals) const; 235 236 bool isKnownShuffleVector(SDValue Op, SelectionDAG &DAG, SDValue &Res) const; 237 238 SDValue LowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG, 239 const AArch64Subtarget *ST) const; 240 241 SDValue LowerVECTOR_SHUFFLE(SDValue Op, SelectionDAG &DAG) const; 242 243 void SaveVarArgRegisters(CCState &CCInfo, SelectionDAG &DAG, SDLoc DL, 244 SDValue &Chain) const; 245 246 /// IsEligibleForTailCallOptimization - Check whether the call is eligible 247 /// for tail call optimization. Targets which want to do tail call 248 /// optimization should implement this function. 249 bool IsEligibleForTailCallOptimization(SDValue Callee, 250 CallingConv::ID CalleeCC, 251 bool IsVarArg, 252 bool IsCalleeStructRet, 253 bool IsCallerStructRet, 254 const SmallVectorImpl<ISD::OutputArg> &Outs, 255 const SmallVectorImpl<SDValue> &OutVals, 256 const SmallVectorImpl<ISD::InputArg> &Ins, 257 SelectionDAG& DAG) const; 258 259 /// Finds the incoming stack arguments which overlap the given fixed stack 260 /// object and incorporates their load into the current chain. This prevents 261 /// an upcoming store from clobbering the stack argument before it's used. 262 SDValue addTokenForArgument(SDValue Chain, SelectionDAG &DAG, 263 MachineFrameInfo *MFI, int ClobberedFI) const; 264 265 EVT getSetCCResultType(LLVMContext &Context, EVT VT) const; 266 267 bool DoesCalleeRestoreStack(CallingConv::ID CallCC, bool TailCallOpt) const; 268 269 bool IsTailCallConvention(CallingConv::ID CallCC) const; 270 271 SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const; 272 273 bool isLegalICmpImmediate(int64_t Val) const; 274 SDValue getSelectableIntSetCC(SDValue LHS, SDValue RHS, ISD::CondCode CC, 275 SDValue &A64cc, SelectionDAG &DAG, SDLoc &dl) const; 276 277 virtual MachineBasicBlock * 278 EmitInstrWithCustomInserter(MachineInstr *MI, MachineBasicBlock *MBB) const; 279 280 MachineBasicBlock * 281 emitAtomicBinary(MachineInstr *MI, MachineBasicBlock *MBB, 282 unsigned Size, unsigned Opcode) const; 283 284 MachineBasicBlock * 285 emitAtomicBinaryMinMax(MachineInstr *MI, MachineBasicBlock *BB, 286 unsigned Size, unsigned CmpOp, 287 A64CC::CondCodes Cond) const; 288 MachineBasicBlock * 289 emitAtomicCmpSwap(MachineInstr *MI, MachineBasicBlock *BB, 290 unsigned Size) const; 291 292 MachineBasicBlock * 293 EmitF128CSEL(MachineInstr *MI, MachineBasicBlock *MBB) const; 294 295 SDValue LowerATOMIC_FENCE(SDValue Op, SelectionDAG &DAG) const; 296 SDValue LowerATOMIC_STORE(SDValue Op, SelectionDAG &DAG) const; 297 SDValue LowerBlockAddress(SDValue Op, SelectionDAG &DAG) const; 298 SDValue LowerBRCOND(SDValue Op, SelectionDAG &DAG) const; 299 SDValue LowerBR_CC(SDValue Op, SelectionDAG &DAG) const; 300 SDValue LowerF128ToCall(SDValue Op, SelectionDAG &DAG, 301 RTLIB::Libcall Call) const; 302 SDValue LowerFP_EXTEND(SDValue Op, SelectionDAG &DAG) const; 303 SDValue LowerFP_ROUND(SDValue Op, SelectionDAG &DAG) const; 304 SDValue LowerFP_TO_INT(SDValue Op, SelectionDAG &DAG, bool IsSigned) const; 305 SDValue LowerRETURNADDR(SDValue Op, SelectionDAG &DAG) const; 306 SDValue LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const; 307 308 SDValue LowerGlobalAddressELFSmall(SDValue Op, SelectionDAG &DAG) const; 309 SDValue LowerGlobalAddressELFLarge(SDValue Op, SelectionDAG &DAG) const; 310 SDValue LowerGlobalAddressELF(SDValue Op, SelectionDAG &DAG) const; 311 312 SDValue LowerTLSDescCall(SDValue SymAddr, SDValue DescAddr, SDLoc DL, 313 SelectionDAG &DAG) const; 314 SDValue LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const; 315 SDValue LowerINT_TO_FP(SDValue Op, SelectionDAG &DAG, bool IsSigned) const; 316 SDValue LowerJumpTable(SDValue Op, SelectionDAG &DAG) const; 317 SDValue LowerSELECT(SDValue Op, SelectionDAG &DAG) const; 318 SDValue LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const; 319 SDValue LowerSETCC(SDValue Op, SelectionDAG &DAG) const; 320 SDValue LowerVACOPY(SDValue Op, SelectionDAG &DAG) const; 321 SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG) const; 322 323 virtual SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const; 324 325 /// isFMAFasterThanFMulAndFAdd - Return true if an FMA operation is faster 326 /// than a pair of fmul and fadd instructions. fmuladd intrinsics will be 327 /// expanded to FMAs when this method returns true, otherwise fmuladd is 328 /// expanded to fmul + fadd. 329 virtual bool isFMAFasterThanFMulAndFAdd(EVT VT) const; 330 331 ConstraintType getConstraintType(const std::string &Constraint) const; 332 333 ConstraintWeight getSingleConstraintMatchWeight(AsmOperandInfo &Info, 334 const char *Constraint) const; 335 void LowerAsmOperandForConstraint(SDValue Op, 336 std::string &Constraint, 337 std::vector<SDValue> &Ops, 338 SelectionDAG &DAG) const; 339 340 std::pair<unsigned, const TargetRegisterClass*> 341 getRegForInlineAsmConstraint(const std::string &Constraint, MVT VT) const; 342 343 virtual bool getTgtMemIntrinsic(IntrinsicInfo &Info, const CallInst &I, 344 unsigned Intrinsic) const LLVM_OVERRIDE; 345 346protected: 347 std::pair<const TargetRegisterClass*, uint8_t> 348 findRepresentativeClass(MVT VT) const; 349 350private: 351 const InstrItineraryData *Itins; 352 353 const AArch64Subtarget *getSubtarget() const { 354 return &getTargetMachine().getSubtarget<AArch64Subtarget>(); 355 } 356}; 357enum NeonModImmType { 358 Neon_Mov_Imm, 359 Neon_Mvn_Imm 360}; 361 362extern SDValue ScanBUILD_VECTOR(SDValue Op, bool &isOnlyLowElement, 363 bool &usesOnlyOneValue, bool &hasDominantValue, 364 bool &isConstant, bool &isUNDEF); 365} // namespace llvm 366 367#endif // LLVM_TARGET_AARCH64_ISELLOWERING_H 368