blob: 6cbc425e71ff43a7e52b6fa5d371330091dc0784 [file] [log] [blame]
Tim Northover3b0846e2014-05-24 12:50:23 +00001//==-- 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
Benjamin Kramera7c40ef2014-08-13 16:26:38 +000015#ifndef LLVM_LIB_TARGET_AARCH64_AARCH64ISELLOWERING_H
16#define LLVM_LIB_TARGET_AARCH64_AARCH64ISELLOWERING_H
Tim Northover3b0846e2014-05-24 12:50:23 +000017
18#include "llvm/CodeGen/CallingConvLower.h"
19#include "llvm/CodeGen/SelectionDAG.h"
20#include "llvm/IR/CallingConv.h"
21#include "llvm/Target/TargetLowering.h"
22
23namespace llvm {
24
25namespace AArch64ISD {
26
27enum {
28 FIRST_NUMBER = ISD::BUILTIN_OP_END,
29 WrapperLarge, // 4-instruction MOVZ/MOVK sequence for 64-bit addresses.
30 CALL, // Function call.
31
32 // Almost the same as a normal call node, except that a TLSDesc relocation is
33 // needed so the linker can relax it correctly if possible.
34 TLSDESC_CALL,
35 ADRP, // Page address of a TargetGlobalAddress operand.
36 ADDlow, // Add the low 12 bits of a TargetGlobalAddress operand.
37 LOADgot, // Load from automatically generated descriptor (e.g. Global
38 // Offset Table, TLS record).
39 RET_FLAG, // Return with a flag operand. Operand 0 is the chain operand.
40 BRCOND, // Conditional branch instruction; "b.cond".
41 CSEL,
42 FCSEL, // Conditional move instruction.
43 CSINV, // Conditional select invert.
44 CSNEG, // Conditional select negate.
45 CSINC, // Conditional select increment.
46
47 // Pointer to the thread's local storage area. Materialised from TPIDR_EL0 on
48 // ELF.
49 THREAD_POINTER,
50 ADC,
51 SBC, // adc, sbc instructions
52
53 // Arithmetic instructions which write flags.
54 ADDS,
55 SUBS,
56 ADCS,
57 SBCS,
58 ANDS,
59
60 // Floating point comparison
61 FCMP,
62
63 // Floating point max and min instructions.
64 FMAX,
65 FMIN,
66
67 // Scalar extract
68 EXTR,
69
70 // Scalar-to-vector duplication
71 DUP,
72 DUPLANE8,
73 DUPLANE16,
74 DUPLANE32,
75 DUPLANE64,
76
77 // Vector immedate moves
78 MOVI,
79 MOVIshift,
80 MOVIedit,
81 MOVImsl,
82 FMOV,
83 MVNIshift,
84 MVNImsl,
85
86 // Vector immediate ops
87 BICi,
88 ORRi,
89
90 // Vector bit select: similar to ISD::VSELECT but not all bits within an
91 // element must be identical.
92 BSL,
93
94 // Vector arithmetic negation
95 NEG,
96
97 // Vector shuffles
98 ZIP1,
99 ZIP2,
100 UZP1,
101 UZP2,
102 TRN1,
103 TRN2,
104 REV16,
105 REV32,
106 REV64,
107 EXT,
108
109 // Vector shift by scalar
110 VSHL,
111 VLSHR,
112 VASHR,
113
114 // Vector shift by scalar (again)
115 SQSHL_I,
116 UQSHL_I,
117 SQSHLU_I,
118 SRSHR_I,
119 URSHR_I,
120
121 // Vector comparisons
122 CMEQ,
123 CMGE,
124 CMGT,
125 CMHI,
126 CMHS,
127 FCMEQ,
128 FCMGE,
129 FCMGT,
130
131 // Vector zero comparisons
132 CMEQz,
133 CMGEz,
134 CMGTz,
135 CMLEz,
136 CMLTz,
137 FCMEQz,
138 FCMGEz,
139 FCMGTz,
140 FCMLEz,
141 FCMLTz,
142
143 // Vector bitwise negation
144 NOT,
145
146 // Vector bitwise selection
147 BIT,
148
149 // Compare-and-branch
150 CBZ,
151 CBNZ,
152 TBZ,
153 TBNZ,
154
155 // Tail calls
156 TC_RETURN,
157
158 // Custom prefetch handling
159 PREFETCH,
160
161 // {s|u}int to FP within a FP register.
162 SITOF,
163 UITOF,
164
Tim Northoverbb72e6c2014-09-04 09:46:14 +0000165 /// Natural vector cast. ISD::BITCAST is not natural in the big-endian
166 /// world w.r.t vectors; which causes additional REV instructions to be
167 /// generated to compensate for the byte-swapping. But sometimes we do
168 /// need to re-interpret the data in SIMD vector registers in big-endian
169 /// mode without emitting such REV instructions.
170 NVCAST,
171
Chad Rosierd9d0f862014-10-08 02:31:24 +0000172 SMULL,
173 UMULL,
174
Tim Northover3b0846e2014-05-24 12:50:23 +0000175 // NEON Load/Store with post-increment base updates
176 LD2post = ISD::FIRST_TARGET_MEMORY_OPCODE,
177 LD3post,
178 LD4post,
179 ST2post,
180 ST3post,
181 ST4post,
182 LD1x2post,
183 LD1x3post,
184 LD1x4post,
185 ST1x2post,
186 ST1x3post,
187 ST1x4post,
188 LD1DUPpost,
189 LD2DUPpost,
190 LD3DUPpost,
191 LD4DUPpost,
192 LD1LANEpost,
193 LD2LANEpost,
194 LD3LANEpost,
195 LD4LANEpost,
196 ST2LANEpost,
197 ST3LANEpost,
198 ST4LANEpost
199};
200
201} // end namespace AArch64ISD
202
203class AArch64Subtarget;
204class AArch64TargetMachine;
205
206class AArch64TargetLowering : public TargetLowering {
207 bool RequireStrictAlign;
208
209public:
Eric Christopher905f12d2015-01-29 00:19:42 +0000210 explicit AArch64TargetLowering(const TargetMachine &TM,
211 const AArch64Subtarget &STI);
Tim Northover3b0846e2014-05-24 12:50:23 +0000212
Robin Morisset039781e2014-08-29 21:53:01 +0000213 /// Selects the correct CCAssignFn for a given CallingConvention value.
Tim Northover3b0846e2014-05-24 12:50:23 +0000214 CCAssignFn *CCAssignFnForCall(CallingConv::ID CC, bool IsVarArg) const;
215
216 /// computeKnownBitsForTargetNode - Determine which of the bits specified in
217 /// Mask are known to be either zero or one and return them in the
218 /// KnownZero/KnownOne bitsets.
219 void computeKnownBitsForTargetNode(const SDValue Op, APInt &KnownZero,
220 APInt &KnownOne, const SelectionDAG &DAG,
221 unsigned Depth = 0) const override;
222
223 MVT getScalarShiftAmountTy(EVT LHSTy) const override;
224
Matt Arsenault6f2a5262014-07-27 17:46:40 +0000225 /// allowsMisalignedMemoryAccesses - Returns true if the target allows
Sanjay Patel08efcd92015-01-28 22:37:32 +0000226 /// unaligned memory accesses of the specified type.
Matt Arsenault6f2a5262014-07-27 17:46:40 +0000227 bool allowsMisalignedMemoryAccesses(EVT VT, unsigned AddrSpace = 0,
228 unsigned Align = 1,
229 bool *Fast = nullptr) const override {
Tim Northover3b0846e2014-05-24 12:50:23 +0000230 if (RequireStrictAlign)
231 return false;
232 // FIXME: True for Cyclone, but not necessary others.
233 if (Fast)
234 *Fast = true;
235 return true;
236 }
237
238 /// LowerOperation - Provide custom lowering hooks for some operations.
239 SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
240
241 const char *getTargetNodeName(unsigned Opcode) const override;
242
243 SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const override;
244
245 /// getFunctionAlignment - Return the Log2 alignment of this function.
246 unsigned getFunctionAlignment(const Function *F) const;
247
248 /// getMaximalGlobalOffset - Returns the maximal possible offset which can
249 /// be used for loads / stores from the global.
250 unsigned getMaximalGlobalOffset() const override;
251
252 /// Returns true if a cast between SrcAS and DestAS is a noop.
253 bool isNoopAddrSpaceCast(unsigned SrcAS, unsigned DestAS) const override {
254 // Addrspacecasts are always noops.
255 return true;
256 }
257
258 /// createFastISel - This method returns a target specific FastISel object,
259 /// or null if the target does not support "fast" ISel.
260 FastISel *createFastISel(FunctionLoweringInfo &funcInfo,
261 const TargetLibraryInfo *libInfo) const override;
262
263 bool isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const override;
264
265 bool isFPImmLegal(const APFloat &Imm, EVT VT) const override;
266
267 /// isShuffleMaskLegal - Return true if the given shuffle mask can be
268 /// codegen'd directly, or if it should be stack expanded.
269 bool isShuffleMaskLegal(const SmallVectorImpl<int> &M, EVT VT) const override;
270
271 /// getSetCCResultType - Return the ISD::SETCC ValueType
272 EVT getSetCCResultType(LLVMContext &Context, EVT VT) const override;
273
274 SDValue ReconstructShuffle(SDValue Op, SelectionDAG &DAG) const;
275
276 MachineBasicBlock *EmitF128CSEL(MachineInstr *MI,
277 MachineBasicBlock *BB) const;
278
279 MachineBasicBlock *
280 EmitInstrWithCustomInserter(MachineInstr *MI,
281 MachineBasicBlock *MBB) const override;
282
283 bool getTgtMemIntrinsic(IntrinsicInfo &Info, const CallInst &I,
284 unsigned Intrinsic) const override;
285
286 bool isTruncateFree(Type *Ty1, Type *Ty2) const override;
287 bool isTruncateFree(EVT VT1, EVT VT2) const override;
288
289 bool isZExtFree(Type *Ty1, Type *Ty2) const override;
290 bool isZExtFree(EVT VT1, EVT VT2) const override;
291 bool isZExtFree(SDValue Val, EVT VT2) const override;
292
293 bool hasPairedLoad(Type *LoadedType,
294 unsigned &RequiredAligment) const override;
295 bool hasPairedLoad(EVT LoadedType, unsigned &RequiredAligment) const override;
296
297 bool isLegalAddImmediate(int64_t) const override;
298 bool isLegalICmpImmediate(int64_t) const override;
299
300 EVT getOptimalMemOpType(uint64_t Size, unsigned DstAlign, unsigned SrcAlign,
301 bool IsMemset, bool ZeroMemset, bool MemcpyStrSrc,
302 MachineFunction &MF) const override;
303
304 /// isLegalAddressingMode - Return true if the addressing mode represented
305 /// by AM is legal for this target, for a load/store of the specified type.
306 bool isLegalAddressingMode(const AddrMode &AM, Type *Ty) const override;
307
308 /// \brief Return the cost of the scaling factor used in the addressing
309 /// mode represented by AM for this target, for a load/store
310 /// of the specified type.
311 /// If the AM is supported, the return value must be >= 0.
312 /// If the AM is not supported, it returns a negative value.
313 int getScalingFactorCost(const AddrMode &AM, Type *Ty) const override;
314
315 /// isFMAFasterThanFMulAndFAdd - Return true if an FMA operation is faster
316 /// than a pair of fmul and fadd instructions. fmuladd intrinsics will be
317 /// expanded to FMAs when this method returns true, otherwise fmuladd is
318 /// expanded to fmul + fadd.
319 bool isFMAFasterThanFMulAndFAdd(EVT VT) const override;
320
321 const MCPhysReg *getScratchRegisters(CallingConv::ID CC) const override;
322
323 /// \brief Returns false if N is a bit extraction pattern of (X >> C) & Mask.
324 bool isDesirableToCommuteWithShift(const SDNode *N) const override;
325
326 /// \brief Returns true if it is beneficial to convert a load of a constant
327 /// to just the constant itself.
328 bool shouldConvertConstantLoadToIntImm(const APInt &Imm,
329 Type *Ty) const override;
330
Robin Morisset25c8e312014-09-17 00:06:58 +0000331 bool hasLoadLinkedStoreConditional() const override;
Tim Northover3b0846e2014-05-24 12:50:23 +0000332 Value *emitLoadLinked(IRBuilder<> &Builder, Value *Addr,
333 AtomicOrdering Ord) const override;
334 Value *emitStoreConditional(IRBuilder<> &Builder, Value *Val,
335 Value *Addr, AtomicOrdering Ord) const override;
336
Robin Morisseted3d48f2014-09-03 21:29:59 +0000337 bool shouldExpandAtomicLoadInIR(LoadInst *LI) const override;
338 bool shouldExpandAtomicStoreInIR(StoreInst *SI) const override;
339 bool shouldExpandAtomicRMWInIR(AtomicRMWInst *AI) const override;
Tim Northover3b0846e2014-05-24 12:50:23 +0000340
Akira Hatanakae5b6e0d2014-07-25 19:31:34 +0000341 bool useLoadStackGuardNode() const override;
Chandler Carruth9d010ff2014-07-03 00:23:43 +0000342 TargetLoweringBase::LegalizeTypeAction
343 getPreferredVectorAction(EVT VT) const override;
344
Tim Northover3b0846e2014-05-24 12:50:23 +0000345private:
346 /// Subtarget - Keep a pointer to the AArch64Subtarget around so that we can
347 /// make the right decision when generating code for different targets.
348 const AArch64Subtarget *Subtarget;
349
350 void addTypeForNEON(EVT VT, EVT PromotedBitwiseVT);
351 void addDRTypeForNEON(MVT VT);
352 void addQRTypeForNEON(MVT VT);
353
354 SDValue
355 LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
356 const SmallVectorImpl<ISD::InputArg> &Ins, SDLoc DL,
357 SelectionDAG &DAG,
358 SmallVectorImpl<SDValue> &InVals) const override;
359
360 SDValue LowerCall(CallLoweringInfo & /*CLI*/,
361 SmallVectorImpl<SDValue> &InVals) const override;
362
363 SDValue LowerCallResult(SDValue Chain, SDValue InFlag,
364 CallingConv::ID CallConv, bool isVarArg,
365 const SmallVectorImpl<ISD::InputArg> &Ins, SDLoc DL,
366 SelectionDAG &DAG, SmallVectorImpl<SDValue> &InVals,
367 bool isThisReturn, SDValue ThisVal) const;
368
369 bool isEligibleForTailCallOptimization(
370 SDValue Callee, CallingConv::ID CalleeCC, bool isVarArg,
371 bool isCalleeStructRet, bool isCallerStructRet,
372 const SmallVectorImpl<ISD::OutputArg> &Outs,
373 const SmallVectorImpl<SDValue> &OutVals,
374 const SmallVectorImpl<ISD::InputArg> &Ins, SelectionDAG &DAG) const;
375
376 /// Finds the incoming stack arguments which overlap the given fixed stack
377 /// object and incorporates their load into the current chain. This prevents
378 /// an upcoming store from clobbering the stack argument before it's used.
379 SDValue addTokenForArgument(SDValue Chain, SelectionDAG &DAG,
380 MachineFrameInfo *MFI, int ClobberedFI) const;
381
382 bool DoesCalleeRestoreStack(CallingConv::ID CallCC, bool TailCallOpt) const;
383
384 bool IsTailCallConvention(CallingConv::ID CallCC) const;
385
386 void saveVarArgRegisters(CCState &CCInfo, SelectionDAG &DAG, SDLoc DL,
387 SDValue &Chain) const;
388
389 bool CanLowerReturn(CallingConv::ID CallConv, MachineFunction &MF,
390 bool isVarArg,
391 const SmallVectorImpl<ISD::OutputArg> &Outs,
392 LLVMContext &Context) const override;
393
394 SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
395 const SmallVectorImpl<ISD::OutputArg> &Outs,
396 const SmallVectorImpl<SDValue> &OutVals, SDLoc DL,
397 SelectionDAG &DAG) const override;
398
399 SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const;
400 SDValue LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const;
401 SDValue LowerDarwinGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const;
402 SDValue LowerELFGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const;
403 SDValue LowerELFTLSDescCall(SDValue SymAddr, SDValue DescAddr, SDLoc DL,
404 SelectionDAG &DAG) const;
405 SDValue LowerSETCC(SDValue Op, SelectionDAG &DAG) const;
406 SDValue LowerBR_CC(SDValue Op, SelectionDAG &DAG) const;
407 SDValue LowerSELECT(SDValue Op, SelectionDAG &DAG) const;
408 SDValue LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const;
409 SDValue LowerJumpTable(SDValue Op, SelectionDAG &DAG) const;
410 SDValue LowerConstantPool(SDValue Op, SelectionDAG &DAG) const;
411 SDValue LowerBlockAddress(SDValue Op, SelectionDAG &DAG) const;
412 SDValue LowerAAPCS_VASTART(SDValue Op, SelectionDAG &DAG) const;
413 SDValue LowerDarwin_VASTART(SDValue Op, SelectionDAG &DAG) const;
414 SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG) const;
415 SDValue LowerVACOPY(SDValue Op, SelectionDAG &DAG) const;
416 SDValue LowerVAARG(SDValue Op, SelectionDAG &DAG) const;
417 SDValue LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const;
418 SDValue LowerRETURNADDR(SDValue Op, SelectionDAG &DAG) const;
419 SDValue LowerINSERT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const;
420 SDValue LowerEXTRACT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const;
421 SDValue LowerSCALAR_TO_VECTOR(SDValue Op, SelectionDAG &DAG) const;
422 SDValue LowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG) const;
423 SDValue LowerVECTOR_SHUFFLE(SDValue Op, SelectionDAG &DAG) const;
424 SDValue LowerEXTRACT_SUBVECTOR(SDValue Op, SelectionDAG &DAG) const;
425 SDValue LowerVectorSRA_SRL_SHL(SDValue Op, SelectionDAG &DAG) const;
426 SDValue LowerShiftLeftParts(SDValue Op, SelectionDAG &DAG) const;
427 SDValue LowerShiftRightParts(SDValue Op, SelectionDAG &DAG) const;
428 SDValue LowerVSETCC(SDValue Op, SelectionDAG &DAG) const;
429 SDValue LowerCTPOP(SDValue Op, SelectionDAG &DAG) const;
430 SDValue LowerF128Call(SDValue Op, SelectionDAG &DAG,
431 RTLIB::Libcall Call) const;
432 SDValue LowerFCOPYSIGN(SDValue Op, SelectionDAG &DAG) const;
433 SDValue LowerFP_EXTEND(SDValue Op, SelectionDAG &DAG) const;
434 SDValue LowerFP_ROUND(SDValue Op, SelectionDAG &DAG) const;
435 SDValue LowerFP_TO_INT(SDValue Op, SelectionDAG &DAG) const;
436 SDValue LowerINT_TO_FP(SDValue Op, SelectionDAG &DAG) const;
437 SDValue LowerVectorAND(SDValue Op, SelectionDAG &DAG) const;
438 SDValue LowerVectorOR(SDValue Op, SelectionDAG &DAG) const;
439 SDValue LowerCONCAT_VECTORS(SDValue Op, SelectionDAG &DAG) const;
440 SDValue LowerFSINCOS(SDValue Op, SelectionDAG &DAG) const;
441
Chad Rosier17020f92014-07-23 14:57:52 +0000442 SDValue BuildSDIVPow2(SDNode *N, const APInt &Divisor, SelectionDAG &DAG,
Benjamin Kramer8c90fd72014-09-03 11:41:21 +0000443 std::vector<SDNode *> *Created) const override;
Hao Liu44e5d7a2014-11-21 06:39:58 +0000444 bool combineRepeatedFPDivisors(unsigned NumUsers) const override;
Chad Rosier17020f92014-07-23 14:57:52 +0000445
Tim Northover3b0846e2014-05-24 12:50:23 +0000446 ConstraintType
447 getConstraintType(const std::string &Constraint) const override;
448 unsigned getRegisterByName(const char* RegName, EVT VT) const override;
449
450 /// Examine constraint string and operand type and determine a weight value.
451 /// The operand object must already have been set up with the operand type.
452 ConstraintWeight
453 getSingleConstraintMatchWeight(AsmOperandInfo &info,
454 const char *constraint) const override;
455
456 std::pair<unsigned, const TargetRegisterClass *>
457 getRegForInlineAsmConstraint(const std::string &Constraint,
458 MVT VT) const override;
459 void LowerAsmOperandForConstraint(SDValue Op, std::string &Constraint,
460 std::vector<SDValue> &Ops,
461 SelectionDAG &DAG) const override;
462
463 bool isUsedByReturnOnly(SDNode *N, SDValue &Chain) const override;
464 bool mayBeEmittedAsTailCall(CallInst *CI) const override;
465 bool getIndexedAddressParts(SDNode *Op, SDValue &Base, SDValue &Offset,
466 ISD::MemIndexedMode &AM, bool &IsInc,
467 SelectionDAG &DAG) const;
468 bool getPreIndexedAddressParts(SDNode *N, SDValue &Base, SDValue &Offset,
469 ISD::MemIndexedMode &AM,
470 SelectionDAG &DAG) const override;
471 bool getPostIndexedAddressParts(SDNode *N, SDNode *Op, SDValue &Base,
472 SDValue &Offset, ISD::MemIndexedMode &AM,
473 SelectionDAG &DAG) const override;
474
475 void ReplaceNodeResults(SDNode *N, SmallVectorImpl<SDValue> &Results,
476 SelectionDAG &DAG) const override;
Tim Northover3c55cca2014-11-27 21:02:42 +0000477
478 bool functionArgumentNeedsConsecutiveRegisters(Type *Ty,
479 CallingConv::ID CallConv,
Craig Topper44586dc2014-11-28 03:58:26 +0000480 bool isVarArg) const override;
Tim Northover3b0846e2014-05-24 12:50:23 +0000481};
482
483namespace AArch64 {
484FastISel *createFastISel(FunctionLoweringInfo &funcInfo,
485 const TargetLibraryInfo *libInfo);
486} // end namespace AArch64
487
488} // end namespace llvm
489
Benjamin Kramera7c40ef2014-08-13 16:26:38 +0000490#endif