LLVM 22.0.0git
X86ISelLowering.h
Go to the documentation of this file.
1//===-- X86ISelLowering.h - X86 DAG Lowering Interface ----------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file defines the interfaces that X86 uses to lower LLVM code into a
10// selection DAG.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_LIB_TARGET_X86_X86ISELLOWERING_H
15#define LLVM_LIB_TARGET_X86_X86ISELLOWERING_H
16
19
20namespace llvm {
21 class X86Subtarget;
22 class X86TargetMachine;
23
24 namespace X86ISD {
25 // X86 Specific DAG Nodes
26 enum NodeType : unsigned {
27 // Start the numbering where the builtin ops leave off.
29
30 /// Bit scan forward.
32 /// Bit scan reverse.
34
35 /// X86 funnel/double shift i16 instructions. These correspond to
36 /// X86::SHLDW and X86::SHRDW instructions which have different amt
37 /// modulo rules to generic funnel shifts.
38 /// NOTE: The operand order matches ISD::FSHL/FSHR not SHLD/SHRD.
41
42 /// Bitwise logical AND of floating point values. This corresponds
43 /// to X86::ANDPS or X86::ANDPD.
45
46 /// Bitwise logical OR of floating point values. This corresponds
47 /// to X86::ORPS or X86::ORPD.
49
50 /// Bitwise logical XOR of floating point values. This corresponds
51 /// to X86::XORPS or X86::XORPD.
53
54 /// Bitwise logical ANDNOT of floating point values. This
55 /// corresponds to X86::ANDNPS or X86::ANDNPD.
57
58 /// These operations represent an abstract X86 call
59 /// instruction, which includes a bunch of information. In particular the
60 /// operands of these node are:
61 ///
62 /// #0 - The incoming token chain
63 /// #1 - The callee
64 /// #2 - The number of arg bytes the caller pushes on the stack.
65 /// #3 - The number of arg bytes the callee pops off the stack.
66 /// #4 - The value to pass in AL/AX/EAX (optional)
67 /// #5 - The value to pass in DL/DX/EDX (optional)
68 ///
69 /// The result values of these nodes are:
70 ///
71 /// #0 - The outgoing token chain
72 /// #1 - The first register result value (optional)
73 /// #2 - The second register result value (optional)
74 ///
76
77 /// Same as call except it adds the NoTrack prefix.
79
80 // Pseudo for a OBJC call that gets emitted together with a special
81 // marker instruction.
83
84 /// The same as ISD::CopyFromReg except that this node makes it explicit
85 /// that it may lower to an x87 FPU stack pop. Optimizations should be more
86 /// cautious when handling this node than a normal CopyFromReg to avoid
87 /// removing a required FPU stack pop. A key requirement is optimizations
88 /// should not optimize any users of a chain that contains a
89 /// POP_FROM_X87_REG to use a chain from a point earlier than the
90 /// POP_FROM_X87_REG (which may remove a required FPU stack pop).
92
93 // Pseudo for a call to an imported function to ensure the correct machine
94 // instruction is emitted for Import Call Optimization.
96
97 /// X86 compare and logical compare instructions.
102
103 // X86 compare with Intrinsics similar to COMI.
106
107 /// X86 bit-test instructions.
109
110 /// X86 SetCC. Operand 0 is condition code, and operand 1 is the EFLAGS
111 /// operand, usually produced by a CMP instruction.
113
114 /// X86 Select
116
117 // Same as SETCC except it's materialized with a sbb and the value is all
118 // one's or all zero's.
119 SETCC_CARRY, // R = carry_bit ? ~0 : 0
120
121 /// X86 FP SETCC, implemented with CMP{cc}SS/CMP{cc}SD.
122 /// Operands are two FP values to compare; result is a mask of
123 /// 0s or 1s. Generally DTRT for C/C++ with NaNs.
125
126 /// X86 FP SETCC, similar to above, but with output as an i1 mask and
127 /// and a version with SAE.
130
131 /// X86 conditional moves. Operand 0 and operand 1 are the two values
132 /// to select from. Operand 2 is the condition code, and operand 3 is the
133 /// flag operand produced by a CMP or TEST instruction.
135
136 /// X86 conditional branches. Operand 0 is the chain operand, operand 1
137 /// is the block to branch if condition is true, operand 2 is the
138 /// condition code, and operand 3 is the flag operand produced by a CMP
139 /// or TEST instruction.
141
142 /// BRIND node with NoTrack prefix. Operand 0 is the chain operand and
143 /// operand 1 is the target address.
145
146 /// Return with a glue operand. Operand 0 is the chain operand, operand
147 /// 1 is the number of bytes of stack to pop.
149
150 /// Return from interrupt. Operand 0 is the number of bytes to pop.
152
153 /// Repeat fill, corresponds to X86::REP_STOSx.
155
156 /// Repeat move, corresponds to X86::REP_MOVSx.
158
159 /// On Darwin, this node represents the result of the popl
160 /// at function entry, used for PIC code.
162
163 /// A wrapper node for TargetConstantPool, TargetJumpTable,
164 /// TargetExternalSymbol, TargetGlobalAddress, TargetGlobalTLSAddress,
165 /// MCSymbol and TargetBlockAddress.
167
168 /// Special wrapper used under X86-64 PIC mode for RIP
169 /// relative displacements.
171
172 /// Copies a 64-bit value from an MMX vector to the low word
173 /// of an XMM vector, with the high word zero filled.
175
176 /// Copies a 64-bit value from the low word of an XMM vector
177 /// to an MMX vector.
179
180 /// Copies a 32-bit value from the low word of a MMX
181 /// vector to a GPR.
183
184 /// Copies a GPR into the low 32-bit word of a MMX vector
185 /// and zero out the high word.
187
188 /// Extract an 8-bit value from a vector and zero extend it to
189 /// i32, corresponds to X86::PEXTRB.
191
192 /// Extract a 16-bit value from a vector and zero extend it to
193 /// i32, corresponds to X86::PEXTRW.
195
196 /// Insert any element of a 4 x float vector into any element
197 /// of a destination 4 x floatvector.
199
200 /// Insert the lower 8-bits of a 32-bit value to a vector,
201 /// corresponds to X86::PINSRB.
203
204 /// Insert the lower 16-bits of a 32-bit value to a vector,
205 /// corresponds to X86::PINSRW.
207
208 /// Shuffle 16 8-bit values within a vector.
210
211 /// Compute Sum of Absolute Differences.
213 /// Compute Double Block Packed Sum-Absolute-Differences
215
216 /// Bitwise Logical AND NOT of Packed FP values.
218
219 /// Blend where the selector is an immediate.
221
222 /// Dynamic (non-constant condition) vector blend where only the sign bits
223 /// of the condition elements are used. This is used to enforce that the
224 /// condition mask is not valid for generic VSELECT optimizations. This
225 /// is also used to implement the intrinsics.
226 /// Operands are in VSELECT order: MASK, TRUE, FALSE
228
229 /// Combined add and sub on an FP vector.
231
232 // FP vector ops with rounding mode.
252
253 // FP vector get exponent.
258 // Extract Normalized Mantissas.
263 // FP Scale.
268
269 /// Integer horizontal add/sub.
272
273 /// Integer horizontal saturating add/sub.
276
277 /// Floating point horizontal add/sub.
280
281 // Detect Conflicts Within a Vector
283
284 /// Floating point max and min.
287
288 /// Commutative FMIN and FMAX.
291
292 /// Scalar intrinsic floating point max and min.
295
296 /// Floating point reciprocal-sqrt and reciprocal approximation.
297 /// Note that these typically require refinement
298 /// in order to obtain suitable precision.
301
302 // AVX-512 reciprocal approximations with a little more precision.
307
308 // Thread Local Storage.
310
311 // Thread Local Storage. A call to get the start address
312 // of the TLS block for the current module.
314
315 // Thread Local Storage. When calling to an OS provided
316 // thunk at the address from an earlier relocation.
318
319 // Thread Local Storage. A descriptor containing pointer to
320 // code and to argument to get the TLS offset for the symbol.
322
323 // Exception Handling helpers.
325
326 // SjLj exception handling setjmp.
328
329 // SjLj exception handling longjmp.
331
332 // SjLj exception handling dispatch.
334
335 /// Tail call return. See X86TargetLowering::LowerCall for
336 /// the list of operands.
338
339 // Vector move to low scalar and zero higher vector elements.
341
342 // Vector integer truncate.
344 // Vector integer truncate with unsigned/signed saturation.
347
348 // Masked version of the above. Used when less than a 128-bit result is
349 // produced since the mask only applies to the lower elements and can't
350 // be represented by a select.
351 // SRC, PASSTHRU, MASK
355
356 // Vector FP extend.
361
362 // Vector FP round.
364 // Convert TWO packed single data to one packed data
370
371 // Masked version of above. Used for v2f64->v4f32.
372 // SRC, PASSTHRU, MASK
374
375 // 128-bit vector logical left / right shift
378
379 // Vector shift elements
383
384 // Vector variable shift
388
389 // Vector shift elements by immediate
393
394 // Shifts of mask registers.
397
398 // Bit rotate by immediate
401
402 // Vector packed double/float comparison.
404
405 // Vector integer comparisons.
408
409 // v8i16 Horizontal minimum and position.
411
413
414 /// Vector comparison generating mask bits for fp and
415 /// integer signed and unsigned data types.
417 // Vector mask comparison generating mask bits for FP values.
419 // Vector mask comparison with SAE for FP values.
421
422 // Arithmetic operations with FLAGS results.
432
433 // Bit field extract.
436
437 // Zero High Bits Starting with Specified Bit Position.
439
440 // Parallel extract and deposit.
443
444 // X86-specific multiply by immediate.
446
447 // Vector sign bit extraction.
449
450 // Vector bitwise comparisons.
452
453 // Vector packed fp sign bitwise comparisons.
455
456 // OR/AND test for masks.
459
460 // ADD for masks.
462
463 // Several flavors of instructions with vector shuffle behaviors.
464 // Saturated signed/unnsigned packing.
467 // Intra-lane alignr.
469 // AVX512 inter-lane alignr.
475 // VBMI2 Concat & Shift.
478
479 // Shuffle Packed Values at 128-bit granularity.
495
496 // Variable Permute (VPERM).
497 // Res = VPERMV MaskV, V0
499
500 // 3-op Variable Permute (VPERMT2).
501 // Res = VPERMV3 V0, MaskV, V1
503
504 // Bitwise ternary logic.
506 // Fix Up Special Packed Float32/64 values.
511 // Range Restriction Calculation For Packed Pairs of Float32/64 values.
516 // Reduce - Perform Reduction Transformation on scalar\packed FP.
521 // RndScale - Round FP Values To Include A Given Number Of Fraction Bits.
522 // Also used by the legacy (V)ROUND intrinsics where we mask out the
523 // scaling part of the immediate.
528 // Tests Types Of a FP Values for packed types.
530 // Tests Types Of a FP Values for scalar types.
532
533 // Broadcast (splat) scalar or element 0 of a vector. If the operand is
534 // a vector, this node may change the vector length as part of the splat.
536 // Broadcast mask to vector.
538
539 /// SSE4A Extraction and Insertion.
542
543 // XOP arithmetic/logical shifts.
546 // XOP signed/unsigned integer comparisons.
549 // XOP packed permute bytes.
551 // XOP two source permutation.
553
554 // Vector multiply packed unsigned doubleword integers.
556 // Vector multiply packed signed doubleword integers.
558 // Vector Multiply Packed UnsignedIntegers with Round and Scale.
560
561 // Multiply and Add Packed Integers.
564
565 // AVX512IFMA multiply and add.
566 // NOTE: These are different than the instruction and perform
567 // op0 x op1 + op2.
570
571 // VNNI
576
577 // FMA nodes.
578 // We use the target independent ISD::FMA for the non-inverted case.
584
585 // FMA with rounding mode.
592
593 // AVX512-FP16 complex addition and multiplication.
598
603
608
613
620
627
632
641
643
665
666 // Compress and expand.
669
670 // Bits shuffle
672
673 // Convert Unsigned/Integer to Floating-Point Value with rounding mode.
680
681 // Vector float/double to signed/unsigned integer.
686 // Scalar float/double to signed/unsigned integer.
691
692 // Vector float/double to signed/unsigned integer with truncation.
697
698 // Saturation enabled Vector float/double to signed/unsigned
699 // integer with truncation.
704 // Masked versions of above. Used for v2f64 to v4i32.
705 // SRC, PASSTHRU, MASK
708
709 // Scalar float/double to signed/unsigned integer with truncation.
714
715 // Vector signed/unsigned integer to float/double.
718
719 // Scalar float/double to signed/unsigned integer with saturation.
724
725 // Masked versions of above. Used for v2f64->v4f32.
726 // SRC, PASSTHRU, MASK
733
734 // Custom handling for FP_TO_xINT_SAT
737
738 // Vector float to bfloat16.
739 // Convert packed single data to packed BF16 data
741 // Masked version of above.
742 // SRC, PASSTHRU, MASK
744
745 // Dot product of BF16/FP16 pairs to accumulated into
746 // packed single precision.
749
750 // A stack checking function call. On Windows it's _chkstk call.
752
753 // For allocating variable amounts of stack space when using
754 // segmented stacks. Check if the current stacklet has enough space, and
755 // falls back to heap allocation if not.
757
758 // For allocating stack space when using stack clash protector.
759 // Allocation is performed by block, and each block is probed.
761
762 // Memory barriers.
764
765 // Get a random integer and indicate whether it is valid in CF.
767
768 // Get a NIST SP800-90B & C compliant random integer and
769 // indicate whether it is valid in CF.
771
772 // Protection keys
773 // RDPKRU - Operand 0 is chain. Operand 1 is value for ECX.
774 // WRPKRU - Operand 0 is chain. Operand 1 is value for EDX. Operand 2 is
775 // value for ECX.
778
779 // SSE42 string comparisons.
780 // These nodes produce 3 results, index, mask, and flags. X86ISelDAGToDAG
781 // will emit one or two instructions based on which results are used. If
782 // flags and index/mask this allows us to use a single instruction since
783 // we won't have to pick and opcode for flags. Instead we can rely on the
784 // DAG to CSE everything and decide at isel.
787
788 // Test if in transactional execution.
790
791 // Conversions between float and half-float.
796
797 // Masked version of above.
798 // SRC, RND, PASSTHRU, MASK
801
802 // Galois Field Arithmetic Instructions
806
807 // LWP insert record.
809
810 // User level wait
813
814 // Enqueue Stores Instructions
817
818 // For avx512-vp2intersect
820
821 // User level interrupts - testui
823
824 // Perform an FP80 add after changing precision control in FPCW.
826
827 // Conditional compare instructions
830
831 /// X86 strict FP compare instructions.
835
836 // Vector packed double/float comparison.
838
839 /// Vector comparison generating mask bits for fp and
840 /// integer signed and unsigned data types.
842
843 // Vector float/double to signed/unsigned integer with truncation.
846
847 // Vector FP extend.
849
850 // Vector FP round.
852
853 // RndScale - Round FP Values To Include A Given Number Of Fraction Bits.
854 // Also used by the legacy (V)ROUND intrinsics where we mask out the
855 // scaling part of the immediate.
857
858 // Vector signed/unsigned integer to float/double.
861
862 // Strict FMA nodes.
866
867 // Conversions between float and half-float.
870
871 // Perform an FP80 add after changing precision control in FPCW.
873
874 /// Floating point max and min.
878
879 // Compare and swap.
885
886 /// LOCK-prefixed arithmetic read-modify-write instructions.
887 /// EFLAGS, OUTCHAIN = LADD(INCHAIN, PTR, RHS)
899
900 /// RAO arithmetic instructions.
901 /// OUTCHAIN = AADD(INCHAIN, PTR, RHS)
906
907 // Load, scalar_to_vector, and zero extend.
909
910 // extract_vector_elt, store.
912
913 // scalar broadcast from memory.
915
916 // subvector broadcast from memory.
918
919 // Store FP control word into i16 memory.
921
922 // Load FP control word from i16 memory.
924
925 // Store x87 FPU environment into memory.
927
928 // Load x87 FPU environment from memory.
930
931 /// This instruction implements FP_TO_SINT with the
932 /// integer destination in memory and a FP reg source. This corresponds
933 /// to the X86::FIST*m instructions and the rounding mode change stuff. It
934 /// has two inputs (token chain and address) and two outputs (int value
935 /// and token chain). Memory VT specifies the type to store to.
937
938 /// This instruction implements SINT_TO_FP with the
939 /// integer source in memory and FP reg result. This corresponds to the
940 /// X86::FILD*m instructions. It has two inputs (token chain and address)
941 /// and two outputs (FP value and token chain). The integer source type is
942 /// specified by the memory VT.
944
945 /// This instruction implements a fp->int store from FP stack
946 /// slots. This corresponds to the fist instruction. It takes a
947 /// chain operand, value to store, address, and glue. The memory VT
948 /// specifies the type to store as.
950
951 /// This instruction implements an extending load to FP stack slots.
952 /// This corresponds to the X86::FLD32m / X86::FLD64m. It takes a chain
953 /// operand, and ptr to load from. The memory VT specifies the type to
954 /// load from.
956
957 /// This instruction implements a truncating store from FP stack
958 /// slots. This corresponds to the X86::FST32m / X86::FST64m. It takes a
959 /// chain operand, value to store, address, and glue. The memory VT
960 /// specifies the type to store as.
962
963 /// These instructions grab the address of the next argument
964 /// from a va_list. (reads and modifies the va_list in memory)
967
968 // Vector truncating store with unsigned/signed saturation
971 // Vector truncating masked store with unsigned/signed saturation
974
975 // X86 specific gather and scatter
978
979 // Key locker nodes that produce flags.
988
989 /// Compare and Add if Condition is Met. Compare value in operand 2 with
990 /// value in memory of operand 1. If condition of operand 4 is met, add
991 /// value operand 3 to m32 and write new value in operand 1. Operand 2 is
992 /// always updated with the original value from operand 1.
994
995 // Save xmm argument registers to the stack, according to %al. An operator
996 // is needed so that this can be expanded with control flow.
998
999 // Conditional load/store instructions
1003 };
1004 } // end namespace X86ISD
1005
1006 namespace X86 {
1007 /// Current rounding mode is represented in bits 11:10 of FPSR. These
1008 /// values are same as corresponding constants for rounding mode used
1009 /// in glibc.
1011 rmInvalid = -1, // For handle Invalid rounding mode
1012 rmToNearest = 0, // FE_TONEAREST
1013 rmDownward = 1 << 10, // FE_DOWNWARD
1014 rmUpward = 2 << 10, // FE_UPWARD
1015 rmTowardZero = 3 << 10, // FE_TOWARDZERO
1016 rmMask = 3 << 10 // Bit mask selecting rounding mode
1017 };
1018 }
1019
1020 /// Define some predicates that are used for node matching.
1021 namespace X86 {
1022 /// Returns true if Elt is a constant zero or floating point constant +0.0.
1023 bool isZeroNode(SDValue Elt);
1024
1025 /// Returns true of the given offset can be
1026 /// fit into displacement field of the instruction.
1028 bool hasSymbolicDisplacement);
1029
1030 /// Determines whether the callee is required to pop its
1031 /// own arguments. Callee pop is necessary to support tail calls.
1032 bool isCalleePop(CallingConv::ID CallingConv,
1033 bool is64Bit, bool IsVarArg, bool GuaranteeTCO);
1034
1035 /// If Op is a constant whose elements are all the same constant or
1036 /// undefined, return true and return the constant value in \p SplatVal.
1037 /// If we have undef bits that don't cover an entire element, we treat these
1038 /// as zero if AllowPartialUndefs is set, else we fail and return false.
1039 bool isConstantSplat(SDValue Op, APInt &SplatVal,
1040 bool AllowPartialUndefs = true);
1041
1042 /// Check if Op is a load operation that could be folded into some other x86
1043 /// instruction as a memory operand. Example: vpaddd (%rdi), %xmm0, %xmm0.
1044 bool mayFoldLoad(SDValue Op, const X86Subtarget &Subtarget,
1045 bool AssumeSingleUse = false,
1046 bool IgnoreAlignment = false);
1047
1048 /// Check if Op is a load operation that could be folded into a vector splat
1049 /// instruction as a memory operand. Example: vbroadcastss 16(%rdi), %xmm2.
1051 const X86Subtarget &Subtarget,
1052 bool AssumeSingleUse = false);
1053
1054 /// Check if Op is a value that could be used to fold a store into some
1055 /// other x86 instruction as a memory operand. Ex: pextrb $0, %xmm0, (%rdi).
1057
1058 /// Check if Op is an operation that could be folded into a zero extend x86
1059 /// instruction.
1061
1062 /// True if the target supports the extended frame for async Swift
1063 /// functions.
1064 bool isExtendedSwiftAsyncFrameSupported(const X86Subtarget &Subtarget,
1065 const MachineFunction &MF);
1066
1067 /// Convert LLVM rounding mode to X86 rounding mode.
1068 int getRoundingModeX86(unsigned RM);
1069
1070 } // end namespace X86
1071
1072 //===--------------------------------------------------------------------===//
1073 // X86 Implementation of the TargetLowering interface
1074 class X86TargetLowering final : public TargetLowering {
1075 public:
1076 explicit X86TargetLowering(const X86TargetMachine &TM,
1077 const X86Subtarget &STI);
1078
1079 unsigned getJumpTableEncoding() const override;
1080 bool useSoftFloat() const override;
1081
1082 void markLibCallAttributes(MachineFunction *MF, unsigned CC,
1083 ArgListTy &Args) const override;
1084
1085 MVT getScalarShiftAmountTy(const DataLayout &, EVT VT) const override {
1086 return MVT::i8;
1087 }
1088
1089 const MCExpr *
1091 const MachineBasicBlock *MBB, unsigned uid,
1092 MCContext &Ctx) const override;
1093
1094 /// Returns relocation base for the given PIC jumptable.
1096 SelectionDAG &DAG) const override;
1097 const MCExpr *
1099 unsigned JTI, MCContext &Ctx) const override;
1100
1101 /// Return the desired alignment for ByVal aggregate
1102 /// function arguments in the caller parameter area. For X86, aggregates
1103 /// that contains are placed at 16-byte boundaries while the rest are at
1104 /// 4-byte boundaries.
1105 Align getByValTypeAlignment(Type *Ty, const DataLayout &DL) const override;
1106
1107 EVT getOptimalMemOpType(LLVMContext &Context, const MemOp &Op,
1108 const AttributeList &FuncAttributes) const override;
1109
1110 /// Returns true if it's safe to use load / store of the
1111 /// specified type to expand memcpy / memset inline. This is mostly true
1112 /// for all types except for some special cases. For example, on X86
1113 /// targets without SSE2 f64 load / store are done with fldl / fstpl which
1114 /// also does type conversion. Note the specified type doesn't have to be
1115 /// legal as the hook is used before type legalization.
1116 bool isSafeMemOpType(MVT VT) const override;
1117
1118 bool isMemoryAccessFast(EVT VT, Align Alignment) const;
1119
1120 /// Returns true if the target allows unaligned memory accesses of the
1121 /// specified type. Returns whether it is "fast" in the last argument.
1122 bool allowsMisalignedMemoryAccesses(EVT VT, unsigned AS, Align Alignment,
1124 unsigned *Fast) const override;
1125
1126 /// This function returns true if the memory access is aligned or if the
1127 /// target allows this specific unaligned memory access. If the access is
1128 /// allowed, the optional final parameter returns a relative speed of the
1129 /// access (as defined by the target).
1130 bool allowsMemoryAccess(
1131 LLVMContext &Context, const DataLayout &DL, EVT VT, unsigned AddrSpace,
1132 Align Alignment,
1134 unsigned *Fast = nullptr) const override;
1135
1137 const MachineMemOperand &MMO,
1138 unsigned *Fast) const {
1139 return allowsMemoryAccess(Context, DL, VT, MMO.getAddrSpace(),
1140 MMO.getAlign(), MMO.getFlags(), Fast);
1141 }
1142
1143 /// Provide custom lowering hooks for some operations.
1144 ///
1145 SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
1146
1147 /// Replace the results of node with an illegal result
1148 /// type with new values built out of custom code.
1149 ///
1151 SelectionDAG &DAG) const override;
1152
1153 SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const override;
1154
1155 bool preferABDSToABSWithNSW(EVT VT) const override;
1156
1157 bool preferSextInRegOfTruncate(EVT TruncVT, EVT VT,
1158 EVT ExtVT) const override;
1159
1161 EVT VT) const override;
1162
1163 /// Return true if the target has native support for
1164 /// the specified value type and it is 'desirable' to use the type for the
1165 /// given node type. e.g. On x86 i16 is legal, but undesirable since i16
1166 /// instruction encodings are longer and some i16 instructions are slow.
1167 bool isTypeDesirableForOp(unsigned Opc, EVT VT) const override;
1168
1169 /// Return true if the target has native support for the
1170 /// specified value type and it is 'desirable' to use the type. e.g. On x86
1171 /// i16 is legal, but undesirable since i16 instruction encodings are longer
1172 /// and some i16 instructions are slow.
1173 bool IsDesirableToPromoteOp(SDValue Op, EVT &PVT) const override;
1174
1175 /// Return prefered fold type, Abs if this is a vector, AddAnd if its an
1176 /// integer, None otherwise.
1179 const SDNode *SETCC0,
1180 const SDNode *SETCC1) const override;
1181
1182 /// Return the newly negated expression if the cost is not expensive and
1183 /// set the cost in \p Cost to indicate that if it is cheaper or neutral to
1184 /// do the negation.
1186 bool LegalOperations, bool ForCodeSize,
1188 unsigned Depth) const override;
1189
1192 MachineBasicBlock *MBB) const override;
1193
1194 /// This method returns the name of a target specific DAG node.
1195 const char *getTargetNodeName(unsigned Opcode) const override;
1196
1197 /// Do not merge vector stores after legalization because that may conflict
1198 /// with x86-specific store splitting optimizations.
1199 bool mergeStoresAfterLegalization(EVT MemVT) const override {
1200 return !MemVT.isVector();
1201 }
1202
1203 bool canMergeStoresTo(unsigned AddressSpace, EVT MemVT,
1204 const MachineFunction &MF) const override;
1205
1206 bool isCheapToSpeculateCttz(Type *Ty) const override;
1207
1208 bool isCheapToSpeculateCtlz(Type *Ty) const override;
1209
1210 bool isCtlzFast() const override;
1211
1212 bool isMultiStoresCheaperThanBitsMerge(EVT LTy, EVT HTy) const override {
1213 // If the pair to store is a mixture of float and int values, we will
1214 // save two bitwise instructions and one float-to-int instruction and
1215 // increase one store instruction. There is potentially a more
1216 // significant benefit because it avoids the float->int domain switch
1217 // for input value. So It is more likely a win.
1218 if ((LTy.isFloatingPoint() && HTy.isInteger()) ||
1219 (LTy.isInteger() && HTy.isFloatingPoint()))
1220 return true;
1221 // If the pair only contains int values, we will save two bitwise
1222 // instructions and increase one store instruction (costing one more
1223 // store buffer). Since the benefit is more blurred so we leave
1224 // such pair out until we get testcase to prove it is a win.
1225 return false;
1226 }
1227
1228 bool isMaskAndCmp0FoldingBeneficial(const Instruction &AndI) const override;
1229
1230 bool hasAndNotCompare(SDValue Y) const override;
1231
1232 bool hasAndNot(SDValue Y) const override;
1233
1234 bool hasBitTest(SDValue X, SDValue Y) const override;
1235
1238 unsigned OldShiftOpcode, unsigned NewShiftOpcode,
1239 SelectionDAG &DAG) const override;
1240
1242 EVT VT, unsigned ShiftOpc, bool MayTransformRotate,
1243 const APInt &ShiftOrRotateAmt,
1244 const std::optional<APInt> &AndMask) const override;
1245
1246 bool preferScalarizeSplat(SDNode *N) const override;
1247
1248 CondMergingParams
1250 const Value *Rhs) const override;
1251
1252 bool shouldFoldConstantShiftPairToMask(const SDNode *N) const override;
1253
1254 bool shouldFoldMaskToVariableShiftPair(SDValue Y) const override;
1255
1256 bool
1258 unsigned KeptBits) const override {
1259 // For vectors, we don't have a preference..
1260 if (XVT.isVector())
1261 return false;
1262
1263 auto VTIsOk = [](EVT VT) -> bool {
1264 return VT == MVT::i8 || VT == MVT::i16 || VT == MVT::i32 ||
1265 VT == MVT::i64;
1266 };
1267
1268 // We are ok with KeptBitsVT being byte/word/dword, what MOVS supports.
1269 // XVT will be larger than KeptBitsVT.
1270 MVT KeptBitsVT = MVT::getIntegerVT(KeptBits);
1271 return VTIsOk(XVT) && VTIsOk(KeptBitsVT);
1272 }
1273
1276 unsigned ExpansionFactor) const override;
1277
1278 bool shouldSplatInsEltVarIndex(EVT VT) const override;
1279
1280 bool shouldConvertFpToSat(unsigned Op, EVT FPVT, EVT VT) const override {
1281 // Converting to sat variants holds little benefit on X86 as we will just
1282 // need to saturate the value back using fp arithmatic.
1284 }
1285
1286 bool convertSetCCLogicToBitwiseLogic(EVT VT) const override {
1287 return VT.isScalarInteger();
1288 }
1289
1290 /// Vector-sized comparisons are fast using PCMPEQ + PMOVMSK or PTEST.
1291 MVT hasFastEqualityCompare(unsigned NumBits) const override;
1292
1293 /// Return the value type to use for ISD::SETCC.
1295 EVT VT) const override;
1296
1298 const APInt &DemandedElts,
1299 TargetLoweringOpt &TLO) const override;
1300
1301 /// Determine which of the bits specified in Mask are known to be either
1302 /// zero or one and return them in the KnownZero/KnownOne bitsets.
1304 KnownBits &Known,
1305 const APInt &DemandedElts,
1306 const SelectionDAG &DAG,
1307 unsigned Depth = 0) const override;
1308
1309 /// Determine the number of bits in the operation that are sign bits.
1311 const APInt &DemandedElts,
1312 const SelectionDAG &DAG,
1313 unsigned Depth) const override;
1314
1316 const APInt &DemandedElts,
1317 APInt &KnownUndef,
1318 APInt &KnownZero,
1319 TargetLoweringOpt &TLO,
1320 unsigned Depth) const override;
1321
1323 const APInt &DemandedElts,
1324 unsigned MaskIndex,
1325 TargetLoweringOpt &TLO,
1326 unsigned Depth) const;
1327
1329 const APInt &DemandedBits,
1330 const APInt &DemandedElts,
1331 KnownBits &Known,
1332 TargetLoweringOpt &TLO,
1333 unsigned Depth) const override;
1334
1336 SDValue Op, const APInt &DemandedBits, const APInt &DemandedElts,
1337 SelectionDAG &DAG, unsigned Depth) const override;
1338
1340 SDValue Op, const APInt &DemandedElts, const SelectionDAG &DAG,
1341 bool PoisonOnly, unsigned Depth) const override;
1342
1344 SDValue Op, const APInt &DemandedElts, const SelectionDAG &DAG,
1345 bool PoisonOnly, bool ConsiderFlags, unsigned Depth) const override;
1346
1347 bool isSplatValueForTargetNode(SDValue Op, const APInt &DemandedElts,
1348 APInt &UndefElts, const SelectionDAG &DAG,
1349 unsigned Depth) const override;
1350
1352 // Peek through bitcasts/extracts/inserts to see if we have a vector
1353 // load/broadcast from memory.
1354 while (Op.getOpcode() == ISD::BITCAST ||
1355 Op.getOpcode() == ISD::EXTRACT_SUBVECTOR ||
1356 (Op.getOpcode() == ISD::INSERT_SUBVECTOR &&
1357 Op.getOperand(0).isUndef()))
1358 Op = Op.getOperand(Op.getOpcode() == ISD::INSERT_SUBVECTOR ? 1 : 0);
1359
1360 return Op.getOpcode() == X86ISD::VBROADCAST_LOAD ||
1361 Op.getOpcode() == X86ISD::SUBV_BROADCAST_LOAD ||
1362 (Op.getOpcode() == ISD::LOAD &&
1365 }
1366
1367 bool isTargetCanonicalSelect(SDNode *N) const override;
1368
1369 const Constant *getTargetConstantFromLoad(LoadSDNode *LD) const override;
1370
1371 SDValue unwrapAddress(SDValue N) const override;
1372
1374
1375 ConstraintType getConstraintType(StringRef Constraint) const override;
1376
1377 /// Examine constraint string and operand type and determine a weight value.
1378 /// The operand object must already have been set up with the operand type.
1380 getSingleConstraintMatchWeight(AsmOperandInfo &Info,
1381 const char *Constraint) const override;
1382
1383 const char *LowerXConstraint(EVT ConstraintVT) const override;
1384
1385 /// Lower the specified operand into the Ops vector. If it is invalid, don't
1386 /// add anything to Ops. If hasMemory is true it means one of the asm
1387 /// constraint of the inline asm instruction being processed is 'm'.
1389 std::vector<SDValue> &Ops,
1390 SelectionDAG &DAG) const override;
1391
1393 getInlineAsmMemConstraint(StringRef ConstraintCode) const override {
1394 if (ConstraintCode == "v")
1396 return TargetLowering::getInlineAsmMemConstraint(ConstraintCode);
1397 }
1398
1399 /// Handle Lowering flag assembly outputs.
1401 const SDLoc &DL,
1402 const AsmOperandInfo &Constraint,
1403 SelectionDAG &DAG) const override;
1404
1405 /// Given a physical register constraint
1406 /// (e.g. {edx}), return the register number and the register class for the
1407 /// register. This should only be used for C_Register constraints. On
1408 /// error, this returns a register number of 0.
1409 std::pair<unsigned, const TargetRegisterClass *>
1411 StringRef Constraint, MVT VT) const override;
1412
1413 /// Return true if the addressing mode represented
1414 /// by AM is legal for this target, for a load/store of the specified type.
1415 bool isLegalAddressingMode(const DataLayout &DL, const AddrMode &AM,
1416 Type *Ty, unsigned AS,
1417 Instruction *I = nullptr) const override;
1418
1419 bool addressingModeSupportsTLS(const GlobalValue &GV) const override;
1420
1421 /// Return true if the specified immediate is legal
1422 /// icmp immediate, that is the target has icmp instructions which can
1423 /// compare a register against the immediate without having to materialize
1424 /// the immediate into a register.
1425 bool isLegalICmpImmediate(int64_t Imm) const override;
1426
1427 /// Return true if the specified immediate is legal
1428 /// add immediate, that is the target has add instructions which can
1429 /// add a register and the immediate without having to materialize
1430 /// the immediate into a register.
1431 bool isLegalAddImmediate(int64_t Imm) const override;
1432
1433 bool isLegalStoreImmediate(int64_t Imm) const override;
1434
1435 /// Add x86-specific opcodes to the default list.
1436 bool isBinOp(unsigned Opcode) const override;
1437
1438 /// Returns true if the opcode is a commutative binary operation.
1439 bool isCommutativeBinOp(unsigned Opcode) const override;
1440
1441 /// Return true if it's free to truncate a value of
1442 /// type Ty1 to type Ty2. e.g. On x86 it's free to truncate a i32 value in
1443 /// register EAX to i16 by referencing its sub-register AX.
1444 bool isTruncateFree(Type *Ty1, Type *Ty2) const override;
1445 bool isTruncateFree(EVT VT1, EVT VT2) const override;
1446
1447 bool allowTruncateForTailCall(Type *Ty1, Type *Ty2) const override;
1448
1449 /// Return true if any actual instruction that defines a
1450 /// value of type Ty1 implicit zero-extends the value to Ty2 in the result
1451 /// register. This does not necessarily include registers defined in
1452 /// unknown ways, such as incoming arguments, or copies from unknown
1453 /// virtual registers. Also, if isTruncateFree(Ty2, Ty1) is true, this
1454 /// does not necessarily apply to truncate instructions. e.g. on x86-64,
1455 /// all instructions that define 32-bit values implicit zero-extend the
1456 /// result out to 64 bits.
1457 bool isZExtFree(Type *Ty1, Type *Ty2) const override;
1458 bool isZExtFree(EVT VT1, EVT VT2) const override;
1459 bool isZExtFree(SDValue Val, EVT VT2) const override;
1460
1461 bool shouldConvertPhiType(Type *From, Type *To) const override;
1462
1463 /// Return true if folding a vector load into ExtVal (a sign, zero, or any
1464 /// extend node) is profitable.
1465 bool isVectorLoadExtDesirable(SDValue) const override;
1466
1467 /// Return true if an FMA operation is faster than a pair of fmul and fadd
1468 /// instructions. fmuladd intrinsics will be expanded to FMAs when this
1469 /// method returns true, otherwise fmuladd is expanded to fmul + fadd.
1471 EVT VT) const override;
1472
1473 /// Return true if it's profitable to narrow operations of type SrcVT to
1474 /// DestVT. e.g. on x86, it's profitable to narrow from i32 to i8 but not
1475 /// from i32 to i16.
1476 bool isNarrowingProfitable(SDNode *N, EVT SrcVT, EVT DestVT) const override;
1477
1478 bool shouldFoldSelectWithIdentityConstant(unsigned BinOpcode, EVT VT,
1479 unsigned SelectOpcode, SDValue X,
1480 SDValue Y) const override;
1481
1482 /// Given an intrinsic, checks if on the target the intrinsic will need to map
1483 /// to a MemIntrinsicNode (touches memory). If this is the case, it returns
1484 /// true and stores the intrinsic information into the IntrinsicInfo that was
1485 /// passed to the function.
1486 bool getTgtMemIntrinsic(IntrinsicInfo &Info, const CallBase &I,
1487 MachineFunction &MF,
1488 unsigned Intrinsic) const override;
1489
1490 /// Returns true if the target can instruction select the
1491 /// specified FP immediate natively. If false, the legalizer will
1492 /// materialize the FP immediate as a load from a constant pool.
1493 bool isFPImmLegal(const APFloat &Imm, EVT VT,
1494 bool ForCodeSize) const override;
1495
1496 /// Targets can use this to indicate that they only support *some*
1497 /// VECTOR_SHUFFLE operations, those with specific masks. By default, if a
1498 /// target supports the VECTOR_SHUFFLE node, all mask values are assumed to
1499 /// be legal.
1500 bool isShuffleMaskLegal(ArrayRef<int> Mask, EVT VT) const override;
1501
1502 /// Similar to isShuffleMaskLegal. Targets can use this to indicate if there
1503 /// is a suitable VECTOR_SHUFFLE that can be used to replace a VAND with a
1504 /// constant pool entry.
1505 bool isVectorClearMaskLegal(ArrayRef<int> Mask, EVT VT) const override;
1506
1507 /// Returns true if lowering to a jump table is allowed.
1508 bool areJTsAllowed(const Function *Fn) const override;
1509
1511 EVT ConditionVT) const override;
1512
1513 /// If true, then instruction selection should
1514 /// seek to shrink the FP constant of the specified type to a smaller type
1515 /// in order to save space and / or reduce runtime.
1516 bool ShouldShrinkFPConstant(EVT VT) const override;
1517
1518 /// Return true if we believe it is correct and profitable to reduce the
1519 /// load node to a smaller type.
1520 bool
1522 std::optional<unsigned> ByteOffset) const override;
1523
1524 /// Return true if the specified scalar FP type is computed in an SSE
1525 /// register, not on the X87 floating point stack.
1526 bool isScalarFPTypeInSSEReg(EVT VT) const;
1527
1528 /// Returns true if it is beneficial to convert a load of a constant
1529 /// to just the constant itself.
1531 Type *Ty) const override;
1532
1533 bool reduceSelectOfFPConstantLoads(EVT CmpOpVT) const override;
1534
1535 bool convertSelectOfConstantsToMath(EVT VT) const override;
1536
1537 bool decomposeMulByConstant(LLVMContext &Context, EVT VT,
1538 SDValue C) const override;
1539
1540 /// Return true if EXTRACT_SUBVECTOR is cheap for this result type
1541 /// with this index.
1542 bool isExtractSubvectorCheap(EVT ResVT, EVT SrcVT,
1543 unsigned Index) const override;
1544
1545 /// Scalar ops always have equal or better analysis/performance/power than
1546 /// the vector equivalent, so this always makes sense if the scalar op is
1547 /// supported.
1548 bool shouldScalarizeBinop(SDValue) const override;
1549
1550 /// Extract of a scalar FP value from index 0 of a vector is free.
1551 bool isExtractVecEltCheap(EVT VT, unsigned Index) const override {
1552 EVT EltVT = VT.getScalarType();
1553 return (EltVT == MVT::f32 || EltVT == MVT::f64) && Index == 0;
1554 }
1555
1556 /// Overflow nodes should get combined/lowered to optimal instructions
1557 /// (they should allow eliminating explicit compares by getting flags from
1558 /// math ops).
1559 bool shouldFormOverflowOp(unsigned Opcode, EVT VT,
1560 bool MathUsed) const override;
1561
1562 bool storeOfVectorConstantIsCheap(bool IsZero, EVT MemVT, unsigned NumElem,
1563 unsigned AddrSpace) const override {
1564 // If we can replace more than 2 scalar stores, there will be a reduction
1565 // in instructions even after we add a vector constant load.
1566 return IsZero || NumElem > 2;
1567 }
1568
1569 bool isLoadBitCastBeneficial(EVT LoadVT, EVT BitcastVT,
1570 const SelectionDAG &DAG,
1571 const MachineMemOperand &MMO) const override;
1572
1573 Register getRegisterByName(const char* RegName, LLT VT,
1574 const MachineFunction &MF) const override;
1575
1576 /// If a physical register, this returns the register that receives the
1577 /// exception address on entry to an EH pad.
1578 Register
1579 getExceptionPointerRegister(const Constant *PersonalityFn) const override;
1580
1581 /// If a physical register, this returns the register that receives the
1582 /// exception typeid on entry to a landing pad.
1583 Register
1584 getExceptionSelectorRegister(const Constant *PersonalityFn) const override;
1585
1586 bool needsFixedCatchObjects() const override;
1587
1588 /// This method returns a target specific FastISel object,
1589 /// or null if the target does not support "fast" ISel.
1591 const TargetLibraryInfo *libInfo) const override;
1592
1593 /// If the target has a standard location for the stack protector cookie,
1594 /// returns the address of that location. Otherwise, returns nullptr.
1595 Value *getIRStackGuard(IRBuilderBase &IRB) const override;
1596
1597 bool useLoadStackGuardNode(const Module &M) const override;
1598 bool useStackGuardXorFP() const override;
1599 void insertSSPDeclarations(Module &M) const override;
1601 const SDLoc &DL) const override;
1602
1603
1604 /// Return true if the target stores SafeStack pointer at a fixed offset in
1605 /// some non-standard address space, and populates the address space and
1606 /// offset as appropriate.
1607 Value *getSafeStackPointerLocation(IRBuilderBase &IRB) const override;
1608
1609 std::pair<SDValue, SDValue> BuildFILD(EVT DstVT, EVT SrcVT, const SDLoc &DL,
1610 SDValue Chain, SDValue Pointer,
1611 MachinePointerInfo PtrInfo,
1612 Align Alignment,
1613 SelectionDAG &DAG) const;
1614
1615 /// Customize the preferred legalization strategy for certain types.
1616 LegalizeTypeAction getPreferredVectorAction(MVT VT) const override;
1617
1618 bool softPromoteHalfType() const override { return true; }
1619
1621 EVT VT) const override;
1622
1624 CallingConv::ID CC,
1625 EVT VT) const override;
1626
1628 LLVMContext &Context, CallingConv::ID CC, EVT VT, EVT &IntermediateVT,
1629 unsigned &NumIntermediates, MVT &RegisterVT) const override;
1630
1632 Type *Ty, CallingConv::ID CallConv, bool isVarArg,
1633 const DataLayout &DL) const override;
1634
1635 bool isIntDivCheap(EVT VT, AttributeList Attr) const override;
1636
1637 bool supportSwiftError() const override;
1638
1639 bool supportKCFIBundles() const override { return true; }
1640
1643 const TargetInstrInfo *TII) const override;
1644
1645 bool hasStackProbeSymbol(const MachineFunction &MF) const override;
1646 bool hasInlineStackProbe(const MachineFunction &MF) const override;
1647 StringRef getStackProbeSymbolName(const MachineFunction &MF) const override;
1648
1649 unsigned getStackProbeSize(const MachineFunction &MF) const;
1650
1651 bool hasVectorBlend() const override { return true; }
1652
1653 unsigned getMaxSupportedInterleaveFactor() const override { return 4; }
1654
1656 unsigned OpNo) const override;
1657
1658 SDValue visitMaskedLoad(SelectionDAG &DAG, const SDLoc &DL, SDValue Chain,
1659 MachineMemOperand *MMO, SDValue &NewLoad,
1660 SDValue Ptr, SDValue PassThru,
1661 SDValue Mask) const override;
1663 MachineMemOperand *MMO, SDValue Ptr, SDValue Val,
1664 SDValue Mask) const override;
1665
1666 /// Lower interleaved load(s) into target specific
1667 /// instructions/intrinsics.
1668 bool lowerInterleavedLoad(Instruction *Load, Value *Mask,
1670 ArrayRef<unsigned> Indices, unsigned Factor,
1671 const APInt &GapMask) const override;
1672
1673 /// Lower interleaved store(s) into target specific
1674 /// instructions/intrinsics.
1675 bool lowerInterleavedStore(Instruction *Store, Value *Mask,
1676 ShuffleVectorInst *SVI, unsigned Factor,
1677 const APInt &GapMask) const override;
1678
1680 int JTI, SelectionDAG &DAG) const override;
1681
1682 Align getPrefLoopAlignment(MachineLoop *ML) const override;
1683
1684 EVT getTypeToTransformTo(LLVMContext &Context, EVT VT) const override {
1685 if (VT == MVT::f80)
1686 return EVT::getIntegerVT(Context, 96);
1687 return TargetLoweringBase::getTypeToTransformTo(Context, VT);
1688 }
1689
1690 protected:
1691 std::pair<const TargetRegisterClass *, uint8_t>
1693 MVT VT) const override;
1694
1695 private:
1696 /// Keep a reference to the X86Subtarget around so that we can
1697 /// make the right decision when generating code for different targets.
1698 const X86Subtarget &Subtarget;
1699
1700 /// A list of legal FP immediates.
1701 std::vector<APFloat> LegalFPImmediates;
1702
1703 /// Indicate that this x86 target can instruction
1704 /// select the specified FP immediate natively.
1705 void addLegalFPImmediate(const APFloat& Imm) {
1706 LegalFPImmediates.push_back(Imm);
1707 }
1708
1709 SDValue LowerCallResult(SDValue Chain, SDValue InGlue,
1710 CallingConv::ID CallConv, bool isVarArg,
1711 const SmallVectorImpl<ISD::InputArg> &Ins,
1712 const SDLoc &dl, SelectionDAG &DAG,
1713 SmallVectorImpl<SDValue> &InVals,
1714 uint32_t *RegMask) const;
1715 SDValue LowerMemArgument(SDValue Chain, CallingConv::ID CallConv,
1716 const SmallVectorImpl<ISD::InputArg> &ArgInfo,
1717 const SDLoc &dl, SelectionDAG &DAG,
1718 const CCValAssign &VA, MachineFrameInfo &MFI,
1719 unsigned i) const;
1720 SDValue LowerMemOpCallTo(SDValue Chain, SDValue StackPtr, SDValue Arg,
1721 const SDLoc &dl, SelectionDAG &DAG,
1722 const CCValAssign &VA,
1723 ISD::ArgFlagsTy Flags, bool isByval) const;
1724
1725 // Call lowering helpers.
1726
1727 /// Check whether the call is eligible for tail call optimization. Targets
1728 /// that want to do tail call optimization should implement this function.
1729 bool IsEligibleForTailCallOptimization(
1730 TargetLowering::CallLoweringInfo &CLI, CCState &CCInfo,
1731 SmallVectorImpl<CCValAssign> &ArgLocs, bool IsCalleePopSRet) const;
1732 SDValue EmitTailCallLoadRetAddr(SelectionDAG &DAG, SDValue &OutRetAddr,
1733 SDValue Chain, bool IsTailCall,
1734 bool Is64Bit, int FPDiff,
1735 const SDLoc &dl) const;
1736
1737 unsigned GetAlignedArgumentStackSize(unsigned StackSize,
1738 SelectionDAG &DAG) const;
1739
1740 unsigned getAddressSpace() const;
1741
1742 SDValue FP_TO_INTHelper(SDValue Op, SelectionDAG &DAG, bool IsSigned,
1743 SDValue &Chain) const;
1744 SDValue LRINT_LLRINTHelper(SDNode *N, SelectionDAG &DAG) const;
1745
1746 SDValue LowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG) const;
1747 SDValue LowerVSELECT(SDValue Op, SelectionDAG &DAG) const;
1748 SDValue LowerEXTRACT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const;
1749 SDValue LowerINSERT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const;
1750
1751 unsigned getGlobalWrapperKind(const GlobalValue *GV,
1752 const unsigned char OpFlags) const;
1753 SDValue LowerConstantPool(SDValue Op, SelectionDAG &DAG) const;
1754 SDValue LowerBlockAddress(SDValue Op, SelectionDAG &DAG) const;
1755 SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const;
1756 SDValue LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const;
1757 SDValue LowerExternalSymbol(SDValue Op, SelectionDAG &DAG) const;
1758
1759 /// Creates target global address or external symbol nodes for calls or
1760 /// other uses.
1761 SDValue LowerGlobalOrExternal(SDValue Op, SelectionDAG &DAG, bool ForCall,
1762 bool *IsImpCall) const;
1763
1764 SDValue LowerSINT_TO_FP(SDValue Op, SelectionDAG &DAG) const;
1765 SDValue LowerUINT_TO_FP(SDValue Op, SelectionDAG &DAG) const;
1766 SDValue LowerTRUNCATE(SDValue Op, SelectionDAG &DAG) const;
1767 SDValue LowerFP_TO_INT(SDValue Op, SelectionDAG &DAG) const;
1768 SDValue LowerFP_TO_INT_SAT(SDValue Op, SelectionDAG &DAG) const;
1769 SDValue LowerLRINT_LLRINT(SDValue Op, SelectionDAG &DAG) const;
1770 SDValue LowerSETCC(SDValue Op, SelectionDAG &DAG) const;
1771 SDValue LowerSETCCCARRY(SDValue Op, SelectionDAG &DAG) const;
1772 SDValue LowerSELECT(SDValue Op, SelectionDAG &DAG) const;
1773 SDValue LowerBRCOND(SDValue Op, SelectionDAG &DAG) const;
1774 SDValue LowerJumpTable(SDValue Op, SelectionDAG &DAG) const;
1775 SDValue LowerDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG) const;
1776 SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG) const;
1777 SDValue LowerVAARG(SDValue Op, SelectionDAG &DAG) const;
1778 SDValue LowerRETURNADDR(SDValue Op, SelectionDAG &DAG) const;
1779 SDValue LowerADDROFRETURNADDR(SDValue Op, SelectionDAG &DAG) const;
1780 SDValue LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const;
1781 SDValue LowerFRAME_TO_ARGS_OFFSET(SDValue Op, SelectionDAG &DAG) const;
1782 SDValue LowerEH_RETURN(SDValue Op, SelectionDAG &DAG) const;
1783 SDValue lowerEH_SJLJ_SETJMP(SDValue Op, SelectionDAG &DAG) const;
1784 SDValue lowerEH_SJLJ_LONGJMP(SDValue Op, SelectionDAG &DAG) const;
1785 SDValue lowerEH_SJLJ_SETUP_DISPATCH(SDValue Op, SelectionDAG &DAG) const;
1786 SDValue LowerINIT_TRAMPOLINE(SDValue Op, SelectionDAG &DAG) const;
1787 SDValue LowerGET_ROUNDING(SDValue Op, SelectionDAG &DAG) const;
1788 SDValue LowerSET_ROUNDING(SDValue Op, SelectionDAG &DAG) const;
1789 SDValue LowerGET_FPENV_MEM(SDValue Op, SelectionDAG &DAG) const;
1790 SDValue LowerSET_FPENV_MEM(SDValue Op, SelectionDAG &DAG) const;
1791 SDValue LowerRESET_FPENV(SDValue Op, SelectionDAG &DAG) const;
1792 SDValue LowerWin64_i128OP(SDValue Op, SelectionDAG &DAG) const;
1793 SDValue LowerWin64_FP_TO_INT128(SDValue Op, SelectionDAG &DAG,
1794 SDValue &Chain) const;
1795 SDValue LowerWin64_INT128_TO_FP(SDValue Op, SelectionDAG &DAG) const;
1796 SDValue LowerGC_TRANSITION(SDValue Op, SelectionDAG &DAG) const;
1797 SDValue LowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG) const;
1798 SDValue lowerFaddFsub(SDValue Op, SelectionDAG &DAG) const;
1799 SDValue LowerFP_EXTEND(SDValue Op, SelectionDAG &DAG) const;
1800 SDValue LowerFP_ROUND(SDValue Op, SelectionDAG &DAG) const;
1801 SDValue LowerFP_TO_BF16(SDValue Op, SelectionDAG &DAG) const;
1802
1803 SDValue
1804 LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
1805 const SmallVectorImpl<ISD::InputArg> &Ins,
1806 const SDLoc &dl, SelectionDAG &DAG,
1807 SmallVectorImpl<SDValue> &InVals) const override;
1808 SDValue LowerCall(CallLoweringInfo &CLI,
1809 SmallVectorImpl<SDValue> &InVals) const override;
1810
1811 SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
1812 const SmallVectorImpl<ISD::OutputArg> &Outs,
1813 const SmallVectorImpl<SDValue> &OutVals,
1814 const SDLoc &dl, SelectionDAG &DAG) const override;
1815
1816 bool supportSplitCSR(MachineFunction *MF) const override {
1817 return MF->getFunction().getCallingConv() == CallingConv::CXX_FAST_TLS &&
1818 MF->getFunction().hasFnAttribute(Attribute::NoUnwind);
1819 }
1820 void initializeSplitCSR(MachineBasicBlock *Entry) const override;
1821 void insertCopiesSplitCSR(
1822 MachineBasicBlock *Entry,
1823 const SmallVectorImpl<MachineBasicBlock *> &Exits) const override;
1824
1825 bool isUsedByReturnOnly(SDNode *N, SDValue &Chain) const override;
1826
1827 bool mayBeEmittedAsTailCall(const CallInst *CI) const override;
1828
1829 EVT getTypeForExtReturn(LLVMContext &Context, EVT VT,
1830 ISD::NodeType ExtendKind) const override;
1831
1832 bool CanLowerReturn(CallingConv::ID CallConv, MachineFunction &MF,
1833 bool isVarArg,
1834 const SmallVectorImpl<ISD::OutputArg> &Outs,
1835 LLVMContext &Context,
1836 const Type *RetTy) const override;
1837
1838 const MCPhysReg *getScratchRegisters(CallingConv::ID CC) const override;
1840
1842 shouldExpandAtomicLoadInIR(LoadInst *LI) const override;
1844 shouldExpandAtomicStoreInIR(StoreInst *SI) const override;
1846 shouldExpandAtomicRMWInIR(AtomicRMWInst *AI) const override;
1848 shouldExpandLogicAtomicRMWInIR(AtomicRMWInst *AI) const;
1849 void emitBitTestAtomicRMWIntrinsic(AtomicRMWInst *AI) const override;
1850 void emitCmpArithAtomicRMWIntrinsic(AtomicRMWInst *AI) const override;
1851
1852 LoadInst *
1853 lowerIdempotentRMWIntoFencedLoad(AtomicRMWInst *AI) const override;
1854
1855 bool needsCmpXchgNb(Type *MemType) const;
1856
1857 void SetupEntryBlockForSjLj(MachineInstr &MI, MachineBasicBlock *MBB,
1858 MachineBasicBlock *DispatchBB, int FI) const;
1859
1860 // Utility function to emit the low-level va_arg code for X86-64.
1861 MachineBasicBlock *
1862 EmitVAARGWithCustomInserter(MachineInstr &MI, MachineBasicBlock *MBB) const;
1863
1864 /// Utility function to emit the xmm reg save portion of va_start.
1865 MachineBasicBlock *EmitLoweredCascadedSelect(MachineInstr &MI1,
1866 MachineInstr &MI2,
1867 MachineBasicBlock *BB) const;
1868
1869 MachineBasicBlock *EmitLoweredSelect(MachineInstr &I,
1870 MachineBasicBlock *BB) const;
1871
1872 MachineBasicBlock *EmitLoweredCatchRet(MachineInstr &MI,
1873 MachineBasicBlock *BB) const;
1874
1875 MachineBasicBlock *EmitLoweredSegAlloca(MachineInstr &MI,
1876 MachineBasicBlock *BB) const;
1877
1878 MachineBasicBlock *EmitLoweredProbedAlloca(MachineInstr &MI,
1879 MachineBasicBlock *BB) const;
1880
1881 MachineBasicBlock *EmitLoweredTLSCall(MachineInstr &MI,
1882 MachineBasicBlock *BB) const;
1883
1884 MachineBasicBlock *EmitLoweredIndirectThunk(MachineInstr &MI,
1885 MachineBasicBlock *BB) const;
1886
1887 MachineBasicBlock *emitEHSjLjSetJmp(MachineInstr &MI,
1888 MachineBasicBlock *MBB) const;
1889
1890 void emitSetJmpShadowStackFix(MachineInstr &MI,
1891 MachineBasicBlock *MBB) const;
1892
1893 MachineBasicBlock *emitEHSjLjLongJmp(MachineInstr &MI,
1894 MachineBasicBlock *MBB) const;
1895
1896 MachineBasicBlock *emitLongJmpShadowStackFix(MachineInstr &MI,
1897 MachineBasicBlock *MBB) const;
1898
1899 MachineBasicBlock *EmitSjLjDispatchBlock(MachineInstr &MI,
1900 MachineBasicBlock *MBB) const;
1901
1902 MachineBasicBlock *emitPatchableEventCall(MachineInstr &MI,
1903 MachineBasicBlock *MBB) const;
1904
1905 /// Emit flags for the given setcc condition and operands. Also returns the
1906 /// corresponding X86 condition code constant in X86CC.
1907 SDValue emitFlagsForSetcc(SDValue Op0, SDValue Op1, ISD::CondCode CC,
1908 const SDLoc &dl, SelectionDAG &DAG,
1909 SDValue &X86CC) const;
1910
1911 bool optimizeFMulOrFDivAsShiftAddBitcast(SDNode *N, SDValue FPConst,
1912 SDValue IntPow2) const override;
1913
1914 /// Check if replacement of SQRT with RSQRT should be disabled.
1915 bool isFsqrtCheap(SDValue Op, SelectionDAG &DAG) const override;
1916
1917 /// Use rsqrt* to speed up sqrt calculations.
1918 SDValue getSqrtEstimate(SDValue Op, SelectionDAG &DAG, int Enabled,
1919 int &RefinementSteps, bool &UseOneConstNR,
1920 bool Reciprocal) const override;
1921
1922 /// Use rcp* to speed up fdiv calculations.
1923 SDValue getRecipEstimate(SDValue Op, SelectionDAG &DAG, int Enabled,
1924 int &RefinementSteps) const override;
1925
1926 /// Reassociate floating point divisions into multiply by reciprocal.
1927 unsigned combineRepeatedFPDivisors() const override;
1928
1929 SDValue BuildSDIVPow2(SDNode *N, const APInt &Divisor, SelectionDAG &DAG,
1930 SmallVectorImpl<SDNode *> &Created) const override;
1931
1932 SDValue getMOVL(SelectionDAG &DAG, const SDLoc &dl, MVT VT, SDValue V1,
1933 SDValue V2) const;
1934 };
1935
1936 namespace X86 {
1937 FastISel *createFastISel(FunctionLoweringInfo &funcInfo,
1938 const TargetLibraryInfo *libInfo);
1939 } // end namespace X86
1940
1941 // X86 specific Gather/Scatter nodes.
1942 // The class has the same order of operands as MaskedGatherScatterSDNode for
1943 // convenience.
1945 public:
1946 // This is a intended as a utility and should never be directly created.
1949
1950 const SDValue &getBasePtr() const { return getOperand(3); }
1951 const SDValue &getIndex() const { return getOperand(4); }
1952 const SDValue &getMask() const { return getOperand(2); }
1953 const SDValue &getScale() const { return getOperand(5); }
1954
1955 static bool classof(const SDNode *N) {
1956 return N->getOpcode() == X86ISD::MGATHER ||
1957 N->getOpcode() == X86ISD::MSCATTER;
1958 }
1959 };
1960
1962 public:
1963 const SDValue &getPassThru() const { return getOperand(1); }
1964
1965 static bool classof(const SDNode *N) {
1966 return N->getOpcode() == X86ISD::MGATHER;
1967 }
1968 };
1969
1971 public:
1972 const SDValue &getValue() const { return getOperand(1); }
1973
1974 static bool classof(const SDNode *N) {
1975 return N->getOpcode() == X86ISD::MSCATTER;
1976 }
1977 };
1978
1979 /// Generate unpacklo/unpackhi shuffle mask.
1980 void createUnpackShuffleMask(EVT VT, SmallVectorImpl<int> &Mask, bool Lo,
1981 bool Unary);
1982
1983 /// Similar to unpacklo/unpackhi, but without the 128-bit lane limitation
1984 /// imposed by AVX and specific to the unary pattern. Example:
1985 /// v8iX Lo --> <0, 0, 1, 1, 2, 2, 3, 3>
1986 /// v8iX Hi --> <4, 4, 5, 5, 6, 6, 7, 7>
1987 void createSplat2ShuffleMask(MVT VT, SmallVectorImpl<int> &Mask, bool Lo);
1988
1989} // end namespace llvm
1990
1991#endif // LLVM_LIB_TARGET_X86_X86ISELLOWERING_H
static SDValue LowerBRCOND(SDValue Op, SelectionDAG &DAG)
return SDValue()
static SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG)
static SDValue LowerEXTRACT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG, const ARMSubtarget *ST)
static SDValue LowerFP_TO_INT_SAT(SDValue Op, SelectionDAG &DAG, const ARMSubtarget *Subtarget)
static SDValue LowerSETCCCARRY(SDValue Op, SelectionDAG &DAG)
MachineBasicBlock & MBB
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
MachineBasicBlock MachineBasicBlock::iterator MBBI
Function Alias Analysis Results
Analysis containing CSE Info
Definition CSEInfo.cpp:27
const HexagonInstrInfo * TII
IRTranslator LLVM IR MI
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
#define RegName(no)
#define I(x, y, z)
Definition MD5.cpp:57
Register const TargetRegisterInfo * TRI
static unsigned getAddressSpace(const Value *V, unsigned MaxLookup)
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.
const SmallVectorImpl< MachineOperand > & Cond
static SDValue LowerUINT_TO_FP(SDValue Op, SelectionDAG &DAG, const SparcTargetLowering &TLI, bool hasHardQuad)
static SDValue LowerDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG, const SparcSubtarget *Subtarget)
static SDValue LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG, const SparcSubtarget *Subtarget)
static SDValue LowerVAARG(SDValue Op, SelectionDAG &DAG)
static SDValue LowerRETURNADDR(SDValue Op, SelectionDAG &DAG, const SparcTargetLowering &TLI, const SparcSubtarget *Subtarget)
static SDValue LowerSINT_TO_FP(SDValue Op, SelectionDAG &DAG, const SparcTargetLowering &TLI, bool hasHardQuad)
static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
static TableGen::Emitter::OptClass< SkeletonEmitter > X("gen-skeleton-class", "Generate example skeleton class")
This file describes how to lower LLVM code to machine code.
static bool is64Bit(const char *name)
static SDValue LowerCallResult(SDValue Chain, SDValue InGlue, 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...
Class for arbitrary precision integers.
Definition APInt.h:78
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
This is an important base class in LLVM.
Definition Constant.h:43
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
This is a fast-path instruction selection class that generates poor code and doesn't support illegal ...
Definition FastISel.h:66
FunctionLoweringInfo - This contains information that is global to a function that is used when lower...
Common base class shared among various IRBuilders.
Definition IRBuilder.h:114
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:68
This class is used to represent ISD::LOAD nodes.
Context object for machine code objects.
Definition MCContext.h:83
Base class for the full range of assembler expressions which are needed for parsing.
Definition MCExpr.h:34
Machine Value Type.
static MVT getIntegerVT(unsigned BitWidth)
Instructions::iterator instr_iterator
Representation of each machine instruction.
A description of a memory reference used in the backend.
unsigned getAddrSpace() const
Flags
Flags values. These may be or'd together.
Flags getFlags() const
Return the raw flags of the source value,.
LLVM_ABI Align getAlign() const
Return the minimum known alignment in bytes of the actual memory reference.
MemIntrinsicSDNode(unsigned Opc, unsigned Order, const DebugLoc &dl, SDVTList VTs, EVT MemoryVT, MachineMemOperand *MMO)
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:67
Wrapper class representing virtual and physical registers.
Definition Register.h:20
Wrapper class for IR location info (IR ordering and DebugLoc) to be passed into SDNode creation funct...
Represents one node in the SelectionDAG.
const SDValue & getOperand(unsigned Num) const
Unlike LLVM values, Selection DAG nodes may return multiple values as the result of a computation.
This is used to represent a portion of an LLVM function in a low-level Data Dependence DAG representa...
This instruction constructs a fixed permutation of two input vectors.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
StringRef - Represent a constant reference to a string, i.e.
Definition StringRef.h:55
TargetInstrInfo - Interface to description of machine instruction set.
Provides information about what library functions are available for the current target.
ShiftLegalizationStrategy
Return the preferred strategy to legalize tihs SHIFT instruction, with ExpansionFactor being the recu...
virtual EVT getTypeToTransformTo(LLVMContext &Context, EVT VT) const
For types supported by the target, this is an identity function.
bool isOperationLegalOrCustom(unsigned Op, EVT VT, bool LegalOnly=false) const
Return true if the specified operation is legal on this target or can be made legal with custom lower...
AtomicExpansionKind
Enum that specifies what an atomic load/AtomicRMWInst is expanded to, if at all.
AndOrSETCCFoldKind
Enum of different potentially desirable ways to fold (and/or (setcc ...), (setcc ....
NegatibleCost
Enum that specifies when a float negation is beneficial.
std::vector< ArgListEntry > ArgListTy
virtual InlineAsm::ConstraintCode getInlineAsmMemConstraint(StringRef ConstraintCode) const
virtual bool isTargetCanonicalConstantNode(SDValue Op) const
Returns true if the given Opc is considered a canonical constant for the target, which should not be ...
TargetLowering(const TargetLowering &)=delete
virtual ArrayRef< MCPhysReg > getRoundingControlRegisters() const
Returns a 0 terminated array of rounding control registers that can be attached into strict FP call.
virtual unsigned combineRepeatedFPDivisors() const
Indicate whether this target prefers to combine FDIVs with the same divisor.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:45
LLVM Value Representation.
Definition Value.h:75
const SDValue & getPassThru() const
static bool classof(const SDNode *N)
static bool classof(const SDNode *N)
const SDValue & getValue() const
static bool classof(const SDNode *N)
bool shouldFormOverflowOp(unsigned Opcode, EVT VT, bool MathUsed) const override
Overflow nodes should get combined/lowered to optimal instructions (they should allow eliminating exp...
Align getPrefLoopAlignment(MachineLoop *ML) const override
Return the preferred loop alignment.
std::pair< const TargetRegisterClass *, uint8_t > findRepresentativeClass(const TargetRegisterInfo *TRI, MVT VT) const override
Return the largest legal super-reg register class of the register class for the specified type and it...
bool isLegalAddImmediate(int64_t Imm) const override
Return true if the specified immediate is legal add immediate, that is the target has add instruction...
bool preferSextInRegOfTruncate(EVT TruncVT, EVT VT, EVT ExtVT) const override
SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const override
This method will be invoked for all target nodes and for any target-independent nodes that the target...
SDValue getPICJumpTableRelocBase(SDValue Table, SelectionDAG &DAG) const override
Returns relocation base for the given PIC jumptable.
bool preferABDSToABSWithNSW(EVT VT) const override
bool isCheapToSpeculateCtlz(Type *Ty) const override
Return true if it is cheap to speculate a call to intrinsic ctlz.
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...
unsigned getJumpTableEncoding() const override
Return the entry encoding for a jump table in the current function.
std::pair< SDValue, SDValue > BuildFILD(EVT DstVT, EVT SrcVT, const SDLoc &DL, SDValue Chain, SDValue Pointer, MachinePointerInfo PtrInfo, Align Alignment, SelectionDAG &DAG) const
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...
bool SimplifyDemandedVectorEltsForTargetNode(SDValue Op, const APInt &DemandedElts, APInt &KnownUndef, APInt &KnownZero, TargetLoweringOpt &TLO, unsigned Depth) const override
Attempt to simplify any target nodes based on the demanded vector elements, returning true on success...
bool isMemoryAccessFast(EVT VT, Align Alignment) const
SDValue LowerAsmOutputForConstraint(SDValue &Chain, SDValue &Flag, const SDLoc &DL, const AsmOperandInfo &Constraint, SelectionDAG &DAG) const override
Handle Lowering flag assembly outputs.
bool supportKCFIBundles() const override
Return true if the target supports kcfi operand bundles.
const char * LowerXConstraint(EVT ConstraintVT) const override
Try to replace an X constraint, which matches anything, with another that has more specific requireme...
SDValue SimplifyMultipleUseDemandedBitsForTargetNode(SDValue Op, const APInt &DemandedBits, const APInt &DemandedElts, SelectionDAG &DAG, unsigned Depth) const override
More limited version of SimplifyDemandedBits that can be used to "lookthrough" ops that don't contrib...
bool useLoadStackGuardNode(const Module &M) const override
If this function returns true, SelectionDAGBuilder emits a LOAD_STACK_GUARD node when it is lowering ...
bool isSplatValueForTargetNode(SDValue Op, const APInt &DemandedElts, APInt &UndefElts, const SelectionDAG &DAG, unsigned Depth) const override
Return true if vector Op has the same value across all DemandedElts, indicating any elements which ma...
bool convertSelectOfConstantsToMath(EVT VT) const override
Return true if a select of constants (select Cond, C1, C2) should be transformed into simple math ops...
ConstraintType getConstraintType(StringRef Constraint) const override
Given a constraint letter, return the type of constraint for this target.
bool hasVectorBlend() const override
Return true if the target has a vector blend instruction.
Register getExceptionSelectorRegister(const Constant *PersonalityFn) const override
If a physical register, this returns the register that receives the exception typeid on entry to a la...
bool useSoftFloat() const override
InlineAsm::ConstraintCode getInlineAsmMemConstraint(StringRef ConstraintCode) const override
ShiftLegalizationStrategy preferredShiftLegalizationStrategy(SelectionDAG &DAG, SDNode *N, unsigned ExpansionFactor) const override
SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override
Provide custom lowering hooks for some operations.
bool isLegalStoreImmediate(int64_t Imm) const override
Return true if the specified immediate is legal for the value input of a store instruction.
SDValue visitMaskedStore(SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, MachineMemOperand *MMO, SDValue Ptr, SDValue Val, SDValue Mask) const override
SDValue getNegatedExpression(SDValue Op, SelectionDAG &DAG, bool LegalOperations, bool ForCodeSize, NegatibleCost &Cost, unsigned Depth) const override
Return the newly negated expression if the cost is not expensive and set the cost in Cost to indicate...
bool isTypeDesirableForOp(unsigned Opc, EVT VT) const override
Return true if the target has native support for the specified value type and it is 'desirable' to us...
const MCExpr * getPICJumpTableRelocBaseExpr(const MachineFunction *MF, unsigned JTI, MCContext &Ctx) const override
This returns the relocation base for the given PIC jumptable, the same as getPICJumpTableRelocBase,...
bool isCtlzFast() const override
Return true if ctlz instruction is fast.
Register getRegisterByName(const char *RegName, LLT VT, const MachineFunction &MF) const override
Return the register ID of the name passed in.
bool isSafeMemOpType(MVT VT) const override
Returns true if it's safe to use load / store of the specified type to expand memcpy / memset inline.
bool shouldProduceAndByConstByHoistingConstFromShiftsLHSOfAnd(SDValue X, ConstantSDNode *XC, ConstantSDNode *CC, SDValue Y, unsigned OldShiftOpcode, unsigned NewShiftOpcode, SelectionDAG &DAG) const override
Given the pattern (X & (C l>>/<< Y)) ==/!= 0 return true if it should be transformed into: ((X <</l>>...
bool functionArgumentNeedsConsecutiveRegisters(Type *Ty, CallingConv::ID CallConv, bool isVarArg, const DataLayout &DL) const override
For some targets, an LLVM struct type must be broken down into multiple simple types,...
MVT getScalarShiftAmountTy(const DataLayout &, EVT VT) const override
Return the type to use for a scalar shift opcode, given the shifted amount type.
Value * getIRStackGuard(IRBuilderBase &IRB) const override
If the target has a standard location for the stack protector cookie, returns the address of that loc...
bool supportSwiftError() const override
Return true if the target supports swifterror attribute.
bool storeOfVectorConstantIsCheap(bool IsZero, EVT MemVT, unsigned NumElem, unsigned AddrSpace) const override
Return true if it is expected to be cheaper to do a store of vector constant with the given size and ...
Align getByValTypeAlignment(Type *Ty, const DataLayout &DL) const override
Return the desired alignment for ByVal aggregate function arguments in the caller parameter area.
bool isCheapToSpeculateCttz(Type *Ty) const override
Return true if it is cheap to speculate a call to intrinsic cttz.
bool shouldSplatInsEltVarIndex(EVT VT) const override
Return true if inserting a scalar into a variable element of an undef vector is more efficiently hand...
bool isInlineAsmTargetBranch(const SmallVectorImpl< StringRef > &AsmStrs, unsigned OpNo) const override
On x86, return true if the operand with index OpNo is a CALL or JUMP instruction, which can use eithe...
MVT hasFastEqualityCompare(unsigned NumBits) const override
Vector-sized comparisons are fast using PCMPEQ + PMOVMSK or PTEST.
bool SimplifyDemandedVectorEltsForTargetShuffle(SDValue Op, const APInt &DemandedElts, unsigned MaskIndex, TargetLoweringOpt &TLO, unsigned Depth) const
bool isLegalICmpImmediate(int64_t Imm) const override
Return true if the specified immediate is legal icmp immediate, that is the target has icmp instructi...
bool hasInlineStackProbe(const MachineFunction &MF) const override
Returns true if stack probing through inline assembly is requested.
MachineBasicBlock * EmitInstrWithCustomInserter(MachineInstr &MI, MachineBasicBlock *MBB) const override
This method should be implemented by targets that mark instructions with the 'usesCustomInserter' fla...
unsigned preferedOpcodeForCmpEqPiecesOfOperand(EVT VT, unsigned ShiftOpc, bool MayTransformRotate, const APInt &ShiftOrRotateAmt, const std::optional< APInt > &AndMask) const override
bool isXAndYEqZeroPreferableToXAndYEqY(ISD::CondCode Cond, EVT VT) const override
bool canMergeStoresTo(unsigned AddressSpace, EVT MemVT, const MachineFunction &MF) const override
Returns if it's reasonable to merge stores to MemVT size.
bool hasAndNot(SDValue Y) const override
Return true if the target has a bitwise and-not operation: X = ~A & B This can be used to simplify se...
bool getTgtMemIntrinsic(IntrinsicInfo &Info, const CallBase &I, MachineFunction &MF, unsigned Intrinsic) const override
Given an intrinsic, checks if on the target the intrinsic will need to map to a MemIntrinsicNode (tou...
bool SimplifyDemandedBitsForTargetNode(SDValue Op, const APInt &DemandedBits, const APInt &DemandedElts, KnownBits &Known, TargetLoweringOpt &TLO, unsigned Depth) const override
Attempt to simplify any target nodes based on the demanded bits/elts, returning true on success.
bool shouldConvertConstantLoadToIntImm(const APInt &Imm, Type *Ty) const override
Returns true if it is beneficial to convert a load of a constant to just the constant itself.
bool shouldReduceLoadWidth(SDNode *Load, ISD::LoadExtType ExtTy, EVT NewVT, std::optional< unsigned > ByteOffset) const override
Return true if we believe it is correct and profitable to reduce the load node to a smaller type.
bool allowsMemoryAccess(LLVMContext &Context, const DataLayout &DL, EVT VT, const MachineMemOperand &MMO, unsigned *Fast) const
bool preferScalarizeSplat(SDNode *N) const override
bool shouldConvertFpToSat(unsigned Op, EVT FPVT, EVT VT) const override
Should we generate fp_to_si_sat and fp_to_ui_sat from type FPVT to type VT from min(max(fptoi)) satur...
std::pair< unsigned, const TargetRegisterClass * > getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI, StringRef Constraint, MVT VT) const override
Given a physical register constraint (e.g.
MVT getRegisterTypeForCallingConv(LLVMContext &Context, CallingConv::ID CC, EVT VT) const override
Certain combinations of ABIs, Targets and features require that types are legal for some operations a...
bool lowerInterleavedStore(Instruction *Store, Value *Mask, ShuffleVectorInst *SVI, unsigned Factor, const APInt &GapMask) const override
Lower interleaved store(s) into target specific instructions/intrinsics.
bool allowsMisalignedMemoryAccesses(EVT VT, unsigned AS, Align Alignment, MachineMemOperand::Flags Flags, unsigned *Fast) const override
Returns true if the target allows unaligned memory accesses of the specified type.
bool isNarrowingProfitable(SDNode *N, EVT SrcVT, EVT DestVT) const override
Return true if it's profitable to narrow operations of type SrcVT to DestVT.
bool isFPImmLegal(const APFloat &Imm, EVT VT, bool ForCodeSize) const override
Returns true if the target can instruction select the specified FP immediate natively.
MachineInstr * EmitKCFICheck(MachineBasicBlock &MBB, MachineBasicBlock::instr_iterator &MBBI, const TargetInstrInfo *TII) const override
bool isLoadBitCastBeneficial(EVT LoadVT, EVT BitcastVT, const SelectionDAG &DAG, const MachineMemOperand &MMO) const override
Return true if the following transform is beneficial: fold (conv (load x)) -> (load (conv*)x) On arch...
unsigned getMaxSupportedInterleaveFactor() const override
Get the maximum supported factor for interleaved memory accesses.
bool lowerInterleavedLoad(Instruction *Load, Value *Mask, ArrayRef< ShuffleVectorInst * > Shuffles, ArrayRef< unsigned > Indices, unsigned Factor, const APInt &GapMask) const override
Lower interleaved load(s) into target specific instructions/intrinsics.
bool hasAndNotCompare(SDValue Y) const override
Return true if the target should transform: (X & Y) == Y ---> (~X & Y) == 0 (X & Y) !...
bool reduceSelectOfFPConstantLoads(EVT CmpOpVT) const override
Return true if it is profitable to convert a select of FP constants into a constant pool load whose a...
EVT getOptimalMemOpType(LLVMContext &Context, const MemOp &Op, const AttributeList &FuncAttributes) const override
It returns EVT::Other if the type should be determined using generic target-independent logic.
StringRef getStackProbeSymbolName(const MachineFunction &MF) const override
Returns the name of the symbol used to emit stack probes or the empty string if not applicable.
bool hasBitTest(SDValue X, SDValue Y) const override
Return true if the target has a bit-test instruction: (X & (1 << Y)) ==/!= 0 This knowledge can be us...
bool allowTruncateForTailCall(Type *Ty1, Type *Ty2) const override
Return true if a truncation from FromTy to ToTy is permitted when deciding whether a call is in tail ...
unsigned getVectorTypeBreakdownForCallingConv(LLVMContext &Context, CallingConv::ID CC, EVT VT, EVT &IntermediateVT, unsigned &NumIntermediates, MVT &RegisterVT) const override
Certain targets such as MIPS require that some types such as vectors are always broken down into scal...
bool isShuffleMaskLegal(ArrayRef< int > Mask, EVT VT) const override
Targets can use this to indicate that they only support some VECTOR_SHUFFLE operations,...
bool useStackGuardXorFP() const override
If this function returns true, stack protection checks should XOR the frame pointer (or whichever poi...
unsigned ComputeNumSignBitsForTargetNode(SDValue Op, const APInt &DemandedElts, const SelectionDAG &DAG, unsigned Depth) const override
Determine the number of bits in the operation that are sign bits.
bool shouldScalarizeBinop(SDValue) const override
Scalar ops always have equal or better analysis/performance/power than the vector equivalent,...
void markLibCallAttributes(MachineFunction *MF, unsigned CC, ArgListTy &Args) const override
bool isTruncateFree(Type *Ty1, Type *Ty2) const override
Return true if it's free to truncate a value of type Ty1 to type Ty2.
bool shouldFoldConstantShiftPairToMask(const SDNode *N) const override
Return true if it is profitable to fold a pair of shifts into a mask.
Value * getSafeStackPointerLocation(IRBuilderBase &IRB) const override
Return true if the target stores SafeStack pointer at a fixed offset in some non-standard address spa...
bool decomposeMulByConstant(LLVMContext &Context, EVT VT, SDValue C) const override
Return true if it is profitable to transform an integer multiplication-by-constant into simpler opera...
bool areJTsAllowed(const Function *Fn) const override
Returns true if lowering to a jump table is allowed.
bool isCommutativeBinOp(unsigned Opcode) const override
Returns true if the opcode is a commutative binary operation.
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...
const char * getTargetNodeName(unsigned Opcode) const override
This method returns the name of a target specific DAG node.
MVT getPreferredSwitchConditionType(LLVMContext &Context, EVT ConditionVT) const override
Returns preferred type for switch condition.
SDValue visitMaskedLoad(SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, MachineMemOperand *MMO, SDValue &NewLoad, SDValue Ptr, SDValue PassThru, SDValue Mask) const override
bool isFMAFasterThanFMulAndFAdd(const MachineFunction &MF, EVT VT) const override
Return true if an FMA operation is faster than a pair of fmul and fadd instructions.
bool isExtractSubvectorCheap(EVT ResVT, EVT SrcVT, unsigned Index) const override
Return true if EXTRACT_SUBVECTOR is cheap for this result type with this index.
unsigned getNumRegistersForCallingConv(LLVMContext &Context, CallingConv::ID CC, EVT VT) const override
Certain targets require unusual breakdowns of certain types.
bool convertSetCCLogicToBitwiseLogic(EVT VT) const override
Use bitwise logic to make pairs of compares more efficient.
bool isVectorClearMaskLegal(ArrayRef< int > Mask, EVT VT) const override
Similar to isShuffleMaskLegal.
ConstraintWeight getSingleConstraintMatchWeight(AsmOperandInfo &Info, const char *Constraint) const override
Examine constraint string and operand type and determine a weight value.
bool isIntDivCheap(EVT VT, AttributeList Attr) const override
Return true if integer divide is usually cheaper than a sequence of several shifts,...
LegalizeTypeAction getPreferredVectorAction(MVT VT) const override
Customize the preferred legalization strategy for certain types.
bool shouldConvertPhiType(Type *From, Type *To) const override
Given a set in interconnected phis of type 'From' that are loaded/stored or bitcast to type 'To',...
bool hasStackProbeSymbol(const MachineFunction &MF) const override
Returns true if stack probing through a function call is requested.
bool isZExtFree(Type *Ty1, Type *Ty2) const override
Return true if any actual instruction that defines a value of type Ty1 implicit zero-extends the valu...
bool allowsMemoryAccess(LLVMContext &Context, const DataLayout &DL, EVT VT, unsigned AddrSpace, Align Alignment, MachineMemOperand::Flags Flags=MachineMemOperand::MONone, unsigned *Fast=nullptr) const override
This function returns true if the memory access is aligned or if the target allows this specific unal...
bool isTargetCanonicalConstantNode(SDValue Op) const override
Returns true if the given Opc is considered a canonical constant for the target, which should not be ...
bool isLegalAddressingMode(const DataLayout &DL, const AddrMode &AM, Type *Ty, unsigned AS, Instruction *I=nullptr) const override
Return true if the addressing mode represented by AM is legal for this target, for a load/store of th...
bool softPromoteHalfType() const override
SDValue emitStackGuardXorFP(SelectionDAG &DAG, SDValue Val, const SDLoc &DL) const override
bool mergeStoresAfterLegalization(EVT MemVT) const override
Do not merge vector stores after legalization because that may conflict with x86-specific store split...
TargetLowering::AndOrSETCCFoldKind isDesirableToCombineLogicOpOfSETCC(const SDNode *LogicOp, const SDNode *SETCC0, const SDNode *SETCC1) const override
Return prefered fold type, Abs if this is a vector, AddAnd if its an integer, None otherwise.
bool shouldFoldMaskToVariableShiftPair(SDValue Y) const override
There are two ways to clear extreme bits (either low or high): Mask: x & (-1 << y) (the instcombine c...
bool shouldFoldSelectWithIdentityConstant(unsigned BinOpcode, EVT VT, unsigned SelectOpcode, SDValue X, SDValue Y) const override
Return true if pulling a binary operation into a select with an identity constant is profitable.
bool addressingModeSupportsTLS(const GlobalValue &GV) const override
Returns true if the targets addressing mode can target thread local storage (TLS).
SDValue getReturnAddressFrameIndex(SelectionDAG &DAG) const
bool targetShrinkDemandedConstant(SDValue Op, const APInt &DemandedBits, const APInt &DemandedElts, TargetLoweringOpt &TLO) const override
Register getExceptionPointerRegister(const Constant *PersonalityFn) const override
If a physical register, this returns the register that receives the exception address on entry to an ...
SDValue expandIndirectJTBranch(const SDLoc &dl, SDValue Value, SDValue Addr, int JTI, SelectionDAG &DAG) const override
Expands target specific indirect branch for the case of JumpTable expansion.
FastISel * createFastISel(FunctionLoweringInfo &funcInfo, const TargetLibraryInfo *libInfo) const override
This method returns a target specific FastISel object, or null if the target does not support "fast" ...
void computeKnownBitsForTargetNode(const SDValue Op, KnownBits &Known, const APInt &DemandedElts, const SelectionDAG &DAG, unsigned Depth=0) const override
Determine which of the bits specified in Mask are known to be either zero or one and return them in t...
bool isBinOp(unsigned Opcode) const override
Add x86-specific opcodes to the default list.
bool isGuaranteedNotToBeUndefOrPoisonForTargetNode(SDValue Op, const APInt &DemandedElts, const SelectionDAG &DAG, bool PoisonOnly, unsigned Depth) const override
Return true if this function can prove that Op is never poison and, if PoisonOnly is false,...
bool IsDesirableToPromoteOp(SDValue Op, EVT &PVT) const override
Return true if the target has native support for the specified value type and it is 'desirable' to us...
SDValue unwrapAddress(SDValue N) const override
CondMergingParams getJumpConditionMergingParams(Instruction::BinaryOps Opc, const Value *Lhs, const Value *Rhs) const override
EVT getSetCCResultType(const DataLayout &DL, LLVMContext &Context, EVT VT) const override
Return the value type to use for ISD::SETCC.
X86TargetLowering(const X86TargetMachine &TM, const X86Subtarget &STI)
bool isTargetCanonicalSelect(SDNode *N) const override
Return true if the given select/vselect should be considered canonical and not be transformed.
bool isVectorLoadExtDesirable(SDValue) const override
Return true if folding a vector load into ExtVal (a sign, zero, or any extend node) is profitable.
const Constant * getTargetConstantFromLoad(LoadSDNode *LD) const override
This method returns the constant pool value that will be loaded by LD.
EVT getTypeToTransformTo(LLVMContext &Context, EVT VT) const override
For types supported by the target, this is an identity function.
bool canCreateUndefOrPoisonForTargetNode(SDValue Op, const APInt &DemandedElts, const SelectionDAG &DAG, bool PoisonOnly, bool ConsiderFlags, unsigned Depth) const override
Return true if Op can create undef or poison from non-undef & non-poison operands.
void insertSSPDeclarations(Module &M) const override
Inserts necessary declarations for SSP (stack protection) purpose.
const MCExpr * LowerCustomJumpTableEntry(const MachineJumpTableInfo *MJTI, const MachineBasicBlock *MBB, unsigned uid, MCContext &Ctx) const override
unsigned getStackProbeSize(const MachineFunction &MF) const
bool ShouldShrinkFPConstant(EVT VT) const override
If true, then instruction selection should seek to shrink the FP constant of the specified type to a ...
void ReplaceNodeResults(SDNode *N, SmallVectorImpl< SDValue > &Results, SelectionDAG &DAG) const override
Replace the results of node with an illegal result type with new values built out of custom code.
bool isMaskAndCmp0FoldingBeneficial(const Instruction &AndI) const override
Return if the target supports combining a chain like:
void LowerAsmOperandForConstraint(SDValue Op, StringRef Constraint, std::vector< SDValue > &Ops, SelectionDAG &DAG) const override
Lower the specified operand into the Ops vector.
bool needsFixedCatchObjects() const override
bool isExtractVecEltCheap(EVT VT, unsigned Index) const override
Extract of a scalar FP value from index 0 of a vector is free.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition CallingConv.h:24
@ CXX_FAST_TLS
Used for access functions.
Definition CallingConv.h:72
@ Fast
Attempts to make calls as fast as possible (e.g.
Definition CallingConv.h:41
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
NodeType
ISD::NodeType enum - This enum defines the target-independent operators for a SelectionDAG.
Definition ISDOpcodes.h:41
@ INSERT_SUBVECTOR
INSERT_SUBVECTOR(VECTOR1, VECTOR2, IDX) - Returns a vector with VECTOR2 inserted into VECTOR1.
Definition ISDOpcodes.h:593
@ LOAD
LOAD and STORE have token chains as their first operand, then the same operands as an LLVM load/store...
@ BITCAST
BITCAST - This operator converts between integer, vector and FP values, as if the value was stored to...
Definition ISDOpcodes.h:981
@ BUILTIN_OP_END
BUILTIN_OP_END - This must be the last enum value in this list.
@ EXTRACT_SUBVECTOR
EXTRACT_SUBVECTOR(VECTOR, IDX) - Returns a subvector from VECTOR.
Definition ISDOpcodes.h:607
CondCode
ISD::CondCode enum - These are ordered carefully to make the bitfields below work out,...
LoadExtType
LoadExtType enum - This enum defines the three variants of LOADEXT (load with extension).
This namespace contains an enum with a value for every intrinsic/builtin function known by LLVM.
@ FST
This instruction implements a truncating store from FP stack slots.
@ REP_MOVS
Repeat move, corresponds to X86::REP_MOVSx.
@ CMPM
Vector comparison generating mask bits for fp and integer signed and unsigned data types.
@ FMAX
Floating point max and min.
@ BT
X86 bit-test instructions.
@ HADD
Integer horizontal add/sub.
@ MOVQ2DQ
Copies a 64-bit value from an MMX vector to the low word of an XMM vector, with the high word zero fi...
@ BLENDI
Blend where the selector is an immediate.
@ CMP
X86 compare and logical compare instructions.
@ BLENDV
Dynamic (non-constant condition) vector blend where only the sign bits of the condition elements are ...
@ ADDSUB
Combined add and sub on an FP vector.
@ RET_GLUE
Return with a glue operand.
@ STRICT_FMAX
Floating point max and min.
@ STRICT_CMPM
Vector comparison generating mask bits for fp and integer signed and unsigned data types.
@ FHADD
Floating point horizontal add/sub.
@ FMAXS
Scalar intrinsic floating point max and min.
@ BSR
Bit scan reverse.
@ IRET
Return from interrupt. Operand 0 is the number of bytes to pop.
@ HADDS
Integer horizontal saturating add/sub.
@ SETCC
X86 SetCC.
@ NT_BRIND
BRIND node with NoTrack prefix.
@ SELECTS
X86 Select.
@ FSETCCM
X86 FP SETCC, similar to above, but with output as an i1 mask and and a version with SAE.
@ PEXTRB
Extract an 8-bit value from a vector and zero extend it to i32, corresponds to X86::PEXTRB.
@ FXOR
Bitwise logical XOR of floating point values.
@ BRCOND
X86 conditional branches.
@ FSETCC
X86 FP SETCC, implemented with CMP{cc}SS/CMP{cc}SD.
@ PINSRB
Insert the lower 8-bits of a 32-bit value to a vector, corresponds to X86::PINSRB.
@ REP_STOS
Repeat fill, corresponds to X86::REP_STOSx.
@ INSERTPS
Insert any element of a 4 x float vector into any element of a destination 4 x floatvector.
@ PSHUFB
Shuffle 16 8-bit values within a vector.
@ PEXTRW
Extract a 16-bit value from a vector and zero extend it to i32, corresponds to X86::PEXTRW.
@ CALL
These operations represent an abstract X86 call instruction, which includes a bunch of information.
@ AADD
RAO arithmetic instructions.
@ FANDN
Bitwise logical ANDNOT of floating point values.
@ GlobalBaseReg
On Darwin, this node represents the result of the popl at function entry, used for PIC code.
@ FMAXC
Commutative FMIN and FMAX.
@ EXTRQI
SSE4A Extraction and Insertion.
@ FLD
This instruction implements an extending load to FP stack slots.
@ TC_RETURN
Tail call return.
@ PSADBW
Compute Sum of Absolute Differences.
@ FOR
Bitwise logical OR of floating point values.
@ FIST
This instruction implements a fp->int store from FP stack slots.
@ FP_TO_INT_IN_MEM
This instruction implements FP_TO_SINT with the integer destination in memory and a FP reg source.
@ LADD
LOCK-prefixed arithmetic read-modify-write instructions.
@ DBPSADBW
Compute Double Block Packed Sum-Absolute-Differences.
@ MMX_MOVW2D
Copies a GPR into the low 32-bit word of a MMX vector and zero out the high word.
@ Wrapper
A wrapper node for TargetConstantPool, TargetJumpTable, TargetExternalSymbol, TargetGlobalAddress,...
@ PINSRW
Insert the lower 16-bits of a 32-bit value to a vector, corresponds to X86::PINSRW.
@ CMPCCXADD
Compare and Add if Condition is Met.
@ NT_CALL
Same as call except it adds the NoTrack prefix.
@ MMX_MOVD2W
Copies a 32-bit value from the low word of a MMX vector to a GPR.
@ FILD
This instruction implements SINT_TO_FP with the integer source in memory and FP reg result.
@ MOVDQ2Q
Copies a 64-bit value from the low word of an XMM vector to an MMX vector.
@ ANDNP
Bitwise Logical AND NOT of Packed FP values.
@ BSF
Bit scan forward.
@ POP_FROM_X87_REG
The same as ISD::CopyFromReg except that this node makes it explicit that it may lower to an x87 FPU ...
@ VAARG_64
These instructions grab the address of the next argument from a va_list.
@ FAND
Bitwise logical AND of floating point values.
@ CMOV
X86 conditional moves.
@ WrapperRIP
Special wrapper used under X86-64 PIC mode for RIP relative displacements.
@ FIRST_STRICTFP_OPCODE
X86 strict FP compare instructions.
@ FSHL
X86 funnel/double shift i16 instructions.
@ FRSQRT
Floating point reciprocal-sqrt and reciprocal approximation.
Define some predicates that are used for node matching.
RoundingMode
Current rounding mode is represented in bits 11:10 of FPSR.
bool mayFoldLoadIntoBroadcastFromMem(SDValue Op, MVT EltVT, const X86Subtarget &Subtarget, bool AssumeSingleUse=false)
Check if Op is a load operation that could be folded into a vector splat instruction as a memory oper...
bool isZeroNode(SDValue Elt)
Returns true if Elt is a constant zero or floating point constant +0.0.
bool mayFoldIntoZeroExtend(SDValue Op)
Check if Op is an operation that could be folded into a zero extend x86 instruction.
bool mayFoldIntoStore(SDValue Op)
Check if Op is a value that could be used to fold a store into some other x86 instruction as a memory...
bool isExtendedSwiftAsyncFrameSupported(const X86Subtarget &Subtarget, const MachineFunction &MF)
True if the target supports the extended frame for async Swift functions.
int getRoundingModeX86(unsigned RM)
Convert LLVM rounding mode to X86 rounding mode.
bool isCalleePop(CallingConv::ID CallingConv, bool is64Bit, bool IsVarArg, bool GuaranteeTCO)
Determines whether the callee is required to pop its own arguments.
FastISel * createFastISel(FunctionLoweringInfo &funcInfo, const TargetLibraryInfo *libInfo)
bool mayFoldLoad(SDValue Op, const X86Subtarget &Subtarget, bool AssumeSingleUse=false, bool IgnoreAlignment=false)
Check if Op is a load operation that could be folded into some other x86 instruction as a memory oper...
bool isOffsetSuitableForCodeModel(int64_t Offset, CodeModel::Model M, bool hasSymbolicDisplacement)
Returns true of the given offset can be fit into displacement field of the instruction.
bool isConstantSplat(SDValue Op, APInt &SplatVal, bool AllowPartialUndefs)
If Op is a constant whose elements are all the same constant or undefined, return true and return the...
This is an optimization pass for GlobalISel generic memory operations.
@ Offset
Definition DWP.cpp:532
InstructionCost Cost
void createUnpackShuffleMask(EVT VT, SmallVectorImpl< int > &Mask, bool Lo, bool Unary)
Generate unpacklo/unpackhi shuffle mask.
void createSplat2ShuffleMask(MVT VT, SmallVectorImpl< int > &Mask, bool Lo)
Similar to unpacklo/unpackhi, but without the 128-bit lane limitation imposed by AVX and specific to ...
uint16_t MCPhysReg
An unsigned integer type large enough to represent all physical registers, but not necessarily virtua...
Definition MCRegister.h:21
DWARFExpression::Operation Op
ArrayRef(const T &OneElt) -> ArrayRef< T >
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
#define N
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
Extended Value Type.
Definition ValueTypes.h:35
bool isFloatingPoint() const
Return true if this is a FP or a vector FP type.
Definition ValueTypes.h:147
static EVT getIntegerVT(LLVMContext &Context, unsigned BitWidth)
Returns the EVT that represents an integer with the given number of bits.
Definition ValueTypes.h:65
bool isVector() const
Return true if this is a vector value type.
Definition ValueTypes.h:168
EVT getScalarType() const
If this is a vector type, return the element type, otherwise return this.
Definition ValueTypes.h:323
bool isScalarInteger() const
Return true if this is an integer, but not a vector.
Definition ValueTypes.h:157
bool isInteger() const
Return true if this is an integer or a vector integer type.
Definition ValueTypes.h:152
This class contains a discriminated union of information about pointers in memory operands,...