LLVM  8.0.1
X86ISelLowering.h
Go to the documentation of this file.
1 //===-- X86ISelLowering.h - X86 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 X86 uses to lower LLVM code into a
11 // selection DAG.
12 //
13 //===----------------------------------------------------------------------===//
14 
15 #ifndef LLVM_LIB_TARGET_X86_X86ISELLOWERING_H
16 #define LLVM_LIB_TARGET_X86_X86ISELLOWERING_H
17 
22 
23 namespace llvm {
24  class X86Subtarget;
25  class X86TargetMachine;
26 
27  namespace X86ISD {
28  // X86 Specific DAG Nodes
29  enum NodeType : unsigned {
30  // Start the numbering where the builtin ops leave off.
32 
33  /// Bit scan forward.
34  BSF,
35  /// Bit scan reverse.
36  BSR,
37 
38  /// Double shift instructions. These correspond to
39  /// X86::SHLDxx and X86::SHRDxx instructions.
42 
43  /// Bitwise logical AND of floating point values. This corresponds
44  /// to X86::ANDPS or X86::ANDPD.
46 
47  /// Bitwise logical OR of floating point values. This corresponds
48  /// to X86::ORPS or X86::ORPD.
49  FOR,
50 
51  /// Bitwise logical XOR of floating point values. This corresponds
52  /// to X86::XORPS or X86::XORPD.
54 
55  /// Bitwise logical ANDNOT of floating point values. This
56  /// corresponds to X86::ANDNPS or X86::ANDNPD.
58 
59  /// These operations represent an abstract X86 call
60  /// instruction, which includes a bunch of information. In particular the
61  /// operands of these node are:
62  ///
63  /// #0 - The incoming token chain
64  /// #1 - The callee
65  /// #2 - The number of arg bytes the caller pushes on the stack.
66  /// #3 - The number of arg bytes the callee pops off the stack.
67  /// #4 - The value to pass in AL/AX/EAX (optional)
68  /// #5 - The value to pass in DL/DX/EDX (optional)
69  ///
70  /// The result values of these nodes are:
71  ///
72  /// #0 - The outgoing token chain
73  /// #1 - The first register result value (optional)
74  /// #2 - The second register result value (optional)
75  ///
77 
78  /// Same as call except it adds the NoTrack prefix.
80 
81  /// This operation implements the lowering for readcyclecounter.
83 
84  /// X86 Read Time-Stamp Counter and Processor ID.
86 
87  /// X86 Read Performance Monitoring Counters.
89 
90  /// X86 compare and logical compare instructions.
92 
93  /// X86 bit-test instructions.
94  BT,
95 
96  /// X86 SetCC. Operand 0 is condition code, and operand 1 is the EFLAGS
97  /// operand, usually produced by a CMP instruction.
99 
100  /// X86 Select
102 
103  // Same as SETCC except it's materialized with a sbb and the value is all
104  // one's or all zero's.
105  SETCC_CARRY, // R = carry_bit ? ~0 : 0
106 
107  /// X86 FP SETCC, implemented with CMP{cc}SS/CMP{cc}SD.
108  /// Operands are two FP values to compare; result is a mask of
109  /// 0s or 1s. Generally DTRT for C/C++ with NaNs.
111 
112  /// X86 FP SETCC, similar to above, but with output as an i1 mask and
113  /// with optional rounding mode.
115 
116  /// X86 conditional moves. Operand 0 and operand 1 are the two values
117  /// to select from. Operand 2 is the condition code, and operand 3 is the
118  /// flag operand produced by a CMP or TEST instruction. It also writes a
119  /// flag result.
121 
122  /// X86 conditional branches. Operand 0 is the chain operand, operand 1
123  /// is the block to branch if condition is true, operand 2 is the
124  /// condition code, and operand 3 is the flag operand produced by a CMP
125  /// or TEST instruction.
127 
128  /// BRIND node with NoTrack prefix. Operand 0 is the chain operand and
129  /// operand 1 is the target address.
131 
132  /// Return with a flag operand. Operand 0 is the chain operand, operand
133  /// 1 is the number of bytes of stack to pop.
135 
136  /// Return from interrupt. Operand 0 is the number of bytes to pop.
138 
139  /// Repeat fill, corresponds to X86::REP_STOSx.
141 
142  /// Repeat move, corresponds to X86::REP_MOVSx.
144 
145  /// On Darwin, this node represents the result of the popl
146  /// at function entry, used for PIC code.
148 
149  /// A wrapper node for TargetConstantPool, TargetJumpTable,
150  /// TargetExternalSymbol, TargetGlobalAddress, TargetGlobalTLSAddress,
151  /// MCSymbol and TargetBlockAddress.
153 
154  /// Special wrapper used under X86-64 PIC mode for RIP
155  /// relative displacements.
157 
158  /// Copies a 64-bit value from the low word of an XMM vector
159  /// to an MMX vector.
161 
162  /// Copies a 32-bit value from the low word of a MMX
163  /// vector to a GPR.
165 
166  /// Copies a GPR into the low 32-bit word of a MMX vector
167  /// and zero out the high word.
169 
170  /// Extract an 8-bit value from a vector and zero extend it to
171  /// i32, corresponds to X86::PEXTRB.
173 
174  /// Extract a 16-bit value from a vector and zero extend it to
175  /// i32, corresponds to X86::PEXTRW.
177 
178  /// Insert any element of a 4 x float vector into any element
179  /// of a destination 4 x floatvector.
181 
182  /// Insert the lower 8-bits of a 32-bit value to a vector,
183  /// corresponds to X86::PINSRB.
185 
186  /// Insert the lower 16-bits of a 32-bit value to a vector,
187  /// corresponds to X86::PINSRW.
189 
190  /// Shuffle 16 8-bit values within a vector.
192 
193  /// Compute Sum of Absolute Differences.
195  /// Compute Double Block Packed Sum-Absolute-Differences
197 
198  /// Bitwise Logical AND NOT of Packed FP values.
200 
201  /// Blend where the selector is an immediate.
203 
204  /// Dynamic (non-constant condition) vector blend where only the sign bits
205  /// of the condition elements are used. This is used to enforce that the
206  /// condition mask is not valid for generic VSELECT optimizations. This
207  /// can also be used to implement the intrinsics.
209 
210  /// Combined add and sub on an FP vector.
212 
213  // FP vector ops with rounding mode.
221 
222  // FP vector get exponent.
224  // Extract Normalized Mantissas.
226  // FP Scale.
229 
230  // Unsigned Integer average.
232 
233  /// Integer horizontal add/sub.
236 
237  /// Floating point horizontal add/sub.
240 
241  // Detect Conflicts Within a Vector
243 
244  /// Floating point max and min.
246 
247  /// Commutative FMIN and FMAX.
249 
250  /// Scalar intrinsic floating point max and min.
252 
253  /// Floating point reciprocal-sqrt and reciprocal approximation.
254  /// Note that these typically require refinement
255  /// in order to obtain suitable precision.
257 
258  // AVX-512 reciprocal approximations with a little more precision.
260 
261  // Thread Local Storage.
263 
264  // Thread Local Storage. A call to get the start address
265  // of the TLS block for the current module.
267 
268  // Thread Local Storage. When calling to an OS provided
269  // thunk at the address from an earlier relocation.
271 
272  // Exception Handling helpers.
274 
275  // SjLj exception handling setjmp.
277 
278  // SjLj exception handling longjmp.
280 
281  // SjLj exception handling dispatch.
283 
284  /// Tail call return. See X86TargetLowering::LowerCall for
285  /// the list of operands.
287 
288  // Vector move to low scalar and zero higher vector elements.
290 
291  // Vector integer truncate.
293  // Vector integer truncate with unsigned/signed saturation.
295 
296  // Masked version of the above. Used when less than a 128-bit result is
297  // produced since the mask only applies to the lower elements and can't
298  // be represented by a select.
299  // SRC, PASSTHRU, MASK
301 
302  // Vector FP extend.
304 
305  // Vector FP round.
307 
308  // Masked version of above. Used for v2f64->v4f32.
309  // SRC, PASSTHRU, MASK
311 
312  // 128-bit vector logical left / right shift
314 
315  // Vector shift elements
317 
318  // Vector variable shift
320 
321  // Vector shift elements by immediate
323 
324  // Shifts of mask registers.
326 
327  // Bit rotate by immediate
329 
330  // Vector packed double/float comparison.
332 
333  // Vector integer comparisons.
335 
336  // v8i16 Horizontal minimum and position.
338 
340 
341  /// Vector comparison generating mask bits for fp and
342  /// integer signed and unsigned data types.
344  // Vector comparison with rounding mode for FP values
346 
347  // Arithmetic operations with FLAGS results.
349  OR, XOR, AND,
350 
351  // Bit field extract.
353 
354  // Zero High Bits Starting with Specified Bit Position.
356 
357  // X86-specific multiply by immediate.
359 
360  // Vector sign bit extraction.
362 
363  // Vector bitwise comparisons.
365 
366  // Vector packed fp sign bitwise comparisons.
368 
369  // OR/AND test for masks.
372 
373  // ADD for masks.
375 
376  // Several flavors of instructions with vector shuffle behaviors.
377  // Saturated signed/unnsigned packing.
380  // Intra-lane alignr.
382  // AVX512 inter-lane alignr.
388  // VBMI2 Concat & Shift.
393  //Shuffle Packed Values at 128-bit granularity.
408 
409  // Variable Permute (VPERM).
410  // Res = VPERMV MaskV, V0
412 
413  // 3-op Variable Permute (VPERMT2).
414  // Res = VPERMV3 V0, MaskV, V1
416 
417  // Bitwise ternary logic.
419  // Fix Up Special Packed Float32/64 values.
422  // Range Restriction Calculation For Packed Pairs of Float32/64 values.
424  // Reduce - Perform Reduction Transformation on scalar\packed FP.
426  // RndScale - Round FP Values To Include A Given Number Of Fraction Bits.
427  // Also used by the legacy (V)ROUND intrinsics where we mask out the
428  // scaling part of the immediate.
430  // Tests Types Of a FP Values for packed types.
432  // Tests Types Of a FP Values for scalar types.
434 
435  // Broadcast scalar to vector.
437  // Broadcast mask to vector.
439  // Broadcast subvector to vector.
441 
442  /// SSE4A Extraction and Insertion.
444 
445  // XOP arithmetic/logical shifts.
447  // XOP signed/unsigned integer comparisons.
449  // XOP packed permute bytes.
451  // XOP two source permutation.
453 
454  // Vector multiply packed unsigned doubleword integers.
456  // Vector multiply packed signed doubleword integers.
458  // Vector Multiply Packed UnsignedIntegers with Round and Scale.
460 
461  // Multiply and Add Packed Integers.
463 
464  // AVX512IFMA multiply and add.
465  // NOTE: These are different than the instruction and perform
466  // op0 x op1 + op2.
468 
469  // VNNI
474 
475  // FMA nodes.
476  // We use the target independent ISD::FMA for the non-inverted case.
482 
483  // FMA with rounding mode.
490 
491  // Compress and expand.
494 
495  // Bits shuffle
497 
498  // Convert Unsigned/Integer to Floating-Point Value with rounding mode.
501 
502  // Vector float/double to signed/unsigned integer.
504  // Scalar float/double to signed/unsigned integer.
506 
507  // Vector float/double to signed/unsigned integer with truncation.
509  // Scalar float/double to signed/unsigned integer with truncation.
511 
512  // Vector signed/unsigned integer to float/double.
514 
515  // Masked versions of above. Used for v2f64->v4f32.
516  // SRC, PASSTHRU, MASK
518 
519  // Save xmm argument registers to the stack, according to %al. An operator
520  // is needed so that this can be expanded with control flow.
522 
523  // Windows's _chkstk call to do stack probing.
525 
526  // For allocating variable amounts of stack space when using
527  // segmented stacks. Check if the current stacklet has enough space, and
528  // falls back to heap allocation if not.
530 
531  // Memory barriers.
534 
535  // Store FP status word into i16 register.
537 
538  // Store contents of %ah into %eflags.
540 
541  // Get a random integer and indicate whether it is valid in CF.
543 
544  // Get a NIST SP800-90B & C compliant random integer and
545  // indicate whether it is valid in CF.
547 
548  // SSE42 string comparisons.
549  // These nodes produce 3 results, index, mask, and flags. X86ISelDAGToDAG
550  // will emit one or two instructions based on which results are used. If
551  // flags and index/mask this allows us to use a single instruction since
552  // we won't have to pick and opcode for flags. Instead we can rely on the
553  // DAG to CSE everything and decide at isel.
556 
557  // Test if in transactional execution.
559 
560  // ERI instructions.
562 
563  // Conversions between float and half-float.
565 
566  // Masked version of above.
567  // SRC, RND, PASSTHRU, MASK
569 
570  // Galois Field Arithmetic Instructions
572 
573  // LWP insert record.
575 
576  // User level wait
578 
579  // Compare and swap.
585 
586  /// LOCK-prefixed arithmetic read-modify-write instructions.
587  /// EFLAGS, OUTCHAIN = LADD(INCHAIN, PTR, RHS)
589 
590  // Load, scalar_to_vector, and zero extend.
592 
593  // Store FP control world into i16 memory.
595 
596  /// This instruction implements FP_TO_SINT with the
597  /// integer destination in memory and a FP reg source. This corresponds
598  /// to the X86::FIST*m instructions and the rounding mode change stuff. It
599  /// has two inputs (token chain and address) and two outputs (int value
600  /// and token chain).
604 
605  /// This instruction implements SINT_TO_FP with the
606  /// integer source in memory and FP reg result. This corresponds to the
607  /// X86::FILD*m instructions. It has three inputs (token chain, address,
608  /// and source type) and two outputs (FP value and token chain). FILD_FLAG
609  /// also produces a flag).
612 
613  /// This instruction implements an extending load to FP stack slots.
614  /// This corresponds to the X86::FLD32m / X86::FLD64m. It takes a chain
615  /// operand, ptr to load from, and a ValueType node indicating the type
616  /// to load to.
618 
619  /// This instruction implements a truncating store to FP stack
620  /// slots. This corresponds to the X86::FST32m / X86::FST64m. It takes a
621  /// chain operand, value to store, address, and a ValueType to store it
622  /// as.
624 
625  /// This instruction grabs the address of the next argument
626  /// from a va_list. (reads and modifies the va_list in memory)
628 
629  // Vector truncating store with unsigned/signed saturation
631  // Vector truncating masked store with unsigned/signed saturation
633 
634  // X86 specific gather and scatter
636 
637  // WARNING: Do not add anything in the end unless you want the node to
638  // have memop! In fact, starting from FIRST_TARGET_MEMORY_OPCODE all
639  // opcodes will be thought as target memory ops!
640  };
641  } // end namespace X86ISD
642 
643  /// Define some predicates that are used for node matching.
644  namespace X86 {
645  /// Returns true if Elt is a constant zero or floating point constant +0.0.
646  bool isZeroNode(SDValue Elt);
647 
648  /// Returns true of the given offset can be
649  /// fit into displacement field of the instruction.
651  bool hasSymbolicDisplacement = true);
652 
653  /// Determines whether the callee is required to pop its
654  /// own arguments. Callee pop is necessary to support tail calls.
656  bool is64Bit, bool IsVarArg, bool GuaranteeTCO);
657 
658  } // end namespace X86
659 
660  //===--------------------------------------------------------------------===//
661  // X86 Implementation of the TargetLowering interface
662  class X86TargetLowering final : public TargetLowering {
663  public:
664  explicit X86TargetLowering(const X86TargetMachine &TM,
665  const X86Subtarget &STI);
666 
667  unsigned getJumpTableEncoding() const override;
668  bool useSoftFloat() const override;
669 
670  void markLibCallAttributes(MachineFunction *MF, unsigned CC,
671  ArgListTy &Args) const override;
672 
673  MVT getScalarShiftAmountTy(const DataLayout &, EVT VT) const override {
674  return MVT::i8;
675  }
676 
677  const MCExpr *
678  LowerCustomJumpTableEntry(const MachineJumpTableInfo *MJTI,
679  const MachineBasicBlock *MBB, unsigned uid,
680  MCContext &Ctx) const override;
681 
682  /// Returns relocation base for the given PIC jumptable.
683  SDValue getPICJumpTableRelocBase(SDValue Table,
684  SelectionDAG &DAG) const override;
685  const MCExpr *
686  getPICJumpTableRelocBaseExpr(const MachineFunction *MF,
687  unsigned JTI, MCContext &Ctx) const override;
688 
689  /// Return the desired alignment for ByVal aggregate
690  /// function arguments in the caller parameter area. For X86, aggregates
691  /// that contains are placed at 16-byte boundaries while the rest are at
692  /// 4-byte boundaries.
693  unsigned getByValTypeAlignment(Type *Ty,
694  const DataLayout &DL) const override;
695 
696  /// Returns the target specific optimal type for load
697  /// and store operations as a result of memset, memcpy, and memmove
698  /// lowering. If DstAlign is zero that means it's safe to destination
699  /// alignment can satisfy any constraint. Similarly if SrcAlign is zero it
700  /// means there isn't a need to check it against alignment requirement,
701  /// probably because the source does not need to be loaded. If 'IsMemset' is
702  /// true, that means it's expanding a memset. If 'ZeroMemset' is true, that
703  /// means it's a memset of zero. 'MemcpyStrSrc' indicates whether the memcpy
704  /// source is constant so it does not need to be loaded.
705  /// It returns EVT::Other if the type should be determined using generic
706  /// target-independent logic.
707  EVT getOptimalMemOpType(uint64_t Size, unsigned DstAlign, unsigned SrcAlign,
708  bool IsMemset, bool ZeroMemset, bool MemcpyStrSrc,
709  MachineFunction &MF) const override;
710 
711  /// Returns true if it's safe to use load / store of the
712  /// specified type to expand memcpy / memset inline. This is mostly true
713  /// for all types except for some special cases. For example, on X86
714  /// targets without SSE2 f64 load / store are done with fldl / fstpl which
715  /// also does type conversion. Note the specified type doesn't have to be
716  /// legal as the hook is used before type legalization.
717  bool isSafeMemOpType(MVT VT) const override;
718 
719  /// Returns true if the target allows unaligned memory accesses of the
720  /// specified type. Returns whether it is "fast" in the last argument.
721  bool allowsMisalignedMemoryAccesses(EVT VT, unsigned AS, unsigned Align,
722  bool *Fast) const override;
723 
724  /// Provide custom lowering hooks for some operations.
725  ///
726  SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
727 
728  /// Places new result values for the node in Results (their number
729  /// and types must exactly match those of the original return values of
730  /// the node), or leaves Results empty, which indicates that the node is not
731  /// to be custom lowered after all.
732  void LowerOperationWrapper(SDNode *N,
734  SelectionDAG &DAG) const override;
735 
736  /// Replace the results of node with an illegal result
737  /// type with new values built out of custom code.
738  ///
739  void ReplaceNodeResults(SDNode *N, SmallVectorImpl<SDValue>&Results,
740  SelectionDAG &DAG) const override;
741 
742  SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const override;
743 
744  // Return true if it is profitable to combine a BUILD_VECTOR with a
745  // stride-pattern to a shuffle and a truncate.
746  // Example of such a combine:
747  // v4i32 build_vector((extract_elt V, 1),
748  // (extract_elt V, 3),
749  // (extract_elt V, 5),
750  // (extract_elt V, 7))
751  // -->
752  // v4i32 truncate (bitcast (shuffle<1,u,3,u,4,u,5,u,6,u,7,u> V, u) to
753  // v4i64)
754  bool isDesirableToCombineBuildVectorToShuffleTruncate(
755  ArrayRef<int> ShuffleMask, EVT SrcVT, EVT TruncVT) const override;
756 
757  /// Return true if the target has native support for
758  /// the specified value type and it is 'desirable' to use the type for the
759  /// given node type. e.g. On x86 i16 is legal, but undesirable since i16
760  /// instruction encodings are longer and some i16 instructions are slow.
761  bool isTypeDesirableForOp(unsigned Opc, EVT VT) const override;
762 
763  /// Return true if the target has native support for the
764  /// specified value type and it is 'desirable' to use the type. e.g. On x86
765  /// i16 is legal, but undesirable since i16 instruction encodings are longer
766  /// and some i16 instructions are slow.
767  bool IsDesirableToPromoteOp(SDValue Op, EVT &PVT) const override;
768 
770  EmitInstrWithCustomInserter(MachineInstr &MI,
771  MachineBasicBlock *MBB) const override;
772 
773  /// This method returns the name of a target specific DAG node.
774  const char *getTargetNodeName(unsigned Opcode) const override;
775 
776  bool mergeStoresAfterLegalization() const override { return true; }
777 
778  bool canMergeStoresTo(unsigned AddressSpace, EVT MemVT,
779  const SelectionDAG &DAG) const override;
780 
781  bool isCheapToSpeculateCttz() const override;
782 
783  bool isCheapToSpeculateCtlz() const override;
784 
785  bool isCtlzFast() const override;
786 
787  bool hasBitPreservingFPLogic(EVT VT) const override {
788  return VT == MVT::f32 || VT == MVT::f64 || VT.isVector();
789  }
790 
791  bool isMultiStoresCheaperThanBitsMerge(EVT LTy, EVT HTy) const override {
792  // If the pair to store is a mixture of float and int values, we will
793  // save two bitwise instructions and one float-to-int instruction and
794  // increase one store instruction. There is potentially a more
795  // significant benefit because it avoids the float->int domain switch
796  // for input value. So It is more likely a win.
797  if ((LTy.isFloatingPoint() && HTy.isInteger()) ||
798  (LTy.isInteger() && HTy.isFloatingPoint()))
799  return true;
800  // If the pair only contains int values, we will save two bitwise
801  // instructions and increase one store instruction (costing one more
802  // store buffer). Since the benefit is more blurred so we leave
803  // such pair out until we get testcase to prove it is a win.
804  return false;
805  }
806 
807  bool isMaskAndCmp0FoldingBeneficial(const Instruction &AndI) const override;
808 
809  bool hasAndNotCompare(SDValue Y) const override;
810 
811  bool hasAndNot(SDValue Y) const override;
812 
813  bool preferShiftsToClearExtremeBits(SDValue Y) const override;
814 
815  bool
817  unsigned KeptBits) const override {
818  // For vectors, we don't have a preference..
819  if (XVT.isVector())
820  return false;
821 
822  auto VTIsOk = [](EVT VT) -> bool {
823  return VT == MVT::i8 || VT == MVT::i16 || VT == MVT::i32 ||
824  VT == MVT::i64;
825  };
826 
827  // We are ok with KeptBitsVT being byte/word/dword, what MOVS supports.
828  // XVT will be larger than KeptBitsVT.
829  MVT KeptBitsVT = MVT::getIntegerVT(KeptBits);
830  return VTIsOk(XVT) && VTIsOk(KeptBitsVT);
831  }
832 
833  bool shouldSplatInsEltVarIndex(EVT VT) const override;
834 
835  bool convertSetCCLogicToBitwiseLogic(EVT VT) const override {
836  return VT.isScalarInteger();
837  }
838 
839  /// Vector-sized comparisons are fast using PCMPEQ + PMOVMSK or PTEST.
840  MVT hasFastEqualityCompare(unsigned NumBits) const override;
841 
842  /// Allow multiple load pairs per block for smaller and faster code.
843  unsigned getMemcmpEqZeroLoadsPerBlock() const override {
844  return 2;
845  }
846 
847  /// Return the value type to use for ISD::SETCC.
848  EVT getSetCCResultType(const DataLayout &DL, LLVMContext &Context,
849  EVT VT) const override;
850 
851  bool targetShrinkDemandedConstant(SDValue Op, const APInt &Demanded,
852  TargetLoweringOpt &TLO) const override;
853 
854  /// Determine which of the bits specified in Mask are known to be either
855  /// zero or one and return them in the KnownZero/KnownOne bitsets.
856  void computeKnownBitsForTargetNode(const SDValue Op,
857  KnownBits &Known,
858  const APInt &DemandedElts,
859  const SelectionDAG &DAG,
860  unsigned Depth = 0) const override;
861 
862  /// Determine the number of bits in the operation that are sign bits.
863  unsigned ComputeNumSignBitsForTargetNode(SDValue Op,
864  const APInt &DemandedElts,
865  const SelectionDAG &DAG,
866  unsigned Depth) const override;
867 
868  bool SimplifyDemandedVectorEltsForTargetNode(SDValue Op,
869  const APInt &DemandedElts,
870  APInt &KnownUndef,
871  APInt &KnownZero,
872  TargetLoweringOpt &TLO,
873  unsigned Depth) const override;
874 
875  bool SimplifyDemandedBitsForTargetNode(SDValue Op,
876  const APInt &DemandedBits,
877  const APInt &DemandedElts,
878  KnownBits &Known,
879  TargetLoweringOpt &TLO,
880  unsigned Depth) const override;
881 
882  SDValue unwrapAddress(SDValue N) const override;
883 
884  SDValue getReturnAddressFrameIndex(SelectionDAG &DAG) const;
885 
886  bool ExpandInlineAsm(CallInst *CI) const override;
887 
888  ConstraintType getConstraintType(StringRef Constraint) const override;
889 
890  /// Examine constraint string and operand type and determine a weight value.
891  /// The operand object must already have been set up with the operand type.
893  getSingleConstraintMatchWeight(AsmOperandInfo &info,
894  const char *constraint) const override;
895 
896  const char *LowerXConstraint(EVT ConstraintVT) const override;
897 
898  /// Lower the specified operand into the Ops vector. If it is invalid, don't
899  /// add anything to Ops. If hasMemory is true it means one of the asm
900  /// constraint of the inline asm instruction being processed is 'm'.
901  void LowerAsmOperandForConstraint(SDValue Op,
902  std::string &Constraint,
903  std::vector<SDValue> &Ops,
904  SelectionDAG &DAG) const override;
905 
906  unsigned
907  getInlineAsmMemConstraint(StringRef ConstraintCode) const override {
908  if (ConstraintCode == "i")
910  else if (ConstraintCode == "o")
912  else if (ConstraintCode == "v")
914  else if (ConstraintCode == "X")
916  return TargetLowering::getInlineAsmMemConstraint(ConstraintCode);
917  }
918 
919  /// Given a physical register constraint
920  /// (e.g. {edx}), return the register number and the register class for the
921  /// register. This should only be used for C_Register constraints. On
922  /// error, this returns a register number of 0.
923  std::pair<unsigned, const TargetRegisterClass *>
924  getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI,
925  StringRef Constraint, MVT VT) const override;
926 
927  /// Return true if the addressing mode represented
928  /// by AM is legal for this target, for a load/store of the specified type.
929  bool isLegalAddressingMode(const DataLayout &DL, const AddrMode &AM,
930  Type *Ty, unsigned AS,
931  Instruction *I = nullptr) const override;
932 
933  /// Return true if the specified immediate is legal
934  /// icmp immediate, that is the target has icmp instructions which can
935  /// compare a register against the immediate without having to materialize
936  /// the immediate into a register.
937  bool isLegalICmpImmediate(int64_t Imm) const override;
938 
939  /// Return true if the specified immediate is legal
940  /// add immediate, that is the target has add instructions which can
941  /// add a register and the immediate without having to materialize
942  /// the immediate into a register.
943  bool isLegalAddImmediate(int64_t Imm) const override;
944 
945  bool isLegalStoreImmediate(int64_t Imm) const override;
946 
947  /// Return the cost of the scaling factor used in the addressing
948  /// mode represented by AM for this target, for a load/store
949  /// of the specified type.
950  /// If the AM is supported, the return value must be >= 0.
951  /// If the AM is not supported, it returns a negative value.
952  int getScalingFactorCost(const DataLayout &DL, const AddrMode &AM, Type *Ty,
953  unsigned AS) const override;
954 
955  bool isVectorShiftByScalarCheap(Type *Ty) const override;
956 
957  /// Return true if it's free to truncate a value of
958  /// type Ty1 to type Ty2. e.g. On x86 it's free to truncate a i32 value in
959  /// register EAX to i16 by referencing its sub-register AX.
960  bool isTruncateFree(Type *Ty1, Type *Ty2) const override;
961  bool isTruncateFree(EVT VT1, EVT VT2) const override;
962 
963  bool allowTruncateForTailCall(Type *Ty1, Type *Ty2) const override;
964 
965  /// Return true if any actual instruction that defines a
966  /// value of type Ty1 implicit zero-extends the value to Ty2 in the result
967  /// register. This does not necessarily include registers defined in
968  /// unknown ways, such as incoming arguments, or copies from unknown
969  /// virtual registers. Also, if isTruncateFree(Ty2, Ty1) is true, this
970  /// does not necessarily apply to truncate instructions. e.g. on x86-64,
971  /// all instructions that define 32-bit values implicit zero-extend the
972  /// result out to 64 bits.
973  bool isZExtFree(Type *Ty1, Type *Ty2) const override;
974  bool isZExtFree(EVT VT1, EVT VT2) const override;
975  bool isZExtFree(SDValue Val, EVT VT2) const override;
976 
977  /// Return true if folding a vector load into ExtVal (a sign, zero, or any
978  /// extend node) is profitable.
979  bool isVectorLoadExtDesirable(SDValue) const override;
980 
981  /// Return true if an FMA operation is faster than a pair of fmul and fadd
982  /// instructions. fmuladd intrinsics will be expanded to FMAs when this
983  /// method returns true, otherwise fmuladd is expanded to fmul + fadd.
984  bool isFMAFasterThanFMulAndFAdd(EVT VT) const override;
985 
986  /// Return true if it's profitable to narrow
987  /// operations of type VT1 to VT2. e.g. on x86, it's profitable to narrow
988  /// from i32 to i8 but not from i32 to i16.
989  bool isNarrowingProfitable(EVT VT1, EVT VT2) const override;
990 
991  /// Given an intrinsic, checks if on the target the intrinsic will need to map
992  /// to a MemIntrinsicNode (touches memory). If this is the case, it returns
993  /// true and stores the intrinsic information into the IntrinsicInfo that was
994  /// passed to the function.
995  bool getTgtMemIntrinsic(IntrinsicInfo &Info, const CallInst &I,
996  MachineFunction &MF,
997  unsigned Intrinsic) const override;
998 
999  /// Returns true if the target can instruction select the
1000  /// specified FP immediate natively. If false, the legalizer will
1001  /// materialize the FP immediate as a load from a constant pool.
1002  bool isFPImmLegal(const APFloat &Imm, EVT VT) const override;
1003 
1004  /// Targets can use this to indicate that they only support *some*
1005  /// VECTOR_SHUFFLE operations, those with specific masks. By default, if a
1006  /// target supports the VECTOR_SHUFFLE node, all mask values are assumed to
1007  /// be legal.
1008  bool isShuffleMaskLegal(ArrayRef<int> Mask, EVT VT) const override;
1009 
1010  /// Similar to isShuffleMaskLegal. Targets can use this to indicate if there
1011  /// is a suitable VECTOR_SHUFFLE that can be used to replace a VAND with a
1012  /// constant pool entry.
1013  bool isVectorClearMaskLegal(ArrayRef<int> Mask, EVT VT) const override;
1014 
1015  /// Returns true if lowering to a jump table is allowed.
1016  bool areJTsAllowed(const Function *Fn) const override;
1017 
1018  /// If true, then instruction selection should
1019  /// seek to shrink the FP constant of the specified type to a smaller type
1020  /// in order to save space and / or reduce runtime.
1021  bool ShouldShrinkFPConstant(EVT VT) const override {
1022  // Don't shrink FP constpool if SSE2 is available since cvtss2sd is more
1023  // expensive than a straight movsd. On the other hand, it's important to
1024  // shrink long double fp constant since fldt is very slow.
1025  return !X86ScalarSSEf64 || VT == MVT::f80;
1026  }
1027 
1028  /// Return true if we believe it is correct and profitable to reduce the
1029  /// load node to a smaller type.
1030  bool shouldReduceLoadWidth(SDNode *Load, ISD::LoadExtType ExtTy,
1031  EVT NewVT) const override;
1032 
1033  /// Return true if the specified scalar FP type is computed in an SSE
1034  /// register, not on the X87 floating point stack.
1035  bool isScalarFPTypeInSSEReg(EVT VT) const {
1036  return (VT == MVT::f64 && X86ScalarSSEf64) || // f64 is when SSE2
1037  (VT == MVT::f32 && X86ScalarSSEf32); // f32 is when SSE1
1038  }
1039 
1040  /// Returns true if it is beneficial to convert a load of a constant
1041  /// to just the constant itself.
1042  bool shouldConvertConstantLoadToIntImm(const APInt &Imm,
1043  Type *Ty) const override;
1044 
1045  bool reduceSelectOfFPConstantLoads(bool IsFPSetCC) const override;
1046 
1047  bool convertSelectOfConstantsToMath(EVT VT) const override;
1048 
1049  bool decomposeMulByConstant(EVT VT, SDValue C) const override;
1050 
1051  bool shouldUseStrictFP_TO_INT(EVT FpVT, EVT IntVT,
1052  bool IsSigned) const override;
1053 
1054  /// Return true if EXTRACT_SUBVECTOR is cheap for this result type
1055  /// with this index.
1056  bool isExtractSubvectorCheap(EVT ResVT, EVT SrcVT,
1057  unsigned Index) const override;
1058 
1059  /// Scalar ops always have equal or better analysis/performance/power than
1060  /// the vector equivalent, so this always makes sense if the scalar op is
1061  /// supported.
1062  bool shouldScalarizeBinop(SDValue) const override;
1063 
1064  bool storeOfVectorConstantIsCheap(EVT MemVT, unsigned NumElem,
1065  unsigned AddrSpace) const override {
1066  // If we can replace more than 2 scalar stores, there will be a reduction
1067  // in instructions even after we add a vector constant load.
1068  return NumElem > 2;
1069  }
1070 
1071  bool isLoadBitCastBeneficial(EVT LoadVT, EVT BitcastVT) const override;
1072 
1073  /// Intel processors have a unified instruction and data cache
1074  const char * getClearCacheBuiltinName() const override {
1075  return nullptr; // nothing to do, move along.
1076  }
1077 
1078  unsigned getRegisterByName(const char* RegName, EVT VT,
1079  SelectionDAG &DAG) const override;
1080 
1081  /// If a physical register, this returns the register that receives the
1082  /// exception address on entry to an EH pad.
1083  unsigned
1084  getExceptionPointerRegister(const Constant *PersonalityFn) const override;
1085 
1086  /// If a physical register, this returns the register that receives the
1087  /// exception typeid on entry to a landing pad.
1088  unsigned
1089  getExceptionSelectorRegister(const Constant *PersonalityFn) const override;
1090 
1091  virtual bool needsFixedCatchObjects() const override;
1092 
1093  /// This method returns a target specific FastISel object,
1094  /// or null if the target does not support "fast" ISel.
1096  const TargetLibraryInfo *libInfo) const override;
1097 
1098  /// If the target has a standard location for the stack protector cookie,
1099  /// returns the address of that location. Otherwise, returns nullptr.
1100  Value *getIRStackGuard(IRBuilder<> &IRB) const override;
1101 
1102  bool useLoadStackGuardNode() const override;
1103  bool useStackGuardXorFP() const override;
1104  void insertSSPDeclarations(Module &M) const override;
1105  Value *getSDagStackGuard(const Module &M) const override;
1106  Value *getSSPStackGuardCheck(const Module &M) const override;
1107  SDValue emitStackGuardXorFP(SelectionDAG &DAG, SDValue Val,
1108  const SDLoc &DL) const override;
1109 
1110 
1111  /// Return true if the target stores SafeStack pointer at a fixed offset in
1112  /// some non-standard address space, and populates the address space and
1113  /// offset as appropriate.
1114  Value *getSafeStackPointerLocation(IRBuilder<> &IRB) const override;
1115 
1116  SDValue BuildFILD(SDValue Op, EVT SrcVT, SDValue Chain, SDValue StackSlot,
1117  SelectionDAG &DAG) const;
1118 
1119  bool isNoopAddrSpaceCast(unsigned SrcAS, unsigned DestAS) const override;
1120 
1121  /// Customize the preferred legalization strategy for certain types.
1122  LegalizeTypeAction getPreferredVectorAction(MVT VT) const override;
1123 
1124  MVT getRegisterTypeForCallingConv(LLVMContext &Context, CallingConv::ID CC,
1125  EVT VT) const override;
1126 
1127  unsigned getNumRegistersForCallingConv(LLVMContext &Context,
1128  CallingConv::ID CC,
1129  EVT VT) const override;
1130 
1131  bool isIntDivCheap(EVT VT, AttributeList Attr) const override;
1132 
1133  bool supportSwiftError() const override;
1134 
1135  StringRef getStackProbeSymbolName(MachineFunction &MF) const override;
1136 
1137  bool hasVectorBlend() const override { return true; }
1138 
1139  unsigned getMaxSupportedInterleaveFactor() const override { return 4; }
1140 
1141  /// Lower interleaved load(s) into target specific
1142  /// instructions/intrinsics.
1143  bool lowerInterleavedLoad(LoadInst *LI,
1145  ArrayRef<unsigned> Indices,
1146  unsigned Factor) const override;
1147 
1148  /// Lower interleaved store(s) into target specific
1149  /// instructions/intrinsics.
1150  bool lowerInterleavedStore(StoreInst *SI, ShuffleVectorInst *SVI,
1151  unsigned Factor) const override;
1152 
1153  SDValue expandIndirectJTBranch(const SDLoc& dl, SDValue Value,
1154  SDValue Addr, SelectionDAG &DAG)
1155  const override;
1156 
1157  protected:
1158  std::pair<const TargetRegisterClass *, uint8_t>
1159  findRepresentativeClass(const TargetRegisterInfo *TRI,
1160  MVT VT) const override;
1161 
1162  private:
1163  /// Keep a reference to the X86Subtarget around so that we can
1164  /// make the right decision when generating code for different targets.
1165  const X86Subtarget &Subtarget;
1166 
1167  /// Select between SSE or x87 floating point ops.
1168  /// When SSE is available, use it for f32 operations.
1169  /// When SSE2 is available, use it for f64 operations.
1170  bool X86ScalarSSEf32;
1171  bool X86ScalarSSEf64;
1172 
1173  /// A list of legal FP immediates.
1174  std::vector<APFloat> LegalFPImmediates;
1175 
1176  /// Indicate that this x86 target can instruction
1177  /// select the specified FP immediate natively.
1178  void addLegalFPImmediate(const APFloat& Imm) {
1179  LegalFPImmediates.push_back(Imm);
1180  }
1181 
1182  SDValue LowerCallResult(SDValue Chain, SDValue InFlag,
1183  CallingConv::ID CallConv, bool isVarArg,
1185  const SDLoc &dl, SelectionDAG &DAG,
1186  SmallVectorImpl<SDValue> &InVals,
1187  uint32_t *RegMask) const;
1188  SDValue LowerMemArgument(SDValue Chain, CallingConv::ID CallConv,
1189  const SmallVectorImpl<ISD::InputArg> &ArgInfo,
1190  const SDLoc &dl, SelectionDAG &DAG,
1191  const CCValAssign &VA, MachineFrameInfo &MFI,
1192  unsigned i) const;
1194  const SDLoc &dl, SelectionDAG &DAG,
1195  const CCValAssign &VA,
1196  ISD::ArgFlagsTy Flags) const;
1197 
1198  // Call lowering helpers.
1199 
1200  /// Check whether the call is eligible for tail call optimization. Targets
1201  /// that want to do tail call optimization should implement this function.
1202  bool IsEligibleForTailCallOptimization(SDValue Callee,
1203  CallingConv::ID CalleeCC,
1204  bool isVarArg,
1205  bool isCalleeStructRet,
1206  bool isCallerStructRet,
1207  Type *RetTy,
1208  const SmallVectorImpl<ISD::OutputArg> &Outs,
1209  const SmallVectorImpl<SDValue> &OutVals,
1210  const SmallVectorImpl<ISD::InputArg> &Ins,
1211  SelectionDAG& DAG) const;
1212  SDValue EmitTailCallLoadRetAddr(SelectionDAG &DAG, SDValue &OutRetAddr,
1213  SDValue Chain, bool IsTailCall,
1214  bool Is64Bit, int FPDiff,
1215  const SDLoc &dl) const;
1216 
1217  unsigned GetAlignedArgumentStackSize(unsigned StackSize,
1218  SelectionDAG &DAG) const;
1219 
1220  unsigned getAddressSpace(void) const;
1221 
1222  std::pair<SDValue,SDValue> FP_TO_INTHelper(SDValue Op, SelectionDAG &DAG,
1223  bool isSigned,
1224  bool isReplace) const;
1225 
1226  SDValue LowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG) const;
1227  SDValue LowerVSELECT(SDValue Op, SelectionDAG &DAG) const;
1230 
1231  unsigned getGlobalWrapperKind(const GlobalValue *GV = nullptr,
1232  const unsigned char OpFlags = 0) const;
1233  SDValue LowerConstantPool(SDValue Op, SelectionDAG &DAG) const;
1234  SDValue LowerBlockAddress(SDValue Op, SelectionDAG &DAG) const;
1235  SDValue LowerGlobalAddress(const GlobalValue *GV, const SDLoc &dl,
1236  int64_t Offset, SelectionDAG &DAG) const;
1237  SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const;
1238  SDValue LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const;
1239  SDValue LowerExternalSymbol(SDValue Op, SelectionDAG &DAG) const;
1240 
1241  SDValue LowerSINT_TO_FP(SDValue Op, SelectionDAG &DAG) const;
1242  SDValue LowerUINT_TO_FP(SDValue Op, SelectionDAG &DAG) const;
1243  SDValue LowerTRUNCATE(SDValue Op, SelectionDAG &DAG) const;
1244  SDValue LowerFP_TO_INT(SDValue Op, SelectionDAG &DAG) const;
1245  SDValue LowerSETCC(SDValue Op, SelectionDAG &DAG) const;
1246  SDValue LowerSETCCCARRY(SDValue Op, SelectionDAG &DAG) const;
1247  SDValue LowerSELECT(SDValue Op, SelectionDAG &DAG) const;
1248  SDValue LowerBRCOND(SDValue Op, SelectionDAG &DAG) const;
1249  SDValue LowerJumpTable(SDValue Op, SelectionDAG &DAG) const;
1251  SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG) const;
1252  SDValue LowerVAARG(SDValue Op, SelectionDAG &DAG) const;
1253  SDValue LowerRETURNADDR(SDValue Op, SelectionDAG &DAG) const;
1254  SDValue LowerADDROFRETURNADDR(SDValue Op, SelectionDAG &DAG) const;
1255  SDValue LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const;
1256  SDValue LowerFRAME_TO_ARGS_OFFSET(SDValue Op, SelectionDAG &DAG) const;
1257  SDValue LowerEH_RETURN(SDValue Op, SelectionDAG &DAG) const;
1258  SDValue lowerEH_SJLJ_SETJMP(SDValue Op, SelectionDAG &DAG) const;
1259  SDValue lowerEH_SJLJ_LONGJMP(SDValue Op, SelectionDAG &DAG) const;
1260  SDValue lowerEH_SJLJ_SETUP_DISPATCH(SDValue Op, SelectionDAG &DAG) const;
1261  SDValue LowerINIT_TRAMPOLINE(SDValue Op, SelectionDAG &DAG) const;
1262  SDValue LowerFLT_ROUNDS_(SDValue Op, SelectionDAG &DAG) const;
1263  SDValue LowerWin64_i128OP(SDValue Op, SelectionDAG &DAG) const;
1264  SDValue LowerGC_TRANSITION_START(SDValue Op, SelectionDAG &DAG) const;
1265  SDValue LowerGC_TRANSITION_END(SDValue Op, SelectionDAG &DAG) const;
1266  SDValue LowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG) const;
1267 
1268  SDValue
1269  LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
1270  const SmallVectorImpl<ISD::InputArg> &Ins,
1271  const SDLoc &dl, SelectionDAG &DAG,
1272  SmallVectorImpl<SDValue> &InVals) const override;
1273  SDValue LowerCall(CallLoweringInfo &CLI,
1274  SmallVectorImpl<SDValue> &InVals) const override;
1275 
1276  SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
1277  const SmallVectorImpl<ISD::OutputArg> &Outs,
1278  const SmallVectorImpl<SDValue> &OutVals,
1279  const SDLoc &dl, SelectionDAG &DAG) const override;
1280 
1281  bool supportSplitCSR(MachineFunction *MF) const override {
1284  }
1285  void initializeSplitCSR(MachineBasicBlock *Entry) const override;
1286  void insertCopiesSplitCSR(
1287  MachineBasicBlock *Entry,
1288  const SmallVectorImpl<MachineBasicBlock *> &Exits) const override;
1289 
1290  bool isUsedByReturnOnly(SDNode *N, SDValue &Chain) const override;
1291 
1292  bool mayBeEmittedAsTailCall(const CallInst *CI) const override;
1293 
1294  EVT getTypeForExtReturn(LLVMContext &Context, EVT VT,
1295  ISD::NodeType ExtendKind) const override;
1296 
1297  bool CanLowerReturn(CallingConv::ID CallConv, MachineFunction &MF,
1298  bool isVarArg,
1299  const SmallVectorImpl<ISD::OutputArg> &Outs,
1300  LLVMContext &Context) const override;
1301 
1302  const MCPhysReg *getScratchRegisters(CallingConv::ID CC) const override;
1303 
1305  shouldExpandAtomicLoadInIR(LoadInst *SI) const override;
1306  bool shouldExpandAtomicStoreInIR(StoreInst *SI) const override;
1308  shouldExpandAtomicRMWInIR(AtomicRMWInst *AI) const override;
1309 
1310  LoadInst *
1311  lowerIdempotentRMWIntoFencedLoad(AtomicRMWInst *AI) const override;
1312 
1313  bool needsCmpXchgNb(Type *MemType) const;
1314 
1315  void SetupEntryBlockForSjLj(MachineInstr &MI, MachineBasicBlock *MBB,
1316  MachineBasicBlock *DispatchBB, int FI) const;
1317 
1318  // Utility function to emit the low-level va_arg code for X86-64.
1320  EmitVAARG64WithCustomInserter(MachineInstr &MI,
1321  MachineBasicBlock *MBB) const;
1322 
1323  /// Utility function to emit the xmm reg save portion of va_start.
1325  EmitVAStartSaveXMMRegsWithCustomInserter(MachineInstr &BInstr,
1326  MachineBasicBlock *BB) const;
1327 
1328  MachineBasicBlock *EmitLoweredCascadedSelect(MachineInstr &MI1,
1329  MachineInstr &MI2,
1330  MachineBasicBlock *BB) const;
1331 
1332  MachineBasicBlock *EmitLoweredSelect(MachineInstr &I,
1333  MachineBasicBlock *BB) const;
1334 
1335  MachineBasicBlock *EmitLoweredAtomicFP(MachineInstr &I,
1336  MachineBasicBlock *BB) const;
1337 
1338  MachineBasicBlock *EmitLoweredCatchRet(MachineInstr &MI,
1339  MachineBasicBlock *BB) const;
1340 
1341  MachineBasicBlock *EmitLoweredCatchPad(MachineInstr &MI,
1342  MachineBasicBlock *BB) const;
1343 
1344  MachineBasicBlock *EmitLoweredSegAlloca(MachineInstr &MI,
1345  MachineBasicBlock *BB) const;
1346 
1347  MachineBasicBlock *EmitLoweredTLSAddr(MachineInstr &MI,
1348  MachineBasicBlock *BB) const;
1349 
1350  MachineBasicBlock *EmitLoweredTLSCall(MachineInstr &MI,
1351  MachineBasicBlock *BB) const;
1352 
1353  MachineBasicBlock *EmitLoweredRetpoline(MachineInstr &MI,
1354  MachineBasicBlock *BB) const;
1355 
1356  MachineBasicBlock *emitEHSjLjSetJmp(MachineInstr &MI,
1357  MachineBasicBlock *MBB) const;
1358 
1359  void emitSetJmpShadowStackFix(MachineInstr &MI,
1360  MachineBasicBlock *MBB) const;
1361 
1362  MachineBasicBlock *emitEHSjLjLongJmp(MachineInstr &MI,
1363  MachineBasicBlock *MBB) const;
1364 
1365  MachineBasicBlock *emitLongJmpShadowStackFix(MachineInstr &MI,
1366  MachineBasicBlock *MBB) const;
1367 
1368  MachineBasicBlock *emitFMA3Instr(MachineInstr &MI,
1369  MachineBasicBlock *MBB) const;
1370 
1371  MachineBasicBlock *EmitSjLjDispatchBlock(MachineInstr &MI,
1372  MachineBasicBlock *MBB) const;
1373 
1374  /// Emit nodes that will be selected as "cmp Op0,Op1", or something
1375  /// equivalent, for use with the given x86 condition code.
1376  SDValue EmitCmp(SDValue Op0, SDValue Op1, unsigned X86CC, const SDLoc &dl,
1377  SelectionDAG &DAG) const;
1378 
1379  /// Convert a comparison if required by the subtarget.
1380  SDValue ConvertCmpIfNecessary(SDValue Cmp, SelectionDAG &DAG) const;
1381 
1382  /// Emit flags for the given setcc condition and operands. Also returns the
1383  /// corresponding X86 condition code constant in X86CC.
1384  SDValue emitFlagsForSetcc(SDValue Op0, SDValue Op1,
1385  ISD::CondCode CC, const SDLoc &dl,
1386  SelectionDAG &DAG,
1387  SDValue &X86CC) const;
1388 
1389  /// Check if replacement of SQRT with RSQRT should be disabled.
1390  bool isFsqrtCheap(SDValue Operand, SelectionDAG &DAG) const override;
1391 
1392  /// Use rsqrt* to speed up sqrt calculations.
1393  SDValue getSqrtEstimate(SDValue Operand, SelectionDAG &DAG, int Enabled,
1394  int &RefinementSteps, bool &UseOneConstNR,
1395  bool Reciprocal) const override;
1396 
1397  /// Use rcp* to speed up fdiv calculations.
1398  SDValue getRecipEstimate(SDValue Operand, SelectionDAG &DAG, int Enabled,
1399  int &RefinementSteps) const override;
1400 
1401  /// Reassociate floating point divisions into multiply by reciprocal.
1402  unsigned combineRepeatedFPDivisors() const override;
1403  };
1404 
1405  namespace X86 {
1407  const TargetLibraryInfo *libInfo);
1408  } // end namespace X86
1409 
1410  // Base class for all X86 non-masked store operations.
1411  class X86StoreSDNode : public MemSDNode {
1412  public:
1413  X86StoreSDNode(unsigned Opcode, unsigned Order, const DebugLoc &dl,
1414  SDVTList VTs, EVT MemVT,
1415  MachineMemOperand *MMO)
1416  :MemSDNode(Opcode, Order, dl, VTs, MemVT, MMO) {}
1417  const SDValue &getValue() const { return getOperand(1); }
1418  const SDValue &getBasePtr() const { return getOperand(2); }
1419 
1420  static bool classof(const SDNode *N) {
1421  return N->getOpcode() == X86ISD::VTRUNCSTORES ||
1423  }
1424  };
1425 
1426  // Base class for all X86 masked store operations.
1427  // The class has the same order of operands as MaskedStoreSDNode for
1428  // convenience.
1430  public:
1431  X86MaskedStoreSDNode(unsigned Opcode, unsigned Order,
1432  const DebugLoc &dl, SDVTList VTs, EVT MemVT,
1433  MachineMemOperand *MMO)
1434  : MemSDNode(Opcode, Order, dl, VTs, MemVT, MMO) {}
1435 
1436  const SDValue &getValue() const { return getOperand(1); }
1437  const SDValue &getBasePtr() const { return getOperand(2); }
1438  const SDValue &getMask() const { return getOperand(3); }
1439 
1440  static bool classof(const SDNode *N) {
1441  return N->getOpcode() == X86ISD::VMTRUNCSTORES ||
1443  }
1444  };
1445 
1446  // X86 Truncating Store with Signed saturation.
1448  public:
1449  TruncSStoreSDNode(unsigned Order, const DebugLoc &dl,
1450  SDVTList VTs, EVT MemVT, MachineMemOperand *MMO)
1451  : X86StoreSDNode(X86ISD::VTRUNCSTORES, Order, dl, VTs, MemVT, MMO) {}
1452 
1453  static bool classof(const SDNode *N) {
1454  return N->getOpcode() == X86ISD::VTRUNCSTORES;
1455  }
1456  };
1457 
1458  // X86 Truncating Store with Unsigned saturation.
1460  public:
1461  TruncUSStoreSDNode(unsigned Order, const DebugLoc &dl,
1462  SDVTList VTs, EVT MemVT, MachineMemOperand *MMO)
1463  : X86StoreSDNode(X86ISD::VTRUNCSTOREUS, Order, dl, VTs, MemVT, MMO) {}
1464 
1465  static bool classof(const SDNode *N) {
1466  return N->getOpcode() == X86ISD::VTRUNCSTOREUS;
1467  }
1468  };
1469 
1470  // X86 Truncating Masked Store with Signed saturation.
1472  public:
1473  MaskedTruncSStoreSDNode(unsigned Order,
1474  const DebugLoc &dl, SDVTList VTs, EVT MemVT,
1475  MachineMemOperand *MMO)
1476  : X86MaskedStoreSDNode(X86ISD::VMTRUNCSTORES, Order, dl, VTs, MemVT, MMO) {}
1477 
1478  static bool classof(const SDNode *N) {
1479  return N->getOpcode() == X86ISD::VMTRUNCSTORES;
1480  }
1481  };
1482 
1483  // X86 Truncating Masked Store with Unsigned saturation.
1485  public:
1487  const DebugLoc &dl, SDVTList VTs, EVT MemVT,
1488  MachineMemOperand *MMO)
1489  : X86MaskedStoreSDNode(X86ISD::VMTRUNCSTOREUS, Order, dl, VTs, MemVT, MMO) {}
1490 
1491  static bool classof(const SDNode *N) {
1492  return N->getOpcode() == X86ISD::VMTRUNCSTOREUS;
1493  }
1494  };
1495 
1496  // X86 specific Gather/Scatter nodes.
1497  // The class has the same order of operands as MaskedGatherScatterSDNode for
1498  // convenience.
1500  public:
1501  X86MaskedGatherScatterSDNode(unsigned Opc, unsigned Order,
1502  const DebugLoc &dl, SDVTList VTs, EVT MemVT,
1503  MachineMemOperand *MMO)
1504  : MemSDNode(Opc, Order, dl, VTs, MemVT, MMO) {}
1505 
1506  const SDValue &getBasePtr() const { return getOperand(3); }
1507  const SDValue &getIndex() const { return getOperand(4); }
1508  const SDValue &getMask() const { return getOperand(2); }
1509  const SDValue &getScale() const { return getOperand(5); }
1510 
1511  static bool classof(const SDNode *N) {
1512  return N->getOpcode() == X86ISD::MGATHER ||
1513  N->getOpcode() == X86ISD::MSCATTER;
1514  }
1515  };
1516 
1518  public:
1519  X86MaskedGatherSDNode(unsigned Order, const DebugLoc &dl, SDVTList VTs,
1520  EVT MemVT, MachineMemOperand *MMO)
1521  : X86MaskedGatherScatterSDNode(X86ISD::MGATHER, Order, dl, VTs, MemVT,
1522  MMO) {}
1523 
1524  const SDValue &getPassThru() const { return getOperand(1); }
1525 
1526  static bool classof(const SDNode *N) {
1527  return N->getOpcode() == X86ISD::MGATHER;
1528  }
1529  };
1530 
1532  public:
1533  X86MaskedScatterSDNode(unsigned Order, const DebugLoc &dl, SDVTList VTs,
1534  EVT MemVT, MachineMemOperand *MMO)
1535  : X86MaskedGatherScatterSDNode(X86ISD::MSCATTER, Order, dl, VTs, MemVT,
1536  MMO) {}
1537 
1538  const SDValue &getValue() const { return getOperand(1); }
1539 
1540  static bool classof(const SDNode *N) {
1541  return N->getOpcode() == X86ISD::MSCATTER;
1542  }
1543  };
1544 
1545  /// Generate unpacklo/unpackhi shuffle mask.
1546  template <typename T = int>
1548  bool Unary) {
1549  assert(Mask.empty() && "Expected an empty shuffle mask vector");
1550  int NumElts = VT.getVectorNumElements();
1551  int NumEltsInLane = 128 / VT.getScalarSizeInBits();
1552  for (int i = 0; i < NumElts; ++i) {
1553  unsigned LaneStart = (i / NumEltsInLane) * NumEltsInLane;
1554  int Pos = (i % NumEltsInLane) / 2 + LaneStart;
1555  Pos += (Unary ? 0 : NumElts * (i % 2));
1556  Pos += (Lo ? 0 : NumEltsInLane / 2);
1557  Mask.push_back(Pos);
1558  }
1559  }
1560 
1561  /// Helper function to scale a shuffle or target shuffle mask, replacing each
1562  /// mask index with the scaled sequential indices for an equivalent narrowed
1563  /// mask. This is the reverse process to canWidenShuffleElements, but can
1564  /// always succeed.
1565  template <typename T>
1567  SmallVectorImpl<T> &ScaledMask) {
1568  assert(0 < Scale && "Unexpected scaling factor");
1569  int NumElts = Mask.size();
1570  ScaledMask.assign(static_cast<size_t>(NumElts * Scale), -1);
1571 
1572  for (int i = 0; i != NumElts; ++i) {
1573  int M = Mask[i];
1574 
1575  // Repeat sentinel values in every mask element.
1576  if (M < 0) {
1577  for (int s = 0; s != Scale; ++s)
1578  ScaledMask[(Scale * i) + s] = M;
1579  continue;
1580  }
1581 
1582  // Scale mask element and increment across each mask element.
1583  for (int s = 0; s != Scale; ++s)
1584  ScaledMask[(Scale * i) + s] = (Scale * M) + s;
1585  }
1586  }
1587 } // end namespace llvm
1588 
1589 #endif // LLVM_LIB_TARGET_X86_X86ISELLOWERING_H
static SDValue LowerEXTRACT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG)
const SDValue & getIndex() const
Double shift instructions.
uint64_t CallInst * C
bool shouldTransformSignedTruncationCheck(EVT XVT, unsigned KeptBits) const override
Should we tranform the IR-optimal check for whether given truncation down into KeptBits would be trun...
static MVT getIntegerVT(unsigned BitWidth)
static SDValue LowerCallResult(SDValue Chain, SDValue InFlag, const SmallVectorImpl< CCValAssign > &RVLocs, const SDLoc &dl, SelectionDAG &DAG, SmallVectorImpl< SDValue > &InVals)
LowerCallResult - Lower the result values of a call into the appropriate copies out of appropriate ph...
TruncUSStoreSDNode(unsigned Order, const DebugLoc &dl, SDVTList VTs, EVT MemVT, MachineMemOperand *MMO)
BUILTIN_OP_END - This must be the last enum value in this list.
Definition: ISDOpcodes.h:877
A parsed version of the target data layout string in and methods for querying it. ...
Definition: DataLayout.h:111
constexpr char Align[]
Key for Kernel::Arg::Metadata::mAlign.
This represents an addressing mode of: BaseGV + BaseOffs + BaseReg + Scale*ScaleReg If BaseGV is null...
Vector comparison generating mask bits for fp and integer signed and unsigned data types...
Repeat move, corresponds to X86::REP_MOVSx.
void createUnpackShuffleMask(MVT VT, SmallVectorImpl< T > &Mask, bool Lo, bool Unary)
Generate unpacklo/unpackhi shuffle mask.
unsigned getOpcode() const
Return the SelectionDAG opcode value for this node.
LLVMContext & Context
static bool classof(const SDNode *N)
Return with a flag operand.
const SDValue & getValue() const
const SDValue & getBasePtr() const
This class represents lattice values for constants.
Definition: AllocatorList.h:24
const SDValue & getScale() const
Tail call return.
Compute Double Block Packed Sum-Absolute-Differences.
A Module instance is used to store all the information related to an LLVM module. ...
Definition: Module.h:65
bool mergeStoresAfterLegalization() const override
Allow store merging after legalization in addition to before legalization.
static bool classof(const SDNode *N)
Same as call except it adds the NoTrack prefix.
static void LowerMemOpCallTo(SelectionDAG &DAG, MachineFunction &MF, SDValue Chain, SDValue Arg, SDValue PtrOff, int SPDiff, unsigned ArgOffset, bool isPPC64, bool isTailCall, bool isVector, SmallVectorImpl< SDValue > &MemOpChains, SmallVectorImpl< TailCallArgumentInfo > &TailCallArguments, const SDLoc &dl)
LowerMemOpCallTo - Store the argument to the stack or remember it in case of tail calls...
bool isMultiStoresCheaperThanBitsMerge(EVT LTy, EVT HTy) const override
Return true if it is cheaper to split the store of a merged int val from a pair of smaller values int...
X86 conditional moves.
bool isScalarInteger() const
Return true if this is an integer, but not a vector.
Definition: ValueTypes.h:146
This class represents a function call, abstracting a target machine&#39;s calling convention.
unsigned getVectorNumElements() const
Function Alias Analysis Results
This instruction constructs a fixed permutation of two input vectors.
bool hasFnAttribute(Attribute::AttrKind Kind) const
Return true if the function has the attribute.
Definition: Function.h:321
unsigned const TargetRegisterInfo * TRI
A debug info location.
Definition: DebugLoc.h:34
bool isInteger() const
Return true if this is an integer or a vector integer type.
Definition: ValueTypes.h:141
static bool classof(const SDNode *N)
SSE4A Extraction and Insertion.
static bool classof(const SDNode *N)
An instruction for reading from memory.
Definition: Instructions.h:168
an instruction that atomically reads a memory location, combines it with another value, and then stores the result back.
Definition: Instructions.h:692
Bitwise logical ANDNOT of floating point values.
AtomicExpansionKind
Enum that specifies what an atomic load/AtomicRMWInst is expanded to, if at all.
bool isCalleePop(CallingConv::ID CallingConv, bool is64Bit, bool IsVarArg, bool GuaranteeTCO)
Determines whether the callee is required to pop its own arguments.
This operation implements the lowering for readcyclecounter.
NodeType
ISD::NodeType enum - This enum defines the target-independent operators for a SelectionDAG.
Definition: ISDOpcodes.h:39
X86MaskedGatherScatterSDNode(unsigned Opc, unsigned Order, const DebugLoc &dl, SDVTList VTs, EVT MemVT, MachineMemOperand *MMO)
A convenience struct that encapsulates a DAG, and two SDValues for returning information from TargetL...
X86 compare and logical compare instructions.
MaskedTruncUSStoreSDNode(unsigned Order, const DebugLoc &dl, SDVTList VTs, EVT MemVT, MachineMemOperand *MMO)
bool isFloatingPoint() const
Return true if this is a FP or a vector FP type.
Definition: ValueTypes.h:136
static GCMetadataPrinterRegistry::Add< OcamlGCMetadataPrinter > Y("ocaml", "ocaml 3.10-compatible collector")
Extract an 8-bit value from a vector and zero extend it to i32, corresponds to X86::PEXTRB.
A description of a memory reference used in the backend.
X86StoreSDNode(unsigned Opcode, unsigned Order, const DebugLoc &dl, SDVTList VTs, EVT MemVT, MachineMemOperand *MMO)
Dynamic (non-constant condition) vector blend where only the sign bits of the condition elements are ...
Bitwise Logical AND NOT of Packed FP values.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
Definition: APFloat.h:42
Base class for the full range of assembler expressions which are needed for parsing.
Definition: MCExpr.h:36
This provides a uniform API for creating instructions and inserting them into a basic block: either a...
Definition: IRBuilder.h:743
This instruction implements SINT_TO_FP with the integer source in memory and FP reg result...
static SDValue LowerRETURNADDR(SDValue Op, SelectionDAG &DAG, const SparcTargetLowering &TLI, const SparcSubtarget *Subtarget)
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted...
This class defines information used to lower LLVM code to legal SelectionDAG operators that the targe...
Integer horizontal add/sub.
This represents a list of ValueType&#39;s that has been intern&#39;d by a SelectionDAG.
Copies a 64-bit value from the low word of an XMM vector to an MMX vector.
void assign(size_type NumElts, const T &Elt)
Definition: SmallVector.h:423
Context object for machine code objects.
Definition: MCContext.h:63
static SDValue LowerINSERT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG)
Copies a 32-bit value from the low word of a MMX vector to a GPR.
Fast - This calling convention attempts to make calls as fast as possible (e.g.
Definition: CallingConv.h:43
This is a fast-path instruction selection class that generates poor code and doesn&#39;t support illegal ...
Definition: FastISel.h:67
X86 FP SETCC, similar to above, but with output as an i1 mask and with optional rounding mode...
Return from interrupt. Operand 0 is the number of bytes to pop.
This contains information for each constraint that we are lowering.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory)...
Definition: APInt.h:33
An instruction for storing to memory.
Definition: Instructions.h:321
CondCode
ISD::CondCode enum - These are ordered carefully to make the bitfields below work out...
Definition: ISDOpcodes.h:959
static bool classof(const SDNode *N)
X86 FP SETCC, implemented with CMP{cc}SS/CMP{cc}SD.
const SDValue & getBasePtr() const
virtual unsigned getInlineAsmMemConstraint(StringRef ConstraintCode) const
Floating point horizontal add/sub.
unsigned getInlineAsmMemConstraint(StringRef ConstraintCode) const override
amdgpu Simplify well known AMD library false Value * Callee
Analysis containing CSE Info
Definition: CSEInfo.cpp:21
Bitwise logical XOR of floating point values.
uint16_t MCPhysReg
An unsigned integer type large enough to represent all physical registers, but not necessarily virtua...
static bool classof(const SDNode *N)
const SDValue & getMask() const
Machine Value Type.
static SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG)
The instances of the Type class are immutable: once they are created, they are never changed...
Definition: Type.h:46
This instruction implements an extending load to FP stack slots.
This is an important class for using LLVM in a threaded context.
Definition: LLVMContext.h:69
Insert any element of a 4 x float vector into any element of a destination 4 x floatvector.
unsigned getScalarSizeInBits() const
size_t size() const
size - Get the array size.
Definition: ArrayRef.h:149
This is an important base class in LLVM.
Definition: Constant.h:42
Repeat fill, corresponds to X86::REP_STOSx.
static bool is64Bit(const char *name)
LoadExtType
LoadExtType enum - This enum defines the three variants of LOADEXT (load with extension).
Definition: ISDOpcodes.h:934
bool storeOfVectorConstantIsCheap(EVT MemVT, unsigned NumElem, unsigned AddrSpace) const override
Return true if it is expected to be cheaper to do a store of a non-zero vector constant with the give...
X86 conditional branches.
Insert the lower 16-bits of a 32-bit value to a vector, corresponds to X86::PINSRW.
Commutative FMIN and FMAX.
static SDValue LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG, const SparcSubtarget *Subtarget)
On Darwin, this node represents the result of the popl at function entry, used for PIC code...
bool convertSetCCLogicToBitwiseLogic(EVT VT) const override
Use bitwise logic to make pairs of compares more efficient.
static SDValue LowerUINT_TO_FP(SDValue Op, SelectionDAG &DAG, const SparcTargetLowering &TLI, bool hasHardQuad)
const SDValue & getValue() const
static SDValue LowerDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG, const SparcSubtarget *Subtarget)
lazy value info
std::vector< ArgListEntry > ArgListTy
Extended Value Type.
Definition: ValueTypes.h:34
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
This structure contains all information that is necessary for lowering calls.
These operations represent an abstract X86 call instruction, which includes a bunch of information...
Floating point max and min.
static SDValue LowerSETCCCARRY(SDValue Op, SelectionDAG &DAG)
TruncSStoreSDNode(unsigned Order, const DebugLoc &dl, SDVTList VTs, EVT MemVT, MachineMemOperand *MMO)
bool isScalarFPTypeInSSEReg(EVT VT) const
Return true if the specified scalar FP type is computed in an SSE register, not on the X87 floating p...
Copies a GPR into the low 32-bit word of a MMX vector and zero out the high word. ...
CallingConv::ID getCallingConv() const
getCallingConv()/setCallingConv(CC) - These method get and set the calling convention of this functio...
Definition: Function.h:213
This is used to represent a portion of an LLVM function in a low-level Data Dependence DAG representa...
Definition: SelectionDAG.h:222
unsigned getMaxSupportedInterleaveFactor() const override
Get the maximum supported factor for interleaved memory accesses.
Provides information about what library functions are available for the current target.
X86 Read Time-Stamp Counter and Processor ID.
CCValAssign - Represent assignment of one arg/retval to a location.
AddressSpace
Definition: NVPTXBaseInfo.h:22
unsigned getMemcmpEqZeroLoadsPerBlock() const override
Allow multiple load pairs per block for smaller and faster code.
X86MaskedScatterSDNode(unsigned Order, const DebugLoc &dl, SDVTList VTs, EVT MemVT, MachineMemOperand *MMO)
This is an abstract virtual class for memory operations.
Wrapper class for IR location info (IR ordering and DebugLoc) to be passed into SDNode creation funct...
Bit scan reverse.
Floating point reciprocal-sqrt and reciprocal approximation.
static const int FIRST_TARGET_MEMORY_OPCODE
FIRST_TARGET_MEMORY_OPCODE - Target-specific pre-isel operations which do not reference a specific me...
Definition: ISDOpcodes.h:884
const SDValue & getValue() const
Represents one node in the SelectionDAG.
X86 bit-test instructions.
static bool Enabled
Definition: Statistic.cpp:51
const Function & getFunction() const
Return the LLVM function that this machine code represents.
static bool classof(const SDNode *N)
MaskedTruncSStoreSDNode(unsigned Order, const DebugLoc &dl, SDVTList VTs, EVT MemVT, MachineMemOperand *MMO)
Class for arbitrary precision integers.
Definition: APInt.h:70
static SDValue LowerVAARG(SDValue Op, SelectionDAG &DAG)
static bool classof(const SDNode *N)
This instruction implements FP_TO_SINT with the integer destination in memory and a FP reg source...
Bit scan forward.
const char * getClearCacheBuiltinName() const override
Intel processors have a unified instruction and data cache.
amdgpu Simplify well known AMD library false Value Value * Arg
bool ShouldShrinkFPConstant(EVT VT) const override
If true, then instruction selection should seek to shrink the FP constant of the specified type to a ...
Representation of each machine instruction.
Definition: MachineInstr.h:64
static unsigned getScalingFactorCost(const TargetTransformInfo &TTI, const LSRUse &LU, const Formula &F, const Loop &L)
bool isVector() const
Return true if this is a vector value type.
Definition: ValueTypes.h:151
Insert the lower 8-bits of a 32-bit value to a vector, corresponds to X86::PINSRB.
LLVM_NODISCARD bool empty() const
Definition: SmallVector.h:56
A wrapper node for TargetConstantPool, TargetJumpTable, TargetExternalSymbol, TargetGlobalAddress, TargetGlobalTLSAddress, MCSymbol and TargetBlockAddress.
Bitwise logical AND of floating point values.
#define I(x, y, z)
Definition: MD5.cpp:58
#define N
FunctionLoweringInfo - This contains information that is global to a function that is used when lower...
static bool classof(const SDNode *N)
X86MaskedStoreSDNode(unsigned Opcode, unsigned Order, const DebugLoc &dl, SDVTList VTs, EVT MemVT, MachineMemOperand *MMO)
uint32_t Size
Definition: Profile.cpp:47
LOCK-prefixed arithmetic read-modify-write instructions.
Extract a 16-bit value from a vector and zero extend it to i32, corresponds to X86::PEXTRW.
bool hasVectorBlend() const override
Return true if the target has a vector blend instruction.
Blend where the selector is an immediate.
X86MaskedGatherSDNode(unsigned Order, const DebugLoc &dl, SDVTList VTs, EVT MemVT, MachineMemOperand *MMO)
This instruction implements a truncating store to FP stack slots.
Combined add and sub on an FP vector.
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
LegalizeTypeAction
This enum indicates whether a types are legal for a target, and if not, what action should be used to...
This instruction grabs the address of the next argument from a va_list.
LLVM Value Representation.
Definition: Value.h:73
Bitwise logical OR of floating point values.
X86 Read Performance Monitoring Counters.
const SDValue & getBasePtr() const
std::underlying_type< E >::type Mask()
Get a bitmask with 1s in all places up to the high-order bit of E&#39;s largest value.
Definition: BitmaskEnum.h:81
static SDValue LowerSINT_TO_FP(SDValue Op, SelectionDAG &DAG, const SparcTargetLowering &TLI, bool hasHardQuad)
IRTranslator LLVM IR MI
bool isZeroNode(SDValue Elt)
Returns true if Elt is a constant zero or floating point constant +0.0.
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:49
bool isOffsetSuitableForCodeModel(int64_t Offset, CodeModel::Model M, bool hasSymbolicDisplacement=true)
Returns true of the given offset can be fit into displacement field of the instruction.
const SDValue & getPassThru() const
bool hasBitPreservingFPLogic(EVT VT) const override
Return true if it is safe to transform an integer-domain bitwise operation into the equivalent floati...
Compute Sum of Absolute Differences.
Scalar intrinsic floating point max and min.
MVT getScalarShiftAmountTy(const DataLayout &, EVT VT) const override
EVT is not used in-tree, but is used by out-of-tree target.
Unlike LLVM values, Selection DAG nodes may return multiple values as the result of a computation...
void scaleShuffleMask(int Scale, ArrayRef< T > Mask, SmallVectorImpl< T > &ScaledMask)
Helper function to scale a shuffle or target shuffle mask, replacing each mask index with the scaled ...
constexpr char Args[]
Key for Kernel::Metadata::mArgs.
FastISel * createFastISel(FunctionLoweringInfo &funcInfo, const TargetLibraryInfo *libInfo)
BRIND node with NoTrack prefix.
Shuffle 16 8-bit values within a vector.
This file describes how to lower LLVM code to machine code.
Special wrapper used under X86-64 PIC mode for RIP relative displacements.