|
reference, declaration → definition
definition → references, declarations, derived classes, virtual overrides
reference to multiple definitions → definitions
unreferenced
|
Declarations
include/llvm/CodeGen/Analysis.h 35 class SDValue;
include/llvm/CodeGen/SelectionDAGISel.h 28 class SDValue;
References
gen/lib/Target/AArch64/AArch64GenDAGISel.inc115484 SDValue N, unsigned PatternNo,
115485 SmallVectorImpl<std::pair<SDValue, SDNode*>> &Result)
115630 SDValue DAGISEL_CLASS_COLONCOLON RunSDNodeXForm(SDValue V, unsigned XFormNo)
115630 SDValue DAGISEL_CLASS_COLONCOLON RunSDNodeXForm(SDValue V, unsigned XFormNo)
gen/lib/Target/AMDGPU/AMDGPUGenDAGISel.inc78718 SDValue Src0 = N->getOperand(0);
78719 SDValue Src1 = N->getOperand(1);
79609 bool DAGISEL_CLASS_COLONCOLON CheckNodePredicateWithOperands(SDNode *Node, unsigned PredNo, const SmallVectorImpl<SDValue> &Operands) const
79662 SDValue N, unsigned PatternNo,
79663 SmallVectorImpl<std::pair<SDValue, SDNode*>> &Result)
79778 SDValue DAGISEL_CLASS_COLONCOLON RunSDNodeXForm(SDValue V, unsigned XFormNo)
79778 SDValue DAGISEL_CLASS_COLONCOLON RunSDNodeXForm(SDValue V, unsigned XFormNo)
gen/lib/Target/AMDGPU/R600GenDAGISel.inc12583 SDValue N, unsigned PatternNo,
12584 SmallVectorImpl<std::pair<SDValue, SDNode*>> &Result)
12612 SDValue DAGISEL_CLASS_COLONCOLON RunSDNodeXForm(SDValue V, unsigned XFormNo)
12612 SDValue DAGISEL_CLASS_COLONCOLON RunSDNodeXForm(SDValue V, unsigned XFormNo)
gen/lib/Target/ARC/ARCGenDAGISel.inc 1219 SDValue N, unsigned PatternNo,
1220 SmallVectorImpl<std::pair<SDValue, SDNode*>> &Result)
gen/lib/Target/ARM/ARMGenDAGISel.inc54869 SDValue N, unsigned PatternNo,
54870 SmallVectorImpl<std::pair<SDValue, SDNode*>> &Result)
55015 SDValue DAGISEL_CLASS_COLONCOLON RunSDNodeXForm(SDValue V, unsigned XFormNo)
55015 SDValue DAGISEL_CLASS_COLONCOLON RunSDNodeXForm(SDValue V, unsigned XFormNo)
gen/lib/Target/AVR/AVRGenDAGISel.inc 1724 SDValue N, unsigned PatternNo,
1725 SmallVectorImpl<std::pair<SDValue, SDNode*>> &Result)
1744 SDValue DAGISEL_CLASS_COLONCOLON RunSDNodeXForm(SDValue V, unsigned XFormNo)
1744 SDValue DAGISEL_CLASS_COLONCOLON RunSDNodeXForm(SDValue V, unsigned XFormNo)
gen/lib/Target/BPF/BPFGenDAGISel.inc 2104 SDValue N, unsigned PatternNo,
2105 SmallVectorImpl<std::pair<SDValue, SDNode*>> &Result)
gen/lib/Target/Hexagon/HexagonGenDAGISel.inc72650 SDValue Op1 = N->getOperand(1);
72896 SDValue N, unsigned PatternNo,
72897 SmallVectorImpl<std::pair<SDValue, SDNode*>> &Result) override;
72901 SDValue N, unsigned PatternNo,
72902 SmallVectorImpl<std::pair<SDValue, SDNode*>> &Result)
72942 SDValue RunSDNodeXForm(SDValue V, unsigned XFormNo) override;
72942 SDValue RunSDNodeXForm(SDValue V, unsigned XFormNo) override;
72945 SDValue DAGISEL_CLASS_COLONCOLON RunSDNodeXForm(SDValue V, unsigned XFormNo)
72945 SDValue DAGISEL_CLASS_COLONCOLON RunSDNodeXForm(SDValue V, unsigned XFormNo)
gen/lib/Target/Lanai/LanaiGenDAGISel.inc 1512 SDValue N, unsigned PatternNo,
1513 SmallVectorImpl<std::pair<SDValue, SDNode*>> &Result)
1541 SDValue DAGISEL_CLASS_COLONCOLON RunSDNodeXForm(SDValue V, unsigned XFormNo)
1541 SDValue DAGISEL_CLASS_COLONCOLON RunSDNodeXForm(SDValue V, unsigned XFormNo)
gen/lib/Target/MSP430/MSP430GenDAGISel.inc 4885 SDValue N, unsigned PatternNo,
4886 SmallVectorImpl<std::pair<SDValue, SDNode*>> &Result)
gen/lib/Target/Mips/MipsGenDAGISel.inc30479 SDValue N, unsigned PatternNo,
30480 SmallVectorImpl<std::pair<SDValue, SDNode*>> &Result)
30613 SDValue DAGISEL_CLASS_COLONCOLON RunSDNodeXForm(SDValue V, unsigned XFormNo)
30613 SDValue DAGISEL_CLASS_COLONCOLON RunSDNodeXForm(SDValue V, unsigned XFormNo)
gen/lib/Target/NVPTX/NVPTXGenDAGISel.inc72319 SDValue N, unsigned PatternNo,
72320 SmallVectorImpl<std::pair<SDValue, SDNode*>> &Result)
72345 SDValue DAGISEL_CLASS_COLONCOLON RunSDNodeXForm(SDValue V, unsigned XFormNo)
72345 SDValue DAGISEL_CLASS_COLONCOLON RunSDNodeXForm(SDValue V, unsigned XFormNo)
gen/lib/Target/PowerPC/PPCGenDAGISel.inc44827 SDValue N, unsigned PatternNo,
44828 SmallVectorImpl<std::pair<SDValue, SDNode*>> &Result)
44871 SDValue DAGISEL_CLASS_COLONCOLON RunSDNodeXForm(SDValue V, unsigned XFormNo)
44871 SDValue DAGISEL_CLASS_COLONCOLON RunSDNodeXForm(SDValue V, unsigned XFormNo)
gen/lib/Target/RISCV/RISCVGenDAGISel.inc14159 SDValue N, unsigned PatternNo,
14160 SmallVectorImpl<std::pair<SDValue, SDNode*>> &Result)
14179 SDValue DAGISEL_CLASS_COLONCOLON RunSDNodeXForm(SDValue V, unsigned XFormNo)
14179 SDValue DAGISEL_CLASS_COLONCOLON RunSDNodeXForm(SDValue V, unsigned XFormNo)
gen/lib/Target/Sparc/SparcGenDAGISel.inc 3602 SDValue N, unsigned PatternNo,
3603 SmallVectorImpl<std::pair<SDValue, SDNode*>> &Result)
3625 SDValue DAGISEL_CLASS_COLONCOLON RunSDNodeXForm(SDValue V, unsigned XFormNo)
3625 SDValue DAGISEL_CLASS_COLONCOLON RunSDNodeXForm(SDValue V, unsigned XFormNo)
gen/lib/Target/SystemZ/SystemZGenDAGISel.inc30435 SDValue N, unsigned PatternNo,
30436 SmallVectorImpl<std::pair<SDValue, SDNode*>> &Result)
30503 SDValue DAGISEL_CLASS_COLONCOLON RunSDNodeXForm(SDValue V, unsigned XFormNo)
30503 SDValue DAGISEL_CLASS_COLONCOLON RunSDNodeXForm(SDValue V, unsigned XFormNo)
gen/lib/Target/X86/X86GenDAGISel.inc254667 SDValue N, unsigned PatternNo,
254668 SmallVectorImpl<std::pair<SDValue, SDNode*>> &Result)
254723 SDValue DAGISEL_CLASS_COLONCOLON RunSDNodeXForm(SDValue V, unsigned XFormNo)
254723 SDValue DAGISEL_CLASS_COLONCOLON RunSDNodeXForm(SDValue V, unsigned XFormNo)
gen/lib/Target/XCore/XCoreGenDAGISel.inc 2446 SDValue N, unsigned PatternNo,
2447 SmallVectorImpl<std::pair<SDValue, SDNode*>> &Result)
2466 SDValue DAGISEL_CLASS_COLONCOLON RunSDNodeXForm(SDValue V, unsigned XFormNo)
2466 SDValue DAGISEL_CLASS_COLONCOLON RunSDNodeXForm(SDValue V, unsigned XFormNo)
include/llvm/ADT/ArrayRef.h 43 using iterator = const T *;
44 using const_iterator = const T *;
50 const T *Data = nullptr;
66 /*implicit*/ ArrayRef(const T &OneElt)
70 /*implicit*/ ArrayRef(const T *data, size_t length)
74 ArrayRef(const T *begin, const T *end)
74 ArrayRef(const T *begin, const T *end)
81 /*implicit*/ ArrayRef(const SmallVectorTemplateCommon<T, U> &Vec)
87 /*implicit*/ ArrayRef(const std::vector<T, A> &Vec)
92 /*implicit*/ constexpr ArrayRef(const std::array<T, N> &Arr)
97 /*implicit*/ constexpr ArrayRef(const T (&Arr)[N]) : Data(Arr), Length(N) {}
100 /*implicit*/ ArrayRef(const std::initializer_list<T> &Vec)
145 const T *data() const { return Data; }
151 const T &front() const {
157 const T &back() const {
163 template <typename Allocator> ArrayRef<T> copy(Allocator &A) {
178 ArrayRef<T> slice(size_t N, size_t M) const {
184 ArrayRef<T> slice(size_t N) const { return slice(N, size() - N); }
187 ArrayRef<T> drop_front(size_t N = 1) const {
193 ArrayRef<T> drop_back(size_t N = 1) const {
200 template <class PredicateT> ArrayRef<T> drop_while(PredicateT Pred) const {
206 template <class PredicateT> ArrayRef<T> drop_until(PredicateT Pred) const {
211 ArrayRef<T> take_front(size_t N = 1) const {
218 ArrayRef<T> take_back(size_t N = 1) const {
226 template <class PredicateT> ArrayRef<T> take_while(PredicateT Pred) const {
232 template <class PredicateT> ArrayRef<T> take_until(PredicateT Pred) const {
239 const T &operator[](size_t Index) const {
249 typename std::enable_if<std::is_same<U, T>::value, ArrayRef<T>>::type &
257 typename std::enable_if<std::is_same<U, T>::value, ArrayRef<T>>::type &
263 std::vector<T> vec() const {
270 operator std::vector<T>() const {
290 class LLVM_NODISCARD MutableArrayRef : public ArrayRef<T> {
292 using iterator = T *;
302 /*implicit*/ MutableArrayRef(T &OneElt) : ArrayRef<T>(OneElt) {}
305 /*implicit*/ MutableArrayRef(T *data, size_t length)
309 MutableArrayRef(T *begin, T *end) : ArrayRef<T>(begin, end) {}
309 MutableArrayRef(T *begin, T *end) : ArrayRef<T>(begin, end) {}
312 /*implicit*/ MutableArrayRef(SmallVectorImpl<T> &Vec)
316 /*implicit*/ MutableArrayRef(std::vector<T> &Vec)
321 /*implicit*/ constexpr MutableArrayRef(std::array<T, N> &Arr)
326 /*implicit*/ constexpr MutableArrayRef(T (&Arr)[N]) : ArrayRef<T>(Arr) {}
328 T *data() const { return const_cast<T*>(ArrayRef<T>::data()); }
337 T &front() const {
343 T &back() const {
350 MutableArrayRef<T> slice(size_t N, size_t M) const {
356 MutableArrayRef<T> slice(size_t N) const {
361 MutableArrayRef<T> drop_front(size_t N = 1) const {
366 MutableArrayRef<T> drop_back(size_t N = 1) const {
374 MutableArrayRef<T> drop_while(PredicateT Pred) const {
381 MutableArrayRef<T> drop_until(PredicateT Pred) const {
386 MutableArrayRef<T> take_front(size_t N = 1) const {
393 MutableArrayRef<T> take_back(size_t N = 1) const {
402 MutableArrayRef<T> take_while(PredicateT Pred) const {
409 MutableArrayRef<T> take_until(PredicateT Pred) const {
416 T &operator[](size_t Index) const {
456 ArrayRef<T> makeArrayRef(const T *data, size_t length) {
456 ArrayRef<T> makeArrayRef(const T *data, size_t length) {
468 ArrayRef<T> makeArrayRef(const SmallVectorImpl<T> &Vec) {
468 ArrayRef<T> makeArrayRef(const SmallVectorImpl<T> &Vec) {
474 ArrayRef<T> makeArrayRef(const SmallVector<T, N> &Vec) {
474 ArrayRef<T> makeArrayRef(const SmallVector<T, N> &Vec) {
include/llvm/ADT/DenseMap.h 40 struct DenseMapPair : public std::pair<KeyT, ValueT> {
40 struct DenseMapPair : public std::pair<KeyT, ValueT> {
43 KeyT &getFirst() { return std::pair<KeyT, ValueT>::first; }
44 const KeyT &getFirst() const { return std::pair<KeyT, ValueT>::first; }
45 ValueT &getSecond() { return std::pair<KeyT, ValueT>::second; }
46 const ValueT &getSecond() const { return std::pair<KeyT, ValueT>::second; }
65 using key_type = KeyT;
66 using mapped_type = ValueT;
69 using iterator = DenseMapIterator<KeyT, ValueT, KeyInfoT, BucketT>;
69 using iterator = DenseMapIterator<KeyT, ValueT, KeyInfoT, BucketT>;
71 DenseMapIterator<KeyT, ValueT, KeyInfoT, BucketT, true>;
71 DenseMapIterator<KeyT, ValueT, KeyInfoT, BucketT, true>;
78 if (shouldReverseIterate<KeyT>())
121 const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
122 if (is_trivially_copyable<KeyT>::value &&
123 is_trivially_copyable<ValueT>::value) {
145 size_type count(const_arg_type_t<KeyT> Val) const {
150 iterator find(const_arg_type_t<KeyT> Val) {
156 const_iterator find(const_arg_type_t<KeyT> Val) const {
185 ValueT lookup(const_arg_type_t<KeyT> Val) const {
185 ValueT lookup(const_arg_type_t<KeyT> Val) const {
195 std::pair<iterator, bool> insert(const std::pair<KeyT, ValueT> &KV) {
195 std::pair<iterator, bool> insert(const std::pair<KeyT, ValueT> &KV) {
202 std::pair<iterator, bool> insert(std::pair<KeyT, ValueT> &&KV) {
202 std::pair<iterator, bool> insert(std::pair<KeyT, ValueT> &&KV) {
210 std::pair<iterator, bool> try_emplace(KeyT &&Key, Ts &&... Args) {
219 InsertIntoBucket(TheBucket, std::move(Key), std::forward<Ts>(Args)...);
229 std::pair<iterator, bool> try_emplace(const KeyT &Key, Ts &&... Args) {
249 std::pair<iterator, bool> insert_as(std::pair<KeyT, ValueT> &&KV,
249 std::pair<iterator, bool> insert_as(std::pair<KeyT, ValueT> &&KV,
272 bool erase(const KeyT &Val) {
291 value_type& FindAndConstruct(const KeyT &Key) {
299 ValueT &operator[](const KeyT &Key) {
299 ValueT &operator[](const KeyT &Key) {
303 value_type& FindAndConstruct(KeyT &&Key) {
311 ValueT &operator[](KeyT &&Key) {
311 ValueT &operator[](KeyT &&Key) {
334 const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
349 const KeyT EmptyKey = getEmptyKey();
351 ::new (&B->getFirst()) KeyT(EmptyKey);
369 const KeyT EmptyKey = getEmptyKey();
370 const KeyT TombstoneKey = getTombstoneKey();
380 ::new (&DestBucket->getSecond()) ValueT(std::move(B->getSecond()));
392 const DenseMapBase<OtherBaseT, KeyT, ValueT, KeyInfoT, BucketT> &other) {
392 const DenseMapBase<OtherBaseT, KeyT, ValueT, KeyInfoT, BucketT> &other) {
414 static unsigned getHashValue(const KeyT &Val) {
419 static unsigned getHashValue(const LookupKeyT &Val) {
423 static const KeyT getEmptyKey() {
429 static const KeyT getTombstoneKey() {
437 if (shouldReverseIterate<KeyT>()) {
515 BucketT *InsertIntoBucket(BucketT *TheBucket, KeyArg &&Key,
516 ValueArgs &&... Values) {
519 TheBucket->getFirst() = std::forward<KeyArg>(Key);
520 ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
520 ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
525 BucketT *InsertIntoBucketWithLookup(BucketT *TheBucket, KeyT &&Key,
526 ValueT &&Value, LookupKeyT &Lookup) {
535 BucketT *InsertIntoBucketImpl(const KeyT &Key, const LookupKeyT &Lookup,
535 BucketT *InsertIntoBucketImpl(const KeyT &Key, const LookupKeyT &Lookup,
566 const KeyT EmptyKey = getEmptyKey();
578 bool LookupBucketFor(const LookupKeyT &Val,
590 const KeyT EmptyKey = getEmptyKey();
591 const KeyT TombstoneKey = getTombstoneKey();
629 bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
684 class DenseMap : public DenseMapBase<DenseMap<KeyT, ValueT, KeyInfoT, BucketT>,
684 class DenseMap : public DenseMapBase<DenseMap<KeyT, ValueT, KeyInfoT, BucketT>,
685 KeyT, ValueT, KeyInfoT, BucketT> {
685 KeyT, ValueT, KeyInfoT, BucketT> {
690 using BaseT = DenseMapBase<DenseMap, KeyT, ValueT, KeyInfoT, BucketT>;
690 using BaseT = DenseMapBase<DenseMap, KeyT, ValueT, KeyInfoT, BucketT>;
852 SmallDenseMap<KeyT, ValueT, InlineBuckets, KeyInfoT, BucketT>, KeyT,
852 SmallDenseMap<KeyT, ValueT, InlineBuckets, KeyInfoT, BucketT>, KeyT,
852 SmallDenseMap<KeyT, ValueT, InlineBuckets, KeyInfoT, BucketT>, KeyT,
853 ValueT, KeyInfoT, BucketT> {
1023 const KeyT EmptyKey = this->getEmptyKey();
1024 const KeyT TombstoneKey = this->getTombstoneKey();
1030 ::new (&TmpEnd->getFirst()) KeyT(std::move(P->getFirst()));
1031 ::new (&TmpEnd->getSecond()) ValueT(std::move(P->getSecond()));
1163 using ConstIterator = DenseMapIterator<KeyT, ValueT, KeyInfoT, Bucket, true>;
1163 using ConstIterator = DenseMapIterator<KeyT, ValueT, KeyInfoT, Bucket, true>;
1186 if (shouldReverseIterate<KeyT>()) {
1199 const DenseMapIterator<KeyT, ValueT, KeyInfoT, Bucket, IsConstSrc> &I)
1199 const DenseMapIterator<KeyT, ValueT, KeyInfoT, Bucket, IsConstSrc> &I)
1210 if (shouldReverseIterate<KeyT>())
1232 if (shouldReverseIterate<KeyT>()) {
1249 const KeyT Empty = KeyInfoT::getEmptyKey();
1250 const KeyT Tombstone = KeyInfoT::getTombstoneKey();
1259 const KeyT Empty = KeyInfoT::getEmptyKey();
1260 const KeyT Tombstone = KeyInfoT::getTombstoneKey();
include/llvm/ADT/DenseMapInfo.h 186 using Pair = std::pair<T, U>;
187 using FirstInfo = DenseMapInfo<T>;
include/llvm/ADT/STLExtras.h 1023 constexpr inline size_t array_lengthof(T (&)[N]) {
1224 bool is_contained(R &&Range, const E &Element) {
include/llvm/ADT/SmallSet.h 138 SmallVector<T, N> Vector;
139 std::set<T, C> Set;
141 using VIterator = typename SmallVector<T, N>::const_iterator;
142 using mutable_iterator = typename SmallVector<T, N>::iterator;
151 using const_iterator = SmallSetIterator<T, N, C>;
164 size_type count(const T &V) const {
180 std::pair<NoneType, bool> insert(const T &V) {
207 bool erase(const T &V) {
238 VIterator vfind(const T &V) const {
include/llvm/ADT/SmallVector.h 75 AlignedCharArrayUnion<T> FirstEl;
114 using value_type = T;
115 using iterator = T *;
116 using const_iterator = const T *;
121 using reference = T &;
122 using const_reference = const T &;
123 using pointer = T *;
124 using const_pointer = const T *;
259 class SmallVectorTemplateBase<T, true> : public SmallVectorTemplateCommon<T> {
264 static void destroy_range(T *, T *) {}
264 static void destroy_range(T *, T *) {}
286 T1 *I, T1 *E, T2 *Dest,
286 T1 *I, T1 *E, T2 *Dest,
286 T1 *I, T1 *E, T2 *Dest,
287 typename std::enable_if<std::is_same<typename std::remove_const<T1>::type,
288 T2>::value>::type * = nullptr) {
294 memcpy(reinterpret_cast<void *>(Dest), I, (E - I) * sizeof(T));
299 void grow(size_t MinSize = 0) { this->grow_pod(MinSize, sizeof(T)); }
302 void push_back(const T &Elt) {
305 memcpy(reinterpret_cast<void *>(this->end()), &Elt, sizeof(T));
315 class SmallVectorImpl : public SmallVectorTemplateBase<T> {
316 using SuperClass = SmallVectorTemplateBase<T>;
352 new (&*I) T();
357 void resize(size_type N, const T &NV) {
374 LLVM_NODISCARD T pop_back_val() {
375 T Result = ::std::move(this->back());
397 void append(size_type NumInputs, const T &Elt) {
405 void append(std::initializer_list<T> IL) {
412 void assign(size_type NumElts, const T &Elt) {
429 void assign(std::initializer_list<T> IL) {
467 iterator insert(iterator I, T &&Elt) {
482 ::new ((void*) this->end()) T(::std::move(this->back()));
489 T *EltPtr = &Elt;
497 iterator insert(iterator I, const T &Elt) {
511 ::new ((void*) this->end()) T(std::move(this->back()));
518 const T *EltPtr = &Elt;
526 iterator insert(iterator I, size_type NumToInsert, const T &Elt) {
606 T *OldEnd = this->end();
621 T *OldEnd = this->end();
627 for (T *J = I; NumOverwritten > 0; --NumOverwritten) {
637 void insert(iterator I, std::initializer_list<T> IL) {
641 template <typename... ArgTypes> reference emplace_back(ArgTypes &&... Args) {
644 ::new ((void *)this->end()) T(std::forward<ArgTypes>(Args)...);
820 AlignedCharArrayUnion<T> InlineElts[N];
837 class SmallVector : public SmallVectorImpl<T>, SmallVectorStorage<T, N> {
837 class SmallVector : public SmallVectorImpl<T>, SmallVectorStorage<T, N> {
846 explicit SmallVector(size_t Size, const T &Value = T())
865 SmallVector(std::initializer_list<T> IL) : SmallVectorImpl<T>(N) {
884 SmallVector(SmallVectorImpl<T> &&RHS) : SmallVectorImpl<T>(N) {
include/llvm/ADT/iterator.h 68 : public std::iterator<IteratorCategoryT, T, DifferenceTypeT, PointerT,
206 : public iterator_facade_base<DerivedT, IteratorCategoryT, T,
include/llvm/CodeGen/SelectionDAG.h 242 SDValue Root;
379 void createOperands(SDNode *Node, ArrayRef<SDValue> Vals);
474 const SDValue &getRoot() const { return Root; }
477 SDValue getEntryNode() const {
483 const SDValue &setRoot(SDValue N) {
483 const SDValue &setRoot(SDValue N) {
578 SDValue getConstant(uint64_t Val, const SDLoc &DL, EVT VT,
580 SDValue getConstant(const APInt &Val, const SDLoc &DL, EVT VT,
583 SDValue getAllOnesConstant(const SDLoc &DL, EVT VT, bool IsTarget = false,
589 SDValue getConstant(const ConstantInt &Val, const SDLoc &DL, EVT VT,
591 SDValue getIntPtrConstant(uint64_t Val, const SDLoc &DL,
593 SDValue getShiftAmountConstant(uint64_t Val, EVT VT, const SDLoc &DL,
596 SDValue getTargetConstant(uint64_t Val, const SDLoc &DL, EVT VT,
600 SDValue getTargetConstant(const APInt &Val, const SDLoc &DL, EVT VT,
604 SDValue getTargetConstant(const ConstantInt &Val, const SDLoc &DL, EVT VT,
611 SDValue getBoolConstant(bool V, const SDLoc &DL, EVT VT, EVT OpVT);
622 SDValue getConstantFP(double Val, const SDLoc &DL, EVT VT,
624 SDValue getConstantFP(const APFloat &Val, const SDLoc &DL, EVT VT,
626 SDValue getConstantFP(const ConstantFP &V, const SDLoc &DL, EVT VT,
628 SDValue getTargetConstantFP(double Val, const SDLoc &DL, EVT VT) {
631 SDValue getTargetConstantFP(const APFloat &Val, const SDLoc &DL, EVT VT) {
634 SDValue getTargetConstantFP(const ConstantFP &Val, const SDLoc &DL, EVT VT) {
639 SDValue getGlobalAddress(const GlobalValue *GV, const SDLoc &DL, EVT VT,
642 SDValue getTargetGlobalAddress(const GlobalValue *GV, const SDLoc &DL, EVT VT,
646 SDValue getFrameIndex(int FI, EVT VT, bool isTarget = false);
647 SDValue getTargetFrameIndex(int FI, EVT VT) {
650 SDValue getJumpTable(int JTI, EVT VT, bool isTarget = false,
652 SDValue getTargetJumpTable(int JTI, EVT VT, unsigned TargetFlags = 0) {
655 SDValue getConstantPool(const Constant *C, EVT VT, unsigned Align = 0,
658 SDValue getTargetConstantPool(const Constant *C, EVT VT, unsigned Align = 0,
662 SDValue getConstantPool(MachineConstantPoolValue *C, EVT VT,
665 SDValue getTargetConstantPool(MachineConstantPoolValue *C, EVT VT,
670 SDValue getTargetIndex(int Index, EVT VT, int64_t Offset = 0,
674 SDValue getBasicBlock(MachineBasicBlock *MBB);
675 SDValue getBasicBlock(MachineBasicBlock *MBB, SDLoc dl);
676 SDValue getExternalSymbol(const char *Sym, EVT VT);
677 SDValue getExternalSymbol(const char *Sym, const SDLoc &dl, EVT VT);
678 SDValue getTargetExternalSymbol(const char *Sym, EVT VT,
680 SDValue getMCSymbol(MCSymbol *Sym, EVT VT);
682 SDValue getValueType(EVT);
683 SDValue getRegister(unsigned Reg, EVT VT);
684 SDValue getRegisterMask(const uint32_t *RegMask);
685 SDValue getEHLabel(const SDLoc &dl, SDValue Root, MCSymbol *Label);
685 SDValue getEHLabel(const SDLoc &dl, SDValue Root, MCSymbol *Label);
686 SDValue getLabelNode(unsigned Opcode, const SDLoc &dl, SDValue Root,
686 SDValue getLabelNode(unsigned Opcode, const SDLoc &dl, SDValue Root,
688 SDValue getBlockAddress(const BlockAddress *BA, EVT VT, int64_t Offset = 0,
690 SDValue getTargetBlockAddress(const BlockAddress *BA, EVT VT,
695 SDValue getCopyToReg(SDValue Chain, const SDLoc &dl, unsigned Reg,
695 SDValue getCopyToReg(SDValue Chain, const SDLoc &dl, unsigned Reg,
696 SDValue N) {
704 SDValue getCopyToReg(SDValue Chain, const SDLoc &dl, unsigned Reg, SDValue N,
704 SDValue getCopyToReg(SDValue Chain, const SDLoc &dl, unsigned Reg, SDValue N,
704 SDValue getCopyToReg(SDValue Chain, const SDLoc &dl, unsigned Reg, SDValue N,
705 SDValue Glue) {
707 SDValue Ops[] = { Chain, getRegister(Reg, N.getValueType()), N, Glue };
713 SDValue getCopyToReg(SDValue Chain, const SDLoc &dl, SDValue Reg, SDValue N,
713 SDValue getCopyToReg(SDValue Chain, const SDLoc &dl, SDValue Reg, SDValue N,
713 SDValue getCopyToReg(SDValue Chain, const SDLoc &dl, SDValue Reg, SDValue N,
713 SDValue getCopyToReg(SDValue Chain, const SDLoc &dl, SDValue Reg, SDValue N,
714 SDValue Glue) {
716 SDValue Ops[] = { Chain, Reg, N, Glue };
721 SDValue getCopyFromReg(SDValue Chain, const SDLoc &dl, unsigned Reg, EVT VT) {
721 SDValue getCopyFromReg(SDValue Chain, const SDLoc &dl, unsigned Reg, EVT VT) {
723 SDValue Ops[] = { Chain, getRegister(Reg, VT) };
730 SDValue getCopyFromReg(SDValue Chain, const SDLoc &dl, unsigned Reg, EVT VT,
730 SDValue getCopyFromReg(SDValue Chain, const SDLoc &dl, unsigned Reg, EVT VT,
731 SDValue Glue) {
733 SDValue Ops[] = { Chain, getRegister(Reg, VT), Glue };
738 SDValue getCondCode(ISD::CondCode Cond);
743 SDValue getVectorShuffle(EVT VT, const SDLoc &dl, SDValue N1, SDValue N2,
743 SDValue getVectorShuffle(EVT VT, const SDLoc &dl, SDValue N1, SDValue N2,
743 SDValue getVectorShuffle(EVT VT, const SDLoc &dl, SDValue N1, SDValue N2,
750 SDValue getBuildVector(EVT VT, const SDLoc &DL, ArrayRef<SDValue> Ops) {
750 SDValue getBuildVector(EVT VT, const SDLoc &DL, ArrayRef<SDValue> Ops) {
759 SDValue getBuildVector(EVT VT, const SDLoc &DL, ArrayRef<SDUse> Ops) {
767 SDValue getSplatBuildVector(EVT VT, const SDLoc &DL, SDValue Op) {
767 SDValue getSplatBuildVector(EVT VT, const SDLoc &DL, SDValue Op) {
778 SmallVector<SDValue, 16> Ops(VT.getVectorNumElements(), Op);
784 SDValue getSplatVector(EVT VT, const SDLoc &DL, SDValue Op) {
784 SDValue getSplatVector(EVT VT, const SDLoc &DL, SDValue Op) {
800 SDValue getCommutedVectorShuffle(const ShuffleVectorSDNode &SV);
804 SDValue getFPExtendOrRound(SDValue Op, const SDLoc &DL, EVT VT);
804 SDValue getFPExtendOrRound(SDValue Op, const SDLoc &DL, EVT VT);
808 SDValue getAnyExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT);
808 SDValue getAnyExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT);
812 SDValue getSExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT);
812 SDValue getSExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT);
816 SDValue getZExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT);
816 SDValue getZExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT);
820 SDValue getZeroExtendInReg(SDValue Op, const SDLoc &DL, EVT VT);
820 SDValue getZeroExtendInReg(SDValue Op, const SDLoc &DL, EVT VT);
825 SDValue getPtrExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT);
825 SDValue getPtrExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT);
830 SDValue getPtrExtendInReg(SDValue Op, const SDLoc &DL, EVT VT);
830 SDValue getPtrExtendInReg(SDValue Op, const SDLoc &DL, EVT VT);
835 SDValue getBoolExtOrTrunc(SDValue Op, const SDLoc &SL, EVT VT, EVT OpVT);
835 SDValue getBoolExtOrTrunc(SDValue Op, const SDLoc &SL, EVT VT, EVT OpVT);
838 SDValue getNOT(const SDLoc &DL, SDValue Val, EVT VT);
838 SDValue getNOT(const SDLoc &DL, SDValue Val, EVT VT);
841 SDValue getLogicalNOT(const SDLoc &DL, SDValue Val, EVT VT);
841 SDValue getLogicalNOT(const SDLoc &DL, SDValue Val, EVT VT);
846 SDValue getObjectPtrOffset(const SDLoc &SL, SDValue Op, int64_t Offset) {
846 SDValue getObjectPtrOffset(const SDLoc &SL, SDValue Op, int64_t Offset) {
851 SDValue getObjectPtrOffset(const SDLoc &SL, SDValue Op, SDValue Offset) {
851 SDValue getObjectPtrOffset(const SDLoc &SL, SDValue Op, SDValue Offset) {
851 SDValue getObjectPtrOffset(const SDLoc &SL, SDValue Op, SDValue Offset) {
864 SDValue getCALLSEQ_START(SDValue Chain, uint64_t InSize, uint64_t OutSize,
864 SDValue getCALLSEQ_START(SDValue Chain, uint64_t InSize, uint64_t OutSize,
867 SDValue Ops[] = { Chain,
876 SDValue getCALLSEQ_END(SDValue Chain, SDValue Op1, SDValue Op2,
876 SDValue getCALLSEQ_END(SDValue Chain, SDValue Op1, SDValue Op2,
876 SDValue getCALLSEQ_END(SDValue Chain, SDValue Op1, SDValue Op2,
876 SDValue getCALLSEQ_END(SDValue Chain, SDValue Op1, SDValue Op2,
877 SDValue InGlue, const SDLoc &DL) {
879 SmallVector<SDValue, 4> Ops;
889 bool isUndef(unsigned Opcode, ArrayRef<SDValue> Ops);
892 SDValue getUNDEF(EVT VT) {
897 SDValue getGLOBAL_OFFSET_TABLE(EVT VT) {
903 SDValue getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
905 SDValue getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
906 ArrayRef<SDValue> Ops, const SDNodeFlags Flags = SDNodeFlags());
907 SDValue getNode(unsigned Opcode, const SDLoc &DL, ArrayRef<EVT> ResultTys,
908 ArrayRef<SDValue> Ops);
909 SDValue getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
910 ArrayRef<SDValue> Ops);
913 SDValue getNode(unsigned Opcode, const SDLoc &DL, EVT VT);
914 SDValue getNode(unsigned Opcode, const SDLoc &DL, EVT VT, SDValue Operand,
914 SDValue getNode(unsigned Opcode, const SDLoc &DL, EVT VT, SDValue Operand,
916 SDValue getNode(unsigned Opcode, const SDLoc &DL, EVT VT, SDValue N1,
916 SDValue getNode(unsigned Opcode, const SDLoc &DL, EVT VT, SDValue N1,
917 SDValue N2, const SDNodeFlags Flags = SDNodeFlags());
918 SDValue getNode(unsigned Opcode, const SDLoc &DL, EVT VT, SDValue N1,
918 SDValue getNode(unsigned Opcode, const SDLoc &DL, EVT VT, SDValue N1,
919 SDValue N2, SDValue N3,
919 SDValue N2, SDValue N3,
921 SDValue getNode(unsigned Opcode, const SDLoc &DL, EVT VT, SDValue N1,
921 SDValue getNode(unsigned Opcode, const SDLoc &DL, EVT VT, SDValue N1,
922 SDValue N2, SDValue N3, SDValue N4);
922 SDValue N2, SDValue N3, SDValue N4);
922 SDValue N2, SDValue N3, SDValue N4);
923 SDValue getNode(unsigned Opcode, const SDLoc &DL, EVT VT, SDValue N1,
923 SDValue getNode(unsigned Opcode, const SDLoc &DL, EVT VT, SDValue N1,
924 SDValue N2, SDValue N3, SDValue N4, SDValue N5);
924 SDValue N2, SDValue N3, SDValue N4, SDValue N5);
924 SDValue N2, SDValue N3, SDValue N4, SDValue N5);
924 SDValue N2, SDValue N3, SDValue N4, SDValue N5);
928 SDValue getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList);
929 SDValue getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList, SDValue N);
929 SDValue getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList, SDValue N);
930 SDValue getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList, SDValue N1,
930 SDValue getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList, SDValue N1,
931 SDValue N2);
932 SDValue getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList, SDValue N1,
932 SDValue getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList, SDValue N1,
933 SDValue N2, SDValue N3);
933 SDValue N2, SDValue N3);
934 SDValue getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList, SDValue N1,
934 SDValue getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList, SDValue N1,
935 SDValue N2, SDValue N3, SDValue N4);
935 SDValue N2, SDValue N3, SDValue N4);
935 SDValue N2, SDValue N3, SDValue N4);
936 SDValue getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList, SDValue N1,
936 SDValue getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList, SDValue N1,
937 SDValue N2, SDValue N3, SDValue N4, SDValue N5);
937 SDValue N2, SDValue N3, SDValue N4, SDValue N5);
937 SDValue N2, SDValue N3, SDValue N4, SDValue N5);
937 SDValue N2, SDValue N3, SDValue N4, SDValue N5);
942 SDValue getStackArgumentTokenFactor(SDValue Chain);
942 SDValue getStackArgumentTokenFactor(SDValue Chain);
944 SDValue getMemcpy(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src,
944 SDValue getMemcpy(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src,
944 SDValue getMemcpy(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src,
944 SDValue getMemcpy(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src,
945 SDValue Size, unsigned Align, bool isVol, bool AlwaysInline,
949 SDValue getMemmove(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src,
949 SDValue getMemmove(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src,
949 SDValue getMemmove(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src,
949 SDValue getMemmove(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src,
950 SDValue Size, unsigned Align, bool isVol, bool isTailCall,
954 SDValue getMemset(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src,
954 SDValue getMemset(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src,
954 SDValue getMemset(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src,
954 SDValue getMemset(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src,
955 SDValue Size, unsigned Align, bool isVol, bool isTailCall,
958 SDValue getAtomicMemcpy(SDValue Chain, const SDLoc &dl, SDValue Dst,
958 SDValue getAtomicMemcpy(SDValue Chain, const SDLoc &dl, SDValue Dst,
958 SDValue getAtomicMemcpy(SDValue Chain, const SDLoc &dl, SDValue Dst,
959 unsigned DstAlign, SDValue Src, unsigned SrcAlign,
960 SDValue Size, Type *SizeTy, unsigned ElemSz,
964 SDValue getAtomicMemmove(SDValue Chain, const SDLoc &dl, SDValue Dst,
964 SDValue getAtomicMemmove(SDValue Chain, const SDLoc &dl, SDValue Dst,
964 SDValue getAtomicMemmove(SDValue Chain, const SDLoc &dl, SDValue Dst,
965 unsigned DstAlign, SDValue Src, unsigned SrcAlign,
966 SDValue Size, Type *SizeTy, unsigned ElemSz,
970 SDValue getAtomicMemset(SDValue Chain, const SDLoc &dl, SDValue Dst,
970 SDValue getAtomicMemset(SDValue Chain, const SDLoc &dl, SDValue Dst,
970 SDValue getAtomicMemset(SDValue Chain, const SDLoc &dl, SDValue Dst,
971 unsigned DstAlign, SDValue Value, SDValue Size,
971 unsigned DstAlign, SDValue Value, SDValue Size,
977 SDValue getSetCC(const SDLoc &DL, EVT VT, SDValue LHS, SDValue RHS,
977 SDValue getSetCC(const SDLoc &DL, EVT VT, SDValue LHS, SDValue RHS,
977 SDValue getSetCC(const SDLoc &DL, EVT VT, SDValue LHS, SDValue RHS,
990 SDValue getSelect(const SDLoc &DL, EVT VT, SDValue Cond, SDValue LHS,
990 SDValue getSelect(const SDLoc &DL, EVT VT, SDValue Cond, SDValue LHS,
990 SDValue getSelect(const SDLoc &DL, EVT VT, SDValue Cond, SDValue LHS,
991 SDValue RHS) {
1002 SDValue getSelectCC(const SDLoc &DL, SDValue LHS, SDValue RHS, SDValue True,
1002 SDValue getSelectCC(const SDLoc &DL, SDValue LHS, SDValue RHS, SDValue True,
1002 SDValue getSelectCC(const SDLoc &DL, SDValue LHS, SDValue RHS, SDValue True,
1002 SDValue getSelectCC(const SDLoc &DL, SDValue LHS, SDValue RHS, SDValue True,
1003 SDValue False, ISD::CondCode Cond) {
1009 SDValue simplifySelect(SDValue Cond, SDValue TVal, SDValue FVal);
1009 SDValue simplifySelect(SDValue Cond, SDValue TVal, SDValue FVal);
1009 SDValue simplifySelect(SDValue Cond, SDValue TVal, SDValue FVal);
1009 SDValue simplifySelect(SDValue Cond, SDValue TVal, SDValue FVal);
1012 SDValue simplifyShift(SDValue X, SDValue Y);
1012 SDValue simplifyShift(SDValue X, SDValue Y);
1012 SDValue simplifyShift(SDValue X, SDValue Y);
1016 SDValue simplifyFPBinop(unsigned Opcode, SDValue X, SDValue Y);
1016 SDValue simplifyFPBinop(unsigned Opcode, SDValue X, SDValue Y);
1016 SDValue simplifyFPBinop(unsigned Opcode, SDValue X, SDValue Y);
1020 SDValue getVAArg(EVT VT, const SDLoc &dl, SDValue Chain, SDValue Ptr,
1020 SDValue getVAArg(EVT VT, const SDLoc &dl, SDValue Chain, SDValue Ptr,
1020 SDValue getVAArg(EVT VT, const SDLoc &dl, SDValue Chain, SDValue Ptr,
1021 SDValue SV, unsigned Align);
1027 SDValue getAtomicCmpSwap(unsigned Opcode, const SDLoc &dl, EVT MemVT,
1028 SDVTList VTs, SDValue Chain, SDValue Ptr,
1028 SDVTList VTs, SDValue Chain, SDValue Ptr,
1029 SDValue Cmp, SDValue Swp, MachineMemOperand *MMO);
1029 SDValue Cmp, SDValue Swp, MachineMemOperand *MMO);
1033 SDValue getAtomic(unsigned Opcode, const SDLoc &dl, EVT MemVT, SDValue Chain,
1033 SDValue getAtomic(unsigned Opcode, const SDLoc &dl, EVT MemVT, SDValue Chain,
1034 SDValue Ptr, SDValue Val, MachineMemOperand *MMO);
1034 SDValue Ptr, SDValue Val, MachineMemOperand *MMO);
1038 SDValue getAtomic(unsigned Opcode, const SDLoc &dl, EVT MemVT, EVT VT,
1039 SDValue Chain, SDValue Ptr, MachineMemOperand *MMO);
1039 SDValue Chain, SDValue Ptr, MachineMemOperand *MMO);
1043 SDValue getAtomic(unsigned Opcode, const SDLoc &dl, EVT MemVT,
1044 SDVTList VTList, ArrayRef<SDValue> Ops,
1051 SDValue getMemIntrinsicNode(
1053 ArrayRef<SDValue> Ops, EVT MemVT,
1061 SDValue getMemIntrinsicNode(unsigned Opcode, const SDLoc &dl, SDVTList VTList,
1062 ArrayRef<SDValue> Ops, EVT MemVT,
1068 SDValue getLifetimeNode(bool IsStart, const SDLoc &dl, SDValue Chain,
1068 SDValue getLifetimeNode(bool IsStart, const SDLoc &dl, SDValue Chain,
1072 SDValue getMergeValues(ArrayRef<SDValue> Ops, const SDLoc &dl);
1072 SDValue getMergeValues(ArrayRef<SDValue> Ops, const SDLoc &dl);
1079 SDValue getLoad(EVT VT, const SDLoc &dl, SDValue Chain, SDValue Ptr,
1079 SDValue getLoad(EVT VT, const SDLoc &dl, SDValue Chain, SDValue Ptr,
1079 SDValue getLoad(EVT VT, const SDLoc &dl, SDValue Chain, SDValue Ptr,
1084 SDValue getLoad(EVT VT, const SDLoc &dl, SDValue Chain, SDValue Ptr,
1084 SDValue getLoad(EVT VT, const SDLoc &dl, SDValue Chain, SDValue Ptr,
1084 SDValue getLoad(EVT VT, const SDLoc &dl, SDValue Chain, SDValue Ptr,
1086 SDValue
1087 getExtLoad(ISD::LoadExtType ExtType, const SDLoc &dl, EVT VT, SDValue Chain,
1088 SDValue Ptr, MachinePointerInfo PtrInfo, EVT MemVT,
1092 SDValue getExtLoad(ISD::LoadExtType ExtType, const SDLoc &dl, EVT VT,
1093 SDValue Chain, SDValue Ptr, EVT MemVT,
1093 SDValue Chain, SDValue Ptr, EVT MemVT,
1095 SDValue getIndexedLoad(SDValue OrigLoad, const SDLoc &dl, SDValue Base,
1095 SDValue getIndexedLoad(SDValue OrigLoad, const SDLoc &dl, SDValue Base,
1095 SDValue getIndexedLoad(SDValue OrigLoad, const SDLoc &dl, SDValue Base,
1096 SDValue Offset, ISD::MemIndexedMode AM);
1097 SDValue getLoad(ISD::MemIndexedMode AM, ISD::LoadExtType ExtType, EVT VT,
1098 const SDLoc &dl, SDValue Chain, SDValue Ptr, SDValue Offset,
1098 const SDLoc &dl, SDValue Chain, SDValue Ptr, SDValue Offset,
1098 const SDLoc &dl, SDValue Chain, SDValue Ptr, SDValue Offset,
1103 SDValue getLoad(ISD::MemIndexedMode AM, ISD::LoadExtType ExtType, EVT VT,
1104 const SDLoc &dl, SDValue Chain, SDValue Ptr, SDValue Offset,
1104 const SDLoc &dl, SDValue Chain, SDValue Ptr, SDValue Offset,
1104 const SDLoc &dl, SDValue Chain, SDValue Ptr, SDValue Offset,
1111 SDValue
1112 getStore(SDValue Chain, const SDLoc &dl, SDValue Val, SDValue Ptr,
1112 getStore(SDValue Chain, const SDLoc &dl, SDValue Val, SDValue Ptr,
1112 getStore(SDValue Chain, const SDLoc &dl, SDValue Val, SDValue Ptr,
1116 SDValue getStore(SDValue Chain, const SDLoc &dl, SDValue Val, SDValue Ptr,
1116 SDValue getStore(SDValue Chain, const SDLoc &dl, SDValue Val, SDValue Ptr,
1116 SDValue getStore(SDValue Chain, const SDLoc &dl, SDValue Val, SDValue Ptr,
1116 SDValue getStore(SDValue Chain, const SDLoc &dl, SDValue Val, SDValue Ptr,
1118 SDValue
1119 getTruncStore(SDValue Chain, const SDLoc &dl, SDValue Val, SDValue Ptr,
1119 getTruncStore(SDValue Chain, const SDLoc &dl, SDValue Val, SDValue Ptr,
1119 getTruncStore(SDValue Chain, const SDLoc &dl, SDValue Val, SDValue Ptr,
1123 SDValue getTruncStore(SDValue Chain, const SDLoc &dl, SDValue Val,
1123 SDValue getTruncStore(SDValue Chain, const SDLoc &dl, SDValue Val,
1123 SDValue getTruncStore(SDValue Chain, const SDLoc &dl, SDValue Val,
1124 SDValue Ptr, EVT SVT, MachineMemOperand *MMO);
1125 SDValue getIndexedStore(SDValue OrigStore, const SDLoc &dl, SDValue Base,
1125 SDValue getIndexedStore(SDValue OrigStore, const SDLoc &dl, SDValue Base,
1125 SDValue getIndexedStore(SDValue OrigStore, const SDLoc &dl, SDValue Base,
1126 SDValue Offset, ISD::MemIndexedMode AM);
1129 SDValue getMemBasePlusOffset(SDValue Base, unsigned Offset, const SDLoc &DL);
1129 SDValue getMemBasePlusOffset(SDValue Base, unsigned Offset, const SDLoc &DL);
1131 SDValue getMaskedLoad(EVT VT, const SDLoc &dl, SDValue Chain, SDValue Ptr,
1131 SDValue getMaskedLoad(EVT VT, const SDLoc &dl, SDValue Chain, SDValue Ptr,
1131 SDValue getMaskedLoad(EVT VT, const SDLoc &dl, SDValue Chain, SDValue Ptr,
1132 SDValue Mask, SDValue Src0, EVT MemVT,
1132 SDValue Mask, SDValue Src0, EVT MemVT,
1135 SDValue getMaskedStore(SDValue Chain, const SDLoc &dl, SDValue Val,
1135 SDValue getMaskedStore(SDValue Chain, const SDLoc &dl, SDValue Val,
1135 SDValue getMaskedStore(SDValue Chain, const SDLoc &dl, SDValue Val,
1136 SDValue Ptr, SDValue Mask, EVT MemVT,
1136 SDValue Ptr, SDValue Mask, EVT MemVT,
1139 SDValue getMaskedGather(SDVTList VTs, EVT VT, const SDLoc &dl,
1140 ArrayRef<SDValue> Ops, MachineMemOperand *MMO,
1142 SDValue getMaskedScatter(SDVTList VTs, EVT VT, const SDLoc &dl,
1143 ArrayRef<SDValue> Ops, MachineMemOperand *MMO,
1149 SDValue getTargetMemSDNode(SDVTList VTs, ArrayRef<SDValue> Ops,
1149 SDValue getTargetMemSDNode(SDVTList VTs, ArrayRef<SDValue> Ops,
1154 SDValue getSrcValue(const Value *v);
1157 SDValue getMDNode(const MDNode *MD);
1161 SDValue getBitcast(EVT VT, SDValue V);
1161 SDValue getBitcast(EVT VT, SDValue V);
1164 SDValue getAddrSpaceCast(const SDLoc &dl, EVT VT, SDValue Ptr, unsigned SrcAS,
1164 SDValue getAddrSpaceCast(const SDLoc &dl, EVT VT, SDValue Ptr, unsigned SrcAS,
1169 SDValue getShiftAmountOperand(EVT LHSTy, SDValue Op);
1169 SDValue getShiftAmountOperand(EVT LHSTy, SDValue Op);
1172 SDValue expandVAArg(SDNode *Node);
1175 SDValue expandVACopy(SDNode *Node);
1181 SDValue getSymbolFunctionGlobalAddress(SDValue Op,
1181 SDValue getSymbolFunctionGlobalAddress(SDValue Op,
1190 SDNode *UpdateNodeOperands(SDNode *N, SDValue Op);
1191 SDNode *UpdateNodeOperands(SDNode *N, SDValue Op1, SDValue Op2);
1191 SDNode *UpdateNodeOperands(SDNode *N, SDValue Op1, SDValue Op2);
1192 SDNode *UpdateNodeOperands(SDNode *N, SDValue Op1, SDValue Op2,
1192 SDNode *UpdateNodeOperands(SDNode *N, SDValue Op1, SDValue Op2,
1193 SDValue Op3);
1194 SDNode *UpdateNodeOperands(SDNode *N, SDValue Op1, SDValue Op2,
1194 SDNode *UpdateNodeOperands(SDNode *N, SDValue Op1, SDValue Op2,
1195 SDValue Op3, SDValue Op4);
1195 SDValue Op3, SDValue Op4);
1196 SDNode *UpdateNodeOperands(SDNode *N, SDValue Op1, SDValue Op2,
1196 SDNode *UpdateNodeOperands(SDNode *N, SDValue Op1, SDValue Op2,
1197 SDValue Op3, SDValue Op4, SDValue Op5);
1197 SDValue Op3, SDValue Op4, SDValue Op5);
1197 SDValue Op3, SDValue Op4, SDValue Op5);
1198 SDNode *UpdateNodeOperands(SDNode *N, ArrayRef<SDValue> Ops);
1203 SDValue getTokenFactor(const SDLoc &DL, SmallVectorImpl<SDValue> &Vals);
1203 SDValue getTokenFactor(const SDLoc &DL, SmallVectorImpl<SDValue> &Vals);
1218 SDNode *SelectNodeTo(SDNode *N, unsigned MachineOpc, EVT VT, SDValue Op1);
1220 SDValue Op1, SDValue Op2);
1220 SDValue Op1, SDValue Op2);
1222 SDValue Op1, SDValue Op2, SDValue Op3);
1222 SDValue Op1, SDValue Op2, SDValue Op3);
1222 SDValue Op1, SDValue Op2, SDValue Op3);
1224 ArrayRef<SDValue> Ops);
1227 EVT VT2, ArrayRef<SDValue> Ops);
1229 EVT VT2, EVT VT3, ArrayRef<SDValue> Ops);
1231 EVT VT2, SDValue Op1);
1233 EVT VT2, SDValue Op1, SDValue Op2);
1233 EVT VT2, SDValue Op1, SDValue Op2);
1235 ArrayRef<SDValue> Ops);
1240 ArrayRef<SDValue> Ops);
1255 SDValue Op1);
1257 SDValue Op1, SDValue Op2);
1257 SDValue Op1, SDValue Op2);
1259 SDValue Op1, SDValue Op2, SDValue Op3);
1259 SDValue Op1, SDValue Op2, SDValue Op3);
1259 SDValue Op1, SDValue Op2, SDValue Op3);
1261 ArrayRef<SDValue> Ops);
1263 EVT VT2, SDValue Op1, SDValue Op2);
1263 EVT VT2, SDValue Op1, SDValue Op2);
1265 EVT VT2, SDValue Op1, SDValue Op2, SDValue Op3);
1265 EVT VT2, SDValue Op1, SDValue Op2, SDValue Op3);
1265 EVT VT2, SDValue Op1, SDValue Op2, SDValue Op3);
1267 EVT VT2, ArrayRef<SDValue> Ops);
1269 EVT VT2, EVT VT3, SDValue Op1, SDValue Op2);
1269 EVT VT2, EVT VT3, SDValue Op1, SDValue Op2);
1271 EVT VT2, EVT VT3, SDValue Op1, SDValue Op2,
1271 EVT VT2, EVT VT3, SDValue Op1, SDValue Op2,
1272 SDValue Op3);
1274 EVT VT2, EVT VT3, ArrayRef<SDValue> Ops);
1276 ArrayRef<EVT> ResultTys, ArrayRef<SDValue> Ops);
1278 ArrayRef<SDValue> Ops);
1281 SDValue getTargetExtractSubreg(int SRIdx, const SDLoc &DL, EVT VT,
1282 SDValue Operand);
1285 SDValue getTargetInsertSubreg(int SRIdx, const SDLoc &DL, EVT VT,
1286 SDValue Operand, SDValue Subreg);
1286 SDValue Operand, SDValue Subreg);
1289 SDNode *getNodeIfExists(unsigned Opcode, SDVTList VTList, ArrayRef<SDValue> Ops,
1318 void transferDbgValues(SDValue From, SDValue To, unsigned OffsetInBits = 0,
1318 void transferDbgValues(SDValue From, SDValue To, unsigned OffsetInBits = 0,
1345 void ReplaceAllUsesWith(SDValue From, SDValue To);
1345 void ReplaceAllUsesWith(SDValue From, SDValue To);
1347 void ReplaceAllUsesWith(SDNode *From, const SDValue *To);
1351 void ReplaceAllUsesOfValueWith(SDValue From, SDValue To);
1351 void ReplaceAllUsesOfValueWith(SDValue From, SDValue To);
1356 void ReplaceAllUsesOfValuesWith(const SDValue *From, const SDValue *To,
1356 void ReplaceAllUsesOfValuesWith(const SDValue *From, const SDValue *To,
1364 SDValue makeEquivalentMemoryOrdering(LoadSDNode *Old, SDValue New);
1364 SDValue makeEquivalentMemoryOrdering(LoadSDNode *Old, SDValue New);
1434 SDValue CreateStackTemporary(EVT VT, unsigned minAlign = 1);
1438 SDValue CreateStackTemporary(EVT VT1, EVT VT2);
1440 SDValue FoldSymbolOffset(unsigned Opcode, EVT VT,
1444 SDValue FoldConstantArithmetic(unsigned Opcode, const SDLoc &DL, EVT VT,
1447 SDValue FoldConstantArithmetic(unsigned Opcode, const SDLoc &DL, EVT VT,
1451 SDValue FoldConstantVectorArithmetic(unsigned Opcode, const SDLoc &DL, EVT VT,
1452 ArrayRef<SDValue> Ops,
1457 SDValue foldConstantFPMath(unsigned Opcode, const SDLoc &DL, EVT VT,
1458 SDValue N1, SDValue N2);
1458 SDValue N1, SDValue N2);
1461 SDValue FoldSetCC(EVT VT, SDValue N1, SDValue N2, ISD::CondCode Cond,
1461 SDValue FoldSetCC(EVT VT, SDValue N1, SDValue N2, ISD::CondCode Cond,
1461 SDValue FoldSetCC(EVT VT, SDValue N1, SDValue N2, ISD::CondCode Cond,
1470 SDValue GetDemandedBits(SDValue V, const APInt &DemandedBits);
1470 SDValue GetDemandedBits(SDValue V, const APInt &DemandedBits);
1479 SDValue GetDemandedBits(SDValue V, const APInt &DemandedBits,
1479 SDValue GetDemandedBits(SDValue V, const APInt &DemandedBits,
1484 bool SignBitIsZero(SDValue Op, unsigned Depth = 0) const;
1489 bool MaskedValueIsZero(SDValue Op, const APInt &Mask,
1495 bool MaskedValueIsZero(SDValue Op, const APInt &Mask,
1500 bool MaskedValueIsAllOnes(SDValue Op, const APInt &Mask,
1508 KnownBits computeKnownBits(SDValue Op, unsigned Depth = 0) const;
1515 KnownBits computeKnownBits(SDValue Op, const APInt &DemandedElts,
1529 OverflowKind computeOverflowKind(SDValue N0, SDValue N1) const;
1529 OverflowKind computeOverflowKind(SDValue N0, SDValue N1) const;
1534 bool isKnownToBeAPowerOfTwo(SDValue Val) const;
1543 unsigned ComputeNumSignBits(SDValue Op, unsigned Depth = 0) const;
1553 unsigned ComputeNumSignBits(SDValue Op, const APInt &DemandedElts,
1561 bool isBaseWithConstantOffset(SDValue Op) const;
1566 bool isKnownNeverNaN(SDValue Op, bool SNaN = false, unsigned Depth = 0) const;
1569 bool isKnownNeverSNaN(SDValue Op, unsigned Depth = 0) const {
1575 bool isKnownNeverZeroFloat(SDValue Op) const;
1578 bool isKnownNeverZero(SDValue Op) const;
1583 bool isEqualTo(SDValue A, SDValue B) const;
1583 bool isEqualTo(SDValue A, SDValue B) const;
1587 bool haveNoCommonBitsSet(SDValue A, SDValue B) const;
1587 bool haveNoCommonBitsSet(SDValue A, SDValue B) const;
1596 bool isSplatValue(SDValue V, const APInt &DemandedElts, APInt &UndefElts);
1599 bool isSplatValue(SDValue V, bool AllowUndefs = false);
1602 SDValue getSplatSourceVector(SDValue V, int &SplatIndex);
1602 SDValue getSplatSourceVector(SDValue V, int &SplatIndex);
1606 SDValue getSplatValue(SDValue V);
1606 SDValue getSplatValue(SDValue V);
1616 SDValue matchBinOpReduction(SDNode *Extract, ISD::NodeType &BinOp,
1626 SDValue UnrollVectorOp(SDNode *N, unsigned ResNE = 0);
1630 std::pair<SDValue, SDValue> UnrollVectorOverflowOp(SDNode *N,
1630 std::pair<SDValue, SDValue> UnrollVectorOverflowOp(SDNode *N,
1642 unsigned InferPtrAlignment(SDValue Ptr) const;
1650 std::pair<SDValue, SDValue> SplitVector(const SDValue &N, const SDLoc &DL,
1650 std::pair<SDValue, SDValue> SplitVector(const SDValue &N, const SDLoc &DL,
1650 std::pair<SDValue, SDValue> SplitVector(const SDValue &N, const SDLoc &DL,
1654 std::pair<SDValue, SDValue> SplitVector(const SDValue &N, const SDLoc &DL) {
1654 std::pair<SDValue, SDValue> SplitVector(const SDValue &N, const SDLoc &DL) {
1654 std::pair<SDValue, SDValue> SplitVector(const SDValue &N, const SDLoc &DL) {
1662 std::pair<SDValue, SDValue> SplitVectorOperand(const SDNode *N, unsigned OpNo)
1662 std::pair<SDValue, SDValue> SplitVectorOperand(const SDNode *N, unsigned OpNo)
1668 SDValue WidenVector(const SDValue &N, const SDLoc &DL);
1668 SDValue WidenVector(const SDValue &N, const SDLoc &DL);
1672 void ExtractVectorElements(SDValue Op, SmallVectorImpl<SDValue> &Args,
1672 void ExtractVectorElements(SDValue Op, SmallVectorImpl<SDValue> &Args,
1679 SDNode *isConstantIntBuildVectorOrConstantInt(SDValue N);
1682 SDNode *isConstantFPBuildVectorOrConstantFP(SDValue N);
1686 inline bool isConstantValueOfAnyType(SDValue N) {
1718 SDNode *FindModifiedNodeSlot(SDNode *N, SDValue Op, void *&InsertPos);
1719 SDNode *FindModifiedNodeSlot(SDNode *N, SDValue Op1, SDValue Op2,
1719 SDNode *FindModifiedNodeSlot(SDNode *N, SDValue Op1, SDValue Op2,
1721 SDNode *FindModifiedNodeSlot(SDNode *N, ArrayRef<SDValue> Ops,
1769 SDValue SelectionDAG::getTargetMemSDNode(SDVTList VTs,
1770 ArrayRef<SDValue> Ops,
1800 return SDValue(N, 0);
include/llvm/CodeGen/SelectionDAGAddressAnalysis.h 34 SDValue Base;
35 SDValue Index;
41 BaseIndexOffset(SDValue Base, SDValue Index, bool IsIndexSignExt)
41 BaseIndexOffset(SDValue Base, SDValue Index, bool IsIndexSignExt)
43 BaseIndexOffset(SDValue Base, SDValue Index, int64_t Offset,
43 BaseIndexOffset(SDValue Base, SDValue Index, int64_t Offset,
48 SDValue getBase() { return Base; }
49 SDValue getBase() const { return Base; }
50 SDValue getIndex() { return Index; }
51 SDValue getIndex() const { return Index; }
include/llvm/CodeGen/SelectionDAGISel.h 97 virtual bool SelectInlineAsmMemoryOperand(const SDValue &Op,
99 std::vector<SDValue> &OutOps) {
105 virtual bool IsProfitableToFold(SDValue N, SDNode *U, SDNode *Root) const;
111 static bool IsLegalToFold(SDValue N, SDNode *U, SDNode *Root,
211 void ReplaceUses(SDValue F, SDValue T) {
211 void ReplaceUses(SDValue F, SDValue T) {
218 void ReplaceUses(const SDValue *F, const SDValue *T, unsigned Num) {
218 void ReplaceUses(const SDValue *F, const SDValue *T, unsigned Num) {
240 void SelectInlineAsmMemoryOperands(std::vector<SDValue> &Ops,
254 bool CheckAndMask(SDValue LHS, ConstantSDNode *RHS,
256 bool CheckOrMask(SDValue LHS, ConstantSDNode *RHS,
283 const SmallVectorImpl<SDValue> &Operands) const {
287 virtual bool CheckComplexPattern(SDNode *Root, SDNode *Parent, SDValue N,
289 SmallVectorImpl<std::pair<SDValue, SDNode*> > &Result) {
293 virtual SDValue RunSDNodeXForm(SDValue V, unsigned XFormNo) {
293 virtual SDValue RunSDNodeXForm(SDValue V, unsigned XFormNo) {
320 ArrayRef<SDValue> Ops, unsigned EmitNodeInfo);
358 void UpdateChains(SDNode *NodeToMatch, SDValue InputChain,
include/llvm/CodeGen/SelectionDAGNodes.h 144 bool operator==(const SDValue &O) const {
147 bool operator!=(const SDValue &O) const {
150 bool operator<(const SDValue &O) const {
157 SDValue getValue(unsigned R) const {
184 inline const SDValue &getOperand(unsigned i) const;
203 bool reachesChainWithoutSideEffects(SDValue Dest,
214 static inline SDValue getEmptyKey() {
215 SDValue V;
220 static inline SDValue getTombstoneKey() {
221 SDValue V;
226 static unsigned getHashValue(const SDValue &Val) {
231 static bool isEqual(const SDValue &LHS, const SDValue &RHS) {
231 static bool isEqual(const SDValue &LHS, const SDValue &RHS) {
241 static SimpleType getSimplifiedValue(SDValue &Val) {
248 static SimpleType getSimplifiedValue(const SDValue &Val) {
260 SDValue Val;
274 operator const SDValue&() const { return Val; }
278 const SDValue &get() const { return Val; }
294 bool operator==(const SDValue &V) const {
299 bool operator!=(const SDValue &V) const {
304 bool operator<(const SDValue &V) const {
318 inline void set(const SDValue &V);
321 inline void setInitial(const SDValue &V);
913 for (const SDValue &OpV : M->op_values()) {
951 const SDValue &getOperand(unsigned Num) const {
965 std::random_access_iterator_tag, SDValue,
971 const SDValue &operator*() const { return I->get(); }
1135 SDLoc(const SDValue V) : SDLoc(V.getNode()) {}
1170 inline const SDValue &SDValue::getOperand(unsigned i) const {
1232 inline void SDUse::set(const SDValue &V) {
1238 inline void SDUse::setInitial(const SDValue &V) {
1257 explicit HandleSDNode(SDValue X)
1274 const SDValue &getValue() const { return Op; }
1395 const SDValue &getChain() const { return getOperand(0); }
1396 const SDValue &getBasePtr() const {
1444 const SDValue &getBasePtr() const { return getOperand(1); }
1445 const SDValue &getVal() const { return getOperand(2); }
1662 bool isNullConstant(SDValue V);
1665 bool isNullFPConstant(SDValue V);
1668 bool isAllOnesConstant(SDValue V);
1671 bool isOneConstant(SDValue V);
1675 SDValue peekThroughBitcasts(SDValue V);
1675 SDValue peekThroughBitcasts(SDValue V);
1679 SDValue peekThroughOneUseBitcasts(SDValue V);
1679 SDValue peekThroughOneUseBitcasts(SDValue V);
1683 SDValue peekThroughExtractSubvectors(SDValue V);
1683 SDValue peekThroughExtractSubvectors(SDValue V);
1687 bool isBitwiseNot(SDValue V, bool AllowUndefs = false);
1690 ConstantSDNode *isConstOrConstSplat(SDValue N, bool AllowUndefs = false,
1695 ConstantSDNode *isConstOrConstSplat(SDValue N, const APInt &DemandedElts,
1700 ConstantFPSDNode *isConstOrConstSplatFP(SDValue N, bool AllowUndefs = false);
1704 ConstantFPSDNode *isConstOrConstSplatFP(SDValue N, const APInt &DemandedElts,
1710 bool isNullOrNullSplat(SDValue V, bool AllowUndefs = false);
1715 bool isOneOrOneSplat(SDValue V);
1720 bool isAllOnesOrAllOnesSplat(SDValue V);
1950 SDValue getSplatValue(const APInt &DemandedElts,
1957 SDValue getSplatValue(BitVector *UndefElements = nullptr) const;
2209 const SDValue &getOffset() const {
2251 const SDValue &getBasePtr() const { return getOperand(1); }
2252 const SDValue &getOffset() const { return getOperand(2); }
2281 const SDValue &getValue() const { return getOperand(1); }
2282 const SDValue &getBasePtr() const { return getOperand(2); }
2283 const SDValue &getOffset() const { return getOperand(3); }
2303 const SDValue &getBasePtr() const {
2306 const SDValue &getMask() const {
2333 const SDValue &getBasePtr() const { return getOperand(1); }
2334 const SDValue &getMask() const { return getOperand(2); }
2335 const SDValue &getPassThru() const { return getOperand(3); }
2368 const SDValue &getValue() const { return getOperand(1); }
2369 const SDValue &getBasePtr() const { return getOperand(2); }
2370 const SDValue &getMask() const { return getOperand(3); }
2409 const SDValue &getBasePtr() const { return getOperand(3); }
2410 const SDValue &getIndex() const { return getOperand(4); }
2411 const SDValue &getMask() const { return getOperand(2); }
2412 const SDValue &getScale() const { return getOperand(5); }
2432 const SDValue &getPassThru() const { return getOperand(1); }
2451 const SDValue &getValue() const { return getOperand(1); }
2654 bool matchUnaryPredicate(SDValue Op,
2663 SDValue LHS, SDValue RHS,
2663 SDValue LHS, SDValue RHS,
include/llvm/CodeGen/SelectionDAGTargetInfo.h 51 virtual SDValue EmitTargetCodeForMemcpy(SelectionDAG &DAG, const SDLoc &dl,
52 SDValue Chain, SDValue Op1,
52 SDValue Chain, SDValue Op1,
53 SDValue Op2, SDValue Op3,
53 SDValue Op2, SDValue Op3,
67 virtual SDValue EmitTargetCodeForMemmove(
68 SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Op1,
68 SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Op1,
69 SDValue Op2, SDValue Op3, unsigned Align, bool isVolatile,
69 SDValue Op2, SDValue Op3, unsigned Align, bool isVolatile,
80 virtual SDValue EmitTargetCodeForMemset(SelectionDAG &DAG, const SDLoc &dl,
81 SDValue Chain, SDValue Op1,
81 SDValue Chain, SDValue Op1,
82 SDValue Op2, SDValue Op3,
82 SDValue Op2, SDValue Op3,
92 virtual std::pair<SDValue, SDValue>
92 virtual std::pair<SDValue, SDValue>
93 EmitTargetCodeForMemcmp(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain,
94 SDValue Op1, SDValue Op2, SDValue Op3,
94 SDValue Op1, SDValue Op2, SDValue Op3,
94 SDValue Op1, SDValue Op2, SDValue Op3,
104 virtual std::pair<SDValue, SDValue>
104 virtual std::pair<SDValue, SDValue>
105 EmitTargetCodeForMemchr(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain,
106 SDValue Src, SDValue Char, SDValue Length,
106 SDValue Src, SDValue Char, SDValue Length,
106 SDValue Src, SDValue Char, SDValue Length,
117 virtual std::pair<SDValue, SDValue>
117 virtual std::pair<SDValue, SDValue>
118 EmitTargetCodeForStrcpy(SelectionDAG &DAG, const SDLoc &DL, SDValue Chain,
119 SDValue Dest, SDValue Src,
119 SDValue Dest, SDValue Src,
129 virtual std::pair<SDValue, SDValue>
129 virtual std::pair<SDValue, SDValue>
130 EmitTargetCodeForStrcmp(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain,
131 SDValue Op1, SDValue Op2,
131 SDValue Op1, SDValue Op2,
137 virtual std::pair<SDValue, SDValue>
137 virtual std::pair<SDValue, SDValue>
138 EmitTargetCodeForStrlen(SelectionDAG &DAG, const SDLoc &DL, SDValue Chain,
139 SDValue Src, MachinePointerInfo SrcPtrInfo) const {
143 virtual std::pair<SDValue, SDValue>
143 virtual std::pair<SDValue, SDValue>
144 EmitTargetCodeForStrnlen(SelectionDAG &DAG, const SDLoc &DL, SDValue Chain,
145 SDValue Src, SDValue MaxLength,
145 SDValue Src, SDValue MaxLength,
150 virtual SDValue EmitTargetCodeForSetTag(SelectionDAG &DAG, const SDLoc &dl,
151 SDValue Chain, SDValue Addr,
151 SDValue Chain, SDValue Addr,
152 SDValue Size,
include/llvm/CodeGen/TargetLowering.h 179 SDValue Node = SDValue();
341 virtual bool isFsqrtCheap(SDValue X, SelectionDAG &DAG) const {
531 virtual bool hasAndNotCompare(SDValue Y) const {
538 virtual bool hasAndNot(SDValue X) const {
548 virtual bool hasBitTest(SDValue X, SDValue Y) const { return false; }
548 virtual bool hasBitTest(SDValue X, SDValue Y) const { return false; }
555 virtual bool shouldFoldMaskToVariableShiftPair(SDValue X) const {
590 SDValue X, ConstantSDNode *XC, ConstantSDNode *CC, SDValue Y,
590 SDValue X, ConstantSDNode *XC, ConstantSDNode *CC, SDValue Y,
1920 EVT VT, SDValue C) const {
2492 virtual bool isZExtFree(SDValue Val, EVT VT2) const {
2516 virtual bool isVectorLoadExtDesirable(SDValue ExtVal) const { return false; }
2572 virtual bool shouldScalarizeBinop(SDValue VecOp) const {
2969 virtual bool getPreIndexedAddressParts(SDNode * /*N*/, SDValue &/*Base*/,
2970 SDValue &/*Offset*/,
2980 SDValue &/*Base*/,
2981 SDValue &/*Offset*/,
3007 virtual SDValue getPICJumpTableRelocBase(SDValue Table,
3007 virtual SDValue getPICJumpTableRelocBase(SDValue Table,
3021 SDValue &Chain) const;
3023 void softenSetCCOperands(SelectionDAG &DAG, EVT VT, SDValue &NewLHS,
3024 SDValue &NewRHS, ISD::CondCode &CCCode,
3025 const SDLoc &DL, const SDValue OldLHS,
3026 const SDValue OldRHS) const;
3030 std::pair<SDValue, SDValue> makeLibCall(SelectionDAG &DAG, RTLIB::Libcall LC,
3030 std::pair<SDValue, SDValue> makeLibCall(SelectionDAG &DAG, RTLIB::Libcall LC,
3031 EVT RetVT, ArrayRef<SDValue> Ops,
3041 const SmallVectorImpl<SDValue> &OutVals) const;
3054 SDValue Old;
3055 SDValue New;
3064 bool CombineTo(SDValue O, SDValue N) {
3064 bool CombineTo(SDValue O, SDValue N) {
3089 bool ShrinkDemandedConstant(SDValue Op, const APInt &Demanded,
3095 virtual bool targetShrinkDemandedConstant(SDValue Op, const APInt &Demanded,
3103 bool ShrinkDemandedOp(SDValue Op, unsigned BitWidth, const APInt &Demanded,
3119 bool SimplifyDemandedBits(SDValue Op, const APInt &DemandedBits,
3126 bool SimplifyDemandedBits(SDValue Op, const APInt &DemandedBits,
3133 bool SimplifyDemandedBits(SDValue Op, const APInt &DemandedMask,
3139 SDValue SimplifyMultipleUseDemandedBits(SDValue Op, const APInt &DemandedBits,
3139 SDValue SimplifyMultipleUseDemandedBits(SDValue Op, const APInt &DemandedBits,
3158 bool SimplifyDemandedVectorElts(SDValue Op, const APInt &DemandedEltMask,
3165 bool SimplifyDemandedVectorElts(SDValue Op, const APInt &DemandedElts,
3173 virtual void computeKnownBitsForTargetNode(const SDValue Op,
3191 virtual void computeKnownBitsForFrameIndex(const SDValue FIOp,
3201 virtual unsigned ComputeNumSignBitsForTargetNode(SDValue Op,
3212 SDValue Op, const APInt &DemandedElts, APInt &KnownUndef,
3220 virtual bool SimplifyDemandedBitsForTargetNode(SDValue Op,
3230 virtual SDValue SimplifyMultipleUseDemandedBitsForTargetNode(
3231 SDValue Op, const APInt &DemandedBits, const APInt &DemandedElts,
3238 SDValue buildLegalVectorShuffle(EVT VT, const SDLoc &DL, SDValue N0,
3238 SDValue buildLegalVectorShuffle(EVT VT, const SDLoc &DL, SDValue N0,
3239 SDValue N1, MutableArrayRef<int> Mask,
3249 virtual bool isKnownNeverNaNForTargetNode(SDValue Op,
3273 SDValue CombineTo(SDNode *N, ArrayRef<SDValue> To, bool AddTo = true);
3273 SDValue CombineTo(SDNode *N, ArrayRef<SDValue> To, bool AddTo = true);
3274 SDValue CombineTo(SDNode *N, SDValue Res, bool AddTo = true);
3274 SDValue CombineTo(SDNode *N, SDValue Res, bool AddTo = true);
3275 SDValue CombineTo(SDNode *N, SDValue Res0, SDValue Res1, bool AddTo = true);
3275 SDValue CombineTo(SDNode *N, SDValue Res0, SDValue Res1, bool AddTo = true);
3275 SDValue CombineTo(SDNode *N, SDValue Res0, SDValue Res1, bool AddTo = true);
3295 SDValue SimplifySetCC(EVT VT, SDValue N0, SDValue N1, ISD::CondCode Cond,
3295 SDValue SimplifySetCC(EVT VT, SDValue N0, SDValue N1, ISD::CondCode Cond,
3295 SDValue SimplifySetCC(EVT VT, SDValue N0, SDValue N1, ISD::CondCode Cond,
3300 virtual SDValue unwrapAddress(SDValue N) const { return N; }
3300 virtual SDValue unwrapAddress(SDValue N) const { return N; }
3320 virtual SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const;
3369 virtual bool IsDesirableToPromoteOp(SDValue /*Op*/, EVT &/*PVT*/) const {
3405 virtual char isNegatibleForFree(SDValue Op, SelectionDAG &DAG,
3410 virtual SDValue getNegatedExpression(SDValue Op, SelectionDAG &DAG,
3410 virtual SDValue getNegatedExpression(SDValue Op, SelectionDAG &DAG,
3423 virtual SDValue LowerFormalArguments(
3424 SDValue /*Chain*/, CallingConv::ID /*CallConv*/, bool /*isVarArg*/,
3426 SelectionDAG & /*DAG*/, SmallVectorImpl<SDValue> & /*InVals*/) const {
3435 SDValue Chain;
3455 SDValue Callee;
3461 SmallVector<SDValue, 32> OutVals;
3463 SmallVector<SDValue, 4> InVals;
3475 CallLoweringInfo &setChain(SDValue InChain) {
3482 SDValue Target, ArgListTy &&ArgsList) {
3495 SDValue Target, ArgListTy &&ArgsList) {
3505 SDValue Target, ArgListTy &&ArgsList,
3634 std::pair<SDValue, SDValue> LowerCallTo(CallLoweringInfo &CLI) const;
3634 std::pair<SDValue, SDValue> LowerCallTo(CallLoweringInfo &CLI) const;
3641 virtual SDValue
3643 SmallVectorImpl<SDValue> &/*InVals*/) const {
3665 virtual SDValue LowerReturn(SDValue /*Chain*/, CallingConv::ID /*CallConv*/,
3665 virtual SDValue LowerReturn(SDValue /*Chain*/, CallingConv::ID /*CallConv*/,
3668 const SmallVectorImpl<SDValue> & /*OutVals*/,
3679 virtual bool isUsedByReturnOnly(SDNode *, SDValue &/*Chain*/) const {
3747 virtual SDValue prepareVolatileOrAtomicLoad(SDValue Chain, const SDLoc &DL,
3747 virtual SDValue prepareVolatileOrAtomicLoad(SDValue Chain, const SDLoc &DL,
3792 SmallVectorImpl<SDValue> &Results,
3800 virtual SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const;
3800 virtual SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const;
3812 SmallVectorImpl<SDValue> &/*Results*/,
3827 bool verifyReturnAddressArgumentIsConstant(SDValue Op,
3924 SDValue Op,
3958 virtual void LowerAsmOperandForConstraint(SDValue Op, std::string &Constraint,
3959 std::vector<SDValue> &Ops,
3963 virtual SDValue LowerAsmOutputForConstraint(SDValue &Chain, SDValue &Flag,
3963 virtual SDValue LowerAsmOutputForConstraint(SDValue &Chain, SDValue &Flag,
3963 virtual SDValue LowerAsmOutputForConstraint(SDValue &Chain, SDValue &Flag,
3971 SDValue BuildSDIV(SDNode *N, SelectionDAG &DAG, bool IsAfterLegalization,
3973 SDValue BuildUDIV(SDNode *N, SelectionDAG &DAG, bool IsAfterLegalization,
3980 virtual SDValue BuildSDIVPow2(SDNode *N, const APInt &Divisor,
4010 virtual SDValue getSqrtEstimate(SDValue Operand, SelectionDAG &DAG,
4010 virtual SDValue getSqrtEstimate(SDValue Operand, SelectionDAG &DAG,
4026 virtual SDValue getRecipEstimate(SDValue Operand, SelectionDAG &DAG,
4026 virtual SDValue getRecipEstimate(SDValue Operand, SelectionDAG &DAG,
4045 bool expandMUL_LOHI(unsigned Opcode, EVT VT, SDLoc dl, SDValue LHS,
4046 SDValue RHS, SmallVectorImpl<SDValue> &Result, EVT HiLoVT,
4046 SDValue RHS, SmallVectorImpl<SDValue> &Result, EVT HiLoVT,
4048 SDValue LL = SDValue(), SDValue LH = SDValue(),
4048 SDValue LL = SDValue(), SDValue LH = SDValue(),
4049 SDValue RL = SDValue(), SDValue RH = SDValue()) const;
4049 SDValue RL = SDValue(), SDValue RH = SDValue()) const;
4060 bool expandMUL(SDNode *N, SDValue &Lo, SDValue &Hi, EVT HiLoVT,
4060 bool expandMUL(SDNode *N, SDValue &Lo, SDValue &Hi, EVT HiLoVT,
4062 SDValue LL = SDValue(), SDValue LH = SDValue(),
4062 SDValue LL = SDValue(), SDValue LH = SDValue(),
4063 SDValue RL = SDValue(), SDValue RH = SDValue()) const;
4063 SDValue RL = SDValue(), SDValue RH = SDValue()) const;
4069 bool expandFunnelShift(SDNode *N, SDValue &Result, SelectionDAG &DAG) const;
4075 bool expandROT(SDNode *N, SDValue &Result, SelectionDAG &DAG) const;
4081 bool expandFP_TO_SINT(SDNode *N, SDValue &Result, SelectionDAG &DAG) const;
4087 bool expandFP_TO_UINT(SDNode *N, SDValue &Result, SDValue &Chain, SelectionDAG &DAG) const;
4087 bool expandFP_TO_UINT(SDNode *N, SDValue &Result, SDValue &Chain, SelectionDAG &DAG) const;
4093 bool expandUINT_TO_FP(SDNode *N, SDValue &Result, SelectionDAG &DAG) const;
4096 SDValue expandFMINNUM_FMAXNUM(SDNode *N, SelectionDAG &DAG) const;
4103 bool expandCTPOP(SDNode *N, SDValue &Result, SelectionDAG &DAG) const;
4110 bool expandCTLZ(SDNode *N, SDValue &Result, SelectionDAG &DAG) const;
4117 bool expandCTTZ(SDNode *N, SDValue &Result, SelectionDAG &DAG) const;
4125 bool expandABS(SDNode *N, SDValue &Result, SelectionDAG &DAG) const;
4130 SDValue scalarizeVectorLoad(LoadSDNode *LD, SelectionDAG &DAG) const;
4135 SDValue scalarizeVectorStore(StoreSDNode *ST, SelectionDAG &DAG) const;
4139 std::pair<SDValue, SDValue> expandUnalignedLoad(LoadSDNode *LD,
4139 std::pair<SDValue, SDValue> expandUnalignedLoad(LoadSDNode *LD,
4144 SDValue expandUnalignedStore(StoreSDNode *ST, SelectionDAG &DAG) const;
4153 SDValue IncrementMemoryAddress(SDValue Addr, SDValue Mask, const SDLoc &DL,
4153 SDValue IncrementMemoryAddress(SDValue Addr, SDValue Mask, const SDLoc &DL,
4153 SDValue IncrementMemoryAddress(SDValue Addr, SDValue Mask, const SDLoc &DL,
4161 SDValue getVectorElementPointer(SelectionDAG &DAG, SDValue VecPtr, EVT VecVT,
4161 SDValue getVectorElementPointer(SelectionDAG &DAG, SDValue VecPtr, EVT VecVT,
4162 SDValue Index) const;
4166 SDValue expandAddSubSat(SDNode *Node, SelectionDAG &DAG) const;
4170 SDValue expandFixedPointMul(SDNode *Node, SelectionDAG &DAG) const;
4174 void expandUADDSUBO(SDNode *Node, SDValue &Result, SDValue &Overflow,
4174 void expandUADDSUBO(SDNode *Node, SDValue &Result, SDValue &Overflow,
4179 void expandSADDSUBO(SDNode *Node, SDValue &Result, SDValue &Overflow,
4179 void expandSADDSUBO(SDNode *Node, SDValue &Result, SDValue &Overflow,
4184 bool expandMULO(SDNode *Node, SDValue &Result, SDValue &Overflow,
4184 bool expandMULO(SDNode *Node, SDValue &Result, SDValue &Overflow,
4189 SDValue expandVecReduce(SDNode *Node, SelectionDAG &DAG) const;
4219 virtual SDValue emitStackGuardXorFP(SelectionDAG &DAG, SDValue Val,
4219 virtual SDValue emitStackGuardXorFP(SelectionDAG &DAG, SDValue Val,
4225 virtual SDValue LowerToTLSEmulatedModel(const GlobalAddressSDNode *GA,
4230 virtual SDValue expandIndirectJTBranch(const SDLoc& dl, SDValue Value, SDValue Addr,
4230 virtual SDValue expandIndirectJTBranch(const SDLoc& dl, SDValue Value, SDValue Addr,
4230 virtual SDValue expandIndirectJTBranch(const SDLoc& dl, SDValue Value, SDValue Addr,
4239 SDValue lowerCmpEqZeroToCtlzSrl(SDValue Op, SelectionDAG &DAG) const;
4239 SDValue lowerCmpEqZeroToCtlzSrl(SDValue Op, SelectionDAG &DAG) const;
4242 SDValue foldSetCCWithAnd(EVT VT, SDValue N0, SDValue N1, ISD::CondCode Cond,
4242 SDValue foldSetCCWithAnd(EVT VT, SDValue N0, SDValue N1, ISD::CondCode Cond,
4242 SDValue foldSetCCWithAnd(EVT VT, SDValue N0, SDValue N1, ISD::CondCode Cond,
4244 SDValue foldSetCCWithBinOp(EVT VT, SDValue N0, SDValue N1, ISD::CondCode Cond,
4244 SDValue foldSetCCWithBinOp(EVT VT, SDValue N0, SDValue N1, ISD::CondCode Cond,
4244 SDValue foldSetCCWithBinOp(EVT VT, SDValue N0, SDValue N1, ISD::CondCode Cond,
4247 SDValue optimizeSetCCOfSignedTruncationCheck(EVT SCCVT, SDValue N0,
4247 SDValue optimizeSetCCOfSignedTruncationCheck(EVT SCCVT, SDValue N0,
4248 SDValue N1, ISD::CondCode Cond,
4253 SDValue optimizeSetCCByHoistingAndByConstFromLogicalShift(
4254 EVT SCCVT, SDValue N0, SDValue N1C, ISD::CondCode Cond,
4254 EVT SCCVT, SDValue N0, SDValue N1C, ISD::CondCode Cond,
4257 SDValue prepareUREMEqFold(EVT SETCCVT, SDValue REMNode,
4257 SDValue prepareUREMEqFold(EVT SETCCVT, SDValue REMNode,
4258 SDValue CompTargetNode, ISD::CondCode Cond,
4261 SDValue buildUREMEqFold(EVT SETCCVT, SDValue REMNode, SDValue CompTargetNode,
4261 SDValue buildUREMEqFold(EVT SETCCVT, SDValue REMNode, SDValue CompTargetNode,
4261 SDValue buildUREMEqFold(EVT SETCCVT, SDValue REMNode, SDValue CompTargetNode,
4265 SDValue prepareSREMEqFold(EVT SETCCVT, SDValue REMNode,
4265 SDValue prepareSREMEqFold(EVT SETCCVT, SDValue REMNode,
4266 SDValue CompTargetNode, ISD::CondCode Cond,
4269 SDValue buildSREMEqFold(EVT SETCCVT, SDValue REMNode, SDValue CompTargetNode,
4269 SDValue buildSREMEqFold(EVT SETCCVT, SDValue REMNode, SDValue CompTargetNode,
4269 SDValue buildSREMEqFold(EVT SETCCVT, SDValue REMNode, SDValue CompTargetNode,
include/llvm/Support/AlignOf.h 30 T t;
39 template <typename T> union SizerImpl<T> { char arr[sizeof(T)]; };
50 llvm::detail::SizerImpl<T, Ts...>)];
include/llvm/Support/Casting.h 141 template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
142 return isa_impl_wrap<X, const Y,
143 typename simplify_type<const Y>::SimpleType>::doit(Val);
210 To, From, typename simplify_type<From>::SimpleType>::ret_type;
210 To, From, typename simplify_type<From>::SimpleType>::ret_type;
218 static typename cast_retty<To, From>::ret_type doit(From &Val) {
218 static typename cast_retty<To, From>::ret_type doit(From &Val) {
221 simplify_type<From>::getSimplifiedValue(Val));
236 std::is_same<X, typename simplify_type<X>::SimpleType>::value;
236 std::is_same<X, typename simplify_type<X>::SimpleType>::value;
247 inline typename std::enable_if<!is_simple_type<Y>::value,
248 typename cast_retty<X, const Y>::ret_type>::type
249 cast(const Y &Val) {
252 X, const Y, typename simplify_type<const Y>::SimpleType>::doit(Val);
252 X, const Y, typename simplify_type<const Y>::SimpleType>::doit(Val);
256 inline typename cast_retty<X, Y>::ret_type cast(Y &Val) {
256 inline typename cast_retty<X, Y>::ret_type cast(Y &Val) {
258 return cast_convert_val<X, Y,
259 typename simplify_type<Y>::SimpleType>::doit(Val);
330 typename std::enable_if<!is_simple_type<Y>::value,
331 typename cast_retty<X, const Y>::ret_type>::type
332 dyn_cast(const Y &Val) {
337 LLVM_NODISCARD inline typename cast_retty<X, Y>::ret_type dyn_cast(Y &Val) {
337 LLVM_NODISCARD inline typename cast_retty<X, Y>::ret_type dyn_cast(Y &Val) {
351 typename std::enable_if<!is_simple_type<Y>::value,
352 typename cast_retty<X, const Y>::ret_type>::type
353 dyn_cast_or_null(const Y &Val) {
359 typename std::enable_if<!is_simple_type<Y>::value,
360 typename cast_retty<X, Y>::ret_type>::type
361 dyn_cast_or_null(Y &Val) {
include/llvm/Support/type_traits.h 65 using type = const T &;
91 T t;
122 static auto get(F*) -> decltype(std::declval<F &>() = std::declval<const F &>(), std::true_type{});
122 static auto get(F*) -> decltype(std::declval<F &>() = std::declval<const F &>(), std::true_type{});
122 static auto get(F*) -> decltype(std::declval<F &>() = std::declval<const F &>(), std::true_type{});
130 static auto get(F*) -> decltype(std::declval<F &>() = std::declval<F &&>(), std::true_type{});
130 static auto get(F*) -> decltype(std::declval<F &>() = std::declval<F &&>(), std::true_type{});
130 static auto get(F*) -> decltype(std::declval<F &>() = std::declval<F &&>(), std::true_type{});
145 std::is_copy_constructible<detail::trivial_helper<T>>::value;
147 !std::is_copy_constructible<T>::value;
151 std::is_move_constructible<detail::trivial_helper<T>>::value;
153 !std::is_move_constructible<T>::value;
157 is_copy_assignable<detail::trivial_helper<T>>::value;
159 !is_copy_assignable<T>::value;
163 is_move_assignable<detail::trivial_helper<T>>::value;
165 !is_move_assignable<T>::value;
169 std::is_destructible<detail::trivial_helper<T>>::value;
181 static_assert(value == std::is_trivially_copyable<T>::value,
lib/CodeGen/SelectionDAG/DAGCombiner.cpp 214 SDValue visit(SDNode *N);
271 SDValue CombineTo(SDNode *N, const SDValue *To, unsigned NumTo,
271 SDValue CombineTo(SDNode *N, const SDValue *To, unsigned NumTo,
275 SDValue CombineTo(SDNode *N, SDValue Res, bool AddTo = true) {
275 SDValue CombineTo(SDNode *N, SDValue Res, bool AddTo = true) {
280 SDValue CombineTo(SDNode *N, SDValue Res0, SDValue Res1,
280 SDValue CombineTo(SDNode *N, SDValue Res0, SDValue Res1,
280 SDValue CombineTo(SDNode *N, SDValue Res0, SDValue Res1,
282 SDValue To[] = { Res0, Res1 };
294 bool SimplifyDemandedBits(SDValue Op) {
300 bool SimplifyDemandedBits(SDValue Op, const APInt &DemandedBits) {
310 bool SimplifyDemandedVectorElts(SDValue Op) {
316 bool SimplifyDemandedBits(SDValue Op, const APInt &DemandedBits,
318 bool SimplifyDemandedVectorElts(SDValue Op, const APInt &DemandedElts,
323 SDValue SplitIndexingFromLoad(LoadSDNode *LD);
327 SDValue ForwardStoreValueToDirectLoad(LoadSDNode *LD);
328 bool getTruncatedStoreValue(StoreSDNode *ST, SDValue &Val);
329 bool extendLoadedValueToExtension(LoadSDNode *LD, SDValue &Val);
339 SDValue scalarizeExtractedVectorLoad(SDNode *EVE, EVT InVecVT,
340 SDValue EltNo,
343 SDValue PromoteOperand(SDValue Op, EVT PVT, bool &Replace);
343 SDValue PromoteOperand(SDValue Op, EVT PVT, bool &Replace);
344 SDValue SExtPromoteOperand(SDValue Op, EVT PVT);
344 SDValue SExtPromoteOperand(SDValue Op, EVT PVT);
345 SDValue ZExtPromoteOperand(SDValue Op, EVT PVT);
345 SDValue ZExtPromoteOperand(SDValue Op, EVT PVT);
346 SDValue PromoteIntBinOp(SDValue Op);
346 SDValue PromoteIntBinOp(SDValue Op);
347 SDValue PromoteIntShiftOp(SDValue Op);
347 SDValue PromoteIntShiftOp(SDValue Op);
348 SDValue PromoteExtend(SDValue Op);
348 SDValue PromoteExtend(SDValue Op);
349 bool PromoteLoad(SDValue Op);
354 SDValue combine(SDNode *N);
363 SDValue visitTokenFactor(SDNode *N);
364 SDValue visitMERGE_VALUES(SDNode *N);
365 SDValue visitADD(SDNode *N);
366 SDValue visitADDLike(SDNode *N);
367 SDValue visitADDLikeCommutative(SDValue N0, SDValue N1, SDNode *LocReference);
367 SDValue visitADDLikeCommutative(SDValue N0, SDValue N1, SDNode *LocReference);
367 SDValue visitADDLikeCommutative(SDValue N0, SDValue N1, SDNode *LocReference);
368 SDValue visitSUB(SDNode *N);
369 SDValue visitADDSAT(SDNode *N);
370 SDValue visitSUBSAT(SDNode *N);
371 SDValue visitADDC(SDNode *N);
372 SDValue visitADDO(SDNode *N);
373 SDValue visitUADDOLike(SDValue N0, SDValue N1, SDNode *N);
373 SDValue visitUADDOLike(SDValue N0, SDValue N1, SDNode *N);
373 SDValue visitUADDOLike(SDValue N0, SDValue N1, SDNode *N);
374 SDValue visitSUBC(SDNode *N);
375 SDValue visitSUBO(SDNode *N);
376 SDValue visitADDE(SDNode *N);
377 SDValue visitADDCARRY(SDNode *N);
378 SDValue visitADDCARRYLike(SDValue N0, SDValue N1, SDValue CarryIn, SDNode *N);
378 SDValue visitADDCARRYLike(SDValue N0, SDValue N1, SDValue CarryIn, SDNode *N);
378 SDValue visitADDCARRYLike(SDValue N0, SDValue N1, SDValue CarryIn, SDNode *N);
378 SDValue visitADDCARRYLike(SDValue N0, SDValue N1, SDValue CarryIn, SDNode *N);
379 SDValue visitSUBE(SDNode *N);
380 SDValue visitSUBCARRY(SDNode *N);
381 SDValue visitMUL(SDNode *N);
382 SDValue visitMULFIX(SDNode *N);
383 SDValue useDivRem(SDNode *N);
384 SDValue visitSDIV(SDNode *N);
385 SDValue visitSDIVLike(SDValue N0, SDValue N1, SDNode *N);
385 SDValue visitSDIVLike(SDValue N0, SDValue N1, SDNode *N);
385 SDValue visitSDIVLike(SDValue N0, SDValue N1, SDNode *N);
386 SDValue visitUDIV(SDNode *N);
387 SDValue visitUDIVLike(SDValue N0, SDValue N1, SDNode *N);
387 SDValue visitUDIVLike(SDValue N0, SDValue N1, SDNode *N);
387 SDValue visitUDIVLike(SDValue N0, SDValue N1, SDNode *N);
388 SDValue visitREM(SDNode *N);
389 SDValue visitMULHU(SDNode *N);
390 SDValue visitMULHS(SDNode *N);
391 SDValue visitSMUL_LOHI(SDNode *N);
392 SDValue visitUMUL_LOHI(SDNode *N);
393 SDValue visitMULO(SDNode *N);
394 SDValue visitIMINMAX(SDNode *N);
395 SDValue visitAND(SDNode *N);
396 SDValue visitANDLike(SDValue N0, SDValue N1, SDNode *N);
396 SDValue visitANDLike(SDValue N0, SDValue N1, SDNode *N);
396 SDValue visitANDLike(SDValue N0, SDValue N1, SDNode *N);
397 SDValue visitOR(SDNode *N);
398 SDValue visitORLike(SDValue N0, SDValue N1, SDNode *N);
398 SDValue visitORLike(SDValue N0, SDValue N1, SDNode *N);
398 SDValue visitORLike(SDValue N0, SDValue N1, SDNode *N);
399 SDValue visitXOR(SDNode *N);
400 SDValue SimplifyVBinOp(SDNode *N);
401 SDValue visitSHL(SDNode *N);
402 SDValue visitSRA(SDNode *N);
403 SDValue visitSRL(SDNode *N);
404 SDValue visitFunnelShift(SDNode *N);
405 SDValue visitRotate(SDNode *N);
406 SDValue visitABS(SDNode *N);
407 SDValue visitBSWAP(SDNode *N);
408 SDValue visitBITREVERSE(SDNode *N);
409 SDValue visitCTLZ(SDNode *N);
410 SDValue visitCTLZ_ZERO_UNDEF(SDNode *N);
411 SDValue visitCTTZ(SDNode *N);
412 SDValue visitCTTZ_ZERO_UNDEF(SDNode *N);
413 SDValue visitCTPOP(SDNode *N);
414 SDValue visitSELECT(SDNode *N);
415 SDValue visitVSELECT(SDNode *N);
416 SDValue visitSELECT_CC(SDNode *N);
417 SDValue visitSETCC(SDNode *N);
418 SDValue visitSETCCCARRY(SDNode *N);
419 SDValue visitSIGN_EXTEND(SDNode *N);
420 SDValue visitZERO_EXTEND(SDNode *N);
421 SDValue visitANY_EXTEND(SDNode *N);
422 SDValue visitAssertExt(SDNode *N);
423 SDValue visitSIGN_EXTEND_INREG(SDNode *N);
424 SDValue visitSIGN_EXTEND_VECTOR_INREG(SDNode *N);
425 SDValue visitZERO_EXTEND_VECTOR_INREG(SDNode *N);
426 SDValue visitTRUNCATE(SDNode *N);
427 SDValue visitBITCAST(SDNode *N);
428 SDValue visitBUILD_PAIR(SDNode *N);
429 SDValue visitFADD(SDNode *N);
430 SDValue visitFSUB(SDNode *N);
431 SDValue visitFMUL(SDNode *N);
432 SDValue visitFMA(SDNode *N);
433 SDValue visitFDIV(SDNode *N);
434 SDValue visitFREM(SDNode *N);
435 SDValue visitFSQRT(SDNode *N);
436 SDValue visitFCOPYSIGN(SDNode *N);
437 SDValue visitFPOW(SDNode *N);
438 SDValue visitSINT_TO_FP(SDNode *N);
439 SDValue visitUINT_TO_FP(SDNode *N);
440 SDValue visitFP_TO_SINT(SDNode *N);
441 SDValue visitFP_TO_UINT(SDNode *N);
442 SDValue visitFP_ROUND(SDNode *N);
443 SDValue visitFP_EXTEND(SDNode *N);
444 SDValue visitFNEG(SDNode *N);
445 SDValue visitFABS(SDNode *N);
446 SDValue visitFCEIL(SDNode *N);
447 SDValue visitFTRUNC(SDNode *N);
448 SDValue visitFFLOOR(SDNode *N);
449 SDValue visitFMINNUM(SDNode *N);
450 SDValue visitFMAXNUM(SDNode *N);
451 SDValue visitFMINIMUM(SDNode *N);
452 SDValue visitFMAXIMUM(SDNode *N);
453 SDValue visitBRCOND(SDNode *N);
454 SDValue visitBR_CC(SDNode *N);
455 SDValue visitLOAD(SDNode *N);
457 SDValue replaceStoreChain(StoreSDNode *ST, SDValue BetterChain);
457 SDValue replaceStoreChain(StoreSDNode *ST, SDValue BetterChain);
458 SDValue replaceStoreOfFPConstant(StoreSDNode *ST);
460 SDValue visitSTORE(SDNode *N);
461 SDValue visitLIFETIME_END(SDNode *N);
462 SDValue visitINSERT_VECTOR_ELT(SDNode *N);
463 SDValue visitEXTRACT_VECTOR_ELT(SDNode *N);
464 SDValue visitBUILD_VECTOR(SDNode *N);
465 SDValue visitCONCAT_VECTORS(SDNode *N);
466 SDValue visitEXTRACT_SUBVECTOR(SDNode *N);
467 SDValue visitVECTOR_SHUFFLE(SDNode *N);
468 SDValue visitSCALAR_TO_VECTOR(SDNode *N);
469 SDValue visitINSERT_SUBVECTOR(SDNode *N);
470 SDValue visitMLOAD(SDNode *N);
471 SDValue visitMSTORE(SDNode *N);
472 SDValue visitMGATHER(SDNode *N);
473 SDValue visitMSCATTER(SDNode *N);
474 SDValue visitFP_TO_FP16(SDNode *N);
475 SDValue visitFP16_TO_FP(SDNode *N);
476 SDValue visitVECREDUCE(SDNode *N);
478 SDValue visitFADDForFMACombine(SDNode *N);
479 SDValue visitFSUBForFMACombine(SDNode *N);
480 SDValue visitFMULForFMADistributiveCombine(SDNode *N);
482 SDValue XformToShuffleWithZero(SDNode *N);
484 const SDLoc &DL, SDValue N0,
485 SDValue N1);
486 SDValue reassociateOpsCommutative(unsigned Opc, const SDLoc &DL, SDValue N0,
486 SDValue reassociateOpsCommutative(unsigned Opc, const SDLoc &DL, SDValue N0,
487 SDValue N1);
488 SDValue reassociateOps(unsigned Opc, const SDLoc &DL, SDValue N0,
488 SDValue reassociateOps(unsigned Opc, const SDLoc &DL, SDValue N0,
489 SDValue N1, SDNodeFlags Flags);
491 SDValue visitShiftByConstant(SDNode *N);
493 SDValue foldSelectOfConstants(SDNode *N);
494 SDValue foldVSelectOfConstants(SDNode *N);
495 SDValue foldBinOpIntoSelect(SDNode *BO);
496 bool SimplifySelectOps(SDNode *SELECT, SDValue LHS, SDValue RHS);
496 bool SimplifySelectOps(SDNode *SELECT, SDValue LHS, SDValue RHS);
497 SDValue hoistLogicOpWithSameOpcodeHands(SDNode *N);
498 SDValue SimplifySelect(const SDLoc &DL, SDValue N0, SDValue N1, SDValue N2);
498 SDValue SimplifySelect(const SDLoc &DL, SDValue N0, SDValue N1, SDValue N2);
498 SDValue SimplifySelect(const SDLoc &DL, SDValue N0, SDValue N1, SDValue N2);
498 SDValue SimplifySelect(const SDLoc &DL, SDValue N0, SDValue N1, SDValue N2);
499 SDValue SimplifySelectCC(const SDLoc &DL, SDValue N0, SDValue N1,
499 SDValue SimplifySelectCC(const SDLoc &DL, SDValue N0, SDValue N1,
499 SDValue SimplifySelectCC(const SDLoc &DL, SDValue N0, SDValue N1,
500 SDValue N2, SDValue N3, ISD::CondCode CC,
500 SDValue N2, SDValue N3, ISD::CondCode CC,
502 SDValue convertSelectOfFPConstantsToLoadOffset(
503 const SDLoc &DL, SDValue N0, SDValue N1, SDValue N2, SDValue N3,
503 const SDLoc &DL, SDValue N0, SDValue N1, SDValue N2, SDValue N3,
503 const SDLoc &DL, SDValue N0, SDValue N1, SDValue N2, SDValue N3,
503 const SDLoc &DL, SDValue N0, SDValue N1, SDValue N2, SDValue N3,
505 SDValue foldSelectCCToShiftAnd(const SDLoc &DL, SDValue N0, SDValue N1,
505 SDValue foldSelectCCToShiftAnd(const SDLoc &DL, SDValue N0, SDValue N1,
505 SDValue foldSelectCCToShiftAnd(const SDLoc &DL, SDValue N0, SDValue N1,
506 SDValue N2, SDValue N3, ISD::CondCode CC);
506 SDValue N2, SDValue N3, ISD::CondCode CC);
507 SDValue foldLogicOfSetCCs(bool IsAnd, SDValue N0, SDValue N1,
507 SDValue foldLogicOfSetCCs(bool IsAnd, SDValue N0, SDValue N1,
507 SDValue foldLogicOfSetCCs(bool IsAnd, SDValue N0, SDValue N1,
509 SDValue unfoldMaskedMerge(SDNode *N);
510 SDValue unfoldExtremeBitClearingToShifts(SDNode *N);
511 SDValue SimplifySetCC(EVT VT, SDValue N0, SDValue N1, ISD::CondCode Cond,
511 SDValue SimplifySetCC(EVT VT, SDValue N0, SDValue N1, ISD::CondCode Cond,
511 SDValue SimplifySetCC(EVT VT, SDValue N0, SDValue N1, ISD::CondCode Cond,
513 SDValue rebuildSetCC(SDValue N);
513 SDValue rebuildSetCC(SDValue N);
515 bool isSetCCEquivalent(SDValue N, SDValue &LHS, SDValue &RHS,
515 bool isSetCCEquivalent(SDValue N, SDValue &LHS, SDValue &RHS,
515 bool isSetCCEquivalent(SDValue N, SDValue &LHS, SDValue &RHS,
516 SDValue &CC) const;
517 bool isOneUseSetCC(SDValue N) const;
518 bool isCheaperToUseNegatedFPOps(SDValue X, SDValue Y);
518 bool isCheaperToUseNegatedFPOps(SDValue X, SDValue Y);
520 SDValue SimplifyNodeWithTwoResults(SDNode *N, unsigned LoOp,
522 SDValue CombineConsecutiveLoads(SDNode *N, EVT VT);
523 SDValue CombineExtLoad(SDNode *N);
524 SDValue CombineZExtLogicopShiftLoad(SDNode *N);
525 SDValue combineRepeatedFPDivisors(SDNode *N);
526 SDValue combineInsertEltToShuffle(SDNode *N, unsigned InsIndex);
527 SDValue ConstantFoldBITCASTofBUILD_VECTOR(SDNode *, EVT);
528 SDValue BuildSDIV(SDNode *N);
529 SDValue BuildSDIVPow2(SDNode *N);
530 SDValue BuildUDIV(SDNode *N);
531 SDValue BuildLogBase2(SDValue V, const SDLoc &DL);
531 SDValue BuildLogBase2(SDValue V, const SDLoc &DL);
532 SDValue BuildDivEstimate(SDValue N, SDValue Op, SDNodeFlags Flags);
532 SDValue BuildDivEstimate(SDValue N, SDValue Op, SDNodeFlags Flags);
532 SDValue BuildDivEstimate(SDValue N, SDValue Op, SDNodeFlags Flags);
533 SDValue buildRsqrtEstimate(SDValue Op, SDNodeFlags Flags);
533 SDValue buildRsqrtEstimate(SDValue Op, SDNodeFlags Flags);
534 SDValue buildSqrtEstimate(SDValue Op, SDNodeFlags Flags);
534 SDValue buildSqrtEstimate(SDValue Op, SDNodeFlags Flags);
535 SDValue buildSqrtEstimateImpl(SDValue Op, SDNodeFlags Flags, bool Recip);
535 SDValue buildSqrtEstimateImpl(SDValue Op, SDNodeFlags Flags, bool Recip);
536 SDValue buildSqrtNROneConst(SDValue Arg, SDValue Est, unsigned Iterations,
536 SDValue buildSqrtNROneConst(SDValue Arg, SDValue Est, unsigned Iterations,
536 SDValue buildSqrtNROneConst(SDValue Arg, SDValue Est, unsigned Iterations,
538 SDValue buildSqrtNRTwoConst(SDValue Arg, SDValue Est, unsigned Iterations,
538 SDValue buildSqrtNRTwoConst(SDValue Arg, SDValue Est, unsigned Iterations,
538 SDValue buildSqrtNRTwoConst(SDValue Arg, SDValue Est, unsigned Iterations,
540 SDValue MatchBSwapHWordLow(SDNode *N, SDValue N0, SDValue N1,
540 SDValue MatchBSwapHWordLow(SDNode *N, SDValue N0, SDValue N1,
540 SDValue MatchBSwapHWordLow(SDNode *N, SDValue N0, SDValue N1,
542 SDValue MatchBSwapHWord(SDNode *N, SDValue N0, SDValue N1);
542 SDValue MatchBSwapHWord(SDNode *N, SDValue N0, SDValue N1);
542 SDValue MatchBSwapHWord(SDNode *N, SDValue N0, SDValue N1);
543 SDValue MatchRotatePosNeg(SDValue Shifted, SDValue Pos, SDValue Neg,
543 SDValue MatchRotatePosNeg(SDValue Shifted, SDValue Pos, SDValue Neg,
543 SDValue MatchRotatePosNeg(SDValue Shifted, SDValue Pos, SDValue Neg,
543 SDValue MatchRotatePosNeg(SDValue Shifted, SDValue Pos, SDValue Neg,
544 SDValue InnerPos, SDValue InnerNeg,
544 SDValue InnerPos, SDValue InnerNeg,
547 SDValue MatchRotate(SDValue LHS, SDValue RHS, const SDLoc &DL);
547 SDValue MatchRotate(SDValue LHS, SDValue RHS, const SDLoc &DL);
547 SDValue MatchRotate(SDValue LHS, SDValue RHS, const SDLoc &DL);
548 SDValue MatchLoadCombine(SDNode *N);
549 SDValue MatchStoreCombine(StoreSDNode *N);
550 SDValue ReduceLoadWidth(SDNode *N);
551 SDValue ReduceLoadOpStoreWidth(SDNode *N);
552 SDValue splitMergedValStore(StoreSDNode *ST);
553 SDValue TransformFPLoadStorePair(SDNode *N);
554 SDValue convertBuildVecZextToZext(SDNode *N);
555 SDValue reduceBuildVecExtToExtBuildVec(SDNode *N);
556 SDValue reduceBuildVecToShuffle(SDNode *N);
557 SDValue createBuildVecShuffle(const SDLoc &DL, SDNode *N,
558 ArrayRef<int> VectorMask, SDValue VecIn1,
559 SDValue VecIn2, unsigned LeftIdx,
561 SDValue matchVSelectOpSizesWithSetCC(SDNode *Cast);
565 void GatherAllAliases(SDNode *N, SDValue OriginalChain,
566 SmallVectorImpl<SDValue> &Aliases);
573 SDValue FindBetterChain(SDNode *N, SDValue Chain);
573 SDValue FindBetterChain(SDNode *N, SDValue Chain);
605 SDValue &AddNode,
606 SDValue &ConstNode);
629 SDValue getMergeStoreChains(SmallVectorImpl<MemOpLink> &StoreNodes,
671 SDValue distributeTruncateThroughAnd(SDNode *N);
709 SDValue OrigLoad, SDValue ExtLoad,
709 SDValue OrigLoad, SDValue ExtLoad,
749 SDValue TargetLowering::DAGCombinerInfo::
750 CombineTo(SDNode *N, ArrayRef<SDValue> To, bool AddTo) {
754 SDValue TargetLowering::DAGCombinerInfo::
755 CombineTo(SDNode *N, SDValue Res, bool AddTo) {
759 SDValue TargetLowering::DAGCombinerInfo::
760 CombineTo(SDNode *N, SDValue Res0, SDValue Res1, bool AddTo) {
760 CombineTo(SDNode *N, SDValue Res0, SDValue Res1, bool AddTo) {
783 for (const SDValue &Op : N->ops())
807 bool DAGCombiner::isSetCCEquivalent(SDValue N, SDValue &LHS, SDValue &RHS,
807 bool DAGCombiner::isSetCCEquivalent(SDValue N, SDValue &LHS, SDValue &RHS,
807 bool DAGCombiner::isSetCCEquivalent(SDValue N, SDValue &LHS, SDValue &RHS,
808 SDValue &CC) const {
834 bool DAGCombiner::isOneUseSetCC(SDValue N) const {
835 SDValue N0, N1, N2;
843 static SDNode *isConstantFPBuildVectorOrConstantFP(SDValue N) {
854 static bool isConstantOrConstantVector(SDValue N, bool NoOpaques = false) {
860 for (const SDValue &Op : N->op_values()) {
873 static bool isAnyConstantBuildVector(SDValue V, bool NoOpaques = false) {
882 SDValue N0,
883 SDValue N1) {
938 SDValue DAGCombiner::reassociateOpsCommutative(unsigned Opc, const SDLoc &DL,
939 SDValue N0, SDValue N1) {
939 SDValue N0, SDValue N1) {
952 if (SDValue OpNode = DAG.FoldConstantArithmetic(Opc, DL, VT, C1, C2))
959 SDValue OpNode = DAG.getNode(Opc, SDLoc(N0), VT, N0.getOperand(0), N1);
969 SDValue DAGCombiner::reassociateOps(unsigned Opc, const SDLoc &DL, SDValue N0,
969 SDValue DAGCombiner::reassociateOps(unsigned Opc, const SDLoc &DL, SDValue N0,
970 SDValue N1, SDNodeFlags Flags) {
982 if (SDValue Combined = reassociateOpsCommutative(Opc, DL, N0, N1))
984 if (SDValue Combined = reassociateOpsCommutative(Opc, DL, N1, N0))
989 SDValue DAGCombiner::CombineTo(SDNode *N, const SDValue *To, unsigned NumTo,
989 SDValue DAGCombiner::CombineTo(SDNode *N, const SDValue *To, unsigned NumTo,
1041 bool DAGCombiner::SimplifyDemandedBits(SDValue Op, const APInt &DemandedBits,
1064 bool DAGCombiner::SimplifyDemandedVectorElts(SDValue Op,
1089 SDValue Trunc = DAG.getNode(ISD::TRUNCATE, DL, VT, SDValue(ExtLoad, 0));
1100 SDValue DAGCombiner::PromoteOperand(SDValue Op, EVT PVT, bool &Replace) {
1100 SDValue DAGCombiner::PromoteOperand(SDValue Op, EVT PVT, bool &Replace) {
1118 if (SDValue Op0 = SExtPromoteOperand(Op.getOperand(0), PVT))
1122 if (SDValue Op0 = ZExtPromoteOperand(Op.getOperand(0), PVT))
1137 SDValue DAGCombiner::SExtPromoteOperand(SDValue Op, EVT PVT) {
1137 SDValue DAGCombiner::SExtPromoteOperand(SDValue Op, EVT PVT) {
1143 SDValue NewOp = PromoteOperand(Op, PVT, Replace);
1154 SDValue DAGCombiner::ZExtPromoteOperand(SDValue Op, EVT PVT) {
1154 SDValue DAGCombiner::ZExtPromoteOperand(SDValue Op, EVT PVT) {
1158 SDValue NewOp = PromoteOperand(Op, PVT, Replace);
1171 SDValue DAGCombiner::PromoteIntBinOp(SDValue Op) {
1171 SDValue DAGCombiner::PromoteIntBinOp(SDValue Op) {
1194 SDValue N0 = Op.getOperand(0);
1195 SDValue NN0 = PromoteOperand(N0, PVT, Replace0);
1198 SDValue N1 = Op.getOperand(1);
1199 SDValue NN1 = PromoteOperand(N1, PVT, Replace1);
1202 SDValue RV =
1236 SDValue DAGCombiner::PromoteIntShiftOp(SDValue Op) {
1236 SDValue DAGCombiner::PromoteIntShiftOp(SDValue Op) {
1259 SDValue N0 = Op.getOperand(0);
1260 SDValue N1 = Op.getOperand(1);
1272 SDValue RV =
1285 SDValue DAGCombiner::PromoteExtend(SDValue Op) {
1285 SDValue DAGCombiner::PromoteExtend(SDValue Op) {
1313 bool DAGCombiner::PromoteLoad(SDValue Op) {
1342 SDValue NewLD = DAG.getExtLoad(ExtType, DL, PVT,
1345 SDValue Result = DAG.getNode(ISD::TRUNCATE, DL, VT, NewLD);
1377 for (const SDValue &ChildN : N->op_values())
1440 for (const SDValue &ChildN : N->op_values())
1444 SDValue RV = combine(N);
1488 SDValue DAGCombiner::visit(SDNode *N) {
1622 SDValue DAGCombiner::combine(SDNode *N) {
1623 SDValue RV = visit(N);
1674 SDValue N0 = N->getOperand(0);
1675 SDValue N1 = N->getOperand(1);
1679 SDValue Ops[] = {N1, N0};
1692 static SDValue getInputChainForNode(SDNode *N) {
1705 SDValue DAGCombiner::visitTokenFactor(SDNode *N) {
1726 SmallVector<SDValue, 8> Ops; // Ops for replacing token factor.
1750 for (const SDValue &Op : TF->op_values()) {
1796 for (const SDValue &Op : Ops) {
1846 for (const SDValue &Op : CurNode->op_values())
1867 SDValue Result;
1873 SmallVector<SDValue, 8> PrunedOps;
1875 for (const SDValue &Op : Ops) {
1890 SDValue DAGCombiner::visitMERGE_VALUES(SDNode *N) {
1900 SmallVector<SDValue, 8> Ops;
1911 static ConstantSDNode *getAsNonOpaqueConstant(SDValue N) {
1916 SDValue DAGCombiner::foldBinOpIntoSelect(SDNode *BO) {
1924 SDValue Sel = BO->getOperand(0);
1933 SDValue CT = Sel.getOperand(1);
1938 SDValue CF = Sel.getOperand(2);
1954 SDValue CBO = BO->getOperand(SelOpNo ^ 1);
1975 SDValue NewCT = SelOpNo ? DAG.getNode(BinOpcode, DL, VT, CBO, CT)
1982 SDValue NewCF = SelOpNo ? DAG.getNode(BinOpcode, DL, VT, CBO, CF)
1989 SDValue SelectOp = DAG.getSelect(DL, VT, Sel.getOperand(0), NewCT, NewCF);
1994 static SDValue foldAddSubBoolOfMaskedVal(SDNode *N, SelectionDAG &DAG) {
2002 SDValue C = IsAdd ? N->getOperand(1) : N->getOperand(0);
2003 SDValue Z = IsAdd ? N->getOperand(0) : N->getOperand(1);
2014 SDValue SetCC = Z.getOperand(0);
2027 SDValue LowBit = DAG.getZExtOrTrunc(SetCC.getOperand(0), DL, VT);
2028 SDValue C1 = IsAdd ? DAG.getConstant(CN->getAPIntValue() + 1, DL, VT) :
2035 static SDValue foldAddSubOfSignBit(SDNode *N, SelectionDAG &DAG) {
2043 SDValue ConstantOp = IsAdd ? N->getOperand(1) : N->getOperand(0);
2044 SDValue ShiftOp = IsAdd ? N->getOperand(0) : N->getOperand(1);
2050 SDValue Not = ShiftOp.getOperand(0);
2056 SDValue ShAmt = ShiftOp.getOperand(1);
2066 SDValue NewShift = DAG.getNode(ShOpcode, DL, VT, Not.getOperand(0), ShAmt);
2074 SDValue DAGCombiner::visitADDLike(SDNode *N) {
2075 SDValue N0 = N->getOperand(0);
2076 SDValue N1 = N->getOperand(1);
2082 if (SDValue FoldedVOp = SimplifyVBinOp(N))
2116 SDValue Sub = DAG.FoldConstantArithmetic(ISD::SUB, DL, VT, N1.getNode(),
2125 SDValue Add = DAG.FoldConstantArithmetic(ISD::ADD, DL, VT, N1.getNode(),
2137 SDValue X = N0.getOperand(0);
2142 SDValue Not = DAG.getNOT(DL, X, X.getValueType());
2152 SDValue Add0 = DAG.getNode(ISD::ADD, DL, VT, N1, N0.getOperand(1));
2157 if (SDValue NewSel = foldBinOpIntoSelect(N))
2162 if (SDValue RADD = reassociateOps(ISD::ADD, DL, N0, N1, N->getFlags()))
2214 SDValue N00 = N0.getOperand(0);
2215 SDValue N01 = N0.getOperand(1);
2216 SDValue N10 = N1.getOperand(0);
2217 SDValue N11 = N1.getOperand(1);
2250 SDValue A, Xor;
2270 SDValue Not = DAG.getNode(ISD::XOR, DL, VT, N0.getOperand(0),
2279 SDValue Xor = DAG.getNode(ISD::XOR, DL, VT, N0.getOperand(1), N1);
2283 if (SDValue Combined = visitADDLikeCommutative(N0, N1, N))
2286 if (SDValue Combined = visitADDLikeCommutative(N1, N0, N))
2292 SDValue DAGCombiner::visitADD(SDNode *N) {
2293 SDValue N0 = N->getOperand(0);
2294 SDValue N1 = N->getOperand(1);
2298 if (SDValue Combined = visitADDLike(N))
2301 if (SDValue V = foldAddSubBoolOfMaskedVal(N, DAG))
2304 if (SDValue V = foldAddSubOfSignBit(N, DAG))
2315 SDValue DAGCombiner::visitADDSAT(SDNode *N) {
2317 SDValue N0 = N->getOperand(0);
2318 SDValue N1 = N->getOperand(1);
2358 static SDValue getAsCarry(const TargetLowering &TLI, SDValue V) {
2358 static SDValue getAsCarry(const TargetLowering &TLI, SDValue V) {
2403 static SDValue foldAddSubMasked1(bool IsAdd, SDValue N0, SDValue N1,
2403 static SDValue foldAddSubMasked1(bool IsAdd, SDValue N0, SDValue N1,
2403 static SDValue foldAddSubMasked1(bool IsAdd, SDValue N0, SDValue N1,
2418 SDValue DAGCombiner::visitADDLikeCommutative(SDValue N0, SDValue N1,
2418 SDValue DAGCombiner::visitADDLikeCommutative(SDValue N0, SDValue N1,
2418 SDValue DAGCombiner::visitADDLikeCommutative(SDValue N0, SDValue N1,
2431 if (SDValue V = foldAddSubMasked1(true, N0, N1, DAG, DL))
2440 SDValue Not = DAG.getNode(ISD::XOR, DL, VT, N0.getOperand(0),
2450 SDValue Add = DAG.getNode(ISD::ADD, DL, VT, N0.getOperand(0), N1);
2457 SDValue Sub = DAG.getNode(ISD::SUB, DL, VT, N1, N0.getOperand(1));
2467 SDValue ZExt = DAG.getNode(ISD::ZERO_EXTEND, DL, VT, N0.getOperand(0));
2475 SDValue ZExt = DAG.getNode(ISD::AND, DL, VT, N1.getOperand(0),
2489 if (SDValue Carry = getAsCarry(TLI, N1))
2497 SDValue DAGCombiner::visitADDC(SDNode *N) {
2498 SDValue N0 = N->getOperand(0);
2499 SDValue N1 = N->getOperand(1);
2527 static SDValue flipBoolean(SDValue V, const SDLoc &DL,
2527 static SDValue flipBoolean(SDValue V, const SDLoc &DL,
2531 SDValue Cst;
2552 static SDValue extractBooleanFlip(SDValue V, SelectionDAG &DAG,
2552 static SDValue extractBooleanFlip(SDValue V, SelectionDAG &DAG,
2587 SDValue DAGCombiner::visitADDO(SDNode *N) {
2588 SDValue N0 = N->getOperand(0);
2589 SDValue N1 = N->getOperand(1);
2618 SDValue Sub = DAG.getNode(ISD::USUBO, DL, N->getVTList(),
2624 if (SDValue Combined = visitUADDOLike(N0, N1, N))
2627 if (SDValue Combined = visitUADDOLike(N1, N0, N))
2634 SDValue DAGCombiner::visitUADDOLike(SDValue N0, SDValue N1, SDNode *N) {
2634 SDValue DAGCombiner::visitUADDOLike(SDValue N0, SDValue N1, SDNode *N) {
2634 SDValue DAGCombiner::visitUADDOLike(SDValue N0, SDValue N1, SDNode *N) {
2642 SDValue Y = N1.getOperand(0);
2643 SDValue One = DAG.getConstant(1, SDLoc(N), Y.getValueType());
2651 if (SDValue Carry = getAsCarry(TLI, N1))
2658 SDValue DAGCombiner::visitADDE(SDNode *N) {
2659 SDValue N0 = N->getOperand(0);
2660 SDValue N1 = N->getOperand(1);
2661 SDValue CarryIn = N->getOperand(2);
2677 SDValue DAGCombiner::visitADDCARRY(SDNode *N) {
2678 SDValue N0 = N->getOperand(0);
2679 SDValue N1 = N->getOperand(1);
2680 SDValue CarryIn = N->getOperand(2);
2700 SDValue CarryExt = DAG.getBoolExtOrTrunc(CarryIn, DL, VT, CarryVT);
2707 if (SDValue Combined = visitADDCARRYLike(N0, N1, CarryIn, N))
2710 if (SDValue Combined = visitADDCARRYLike(N1, N0, CarryIn, N))
2738 static SDValue combineADDCARRYDiamond(DAGCombiner &Combiner, SelectionDAG &DAG,
2739 SDValue X, SDValue Carry0, SDValue Carry1,
2739 SDValue X, SDValue Carry0, SDValue Carry1,
2739 SDValue X, SDValue Carry0, SDValue Carry1,
2746 SDValue Z;
2767 SDValue NewY = DAG.getNode(ISD::ADDCARRY, DL, Carry0->getVTList(), A, B, Z);
2803 SDValue DAGCombiner::visitADDCARRYLike(SDValue N0, SDValue N1, SDValue CarryIn,
2803 SDValue DAGCombiner::visitADDCARRYLike(SDValue N0, SDValue N1, SDValue CarryIn,
2803 SDValue DAGCombiner::visitADDCARRYLike(SDValue N0, SDValue N1, SDValue CarryIn,
2803 SDValue DAGCombiner::visitADDCARRYLike(SDValue N0, SDValue N1, SDValue CarryIn,
2807 if (SDValue NotC = extractBooleanFlip(CarryIn, DAG, TLI, true)) {
2809 SDValue Sub = DAG.getNode(ISD::SUBCARRY, DL, N->getVTList(), N1,
2831 if (auto Y = getAsCarry(TLI, N1)) {
2833 if (auto R = combineADDCARRYDiamond(*this, DAG, N0, Y, CarryIn, N))
2835 if (auto R = combineADDCARRYDiamond(*this, DAG, N0, CarryIn, Y, N))
2844 static SDValue tryFoldToZero(const SDLoc &DL, const TargetLowering &TLI, EVT VT,
2853 SDValue DAGCombiner::visitSUB(SDNode *N) {
2854 SDValue N0 = N->getOperand(0);
2855 SDValue N1 = N->getOperand(1);
2861 if (SDValue FoldedVOp = SimplifyVBinOp(N))
2880 if (SDValue NewSel = foldBinOpIntoSelect(N))
2945 SDValue NewC = DAG.FoldConstantArithmetic(
2953 SDValue N11 = N1.getOperand(1);
2956 SDValue NewC = DAG.FoldConstantArithmetic(ISD::SUB, DL, VT, N0.getNode(),
2967 SDValue NewC = DAG.FoldConstantArithmetic(
2977 SDValue NewC = DAG.FoldConstantArithmetic(
3013 SDValue Mul = DAG.getNode(ISD::MUL, DL, VT,
3020 SDValue Mul = DAG.getNode(ISD::MUL, DL, VT,
3033 if (SDValue V = foldAddSubBoolOfMaskedVal(N, DAG))
3036 if (SDValue V = foldAddSubOfSignBit(N, DAG))
3039 if (SDValue V = foldAddSubMasked1(false, N0, N1, DAG, SDLoc(N)))
3044 SDValue Xor = DAG.getNode(ISD::XOR, DL, VT, N0.getOperand(1),
3054 SDValue Add = DAG.getNode(ISD::ADD, DL, VT, N0, N1.getOperand(0));
3062 SDValue Sub = DAG.getNode(ISD::SUB, DL, VT, N0.getOperand(0), N1);
3068 SDValue Sub = DAG.getNode(ISD::SUB, DL, VT, N0, N1.getOperand(0));
3075 SDValue Sub = DAG.getNode(ISD::SUB, DL, VT, N0.getOperand(0), N1);
3081 SDValue Add = DAG.getNode(ISD::ADD, DL, VT, N0.getOperand(1), N1);
3092 SDValue SExt = DAG.getNode(ISD::SIGN_EXTEND, DL, VT, N1.getOperand(0));
3099 SDValue X0 = N0.getOperand(0), X1 = N0.getOperand(1);
3100 SDValue S0 = N1.getOperand(0);
3129 SDValue ZExt = DAG.getNode(ISD::AND, DL, VT, N1.getOperand(0),
3138 SDValue ShAmt = N1.getOperand(1);
3142 SDValue SRA = DAG.getNode(ISD::SRA, DL, VT, N1.getOperand(0), ShAmt);
3149 if (SDValue Carry = getAsCarry(TLI, N0)) {
3150 SDValue X = N1;
3151 SDValue Zero = DAG.getConstant(0, DL, VT);
3152 SDValue NegX = DAG.getNode(ISD::SUB, DL, VT, Zero, X);
3162 SDValue DAGCombiner::visitSUBSAT(SDNode *N) {
3163 SDValue N0 = N->getOperand(0);
3164 SDValue N1 = N->getOperand(1);
3199 SDValue DAGCombiner::visitSUBC(SDNode *N) {
3200 SDValue N0 = N->getOperand(0);
3201 SDValue N1 = N->getOperand(1);
3227 SDValue DAGCombiner::visitSUBO(SDNode *N) {
3228 SDValue N0 = N->getOperand(0);
3229 SDValue N1 = N->getOperand(1);
3266 SDValue DAGCombiner::visitSUBE(SDNode *N) {
3267 SDValue N0 = N->getOperand(0);
3268 SDValue N1 = N->getOperand(1);
3269 SDValue CarryIn = N->getOperand(2);
3278 SDValue DAGCombiner::visitSUBCARRY(SDNode *N) {
3279 SDValue N0 = N->getOperand(0);
3280 SDValue N1 = N->getOperand(1);
3281 SDValue CarryIn = N->getOperand(2);
3295 SDValue DAGCombiner::visitMULFIX(SDNode *N) {
3296 SDValue N0 = N->getOperand(0);
3297 SDValue N1 = N->getOperand(1);
3298 SDValue Scale = N->getOperand(2);
3317 SDValue DAGCombiner::visitMUL(SDNode *N) {
3318 SDValue N0 = N->getOperand(0);
3319 SDValue N1 = N->getOperand(1);
3333 if (SDValue FoldedVOp = SimplifyVBinOp(N))
3373 if (SDValue NewSel = foldBinOpIntoSelect(N))
3387 SDValue LogBase2 = BuildLogBase2(N1, DL);
3389 SDValue Trunc = DAG.getZExtOrTrunc(LogBase2, DL, ShiftVT);
3429 SDValue Shl =
3431 SDValue R = DAG.getNode(MathOp, DL, VT, Shl, N0);
3442 SDValue C3 = DAG.getNode(ISD::SHL, SDLoc(N), VT, N1, N0.getOperand(1));
3450 SDValue Sh(nullptr, 0), Y(nullptr, 0);
3464 SDValue Mul = DAG.getNode(ISD::MUL, SDLoc(N), VT, Sh.getOperand(0), Y);
3481 if (SDValue RMUL = reassociateOps(ISD::MUL, SDLoc(N), N0, N1, N->getFlags()))
3507 SDValue DAGCombiner::useDivRem(SDNode *Node) {
3541 SDValue Op0 = Node->getOperand(0);
3542 SDValue Op1 = Node->getOperand(1);
3543 SDValue combined;
3577 static SDValue simplifyDivRem(SDNode *N, SelectionDAG &DAG) {
3578 SDValue N0 = N->getOperand(0);
3579 SDValue N1 = N->getOperand(1);
3623 SDValue DAGCombiner::visitSDIV(SDNode *N) {
3624 SDValue N0 = N->getOperand(0);
3625 SDValue N1 = N->getOperand(1);
3631 if (SDValue FoldedVOp = SimplifyVBinOp(N))
3650 if (SDValue V = simplifyDivRem(N, DAG))
3653 if (SDValue NewSel = foldBinOpIntoSelect(N))
3661 if (SDValue V = visitSDIVLike(N0, N1, N)) {
3666 SDValue Mul = DAG.getNode(ISD::MUL, DL, VT, V, N1);
3667 SDValue Sub = DAG.getNode(ISD::SUB, DL, VT, N0, Mul);
3680 if (SDValue DivRem = useDivRem(N))
3686 SDValue DAGCombiner::visitSDIVLike(SDValue N0, SDValue N1, SDNode *N) {
3686 SDValue DAGCombiner::visitSDIVLike(SDValue N0, SDValue N1, SDNode *N) {
3686 SDValue DAGCombiner::visitSDIVLike(SDValue N0, SDValue N1, SDNode *N) {
3710 if (SDValue Res = BuildSDIVPow2(N))
3715 SDValue Bits = DAG.getConstant(BitWidth, DL, ShiftAmtTy);
3716 SDValue C1 = DAG.getNode(ISD::CTTZ, DL, VT, N1);
3718 SDValue Inexact = DAG.getNode(ISD::SUB, DL, ShiftAmtTy, Bits, C1);
3723 SDValue Sign = DAG.getNode(ISD::SRA, DL, VT, N0,
3728 SDValue Srl = DAG.getNode(ISD::SRL, DL, VT, Sign, Inexact);
3730 SDValue Add = DAG.getNode(ISD::ADD, DL, VT, N0, Srl);
3732 SDValue Sra = DAG.getNode(ISD::SRA, DL, VT, Add, C1);
3737 SDValue One = DAG.getConstant(1, DL, VT);
3738 SDValue AllOnes = DAG.getAllOnesConstant(DL, VT);
3739 SDValue IsOne = DAG.getSetCC(DL, CCVT, N1, One, ISD::SETEQ);
3740 SDValue IsAllOnes = DAG.getSetCC(DL, CCVT, N1, AllOnes, ISD::SETEQ);
3741 SDValue IsOneOrAllOnes = DAG.getNode(ISD::OR, DL, CCVT, IsOne, IsAllOnes);
3746 SDValue Zero = DAG.getConstant(0, DL, VT);
3747 SDValue Sub = DAG.getNode(ISD::SUB, DL, VT, Zero, Sra);
3750 SDValue IsNeg = DAG.getSetCC(DL, CCVT, N1, Zero, ISD::SETLT);
3751 SDValue Res = DAG.getSelect(DL, VT, IsNeg, Sub, Sra);
3761 if (SDValue Op = BuildSDIV(N))
3767 SDValue DAGCombiner::visitUDIV(SDNode *N) {
3768 SDValue N0 = N->getOperand(0);
3769 SDValue N1 = N->getOperand(1);
3775 if (SDValue FoldedVOp = SimplifyVBinOp(N))
3784 if (SDValue Folded = DAG.FoldConstantArithmetic(ISD::UDIV, DL, VT,
3793 if (SDValue V = simplifyDivRem(N, DAG))
3796 if (SDValue NewSel = foldBinOpIntoSelect(N))
3799 if (SDValue V = visitUDIVLike(N0, N1, N)) {
3804 SDValue Mul = DAG.getNode(ISD::MUL, DL, VT, V, N1);
3805 SDValue Sub = DAG.getNode(ISD::SUB, DL, VT, N0, Mul);
3818 if (SDValue DivRem = useDivRem(N))
3824 SDValue DAGCombiner::visitUDIVLike(SDValue N0, SDValue N1, SDNode *N) {
3824 SDValue DAGCombiner::visitUDIVLike(SDValue N0, SDValue N1, SDNode *N) {
3824 SDValue DAGCombiner::visitUDIVLike(SDValue N0, SDValue N1, SDNode *N) {
3831 SDValue LogBase2 = BuildLogBase2(N1, DL);
3835 SDValue Trunc = DAG.getZExtOrTrunc(LogBase2, DL, ShiftVT);
3842 SDValue N10 = N1.getOperand(0);
3845 SDValue LogBase2 = BuildLogBase2(N10, DL);
3849 SDValue Trunc = DAG.getZExtOrTrunc(LogBase2, DL, ADDVT);
3851 SDValue Add = DAG.getNode(ISD::ADD, DL, ADDVT, N1.getOperand(1), Trunc);
3861 if (SDValue Op = BuildUDIV(N))
3868 SDValue DAGCombiner::visitREM(SDNode *N) {
3870 SDValue N0 = N->getOperand(0);
3871 SDValue N1 = N->getOperand(1);
3882 if (SDValue Folded = DAG.FoldConstantArithmetic(Opcode, DL, VT, N0C, N1C))
3889 if (SDValue V = simplifyDivRem(N, DAG))
3892 if (SDValue NewSel = foldBinOpIntoSelect(N))
3901 SDValue NegOne = DAG.getAllOnesConstant(DL, VT);
3904 SDValue Add = DAG.getNode(ISD::ADD, DL, VT, N1, NegOne);
3911 SDValue Add = DAG.getNode(ISD::ADD, DL, VT, N1, NegOne);
3927 SDValue OptimizedDiv =
3935 SDValue Mul = DAG.getNode(ISD::MUL, DL, VT, OptimizedDiv, N1);
3936 SDValue Sub = DAG.getNode(ISD::SUB, DL, VT, N0, Mul);
3944 if (SDValue DivRem = useDivRem(N))
3950 SDValue DAGCombiner::visitMULHS(SDNode *N) {
3951 SDValue N0 = N->getOperand(0);
3952 SDValue N1 = N->getOperand(1);
3997 SDValue DAGCombiner::visitMULHU(SDNode *N) {
3998 SDValue N0 = N->getOperand(0);
3999 SDValue N1 = N->getOperand(1);
4025 SDValue LogBase2 = BuildLogBase2(N1, DL);
4026 SDValue SRLAmt = DAG.getNode(
4029 SDValue Trunc = DAG.getZExtOrTrunc(SRLAmt, DL, ShiftVT);
4056 SDValue DAGCombiner::SimplifyNodeWithTwoResults(SDNode *N, unsigned LoOp,
4062 SDValue Res = DAG.getNode(LoOp, SDLoc(N), N->getValueType(0), N->ops());
4070 SDValue Res = DAG.getNode(HiOp, SDLoc(N), N->getValueType(1), N->ops());
4080 SDValue Lo = DAG.getNode(LoOp, SDLoc(N), N->getValueType(0), N->ops());
4082 SDValue LoOpt = combine(Lo.getNode());
4090 SDValue Hi = DAG.getNode(HiOp, SDLoc(N), N->getValueType(1), N->ops());
4092 SDValue HiOpt = combine(Hi.getNode());
4102 SDValue DAGCombiner::visitSMUL_LOHI(SDNode *N) {
4103 if (SDValue Res = SimplifyNodeWithTwoResults(N, ISD::MUL, ISD::MULHS))
4116 SDValue Lo = DAG.getNode(ISD::SIGN_EXTEND, DL, NewVT, N->getOperand(0));
4117 SDValue Hi = DAG.getNode(ISD::SIGN_EXTEND, DL, NewVT, N->getOperand(1));
4133 SDValue DAGCombiner::visitUMUL_LOHI(SDNode *N) {
4134 if (SDValue Res = SimplifyNodeWithTwoResults(N, ISD::MUL, ISD::MULHU))
4142 SDValue Zero = DAG.getConstant(0, DL, VT);
4148 SDValue Zero = DAG.getConstant(0, DL, VT);
4159 SDValue Lo = DAG.getNode(ISD::ZERO_EXTEND, DL, NewVT, N->getOperand(0));
4160 SDValue Hi = DAG.getNode(ISD::ZERO_EXTEND, DL, NewVT, N->getOperand(1));
4176 SDValue DAGCombiner::visitMULO(SDNode *N) {
4177 SDValue N0 = N->getOperand(0);
4178 SDValue N1 = N->getOperand(1);
4204 SDValue DAGCombiner::visitIMINMAX(SDNode *N) {
4205 SDValue N0 = N->getOperand(0);
4206 SDValue N1 = N->getOperand(1);
4211 if (SDValue FoldedVOp = SimplifyVBinOp(N))
4249 SDValue DAGCombiner::hoistLogicOpWithSameOpcodeHands(SDNode *N) {
4250 SDValue N0 = N->getOperand(0), N1 = N->getOperand(1);
4266 SDValue X = N0.getOperand(0);
4267 SDValue Y = N1.getOperand(0);
4290 SDValue Logic = DAG.getNode(LogicOpcode, DL, XVT, X, Y);
4312 SDValue Logic = DAG.getNode(LogicOpcode, DL, XVT, X, Y);
4324 SDValue Logic = DAG.getNode(LogicOpcode, DL, XVT, X, Y);
4333 SDValue Logic = DAG.getNode(LogicOpcode, DL, XVT, X, Y);
4350 SDValue Logic = DAG.getNode(LogicOpcode, DL, XVT, X, Y);
4383 SDValue ShOp = N0.getOperand(1);
4389 SDValue Logic = DAG.getNode(LogicOpcode, DL, VT,
4402 SDValue Logic = DAG.getNode(LogicOpcode, DL, VT, N0.getOperand(1),
4412 SDValue DAGCombiner::foldLogicOfSetCCs(bool IsAnd, SDValue N0, SDValue N1,
4412 SDValue DAGCombiner::foldLogicOfSetCCs(bool IsAnd, SDValue N0, SDValue N1,
4412 SDValue DAGCombiner::foldLogicOfSetCCs(bool IsAnd, SDValue N0, SDValue N1,
4414 SDValue LL, LR, RL, RR, N0CC, N1CC;
4457 SDValue Or = DAG.getNode(ISD::OR, SDLoc(N0), OpVT, LL, RL);
4476 SDValue And = DAG.getNode(ISD::AND, SDLoc(N0), OpVT, LL, RL);
4488 SDValue One = DAG.getConstant(1, DL, OpVT);
4489 SDValue Two = DAG.getConstant(2, DL, OpVT);
4490 SDValue Add = DAG.getNode(ISD::ADD, SDLoc(N0), OpVT, LL, One);
4502 SDValue XorL = DAG.getNode(ISD::XOR, SDLoc(N0), OpVT, LL, LR);
4503 SDValue XorR = DAG.getNode(ISD::XOR, SDLoc(N1), OpVT, RL, RR);
4504 SDValue Or = DAG.getNode(ISD::OR, DL, OpVT, XorL, XorR);
4505 SDValue Zero = DAG.getConstant(0, DL, OpVT);
4526 SDValue OffsetC = DAG.getConstant(-C1Val, DL, OpVT);
4527 SDValue Add = DAG.getNode(ISD::ADD, DL, OpVT, LL, OffsetC);
4528 SDValue MaskC = DAG.getConstant(~(C0Val - C1Val), DL, OpVT);
4529 SDValue And = DAG.getNode(ISD::AND, DL, OpVT, Add, MaskC);
4530 SDValue Zero = DAG.getConstant(0, DL, OpVT);
4562 SDValue DAGCombiner::visitANDLike(SDValue N0, SDValue N1, SDNode *N) {
4562 SDValue DAGCombiner::visitANDLike(SDValue N0, SDValue N1, SDNode *N) {
4562 SDValue DAGCombiner::visitANDLike(SDValue N0, SDValue N1, SDNode *N) {
4570 if (SDValue V = foldLogicOfSetCCs(true, N0, N1, DL))
4592 SDValue NewAdd =
4636 SDValue SL(N0);
4641 SDValue Trunc = DAG.getNode(ISD::TRUNCATE, SL, HalfVT,
4644 SDValue NewMask = DAG.getConstant(AndMask.trunc(Size / 2), SL, HalfVT);
4645 SDValue ShiftK = DAG.getConstant(ShiftBits, SL, ShiftVT);
4646 SDValue Shift = DAG.getNode(ISD::SRL, SL, HalfVT, Trunc, ShiftK);
4647 SDValue And = DAG.getNode(ISD::AND, SL, HalfVT, Shift, NewMask);
4777 for (SDValue Op : N->op_values()) {
4879 SDValue MaskOp = N->getOperand(1);
4885 SDValue And = DAG.getNode(ISD::AND, SDLoc(FixupNode),
4895 SDValue Op0 = LogicN->getOperand(0);
4896 SDValue Op1 = LogicN->getOperand(1);
4901 SDValue And = DAG.getNode(ISD::AND, SDLoc(Op1), Op1.getValueType(),
4910 SDValue And = DAG.getNode(ISD::AND, SDLoc(Load), Load->getValueType(0),
4916 SDValue NewLoad = ReduceLoadWidth(And.getNode());
4932 SDValue DAGCombiner::unfoldExtremeBitClearingToShifts(SDNode *N) {
4935 SDValue N0 = N->getOperand(0);
4936 SDValue N1 = N->getOperand(1);
4945 SDValue Y; // Shift amount.
4962 SDValue X;
4974 SDValue T0 = DAG.getNode(InnerShift, DL, VT, X, Y);
4976 SDValue T1 = DAG.getNode(OuterShift, DL, VT, T0, Y);
4984 static SDValue combineShiftAnd1ToBitTest(SDNode *And, SelectionDAG &DAG) {
4995 SDValue Not = And->getOperand(0), And1 = And->getOperand(1);
5004 SDValue Srl = Not.getOperand(0);
5024 SDValue X = DAG.getZExtOrTrunc(Srl.getOperand(0), DL, VT);
5026 SDValue Mask = DAG.getConstant(
5028 SDValue NewAnd = DAG.getNode(ISD::AND, DL, VT, X, Mask);
5029 SDValue Zero = DAG.getConstant(0, DL, VT);
5030 SDValue Setcc = DAG.getSetCC(DL, CCVT, NewAnd, Zero, ISD::SETEQ);
5034 SDValue DAGCombiner::visitAND(SDNode *N) {
5035 SDValue N0 = N->getOperand(0);
5036 SDValue N1 = N->getOperand(1);
5045 if (SDValue FoldedVOp = SimplifyVBinOp(N))
5083 if (SDValue NewSel = foldBinOpIntoSelect(N))
5087 if (SDValue RAND = reassociateOps(ISD::AND, SDLoc(N), N0, N1, N->getFlags()))
5092 if (SDValue Shuffle = XformToShuffleWithZero(N))
5104 SDValue N0Op0 = N0.getOperand(0);
5108 SDValue Zext = DAG.getNode(ISD::ZERO_EXTEND, SDLoc(N),
5200 SDValue NewLoad(Load, 0);
5214 SDValue To[] = { NewLoad.getValue(0), NewLoad.getValue(1),
5232 if (SDValue Res = ReduceLoadWidth(N)) {
5251 if (SDValue Combined = visitANDLike(N0, N1, N))
5256 if (SDValue V = hoistLogicOpWithSameOpcodeHands(N))
5268 SDValue SubRHS = N0.getOperand(1);
5298 SDValue ExtLoad =
5309 if (SDValue BSwap = MatchBSwapHWordLow(N0.getNode(), N0.getOperand(0),
5314 if (SDValue Shifts = unfoldExtremeBitClearingToShifts(N))
5318 if (SDValue V = combineShiftAnd1ToBitTest(N, DAG))
5325 SDValue DAGCombiner::MatchBSwapHWordLow(SDNode *N, SDValue N0, SDValue N1,
5325 SDValue DAGCombiner::MatchBSwapHWordLow(SDNode *N, SDValue N0, SDValue N1,
5325 SDValue DAGCombiner::MatchBSwapHWordLow(SDNode *N, SDValue N0, SDValue N1,
5381 SDValue N00 = N0->getOperand(0);
5392 SDValue N10 = N1->getOperand(0);
5427 SDValue Res = DAG.getNode(ISD::BSWAP, SDLoc(N), VT, N00);
5443 static bool isBSwapHWordElement(SDValue N, MutableArrayRef<SDNode *> Parts) {
5451 SDValue N0 = N.getOperand(0);
5528 static bool isBSwapHWordPair(SDValue N, MutableArrayRef<SDNode *> Parts) {
5550 SDValue DAGCombiner::MatchBSwapHWord(SDNode *N, SDValue N0, SDValue N1) {
5550 SDValue DAGCombiner::MatchBSwapHWord(SDNode *N, SDValue N0, SDValue N1) {
5550 SDValue DAGCombiner::MatchBSwapHWord(SDNode *N, SDValue N0, SDValue N1) {
5574 SDValue N00 = N0.getOperand(0);
5575 SDValue N01 = N0.getOperand(1);
5587 SDValue BSwap = DAG.getNode(ISD::BSWAP, DL, VT,
5592 SDValue ShAmt = DAG.getConstant(16, DL, getShiftAmountTy(VT));
5604 SDValue DAGCombiner::visitORLike(SDValue N0, SDValue N1, SDNode *N) {
5604 SDValue DAGCombiner::visitORLike(SDValue N0, SDValue N1, SDNode *N) {
5604 SDValue DAGCombiner::visitORLike(SDValue N0, SDValue N1, SDNode *N) {
5612 if (SDValue V = foldLogicOfSetCCs(false, N0, N1, DL))
5632 SDValue X = DAG.getNode(ISD::OR, SDLoc(N0), VT,
5647 SDValue X = DAG.getNode(ISD::OR, SDLoc(N0), VT,
5656 static SDValue visitORCommutative(
5657 SelectionDAG &DAG, SDValue N0, SDValue N1, SDNode *N) {
5657 SelectionDAG &DAG, SDValue N0, SDValue N1, SDNode *N) {
5672 SDValue DAGCombiner::visitOR(SDNode *N) {
5673 SDValue N0 = N->getOperand(0);
5674 SDValue N1 = N->getOperand(1);
5683 if (SDValue FoldedVOp = SimplifyVBinOp(N))
5751 SDValue NewLHS = ZeroN00 ? N0.getOperand(1) : N0.getOperand(0);
5752 SDValue NewRHS = ZeroN10 ? N1.getOperand(1) : N1.getOperand(0);
5754 SDValue LegalShuffle =
5780 if (SDValue NewSel = foldBinOpIntoSelect(N))
5787 if (SDValue Combined = visitORLike(N0, N1, N))
5791 if (SDValue BSwap = MatchBSwapHWord(N, N0, N1))
5793 if (SDValue BSwap = MatchBSwapHWordLow(N, N0, N1))
5797 if (SDValue ROR = reassociateOps(ISD::OR, SDLoc(N), N0, N1, N->getFlags()))
5807 if (SDValue COR = DAG.FoldConstantArithmetic(
5809 SDValue IOR = DAG.getNode(ISD::OR, SDLoc(N0), VT, N0.getOperand(0), N1);
5815 if (SDValue Combined = visitORCommutative(DAG, N0, N1, N))
5817 if (SDValue Combined = visitORCommutative(DAG, N1, N0, N))
5822 if (SDValue V = hoistLogicOpWithSameOpcodeHands(N))
5826 if (SDValue Rot = MatchRotate(N0, N1, SDLoc(N)))
5829 if (SDValue Load = MatchLoadCombine(N))
5839 if (SDValue Combined = visitADDLike(N))
5845 static SDValue stripConstantMask(SelectionDAG &DAG, SDValue Op, SDValue &Mask) {
5845 static SDValue stripConstantMask(SelectionDAG &DAG, SDValue Op, SDValue &Mask) {
5845 static SDValue stripConstantMask(SelectionDAG &DAG, SDValue Op, SDValue &Mask) {
5855 static bool matchRotateHalf(SelectionDAG &DAG, SDValue Op, SDValue &Shift,
5855 static bool matchRotateHalf(SelectionDAG &DAG, SDValue Op, SDValue &Shift,
5856 SDValue &Mask) {
5889 static SDValue extractShiftForRotate(SelectionDAG &DAG, SDValue OppShift,
5889 static SDValue extractShiftForRotate(SelectionDAG &DAG, SDValue OppShift,
5890 SDValue ExtractFrom, SDValue &Mask,
5890 SDValue ExtractFrom, SDValue &Mask,
5900 SDValue OppShiftLHS = OppShift.getOperand(0);
5991 SDValue NewShiftNode = DAG.getConstant(NeededShiftAmt, DL, ShiftVT);
6004 static bool matchRotateSub(SDValue Pos, SDValue Neg, unsigned EltSize,
6004 static bool matchRotateSub(SDValue Pos, SDValue Neg, unsigned EltSize,
6056 SDValue NegOp1 = Neg.getOperand(1);
6112 SDValue DAGCombiner::MatchRotatePosNeg(SDValue Shifted, SDValue Pos,
6112 SDValue DAGCombiner::MatchRotatePosNeg(SDValue Shifted, SDValue Pos,
6112 SDValue DAGCombiner::MatchRotatePosNeg(SDValue Shifted, SDValue Pos,
6113 SDValue Neg, SDValue InnerPos,
6113 SDValue Neg, SDValue InnerPos,
6114 SDValue InnerNeg, unsigned PosOpcode,
6136 SDValue DAGCombiner::MatchRotate(SDValue LHS, SDValue RHS, const SDLoc &DL) {
6136 SDValue DAGCombiner::MatchRotate(SDValue LHS, SDValue RHS, const SDLoc &DL) {
6136 SDValue DAGCombiner::MatchRotate(SDValue LHS, SDValue RHS, const SDLoc &DL) {
6152 if (SDValue Rot = MatchRotate(LHS.getOperand(0), RHS.getOperand(0), DL)) {
6158 SDValue LHSShift; // The shift.
6159 SDValue LHSMask; // AND value if any.
6162 SDValue RHSShift; // The shift.
6163 SDValue RHSMask; // AND value if any.
6180 if (SDValue NewRHSShift =
6185 if (SDValue NewLHSShift =
6209 SDValue LHSShiftArg = LHSShift.getOperand(0);
6210 SDValue LHSShiftAmt = LHSShift.getOperand(1);
6211 SDValue RHSShiftArg = RHSShift.getOperand(0);
6212 SDValue RHSShiftAmt = RHSShift.getOperand(1);
6221 SDValue Rot = DAG.getNode(HasROTL ? ISD::ROTL : ISD::ROTR, DL, VT,
6226 SDValue AllOnes = DAG.getAllOnesConstant(DL, VT);
6227 SDValue Mask = AllOnes;
6230 SDValue RHSBits = DAG.getNode(ISD::SRL, DL, VT, AllOnes, RHSShiftAmt);
6235 SDValue LHSBits = DAG.getNode(ISD::SHL, DL, VT, AllOnes, LHSShiftAmt);
6252 SDValue LExtOp0 = LHSShiftAmt;
6253 SDValue RExtOp0 = RHSShiftAmt;
6266 SDValue TryL = MatchRotatePosNeg(LHSShiftArg, LHSShiftAmt, RHSShiftAmt,
6271 SDValue TryR = MatchRotatePosNeg(RHSShiftArg, RHSShiftAmt, LHSShiftAmt,
6324 calculateByteProvider(SDValue Op, unsigned Index, unsigned Depth,
6374 SDValue NarrowOp = Op->getOperand(0);
6442 static SDValue stripTruncAndExt(SDValue Value) {
6442 static SDValue stripTruncAndExt(SDValue Value) {
6475 SDValue DAGCombiner::MatchStoreCombine(StoreSDNode *N) {
6477 SDValue Chain;
6501 SDValue CombinedValue;
6509 SDValue Trunc = Store->getValue();
6515 SDValue Value = Trunc.getOperand(0);
6609 SDValue NewStore =
6648 SDValue DAGCombiner::MatchLoadCombine(SDNode *N) {
6678 SDValue Chain;
6699 SDValue LChain = L->getChain();
6763 SDValue NewLoad =
6787 SDValue DAGCombiner::unfoldMaskedMerge(SDNode *N) {
6798 SDValue X, Y, M;
6802 SDValue Xor = And.getOperand(XorIdx);
6805 SDValue Xor0 = Xor.getOperand(0);
6806 SDValue Xor1 = Xor.getOperand(1);
6820 SDValue N0 = N->getOperand(0);
6821 SDValue N1 = N->getOperand(1);
6842 SDValue NotX = DAG.getNOT(DL, X, VT);
6843 SDValue LHS = DAG.getNode(ISD::AND, DL, VT, NotX, M);
6844 SDValue NotLHS = DAG.getNOT(DL, LHS, VT);
6845 SDValue RHS = DAG.getNode(ISD::OR, DL, VT, M, Y);
6849 SDValue LHS = DAG.getNode(ISD::AND, DL, VT, X, M);
6850 SDValue NotM = DAG.getNOT(DL, M, VT);
6851 SDValue RHS = DAG.getNode(ISD::AND, DL, VT, Y, NotM);
6856 SDValue DAGCombiner::visitXOR(SDNode *N) {
6857 SDValue N0 = N->getOperand(0);
6858 SDValue N1 = N->getOperand(1);
6863 if (SDValue FoldedVOp = SimplifyVBinOp(N))
6895 if (SDValue NewSel = foldBinOpIntoSelect(N))
6899 if (SDValue RXOR = reassociateOps(ISD::XOR, DL, N0, N1, N->getFlags()))
6904 SDValue LHS, RHS, CC;
6925 SDValue V = N0.getOperand(0);
6936 SDValue N00 = N0.getOperand(0), N01 = N0.getOperand(1);
6948 SDValue N00 = N0.getOperand(0), N01 = N0.getOperand(1);
6969 SDValue X = N0.getOperand(0);
6970 SDValue NotX = DAG.getNOT(SDLoc(X), X, VT);
6990 SDValue Not = DAG.getNOT(DL, N0.getOperand(0), VT);
6999 SDValue A = N0Opcode == ISD::ADD ? N0 : N1;
7000 SDValue S = N0Opcode == ISD::SRA ? N0 : N1;
7002 SDValue A0 = A.getOperand(0), A1 = A.getOperand(1);
7003 SDValue S0 = S.getOperand(0);
7043 if (SDValue V = hoistLogicOpWithSameOpcodeHands(N))
7047 if (SDValue MM = unfoldMaskedMerge(N))
7061 static SDValue combineShiftOfShiftedLogic(SDNode *Shift, SelectionDAG &DAG) {
7063 SDValue LogicOp = Shift->getOperand(0);
7074 SDValue C1 = Shift->getOperand(1);
7104 SDValue X, Y;
7117 SDValue ShiftSumC = DAG.getConstant(*C0Val + C1Val, DL, ShiftAmtVT);
7118 SDValue NewShift1 = DAG.getNode(ShiftOpcode, DL, VT, X, ShiftSumC);
7119 SDValue NewShift2 = DAG.getNode(ShiftOpcode, DL, VT, Y, C1);
7129 SDValue DAGCombiner::visitShiftByConstant(SDNode *N) {
7137 SDValue LHS = N->getOperand(0);
7146 if (SDValue R = combineShiftOfShiftedLogic(N, DAG))
7174 SDValue BinOpLHSVal = LHS.getOperand(0);
7191 SDValue NewRHS = DAG.getNode(N->getOpcode(), DL, VT, LHS.getOperand(1),
7195 SDValue NewShift = DAG.getNode(N->getOpcode(), DL, VT, LHS.getOperand(0),
7200 SDValue DAGCombiner::distributeTruncateThroughAnd(SDNode *N) {
7208 SDValue N01 = N->getOperand(0).getOperand(1);
7211 SDValue N00 = N->getOperand(0).getOperand(0);
7212 SDValue Trunc00 = DAG.getNode(ISD::TRUNCATE, DL, TruncVT, N00);
7213 SDValue Trunc01 = DAG.getNode(ISD::TRUNCATE, DL, TruncVT, N01);
7223 SDValue DAGCombiner::visitRotate(SDNode *N) {
7225 SDValue N0 = N->getOperand(0);
7226 SDValue N1 = N->getOperand(1);
7254 if (SDValue NewOp1 = distributeTruncateThroughAnd(N1.getNode()))
7267 if (SDValue CombinedShift =
7269 SDValue BitsizeC = DAG.getConstant(Bitsize, dl, ShiftVT);
7270 SDValue CombinedShiftNorm = DAG.FoldConstantArithmetic(
7281 SDValue DAGCombiner::visitSHL(SDNode *N) {
7282 SDValue N0 = N->getOperand(0);
7283 SDValue N1 = N->getOperand(1);
7284 if (SDValue V = DAG.simplifyShift(N0, N1))
7293 if (SDValue FoldedVOp = SimplifyVBinOp(N))
7301 SDValue N00 = N0->getOperand(0);
7302 SDValue N01 = N0->getOperand(1);
7308 if (SDValue C = DAG.FoldConstantArithmetic(ISD::SHL, SDLoc(N), VT,
7324 if (SDValue NewSel = foldBinOpIntoSelect(N))
7335 if (SDValue NewOp1 = distributeTruncateThroughAnd(N1.getNode()))
7364 SDValue Sum = DAG.getNode(ISD::ADD, DL, ShiftVT, N1, N0.getOperand(1));
7378 SDValue N0Op0 = N0.getOperand(0);
7379 SDValue InnerShiftAmt = N0Op0.getOperand(1);
7408 SDValue Ext = DAG.getNode(N0.getOpcode(), DL, VT, N0Op0.getOperand(0));
7409 SDValue Sum = DAG.getZExtOrTrunc(InnerShiftAmt, DL, ShiftVT);
7420 SDValue N0Op0 = N0.getOperand(0);
7421 SDValue InnerShiftAmt = N0Op0.getOperand(1);
7434 SDValue NewSHL = DAG.getZExtOrTrunc(N1, DL, InnerShiftAmtVT);
7471 SDValue Shift;
7494 SDValue AllBits = DAG.getAllOnesConstant(DL, VT);
7495 SDValue HiBitsMask = DAG.getNode(ISD::SHL, DL, VT, AllBits, N1);
7508 SDValue Shl0 = DAG.getNode(ISD::SHL, SDLoc(N0), VT, N0.getOperand(0), N1);
7509 SDValue Shl1 = DAG.getNode(ISD::SHL, SDLoc(N1), VT, N0.getOperand(1), N1);
7519 SDValue Shl = DAG.getNode(ISD::SHL, SDLoc(N1), VT, N0.getOperand(1), N1);
7525 if (SDValue NewSHL = visitShiftByConstant(N))
7531 SDValue DAGCombiner::visitSRA(SDNode *N) {
7532 SDValue N0 = N->getOperand(0);
7533 SDValue N1 = N->getOperand(1);
7534 if (SDValue V = DAG.simplifyShift(N0, N1))
7548 if (SDValue FoldedVOp = SimplifyVBinOp(N))
7559 if (SDValue NewSel = foldBinOpIntoSelect(N))
7582 SmallVector<SDValue, 16> ShiftValues;
7595 SDValue ShiftValue;
7632 SDValue Amt = DAG.getConstant(ShiftAmt, DL,
7634 SDValue Shift = DAG.getNode(ISD::SRL, DL, VT,
7636 SDValue Trunc = DAG.getNode(ISD::TRUNCATE, DL, TruncVT,
7651 SDValue Shl = N0.getOperand(0);
7666 SDValue Trunc = DAG.getZExtOrTrunc(Shl.getOperand(0), DL, TruncVT);
7667 SDValue ShiftC = DAG.getConstant(AddC->getAPIntValue().lshr(ShiftAmt).
7669 SDValue Add = DAG.getNode(ISD::ADD, DL, TruncVT, Trunc, ShiftC);
7678 if (SDValue NewOp1 = distributeTruncateThroughAnd(N1.getNode()))
7691 SDValue N0Op0 = N0.getOperand(0);
7697 SDValue Amt = DAG.getConstant(N1C->getZExtValue() + TruncBits, DL,
7699 SDValue SRA =
7716 if (SDValue NewSRA = visitShiftByConstant(N))
7722 SDValue DAGCombiner::visitSRL(SDNode *N) {
7723 SDValue N0 = N->getOperand(0);
7724 SDValue N1 = N->getOperand(1);
7725 if (SDValue V = DAG.simplifyShift(N0, N1))
7733 if (SDValue FoldedVOp = SimplifyVBinOp(N))
7744 if (SDValue NewSel = foldBinOpIntoSelect(N))
7774 SDValue Sum = DAG.getNode(ISD::ADD, DL, ShiftVT, N1, N0.getOperand(1));
7808 SDValue Mask =
7826 SDValue SmallShift = DAG.getNode(ISD::SRL, DL0, SmallVT,
7867 SDValue Op = N0.getOperand(0);
7886 if (SDValue NewOp1 = distributeTruncateThroughAnd(N1.getNode()))
7897 if (SDValue NewSRL = visitShiftByConstant(N))
7901 if (SDValue NarrowLoad = ReduceLoadWidth(N))
7936 SDValue DAGCombiner::visitFunnelShift(SDNode *N) {
7938 SDValue N0 = N->getOperand(0);
7939 SDValue N1 = N->getOperand(1);
7940 SDValue N2 = N->getOperand(2);
8011 SDValue DAGCombiner::visitABS(SDNode *N) {
8012 SDValue N0 = N->getOperand(0);
8027 SDValue DAGCombiner::visitBSWAP(SDNode *N) {
8028 SDValue N0 = N->getOperand(0);
8040 SDValue DAGCombiner::visitBITREVERSE(SDNode *N) {
8041 SDValue N0 = N->getOperand(0);
8053 SDValue DAGCombiner::visitCTLZ(SDNode *N) {
8054 SDValue N0 = N->getOperand(0);
8070 SDValue DAGCombiner::visitCTLZ_ZERO_UNDEF(SDNode *N) {
8071 SDValue N0 = N->getOperand(0);
8080 SDValue DAGCombiner::visitCTTZ(SDNode *N) {
8081 SDValue N0 = N->getOperand(0);
8097 SDValue DAGCombiner::visitCTTZ_ZERO_UNDEF(SDNode *N) {
8098 SDValue N0 = N->getOperand(0);
8107 SDValue DAGCombiner::visitCTPOP(SDNode *N) {
8108 SDValue N0 = N->getOperand(0);
8119 static bool isLegalToCombineMinNumMaxNum(SelectionDAG &DAG, SDValue LHS,
8120 SDValue RHS,
8131 static SDValue combineMinNumMaxNum(const SDLoc &DL, EVT VT, SDValue LHS,
8131 static SDValue combineMinNumMaxNum(const SDLoc &DL, EVT VT, SDValue LHS,
8132 SDValue RHS, SDValue True, SDValue False,
8132 SDValue RHS, SDValue True, SDValue False,
8132 SDValue RHS, SDValue True, SDValue False,
8180 static SDValue foldSelectOfConstantsUsingSra(SDNode *N, SelectionDAG &DAG) {
8181 SDValue Cond = N->getOperand(0);
8182 SDValue C1 = N->getOperand(1);
8183 SDValue C2 = N->getOperand(2);
8194 SDValue X = Cond.getOperand(0);
8195 SDValue CondC = Cond.getOperand(1);
8201 SDValue ShAmtC = DAG.getConstant(X.getScalarValueSizeInBits() - 1, DL, VT);
8202 SDValue Sra = DAG.getNode(ISD::SRA, DL, VT, X, ShAmtC);
8208 SDValue ShAmtC = DAG.getConstant(X.getScalarValueSizeInBits() - 1, DL, VT);
8209 SDValue Sra = DAG.getNode(ISD::SRA, DL, VT, X, ShAmtC);
8215 SDValue DAGCombiner::foldSelectOfConstants(SDNode *N) {
8216 SDValue Cond = N->getOperand(0);
8217 SDValue N1 = N->getOperand(1);
8218 SDValue N2 = N->getOperand(2);
8238 SDValue NotCond = DAG.getNOT(DL, Cond, MVT::i1);
8245 SDValue NotCond = DAG.getNOT(DL, Cond, MVT::i1);
8287 SDValue ShAmtC = DAG.getConstant(C1Val.exactLogBase2(), DL, VT);
8291 if (SDValue V = foldSelectOfConstantsUsingSra(N, DAG))
8313 SDValue NotCond =
8323 SDValue DAGCombiner::visitSELECT(SDNode *N) {
8324 SDValue N0 = N->getOperand(0);
8325 SDValue N1 = N->getOperand(1);
8326 SDValue N2 = N->getOperand(2);
8332 if (SDValue V = DAG.simplifySelect(N0, N1, N2))
8340 if (SDValue V = foldSelectOfConstants(N))
8345 SDValue NOTNode = DAG.getNOT(SDLoc(N0), N0, VT);
8351 SDValue NOTNode = DAG.getNOT(SDLoc(N0), N0, VT);
8378 SDValue Cond0 = N0->getOperand(0);
8379 SDValue Cond1 = N0->getOperand(1);
8380 SDValue InnerSelect =
8391 SDValue Cond0 = N0->getOperand(0);
8392 SDValue Cond1 = N0->getOperand(1);
8393 SDValue InnerSelect = DAG.getNode(ISD::SELECT, DL, N1.getValueType(),
8405 SDValue N1_0 = N1->getOperand(0);
8406 SDValue N1_1 = N1->getOperand(1);
8407 SDValue N1_2 = N1->getOperand(2);
8411 SDValue And = DAG.getNode(ISD::AND, DL, N0.getValueType(), N0, N1_0);
8416 if (SDValue Combined = visitANDLike(N0, N1_0, N)) {
8424 SDValue N2_0 = N2->getOperand(0);
8425 SDValue N2_1 = N2->getOperand(1);
8426 SDValue N2_2 = N2->getOperand(2);
8430 SDValue Or = DAG.getNode(ISD::OR, DL, N0.getValueType(), N0, N2_0);
8435 if (SDValue Combined = visitORLike(N0, N2_0, N))
8443 if (SDValue F = extractBooleanFlip(N0, DAG, TLI, false)) {
8444 SDValue SelectOp = DAG.getSelect(DL, VT, F, N2, N1);
8451 SDValue Cond0 = N0.getOperand(0), Cond1 = N0.getOperand(1);
8459 if (SDValue FMinMax = combineMinNumMaxNum(DL, VT, Cond0, Cond1, N1, N2,
8487 SDValue UAO = DAG.getNode(ISD::UADDO, DL, VTs, Cond0, N2.getOperand(1));
8498 SDValue SelectNode = DAG.getNode(ISD::SELECT_CC, DL, VT, Cond0, Cond1, N1,
8512 static SDValue ConvertSelectToConcatVector(SDNode *N, SelectionDAG &DAG) {
8514 SDValue Cond = N->getOperand(0);
8515 SDValue LHS = N->getOperand(1);
8516 SDValue RHS = N->getOperand(2);
8565 SDValue DAGCombiner::visitMSCATTER(SDNode *N) {
8567 SDValue Mask = MSC->getMask();
8568 SDValue Chain = MSC->getChain();
8578 SDValue DAGCombiner::visitMSTORE(SDNode *N) {
8580 SDValue Mask = MST->getMask();
8581 SDValue Chain = MST->getChain();
8591 SDValue DAGCombiner::visitMGATHER(SDNode *N) {
8593 SDValue Mask = MGT->getMask();
8603 SDValue DAGCombiner::visitMLOAD(SDNode *N) {
8605 SDValue Mask = MLD->getMask();
8617 SDValue DAGCombiner::foldVSelectOfConstants(SDNode *N) {
8618 SDValue Cond = N->getOperand(0);
8619 SDValue N1 = N->getOperand(1);
8620 SDValue N2 = N->getOperand(2);
8635 SDValue N1Elt = N1.getOperand(i);
8636 SDValue N2Elt = N2.getOperand(i);
8655 SDValue ExtendedCond = DAG.getNode(ExtendOpcode, DL, VT, Cond);
8663 SDValue ZextCond = DAG.getZExtOrTrunc(Cond, DL, VT);
8664 SDValue ShAmtC = DAG.getConstant(Pow2C.exactLogBase2(), DL, VT);
8668 if (SDValue V = foldSelectOfConstantsUsingSra(N, DAG))
8678 SDValue DAGCombiner::visitVSELECT(SDNode *N) {
8679 SDValue N0 = N->getOperand(0);
8680 SDValue N1 = N->getOperand(1);
8681 SDValue N2 = N->getOperand(2);
8685 if (SDValue V = DAG.simplifySelect(N0, N1, N2))
8689 if (SDValue F = extractBooleanFlip(N0, DAG, TLI, false))
8698 SDValue LHS = N0.getOperand(0), RHS = N0.getOperand(1);
8715 SDValue Shift = DAG.getNode(ISD::SRA, DL, VT, LHS,
8718 SDValue Add = DAG.getNode(ISD::ADD, DL, VT, LHS, Shift);
8731 if (SDValue FMinMax =
8758 SDValue WideLHS = DAG.getNode(ExtOpcode, DL, WideVT, LHS);
8759 SDValue WideRHS = DAG.getNode(ExtOpcode, DL, WideVT, RHS);
8761 SDValue WideSetCC = DAG.getSetCC(DL, WideSetCCVT, WideLHS, WideRHS, CC);
8783 if (SDValue CV = ConvertSelectToConcatVector(N, DAG))
8787 if (SDValue V = foldVSelectOfConstants(N))
8793 SDValue DAGCombiner::visitSELECT_CC(SDNode *N) {
8794 SDValue N0 = N->getOperand(0);
8795 SDValue N1 = N->getOperand(1);
8796 SDValue N2 = N->getOperand(2);
8797 SDValue N3 = N->getOperand(3);
8798 SDValue N4 = N->getOperand(4);
8806 if (SDValue SCC = SimplifySetCC(getSetCCResultType(N0.getValueType()), N0, N1,
8821 SDValue SelectOp = DAG.getNode(
8837 SDValue DAGCombiner::visitSETCC(SDNode *N) {
8844 SDValue Combined = SimplifySetCC(
8854 SDValue NewSetCC = rebuildSetCC(Combined);
8867 SDValue DAGCombiner::visitSETCCCARRY(SDNode *N) {
8868 SDValue LHS = N->getOperand(0);
8869 SDValue RHS = N->getOperand(1);
8870 SDValue Carry = N->getOperand(2);
8871 SDValue Cond = N->getOperand(3);
8886 static SDValue tryToFoldExtendOfConstant(SDNode *N, const TargetLowering &TLI,
8889 SDValue N0 = N->getOperand(0);
8908 SDValue Op1 = N0->getOperand(1);
8909 SDValue Op2 = N0->getOperand(2);
8941 SmallVector<SDValue, 8> Elts;
8950 SDValue Op = N0.getOperand(i);
8973 static bool ExtendUsesToFormExtLoad(EVT VT, SDNode *N, SDValue N0,
8995 SDValue UseOp = User->getOperand(i);
9034 SDValue OrigLoad, SDValue ExtLoad,
9034 SDValue OrigLoad, SDValue ExtLoad,
9039 SmallVector<SDValue, 4> Ops;
9042 SDValue SOp = SetCC->getOperand(j);
9055 SDValue DAGCombiner::CombineExtLoad(SDNode *N) {
9056 SDValue N0 = N->getOperand(0);
9117 SmallVector<SDValue, 4> Loads;
9118 SmallVector<SDValue, 4> Chains;
9120 SDValue BasePtr = LN0->getBasePtr();
9125 SDValue SplitLoad = DAG.getExtLoad(
9137 SDValue NewChain = DAG.getNode(ISD::TokenFactor, DL, MVT::Other, Chains);
9138 SDValue NewValue = DAG.getNode(ISD::CONCAT_VECTORS, DL, DstVT, Loads);
9147 SDValue Trunc =
9156 SDValue DAGCombiner::CombineZExtLogicopShiftLoad(SDNode *N) {
9164 SDValue N0 = N->getOperand(0);
9172 SDValue N1 = N0->getOperand(0);
9202 SDValue ExtLoad = DAG.getExtLoad(ISD::ZEXTLOAD, SDLoc(Load), VT,
9207 SDValue Shift = DAG.getNode(N1.getOpcode(), DL1, VT, ExtLoad,
9213 SDValue And = DAG.getNode(N0.getOpcode(), DL0, VT, Shift,
9221 SDValue Trunc = DAG.getNode(ISD::TRUNCATE, SDLoc(Load),
9236 SDValue DAGCombiner::matchVSelectOpSizesWithSetCC(SDNode *Cast) {
9250 SDValue VSel = Cast->getOperand(0);
9256 SDValue SetCC = VSel.getOperand(0);
9262 SDValue A = VSel.getOperand(1);
9263 SDValue B = VSel.getOperand(2);
9264 SDValue CastA, CastB;
9279 static SDValue tryToFoldExtOfExtload(SelectionDAG &DAG, DAGCombiner &Combiner,
9282 SDValue N0, ISD::LoadExtType ExtLoadType) {
9297 SDValue ExtLoad =
9310 static SDValue tryToFoldExtOfLoad(SelectionDAG &DAG, DAGCombiner &Combiner,
9312 bool LegalOperations, SDNode *N, SDValue N0,
9332 SDValue ExtLoad = DAG.getExtLoad(ExtLoadType, SDLoc(LN0), VT, LN0->getChain(),
9343 SDValue Trunc =
9350 static SDValue tryToFoldExtOfMaskedLoad(SelectionDAG &DAG,
9352 SDNode *N, SDValue N0,
9369 SDValue PassThru = DAG.getNode(ExtOpc, dl, VT, Ld->getPassThru());
9370 SDValue NewLoad = DAG.getMaskedLoad(VT, dl, Ld->getChain(),
9379 static SDValue foldExtendedSignBitTest(SDNode *N, SelectionDAG &DAG,
9384 SDValue SetCC = N->getOperand(0);
9389 SDValue X = SetCC.getOperand(0);
9390 SDValue Ones = SetCC.getOperand(1);
9402 SDValue NotX = DAG.getNOT(DL, X, VT);
9403 SDValue ShiftAmount = DAG.getConstant(VT.getSizeInBits() - 1, DL, VT);
9410 SDValue DAGCombiner::visitSIGN_EXTEND(SDNode *N) {
9411 SDValue N0 = N->getOperand(0);
9415 if (SDValue Res = tryToFoldExtendOfConstant(N, TLI, DAG, LegalTypes))
9426 if (SDValue NarrowLoad = ReduceLoadWidth(N0.getNode())) {
9438 SDValue Op = N0.getOperand(0);
9474 if (SDValue foldedExt =
9479 if (SDValue foldedExt =
9486 if (SDValue ExtLoad = CombineExtLoad(N))
9490 if (SDValue foldedExt = tryToFoldExtOfExtload(
9509 SDValue ExtLoad = DAG.getExtLoad(ISD::SEXTLOAD, SDLoc(LN00), VT,
9515 SDValue And = DAG.getNode(N0.getOpcode(), DL, VT,
9523 SDValue TruncAnd =
9530 SDValue Trunc = DAG.getNode(ISD::TRUNCATE, SDLoc(LN00),
9539 if (SDValue V = foldExtendedSignBitTest(N, DAG, LegalOperations))
9543 SDValue N00 = N0.getOperand(0);
9544 SDValue N01 = N0.getOperand(1);
9573 SDValue VsetCC = DAG.getSetCC(DL, MatchingVecType, N00, N01, CC);
9591 SDValue ExtTrueVal = (SetCCWidth == 1)
9594 SDValue Zero = DAG.getConstant(0, DL, VT);
9595 if (SDValue SCC =
9607 SDValue SetCC = DAG.getSetCC(DL, SetCCVT, N00, N01, CC);
9618 if (SDValue NewVSel = matchVSelectOpSizesWithSetCC(N))
9627 SDValue Zext = DAG.getZExtOrTrunc(N0.getOperand(1).getOperand(0), DL, VT);
9636 SDValue Zext = DAG.getZExtOrTrunc(N0.getOperand(0).getOperand(0), DL, VT);
9647 static bool isTruncateOf(SelectionDAG &DAG, SDValue N, SDValue &Op,
9647 static bool isTruncateOf(SelectionDAG &DAG, SDValue N, SDValue &Op,
9660 SDValue Op0 = N->getOperand(0);
9661 SDValue Op1 = N->getOperand(1);
9679 static SDValue widenCtPop(SDNode *Extend, SelectionDAG &DAG) {
9683 SDValue CtPop = Extend->getOperand(0);
9695 SDValue NewZext = DAG.getZExtOrTrunc(CtPop.getOperand(0), DL, VT);
9699 SDValue DAGCombiner::visitZERO_EXTEND(SDNode *N) {
9700 SDValue N0 = N->getOperand(0);
9703 if (SDValue Res = tryToFoldExtendOfConstant(N, TLI, DAG, LegalTypes))
9715 SDValue Op;
9733 if (SDValue NarrowLoad = ReduceLoadWidth(N0.getNode())) {
9751 SDValue Op = N0.getOperand(0);
9754 SDValue ZExtOrTrunc = DAG.getZExtOrTrunc(Op, SDLoc(N), VT);
9762 SDValue Op = DAG.getAnyExtOrTrunc(N0.getOperand(0), SDLoc(N), VT);
9764 SDValue And = DAG.getZeroExtendInReg(Op, SDLoc(N), MinVT.getScalarType());
9780 SDValue X = N0.getOperand(0).getOperand(0);
9790 if (SDValue foldedExt =
9795 if (SDValue foldedExt =
9802 if (SDValue ExtLoad = CombineExtLoad(N))
9833 SDValue ExtLoad = DAG.getExtLoad(ISD::ZEXTLOAD, SDLoc(LN00), VT,
9840 SDValue And = DAG.getNode(N0.getOpcode(), DL, VT,
9848 SDValue TruncAnd =
9855 SDValue Trunc = DAG.getNode(ISD::TRUNCATE, SDLoc(LN00),
9866 if (SDValue ZExtLoad = CombineZExtLogicopShiftLoad(N))
9870 if (SDValue foldedExt = tryToFoldExtOfExtload(
9874 if (SDValue V = foldExtendedSignBitTest(N, DAG, LegalOperations))
9891 SDValue VecOnes = DAG.getConstant(1, DL, VT);
9894 SDValue VSetCC = DAG.getNode(ISD::SETCC, DL, VT, N0.getOperand(0),
9903 SDValue VsetCC =
9912 if (SDValue SCC = SimplifySelectCC(
9924 SDValue ShAmt = N0.getOperand(1);
9926 SDValue InnerZExt = N0.getOperand(0);
9946 if (SDValue NewVSel = matchVSelectOpSizesWithSetCC(N))
9949 if (SDValue NewCtPop = widenCtPop(N, DAG))
9955 SDValue DAGCombiner::visitANY_EXTEND(SDNode *N) {
9956 SDValue N0 = N->getOperand(0);
9959 if (SDValue Res = tryToFoldExtendOfConstant(N, TLI, DAG, LegalTypes))
9973 if (SDValue NarrowLoad = ReduceLoadWidth(N0.getNode())) {
9996 SDValue X = N0.getOperand(0).getOperand(0);
10018 SDValue ExtLoad = DAG.getExtLoad(ISD::EXTLOAD, SDLoc(N), VT,
10030 SDValue Trunc = DAG.getNode(ISD::TRUNCATE, SDLoc(N0),
10047 SDValue ExtLoad = DAG.getExtLoad(ExtType, SDLoc(N),
10082 SDValue VsetCC =
10091 if (SDValue SCC = SimplifySelectCC(
10098 if (SDValue NewCtPop = widenCtPop(N, DAG))
10104 SDValue DAGCombiner::visitAssertExt(SDNode *N) {
10106 SDValue N0 = N->getOperand(0);
10107 SDValue N1 = N->getOperand(1);
10122 SDValue BigA = N0.getOperand(0);
10130 SDValue MinAssertVTVal = DAG.getValueType(MinAssertVT);
10131 SDValue NewAssert = DAG.getNode(Opcode, DL, BigA.getValueType(),
10142 SDValue BigA = N0.getOperand(0);
10150 SDValue NewAssert = DAG.getNode(Opcode, DL, BigA.getValueType(),
10165 SDValue DAGCombiner::ReduceLoadWidth(SDNode *N) {
10169 SDValue N0 = N->getOperand(0);
10226 SDValue SRL = N0;
10314 SDValue NewPtr = DAG.getNode(ISD::ADD, DL,
10320 SDValue Load;
10336 SDValue Result = Load;
10362 SDValue ShiftC = DAG.getConstant(ShAmt, DL, VT);
10371 SDValue DAGCombiner::visitSIGN_EXTEND_INREG(SDNode *N) {
10372 SDValue N0 = N->getOperand(0);
10373 SDValue N1 = N->getOperand(1);
10401 SDValue N00 = N0.getOperand(0);
10423 SDValue N00 = N0.getOperand(0);
10440 if (SDValue NarrowLoad = ReduceLoadWidth(N))
10469 SDValue ExtLoad = DAG.getExtLoad(ISD::SEXTLOAD, SDLoc(N), VT,
10485 SDValue ExtLoad = DAG.getExtLoad(ISD::SEXTLOAD, SDLoc(N), VT,
10496 if (SDValue BSwap = MatchBSwapHWordLow(N0.getNode(), N0.getOperand(0),
10505 SDValue DAGCombiner::visitSIGN_EXTEND_VECTOR_INREG(SDNode *N) {
10506 SDValue N0 = N->getOperand(0);
10512 if (SDValue Res = tryToFoldExtendOfConstant(N, TLI, DAG, LegalTypes))
10521 SDValue DAGCombiner::visitZERO_EXTEND_VECTOR_INREG(SDNode *N) {
10522 SDValue N0 = N->getOperand(0);
10528 if (SDValue Res = tryToFoldExtendOfConstant(N, TLI, DAG, LegalTypes))
10537 SDValue DAGCombiner::visitTRUNCATE(SDNode *N) {
10538 SDValue N0 = N->getOperand(0);
10553 SDValue C = DAG.getNode(ISD::TRUNCATE, SDLoc(N), VT, N0);
10599 SDValue EltNo = N0->getOperand(1);
10617 SDValue Cond = N0.getOperand(0);
10618 SDValue TruncOp0 = DAG.getNode(ISD::TRUNCATE, SL, VT, N0.getOperand(1));
10619 SDValue TruncOp1 = DAG.getNode(ISD::TRUNCATE, SL, VT, N0.getOperand(2));
10628 SDValue Amt = N0.getOperand(1);
10635 SDValue Trunc = DAG.getNode(ISD::TRUNCATE, SL, VT, N0.getOperand(0));
10649 SmallVector<SDValue, 8> TruncOps;
10650 for (const SDValue &Op : N0->op_values()) {
10651 SDValue TruncOp = DAG.getNode(ISD::TRUNCATE, DL, SVT, Op);
10665 SDValue BuildVect = N0.getOperand(0);
10679 SmallVector<SDValue, 8> Opnds;
10695 if (SDValue Shorter = DAG.GetDemandedBits(N0, Mask))
10702 if (SDValue Reduced = ReduceLoadWidth(N))
10711 SDValue NewLoad = DAG.getExtLoad(LN0->getExtensionType(), SDLoc(LN0),
10725 SDValue V;
10730 SDValue X = N0.getOperand(i);
10749 SmallVector<SDValue, 8> Opnds;
10755 SDValue NV = DAG.getNode(ISD::TRUNCATE, SDLoc(V), VTs[i], V);
10768 SDValue VecSrc = N0.getOperand(0);
10796 auto X = DAG.getNode(ISD::TRUNCATE, SL, VT, N0.getOperand(0));
10797 auto Y = DAG.getNode(ISD::TRUNCATE, SL, VT, N0.getOperand(1));
10807 SDValue N00 = N0.getOperand(0);
10818 if (SDValue NewVSel = matchVSelectOpSizesWithSetCC(N))
10840 SDValue NarrowL = DAG.getNode(ISD::TRUNCATE, DL, VT, N0.getOperand(0));
10841 SDValue NarrowR = DAG.getNode(ISD::TRUNCATE, DL, VT, N0.getOperand(1));
10851 SDValue Elt = N->getOperand(i);
10859 SDValue DAGCombiner::CombineConsecutiveLoads(SDNode *N, EVT VT) {
10897 static SDValue foldBitcastedFPLogic(SDNode *N, SelectionDAG &DAG,
10907 SDValue N0 = N->getOperand(0);
10935 SDValue LogicOp0 = N0.getOperand(0);
10940 SDValue FPOp = DAG.getNode(FPOpcode, SDLoc(N), VT, LogicOp0.getOperand(0));
10950 SDValue DAGCombiner::visitBITCAST(SDNode *N) {
10951 SDValue N0 = N->getOperand(0);
10982 SDValue C = DAG.getBitcast(VT, N0);
11009 SDValue Load =
11018 if (SDValue V = foldBitcastedFPLogic(N, DAG, TLI))
11037 SDValue NewConv = DAG.getBitcast(VT, N0.getOperand(0));
11043 SDValue SignBit = DAG.getConstant(
11045 SDValue FlipBit;
11051 SDValue Hi =
11059 SDValue FlipBits =
11090 SDValue X = DAG.getBitcast(IntXVT, N0.getOperand(1));
11113 SDValue Cst = DAG.getBitcast(VT, N0.getOperand(0));
11115 SDValue X = DAG.getBitcast(VT, N0.getOperand(1));
11117 SDValue XorResult = DAG.getNode(ISD::XOR, SDLoc(N0), VT, Cst, X);
11119 SDValue XorResult64 = DAG.getNode(
11124 SDValue FlipBit =
11128 SDValue FlipBits =
11138 SDValue Cst = DAG.getBitcast(VT, N0.getOperand(0));
11149 if (SDValue CombineLD = CombineConsecutiveLoads(N0.getNode(), VT))
11177 SDValue SV0 = PeekThroughBitcast(N0->getOperand(0));
11178 SDValue SV1 = PeekThroughBitcast(N0->getOperand(1));
11189 SDValue LegalShuffle =
11198 SDValue DAGCombiner::visitBUILD_PAIR(SDNode *N) {
11205 SDValue DAGCombiner::
11218 SmallVector<SDValue, 8> Ops;
11219 for (SDValue Op : BV->op_values()) {
11261 SmallVector<SDValue, 8> Ops;
11270 SDValue Op = BV->getOperand(i+ (isLE ? (NumInputsPerOutput-j-1) : j));
11293 SmallVector<SDValue, 8> Ops;
11295 for (const SDValue &Op : BV->op_values()) {
11324 SDValue DAGCombiner::visitFADDForFMACombine(SDNode *N) {
11325 SDValue N0 = N->getOperand(0);
11326 SDValue N1 = N->getOperand(1);
11391 SDValue N00 = N0.getOperand(0);
11405 SDValue N10 = N1.getOperand(0);
11457 SDValue N02 = N0.getOperand(2);
11459 SDValue N020 = N02.getOperand(0);
11486 SDValue N00 = N0.getOperand(0);
11488 SDValue N002 = N00.getOperand(2);
11501 SDValue N12 = N1.getOperand(2);
11503 SDValue N120 = N12.getOperand(0);
11519 SDValue N10 = N1.getOperand(0);
11521 SDValue N102 = N10.getOperand(2);
11536 SDValue DAGCombiner::visitFSUBForFMACombine(SDNode *N) {
11537 SDValue N0 = N->getOperand(0);
11538 SDValue N1 = N->getOperand(1);
11599 SDValue N00 = N0.getOperand(0).getOperand(0);
11600 SDValue N01 = N0.getOperand(0).getOperand(1);
11611 SDValue N00 = N0.getOperand(0);
11627 SDValue N10 = N1.getOperand(0);
11647 SDValue N00 = N0.getOperand(0);
11649 SDValue N000 = N00.getOperand(0);
11670 SDValue N00 = N0.getOperand(0);
11672 SDValue N000 = N00.getOperand(0);
11706 SDValue N20 = N1.getOperand(2).getOperand(0);
11707 SDValue N21 = N1.getOperand(2).getOperand(1);
11721 SDValue N02 = N0.getOperand(2);
11723 SDValue N020 = N02.getOperand(0);
11746 SDValue N00 = N0.getOperand(0);
11748 SDValue N002 = N00.getOperand(2);
11771 SDValue N120 = N1.getOperand(2).getOperand(0);
11774 SDValue N1200 = N120.getOperand(0);
11775 SDValue N1201 = N120.getOperand(1);
11797 SDValue CvtSrc = N1.getOperand(0);
11798 SDValue N100 = CvtSrc.getOperand(0);
11799 SDValue N101 = CvtSrc.getOperand(1);
11800 SDValue N102 = CvtSrc.getOperand(2);
11803 SDValue N1020 = N102.getOperand(0);
11804 SDValue N1021 = N102.getOperand(1);
11827 SDValue DAGCombiner::visitFMULForFMADistributiveCombine(SDNode *N) {
11828 SDValue N0 = N->getOperand(0);
11829 SDValue N1 = N->getOperand(1);
11878 if (SDValue FMA = FuseFADD(N0, N1, Flags))
11880 if (SDValue FMA = FuseFADD(N1, N0, Flags))
11911 if (SDValue FMA = FuseFSUB(N0, N1, Flags))
11913 if (SDValue FMA = FuseFSUB(N1, N0, Flags))
11919 SDValue DAGCombiner::visitFADD(SDNode *N) {
11920 SDValue N0 = N->getOperand(0);
11921 SDValue N1 = N->getOperand(1);
11931 if (SDValue FoldedVOp = SimplifyVBinOp(N))
11948 if (SDValue NewSel = foldBinOpIntoSelect(N))
11974 SDValue B = N0.getOperand(0);
11975 SDValue Add = DAG.getNode(ISD::FADD, DL, VT, B, B, Flags);
11980 SDValue B = N1.getOperand(0);
11981 SDValue Add = DAG.getNode(ISD::FADD, DL, VT, B, B, Flags);
12009 SDValue NewC = DAG.getNode(ISD::FADD, DL, VT, N0.getOperand(1), N1, Flags);
12023 SDValue NewCFP = DAG.getNode(ISD::FADD, DL, VT, N0.getOperand(1),
12032 SDValue NewCFP = DAG.getNode(ISD::FADD, DL, VT, N0.getOperand(1),
12044 SDValue NewCFP = DAG.getNode(ISD::FADD, DL, VT, N1.getOperand(1),
12053 SDValue NewCFP = DAG.getNode(ISD::FADD, DL, VT, N1.getOperand(1),
12091 if (SDValue Fused = visitFADDForFMACombine(N)) {
12098 SDValue DAGCombiner::visitFSUB(SDNode *N) {
12099 SDValue N0 = N->getOperand(0);
12100 SDValue N1 = N->getOperand(1);
12110 if (SDValue FoldedVOp = SimplifyVBinOp(N))
12117 if (SDValue NewSel = foldBinOpIntoSelect(N))
12167 if (SDValue Fused = visitFSUBForFMACombine(N)) {
12177 bool DAGCombiner::isCheaperToUseNegatedFPOps(SDValue X, SDValue Y) {
12177 bool DAGCombiner::isCheaperToUseNegatedFPOps(SDValue X, SDValue Y) {
12190 SDValue DAGCombiner::visitFMUL(SDNode *N) {
12191 SDValue N0 = N->getOperand(0);
12192 SDValue N1 = N->getOperand(1);
12203 if (SDValue FoldedVOp = SimplifyVBinOp(N))
12216 if (SDValue NewSel = foldBinOpIntoSelect(N))
12230 SDValue N00 = N0.getOperand(0);
12231 SDValue N01 = N0.getOperand(1);
12236 SDValue MulConsts = DAG.getNode(ISD::FMUL, DL, VT, N01, N1, Flags);
12245 const SDValue Two = DAG.getConstantFP(2.0, DL, VT);
12246 SDValue MulConsts = DAG.getNode(ISD::FMUL, DL, VT, Two, N1, Flags);
12262 SDValue NegN0 =
12264 SDValue NegN1 =
12274 SDValue Select = N0, X = N1;
12278 SDValue Cond = Select.getOperand(0);
12316 if (SDValue Fused = visitFMULForFMADistributiveCombine(N)) {
12324 SDValue DAGCombiner::visitFMA(SDNode *N) {
12325 SDValue N0 = N->getOperand(0);
12326 SDValue N1 = N->getOperand(1);
12327 SDValue N2 = N->getOperand(2);
12347 SDValue NegN0 =
12349 SDValue NegN1 =
12402 SDValue RHSNeg = DAG.getNode(ISD::FNEG, DL, VT, N0);
12446 SDValue DAGCombiner::combineRepeatedFPDivisors(SDNode *N) {
12456 SDValue N0 = N->getOperand(0);
12463 SDValue N1 = N->getOperand(1);
12494 SDValue FPOne = DAG.getConstantFP(1.0, DL, VT);
12495 SDValue Reciprocal = DAG.getNode(ISD::FDIV, DL, VT, FPOne, N1, Flags);
12499 SDValue Dividend = U->getOperand(0);
12501 SDValue NewNode = DAG.getNode(ISD::FMUL, SDLoc(U), VT, Dividend,
12513 SDValue DAGCombiner::visitFDIV(SDNode *N) {
12514 SDValue N0 = N->getOperand(0);
12515 SDValue N1 = N->getOperand(1);
12525 if (SDValue FoldedVOp = SimplifyVBinOp(N))
12532 if (SDValue NewSel = foldBinOpIntoSelect(N))
12535 if (SDValue V = combineRepeatedFPDivisors(N))
12561 if (SDValue RV = buildRsqrtEstimate(N1.getOperand(0), Flags))
12565 if (SDValue RV = buildRsqrtEstimate(N1.getOperand(0).getOperand(0),
12573 if (SDValue RV = buildRsqrtEstimate(N1.getOperand(0).getOperand(0),
12582 SDValue SqrtOp;
12583 SDValue OtherOp;
12594 if (SDValue RV = buildRsqrtEstimate(SqrtOp.getOperand(0), Flags)) {
12603 if (SDValue RV = BuildDivEstimate(N0, N1, Flags))
12617 SDValue DAGCombiner::visitFREM(SDNode *N) {
12618 SDValue N0 = N->getOperand(0);
12619 SDValue N1 = N->getOperand(1);
12628 if (SDValue NewSel = foldBinOpIntoSelect(N))
12634 SDValue DAGCombiner::visitFSQRT(SDNode *N) {
12640 SDValue N0 = N->getOperand(0);
12651 SDValue N1 = N->getOperand(1);
12665 SDValue DAGCombiner::visitFCOPYSIGN(SDNode *N) {
12666 SDValue N0 = N->getOperand(0);
12667 SDValue N1 = N->getOperand(1);
12712 SDValue DAGCombiner::visitFPOW(SDNode *N) {
12777 SDValue Sqrt = DAG.getNode(ISD::FSQRT, DL, VT, N->getOperand(0), Flags);
12778 SDValue SqrtSqrt = DAG.getNode(ISD::FSQRT, DL, VT, Sqrt, Flags);
12788 static SDValue foldFPToIntToFP(SDNode *N, SelectionDAG &DAG,
12811 SDValue N0 = N->getOperand(0);
12823 SDValue DAGCombiner::visitSINT_TO_FP(SDNode *N) {
12824 SDValue N0 = N->getOperand(0);
12856 SDValue Ops[] =
12870 SDValue Ops[] =
12878 if (SDValue FTrunc = foldFPToIntToFP(N, DAG, TLI))
12884 SDValue DAGCombiner::visitUINT_TO_FP(SDNode *N) {
12885 SDValue N0 = N->getOperand(0);
12916 SDValue Ops[] =
12924 if (SDValue FTrunc = foldFPToIntToFP(N, DAG, TLI))
12931 static SDValue FoldIntToFPToInt(SDNode *N, SelectionDAG &DAG) {
12932 SDValue N0 = N->getOperand(0);
12938 SDValue Src = N0.getOperand(0);
12972 SDValue DAGCombiner::visitFP_TO_SINT(SDNode *N) {
12973 SDValue N0 = N->getOperand(0);
12987 SDValue DAGCombiner::visitFP_TO_UINT(SDNode *N) {
12988 SDValue N0 = N->getOperand(0);
13002 SDValue DAGCombiner::visitFP_ROUND(SDNode *N) {
13003 SDValue N0 = N->getOperand(0);
13004 SDValue N1 = N->getOperand(1);
13045 SDValue Tmp = DAG.getNode(ISD::FP_ROUND, SDLoc(N0), VT,
13052 if (SDValue NewVSel = matchVSelectOpSizesWithSetCC(N))
13058 SDValue DAGCombiner::visitFP_EXTEND(SDNode *N) {
13059 SDValue N0 = N->getOperand(0);
13080 SDValue In = N0.getOperand(0);
13092 SDValue ExtLoad = DAG.getExtLoad(ISD::EXTLOAD, SDLoc(N), VT,
13105 if (SDValue NewVSel = matchVSelectOpSizesWithSetCC(N))
13111 SDValue DAGCombiner::visitFCEIL(SDNode *N) {
13112 SDValue N0 = N->getOperand(0);
13122 SDValue DAGCombiner::visitFTRUNC(SDNode *N) {
13123 SDValue N0 = N->getOperand(0);
13146 SDValue DAGCombiner::visitFFLOOR(SDNode *N) {
13147 SDValue N0 = N->getOperand(0);
13158 SDValue DAGCombiner::visitFNEG(SDNode *N) {
13159 SDValue N0 = N->getOperand(0);
13174 SDValue Int = N0.getOperand(0);
13215 static SDValue visitFMinMax(SelectionDAG &DAG, SDNode *N,
13217 SDValue N0 = N->getOperand(0);
13218 SDValue N1 = N->getOperand(1);
13237 SDValue DAGCombiner::visitFMINNUM(SDNode *N) {
13241 SDValue DAGCombiner::visitFMAXNUM(SDNode *N) {
13245 SDValue DAGCombiner::visitFMINIMUM(SDNode *N) {
13249 SDValue DAGCombiner::visitFMAXIMUM(SDNode *N) {
13253 SDValue DAGCombiner::visitFABS(SDNode *N) {
13254 SDValue N0 = N->getOperand(0);
13272 SDValue Int = N0.getOperand(0);
13296 SDValue DAGCombiner::visitBRCOND(SDNode *N) {
13297 SDValue Chain = N->getOperand(0);
13298 SDValue N1 = N->getOperand(1);
13299 SDValue N2 = N->getOperand(2);
13318 if (SDValue NewN1 = rebuildSetCC(N1))
13325 SDValue DAGCombiner::rebuildSetCC(SDValue N) {
13325 SDValue DAGCombiner::rebuildSetCC(SDValue N) {
13351 SDValue Op0 = N.getOperand(0);
13352 SDValue Op1 = N.getOperand(1);
13355 SDValue AndOp1 = Op0.getOperand(1);
13381 SDValue Tmp = visitXOR(N.getNode());
13398 SDValue Op0 = TheXor->getOperand(0);
13399 SDValue Op1 = TheXor->getOperand(1);
13423 SDValue DAGCombiner::visitBR_CC(SDNode *N) {
13425 SDValue CondLHS = N->getOperand(2), CondRHS = N->getOperand(3);
13434 SDValue Simp = SimplifySetCC(getSetCCResultType(CondLHS.getValueType()),
13506 SDValue Ptr;
13536 SDValue BasePtr;
13537 SDValue Offset;
13570 SDValue Val = cast<StoreSDNode>(N)->getValue();
13609 SDValue Op1 = Use.getUser()->getOperand((UI.getOperandNo() + 1) & 1);
13645 SDValue Result;
13710 SDValue NewOp1 = DAG.getConstant(CNV, DL, CN->getValueType(0));
13711 SDValue NewOp2 = Result.getValue(isLoad ? 1 : 0);
13713 SDValue NewUse = DAG.getNode(Opcode,
13737 SDValue Ptr;
13768 SDValue BasePtr;
13769 SDValue Offset;
13820 SDValue Result = isLoad
13854 SDValue DAGCombiner::SplitIndexingFromLoad(LoadSDNode *LD) {
13857 SDValue BP = LD->getOperand(1);
13858 SDValue Inc = LD->getOperand(2);
13881 bool DAGCombiner::getTruncatedStoreValue(StoreSDNode *ST, SDValue &Val) {
13906 bool DAGCombiner::extendLoadedValueToExtension(LoadSDNode *LD, SDValue &Val) {
13932 SDValue DAGCombiner::ForwardStoreValueToDirectLoad(LoadSDNode *LD) {
13935 SDValue Chain = LD->getOperand(0);
13970 SDValue Idx = DAG.getNode(Opc, SDLoc(LD), LD->getOperand(1).getValueType(),
13972 SDValue Ops[] = {Val, Idx, Chain};
13990 auto Mask =
13994 auto Val = DAG.getNode(ISD::AND, SDLoc(LD), LDType, ST->getValue(), Mask);
14003 SDValue Val;
14029 SDValue DAGCombiner::visitLOAD(SDNode *N) {
14031 SDValue Chain = LD->getChain();
14032 SDValue Ptr = LD->getBasePtr();
14072 SDValue Undef = DAG.getUNDEF(N->getValueType(0));
14073 SDValue Index;
14096 if (auto V = ForwardStoreValueToDirectLoad(LD))
14103 SDValue NewLoad = DAG.getExtLoad(
14116 SDValue BetterChain = FindBetterChain(LD, Chain);
14120 SDValue ReplLoad;
14134 SDValue Token = DAG.getNode(ISD::TokenFactor, SDLoc(N),
14381 SDValue loadSlice() const {
14383 const SDValue &OldBaseAddr = Origin->getBasePtr();
14384 SDValue BaseAddr = OldBaseAddr;
14400 SDValue LastInst =
14679 SmallVector<SDValue, 8> ArgChains;
14684 SDValue SliceInst = LSIt->loadSlice();
14693 SDValue Chain = DAG.getNode(ISD::TokenFactor, SDLoc(LD), MVT::Other,
14704 CheckForMaskedLoad(SDValue V, SDValue Ptr, SDValue Chain) {
14704 CheckForMaskedLoad(SDValue V, SDValue Ptr, SDValue Chain) {
14704 CheckForMaskedLoad(SDValue V, SDValue Ptr, SDValue Chain) {
14773 static SDValue
14775 SDValue IVal, StoreSDNode *St,
14817 SDValue Ptr = St->getBasePtr();
14838 SDValue DAGCombiner::ReduceLoadOpStoreWidth(SDNode *N) {
14843 SDValue Chain = ST->getChain();
14844 SDValue Value = ST->getValue();
14845 SDValue Ptr = ST->getBasePtr();
14862 if (SDValue NewST = ShrinkLoadReplaceStoreWithStore(MaskedLoad,
14869 if (SDValue NewST = ShrinkLoadReplaceStoreWithStore(MaskedLoad,
14878 SDValue N0 = Value.getOperand(0);
14888 SDValue N1 = Value.getOperand(1);
14932 SDValue NewPtr = DAG.getNode(ISD::ADD, SDLoc(LD),
14936 SDValue NewLD =
14940 SDValue NewVal = DAG.getNode(Opc, SDLoc(Value), NewVT, NewLD,
14943 SDValue NewST =
14963 SDValue DAGCombiner::TransformFPLoadStorePair(SDNode *N) {
14965 SDValue Value = ST->getValue();
14992 SDValue NewLD =
14996 SDValue NewST =
15025 SDValue &AddNode,
15026 SDValue &ConstNode) {
15085 SDValue DAGCombiner::getMergeStoreChains(SmallVectorImpl<MemOpLink> &StoreNodes,
15087 SmallVector<SDValue, 8> Chains;
15127 SDValue StoredVal;
15130 SmallVector<SDValue, 8> BuildVector;
15133 SDValue Val = St->getValue();
15159 SmallVector<SDValue, 8> Ops;
15162 SDValue Val = peekThroughBitcasts(St->getValue());
15179 SDValue Vec = Val.getOperand(0);
15180 SDValue Idx = Val.getOperand(1);
15206 SDValue Val = St->getValue();
15231 SDValue NewChain = getMergeStoreChains(StoreNodes, NumStores);
15234 SDValue NewStore;
15244 SDValue ExtendedStoreVal =
15270 SDValue Val = peekThroughBitcasts(St->getValue());
15310 SDValue OtherBC = peekThroughBitcasts(Other->getValue());
15442 for (SDValue Op : N->ops())
15508 SDValue StoredVal = peekThroughBitcasts(St->getValue());
15595 SDValue StoredVal = ST->getValue();
15780 SDValue Val = peekThroughBitcasts(St->getValue());
15828 SDValue FirstChain = FirstLoad->getChain();
15958 SDValue NewStoreChain = getMergeStoreChains(StoreNodes, NumElem);
15971 SDValue NewLoad, NewStore;
16004 SDValue Val = StoreNodes[i].MemNode->getOperand(1);
16019 SDValue DAGCombiner::replaceStoreChain(StoreSDNode *ST, SDValue BetterChain) {
16019 SDValue DAGCombiner::replaceStoreChain(StoreSDNode *ST, SDValue BetterChain) {
16021 SDValue ReplStore;
16034 SDValue Token = DAG.getNode(ISD::TokenFactor, SL,
16044 SDValue DAGCombiner::replaceStoreOfFPConstant(StoreSDNode *ST) {
16045 SDValue Value = ST->getValue();
16051 SDValue Chain = ST->getChain();
16052 SDValue Ptr = ST->getBasePtr();
16061 SDValue Tmp;
16098 SDValue Lo = DAG.getConstant(Val & 0xFFFFFFFF, SDLoc(CFP), MVT::i32);
16099 SDValue Hi = DAG.getConstant(Val >> 32, SDLoc(CFP), MVT::i32);
16107 SDValue St0 = DAG.getStore(Chain, DL, Lo, Ptr, ST->getPointerInfo(),
16112 SDValue St1 = DAG.getStore(Chain, DL, Hi, Ptr,
16123 SDValue DAGCombiner::visitSTORE(SDNode *N) {
16125 SDValue Chain = ST->getChain();
16126 SDValue Value = ST->getValue();
16127 SDValue Ptr = ST->getBasePtr();
16158 SDValue NewStore =
16171 if (SDValue NewST = TransformFPLoadStorePair(N))
16175 if (SDValue Store = MatchStoreCombine(ST))
16202 if (SDValue Shorter = DAG.GetDemandedBits(Value, TruncDemandedBits))
16266 SDValue ChainValue = ST1->getValue();
16274 SDValue NewSDVal =
16326 if (SDValue NewSt = replaceStoreOfFPConstant(ST))
16330 if (SDValue NewSt = splitMergedValStore(ST))
16336 SDValue DAGCombiner::visitLIFETIME_END(SDNode *N) {
16345 SmallVector<SDValue, 8> Chains = {N->getOperand(0)};
16347 SDValue Chain = Chains.back();
16413 SDValue DAGCombiner::splitMergedValStore(StoreSDNode *ST) {
16422 SDValue Val = ST->getValue();
16430 SDValue Op1 = Val.getOperand(0);
16431 SDValue Op2 = Val.getOperand(1);
16432 SDValue Lo, Hi;
16480 SDValue Chain = ST->getChain();
16481 SDValue Ptr = ST->getBasePtr();
16483 SDValue St0 = DAG.getStore(Chain, DL, Lo, Ptr, ST->getPointerInfo(),
16489 SDValue St1 =
16497 SDValue DAGCombiner::combineInsertEltToShuffle(SDNode *N, unsigned InsIndex) {
16498 SDValue InsertVal = N->getOperand(1);
16499 SDValue Vec = N->getOperand(0);
16509 SDValue X = Vec.getOperand(0);
16510 SDValue Y = Vec.getOperand(1);
16531 SDValue LegalShuffle =
16547 SDValue SubVec = InsertVal.getOperand(0);
16548 SDValue DestVec = N->getOperand(0);
16577 SmallVector<SDValue, 8> ConcatOps(ExtendRatio, DAG.getUNDEF(SubVecVT));
16579 SDValue PaddedSubV = DAG.getNode(ISD::CONCAT_VECTORS, DL, ShufVT, ConcatOps);
16582 SDValue DestVecBC = DAG.getBitcast(ShufVT, DestVec);
16583 SDValue Shuf = DAG.getVectorShuffle(ShufVT, DL, DestVecBC, PaddedSubV, Mask);
16590 SDValue DAGCombiner::visitINSERT_VECTOR_ELT(SDNode *N) {
16591 SDValue InVec = N->getOperand(0);
16592 SDValue InVal = N->getOperand(1);
16593 SDValue EltNo = N->getOperand(2);
16610 SmallVector<SDValue, 8> Ops(NumElts, InVal);
16618 if (SDValue Shuf = combineInsertEltToShuffle(N, Elt))
16633 SDValue NewOp = DAG.getNode(ISD::INSERT_VECTOR_ELT, DL, VT,
16648 SmallVector<SDValue, 8> Ops;
16673 SDValue DAGCombiner::scalarizeExtractedVectorLoad(SDNode *EVE, EVT InVecVT,
16674 SDValue EltNo,
16694 SDValue NewPtr = OriginalLoad->getBasePtr();
16695 SDValue Offset;
16721 SDValue Load;
16722 SDValue Chain;
16746 SDValue From[] = { SDValue(EVE, 0), SDValue(OriginalLoad, 1) };
16747 SDValue To[] = { Load, Chain };
16761 static SDValue scalarizeExtractedBinop(SDNode *ExtElt, SelectionDAG &DAG,
16764 SDValue Vec = ExtElt->getOperand(0);
16765 SDValue Index = ExtElt->getOperand(1);
16778 SDValue Op0 = Vec.getOperand(0);
16779 SDValue Op1 = Vec.getOperand(1);
16786 SDValue Ext0 = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, VT, Op0, Index);
16787 SDValue Ext1 = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, VT, Op1, Index);
16794 SDValue DAGCombiner::visitEXTRACT_VECTOR_ELT(SDNode *N) {
16795 SDValue VecOp = N->getOperand(0);
16796 SDValue Index = N->getOperand(1);
16809 SDValue Elt = VecOp.getOperand(1);
16818 SDValue InOp = VecOp.getOperand(0);
16836 SDValue Elt = VecOp.getOperand(IndexC->getZExtValue());
16857 SDValue BCSrc = VecOp.getOperand(0);
16865 SDValue X = BCSrc.getOperand(0);
16884 if (SDValue BO = scalarizeExtractedBinop(N, DAG, LegalOperations))
16903 SDValue SVInVec;
16912 SDValue InOp = SVInVec.getOperand(OrigElt);
17054 SDValue DAGCombiner::reduceBuildVecExtToExtBuildVec(SDNode *N) {
17077 SDValue In = N->getOperand(i);
17123 SDValue Filler = AllAnyExt ? DAG.getUNDEF(SourceType):
17127 SmallVector<SDValue, 8> Ops(NewBVElems, Filler);
17131 SDValue Cast = N->getOperand(i);
17135 SDValue In;
17158 SDValue BV = DAG.getBuildVector(VecVT, DL, Ops);
17166 SDValue DAGCombiner::createBuildVecShuffle(const SDLoc &DL, SDNode *N,
17168 SDValue VecIn1, SDValue VecIn2,
17168 SDValue VecIn1, SDValue VecIn2,
17171 SDValue ZeroIdx = DAG.getConstant(0, DL, IdxTy);
17192 SmallVector<SDValue, 2> ConcatOps(NumConcats, DAG.getUNDEF(InVT1));
17237 SmallVector<SDValue, 2> ConcatOps(2, DAG.getUNDEF(InVT2));
17275 SDValue Shuffle = DAG.getVectorShuffle(InVT1, DL, VecIn1, VecIn2, Mask);
17282 static SDValue reduceBuildVecToShuffleWithZero(SDNode *BV, SelectionDAG &DAG) {
17290 SDValue Op = BV->getOperand(i);
17309 SDValue Zext = BV->getOperand(ZextElt);
17318 SDValue Extract = Zext.getOperand(0);
17350 SDValue ZeroVec = DAG.getConstant(0, DL, VecVT);
17352 SDValue Shuf = TLI.buildLegalVectorShuffle(VecVT, DL, Extract.getOperand(0),
17362 SDValue DAGCombiner::reduceBuildVecToShuffle(SDNode *N) {
17370 if (SDValue V = reduceBuildVecToShuffleWithZero(N, DAG))
17387 SmallVector<SDValue, 8> VecIn;
17391 SDValue Op = N->getOperand(i);
17410 SDValue ExtractedFromVec = Op.getOperand(0);
17444 SDValue Vec = VecIn.back();
17464 SDValue VecIn2 = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, SplitVT, Vec,
17466 SDValue VecIn1 = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, SplitVT, Vec,
17501 SmallVector<SDValue, 4> Shuffles;
17504 SDValue VecLeft = VecIn[LeftIdx];
17505 SDValue VecRight =
17508 if (SDValue Shuffle = createBuildVecShuffle(DL, N, VectorMask, VecLeft,
17577 SDValue DAGCombiner::convertBuildVecZextToZext(SDNode *N) {
17584 SDValue Op0 = N->getOperand(0);
17603 SDValue In = Op0.getOperand(0).getOperand(0);
17624 SDValue DAGCombiner::visitBUILD_VECTOR(SDNode *N) {
17640 if (SDValue Splat = cast<BuildVectorSDNode>(N)->getSplatValue()) {
17648 SmallVector<SDValue, 8> Ops(N->getNumOperands(), Splat);
17649 SDValue Concat = DAG.getNode(ISD::CONCAT_VECTORS, SDLoc(N),
17659 if (SDValue V = cast<BuildVectorSDNode>(N)->getSplatValue()) {
17666 SDValue Op0 = N->getOperand(0);
17693 if (SDValue V = convertBuildVecZextToZext(N))
17696 if (SDValue V = reduceBuildVecExtToExtBuildVec(N))
17699 if (SDValue V = reduceBuildVecToShuffle(N))
17705 static SDValue combineConcatVectorOfScalars(SDNode *N, SelectionDAG &DAG) {
17715 SmallVector<SDValue, 8> Ops;
17718 SDValue ScalarUndef = DAG.getNode(ISD::UNDEF, DL, SVT);
17723 for (const SDValue &Op : N->ops()) {
17750 for (SDValue &Op : Ops) {
17770 static SDValue combineConcatVectorOfExtracts(SDNode *N, SelectionDAG &DAG) {
17776 SDValue SV0 = DAG.getUNDEF(VT), SV1 = DAG.getUNDEF(VT);
17779 for (SDValue Op : N->ops()) {
17792 SDValue ExtVec = Op.getOperand(0);
17842 SDValue DAGCombiner::visitCONCAT_VECTORS(SDNode *N) {
17856 SDValue In = N->getOperand(0);
17863 SmallVector<SDValue, 4> Ops(In->op_begin(), In->op_end());
17868 SDValue Scalar = peekThroughOneUseBitcasts(In);
17906 SDValue Res = DAG.getNode(ISD::SCALAR_TO_VECTOR, SDLoc(N), NVT, Scalar);
17919 SmallVector<SDValue, 8> Opnds;
17927 for (const SDValue &Op : N->ops())
17936 for (const SDValue &Op : N->ops()) {
17961 if (SDValue V = combineConcatVectorOfScalars(N, DAG))
17966 if (SDValue V = combineConcatVectorOfExtracts(N, DAG))
17973 SDValue SingleSource = SDValue();
17977 SDValue Op = N->getOperand(i);
18019 static SDValue getSubVectorSrc(SDValue V, SDValue Index, EVT SubVT) {
18019 static SDValue getSubVectorSrc(SDValue V, SDValue Index, EVT SubVT) {
18019 static SDValue getSubVectorSrc(SDValue V, SDValue Index, EVT SubVT) {
18034 static SDValue narrowInsertExtractVectorBinOp(SDNode *Extract,
18037 SDValue BinOp = Extract->getOperand(0);
18043 SDValue Bop0 = BinOp.getOperand(0), Bop1 = BinOp.getOperand(1);
18047 SDValue Index = Extract->getOperand(1);
18052 SDValue Sub0 = getSubVectorSrc(Bop0, Index, SubVT);
18053 SDValue Sub1 = getSubVectorSrc(Bop1, Index, SubVT);
18070 static SDValue narrowExtractedVectorBinOp(SDNode *Extract, SelectionDAG &DAG) {
18074 if (SDValue V = narrowInsertExtractVectorBinOp(Extract, DAG))
18085 SDValue BinOp = peekThroughBitcasts(Extract->getOperand(0));
18130 SDValue NewExtIndex = DAG.getConstant(ExtBOIdx, DL, ExtBOIdxVT);
18131 SDValue X = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, NarrowBVT,
18133 SDValue Y = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, NarrowBVT,
18135 SDValue NarrowBinOp = DAG.getNode(BOpcode, DL, NarrowBVT, X, Y,
18160 SDValue SubVecL = GetSubVector(peekThroughBitcasts(BinOp.getOperand(0)));
18161 SDValue SubVecR = GetSubVector(peekThroughBitcasts(BinOp.getOperand(1)));
18170 SDValue IndexC = DAG.getConstant(ExtBOIdx, DL, ExtBOIdxVT);
18171 SDValue X = SubVecL ? DAG.getBitcast(NarrowBVT, SubVecL)
18175 SDValue Y = SubVecR ? DAG.getBitcast(NarrowBVT, SubVecR)
18179 SDValue NarrowBinOp = DAG.getNode(BOpcode, DL, NarrowBVT, X, Y);
18189 static SDValue narrowExtractedVectorLoad(SDNode *Extract, SelectionDAG &DAG) {
18209 SDValue BaseAddr = Ld->getOperand(1);
18213 SDValue NewAddr = DAG.getMemBasePlusOffset(BaseAddr, Offset, DL);
18217 SDValue NewLd = DAG.getLoad(VT, DL, Ld->getChain(), NewAddr, MMO);
18222 SDValue DAGCombiner::visitEXTRACT_SUBVECTOR(SDNode *N) {
18224 SDValue V = N->getOperand(0);
18231 if (SDValue NarrowLoad = narrowExtractedVectorLoad(N, DAG))
18236 SDValue Index = N->getOperand(1);
18251 SDValue SrcOp = V.getOperand(0);
18263 SDValue NewIndex = DAG.getIntPtrConstant(IndexValScaled, DL);
18264 SDValue NewExtract = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, NewExtVT,
18311 SDValue Src = V->getOperand(IdxVal);
18318 SDValue BuildVec = DAG.getBuildVector(
18352 if (SDValue NarrowBOp = narrowExtractedVectorBinOp(N, DAG))
18365 static SDValue foldShuffleOfConcatUndefs(ShuffleVectorSDNode *Shuf,
18367 SDValue N0 = Shuf->getOperand(0), N1 = Shuf->getOperand(1);
18401 SDValue X = N0.getOperand(0), Y = N1.getOperand(0);
18403 SDValue Shuf0 = DAG.getVectorShuffle(HalfVT, DL, X, Y, Mask0);
18404 SDValue Shuf1 = DAG.getVectorShuffle(HalfVT, DL, X, Y, Mask1);
18410 static SDValue partitionShuffleOfConcats(SDNode *N, SelectionDAG &DAG) {
18414 SDValue N0 = N->getOperand(0);
18415 SDValue N1 = N->getOperand(1);
18419 SmallVector<SDValue, 4> Ops;
18489 static SDValue combineShuffleOfScalars(ShuffleVectorSDNode *SVN,
18494 SDValue N0 = SVN->getOperand(0);
18495 SDValue N1 = SVN->getOperand(1);
18520 if (SDValue Splat0 = BV0->getSplatValue())
18523 SmallVector<SDValue, 8> Ops;
18524 SmallSet<SDValue, 16> DuplicateOps;
18526 SDValue Op = DAG.getUNDEF(VT.getScalarType());
18529 SDValue &S = (M < (int)NumElts ? N0 : N1);
18533 SDValue Op0 = S.getOperand(0);
18556 for (SDValue &Op : Ops)
18559 for (SDValue &Op : Ops)
18570 static SDValue combineShuffleToVectorExtend(ShuffleVectorSDNode *SVN,
18584 SDValue N0 = SVN->getOperand(0);
18627 static SDValue combineTruncationShuffle(ShuffleVectorSDNode *SVN,
18636 SDValue N0 = peekThroughBitcasts(SVN->getOperand(0));
18644 SDValue N00 = N0.getOperand(0);
18688 static SDValue combineShuffleOfSplatVal(ShuffleVectorSDNode *Shuf,
18766 static SDValue replaceShuffleOfInsert(ShuffleVectorSDNode *Shuf,
18772 SDValue Op0 = Shuf->getOperand(0);
18773 SDValue Op1 = Shuf->getOperand(1);
18810 SDValue NewInsIndex = DAG.getConstant(ShufOp0Index, SDLoc(Shuf),
18820 static SDValue simplifyShuffleOfShuffle(ShuffleVectorSDNode *Shuf) {
18844 SDValue DAGCombiner::visitVECTOR_SHUFFLE(SDNode *N) {
18848 SDValue N0 = N->getOperand(0);
18849 SDValue N1 = N->getOperand(1);
18890 if (SDValue InsElt = replaceShuffleOfInsert(SVN, DAG))
18894 if (SDValue V = combineShuffleOfSplatVal(SVN, DAG))
18905 SDValue L = N0.getOperand(0), R = N0.getOperand(1);
18908 SDValue Index = DAG.getIntPtrConstant(SplatIndex, DL);
18909 SDValue ExtL = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, EltVT, L, Index);
18910 SDValue ExtR = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, EltVT, R, Index);
18911 SDValue NewBO = DAG.getNode(N0.getOpcode(), DL, EltVT, ExtL, ExtR,
18913 SDValue Insert = DAG.getNode(ISD::SCALAR_TO_VECTOR, DL, VT, NewBO);
18923 SDValue ConvInput = V->getOperand(0);
18932 SDValue Base;
18954 SDValue Splatted = V->getOperand(SplatIndex);
18955 SmallVector<SDValue, 8> Ops(NumElts, Splatted);
18956 SDValue NewBV = DAG.getBuildVector(V->getValueType(0), SDLoc(N), Ops);
18972 if (SDValue ShufOp = simplifyShuffleOfShuffle(SVN))
18976 if (SDValue V = combineShuffleToVectorExtend(SVN, DAG, TLI, LegalOperations))
18980 if (SDValue V = combineTruncationShuffle(SVN, DAG))
18988 if (SDValue V = partitionShuffleOfConcats(N, DAG))
18995 if (SDValue Res = combineShuffleOfScalars(SVN, DAG, TLI))
19015 SDValue BC0 = peekThroughOneUseBitcasts(N0);
19044 SDValue SV0 = BC0->getOperand(0);
19045 SDValue SV1 = BC0->getOperand(1);
19075 SDValue SV0 = N1->getOperand(0);
19076 SDValue SV1 = N1->getOperand(1);
19105 SDValue SV0, SV1;
19117 SDValue CurrentVec;
19185 if (SDValue V = foldShuffleOfConcatUndefs(SVN, DAG))
19191 SDValue DAGCombiner::visitSCALAR_TO_VECTOR(SDNode *N) {
19192 SDValue InVal = N->getOperand(0);
19198 SDValue InVec = InVal->getOperand(0);
19199 SDValue EltNo = InVal->getOperand(1);
19210 SDValue Val =
19216 SDValue LegalShuffle =
19227 SDValue ZeroIdx = DAG.getConstant(0, SDLoc(N), IdxTy);
19242 SDValue DAGCombiner::visitINSERT_SUBVECTOR(SDNode *N) {
19244 SDValue N0 = N->getOperand(0);
19245 SDValue N1 = N->getOperand(1);
19246 SDValue N2 = N->getOperand(2);
19277 SDValue CN0 = N0.getOperand(0);
19278 SDValue CN1 = N1.getOperand(0);
19284 SDValue NewINSERT = DAG.getNode(ISD::INSERT_SUBVECTOR, SDLoc(N),
19317 SDValue N0Src = peekThroughBitcasts(N0);
19318 SDValue N1Src = peekThroughBitcasts(N1);
19325 SDValue NewIdx;
19342 SDValue Res = DAG.getBitcast(NewVT, N0Src);
19359 SDValue NewOp = DAG.getNode(ISD::INSERT_SUBVECTOR, SDLoc(N), VT,
19373 SmallVector<SDValue, 8> Ops(N0->op_begin(), N0->op_end());
19386 SDValue DAGCombiner::visitFP_TO_FP16(SDNode *N) {
19387 SDValue N0 = N->getOperand(0);
19396 SDValue DAGCombiner::visitFP16_TO_FP(SDNode *N) {
19397 SDValue N0 = N->getOperand(0);
19411 SDValue DAGCombiner::visitVECREDUCE(SDNode *N) {
19412 SDValue N0 = N->getOperand(0);
19419 SDValue Res = DAG.getNode(
19445 SDValue DAGCombiner::XformToShuffleWithZero(SDNode *N) {
19449 SDValue LHS = N->getOperand(0);
19450 SDValue RHS = peekThroughBitcasts(N->getOperand(1));
19475 SDValue Elt = RHS.getOperand(EltIdx);
19513 SDValue Zero = DAG.getConstant(0, DL, ClearVT);
19526 if (SDValue S = BuildClearMask(Split))
19534 static SDValue scalarizeBinOpOfSplats(SDNode *N, SelectionDAG &DAG) {
19535 SDValue N0 = N->getOperand(0);
19536 SDValue N1 = N->getOperand(1);
19546 SDValue Src0 = DAG.getSplatSourceVector(N0, Index0);
19547 SDValue Src1 = DAG.getSplatSourceVector(N1, Index1);
19556 SDValue IndexC =
19558 SDValue X = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, EltVT, N0, IndexC);
19559 SDValue Y = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, EltVT, N1, IndexC);
19560 SDValue ScalarBO = DAG.getNode(Opcode, DL, EltVT, X, Y, N->getFlags());
19569 SmallVector<SDValue, 8> Ops(VT.getVectorNumElements(), DAG.getUNDEF(EltVT));
19575 SmallVector<SDValue, 8> Ops(VT.getVectorNumElements(), ScalarBO);
19580 SDValue DAGCombiner::SimplifyVBinOp(SDNode *N) {
19584 SDValue LHS = N->getOperand(0);
19585 SDValue RHS = N->getOperand(1);
19586 SDValue Ops[] = {LHS, RHS};
19591 if (SDValue Fold = DAG.FoldConstantVectorArithmetic(
19611 SDValue NewBinOp = DAG.getNode(Opcode, DL, VT, LHS.getOperand(0),
19613 SDValue UndefV = LHS.getOperand(1);
19626 SDValue X = LHS.getOperand(1);
19627 SDValue Y = RHS.getOperand(1);
19628 SDValue Z = LHS.getOperand(2);
19634 SDValue VecC =
19636 SDValue NarrowBO = DAG.getNode(Opcode, DL, NarrowVT, X, Y);
19663 SmallVector<SDValue, 4> ConcatOps;
19674 if (SDValue V = scalarizeBinOpOfSplats(N, DAG))
19680 SDValue DAGCombiner::SimplifySelect(const SDLoc &DL, SDValue N0, SDValue N1,
19680 SDValue DAGCombiner::SimplifySelect(const SDLoc &DL, SDValue N0, SDValue N1,
19680 SDValue DAGCombiner::SimplifySelect(const SDLoc &DL, SDValue N0, SDValue N1,
19681 SDValue N2) {
19684 SDValue SCC = SimplifySelectCC(DL, N0.getOperand(0), N0.getOperand(1), N1, N2,
19695 SDValue SETCC = DAG.getNode(ISD::SETCC, SDLoc(N0),
19700 SDValue SelectNode = DAG.getSelect(SDLoc(SCC), SCC.getValueType(), SETCC,
19716 bool DAGCombiner::SimplifySelectOps(SDNode *TheSelect, SDValue LHS,
19717 SDValue RHS) {
19723 SDValue Sqrt = RHS;
19725 SDValue CmpLHS;
19734 SDValue Cmp = TheSelect->getOperand(0);
19820 SDValue Addr;
19866 SDValue Load;
19905 SDValue DAGCombiner::foldSelectCCToShiftAnd(const SDLoc &DL, SDValue N0,
19905 SDValue DAGCombiner::foldSelectCCToShiftAnd(const SDLoc &DL, SDValue N0,
19906 SDValue N1, SDValue N2, SDValue N3,
19906 SDValue N1, SDValue N2, SDValue N3,
19906 SDValue N1, SDValue N2, SDValue N3,
19940 SDValue ShiftAmt = DAG.getConstant(ShCt, DL, ShiftAmtTy);
19941 SDValue Shift = DAG.getNode(ISD::SRL, DL, XType, N0, ShiftAmt);
19955 SDValue ShiftAmt = DAG.getConstant(XType.getSizeInBits() - 1, DL, ShiftAmtTy);
19956 SDValue Shift = DAG.getNode(ISD::SRA, DL, XType, N0, ShiftAmt);
19974 SDValue DAGCombiner::convertSelectOfFPConstantsToLoadOffset(
19975 const SDLoc &DL, SDValue N0, SDValue N1, SDValue N2, SDValue N3,
19975 const SDLoc &DL, SDValue N0, SDValue N1, SDValue N2, SDValue N3,
19975 const SDLoc &DL, SDValue N0, SDValue N1, SDValue N2, SDValue N3,
19975 const SDLoc &DL, SDValue N0, SDValue N1, SDValue N2, SDValue N3,
20006 SDValue CPIdx = DAG.getConstantPool(CA, TLI.getPointerTy(DAG.getDataLayout()),
20012 SDValue Zero = DAG.getIntPtrConstant(0, DL);
20014 SDValue One = DAG.getIntPtrConstant(EltSize, SDLoc(FV));
20015 SDValue Cond =
20018 SDValue CstOffset = DAG.getSelect(DL, Zero.getValueType(), Cond, One, Zero);
20029 SDValue DAGCombiner::SimplifySelectCC(const SDLoc &DL, SDValue N0, SDValue N1,
20029 SDValue DAGCombiner::SimplifySelectCC(const SDLoc &DL, SDValue N0, SDValue N1,
20029 SDValue DAGCombiner::SimplifySelectCC(const SDLoc &DL, SDValue N0, SDValue N1,
20030 SDValue N2, SDValue N3, ISD::CondCode CC,
20030 SDValue N2, SDValue N3, ISD::CondCode CC,
20043 if (SDValue SCC = DAG.FoldSetCC(CmpResVT, N0, N1, CC, DL)) {
20052 if (SDValue V =
20056 if (SDValue V = foldSelectCCToShiftAnd(DL, N0, N1, N2, N3, CC))
20072 SDValue AndLHS = N0->getOperand(0);
20077 SDValue ShlAmt =
20080 SDValue Shl = DAG.getNode(ISD::SHL, SDLoc(N0), VT, AndLHS, ShlAmt);
20084 SDValue ShrAmt =
20087 SDValue Shr = DAG.getNode(ISD::SRA, SDLoc(N0), VT, Shl, ShrAmt);
20112 SDValue Temp, SCC;
20147 SDValue ValueOnZero = N2;
20148 SDValue Count = N3;
20177 SDValue DAGCombiner::SimplifySetCC(EVT VT, SDValue N0, SDValue N1,
20177 SDValue DAGCombiner::SimplifySetCC(EVT VT, SDValue N0, SDValue N1,
20177 SDValue DAGCombiner::SimplifySetCC(EVT VT, SDValue N0, SDValue N1,
20189 SDValue DAGCombiner::BuildSDIV(SDNode *N) {
20196 if (SDValue S = TLI.BuildSDIV(N, DAG, LegalOperations, Built)) {
20207 SDValue DAGCombiner::BuildSDIVPow2(SDNode *N) {
20217 if (SDValue S = TLI.BuildSDIVPow2(N, C->getAPIntValue(), DAG, Built)) {
20230 SDValue DAGCombiner::BuildUDIV(SDNode *N) {
20237 if (SDValue S = TLI.BuildUDIV(N, DAG, LegalOperations, Built)) {
20248 SDValue DAGCombiner::BuildLogBase2(SDValue V, const SDLoc &DL) {
20248 SDValue DAGCombiner::BuildLogBase2(SDValue V, const SDLoc &DL) {
20251 SDValue Ctlz = DAG.getNode(ISD::CTLZ, DL, VT, V);
20252 SDValue Base = DAG.getConstant(EltBits - 1, DL, VT);
20253 SDValue LogBase2 = DAG.getNode(ISD::SUB, DL, VT, Base, Ctlz);
20265 SDValue DAGCombiner::BuildDivEstimate(SDValue N, SDValue Op,
20265 SDValue DAGCombiner::BuildDivEstimate(SDValue N, SDValue Op,
20265 SDValue DAGCombiner::BuildDivEstimate(SDValue N, SDValue Op,
20284 if (SDValue Est = TLI.getRecipEstimate(Op, DAG, Enabled, Iterations)) {
20289 SDValue FPOne = DAG.getConstantFP(1.0, DL, VT);
20294 SDValue MulEst = Est;
20301 SDValue NewEst = DAG.getNode(ISD::FMUL, DL, VT, Op, MulEst, Flags);
20332 SDValue DAGCombiner::buildSqrtNROneConst(SDValue Arg, SDValue Est,
20332 SDValue DAGCombiner::buildSqrtNROneConst(SDValue Arg, SDValue Est,
20332 SDValue DAGCombiner::buildSqrtNROneConst(SDValue Arg, SDValue Est,
20337 SDValue ThreeHalves = DAG.getConstantFP(1.5, DL, VT);
20341 SDValue HalfArg = DAG.getNode(ISD::FMUL, DL, VT, ThreeHalves, Arg, Flags);
20346 SDValue NewEst = DAG.getNode(ISD::FMUL, DL, VT, Est, Est, Flags);
20364 SDValue DAGCombiner::buildSqrtNRTwoConst(SDValue Arg, SDValue Est,
20364 SDValue DAGCombiner::buildSqrtNRTwoConst(SDValue Arg, SDValue Est,
20364 SDValue DAGCombiner::buildSqrtNRTwoConst(SDValue Arg, SDValue Est,
20369 SDValue MinusThree = DAG.getConstantFP(-3.0, DL, VT);
20370 SDValue MinusHalf = DAG.getConstantFP(-0.5, DL, VT);
20379 SDValue AE = DAG.getNode(ISD::FMUL, DL, VT, Arg, Est, Flags);
20380 SDValue AEE = DAG.getNode(ISD::FMUL, DL, VT, AE, Est, Flags);
20381 SDValue RHS = DAG.getNode(ISD::FADD, DL, VT, AEE, MinusThree, Flags);
20386 SDValue LHS;
20404 SDValue DAGCombiner::buildSqrtEstimateImpl(SDValue Op, SDNodeFlags Flags,
20404 SDValue DAGCombiner::buildSqrtEstimateImpl(SDValue Op, SDNodeFlags Flags,
20425 if (SDValue Est =
20447 SDValue NormC = DAG.getConstantFP(SmallestNorm, DL, VT);
20448 SDValue FPZero = DAG.getConstantFP(0.0, DL, VT);
20449 SDValue Fabs = DAG.getNode(ISD::FABS, DL, VT, Op);
20450 SDValue IsDenorm = DAG.getSetCC(DL, CCVT, Fabs, NormC, ISD::SETLT);
20454 SDValue FPZero = DAG.getConstantFP(0.0, DL, VT);
20455 SDValue IsZero = DAG.getSetCC(DL, CCVT, Op, FPZero, ISD::SETEQ);
20466 SDValue DAGCombiner::buildRsqrtEstimate(SDValue Op, SDNodeFlags Flags) {
20466 SDValue DAGCombiner::buildRsqrtEstimate(SDValue Op, SDNodeFlags Flags) {
20470 SDValue DAGCombiner::buildSqrtEstimate(SDValue Op, SDNodeFlags Flags) {
20470 SDValue DAGCombiner::buildSqrtEstimate(SDValue Op, SDNodeFlags Flags) {
20480 SDValue BasePtr;
20604 void DAGCombiner::GatherAllAliases(SDNode *N, SDValue OriginalChain,
20605 SmallVectorImpl<SDValue> &Aliases) {
20606 SmallVector<SDValue, 8> Chains; // List of chains to visit.
20618 std::function<bool(SDValue &)> ImproveChain = [&](SDValue &C) -> bool {
20664 SDValue Chain = Chains.pop_back_val();
20711 SDValue DAGCombiner::FindBetterChain(SDNode *N, SDValue OldChain) {
20711 SDValue DAGCombiner::FindBetterChain(SDNode *N, SDValue OldChain) {
20716 SmallVector<SDValue, 8> Aliases;
20816 SDValue NewChain = STChain->getChain();
20817 SmallVector<SDValue, 8> TFOps;
20820 SDValue BetterChain = FindBetterChain(S, NewChain);
20828 SDValue BetterChain = FindBetterChain(St, NewChain);
20829 SDValue NewST;
20850 SDValue TF = DAG.getTokenFactor(SDLoc(STChain), TFOps);
20855 for (const SDValue &Op : TF->ops())
20880 SDValue BetterChain = FindBetterChain(St, St->getChain());
lib/CodeGen/SelectionDAG/InstrEmitter.cpp 87 unsigned SrcReg, DenseMap<SDValue, unsigned> &VRBaseMap) {
91 SDValue Op(Node, ResNo);
124 SDValue Op = User->getOperand(i);
181 SDValue Op(Node, ResNo);
193 DenseMap<SDValue, unsigned> &VRBaseMap) {
254 SDValue Op(Node, i);
266 unsigned InstrEmitter::getVR(SDValue Op,
267 DenseMap<SDValue, unsigned> &VRBaseMap) {
281 DenseMap<SDValue, unsigned>::iterator I = VRBaseMap.find(Op);
292 SDValue Op,
295 DenseMap<SDValue, unsigned> &VRBaseMap,
363 SDValue Op,
366 DenseMap<SDValue, unsigned> &VRBaseMap,
476 DenseMap<SDValue, unsigned> &VRBaseMap,
550 SDValue N0 = Node->getOperand(0);
551 SDValue N1 = Node->getOperand(1);
552 SDValue N2 = Node->getOperand(2);
597 SDValue Op(Node, 0);
609 DenseMap<SDValue, unsigned> &VRBaseMap) {
620 SDValue Op(Node, 0);
629 DenseMap<SDValue, unsigned> &VRBaseMap,
646 SDValue Op = Node->getOperand(i);
668 SDValue Op(Node, 0);
678 DenseMap<SDValue, unsigned> &VRBaseMap) {
716 SDValue Op = SDValue(Node, SD->getResNo());
722 DenseMap<SDValue, unsigned>::iterator I = VRBaseMap.find(Op);
783 DenseMap<SDValue, unsigned> &VRBaseMap) {
981 DenseMap<SDValue, unsigned> &VRBaseMap) {
995 SDValue SrcVal = Node->getOperand(2);
1058 SDValue AsmStrV = Node->getOperand(InlineAsm::Op_AsmString);
1146 SDValue MDV = Node->getOperand(InlineAsm::Op_MDNode);
lib/CodeGen/SelectionDAG/InstrEmitter.h 43 DenseMap<SDValue, unsigned> &VRBaseMap);
49 DenseMap<SDValue, unsigned> &VRBaseMap);
53 unsigned getVR(SDValue Op,
54 DenseMap<SDValue, unsigned> &VRBaseMap);
60 SDValue Op,
63 DenseMap<SDValue, unsigned> &VRBaseMap,
71 SDValue Op,
74 DenseMap<SDValue, unsigned> &VRBaseMap,
85 void EmitSubregNode(SDNode *Node, DenseMap<SDValue, unsigned> &VRBaseMap,
93 DenseMap<SDValue, unsigned> &VRBaseMap);
97 void EmitRegSequence(SDNode *Node, DenseMap<SDValue, unsigned> &VRBaseMap,
108 DenseMap<SDValue, unsigned> &VRBaseMap);
116 DenseMap<SDValue, unsigned> &VRBaseMap) {
135 DenseMap<SDValue, unsigned> &VRBaseMap);
137 DenseMap<SDValue, unsigned> &VRBaseMap);
lib/CodeGen/SelectionDAG/LegalizeDAG.cpp 64 SDValue Chain;
65 SDValue FloatPtr;
66 SDValue IntPtr;
69 SDValue IntValue;
114 SDValue OptimizeFloatStore(StoreSDNode *ST);
123 SDValue PerformInsertVectorEltInMemory(SDValue Vec, SDValue Val, SDValue Idx,
123 SDValue PerformInsertVectorEltInMemory(SDValue Vec, SDValue Val, SDValue Idx,
123 SDValue PerformInsertVectorEltInMemory(SDValue Vec, SDValue Val, SDValue Idx,
123 SDValue PerformInsertVectorEltInMemory(SDValue Vec, SDValue Val, SDValue Idx,
125 SDValue ExpandINSERT_VECTOR_ELT(SDValue Vec, SDValue Val, SDValue Idx,
125 SDValue ExpandINSERT_VECTOR_ELT(SDValue Vec, SDValue Val, SDValue Idx,
125 SDValue ExpandINSERT_VECTOR_ELT(SDValue Vec, SDValue Val, SDValue Idx,
125 SDValue ExpandINSERT_VECTOR_ELT(SDValue Vec, SDValue Val, SDValue Idx,
132 SDValue ShuffleWithNarrowerEltType(EVT NVT, EVT VT, const SDLoc &dl,
133 SDValue N1, SDValue N2,
133 SDValue N1, SDValue N2,
136 bool LegalizeSetCCCondCode(EVT VT, SDValue &LHS, SDValue &RHS, SDValue &CC,
136 bool LegalizeSetCCCondCode(EVT VT, SDValue &LHS, SDValue &RHS, SDValue &CC,
136 bool LegalizeSetCCCondCode(EVT VT, SDValue &LHS, SDValue &RHS, SDValue &CC,
139 SDValue ExpandLibCall(RTLIB::Libcall LC, SDNode *Node, bool isSigned);
141 std::pair<SDValue, SDValue> ExpandChainLibCall(RTLIB::Libcall LC,
141 std::pair<SDValue, SDValue> ExpandChainLibCall(RTLIB::Libcall LC,
143 SDValue ExpandFPLibCall(SDNode *Node, RTLIB::Libcall Call_F32,
147 SDValue ExpandIntLibCall(SDNode *Node, bool isSigned,
153 SDValue ExpandArgFPLibCall(SDNode *Node,
157 void ExpandDivRemLibCall(SDNode *Node, SmallVectorImpl<SDValue> &Results);
158 void ExpandSinCosLibCall(SDNode *Node, SmallVectorImpl<SDValue> &Results);
160 SDValue EmitStackConvert(SDValue SrcOp, EVT SlotVT, EVT DestVT,
160 SDValue EmitStackConvert(SDValue SrcOp, EVT SlotVT, EVT DestVT,
162 SDValue EmitStackConvert(SDValue SrcOp, EVT SlotVT, EVT DestVT,
162 SDValue EmitStackConvert(SDValue SrcOp, EVT SlotVT, EVT DestVT,
163 const SDLoc &dl, SDValue ChainIn);
164 SDValue ExpandBUILD_VECTOR(SDNode *Node);
165 SDValue ExpandSPLAT_VECTOR(SDNode *Node);
166 SDValue ExpandSCALAR_TO_VECTOR(SDNode *Node);
168 SmallVectorImpl<SDValue> &Results);
170 SDValue Value) const;
171 SDValue modifySignAsInt(const FloatSignAsInt &State, const SDLoc &DL,
172 SDValue NewIntValue) const;
173 SDValue ExpandFCOPYSIGN(SDNode *Node) const;
174 SDValue ExpandFABS(SDNode *Node) const;
175 SDValue ExpandLegalINT_TO_FP(bool isSigned, SDValue Op0, EVT DestVT,
175 SDValue ExpandLegalINT_TO_FP(bool isSigned, SDValue Op0, EVT DestVT,
177 SDValue PromoteLegalINT_TO_FP(SDValue LegalOp, EVT DestVT, bool isSigned,
177 SDValue PromoteLegalINT_TO_FP(SDValue LegalOp, EVT DestVT, bool isSigned,
179 SDValue PromoteLegalFP_TO_INT(SDValue LegalOp, EVT DestVT, bool isSigned,
179 SDValue PromoteLegalFP_TO_INT(SDValue LegalOp, EVT DestVT, bool isSigned,
182 SDValue ExpandBITREVERSE(SDValue Op, const SDLoc &dl);
182 SDValue ExpandBITREVERSE(SDValue Op, const SDLoc &dl);
183 SDValue ExpandBSWAP(SDValue Op, const SDLoc &dl);
183 SDValue ExpandBSWAP(SDValue Op, const SDLoc &dl);
185 SDValue ExpandExtractFromVectorThroughStack(SDValue Op);
185 SDValue ExpandExtractFromVectorThroughStack(SDValue Op);
186 SDValue ExpandInsertToVectorThroughStack(SDValue Op);
186 SDValue ExpandInsertToVectorThroughStack(SDValue Op);
187 SDValue ExpandVectorBuildThroughStack(SDNode* Node);
189 SDValue ExpandConstantFP(ConstantFPSDNode *CFP, bool UseCP);
190 SDValue ExpandConstant(ConstantSDNode *CP);
219 void ReplaceNode(SDValue Old, SDValue New) {
219 void ReplaceNode(SDValue Old, SDValue New) {
229 void ReplaceNode(SDNode *Old, const SDValue *New) {
242 void ReplaceNodeWithValue(SDValue Old, SDValue New) {
242 void ReplaceNodeWithValue(SDValue Old, SDValue New) {
259 SDValue SelectionDAGLegalize::ShuffleWithNarrowerEltType(
260 EVT NVT, EVT VT, const SDLoc &dl, SDValue N1, SDValue N2,
260 EVT NVT, EVT VT, const SDLoc &dl, SDValue N1, SDValue N2,
288 SDValue
329 SDValue CPIdx =
333 SDValue Result = DAG.getExtLoad(
339 SDValue Result = DAG.getLoad(
346 SDValue SelectionDAGLegalize::ExpandConstant(ConstantSDNode *CP) {
349 SDValue CPIdx = DAG.getConstantPool(CP->getConstantIntValue(),
352 SDValue Result = DAG.getLoad(
362 SDValue SelectionDAGLegalize::PerformInsertVectorEltInMemory(SDValue Vec,
362 SDValue SelectionDAGLegalize::PerformInsertVectorEltInMemory(SDValue Vec,
363 SDValue Val,
364 SDValue Idx,
366 SDValue Tmp1 = Vec;
367 SDValue Tmp2 = Val;
368 SDValue Tmp3 = Idx;
378 SDValue StackPtr = DAG.CreateStackTemporary(VT);
383 SDValue Ch = DAG.getStore(
387 SDValue StackPtr2 = TLI.getVectorElementPointer(DAG, StackPtr, VT, Tmp3);
396 SDValue SelectionDAGLegalize::ExpandINSERT_VECTOR_ELT(SDValue Vec, SDValue Val,
396 SDValue SelectionDAGLegalize::ExpandINSERT_VECTOR_ELT(SDValue Vec, SDValue Val,
396 SDValue SelectionDAGLegalize::ExpandINSERT_VECTOR_ELT(SDValue Vec, SDValue Val,
397 SDValue Idx,
406 SDValue ScVec = DAG.getNode(ISD::SCALAR_TO_VECTOR, dl,
423 SDValue SelectionDAGLegalize::OptimizeFloatStore(StoreSDNode* ST) {
432 SDValue Chain = ST->getChain();
433 SDValue Ptr = ST->getBasePtr();
441 SDValue Con = DAG.getConstant(CFP->getValueAPF().
451 SDValue Con = DAG.getConstant(CFP->getValueAPF().bitcastToAPInt().
462 SDValue Lo = DAG.getConstant(IntVal.trunc(32), dl, MVT::i32);
463 SDValue Hi = DAG.getConstant(IntVal.lshr(32).trunc(32), dl, MVT::i32);
484 SDValue Chain = ST->getChain();
485 SDValue Ptr = ST->getBasePtr();
499 SDValue Value = ST->getValue();
511 SDValue Result = TLI.expandUnalignedStore(ST, DAG);
519 SDValue Res = TLI.LowerOperation(SDValue(Node, 0), DAG);
529 SDValue Result =
540 SDValue Value = ST->getValue();
552 SDValue Result =
569 SDValue Lo, Hi;
614 SDValue Result = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Lo, Hi);
625 SDValue Result = TLI.expandUnalignedStore(ST, DAG);
631 SDValue Res = TLI.LowerOperation(SDValue(Node, 0), DAG);
640 SDValue Result;
665 SDValue Chain = LD->getChain(); // The chain.
666 SDValue Ptr = LD->getBasePtr(); // The base pointer.
667 SDValue Value; // The value returned by the load op.
674 SDValue RVal = SDValue(Node, 0);
675 SDValue RChain = SDValue(Node, 1);
691 if (SDValue Res = TLI.LowerOperation(RVal, DAG)) {
702 SDValue Res = DAG.getLoad(NVT, dl, Chain, Ptr, LD->getMemOperand());
743 SDValue Ch;
751 SDValue Result =
783 SDValue Lo, Hi, Ch;
864 if (SDValue Res = TLI.LowerOperation(SDValue(Node, 0), DAG)) {
893 SDValue Load = DAG.getExtLoad(MidExtType, dl, LoadVT, Chain, Ptr,
911 SDValue Result = DAG.getExtLoad(ISD::ZEXTLOAD, dl, ILoadVT, Chain,
930 SDValue Result = DAG.getExtLoad(ISD::EXTLOAD, dl,
934 SDValue ValRes;
977 for (const SDValue &Op : Node->op_values())
1100 SDValue NewVal;
1178 SDValue Op0 = Node->getOperand(0);
1179 SDValue Op1 = Node->getOperand(1);
1181 SDValue SAO = DAG.getShiftAmountOperand(Op0.getValueType(), Op1);
1199 SDValue Op0 = Node->getOperand(0);
1200 SDValue Op1 = Node->getOperand(1);
1201 SDValue Op2 = Node->getOperand(2);
1203 SDValue SAO = DAG.getShiftAmountOperand(Op0.getValueType(), Op2);
1226 if (SDValue Res = TLI.LowerOperation(SDValue(Node, 0), DAG)) {
1237 SmallVector<SDValue, 8> ResultVals;
1278 SDValue SelectionDAGLegalize::ExpandExtractFromVectorThroughStack(SDValue Op) {
1278 SDValue SelectionDAGLegalize::ExpandExtractFromVectorThroughStack(SDValue Op) {
1279 SDValue Vec = Op.getOperand(0);
1280 SDValue Idx = Op.getOperand(1);
1295 SDValue StackPtr, Ch;
1335 SDValue NewLoad;
1350 SmallVector<SDValue, 6> NewLoadOperands(NewLoad->op_begin(),
1358 SDValue SelectionDAGLegalize::ExpandInsertToVectorThroughStack(SDValue Op) {
1358 SDValue SelectionDAGLegalize::ExpandInsertToVectorThroughStack(SDValue Op) {
1361 SDValue Vec = Op.getOperand(0);
1362 SDValue Part = Op.getOperand(1);
1363 SDValue Idx = Op.getOperand(2);
1368 SDValue StackPtr = DAG.CreateStackTemporary(VecVT);
1374 SDValue Ch = DAG.getStore(DAG.getEntryNode(), dl, Vec, StackPtr, PtrInfo);
1377 SDValue SubStackPtr = TLI.getVectorElementPointer(DAG, StackPtr, VecVT, Idx);
1386 SDValue SelectionDAGLegalize::ExpandVectorBuildThroughStack(SDNode* Node) {
1394 SDValue FIPtr = DAG.CreateStackTemporary(VT);
1400 SmallVector<SDValue, 8> Stores;
1410 SDValue Idx = DAG.getConstant(Offset, dl, FIPtr.getValueType());
1424 SDValue StoreChain;
1439 SDValue Value) const {
1456 SDValue StackPtr = DAG.CreateStackTemporary(FloatVT, LoadTy);
1465 SDValue IntPtr;
1489 SDValue SelectionDAGLegalize::modifySignAsInt(const FloatSignAsInt &State,
1491 SDValue NewIntValue) const {
1496 SDValue Chain = DAG.getTruncStore(State.Chain, DL, NewIntValue, State.IntPtr,
1502 SDValue SelectionDAGLegalize::ExpandFCOPYSIGN(SDNode *Node) const {
1504 SDValue Mag = Node->getOperand(0);
1505 SDValue Sign = Node->getOperand(1);
1512 SDValue SignMask = DAG.getConstant(SignAsInt.SignMask, DL, IntVT);
1513 SDValue SignBit = DAG.getNode(ISD::AND, DL, IntVT, SignAsInt.IntValue,
1520 SDValue AbsValue = DAG.getNode(ISD::FABS, DL, FloatVT, Mag);
1521 SDValue NegValue = DAG.getNode(ISD::FNEG, DL, FloatVT, AbsValue);
1522 SDValue Cond = DAG.getSetCC(DL, getSetCCResultType(IntVT), SignBit,
1531 SDValue ClearSignMask = DAG.getConstant(~MagAsInt.SignMask, DL, MagVT);
1532 SDValue ClearedSign = DAG.getNode(ISD::AND, DL, MagVT, MagAsInt.IntValue,
1543 SDValue ShiftCnst = DAG.getConstant(ShiftAmount, DL, ShiftVT);
1546 SDValue ShiftCnst = DAG.getConstant(-ShiftAmount, DL, ShiftVT);
1554 SDValue CopiedSign = DAG.getNode(ISD::OR, DL, MagVT, ClearedSign, SignBit);
1558 SDValue SelectionDAGLegalize::ExpandFABS(SDNode *Node) const {
1560 SDValue Value = Node->getOperand(0);
1565 SDValue Zero = DAG.getConstantFP(0.0, DL, FloatVT);
1573 SDValue ClearSignMask = DAG.getConstant(~ValueAsInt.SignMask, DL, IntVT);
1574 SDValue ClearedSign = DAG.getNode(ISD::AND, DL, IntVT, ValueAsInt.IntValue,
1580 SmallVectorImpl<SDValue> &Results) {
1586 SDValue Tmp1 = SDValue(Node, 0);
1587 SDValue Tmp2 = SDValue(Node, 1);
1588 SDValue Tmp3 = Node->getOperand(2);
1589 SDValue Chain = Tmp1.getOperand(0);
1595 SDValue Size = Tmp2.getOperand(1);
1596 SDValue SP = DAG.getCopyFromReg(Chain, dl, SPReg, VT);
1632 bool SelectionDAGLegalize::LegalizeSetCCCondCode(EVT VT, SDValue &LHS,
1633 SDValue &RHS, SDValue &CC,
1633 SDValue &RHS, SDValue &CC,
1714 SDValue SetCC1, SetCC2;
1738 SDValue SelectionDAGLegalize::EmitStackConvert(SDValue SrcOp, EVT SlotVT,
1738 SDValue SelectionDAGLegalize::EmitStackConvert(SDValue SrcOp, EVT SlotVT,
1743 SDValue SelectionDAGLegalize::EmitStackConvert(SDValue SrcOp, EVT SlotVT,
1743 SDValue SelectionDAGLegalize::EmitStackConvert(SDValue SrcOp, EVT SlotVT,
1745 SDValue Chain) {
1749 SDValue FIPtr = DAG.CreateStackTemporary(SlotVT, SrcAlign);
1764 SDValue Store;
1784 SDValue SelectionDAGLegalize::ExpandSCALAR_TO_VECTOR(SDNode *Node) {
1788 SDValue StackPtr = DAG.CreateStackTemporary(Node->getValueType(0));
1793 SDValue Ch = DAG.getTruncStore(
1804 const TargetLowering &TLI, SDValue &Res) {
1817 SmallVector<std::pair<SDValue, SmallVector<int, 16>>, 16> IntermedVals,
1820 SDValue V = Node->getOperand(i);
1824 SDValue Vec;
1853 SDValue Shuffle;
1874 SDValue Vec1 = IntermedVals[0].first;
1875 SDValue Vec2;
1898 SDValue SelectionDAGLegalize::ExpandBUILD_VECTOR(SDNode *Node) {
1900 SDValue Value1, Value2;
1912 SDValue V = Node->getOperand(i);
1962 SDValue CPIdx =
1971 SmallSet<SDValue, 16> DefinedValues;
1982 SDValue V = Node->getOperand(i);
1989 SDValue Vec1 = DAG.getNode(ISD::SCALAR_TO_VECTOR, dl, VT, Value1);
1990 SDValue Vec2;
2000 SDValue Res;
2010 SDValue SelectionDAGLegalize::ExpandSPLAT_VECTOR(SDNode *Node) {
2013 SDValue SplatVal = Node->getOperand(0);
2022 SDValue SelectionDAGLegalize::ExpandLibCall(RTLIB::Libcall LC, SDNode *Node,
2026 for (const SDValue &Op : Node->op_values()) {
2035 SDValue Callee = DAG.getExternalSymbol(TLI.getLibcallName(LC),
2045 SDValue InChain = DAG.getEntryNode();
2049 SDValue TCChain = InChain;
2068 std::pair<SDValue, SDValue> CallInfo = TLI.LowerCallTo(CLI);
2068 std::pair<SDValue, SDValue> CallInfo = TLI.LowerCallTo(CLI);
2082 std::pair<SDValue, SDValue>
2082 std::pair<SDValue, SDValue>
2086 SDValue InChain = Node->getOperand(0);
2099 SDValue Callee = DAG.getExternalSymbol(TLI.getLibcallName(LC),
2112 std::pair<SDValue, SDValue> CallInfo = TLI.LowerCallTo(CLI);
2112 std::pair<SDValue, SDValue> CallInfo = TLI.LowerCallTo(CLI);
2117 SDValue SelectionDAGLegalize::ExpandFPLibCall(SDNode* Node,
2138 SDValue SelectionDAGLegalize::ExpandIntLibCall(SDNode* Node, bool isSigned,
2158 SDValue SelectionDAGLegalize::ExpandArgFPLibCall(SDNode* Node,
2183 SmallVectorImpl<SDValue> &Results) {
2200 SDValue InChain = DAG.getEntryNode();
2207 for (const SDValue &Op : Node->op_values()) {
2218 SDValue FIPtr = DAG.CreateStackTemporary(RetVT);
2225 SDValue Callee = DAG.getExternalSymbol(TLI.getLibcallName(LC),
2237 std::pair<SDValue, SDValue> CallInfo = TLI.LowerCallTo(CLI);
2237 std::pair<SDValue, SDValue> CallInfo = TLI.LowerCallTo(CLI);
2240 SDValue Rem =
2265 SDValue Op0 = Node->getOperand(0);
2281 SmallVectorImpl<SDValue> &Results) {
2295 SDValue InChain = DAG.getEntryNode();
2311 SDValue SinPtr = DAG.CreateStackTemporary(RetVT);
2319 SDValue CosPtr = DAG.CreateStackTemporary(RetVT);
2326 SDValue Callee = DAG.getExternalSymbol(TLI.getLibcallName(LC),
2335 std::pair<SDValue, SDValue> CallInfo = TLI.LowerCallTo(CLI);
2335 std::pair<SDValue, SDValue> CallInfo = TLI.LowerCallTo(CLI);
2347 SDValue SelectionDAGLegalize::ExpandLegalINT_TO_FP(bool isSigned, SDValue Op0,
2347 SDValue SelectionDAGLegalize::ExpandLegalINT_TO_FP(bool isSigned, SDValue Op0,
2359 SDValue StackSlot = DAG.CreateStackTemporary(MVT::f64);
2362 SDValue WordOff = DAG.getConstant(sizeof(int), dl,
2365 SDValue Hi = StackSlot;
2366 SDValue Lo = DAG.getNode(ISD::ADD, dl, StackSlot.getValueType(),
2372 SDValue Op0Mapped;
2375 SDValue SignBit = DAG.getConstant(0x80000000u, dl, MVT::i32);
2381 SDValue Store1 = DAG.getStore(DAG.getEntryNode(), dl, Op0Mapped, Lo,
2384 SDValue InitialHi = DAG.getConstant(0x43300000u, dl, MVT::i32);
2386 SDValue Store2 =
2389 SDValue Load =
2392 SDValue Bias = DAG.getConstantFP(isSigned ?
2397 SDValue Sub = DAG.getNode(ISD::FSUB, dl, MVT::f64, Load, Bias);
2399 SDValue Result = DAG.getFPExtendOrRound(Sub, dl, DestVT);
2405 SDValue Tmp1 = DAG.getNode(ISD::SINT_TO_FP, dl, DestVT, Op0);
2407 SDValue SignSet = DAG.getSetCC(dl, getSetCCResultType(SrcVT), Op0,
2409 SDValue Zero = DAG.getIntPtrConstant(0, dl),
2411 SDValue CstOffset = DAG.getSelect(dl, Zero.getValueType(),
2430 SDValue CPIdx =
2435 SDValue FudgeInReg;
2442 SDValue Load = DAG.getExtLoad(
2459 SDValue SelectionDAGLegalize::PromoteLegalINT_TO_FP(SDValue LegalOp, EVT DestVT,
2459 SDValue SelectionDAGLegalize::PromoteLegalINT_TO_FP(SDValue LegalOp, EVT DestVT,
2500 SDValue SelectionDAGLegalize::PromoteLegalFP_TO_INT(SDValue LegalOp, EVT DestVT,
2500 SDValue SelectionDAGLegalize::PromoteLegalFP_TO_INT(SDValue LegalOp, EVT DestVT,
2530 SDValue Operation = DAG.getNode(OpToUse, dl, NewOutTy, LegalOp);
2538 SDValue SelectionDAGLegalize::ExpandBITREVERSE(SDValue Op, const SDLoc &dl) {
2538 SDValue SelectionDAGLegalize::ExpandBITREVERSE(SDValue Op, const SDLoc &dl) {
2543 SDValue Tmp, Tmp2, Tmp3;
2602 SDValue SelectionDAGLegalize::ExpandBSWAP(SDValue Op, const SDLoc &dl) {
2602 SDValue SelectionDAGLegalize::ExpandBSWAP(SDValue Op, const SDLoc &dl) {
2605 SDValue Tmp1, Tmp2, Tmp3, Tmp4, Tmp5, Tmp6, Tmp7, Tmp8;
2655 SmallVector<SDValue, 8> Results;
2657 SDValue Tmp1, Tmp2, Tmp3, Tmp4;
2690 SDValue CfaArg = DAG.getSExtOrTrunc(Node->getOperand(0), dl,
2692 SDValue Offset = DAG.getNode(ISD::ADD, dl,
2697 SDValue FA = DAG.getNode(
2731 SDValue Zero = DAG.getConstant(0, dl, Node->getValueType(0));
2733 SDValue Swap = DAG.getAtomicCmpSwap(
2743 SDValue Swap = DAG.getAtomic(ISD::ATOMIC_SWAP, dl,
2756 SDValue Res = DAG.getAtomicCmpSwap(
2761 SDValue ExtRes = Res;
2762 SDValue LHS = Res;
2763 SDValue RHS = Node->getOperand(1);
2789 SDValue Success =
2865 SDValue One = DAG.getConstant(1, dl, VT);
2866 SDValue And = DAG.getNode(ISD::AND, dl, VT, Node->getOperand(0), One);
2867 SDValue Zero = DAG.getConstant(0, dl, VT);
2868 SDValue Neg = DAG.getNode(ISD::SUB, dl, VT, Zero, And);
2878 SDValue ShiftCst = DAG.getConstant(BitsDiff, dl, ShiftAmountTy);
2960 SDValue Op0 = Node->getOperand(0);
2961 SDValue Op1 = Node->getOperand(1);
3006 SmallVector<SDValue, 16> Ops;
3109 if (SDValue Expanded = TLI.expandFMINNUM_FMAXNUM(Node, DAG))
3137 SDValue Res =
3146 SDValue Op = Node->getOperand(0);
3152 SDValue FloatVal = DAG.getNode(ISD::FP_ROUND, dl, MVT::f32, Op,
3244 SDValue LHS = Node->getOperand(0);
3245 SDValue RHS = Node->getOperand(1);
3256 SmallVector<SDValue, 4> Halves;
3263 SDValue Lo = DAG.getNode(ISD::ZERO_EXTEND, dl, VT, Halves[2 * i]);
3264 SDValue Hi = DAG.getNode(ISD::ANY_EXTEND, dl, VT, Halves[2 * i + 1]);
3265 SDValue Shift = DAG.getConstant(
3303 SDValue Lo, Hi;
3313 SDValue Shift =
3345 SDValue LHS = Node->getOperand(0);
3346 SDValue RHS = Node->getOperand(1);
3347 SDValue Carry = Node->getOperand(2);
3354 SDValue Sum = DAG.getNode(Op, dl, VT, LHS, RHS);
3360 SDValue Overflow = DAG.getSetCC(dl, SetCCType, Sum, LHS, CC);
3363 SDValue CarryExt =
3365 SDValue Sum2 = DAG.getNode(Op, dl, VT, Sum, CarryExt);
3371 SDValue Zero = DAG.getConstant(0, dl, VT);
3372 SDValue Overflow2 =
3378 SDValue ResultCarry =
3387 SDValue Result, Overflow;
3395 SDValue Result, Overflow;
3403 SDValue Result, Overflow;
3438 SDValue Chain = Node->getOperand(0);
3439 SDValue Table = Node->getOperand(1);
3440 SDValue Index = Node->getOperand(2);
3459 SDValue Addr = DAG.getNode(ISD::ADD, dl, Index.getValueType(),
3463 SDValue LD = DAG.getExtLoad(
3556 SDValue CC = Node->getOperand(4);
3567 SDValue Cond = DAG.getNode(ISD::SETCC, dl, CCVT, Tmp1, Tmp2, CC, Node->getFlags());
3667 SmallVector<SDValue, 8> Scalars;
3669 SDValue Ex = DAG.getNode(
3672 SDValue Sh = DAG.getNode(
3679 SDValue Result = DAG.getBuildVector(Node->getValueType(0), dl, Scalars);
3751 SmallVector<SDValue, 8> Results;
3771 std::pair<SDValue, SDValue> CallResult = TLI.LowerCallTo(CLI);
3771 std::pair<SDValue, SDValue> CallResult = TLI.LowerCallTo(CLI);
3796 std::pair<SDValue, SDValue> Tmp = ExpandChainLibCall(LC, Node, false);
3796 std::pair<SDValue, SDValue> Tmp = ExpandChainLibCall(LC, Node, false);
3811 std::pair<SDValue, SDValue> CallResult = TLI.LowerCallTo(CLI);
3811 std::pair<SDValue, SDValue> CallResult = TLI.LowerCallTo(CLI);
4123 SmallVector<SDValue, 8> Results;
4136 SDValue Tmp1, Tmp2, Tmp3;
4192 SDValue Chain = Node->getOperand(0); // Get the chain.
4193 SDValue Ptr = Node->getOperand(1); // Get the pointer.
4423 SmallVector<SDValue, 8> NewOps;
4425 SDValue Op = Node->getOperand(I);
4430 SDValue Concat = DAG.getNode(ISD::CONCAT_VECTORS, SL, NVT, NewOps);
4431 SDValue CvtVec = DAG.getNode(ISD::BITCAST, SL, OVT, Concat);
4457 SDValue Idx = Node->getOperand(1);
4460 SDValue Factor = DAG.getConstant(NewEltsPerOldElt, SL, IdxVT);
4461 SDValue NewBaseIdx = DAG.getNode(ISD::MUL, SL, IdxVT, Idx, Factor);
4463 SDValue CastVec = DAG.getNode(ISD::BITCAST, SL, NVT, Node->getOperand(0));
4465 SmallVector<SDValue, 8> NewOps;
4467 SDValue IdxOffset = DAG.getConstant(I, SL, IdxVT);
4468 SDValue TmpIdx = DAG.getNode(ISD::ADD, SL, IdxVT, NewBaseIdx, IdxOffset);
4470 SDValue Elt = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, SL, NewEltVT,
4475 SDValue NewVec = DAG.getBuildVector(MidVT, SL, NewOps);
4503 SDValue Val = Node->getOperand(1);
4504 SDValue Idx = Node->getOperand(2);
4508 SDValue Factor = DAG.getConstant(NewEltsPerOldElt, SDLoc(), IdxVT);
4509 SDValue NewBaseIdx = DAG.getNode(ISD::MUL, SL, IdxVT, Idx, Factor);
4511 SDValue CastVec = DAG.getNode(ISD::BITCAST, SL, NVT, Node->getOperand(0));
4512 SDValue CastVal = DAG.getNode(ISD::BITCAST, SL, MidVT, Val);
4514 SDValue NewVec = CastVec;
4516 SDValue IdxOffset = DAG.getConstant(I, SL, IdxVT);
4517 SDValue InEltIdx = DAG.getNode(ISD::ADD, SL, IdxVT, NewBaseIdx, IdxOffset);
4519 SDValue Elt = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, SL, NewEltVT,
4541 SDValue Val = Node->getOperand(0);
4544 SDValue CastVal = DAG.getNode(ISD::BITCAST, SL, MidVT, Val);
4545 SDValue Undef = DAG.getUNDEF(MidVT);
4547 SmallVector<SDValue, 8> NewElts;
4552 SDValue Concat = DAG.getNode(ISD::CONCAT_VECTORS, SL, NVT, NewElts);
4553 SDValue CvtVec = DAG.getNode(ISD::BITCAST, SL, OVT, Concat);
4560 SDValue CastVal = DAG.getNode(ISD::BITCAST, SL, NVT, AM->getVal());
4566 SDValue NewAtomic
lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp 51 SDValue R = SDValue();
115 SDValue DAGTypeLegalizer::SoftenFloatRes_BITCAST(SDNode *N) {
119 SDValue DAGTypeLegalizer::SoftenFloatRes_MERGE_VALUES(SDNode *N,
121 SDValue Op = DisintegrateMERGE_VALUES(N, ResNo);
125 SDValue DAGTypeLegalizer::SoftenFloatRes_BUILD_PAIR(SDNode *N) {
134 SDValue DAGTypeLegalizer::SoftenFloatRes_ConstantFP(SDNode *N) {
158 SDValue DAGTypeLegalizer::SoftenFloatRes_EXTRACT_VECTOR_ELT(SDNode *N, unsigned ResNo) {
159 SDValue NewOp = BitConvertVectorToIntegerVector(N->getOperand(0));
165 SDValue DAGTypeLegalizer::SoftenFloatRes_FABS(SDNode *N) {
172 SDValue Mask = DAG.getConstant(API, SDLoc(N), NVT);
173 SDValue Op = GetSoftenedFloat(N->getOperand(0));
177 SDValue DAGTypeLegalizer::SoftenFloatRes_FMINNUM(SDNode *N) {
179 SDValue Ops[2] = { GetSoftenedFloat(N->getOperand(0)),
194 SDValue DAGTypeLegalizer::SoftenFloatRes_FMAXNUM(SDNode *N) {
196 SDValue Ops[2] = { GetSoftenedFloat(N->getOperand(0)),
211 SDValue DAGTypeLegalizer::SoftenFloatRes_FADD(SDNode *N) {
213 SDValue Ops[2] = { GetSoftenedFloat(N->getOperand(0)),
228 SDValue DAGTypeLegalizer::SoftenFloatRes_FCBRT(SDNode *N) {
230 SDValue Op = GetSoftenedFloat(N->getOperand(0));
243 SDValue DAGTypeLegalizer::SoftenFloatRes_FCEIL(SDNode *N) {
245 SDValue Op = GetSoftenedFloat(N->getOperand(0));
258 SDValue DAGTypeLegalizer::SoftenFloatRes_FCOPYSIGN(SDNode *N) {
259 SDValue LHS = GetSoftenedFloat(N->getOperand(0));
260 SDValue RHS = BitConvertToInteger(N->getOperand(1));
270 SDValue SignBit = DAG.getNode(
295 SDValue Mask = DAG.getNode(
306 SDValue DAGTypeLegalizer::SoftenFloatRes_FCOS(SDNode *N) {
308 SDValue Op = GetSoftenedFloat(N->getOperand(0));
321 SDValue DAGTypeLegalizer::SoftenFloatRes_FDIV(SDNode *N) {
323 SDValue Ops[2] = { GetSoftenedFloat(N->getOperand(0)),
338 SDValue DAGTypeLegalizer::SoftenFloatRes_FEXP(SDNode *N) {
340 SDValue Op = GetSoftenedFloat(N->getOperand(0));
353 SDValue DAGTypeLegalizer::SoftenFloatRes_FEXP2(SDNode *N) {
355 SDValue Op = GetSoftenedFloat(N->getOperand(0));
368 SDValue DAGTypeLegalizer::SoftenFloatRes_FFLOOR(SDNode *N) {
370 SDValue Op = GetSoftenedFloat(N->getOperand(0));
383 SDValue DAGTypeLegalizer::SoftenFloatRes_FLOG(SDNode *N) {
385 SDValue Op = GetSoftenedFloat(N->getOperand(0));
398 SDValue DAGTypeLegalizer::SoftenFloatRes_FLOG2(SDNode *N) {
400 SDValue Op = GetSoftenedFloat(N->getOperand(0));
413 SDValue DAGTypeLegalizer::SoftenFloatRes_FLOG10(SDNode *N) {
415 SDValue Op = GetSoftenedFloat(N->getOperand(0));
428 SDValue DAGTypeLegalizer::SoftenFloatRes_FMA(SDNode *N) {
430 SDValue Ops[3] = { GetSoftenedFloat(N->getOperand(0)),
447 SDValue DAGTypeLegalizer::SoftenFloatRes_FMUL(SDNode *N) {
449 SDValue Ops[2] = { GetSoftenedFloat(N->getOperand(0)),
464 SDValue DAGTypeLegalizer::SoftenFloatRes_FNEARBYINT(SDNode *N) {
466 SDValue Op = GetSoftenedFloat(N->getOperand(0));
479 SDValue DAGTypeLegalizer::SoftenFloatRes_FNEG(SDNode *N) {
492 SDValue Ops[2] = { DAG.getConstantFP(-0.0, dl, N->getValueType(0)),
504 SDValue DAGTypeLegalizer::SoftenFloatRes_FP_EXTEND(SDNode *N) {
506 SDValue Op = N->getOperand(0);
536 SDValue DAGTypeLegalizer::SoftenFloatRes_FP16_TO_FP(SDNode *N) {
538 SDValue Op = N->getOperand(0);
542 SDValue Res32 = TLI.makeLibCall(DAG, RTLIB::FPEXT_F16_F32, MidVT, Op,
553 SDValue DAGTypeLegalizer::SoftenFloatRes_FP_ROUND(SDNode *N) {
555 SDValue Op = N->getOperand(0);
570 SDValue DAGTypeLegalizer::SoftenFloatRes_FPOW(SDNode *N) {
572 SDValue Ops[2] = { GetSoftenedFloat(N->getOperand(0)),
587 SDValue DAGTypeLegalizer::SoftenFloatRes_FPOWI(SDNode *N) {
591 SDValue Ops[2] = { GetSoftenedFloat(N->getOperand(0)), N->getOperand(1) };
605 SDValue DAGTypeLegalizer::SoftenFloatRes_FREM(SDNode *N) {
607 SDValue Ops[2] = { GetSoftenedFloat(N->getOperand(0)),
622 SDValue DAGTypeLegalizer::SoftenFloatRes_FRINT(SDNode *N) {
624 SDValue Op = GetSoftenedFloat(N->getOperand(0));
637 SDValue DAGTypeLegalizer::SoftenFloatRes_FROUND(SDNode *N) {
639 SDValue Op = GetSoftenedFloat(N->getOperand(0));
652 SDValue DAGTypeLegalizer::SoftenFloatRes_FSIN(SDNode *N) {
654 SDValue Op = GetSoftenedFloat(N->getOperand(0));
667 SDValue DAGTypeLegalizer::SoftenFloatRes_FSQRT(SDNode *N) {
669 SDValue Op = GetSoftenedFloat(N->getOperand(0));
682 SDValue DAGTypeLegalizer::SoftenFloatRes_FSUB(SDNode *N) {
684 SDValue Ops[2] = { GetSoftenedFloat(N->getOperand(0)),
699 SDValue DAGTypeLegalizer::SoftenFloatRes_FTRUNC(SDNode *N) {
704 SDValue Op = GetSoftenedFloat(N->getOperand(0));
717 SDValue DAGTypeLegalizer::SoftenFloatRes_LOAD(SDNode *N) {
726 SDValue NewL;
747 auto ExtendNode = DAG.getNode(ISD::FP_EXTEND, dl, VT, NewL);
751 SDValue DAGTypeLegalizer::SoftenFloatRes_SELECT(SDNode *N) {
752 SDValue LHS = GetSoftenedFloat(N->getOperand(1));
753 SDValue RHS = GetSoftenedFloat(N->getOperand(2));
758 SDValue DAGTypeLegalizer::SoftenFloatRes_SELECT_CC(SDNode *N) {
759 SDValue LHS = GetSoftenedFloat(N->getOperand(2));
760 SDValue RHS = GetSoftenedFloat(N->getOperand(3));
766 SDValue DAGTypeLegalizer::SoftenFloatRes_UNDEF(SDNode *N) {
771 SDValue DAGTypeLegalizer::SoftenFloatRes_VAARG(SDNode *N) {
772 SDValue Chain = N->getOperand(0); // Get the chain.
773 SDValue Ptr = N->getOperand(1); // Get the pointer.
778 SDValue NewVAARG;
789 SDValue DAGTypeLegalizer::SoftenFloatRes_XINT_TO_FP(SDNode *N) {
810 SDValue Op = DAG.getNode(Signed ? ISD::SIGN_EXTEND : ISD::ZERO_EXTEND, dl,
829 SDValue Res = SDValue();
870 SDValue DAGTypeLegalizer::SoftenFloatOp_BITCAST(SDNode *N) {
871 SDValue Op0 = GetSoftenedFloat(N->getOperand(0));
876 SDValue DAGTypeLegalizer::SoftenFloatOp_FP_EXTEND(SDNode *N) {
880 SDValue Op = GetSoftenedFloat(N->getOperand(0));
895 SDValue DAGTypeLegalizer::SoftenFloatOp_FP_ROUND(SDNode *N) {
907 SDValue Op = GetSoftenedFloat(N->getOperand(0));
914 SDValue DAGTypeLegalizer::SoftenFloatOp_BR_CC(SDNode *N) {
915 SDValue NewLHS = N->getOperand(2), NewRHS = N->getOperand(3);
938 SDValue DAGTypeLegalizer::SoftenFloatOp_FP_TO_XINT(SDNode *N) {
960 SDValue Op = GetSoftenedFloat(N->getOperand(0));
964 SDValue Res = TLI.makeLibCall(DAG, LC, NVT, Op, CallOptions, dl).first;
970 SDValue DAGTypeLegalizer::SoftenFloatOp_SELECT_CC(SDNode *N) {
971 SDValue NewLHS = N->getOperand(0), NewRHS = N->getOperand(1);
994 SDValue DAGTypeLegalizer::SoftenFloatOp_SETCC(SDNode *N) {
995 SDValue NewLHS = N->getOperand(0), NewRHS = N->getOperand(1);
1017 SDValue DAGTypeLegalizer::SoftenFloatOp_STORE(SDNode *N, unsigned OpNo) {
1021 SDValue Val = ST->getValue();
1035 SDValue DAGTypeLegalizer::SoftenFloatOp_LROUND(SDNode *N) {
1038 SDValue Op = GetSoftenedFloat(N->getOperand(0));
1052 SDValue DAGTypeLegalizer::SoftenFloatOp_LLROUND(SDNode *N) {
1055 SDValue Op = GetSoftenedFloat(N->getOperand(0));
1069 SDValue DAGTypeLegalizer::SoftenFloatOp_LRINT(SDNode *N) {
1072 SDValue Op = GetSoftenedFloat(N->getOperand(0));
1086 SDValue DAGTypeLegalizer::SoftenFloatOp_LLRINT(SDNode *N) {
1089 SDValue Op = GetSoftenedFloat(N->getOperand(0));
1113 SDValue Lo, Hi;
1179 void DAGTypeLegalizer::ExpandFloatRes_ConstantFP(SDNode *N, SDValue &Lo,
1180 SDValue &Hi) {
1194 void DAGTypeLegalizer::ExpandFloatRes_FABS(SDNode *N, SDValue &Lo,
1195 SDValue &Hi) {
1199 SDValue Tmp;
1208 void DAGTypeLegalizer::ExpandFloatRes_FMINNUM(SDNode *N, SDValue &Lo,
1209 SDValue &Hi) {
1210 SDValue Call = LibCallify(GetFPLibCall(N->getValueType(0),
1218 void DAGTypeLegalizer::ExpandFloatRes_FMAXNUM(SDNode *N, SDValue &Lo,
1219 SDValue &Hi) {
1220 SDValue Call = LibCallify(GetFPLibCall(N->getValueType(0),
1228 void DAGTypeLegalizer::ExpandFloatRes_FADD(SDNode *N, SDValue &Lo,
1229 SDValue &Hi) {
1230 SDValue Call = LibCallify(GetFPLibCall(N->getValueType(0),
1238 void DAGTypeLegalizer::ExpandFloatRes_FCBRT(SDNode *N, SDValue &Lo,
1239 SDValue &Hi) {
1240 SDValue Call = LibCallify(GetFPLibCall(N->getValueType(0), RTLIB::CBRT_F32,
1248 SDValue &Lo, SDValue &Hi) {
1248 SDValue &Lo, SDValue &Hi) {
1249 SDValue Call = LibCallify(GetFPLibCall(N->getValueType(0),
1258 SDValue &Lo, SDValue &Hi) {
1258 SDValue &Lo, SDValue &Hi) {
1259 SDValue Call = LibCallify(GetFPLibCall(N->getValueType(0),
1270 SDValue &Lo, SDValue &Hi) {
1270 SDValue &Lo, SDValue &Hi) {
1271 SDValue Call = LibCallify(GetFPLibCall(N->getValueType(0),
1279 void DAGTypeLegalizer::ExpandFloatRes_FDIV(SDNode *N, SDValue &Lo,
1280 SDValue &Hi) {
1281 SDValue Ops[2] = { N->getOperand(0), N->getOperand(1) };
1283 SDValue Call = TLI.makeLibCall(DAG, GetFPLibCall(N->getValueType(0),
1295 SDValue &Lo, SDValue &Hi) {
1295 SDValue &Lo, SDValue &Hi) {
1296 SDValue Call = LibCallify(GetFPLibCall(N->getValueType(0),
1305 SDValue &Lo, SDValue &Hi) {
1305 SDValue &Lo, SDValue &Hi) {
1306 SDValue Call = LibCallify(GetFPLibCall(N->getValueType(0),
1315 SDValue &Lo, SDValue &Hi) {
1315 SDValue &Lo, SDValue &Hi) {
1316 SDValue Call = LibCallify(GetFPLibCall(N->getValueType(0),
1325 SDValue &Lo, SDValue &Hi) {
1325 SDValue &Lo, SDValue &Hi) {
1326 SDValue Call = LibCallify(GetFPLibCall(N->getValueType(0),
1335 SDValue &Lo, SDValue &Hi) {
1335 SDValue &Lo, SDValue &Hi) {
1336 SDValue Call = LibCallify(GetFPLibCall(N->getValueType(0),
1345 SDValue &Lo, SDValue &Hi) {
1345 SDValue &Lo, SDValue &Hi) {
1346 SDValue Call = LibCallify(GetFPLibCall(N->getValueType(0),
1354 void DAGTypeLegalizer::ExpandFloatRes_FMA(SDNode *N, SDValue &Lo,
1355 SDValue &Hi) {
1356 SDValue Ops[3] = { N->getOperand(0), N->getOperand(1), N->getOperand(2) };
1358 SDValue Call = TLI.makeLibCall(DAG, GetFPLibCall(N->getValueType(0),
1369 void DAGTypeLegalizer::ExpandFloatRes_FMUL(SDNode *N, SDValue &Lo,
1370 SDValue &Hi) {
1371 SDValue Ops[2] = { N->getOperand(0), N->getOperand(1) };
1373 SDValue Call = TLI.makeLibCall(DAG, GetFPLibCall(N->getValueType(0),
1385 SDValue &Lo, SDValue &Hi) {
1385 SDValue &Lo, SDValue &Hi) {
1386 SDValue Call = LibCallify(GetFPLibCall(N->getValueType(0),
1396 void DAGTypeLegalizer::ExpandFloatRes_FNEG(SDNode *N, SDValue &Lo,
1397 SDValue &Hi) {
1404 void DAGTypeLegalizer::ExpandFloatRes_FP_EXTEND(SDNode *N, SDValue &Lo,
1405 SDValue &Hi) {
1414 SDValue &Lo, SDValue &Hi) {
1414 SDValue &Lo, SDValue &Hi) {
1415 SDValue Call = LibCallify(GetFPLibCall(N->getValueType(0),
1424 SDValue &Lo, SDValue &Hi) {
1424 SDValue &Lo, SDValue &Hi) {
1425 SDValue Call = LibCallify(GetFPLibCall(N->getValueType(0),
1434 SDValue &Lo, SDValue &Hi) {
1434 SDValue &Lo, SDValue &Hi) {
1435 SDValue Call = LibCallify(GetFPLibCall(N->getValueType(0),
1444 SDValue &Lo, SDValue &Hi) {
1444 SDValue &Lo, SDValue &Hi) {
1445 SDValue Call = LibCallify(GetFPLibCall(N->getValueType(0),
1454 SDValue &Lo, SDValue &Hi) {
1454 SDValue &Lo, SDValue &Hi) {
1455 SDValue Call = LibCallify(GetFPLibCall(N->getValueType(0),
1466 SDValue &Lo, SDValue &Hi) {
1466 SDValue &Lo, SDValue &Hi) {
1467 SDValue Call = LibCallify(GetFPLibCall(N->getValueType(0),
1476 SDValue &Lo, SDValue &Hi) {
1476 SDValue &Lo, SDValue &Hi) {
1477 SDValue Call = LibCallify(GetFPLibCall(N->getValueType(0),
1485 void DAGTypeLegalizer::ExpandFloatRes_FSUB(SDNode *N, SDValue &Lo,
1486 SDValue &Hi) {
1487 SDValue Ops[2] = { N->getOperand(0), N->getOperand(1) };
1489 SDValue Call = TLI.makeLibCall(DAG, GetFPLibCall(N->getValueType(0),
1501 SDValue &Lo, SDValue &Hi) {
1501 SDValue &Lo, SDValue &Hi) {
1502 SDValue Call = LibCallify(GetFPLibCall(N->getValueType(0),
1510 void DAGTypeLegalizer::ExpandFloatRes_LOAD(SDNode *N, SDValue &Lo,
1511 SDValue &Hi) {
1519 SDValue Chain = LD->getChain();
1520 SDValue Ptr = LD->getBasePtr();
1542 void DAGTypeLegalizer::ExpandFloatRes_XINT_TO_FP(SDNode *N, SDValue &Lo,
1543 SDValue &Hi) {
1547 SDValue Src = N->getOperand(0);
1628 SDValue Res = SDValue();
1678 void DAGTypeLegalizer::FloatExpandSetCCOperands(SDValue &NewLHS,
1679 SDValue &NewRHS,
1682 SDValue LHSLo, LHSHi, RHSLo, RHSHi;
1693 SDValue Tmp1, Tmp2, Tmp3;
1708 SDValue DAGTypeLegalizer::ExpandFloatOp_BR_CC(SDNode *N) {
1709 SDValue NewLHS = N->getOperand(2), NewRHS = N->getOperand(3);
1726 SDValue DAGTypeLegalizer::ExpandFloatOp_FCOPYSIGN(SDNode *N) {
1729 SDValue Lo, Hi;
1737 SDValue DAGTypeLegalizer::ExpandFloatOp_FP_ROUND(SDNode *N) {
1740 SDValue Lo, Hi;
1747 SDValue DAGTypeLegalizer::ExpandFloatOp_FP_TO_SINT(SDNode *N) {
1757 SDValue DAGTypeLegalizer::ExpandFloatOp_FP_TO_UINT(SDNode *N) {
1768 SDValue DAGTypeLegalizer::ExpandFloatOp_SELECT_CC(SDNode *N) {
1769 SDValue NewLHS = N->getOperand(0), NewRHS = N->getOperand(1);
1786 SDValue DAGTypeLegalizer::ExpandFloatOp_SETCC(SDNode *N) {
1787 SDValue NewLHS = N->getOperand(0), NewRHS = N->getOperand(1);
1803 SDValue DAGTypeLegalizer::ExpandFloatOp_STORE(SDNode *N, unsigned OpNo) {
1811 SDValue Chain = ST->getChain();
1812 SDValue Ptr = ST->getBasePtr();
1820 SDValue Lo, Hi;
1827 SDValue DAGTypeLegalizer::ExpandFloatOp_LROUND(SDNode *N) {
1840 SDValue DAGTypeLegalizer::ExpandFloatOp_LLROUND(SDNode *N) {
1853 SDValue DAGTypeLegalizer::ExpandFloatOp_LRINT(SDNode *N) {
1866 SDValue DAGTypeLegalizer::ExpandFloatOp_LLRINT(SDNode *N) {
1897 SDValue R = SDValue();
1932 SDValue DAGTypeLegalizer::PromoteFloatOp_BITCAST(SDNode *N, unsigned OpNo) {
1933 SDValue Op = N->getOperand(0);
1936 SDValue Promoted = GetPromotedFloat(N->getOperand(0));
1941 SDValue Convert = DAG.getNode(GetPromotionOpcode(PromotedVT, OpVT), SDLoc(N),
1950 SDValue DAGTypeLegalizer::PromoteFloatOp_FCOPYSIGN(SDNode *N, unsigned OpNo) {
1952 SDValue Op1 = GetPromotedFloat(N->getOperand(1));
1959 SDValue DAGTypeLegalizer::PromoteFloatOp_FP_TO_XINT(SDNode *N, unsigned OpNo) {
1960 SDValue Op = GetPromotedFloat(N->getOperand(0));
1964 SDValue DAGTypeLegalizer::PromoteFloatOp_FP_EXTEND(SDNode *N, unsigned OpNo) {
1965 SDValue Op = GetPromotedFloat(N->getOperand(0));
1979 SDValue DAGTypeLegalizer::PromoteFloatOp_SELECT_CC(SDNode *N, unsigned OpNo) {
1980 SDValue LHS = GetPromotedFloat(N->getOperand(0));
1981 SDValue RHS = GetPromotedFloat(N->getOperand(1));
1990 SDValue DAGTypeLegalizer::PromoteFloatOp_SETCC(SDNode *N, unsigned OpNo) {
1993 SDValue Op0 = GetPromotedFloat(N->getOperand(0));
1994 SDValue Op1 = GetPromotedFloat(N->getOperand(1));
2003 SDValue DAGTypeLegalizer::PromoteFloatOp_STORE(SDNode *N, unsigned OpNo) {
2005 SDValue Val = ST->getValue();
2008 SDValue Promoted = GetPromotedFloat(Val);
2012 SDValue NewVal;
2027 SDValue R = SDValue();
2110 SDValue DAGTypeLegalizer::PromoteFloatRes_BITCAST(SDNode *N) {
2117 SDValue Cast = DAG.getBitcast(IVT, N->getOperand(0));
2121 SDValue DAGTypeLegalizer::PromoteFloatRes_ConstantFP(SDNode *N) {
2128 SDValue C = DAG.getConstant(CFPNode->getValueAPF().bitcastToAPInt(), DL,
2142 SDValue DAGTypeLegalizer::PromoteFloatRes_EXTRACT_VECTOR_ELT(SDNode *N) {
2148 SDValue Vec = N->getOperand(0);
2149 SDValue Idx = N->getOperand(1);
2158 SDValue Res = GetScalarizedVector(N->getOperand(0));
2164 SDValue Res = DAG.getNode(N->getOpcode(), DL, EltVT, Vec, Idx);
2169 SDValue Lo, Hi;
2173 SDValue Res;
2188 SDValue NewOp = BitConvertVectorToIntegerVector(N->getOperand(0));
2192 SDValue NewVal = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, IVT,
2204 SDValue DAGTypeLegalizer::PromoteFloatRes_FCOPYSIGN(SDNode *N) {
2207 SDValue Op0 = GetPromotedFloat(N->getOperand(0));
2209 SDValue Op1 = N->getOperand(1);
2217 SDValue DAGTypeLegalizer::PromoteFloatRes_UnaryOp(SDNode *N) {
2220 SDValue Op = GetPromotedFloat(N->getOperand(0));
2228 SDValue DAGTypeLegalizer::PromoteFloatRes_BinOp(SDNode *N) {
2231 SDValue Op0 = GetPromotedFloat(N->getOperand(0));
2232 SDValue Op1 = GetPromotedFloat(N->getOperand(1));
2236 SDValue DAGTypeLegalizer::PromoteFloatRes_FMAD(SDNode *N) {
2239 SDValue Op0 = GetPromotedFloat(N->getOperand(0));
2240 SDValue Op1 = GetPromotedFloat(N->getOperand(1));
2241 SDValue Op2 = GetPromotedFloat(N->getOperand(2));
2247 SDValue DAGTypeLegalizer::PromoteFloatRes_FPOWI(SDNode *N) {
2250 SDValue Op0 = GetPromotedFloat(N->getOperand(0));
2251 SDValue Op1 = N->getOperand(1);
2258 SDValue DAGTypeLegalizer::PromoteFloatRes_FP_ROUND(SDNode *N) {
2261 SDValue Op = N->getOperand(0);
2268 SDValue Round = DAG.getNode(GetPromotionOpcode(OpVT, VT), DL, IVT, Op);
2273 SDValue DAGTypeLegalizer::PromoteFloatRes_LOAD(SDNode *N) {
2279 SDValue newL = DAG.getLoad(L->getAddressingMode(), L->getExtensionType(), IVT,
2295 SDValue DAGTypeLegalizer::PromoteFloatRes_SELECT(SDNode *N) {
2296 SDValue TrueVal = GetPromotedFloat(N->getOperand(1));
2297 SDValue FalseVal = GetPromotedFloat(N->getOperand(2));
2305 SDValue DAGTypeLegalizer::PromoteFloatRes_SELECT_CC(SDNode *N) {
2306 SDValue TrueVal = GetPromotedFloat(N->getOperand(2));
2307 SDValue FalseVal = GetPromotedFloat(N->getOperand(3));
2316 SDValue DAGTypeLegalizer::PromoteFloatRes_XINT_TO_FP(SDNode *N) {
2320 SDValue NV = DAG.getNode(N->getOpcode(), DL, NVT, N->getOperand(0));
2327 SDValue DAGTypeLegalizer::PromoteFloatRes_UNDEF(SDNode *N) {
2332 SDValue DAGTypeLegalizer::BitcastToInt_ATOMIC_SWAP(SDNode *N) {
2339 SDValue CastVal = BitConvertToInteger(AM->getVal());
2342 SDValue NewAtomic
2348 SDValue ResultCast = DAG.getNode(GetPromotionOpcode(VT, NFPVT), SL, NFPVT,
lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp 40 SDValue Res = SDValue();
203 SDValue DAGTypeLegalizer::PromoteIntRes_MERGE_VALUES(SDNode *N,
205 SDValue Op = DisintegrateMERGE_VALUES(N, ResNo);
209 SDValue DAGTypeLegalizer::PromoteIntRes_AssertSext(SDNode *N) {
211 SDValue Op = SExtPromotedInteger(N->getOperand(0));
216 SDValue DAGTypeLegalizer::PromoteIntRes_AssertZext(SDNode *N) {
218 SDValue Op = ZExtPromotedInteger(N->getOperand(0));
223 SDValue DAGTypeLegalizer::PromoteIntRes_Atomic0(AtomicSDNode *N) {
225 SDValue Res = DAG.getAtomic(N->getOpcode(), SDLoc(N),
235 SDValue DAGTypeLegalizer::PromoteIntRes_Atomic1(AtomicSDNode *N) {
236 SDValue Op2 = GetPromotedInteger(N->getOperand(2));
237 SDValue Res = DAG.getAtomic(N->getOpcode(), SDLoc(N),
247 SDValue DAGTypeLegalizer::PromoteIntRes_AtomicCmpSwap(AtomicSDNode *N,
260 SDValue Res = DAG.getAtomicCmpSwap(
269 SDValue Op2 = GetPromotedInteger(N->getOperand(2));
270 SDValue Op3 = GetPromotedInteger(N->getOperand(3));
273 SDValue Res = DAG.getAtomicCmpSwap(
282 SDValue DAGTypeLegalizer::PromoteIntRes_BITCAST(SDNode *N) {
283 SDValue InOp = N->getOperand(0);
320 SDValue Lo, Hi;
381 SDValue DAGTypeLegalizer::PromoteIntRes_BSWAP(SDNode *N) {
382 SDValue Op = GetPromotedInteger(N->getOperand(0));
393 SDValue DAGTypeLegalizer::PromoteIntRes_BITREVERSE(SDNode *N) {
394 SDValue Op = GetPromotedInteger(N->getOperand(0));
406 SDValue DAGTypeLegalizer::PromoteIntRes_BUILD_PAIR(SDNode *N) {
415 SDValue DAGTypeLegalizer::PromoteIntRes_Constant(SDNode *N) {
422 SDValue Result = DAG.getNode(Opc, dl,
429 SDValue DAGTypeLegalizer::PromoteIntRes_CTLZ(SDNode *N) {
431 SDValue Op = ZExtPromotedInteger(N->getOperand(0));
443 SDValue DAGTypeLegalizer::PromoteIntRes_CTPOP(SDNode *N) {
445 SDValue Op = ZExtPromotedInteger(N->getOperand(0));
449 SDValue DAGTypeLegalizer::PromoteIntRes_CTTZ(SDNode *N) {
450 SDValue Op = GetPromotedInteger(N->getOperand(0));
465 SDValue DAGTypeLegalizer::PromoteIntRes_EXTRACT_VECTOR_ELT(SDNode *N) {
469 SDValue Op0 = N->getOperand(0);
470 SDValue Op1 = N->getOperand(1);
476 SDValue In = GetPromotedInteger(Op0);
482 SDValue Ext = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, SVT, In, Op1);
490 SDValue DAGTypeLegalizer::PromoteIntRes_FP_TO_XINT(SDNode *N) {
509 SDValue Res;
532 SDValue DAGTypeLegalizer::PromoteIntRes_FP_TO_FP16(SDNode *N) {
539 SDValue DAGTypeLegalizer::PromoteIntRes_FLT_ROUNDS(SDNode *N) {
546 SDValue DAGTypeLegalizer::PromoteIntRes_INT_EXTEND(SDNode *N) {
552 SDValue Res = GetPromotedInteger(N->getOperand(0));
574 SDValue DAGTypeLegalizer::PromoteIntRes_LOAD(LoadSDNode *N) {
580 SDValue Res = DAG.getExtLoad(ExtType, dl, NVT, N->getChain(), N->getBasePtr(),
589 SDValue DAGTypeLegalizer::PromoteIntRes_MLOAD(MaskedLoadSDNode *N) {
591 SDValue ExtPassThru = GetPromotedInteger(N->getPassThru());
594 SDValue Res = DAG.getMaskedLoad(NVT, dl, N->getChain(), N->getBasePtr(),
603 SDValue DAGTypeLegalizer::PromoteIntRes_MGATHER(MaskedGatherSDNode *N) {
605 SDValue ExtPassThru = GetPromotedInteger(N->getPassThru());
610 SDValue Ops[] = {N->getChain(), ExtPassThru, N->getMask(), N->getBasePtr(),
612 SDValue Res = DAG.getMaskedGather(DAG.getVTList(NVT, MVT::Other),
622 SDValue DAGTypeLegalizer::PromoteIntRes_Overflow(SDNode *N) {
628 SDValue Ops[3] = { N->getOperand(0), N->getOperand(1) };
635 SDValue Res = DAG.getNode(N->getOpcode(), dl, DAG.getVTList(VT, SVT),
646 SDValue DAGTypeLegalizer::PromoteIntRes_ADDSUBSAT(SDNode *N) {
655 SDValue Op1 = N->getOperand(0);
656 SDValue Op2 = N->getOperand(1);
661 SDValue Op1Promoted, Op2Promoted;
690 SDValue ShiftAmount = DAG.getConstant(SHLAmount, dl, SHVT);
696 SDValue Result =
701 SDValue Max =
708 SDValue SatMax = DAG.getConstant(MaxVal, dl, PromotedType);
709 SDValue Add =
717 SDValue SatMin = DAG.getConstant(MinVal, dl, PromotedType);
718 SDValue SatMax = DAG.getConstant(MaxVal, dl, PromotedType);
719 SDValue Result =
727 SDValue DAGTypeLegalizer::PromoteIntRes_MULFIX(SDNode *N) {
730 SDValue Op1Promoted, Op2Promoted;
755 SDValue Result = DAG.getNode(N->getOpcode(), dl, PromotedType, Op1Promoted,
765 SDValue DAGTypeLegalizer::PromoteIntRes_SADDSUBO(SDNode *N, unsigned ResNo) {
771 SDValue LHS = SExtPromotedInteger(N->getOperand(0));
772 SDValue RHS = SExtPromotedInteger(N->getOperand(1));
779 SDValue Res = DAG.getNode(Opcode, dl, NVT, LHS, RHS);
783 SDValue Ofl = DAG.getNode(ISD::SIGN_EXTEND_INREG, dl, NVT, Res,
794 SDValue DAGTypeLegalizer::PromoteIntRes_SELECT(SDNode *N) {
795 SDValue LHS = GetPromotedInteger(N->getOperand(1));
796 SDValue RHS = GetPromotedInteger(N->getOperand(2));
801 SDValue DAGTypeLegalizer::PromoteIntRes_VSELECT(SDNode *N) {
802 SDValue Mask = N->getOperand(0);
804 SDValue LHS = GetPromotedInteger(N->getOperand(1));
805 SDValue RHS = GetPromotedInteger(N->getOperand(2));
810 SDValue DAGTypeLegalizer::PromoteIntRes_SELECT_CC(SDNode *N) {
811 SDValue LHS = GetPromotedInteger(N->getOperand(2));
812 SDValue RHS = GetPromotedInteger(N->getOperand(3));
818 SDValue DAGTypeLegalizer::PromoteIntRes_SETCC(SDNode *N) {
842 SDValue SetCC = DAG.getNode(N->getOpcode(), dl, SVT, N->getOperand(0),
849 SDValue DAGTypeLegalizer::PromoteIntRes_SHL(SDNode *N) {
850 SDValue LHS = GetPromotedInteger(N->getOperand(0));
851 SDValue RHS = N->getOperand(1);
857 SDValue DAGTypeLegalizer::PromoteIntRes_SIGN_EXTEND_INREG(SDNode *N) {
858 SDValue Op = GetPromotedInteger(N->getOperand(0));
863 SDValue DAGTypeLegalizer::PromoteIntRes_SimpleIntBinOp(SDNode *N) {
867 SDValue LHS = GetPromotedInteger(N->getOperand(0));
868 SDValue RHS = GetPromotedInteger(N->getOperand(1));
873 SDValue DAGTypeLegalizer::PromoteIntRes_SExtIntBinOp(SDNode *N) {
875 SDValue LHS = SExtPromotedInteger(N->getOperand(0));
876 SDValue RHS = SExtPromotedInteger(N->getOperand(1));
881 SDValue DAGTypeLegalizer::PromoteIntRes_ZExtIntBinOp(SDNode *N) {
883 SDValue LHS = ZExtPromotedInteger(N->getOperand(0));
884 SDValue RHS = ZExtPromotedInteger(N->getOperand(1));
889 SDValue DAGTypeLegalizer::PromoteIntRes_SRA(SDNode *N) {
891 SDValue LHS = SExtPromotedInteger(N->getOperand(0));
892 SDValue RHS = N->getOperand(1);
898 SDValue DAGTypeLegalizer::PromoteIntRes_SRL(SDNode *N) {
900 SDValue LHS = ZExtPromotedInteger(N->getOperand(0));
901 SDValue RHS = N->getOperand(1);
907 SDValue DAGTypeLegalizer::PromoteIntRes_TRUNCATE(SDNode *N) {
909 SDValue Res;
910 SDValue InOp = N->getOperand(0);
931 SDValue EOp1, EOp2;
942 SDValue WideInOp = GetWidenedVector(InOp);
948 SDValue WideTrunc = DAG.getNode(ISD::TRUNCATE, dl, TruncVT, WideInOp);
953 SDValue WideExt = DAG.getNode(ISD::ZERO_EXTEND, dl, ExtVT, WideTrunc);
957 SDValue ZeroIdx = DAG.getConstant(0, dl, IdxTy);
966 SDValue DAGTypeLegalizer::PromoteIntRes_UADDSUBO(SDNode *N, unsigned ResNo) {
972 SDValue LHS = ZExtPromotedInteger(N->getOperand(0));
973 SDValue RHS = ZExtPromotedInteger(N->getOperand(1));
980 SDValue Res = DAG.getNode(Opcode, dl, NVT, LHS, RHS);
984 SDValue Ofl = DAG.getZeroExtendInReg(Res, dl, OVT.getScalarType());
997 SDValue DAGTypeLegalizer::PromoteIntRes_ADDSUBCARRY(SDNode *N, unsigned ResNo) {
1011 SDValue LHS = SExtPromotedInteger(N->getOperand(0));
1012 SDValue RHS = SExtPromotedInteger(N->getOperand(1));
1017 SDValue Res = DAG.getNode(N->getOpcode(), SDLoc(N), DAG.getVTList(ValueVTs),
1026 SDValue DAGTypeLegalizer::PromoteIntRes_ABS(SDNode *N) {
1027 SDValue Op0 = SExtPromotedInteger(N->getOperand(0));
1031 SDValue DAGTypeLegalizer::PromoteIntRes_XMULO(SDNode *N, unsigned ResNo) {
1036 SDValue LHS = N->getOperand(0), RHS = N->getOperand(1);
1052 SDValue Mul = DAG.getNode(N->getOpcode(), DL, VTs, LHS, RHS);
1057 SDValue Overflow;
1062 SDValue Hi = DAG.getNode(ISD::SRL, DL, Mul.getValueType(), Mul,
1069 SDValue SExt = DAG.getNode(ISD::SIGN_EXTEND_INREG, DL, Mul.getValueType(),
1084 SDValue DAGTypeLegalizer::PromoteIntRes_UNDEF(SDNode *N) {
1089 SDValue DAGTypeLegalizer::PromoteIntRes_VAARG(SDNode *N) {
1090 SDValue Chain = N->getOperand(0); // Get the chain.
1091 SDValue Ptr = N->getOperand(1); // Get the pointer.
1099 SmallVector<SDValue, 8> Parts(NumRegs);
1112 SDValue Res = DAG.getNode(ISD::ZERO_EXTEND, dl, NVT, Parts[0]);
1114 SDValue Part = DAG.getNode(ISD::ZERO_EXTEND, dl, NVT, Parts[i]);
1140 SDValue Res = SDValue();
1243 void DAGTypeLegalizer::PromoteSetCCOperands(SDValue &NewLHS,SDValue &NewRHS,
1243 void DAGTypeLegalizer::PromoteSetCCOperands(SDValue &NewLHS,SDValue &NewRHS,
1253 SDValue OpL = GetPromotedInteger(NewLHS);
1254 SDValue OpR = GetPromotedInteger(NewRHS);
1291 SDValue DAGTypeLegalizer::PromoteIntOp_ANY_EXTEND(SDNode *N) {
1292 SDValue Op = GetPromotedInteger(N->getOperand(0));
1296 SDValue DAGTypeLegalizer::PromoteIntOp_ATOMIC_STORE(AtomicSDNode *N) {
1297 SDValue Op2 = GetPromotedInteger(N->getOperand(2));
1302 SDValue DAGTypeLegalizer::PromoteIntOp_BITCAST(SDNode *N) {
1308 SDValue DAGTypeLegalizer::PromoteIntOp_BR_CC(SDNode *N, unsigned OpNo) {
1311 SDValue LHS = N->getOperand(2);
1312 SDValue RHS = N->getOperand(3);
1322 SDValue DAGTypeLegalizer::PromoteIntOp_BRCOND(SDNode *N, unsigned OpNo) {
1326 SDValue Cond = PromoteTargetBoolean(N->getOperand(1), MVT::Other);
1333 SDValue DAGTypeLegalizer::PromoteIntOp_BUILD_PAIR(SDNode *N) {
1336 SDValue Lo = ZExtPromotedInteger(N->getOperand(0));
1337 SDValue Hi = GetPromotedInteger(N->getOperand(1));
1347 SDValue DAGTypeLegalizer::PromoteIntOp_BUILD_VECTOR(SDNode *N) {
1363 SmallVector<SDValue, 16> NewOps;
1370 SDValue DAGTypeLegalizer::PromoteIntOp_INSERT_VECTOR_ELT(SDNode *N,
1389 SDValue Idx = DAG.getZExtOrTrunc(N->getOperand(2), SDLoc(N),
1395 SDValue DAGTypeLegalizer::PromoteIntOp_SCALAR_TO_VECTOR(SDNode *N) {
1402 SDValue DAGTypeLegalizer::PromoteIntOp_SPLAT_VECTOR(SDNode *N) {
1409 SDValue DAGTypeLegalizer::PromoteIntOp_SELECT(SDNode *N, unsigned OpNo) {
1411 SDValue Cond = N->getOperand(0);
1415 if (SDValue Res = WidenVSELECTAndMask(N))
1426 SDValue DAGTypeLegalizer::PromoteIntOp_SELECT_CC(SDNode *N, unsigned OpNo) {
1429 SDValue LHS = N->getOperand(0);
1430 SDValue RHS = N->getOperand(1);
1438 SDValue DAGTypeLegalizer::PromoteIntOp_SETCC(SDNode *N, unsigned OpNo) {
1441 SDValue LHS = N->getOperand(0);
1442 SDValue RHS = N->getOperand(1);
1449 SDValue DAGTypeLegalizer::PromoteIntOp_Shift(SDNode *N) {
1454 SDValue DAGTypeLegalizer::PromoteIntOp_SIGN_EXTEND(SDNode *N) {
1455 SDValue Op = GetPromotedInteger(N->getOperand(0));
1462 SDValue DAGTypeLegalizer::PromoteIntOp_SINT_TO_FP(SDNode *N) {
1467 SDValue DAGTypeLegalizer::PromoteIntOp_STORE(StoreSDNode *N, unsigned OpNo){
1469 SDValue Ch = N->getChain(), Ptr = N->getBasePtr();
1472 SDValue Val = GetPromotedInteger(N->getValue()); // Get promoted value.
1479 SDValue DAGTypeLegalizer::PromoteIntOp_MSTORE(MaskedStoreSDNode *N,
1482 SDValue DataOp = N->getValue();
1484 SDValue Mask = N->getMask();
1491 SmallVector<SDValue, 4> NewOps(N->op_begin(), N->op_end());
1505 SDValue DAGTypeLegalizer::PromoteIntOp_MLOAD(MaskedLoadSDNode *N,
1509 SDValue Mask = PromoteTargetBoolean(N->getOperand(OpNo), DataVT);
1510 SmallVector<SDValue, 4> NewOps(N->op_begin(), N->op_end());
1515 SDValue DAGTypeLegalizer::PromoteIntOp_MGATHER(MaskedGatherSDNode *N,
1518 SmallVector<SDValue, 5> NewOps(N->op_begin(), N->op_end());
1536 SDValue DAGTypeLegalizer::PromoteIntOp_MSCATTER(MaskedScatterSDNode *N,
1538 SmallVector<SDValue, 5> NewOps(N->op_begin(), N->op_end());
1555 SDValue DAGTypeLegalizer::PromoteIntOp_TRUNCATE(SDNode *N) {
1556 SDValue Op = GetPromotedInteger(N->getOperand(0));
1560 SDValue DAGTypeLegalizer::PromoteIntOp_UINT_TO_FP(SDNode *N) {
1565 SDValue DAGTypeLegalizer::PromoteIntOp_ZERO_EXTEND(SDNode *N) {
1567 SDValue Op = GetPromotedInteger(N->getOperand(0));
1573 SDValue DAGTypeLegalizer::PromoteIntOp_ADDSUBCARRY(SDNode *N, unsigned OpNo) {
1576 SDValue LHS = N->getOperand(0);
1577 SDValue RHS = N->getOperand(1);
1578 SDValue Carry = N->getOperand(2);
1586 SDValue DAGTypeLegalizer::PromoteIntOp_MULFIX(SDNode *N) {
1587 SDValue Op2 = ZExtPromotedInteger(N->getOperand(2));
1592 SDValue DAGTypeLegalizer::PromoteIntOp_FRAMERETURNADDR(SDNode *N) {
1594 SDValue Op = ZExtPromotedInteger(N->getOperand(0));
1598 SDValue DAGTypeLegalizer::PromoteIntOp_PREFETCH(SDNode *N, unsigned OpNo) {
1602 SDValue Op2 = ZExtPromotedInteger(N->getOperand(2));
1603 SDValue Op3 = ZExtPromotedInteger(N->getOperand(3));
1604 SDValue Op4 = ZExtPromotedInteger(N->getOperand(4));
1610 SDValue DAGTypeLegalizer::PromoteIntOp_FPOWI(SDNode *N) {
1611 SDValue Op = SExtPromotedInteger(N->getOperand(1));
1615 SDValue DAGTypeLegalizer::PromoteIntOp_VECREDUCE(SDNode *N) {
1617 SDValue Op;
1644 SDValue Reduce = DAG.getNode(N->getOpcode(), dl, EltVT, Op);
1659 SDValue Lo, Hi;
1729 std::pair<SDValue, SDValue> Tmp = ExpandAtomic(N);
1729 std::pair<SDValue, SDValue> Tmp = ExpandAtomic(N);
1737 SDValue Tmp = DAG.getAtomicCmpSwap(
1745 SDValue Success = DAG.getSetCC(SDLoc(N), N->getValueType(1), Tmp,
1813 std::pair <SDValue, SDValue> DAGTypeLegalizer::ExpandAtomic(SDNode *Node) {
1813 std::pair <SDValue, SDValue> DAGTypeLegalizer::ExpandAtomic(SDNode *Node) {
1825 SDValue &Lo, SDValue &Hi) {
1825 SDValue &Lo, SDValue &Hi) {
1828 SDValue InL, InH;
1914 ExpandShiftWithKnownAmountBit(SDNode *N, SDValue &Lo, SDValue &Hi) {
1914 ExpandShiftWithKnownAmountBit(SDNode *N, SDValue &Lo, SDValue &Hi) {
1915 SDValue Amt = N->getOperand(1);
1932 SDValue InL, InH;
1966 SDValue Amt2 = DAG.getNode(ISD::XOR, dl, ShTy, Amt,
1983 SDValue Sh1 = DAG.getNode(Op2, dl, NVT, InL, DAG.getConstant(1, dl, ShTy));
1985 SDValue Sh2 = DAG.getNode(Op2, dl, NVT, Sh1, Amt2);
2001 ExpandShiftWithUnknownAmountBit(SDNode *N, SDValue &Lo, SDValue &Hi) {
2001 ExpandShiftWithUnknownAmountBit(SDNode *N, SDValue &Lo, SDValue &Hi) {
2002 SDValue Amt = N->getOperand(1);
2011 SDValue InL, InH;
2014 SDValue NVBitsNode = DAG.getConstant(NVTBits, dl, ShTy);
2015 SDValue AmtExcess = DAG.getNode(ISD::SUB, dl, ShTy, Amt, NVBitsNode);
2016 SDValue AmtLack = DAG.getNode(ISD::SUB, dl, ShTy, NVBitsNode, Amt);
2017 SDValue isShort = DAG.getSetCC(dl, getSetCCResultType(ShTy),
2019 SDValue isZero = DAG.getSetCC(dl, getSetCCResultType(ShTy),
2023 SDValue LoS, HiS, LoL, HiL;
2093 SDValue &Lo, SDValue &Hi) {
2093 SDValue &Lo, SDValue &Hi) {
2100 SDValue LHSL, LHSH, RHSL, RHSH;
2113 SDValue IsHiLeft = DAG.getSetCC(DL, CCT, LHSH, RHSH, CondC);
2114 SDValue IsHiEq = DAG.getSetCC(DL, CCT, LHSH, RHSH, ISD::SETEQ);
2117 SDValue LoCmp = DAG.getSelect(DL, NVT, IsHiLeft, LHSL, RHSL);
2120 SDValue LoMinMax = DAG.getNode(LoOpc, DL, NVT, {LHSL, RHSL});
2126 SDValue &Lo, SDValue &Hi) {
2126 SDValue &Lo, SDValue &Hi) {
2129 SDValue LHSL, LHSH, RHSL, RHSH;
2134 SDValue LoOps[2] = { LHSL, RHSL };
2135 SDValue HiOps[3] = { LHSH, RHSH };
2197 SDValue OVF = Lo.getValue(1);
2217 SDValue Cmp1 = DAG.getSetCC(dl, getSetCCResultType(NVT), Lo, LoOps[0],
2221 SDValue Carry = DAG.getZExtOrTrunc(Cmp1, dl, NVT);
2226 SDValue Carry1 = DAG.getSelect(dl, NVT, Cmp1,
2229 SDValue Cmp2 = DAG.getSetCC(dl, getSetCCResultType(NVT), Lo, LoOps[1],
2231 SDValue Carry2 = DAG.getSelect(dl, NVT, Cmp2,
2237 SDValue Cmp =
2241 SDValue Borrow;
2253 SDValue &Lo, SDValue &Hi) {
2253 SDValue &Lo, SDValue &Hi) {
2255 SDValue LHSL, LHSH, RHSL, RHSH;
2260 SDValue LoOps[2] = { LHSL, RHSL };
2261 SDValue HiOps[3] = { LHSH, RHSH };
2279 SDValue &Lo, SDValue &Hi) {
2279 SDValue &Lo, SDValue &Hi) {
2281 SDValue LHSL, LHSH, RHSL, RHSH;
2286 SDValue LoOps[3] = { LHSL, RHSL, N->getOperand(2) };
2287 SDValue HiOps[3] = { LHSH, RHSH };
2299 SDValue &Lo, SDValue &Hi) {
2299 SDValue &Lo, SDValue &Hi) {
2300 SDValue LHS = N->getOperand(0);
2301 SDValue RHS = N->getOperand(1);
2304 SDValue Ovf;
2328 SDValue LHSL, LHSH, RHSL, RHSH;
2332 SDValue LoOps[2] = { LHSL, RHSL };
2333 SDValue HiOps[3] = { LHSH, RHSH };
2343 SDValue Sum = DAG.getNode(NoCarryOp, dl, LHS.getValueType(), LHS, RHS);
2357 SDValue &Lo, SDValue &Hi) {
2357 SDValue &Lo, SDValue &Hi) {
2359 SDValue LHSL, LHSH, RHSL, RHSH;
2364 SDValue LoOps[3] = { LHSL, RHSL, N->getOperand(2) };
2365 SDValue HiOps[3] = { LHSH, RHSH, SDValue() };
2377 SDValue &Lo, SDValue &Hi) {
2377 SDValue &Lo, SDValue &Hi) {
2380 SDValue Op = N->getOperand(0);
2391 SDValue Res = GetPromotedInteger(Op);
2400 SDValue &Lo, SDValue &Hi) {
2400 SDValue &Lo, SDValue &Hi) {
2422 SDValue &Lo, SDValue &Hi) {
2422 SDValue &Lo, SDValue &Hi) {
2442 SDValue &Lo, SDValue &Hi) {
2442 SDValue &Lo, SDValue &Hi) {
2450 SDValue &Lo, SDValue &Hi) {
2450 SDValue &Lo, SDValue &Hi) {
2458 SDValue &Lo, SDValue &Hi) {
2458 SDValue &Lo, SDValue &Hi) {
2471 void DAGTypeLegalizer::ExpandIntRes_ABS(SDNode *N, SDValue &Lo, SDValue &Hi) {
2471 void DAGTypeLegalizer::ExpandIntRes_ABS(SDNode *N, SDValue &Lo, SDValue &Hi) {
2476 SDValue N0 = N->getOperand(0);
2477 SDValue Neg = DAG.getNode(ISD::SUB, dl, VT,
2479 SDValue NegLo, NegHi;
2484 SDValue HiIsNeg = DAG.getSetCC(dl, getSetCCResultType(NVT),
2491 SDValue &Lo, SDValue &Hi) {
2491 SDValue &Lo, SDValue &Hi) {
2497 SDValue HiNotZero = DAG.getSetCC(dl, getSetCCResultType(NVT), Hi,
2500 SDValue LoLZ = DAG.getNode(N->getOpcode(), dl, NVT, Lo);
2501 SDValue HiLZ = DAG.getNode(ISD::CTLZ_ZERO_UNDEF, dl, NVT, Hi);
2511 SDValue &Lo, SDValue &Hi) {
2511 SDValue &Lo, SDValue &Hi) {
2522 SDValue &Lo, SDValue &Hi) {
2522 SDValue &Lo, SDValue &Hi) {
2528 SDValue LoNotZero = DAG.getSetCC(dl, getSetCCResultType(NVT), Lo,
2531 SDValue LoLZ = DAG.getNode(ISD::CTTZ_ZERO_UNDEF, dl, NVT, Lo);
2532 SDValue HiLZ = DAG.getNode(N->getOpcode(), dl, NVT, Hi);
2541 void DAGTypeLegalizer::ExpandIntRes_FLT_ROUNDS(SDNode *N, SDValue &Lo,
2542 SDValue &Hi) {
2554 void DAGTypeLegalizer::ExpandIntRes_FP_TO_SINT(SDNode *N, SDValue &Lo,
2555 SDValue &Hi) {
2559 SDValue Op = N->getOperand(0);
2571 void DAGTypeLegalizer::ExpandIntRes_FP_TO_UINT(SDNode *N, SDValue &Lo,
2572 SDValue &Hi) {
2576 SDValue Op = N->getOperand(0);
2587 void DAGTypeLegalizer::ExpandIntRes_LLROUND(SDNode *N, SDValue &Lo,
2588 SDValue &Hi) {
2603 SDValue Op = N->getOperand(0);
2615 void DAGTypeLegalizer::ExpandIntRes_LLRINT(SDNode *N, SDValue &Lo,
2616 SDValue &Hi) {
2631 SDValue Op = N->getOperand(0);
2644 SDValue &Lo, SDValue &Hi) {
2644 SDValue &Lo, SDValue &Hi) {
2654 SDValue Ch = N->getChain();
2655 SDValue Ptr = N->getBasePtr();
2758 SDValue &Lo, SDValue &Hi) {
2758 SDValue &Lo, SDValue &Hi) {
2760 SDValue LL, LH, RL, RH;
2768 SDValue &Lo, SDValue &Hi) {
2768 SDValue &Lo, SDValue &Hi) {
2773 SDValue LL, LH, RL, RH;
2800 SDValue Mask = DAG.getConstant(APInt::getLowBitsSet(Bits, HalfBits), dl,
2802 SDValue LLL = DAG.getNode(ISD::AND, dl, NVT, LL, Mask);
2803 SDValue RLL = DAG.getNode(ISD::AND, dl, NVT, RL, Mask);
2805 SDValue T = DAG.getNode(ISD::MUL, dl, NVT, LLL, RLL);
2806 SDValue TL = DAG.getNode(ISD::AND, dl, NVT, T, Mask);
2814 SDValue Shift = DAG.getConstant(HalfBits, dl, ShiftAmtTy);
2815 SDValue TH = DAG.getNode(ISD::SRL, dl, NVT, T, Shift);
2816 SDValue LLH = DAG.getNode(ISD::SRL, dl, NVT, LL, Shift);
2817 SDValue RLH = DAG.getNode(ISD::SRL, dl, NVT, RL, Shift);
2819 SDValue U = DAG.getNode(ISD::ADD, dl, NVT,
2821 SDValue UL = DAG.getNode(ISD::AND, dl, NVT, U, Mask);
2822 SDValue UH = DAG.getNode(ISD::SRL, dl, NVT, U, Shift);
2824 SDValue V = DAG.getNode(ISD::ADD, dl, NVT,
2826 SDValue VH = DAG.getNode(ISD::SRL, dl, NVT, V, Shift);
2828 SDValue W = DAG.getNode(ISD::ADD, dl, NVT,
2841 SDValue Ops[2] = { N->getOperand(0), N->getOperand(1) };
2848 void DAGTypeLegalizer::ExpandIntRes_READCYCLECOUNTER(SDNode *N, SDValue &Lo,
2849 SDValue &Hi) {
2853 SDValue R = DAG.getNode(N->getOpcode(), DL, VTs, N->getOperand(0));
2859 void DAGTypeLegalizer::ExpandIntRes_ADDSUBSAT(SDNode *N, SDValue &Lo,
2860 SDValue &Hi) {
2861 SDValue Result = TLI.expandAddSubSat(N, DAG);
2870 void DAGTypeLegalizer::ExpandIntRes_MULFIX(SDNode *N, SDValue &Lo,
2871 SDValue &Hi) {
2875 SDValue LHS = N->getOperand(0);
2876 SDValue RHS = N->getOperand(1);
2885 SDValue Result;
2892 SDValue Product = Result.getValue(0);
2893 SDValue Overflow = Result.getValue(1);
2897 SDValue SatMin = DAG.getConstant(MinVal, dl, VT);
2898 SDValue SatMax = DAG.getConstant(MaxVal, dl, VT);
2899 SDValue Zero = DAG.getConstant(0, dl, VT);
2900 SDValue ProdNeg = DAG.getSetCC(dl, BoolVT, Product, Zero, ISD::SETLT);
2907 SDValue SatMax = DAG.getConstant(MaxVal, dl, VT);
2920 SDValue LL, LH, RL, RH;
2923 SmallVector<SDValue, 4> Result;
2959 SDValue ShiftAmount = DAG.getConstant(Scale % NVTSize, dl, ShiftTy);
2989 SDValue ResultHL = Result[2];
2990 SDValue ResultHH = Result[3];
2992 SDValue SatMax, SatMin;
2993 SDValue NVTZero = DAG.getConstant(0, dl, NVT);
2994 SDValue NVTNeg1 = DAG.getConstant(-1, dl, NVT);
3000 SDValue HLAdjusted = DAG.getNode(ISD::SRL, dl, NVT, ResultHL,
3002 SDValue Tmp = DAG.getNode(ISD::OR, dl, NVT, HLAdjusted, ResultHH);
3009 SDValue HLAdjusted = DAG.getNode(ISD::SRL, dl, NVT, ResultHL,
3030 SDValue HLHiMask = DAG.getConstant(
3032 SDValue HLLoMask = DAG.getConstant(
3035 SDValue HHGT0 = DAG.getSetCC(dl, BoolNVT, ResultHH, NVTZero, ISD::SETGT);
3036 SDValue HHEQ0 = DAG.getSetCC(dl, BoolNVT, ResultHH, NVTZero, ISD::SETEQ);
3037 SDValue HLUGT = DAG.getSetCC(dl, BoolNVT, ResultHL, HLLoMask, ISD::SETUGT);
3041 SDValue HHLT = DAG.getSetCC(dl, BoolNVT, ResultHH, NVTNeg1, ISD::SETLT);
3042 SDValue HHEQ = DAG.getSetCC(dl, BoolNVT, ResultHH, NVTNeg1, ISD::SETEQ);
3043 SDValue HLULT = DAG.getSetCC(dl, BoolNVT, ResultHL, HLHiMask, ISD::SETULT);
3048 SDValue HHGT0 = DAG.getSetCC(dl, BoolNVT, ResultHH, NVTZero, ISD::SETGT);
3049 SDValue HHEQ0 = DAG.getSetCC(dl, BoolNVT, ResultHH, NVTZero, ISD::SETEQ);
3050 SDValue HLNeg = DAG.getSetCC(dl, BoolNVT, ResultHL, NVTZero, ISD::SETLT);
3054 SDValue HHLT = DAG.getSetCC(dl, BoolNVT, ResultHH, NVTNeg1, ISD::SETLT);
3055 SDValue HHEQ = DAG.getSetCC(dl, BoolNVT, ResultHH, NVTNeg1, ISD::SETEQ);
3056 SDValue HLPos = DAG.getSetCC(dl, BoolNVT, ResultHL, NVTZero, ISD::SETGE);
3063 SDValue HHHiMask = DAG.getConstant(
3065 SDValue HHLoMask = DAG.getConstant(
3084 SDValue &Lo, SDValue &Hi) {
3084 SDValue &Lo, SDValue &Hi) {
3085 SDValue LHS = Node->getOperand(0);
3086 SDValue RHS = Node->getOperand(1);
3091 SDValue Sum = DAG.getNode(Node->getOpcode() == ISD::SADDO ?
3108 SDValue Zero = DAG.getConstant(0, dl, LHS.getValueType());
3110 SDValue LHSSign = DAG.getSetCC(dl, OType, LHS, Zero, ISD::SETGE);
3111 SDValue RHSSign = DAG.getSetCC(dl, OType, RHS, Zero, ISD::SETGE);
3112 SDValue SignsMatch = DAG.getSetCC(dl, OType, LHSSign, RHSSign,
3116 SDValue SumSign = DAG.getSetCC(dl, OType, Sum, Zero, ISD::SETGE);
3117 SDValue SumSignNE = DAG.getSetCC(dl, OType, LHSSign, SumSign, ISD::SETNE);
3119 SDValue Cmp = DAG.getNode(ISD::AND, dl, OType, SignsMatch, SumSignNE);
3126 SDValue &Lo, SDValue &Hi) {
3126 SDValue &Lo, SDValue &Hi) {
3129 SDValue Ops[2] = { N->getOperand(0), N->getOperand(1) };
3132 SDValue Res = DAG.getNode(ISD::SDIVREM, dl, DAG.getVTList(VT, VT), Ops);
3154 SDValue &Lo, SDValue &Hi) {
3154 SDValue &Lo, SDValue &Hi) {
3190 SDValue LHSL, LHSH;
3197 SDValue ShiftOp = N->getOperand(1);
3205 SDValue Ops[] = { LHSL, LHSH, ShiftOp };
3248 SDValue Ops[2] = { N->getOperand(0), N->getOperand(1) };
3260 SDValue &Lo, SDValue &Hi) {
3260 SDValue &Lo, SDValue &Hi) {
3263 SDValue Op = N->getOperand(0);
3278 SDValue Res = GetPromotedInteger(Op);
3291 ExpandIntRes_SIGN_EXTEND_INREG(SDNode *N, SDValue &Lo, SDValue &Hi) {
3291 ExpandIntRes_SIGN_EXTEND_INREG(SDNode *N, SDValue &Lo, SDValue &Hi) {
3317 SDValue &Lo, SDValue &Hi) {
3317 SDValue &Lo, SDValue &Hi) {
3320 SDValue Ops[2] = { N->getOperand(0), N->getOperand(1) };
3323 SDValue Res = DAG.getNode(ISD::SDIVREM, dl, DAG.getVTList(VT, VT), Ops);
3345 SDValue &Lo, SDValue &Hi) {
3345 SDValue &Lo, SDValue &Hi) {
3357 SDValue &Lo, SDValue &Hi) {
3357 SDValue &Lo, SDValue &Hi) {
3374 SDValue LHS = N->getOperand(0), RHS = N->getOperand(1);
3375 SDValue LHSHigh, LHSLow, RHSHigh, RHSLow;
3383 SDValue HalfZero = DAG.getConstant(0, dl, HalfVT);
3384 SDValue Overflow = DAG.getNode(ISD::AND, dl, BitVT,
3388 SDValue One = DAG.getNode(ISD::UMULO, dl, VTHalfMulO, LHSHigh, RHSLow);
3390 SDValue OneInHigh = DAG.getNode(ISD::BUILD_PAIR, dl, VT, HalfZero,
3393 SDValue Two = DAG.getNode(ISD::UMULO, dl, VTHalfMulO, RHSHigh, LHSLow);
3395 SDValue TwoInHigh = DAG.getNode(ISD::BUILD_PAIR, dl, VT, HalfZero,
3404 SDValue Three = DAG.getNode(ISD::MUL, dl, VT,
3407 SDValue Four = DAG.getNode(ISD::ADD, dl, VT, OneInHigh, TwoInHigh);
3408 SDValue Five = DAG.getNode(ISD::UADDO, dl, VTFullAddO, Three, Four);
3429 SDValue Temp = DAG.CreateStackTemporary(PtrVT);
3431 SDValue Chain =
3437 for (const SDValue &Op : N->op_values()) {
3454 SDValue Func = DAG.getExternalSymbol(TLI.getLibcallName(LC), PtrVT);
3462 std::pair<SDValue, SDValue> CallInfo = TLI.LowerCallTo(CLI);
3462 std::pair<SDValue, SDValue> CallInfo = TLI.LowerCallTo(CLI);
3465 SDValue Temp2 =
3467 SDValue Ofl = DAG.getSetCC(dl, N->getValueType(1), Temp2,
3475 SDValue &Lo, SDValue &Hi) {
3475 SDValue &Lo, SDValue &Hi) {
3478 SDValue Ops[2] = { N->getOperand(0), N->getOperand(1) };
3481 SDValue Res = DAG.getNode(ISD::UDIVREM, dl, DAG.getVTList(VT, VT), Ops);
3502 SDValue &Lo, SDValue &Hi) {
3502 SDValue &Lo, SDValue &Hi) {
3505 SDValue Ops[2] = { N->getOperand(0), N->getOperand(1) };
3508 SDValue Res = DAG.getNode(ISD::UDIVREM, dl, DAG.getVTList(VT, VT), Ops);
3529 SDValue &Lo, SDValue &Hi) {
3529 SDValue &Lo, SDValue &Hi) {
3532 SDValue Op = N->getOperand(0);
3543 SDValue Res = GetPromotedInteger(Op);
3556 SDValue &Lo, SDValue &Hi) {
3556 SDValue &Lo, SDValue &Hi) {
3560 SDValue Zero = DAG.getConstant(0, dl, VT);
3561 SDValue Swap = DAG.getAtomicCmpSwap(
3571 SDValue &Lo, SDValue &Hi) {
3571 SDValue &Lo, SDValue &Hi) {
3574 SDValue Res = TLI.expandVecReduce(N, DAG);
3589 SDValue Res = SDValue();
3644 void DAGTypeLegalizer::IntegerExpandSetCCOperands(SDValue &NewLHS,
3645 SDValue &NewRHS,
3648 SDValue LHSLo, LHSHi, RHSLo, RHSHi;
3704 SDValue LoCmp, HiCmp;
3772 SDValue LowCmp = DAG.getNode(ISD::USUBO, dl, VTList, LHSLo, RHSLo);
3773 SDValue Res = DAG.getNode(ISD::SETCCCARRY, dl, getSetCCResultType(HiVT),
3790 SDValue DAGTypeLegalizer::ExpandIntOp_BR_CC(SDNode *N) {
3791 SDValue NewLHS = N->getOperand(2), NewRHS = N->getOperand(3);
3808 SDValue DAGTypeLegalizer::ExpandIntOp_SELECT_CC(SDNode *N) {
3809 SDValue NewLHS = N->getOperand(0), NewRHS = N->getOperand(1);
3826 SDValue DAGTypeLegalizer::ExpandIntOp_SETCC(SDNode *N) {
3827 SDValue NewLHS = N->getOperand(0), NewRHS = N->getOperand(1);
3843 SDValue DAGTypeLegalizer::ExpandIntOp_SETCCCARRY(SDNode *N) {
3844 SDValue LHS = N->getOperand(0);
3845 SDValue RHS = N->getOperand(1);
3846 SDValue Carry = N->getOperand(2);
3847 SDValue Cond = N->getOperand(3);
3850 SDValue LHSLo, LHSHi, RHSLo, RHSHi;
3856 SDValue LowCmp = DAG.getNode(ISD::SUBCARRY, dl, VTList, LHSLo, RHSLo, Carry);
3861 SDValue DAGTypeLegalizer::ExpandIntOp_Shift(SDNode *N) {
3865 SDValue Lo, Hi;
3870 SDValue DAGTypeLegalizer::ExpandIntOp_RETURNADDR(SDNode *N) {
3874 SDValue Lo, Hi;
3879 SDValue DAGTypeLegalizer::ExpandIntOp_SINT_TO_FP(SDNode *N) {
3880 SDValue Op = N->getOperand(0);
3890 SDValue DAGTypeLegalizer::ExpandIntOp_STORE(StoreSDNode *N, unsigned OpNo) {
3899 SDValue Ch = N->getChain();
3900 SDValue Ptr = N->getBasePtr();
3905 SDValue Lo, Hi;
3972 SDValue DAGTypeLegalizer::ExpandIntOp_TRUNCATE(SDNode *N) {
3973 SDValue InL, InH;
3979 SDValue DAGTypeLegalizer::ExpandIntOp_UINT_TO_FP(SDNode *N) {
3980 SDValue Op = N->getOperand(0);
3992 SDValue SignedConv = DAG.getNode(ISD::SINT_TO_FP, dl, DstVT, Op);
4014 SDValue Lo, Hi;
4016 SDValue SignSet = DAG.getSetCC(dl,
4023 SDValue FudgePtr =
4028 SDValue Zero = DAG.getIntPtrConstant(0, dl);
4029 SDValue Four = DAG.getIntPtrConstant(4, dl);
4032 SDValue Offset = DAG.getSelect(dl, Zero.getValueType(), SignSet,
4041 SDValue Fudge = DAG.getExtLoad(
4057 SDValue DAGTypeLegalizer::ExpandIntOp_ATOMIC_STORE(SDNode *N) {
4059 SDValue Swap = DAG.getAtomic(ISD::ATOMIC_SWAP, dl,
4068 SDValue DAGTypeLegalizer::PromoteIntRes_EXTRACT_SUBVECTOR(SDNode *N) {
4077 SDValue BaseIdx = N->getOperand(1);
4079 SDValue InOp0 = N->getOperand(0);
4085 SmallVector<SDValue, 8> Ops;
4090 SDValue Index = DAG.getNode(ISD::ADD, dl, BaseIdx.getValueType(),
4092 SDValue Ext = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl,
4095 SDValue Op = DAG.getAnyExtOrTrunc(Ext, dl, NOutVTElem);
4104 SDValue DAGTypeLegalizer::PromoteIntRes_VECTOR_SHUFFLE(SDNode *N) {
4111 SDValue V0 = GetPromotedInteger(N->getOperand(0));
4112 SDValue V1 = GetPromotedInteger(N->getOperand(1));
4119 SDValue DAGTypeLegalizer::PromoteIntRes_BUILD_VECTOR(SDNode *N) {
4128 SmallVector<SDValue, 8> Ops;
4131 SDValue Op;
4146 SDValue DAGTypeLegalizer::PromoteIntRes_SCALAR_TO_VECTOR(SDNode *N) {
4158 SDValue Op = DAG.getNode(ISD::ANY_EXTEND, dl, NOutVTElem, N->getOperand(0));
4163 SDValue DAGTypeLegalizer::PromoteIntRes_SPLAT_VECTOR(SDNode *N) {
4166 SDValue SplatVal = N->getOperand(0);
4175 SDValue Op = DAG.getNode(ISD::ANY_EXTEND, dl, NOutElemVT, SplatVal);
4180 SDValue DAGTypeLegalizer::PromoteIntRes_CONCAT_VECTORS(SDNode *N) {
4196 SmallVector<SDValue, 8> Ops(NumOutElem);
4198 SDValue Op = N->getOperand(i);
4206 SDValue Ext = DAG.getNode(
4216 SDValue DAGTypeLegalizer::PromoteIntRes_EXTEND_VECTOR_INREG(SDNode *N) {
4229 SDValue Promoted;
4251 SDValue DAGTypeLegalizer::PromoteIntRes_INSERT_VECTOR_ELT(SDNode *N) {
4259 SDValue V0 = GetPromotedInteger(N->getOperand(0));
4261 SDValue ConvElem = DAG.getNode(ISD::ANY_EXTEND, dl,
4267 SDValue DAGTypeLegalizer::PromoteIntRes_VECREDUCE(SDNode *N) {
4275 SDValue DAGTypeLegalizer::PromoteIntOp_EXTRACT_VECTOR_ELT(SDNode *N) {
4277 SDValue V0 = GetPromotedInteger(N->getOperand(0));
4278 SDValue V1 = DAG.getZExtOrTrunc(N->getOperand(1), dl,
4280 SDValue Ext = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl,
4289 SDValue DAGTypeLegalizer::PromoteIntOp_EXTRACT_SUBVECTOR(SDNode *N) {
4291 SDValue V0 = GetPromotedInteger(N->getOperand(0));
4295 SDValue Ext = DAG.getNode(ISD::EXTRACT_SUBVECTOR, dl, OutVT, V0, N->getOperand(1));
4299 SDValue DAGTypeLegalizer::PromoteIntOp_CONCAT_VECTORS(SDNode *N) {
4305 SmallVector<SDValue, 8> NewOps;
4310 SDValue Incoming = GetPromotedInteger(N->getOperand(VecIdx));
4316 SDValue Ex = DAG.getNode(
4319 SDValue Tr = DAG.getNode(ISD::TRUNCATE, dl, RetSclrTy, Ex);
lib/CodeGen/SelectionDAG/LegalizeTypes.cpp 83 SDValue Res(&Node, i);
106 SDValue NewVal = getSDValue(NewValId);
292 const auto Op = N->getOperand(i);
492 std::vector<SDValue> NewOps;
495 SDValue OrigOp = N->getOperand(i);
496 SDValue Op = OrigOp;
544 void DAGTypeLegalizer::AnalyzeNewValue(SDValue &Val) {
553 void DAGTypeLegalizer::RemapValue(SDValue &V) {
622 void DAGTypeLegalizer::ReplaceValueWith(SDValue From, SDValue To) {
622 void DAGTypeLegalizer::ReplaceValueWith(SDValue From, SDValue To) {
662 SDValue OldVal(N, i);
663 SDValue NewVal(M, i);
685 void DAGTypeLegalizer::SetPromotedInteger(SDValue Op, SDValue Result) {
685 void DAGTypeLegalizer::SetPromotedInteger(SDValue Op, SDValue Result) {
699 void DAGTypeLegalizer::SetSoftenedFloat(SDValue Op, SDValue Result) {
699 void DAGTypeLegalizer::SetSoftenedFloat(SDValue Op, SDValue Result) {
710 void DAGTypeLegalizer::SetPromotedFloat(SDValue Op, SDValue Result) {
710 void DAGTypeLegalizer::SetPromotedFloat(SDValue Op, SDValue Result) {
721 void DAGTypeLegalizer::SetScalarizedVector(SDValue Op, SDValue Result) {
721 void DAGTypeLegalizer::SetScalarizedVector(SDValue Op, SDValue Result) {
734 void DAGTypeLegalizer::GetExpandedInteger(SDValue Op, SDValue &Lo,
734 void DAGTypeLegalizer::GetExpandedInteger(SDValue Op, SDValue &Lo,
735 SDValue &Hi) {
742 void DAGTypeLegalizer::SetExpandedInteger(SDValue Op, SDValue Lo,
742 void DAGTypeLegalizer::SetExpandedInteger(SDValue Op, SDValue Lo,
743 SDValue Hi) {
771 void DAGTypeLegalizer::GetExpandedFloat(SDValue Op, SDValue &Lo,
771 void DAGTypeLegalizer::GetExpandedFloat(SDValue Op, SDValue &Lo,
772 SDValue &Hi) {
779 void DAGTypeLegalizer::SetExpandedFloat(SDValue Op, SDValue Lo,
779 void DAGTypeLegalizer::SetExpandedFloat(SDValue Op, SDValue Lo,
780 SDValue Hi) {
795 void DAGTypeLegalizer::GetSplitVector(SDValue Op, SDValue &Lo,
795 void DAGTypeLegalizer::GetSplitVector(SDValue Op, SDValue &Lo,
796 SDValue &Hi) {
804 void DAGTypeLegalizer::SetSplitVector(SDValue Op, SDValue Lo,
804 void DAGTypeLegalizer::SetSplitVector(SDValue Op, SDValue Lo,
805 SDValue Hi) {
823 void DAGTypeLegalizer::SetWidenedVector(SDValue Op, SDValue Result) {
823 void DAGTypeLegalizer::SetWidenedVector(SDValue Op, SDValue Result) {
840 SDValue DAGTypeLegalizer::BitConvertToInteger(SDValue Op) {
840 SDValue DAGTypeLegalizer::BitConvertToInteger(SDValue Op) {
847 SDValue DAGTypeLegalizer::BitConvertVectorToIntegerVector(SDValue Op) {
847 SDValue DAGTypeLegalizer::BitConvertVectorToIntegerVector(SDValue Op) {
856 SDValue DAGTypeLegalizer::CreateStackStoreLoad(SDValue Op,
856 SDValue DAGTypeLegalizer::CreateStackStoreLoad(SDValue Op,
861 SDValue StackPtr = DAG.CreateStackTemporary(Op.getValueType(), DestVT);
863 SDValue Store =
882 SmallVector<SDValue, 8> Results;
920 SmallVector<SDValue, 8> Results;
940 SDValue DAGTypeLegalizer::DisintegrateMERGE_VALUES(SDNode *N, unsigned ResNo) {
949 void DAGTypeLegalizer::GetPairElements(SDValue Pair,
950 SDValue &Lo, SDValue &Hi) {
950 SDValue &Lo, SDValue &Hi) {
960 SDValue DAGTypeLegalizer::JoinIntegers(SDValue Lo, SDValue Hi) {
960 SDValue DAGTypeLegalizer::JoinIntegers(SDValue Lo, SDValue Hi) {
960 SDValue DAGTypeLegalizer::JoinIntegers(SDValue Lo, SDValue Hi) {
978 SDValue DAGTypeLegalizer::LibCallify(RTLIB::Libcall LC, SDNode *N,
988 SDValue Op = N->getOperand(0);
992 SDValue Ops[2] = { N->getOperand(0), N->getOperand(1) };
996 SmallVector<SDValue, 8> Ops(NumOps);
1005 std::pair<SDValue, SDValue>
1005 std::pair<SDValue, SDValue>
1008 SDValue InChain = Node->getOperand(0);
1021 SDValue Callee = DAG.getExternalSymbol(TLI.getLibcallName(LC),
1034 std::pair<SDValue, SDValue> CallInfo = TLI.LowerCallTo(CLI);
1034 std::pair<SDValue, SDValue> CallInfo = TLI.LowerCallTo(CLI);
1044 SDValue DAGTypeLegalizer::PromoteTargetBoolean(SDValue Bool, EVT ValVT) {
1044 SDValue DAGTypeLegalizer::PromoteTargetBoolean(SDValue Bool, EVT ValVT) {
1053 void DAGTypeLegalizer::SplitInteger(SDValue Op,
1055 SDValue &Lo, SDValue &Hi) {
1055 SDValue &Lo, SDValue &Hi) {
1073 void DAGTypeLegalizer::SplitInteger(SDValue Op,
1074 SDValue &Lo, SDValue &Hi) {
1074 SDValue &Lo, SDValue &Hi) {
lib/CodeGen/SelectionDAG/LegalizeTypes.h 93 SmallDenseMap<SDValue, TableId, 8> ValueToIdMap;
94 SmallDenseMap<TableId, SDValue, 8> IdToValueMap;
136 TableId getTableId(SDValue V) {
155 const SDValue &getSDValue(TableId &Id) {
200 void AnalyzeNewValue(SDValue &Val);
203 void RemapValue(SDValue &V);
206 SDValue BitConvertToInteger(SDValue Op);
206 SDValue BitConvertToInteger(SDValue Op);
207 SDValue BitConvertVectorToIntegerVector(SDValue Op);
207 SDValue BitConvertVectorToIntegerVector(SDValue Op);
208 SDValue CreateStackStoreLoad(SDValue Op, EVT DestVT);
208 SDValue CreateStackStoreLoad(SDValue Op, EVT DestVT);
215 SDValue DisintegrateMERGE_VALUES(SDNode *N, unsigned ResNo);
217 SDValue JoinIntegers(SDValue Lo, SDValue Hi);
217 SDValue JoinIntegers(SDValue Lo, SDValue Hi);
217 SDValue JoinIntegers(SDValue Lo, SDValue Hi);
218 SDValue LibCallify(RTLIB::Libcall LC, SDNode *N, bool isSigned);
220 std::pair<SDValue, SDValue> ExpandChainLibCall(RTLIB::Libcall LC,
220 std::pair<SDValue, SDValue> ExpandChainLibCall(RTLIB::Libcall LC,
222 std::pair<SDValue, SDValue> ExpandAtomic(SDNode *Node);
222 std::pair<SDValue, SDValue> ExpandAtomic(SDNode *Node);
224 SDValue PromoteTargetBoolean(SDValue Bool, EVT ValVT);
224 SDValue PromoteTargetBoolean(SDValue Bool, EVT ValVT);
226 void ReplaceValueWith(SDValue From, SDValue To);
226 void ReplaceValueWith(SDValue From, SDValue To);
227 void SplitInteger(SDValue Op, SDValue &Lo, SDValue &Hi);
227 void SplitInteger(SDValue Op, SDValue &Lo, SDValue &Hi);
227 void SplitInteger(SDValue Op, SDValue &Lo, SDValue &Hi);
228 void SplitInteger(SDValue Op, EVT LoVT, EVT HiVT,
229 SDValue &Lo, SDValue &Hi);
229 SDValue &Lo, SDValue &Hi);
249 SDValue GetPromotedInteger(SDValue Op) {
249 SDValue GetPromotedInteger(SDValue Op) {
251 SDValue PromotedOp = getSDValue(PromotedId);
255 void SetPromotedInteger(SDValue Op, SDValue Result);
255 void SetPromotedInteger(SDValue Op, SDValue Result);
258 SDValue SExtPromotedInteger(SDValue Op) {
258 SDValue SExtPromotedInteger(SDValue Op) {
267 SDValue ZExtPromotedInteger(SDValue Op) {
267 SDValue ZExtPromotedInteger(SDValue Op) {
278 SDValue SExtOrZExtPromotedInteger(SDValue Op) {
278 SDValue SExtOrZExtPromotedInteger(SDValue Op) {
290 SDValue PromoteIntRes_MERGE_VALUES(SDNode *N, unsigned ResNo);
291 SDValue PromoteIntRes_AssertSext(SDNode *N);
292 SDValue PromoteIntRes_AssertZext(SDNode *N);
293 SDValue PromoteIntRes_Atomic0(AtomicSDNode *N);
294 SDValue PromoteIntRes_Atomic1(AtomicSDNode *N);
295 SDValue PromoteIntRes_AtomicCmpSwap(AtomicSDNode *N, unsigned ResNo);
296 SDValue PromoteIntRes_EXTRACT_SUBVECTOR(SDNode *N);
297 SDValue PromoteIntRes_VECTOR_SHUFFLE(SDNode *N);
298 SDValue PromoteIntRes_BUILD_VECTOR(SDNode *N);
299 SDValue PromoteIntRes_SCALAR_TO_VECTOR(SDNode *N);
300 SDValue PromoteIntRes_SPLAT_VECTOR(SDNode *N);
301 SDValue PromoteIntRes_EXTEND_VECTOR_INREG(SDNode *N);
302 SDValue PromoteIntRes_INSERT_VECTOR_ELT(SDNode *N);
303 SDValue PromoteIntRes_CONCAT_VECTORS(SDNode *N);
304 SDValue PromoteIntRes_BITCAST(SDNode *N);
305 SDValue PromoteIntRes_BSWAP(SDNode *N);
306 SDValue PromoteIntRes_BITREVERSE(SDNode *N);
307 SDValue PromoteIntRes_BUILD_PAIR(SDNode *N);
308 SDValue PromoteIntRes_Constant(SDNode *N);
309 SDValue PromoteIntRes_CTLZ(SDNode *N);
310 SDValue PromoteIntRes_CTPOP(SDNode *N);
311 SDValue PromoteIntRes_CTTZ(SDNode *N);
312 SDValue PromoteIntRes_EXTRACT_VECTOR_ELT(SDNode *N);
313 SDValue PromoteIntRes_FP_TO_XINT(SDNode *N);
314 SDValue PromoteIntRes_FP_TO_FP16(SDNode *N);
315 SDValue PromoteIntRes_INT_EXTEND(SDNode *N);
316 SDValue PromoteIntRes_LOAD(LoadSDNode *N);
317 SDValue PromoteIntRes_MLOAD(MaskedLoadSDNode *N);
318 SDValue PromoteIntRes_MGATHER(MaskedGatherSDNode *N);
319 SDValue PromoteIntRes_Overflow(SDNode *N);
320 SDValue PromoteIntRes_SADDSUBO(SDNode *N, unsigned ResNo);
321 SDValue PromoteIntRes_SELECT(SDNode *N);
322 SDValue PromoteIntRes_VSELECT(SDNode *N);
323 SDValue PromoteIntRes_SELECT_CC(SDNode *N);
324 SDValue PromoteIntRes_SETCC(SDNode *N);
325 SDValue PromoteIntRes_SHL(SDNode *N);
326 SDValue PromoteIntRes_SimpleIntBinOp(SDNode *N);
327 SDValue PromoteIntRes_ZExtIntBinOp(SDNode *N);
328 SDValue PromoteIntRes_SExtIntBinOp(SDNode *N);
329 SDValue PromoteIntRes_SIGN_EXTEND_INREG(SDNode *N);
330 SDValue PromoteIntRes_SRA(SDNode *N);
331 SDValue PromoteIntRes_SRL(SDNode *N);
332 SDValue PromoteIntRes_TRUNCATE(SDNode *N);
333 SDValue PromoteIntRes_UADDSUBO(SDNode *N, unsigned ResNo);
334 SDValue PromoteIntRes_ADDSUBCARRY(SDNode *N, unsigned ResNo);
335 SDValue PromoteIntRes_UNDEF(SDNode *N);
336 SDValue PromoteIntRes_VAARG(SDNode *N);
337 SDValue PromoteIntRes_XMULO(SDNode *N, unsigned ResNo);
338 SDValue PromoteIntRes_ADDSUBSAT(SDNode *N);
339 SDValue PromoteIntRes_MULFIX(SDNode *N);
340 SDValue PromoteIntRes_FLT_ROUNDS(SDNode *N);
341 SDValue PromoteIntRes_VECREDUCE(SDNode *N);
342 SDValue PromoteIntRes_ABS(SDNode *N);
346 SDValue PromoteIntOp_ANY_EXTEND(SDNode *N);
347 SDValue PromoteIntOp_ATOMIC_STORE(AtomicSDNode *N);
348 SDValue PromoteIntOp_BITCAST(SDNode *N);
349 SDValue PromoteIntOp_BUILD_PAIR(SDNode *N);
350 SDValue PromoteIntOp_BR_CC(SDNode *N, unsigned OpNo);
351 SDValue PromoteIntOp_BRCOND(SDNode *N, unsigned OpNo);
352 SDValue PromoteIntOp_BUILD_VECTOR(SDNode *N);
353 SDValue PromoteIntOp_INSERT_VECTOR_ELT(SDNode *N, unsigned OpNo);
354 SDValue PromoteIntOp_EXTRACT_VECTOR_ELT(SDNode *N);
355 SDValue PromoteIntOp_EXTRACT_SUBVECTOR(SDNode *N);
356 SDValue PromoteIntOp_CONCAT_VECTORS(SDNode *N);
357 SDValue PromoteIntOp_SCALAR_TO_VECTOR(SDNode *N);
358 SDValue PromoteIntOp_SPLAT_VECTOR(SDNode *N);
359 SDValue PromoteIntOp_SELECT(SDNode *N, unsigned OpNo);
360 SDValue PromoteIntOp_SELECT_CC(SDNode *N, unsigned OpNo);
361 SDValue PromoteIntOp_SETCC(SDNode *N, unsigned OpNo);
362 SDValue PromoteIntOp_Shift(SDNode *N);
363 SDValue PromoteIntOp_SIGN_EXTEND(SDNode *N);
364 SDValue PromoteIntOp_SINT_TO_FP(SDNode *N);
365 SDValue PromoteIntOp_STORE(StoreSDNode *N, unsigned OpNo);
366 SDValue PromoteIntOp_TRUNCATE(SDNode *N);
367 SDValue PromoteIntOp_UINT_TO_FP(SDNode *N);
368 SDValue PromoteIntOp_ZERO_EXTEND(SDNode *N);
369 SDValue PromoteIntOp_MSTORE(MaskedStoreSDNode *N, unsigned OpNo);
370 SDValue PromoteIntOp_MLOAD(MaskedLoadSDNode *N, unsigned OpNo);
371 SDValue PromoteIntOp_MSCATTER(MaskedScatterSDNode *N, unsigned OpNo);
372 SDValue PromoteIntOp_MGATHER(MaskedGatherSDNode *N, unsigned OpNo);
373 SDValue PromoteIntOp_ADDSUBCARRY(SDNode *N, unsigned OpNo);
374 SDValue PromoteIntOp_FRAMERETURNADDR(SDNode *N);
375 SDValue PromoteIntOp_PREFETCH(SDNode *N, unsigned OpNo);
376 SDValue PromoteIntOp_MULFIX(SDNode *N);
377 SDValue PromoteIntOp_FPOWI(SDNode *N);
378 SDValue PromoteIntOp_VECREDUCE(SDNode *N);
380 void PromoteSetCCOperands(SDValue &LHS,SDValue &RHS, ISD::CondCode Code);
380 void PromoteSetCCOperands(SDValue &LHS,SDValue &RHS, ISD::CondCode Code);
392 void GetExpandedInteger(SDValue Op, SDValue &Lo, SDValue &Hi);
392 void GetExpandedInteger(SDValue Op, SDValue &Lo, SDValue &Hi);
392 void GetExpandedInteger(SDValue Op, SDValue &Lo, SDValue &Hi);
393 void SetExpandedInteger(SDValue Op, SDValue Lo, SDValue Hi);
393 void SetExpandedInteger(SDValue Op, SDValue Lo, SDValue Hi);
393 void SetExpandedInteger(SDValue Op, SDValue Lo, SDValue Hi);
397 void ExpandIntRes_ANY_EXTEND (SDNode *N, SDValue &Lo, SDValue &Hi);
397 void ExpandIntRes_ANY_EXTEND (SDNode *N, SDValue &Lo, SDValue &Hi);
398 void ExpandIntRes_AssertSext (SDNode *N, SDValue &Lo, SDValue &Hi);
398 void ExpandIntRes_AssertSext (SDNode *N, SDValue &Lo, SDValue &Hi);
399 void ExpandIntRes_AssertZext (SDNode *N, SDValue &Lo, SDValue &Hi);
399 void ExpandIntRes_AssertZext (SDNode *N, SDValue &Lo, SDValue &Hi);
400 void ExpandIntRes_Constant (SDNode *N, SDValue &Lo, SDValue &Hi);
400 void ExpandIntRes_Constant (SDNode *N, SDValue &Lo, SDValue &Hi);
401 void ExpandIntRes_ABS (SDNode *N, SDValue &Lo, SDValue &Hi);
401 void ExpandIntRes_ABS (SDNode *N, SDValue &Lo, SDValue &Hi);
402 void ExpandIntRes_CTLZ (SDNode *N, SDValue &Lo, SDValue &Hi);
402 void ExpandIntRes_CTLZ (SDNode *N, SDValue &Lo, SDValue &Hi);
403 void ExpandIntRes_CTPOP (SDNode *N, SDValue &Lo, SDValue &Hi);
403 void ExpandIntRes_CTPOP (SDNode *N, SDValue &Lo, SDValue &Hi);
404 void ExpandIntRes_CTTZ (SDNode *N, SDValue &Lo, SDValue &Hi);
404 void ExpandIntRes_CTTZ (SDNode *N, SDValue &Lo, SDValue &Hi);
405 void ExpandIntRes_LOAD (LoadSDNode *N, SDValue &Lo, SDValue &Hi);
405 void ExpandIntRes_LOAD (LoadSDNode *N, SDValue &Lo, SDValue &Hi);
406 void ExpandIntRes_READCYCLECOUNTER (SDNode *N, SDValue &Lo, SDValue &Hi);
406 void ExpandIntRes_READCYCLECOUNTER (SDNode *N, SDValue &Lo, SDValue &Hi);
407 void ExpandIntRes_SIGN_EXTEND (SDNode *N, SDValue &Lo, SDValue &Hi);
407 void ExpandIntRes_SIGN_EXTEND (SDNode *N, SDValue &Lo, SDValue &Hi);
408 void ExpandIntRes_SIGN_EXTEND_INREG (SDNode *N, SDValue &Lo, SDValue &Hi);
408 void ExpandIntRes_SIGN_EXTEND_INREG (SDNode *N, SDValue &Lo, SDValue &Hi);
409 void ExpandIntRes_TRUNCATE (SDNode *N, SDValue &Lo, SDValue &Hi);
409 void ExpandIntRes_TRUNCATE (SDNode *N, SDValue &Lo, SDValue &Hi);
410 void ExpandIntRes_ZERO_EXTEND (SDNode *N, SDValue &Lo, SDValue &Hi);
410 void ExpandIntRes_ZERO_EXTEND (SDNode *N, SDValue &Lo, SDValue &Hi);
411 void ExpandIntRes_FLT_ROUNDS (SDNode *N, SDValue &Lo, SDValue &Hi);
411 void ExpandIntRes_FLT_ROUNDS (SDNode *N, SDValue &Lo, SDValue &Hi);
412 void ExpandIntRes_FP_TO_SINT (SDNode *N, SDValue &Lo, SDValue &Hi);
412 void ExpandIntRes_FP_TO_SINT (SDNode *N, SDValue &Lo, SDValue &Hi);
413 void ExpandIntRes_FP_TO_UINT (SDNode *N, SDValue &Lo, SDValue &Hi);
413 void ExpandIntRes_FP_TO_UINT (SDNode *N, SDValue &Lo, SDValue &Hi);
414 void ExpandIntRes_LLROUND (SDNode *N, SDValue &Lo, SDValue &Hi);
414 void ExpandIntRes_LLROUND (SDNode *N, SDValue &Lo, SDValue &Hi);
415 void ExpandIntRes_LLRINT (SDNode *N, SDValue &Lo, SDValue &Hi);
415 void ExpandIntRes_LLRINT (SDNode *N, SDValue &Lo, SDValue &Hi);
417 void ExpandIntRes_Logical (SDNode *N, SDValue &Lo, SDValue &Hi);
417 void ExpandIntRes_Logical (SDNode *N, SDValue &Lo, SDValue &Hi);
418 void ExpandIntRes_ADDSUB (SDNode *N, SDValue &Lo, SDValue &Hi);
418 void ExpandIntRes_ADDSUB (SDNode *N, SDValue &Lo, SDValue &Hi);
419 void ExpandIntRes_ADDSUBC (SDNode *N, SDValue &Lo, SDValue &Hi);
419 void ExpandIntRes_ADDSUBC (SDNode *N, SDValue &Lo, SDValue &Hi);
420 void ExpandIntRes_ADDSUBE (SDNode *N, SDValue &Lo, SDValue &Hi);
420 void ExpandIntRes_ADDSUBE (SDNode *N, SDValue &Lo, SDValue &Hi);
421 void ExpandIntRes_ADDSUBCARRY (SDNode *N, SDValue &Lo, SDValue &Hi);
421 void ExpandIntRes_ADDSUBCARRY (SDNode *N, SDValue &Lo, SDValue &Hi);
422 void ExpandIntRes_BITREVERSE (SDNode *N, SDValue &Lo, SDValue &Hi);
422 void ExpandIntRes_BITREVERSE (SDNode *N, SDValue &Lo, SDValue &Hi);
423 void ExpandIntRes_BSWAP (SDNode *N, SDValue &Lo, SDValue &Hi);
423 void ExpandIntRes_BSWAP (SDNode *N, SDValue &Lo, SDValue &Hi);
424 void ExpandIntRes_MUL (SDNode *N, SDValue &Lo, SDValue &Hi);
424 void ExpandIntRes_MUL (SDNode *N, SDValue &Lo, SDValue &Hi);
425 void ExpandIntRes_SDIV (SDNode *N, SDValue &Lo, SDValue &Hi);
425 void ExpandIntRes_SDIV (SDNode *N, SDValue &Lo, SDValue &Hi);
426 void ExpandIntRes_SREM (SDNode *N, SDValue &Lo, SDValue &Hi);
426 void ExpandIntRes_SREM (SDNode *N, SDValue &Lo, SDValue &Hi);
427 void ExpandIntRes_UDIV (SDNode *N, SDValue &Lo, SDValue &Hi);
427 void ExpandIntRes_UDIV (SDNode *N, SDValue &Lo, SDValue &Hi);
428 void ExpandIntRes_UREM (SDNode *N, SDValue &Lo, SDValue &Hi);
428 void ExpandIntRes_UREM (SDNode *N, SDValue &Lo, SDValue &Hi);
429 void ExpandIntRes_Shift (SDNode *N, SDValue &Lo, SDValue &Hi);
429 void ExpandIntRes_Shift (SDNode *N, SDValue &Lo, SDValue &Hi);
431 void ExpandIntRes_MINMAX (SDNode *N, SDValue &Lo, SDValue &Hi);
431 void ExpandIntRes_MINMAX (SDNode *N, SDValue &Lo, SDValue &Hi);
433 void ExpandIntRes_SADDSUBO (SDNode *N, SDValue &Lo, SDValue &Hi);
433 void ExpandIntRes_SADDSUBO (SDNode *N, SDValue &Lo, SDValue &Hi);
434 void ExpandIntRes_UADDSUBO (SDNode *N, SDValue &Lo, SDValue &Hi);
434 void ExpandIntRes_UADDSUBO (SDNode *N, SDValue &Lo, SDValue &Hi);
435 void ExpandIntRes_XMULO (SDNode *N, SDValue &Lo, SDValue &Hi);
435 void ExpandIntRes_XMULO (SDNode *N, SDValue &Lo, SDValue &Hi);
436 void ExpandIntRes_ADDSUBSAT (SDNode *N, SDValue &Lo, SDValue &Hi);
436 void ExpandIntRes_ADDSUBSAT (SDNode *N, SDValue &Lo, SDValue &Hi);
437 void ExpandIntRes_MULFIX (SDNode *N, SDValue &Lo, SDValue &Hi);
437 void ExpandIntRes_MULFIX (SDNode *N, SDValue &Lo, SDValue &Hi);
439 void ExpandIntRes_ATOMIC_LOAD (SDNode *N, SDValue &Lo, SDValue &Hi);
439 void ExpandIntRes_ATOMIC_LOAD (SDNode *N, SDValue &Lo, SDValue &Hi);
440 void ExpandIntRes_VECREDUCE (SDNode *N, SDValue &Lo, SDValue &Hi);
440 void ExpandIntRes_VECREDUCE (SDNode *N, SDValue &Lo, SDValue &Hi);
443 SDValue &Lo, SDValue &Hi);
443 SDValue &Lo, SDValue &Hi);
444 bool ExpandShiftWithKnownAmountBit(SDNode *N, SDValue &Lo, SDValue &Hi);
444 bool ExpandShiftWithKnownAmountBit(SDNode *N, SDValue &Lo, SDValue &Hi);
445 bool ExpandShiftWithUnknownAmountBit(SDNode *N, SDValue &Lo, SDValue &Hi);
445 bool ExpandShiftWithUnknownAmountBit(SDNode *N, SDValue &Lo, SDValue &Hi);
449 SDValue ExpandIntOp_BR_CC(SDNode *N);
450 SDValue ExpandIntOp_SELECT_CC(SDNode *N);
451 SDValue ExpandIntOp_SETCC(SDNode *N);
452 SDValue ExpandIntOp_SETCCCARRY(SDNode *N);
453 SDValue ExpandIntOp_Shift(SDNode *N);
454 SDValue ExpandIntOp_SINT_TO_FP(SDNode *N);
455 SDValue ExpandIntOp_STORE(StoreSDNode *N, unsigned OpNo);
456 SDValue ExpandIntOp_TRUNCATE(SDNode *N);
457 SDValue ExpandIntOp_UINT_TO_FP(SDNode *N);
458 SDValue ExpandIntOp_RETURNADDR(SDNode *N);
459 SDValue ExpandIntOp_ATOMIC_STORE(SDNode *N);
461 void IntegerExpandSetCCOperands(SDValue &NewLHS, SDValue &NewRHS,
461 void IntegerExpandSetCCOperands(SDValue &NewLHS, SDValue &NewRHS,
473 SDValue GetSoftenedFloat(SDValue Op) {
473 SDValue GetSoftenedFloat(SDValue Op) {
481 SDValue SoftenedOp = getSDValue(Iter->second);
485 void SetSoftenedFloat(SDValue Op, SDValue Result);
485 void SetSoftenedFloat(SDValue Op, SDValue Result);
489 SDValue SoftenFloatRes_MERGE_VALUES(SDNode *N, unsigned ResNo);
490 SDValue SoftenFloatRes_BITCAST(SDNode *N);
491 SDValue SoftenFloatRes_BUILD_PAIR(SDNode *N);
492 SDValue SoftenFloatRes_ConstantFP(SDNode *N);
493 SDValue SoftenFloatRes_EXTRACT_VECTOR_ELT(SDNode *N, unsigned ResNo);
494 SDValue SoftenFloatRes_FABS(SDNode *N);
495 SDValue SoftenFloatRes_FMINNUM(SDNode *N);
496 SDValue SoftenFloatRes_FMAXNUM(SDNode *N);
497 SDValue SoftenFloatRes_FADD(SDNode *N);
498 SDValue SoftenFloatRes_FCBRT(SDNode *N);
499 SDValue SoftenFloatRes_FCEIL(SDNode *N);
500 SDValue SoftenFloatRes_FCOPYSIGN(SDNode *N);
501 SDValue SoftenFloatRes_FCOS(SDNode *N);
502 SDValue SoftenFloatRes_FDIV(SDNode *N);
503 SDValue SoftenFloatRes_FEXP(SDNode *N);
504 SDValue SoftenFloatRes_FEXP2(SDNode *N);
505 SDValue SoftenFloatRes_FFLOOR(SDNode *N);
506 SDValue SoftenFloatRes_FLOG(SDNode *N);
507 SDValue SoftenFloatRes_FLOG2(SDNode *N);
508 SDValue SoftenFloatRes_FLOG10(SDNode *N);
509 SDValue SoftenFloatRes_FMA(SDNode *N);
510 SDValue SoftenFloatRes_FMUL(SDNode *N);
511 SDValue SoftenFloatRes_FNEARBYINT(SDNode *N);
512 SDValue SoftenFloatRes_FNEG(SDNode *N);
513 SDValue SoftenFloatRes_FP_EXTEND(SDNode *N);
514 SDValue SoftenFloatRes_FP16_TO_FP(SDNode *N);
515 SDValue SoftenFloatRes_FP_ROUND(SDNode *N);
516 SDValue SoftenFloatRes_FPOW(SDNode *N);
517 SDValue SoftenFloatRes_FPOWI(SDNode *N);
518 SDValue SoftenFloatRes_FREM(SDNode *N);
519 SDValue SoftenFloatRes_FRINT(SDNode *N);
520 SDValue SoftenFloatRes_FROUND(SDNode *N);
521 SDValue SoftenFloatRes_FSIN(SDNode *N);
522 SDValue SoftenFloatRes_FSQRT(SDNode *N);
523 SDValue SoftenFloatRes_FSUB(SDNode *N);
524 SDValue SoftenFloatRes_FTRUNC(SDNode *N);
525 SDValue SoftenFloatRes_LOAD(SDNode *N);
526 SDValue SoftenFloatRes_SELECT(SDNode *N);
527 SDValue SoftenFloatRes_SELECT_CC(SDNode *N);
528 SDValue SoftenFloatRes_UNDEF(SDNode *N);
529 SDValue SoftenFloatRes_VAARG(SDNode *N);
530 SDValue SoftenFloatRes_XINT_TO_FP(SDNode *N);
534 SDValue SoftenFloatOp_BITCAST(SDNode *N);
535 SDValue SoftenFloatOp_BR_CC(SDNode *N);
536 SDValue SoftenFloatOp_FP_EXTEND(SDNode *N);
537 SDValue SoftenFloatOp_FP_ROUND(SDNode *N);
538 SDValue SoftenFloatOp_FP_TO_XINT(SDNode *N);
539 SDValue SoftenFloatOp_LROUND(SDNode *N);
540 SDValue SoftenFloatOp_LLROUND(SDNode *N);
541 SDValue SoftenFloatOp_LRINT(SDNode *N);
542 SDValue SoftenFloatOp_LLRINT(SDNode *N);
543 SDValue SoftenFloatOp_SELECT_CC(SDNode *N);
544 SDValue SoftenFloatOp_SETCC(SDNode *N);
545 SDValue SoftenFloatOp_STORE(SDNode *N, unsigned OpNo);
557 void GetExpandedFloat(SDValue Op, SDValue &Lo, SDValue &Hi);
557 void GetExpandedFloat(SDValue Op, SDValue &Lo, SDValue &Hi);
557 void GetExpandedFloat(SDValue Op, SDValue &Lo, SDValue &Hi);
558 void SetExpandedFloat(SDValue Op, SDValue Lo, SDValue Hi);
558 void SetExpandedFloat(SDValue Op, SDValue Lo, SDValue Hi);
558 void SetExpandedFloat(SDValue Op, SDValue Lo, SDValue Hi);
562 void ExpandFloatRes_ConstantFP(SDNode *N, SDValue &Lo, SDValue &Hi);
562 void ExpandFloatRes_ConstantFP(SDNode *N, SDValue &Lo, SDValue &Hi);
563 void ExpandFloatRes_FABS (SDNode *N, SDValue &Lo, SDValue &Hi);
563 void ExpandFloatRes_FABS (SDNode *N, SDValue &Lo, SDValue &Hi);
564 void ExpandFloatRes_FMINNUM (SDNode *N, SDValue &Lo, SDValue &Hi);
564 void ExpandFloatRes_FMINNUM (SDNode *N, SDValue &Lo, SDValue &Hi);
565 void ExpandFloatRes_FMAXNUM (SDNode *N, SDValue &Lo, SDValue &Hi);
565 void ExpandFloatRes_FMAXNUM (SDNode *N, SDValue &Lo, SDValue &Hi);
566 void ExpandFloatRes_FADD (SDNode *N, SDValue &Lo, SDValue &Hi);
566 void ExpandFloatRes_FADD (SDNode *N, SDValue &Lo, SDValue &Hi);
567 void ExpandFloatRes_FCBRT (SDNode *N, SDValue &Lo, SDValue &Hi);
567 void ExpandFloatRes_FCBRT (SDNode *N, SDValue &Lo, SDValue &Hi);
568 void ExpandFloatRes_FCEIL (SDNode *N, SDValue &Lo, SDValue &Hi);
568 void ExpandFloatRes_FCEIL (SDNode *N, SDValue &Lo, SDValue &Hi);
569 void ExpandFloatRes_FCOPYSIGN (SDNode *N, SDValue &Lo, SDValue &Hi);
569 void ExpandFloatRes_FCOPYSIGN (SDNode *N, SDValue &Lo, SDValue &Hi);
570 void ExpandFloatRes_FCOS (SDNode *N, SDValue &Lo, SDValue &Hi);
570 void ExpandFloatRes_FCOS (SDNode *N, SDValue &Lo, SDValue &Hi);
571 void ExpandFloatRes_FDIV (SDNode *N, SDValue &Lo, SDValue &Hi);
571 void ExpandFloatRes_FDIV (SDNode *N, SDValue &Lo, SDValue &Hi);
572 void ExpandFloatRes_FEXP (SDNode *N, SDValue &Lo, SDValue &Hi);
572 void ExpandFloatRes_FEXP (SDNode *N, SDValue &Lo, SDValue &Hi);
573 void ExpandFloatRes_FEXP2 (SDNode *N, SDValue &Lo, SDValue &Hi);
573 void ExpandFloatRes_FEXP2 (SDNode *N, SDValue &Lo, SDValue &Hi);
574 void ExpandFloatRes_FFLOOR (SDNode *N, SDValue &Lo, SDValue &Hi);
574 void ExpandFloatRes_FFLOOR (SDNode *N, SDValue &Lo, SDValue &Hi);
575 void ExpandFloatRes_FLOG (SDNode *N, SDValue &Lo, SDValue &Hi);
575 void ExpandFloatRes_FLOG (SDNode *N, SDValue &Lo, SDValue &Hi);
576 void ExpandFloatRes_FLOG2 (SDNode *N, SDValue &Lo, SDValue &Hi);
576 void ExpandFloatRes_FLOG2 (SDNode *N, SDValue &Lo, SDValue &Hi);
577 void ExpandFloatRes_FLOG10 (SDNode *N, SDValue &Lo, SDValue &Hi);
577 void ExpandFloatRes_FLOG10 (SDNode *N, SDValue &Lo, SDValue &Hi);
578 void ExpandFloatRes_FMA (SDNode *N, SDValue &Lo, SDValue &Hi);
578 void ExpandFloatRes_FMA (SDNode *N, SDValue &Lo, SDValue &Hi);
579 void ExpandFloatRes_FMUL (SDNode *N, SDValue &Lo, SDValue &Hi);
579 void ExpandFloatRes_FMUL (SDNode *N, SDValue &Lo, SDValue &Hi);
580 void ExpandFloatRes_FNEARBYINT(SDNode *N, SDValue &Lo, SDValue &Hi);
580 void ExpandFloatRes_FNEARBYINT(SDNode *N, SDValue &Lo, SDValue &Hi);
581 void ExpandFloatRes_FNEG (SDNode *N, SDValue &Lo, SDValue &Hi);
581 void ExpandFloatRes_FNEG (SDNode *N, SDValue &Lo, SDValue &Hi);
582 void ExpandFloatRes_FP_EXTEND (SDNode *N, SDValue &Lo, SDValue &Hi);
582 void ExpandFloatRes_FP_EXTEND (SDNode *N, SDValue &Lo, SDValue &Hi);
583 void ExpandFloatRes_FPOW (SDNode *N, SDValue &Lo, SDValue &Hi);
583 void ExpandFloatRes_FPOW (SDNode *N, SDValue &Lo, SDValue &Hi);
584 void ExpandFloatRes_FPOWI (SDNode *N, SDValue &Lo, SDValue &Hi);
584 void ExpandFloatRes_FPOWI (SDNode *N, SDValue &Lo, SDValue &Hi);
585 void ExpandFloatRes_FREM (SDNode *N, SDValue &Lo, SDValue &Hi);
585 void ExpandFloatRes_FREM (SDNode *N, SDValue &Lo, SDValue &Hi);
586 void ExpandFloatRes_FRINT (SDNode *N, SDValue &Lo, SDValue &Hi);
586 void ExpandFloatRes_FRINT (SDNode *N, SDValue &Lo, SDValue &Hi);
587 void ExpandFloatRes_FROUND (SDNode *N, SDValue &Lo, SDValue &Hi);
587 void ExpandFloatRes_FROUND (SDNode *N, SDValue &Lo, SDValue &Hi);
588 void ExpandFloatRes_FSIN (SDNode *N, SDValue &Lo, SDValue &Hi);
588 void ExpandFloatRes_FSIN (SDNode *N, SDValue &Lo, SDValue &Hi);
589 void ExpandFloatRes_FSQRT (SDNode *N, SDValue &Lo, SDValue &Hi);
589 void ExpandFloatRes_FSQRT (SDNode *N, SDValue &Lo, SDValue &Hi);
590 void ExpandFloatRes_FSUB (SDNode *N, SDValue &Lo, SDValue &Hi);
590 void ExpandFloatRes_FSUB (SDNode *N, SDValue &Lo, SDValue &Hi);
591 void ExpandFloatRes_FTRUNC (SDNode *N, SDValue &Lo, SDValue &Hi);
591 void ExpandFloatRes_FTRUNC (SDNode *N, SDValue &Lo, SDValue &Hi);
592 void ExpandFloatRes_LOAD (SDNode *N, SDValue &Lo, SDValue &Hi);
592 void ExpandFloatRes_LOAD (SDNode *N, SDValue &Lo, SDValue &Hi);
593 void ExpandFloatRes_XINT_TO_FP(SDNode *N, SDValue &Lo, SDValue &Hi);
593 void ExpandFloatRes_XINT_TO_FP(SDNode *N, SDValue &Lo, SDValue &Hi);
597 SDValue ExpandFloatOp_BR_CC(SDNode *N);
598 SDValue ExpandFloatOp_FCOPYSIGN(SDNode *N);
599 SDValue ExpandFloatOp_FP_ROUND(SDNode *N);
600 SDValue ExpandFloatOp_FP_TO_SINT(SDNode *N);
601 SDValue ExpandFloatOp_FP_TO_UINT(SDNode *N);
602 SDValue ExpandFloatOp_LROUND(SDNode *N);
603 SDValue ExpandFloatOp_LLROUND(SDNode *N);
604 SDValue ExpandFloatOp_LRINT(SDNode *N);
605 SDValue ExpandFloatOp_LLRINT(SDNode *N);
606 SDValue ExpandFloatOp_SELECT_CC(SDNode *N);
607 SDValue ExpandFloatOp_SETCC(SDNode *N);
608 SDValue ExpandFloatOp_STORE(SDNode *N, unsigned OpNo);
610 void FloatExpandSetCCOperands(SDValue &NewLHS, SDValue &NewRHS,
610 void FloatExpandSetCCOperands(SDValue &NewLHS, SDValue &NewRHS,
617 SDValue GetPromotedFloat(SDValue Op) {
617 SDValue GetPromotedFloat(SDValue Op) {
619 SDValue PromotedOp = getSDValue(PromotedId);
623 void SetPromotedFloat(SDValue Op, SDValue Result);
623 void SetPromotedFloat(SDValue Op, SDValue Result);
626 SDValue PromoteFloatRes_BITCAST(SDNode *N);
627 SDValue PromoteFloatRes_BinOp(SDNode *N);
628 SDValue PromoteFloatRes_ConstantFP(SDNode *N);
629 SDValue PromoteFloatRes_EXTRACT_VECTOR_ELT(SDNode *N);
630 SDValue PromoteFloatRes_FCOPYSIGN(SDNode *N);
631 SDValue PromoteFloatRes_FMAD(SDNode *N);
632 SDValue PromoteFloatRes_FPOWI(SDNode *N);
633 SDValue PromoteFloatRes_FP_ROUND(SDNode *N);
634 SDValue PromoteFloatRes_LOAD(SDNode *N);
635 SDValue PromoteFloatRes_SELECT(SDNode *N);
636 SDValue PromoteFloatRes_SELECT_CC(SDNode *N);
637 SDValue PromoteFloatRes_UnaryOp(SDNode *N);
638 SDValue PromoteFloatRes_UNDEF(SDNode *N);
639 SDValue BitcastToInt_ATOMIC_SWAP(SDNode *N);
640 SDValue PromoteFloatRes_XINT_TO_FP(SDNode *N);
643 SDValue PromoteFloatOp_BITCAST(SDNode *N, unsigned OpNo);
644 SDValue PromoteFloatOp_FCOPYSIGN(SDNode *N, unsigned OpNo);
645 SDValue PromoteFloatOp_FP_EXTEND(SDNode *N, unsigned OpNo);
646 SDValue PromoteFloatOp_FP_TO_XINT(SDNode *N, unsigned OpNo);
647 SDValue PromoteFloatOp_STORE(SDNode *N, unsigned OpNo);
648 SDValue PromoteFloatOp_SELECT_CC(SDNode *N, unsigned OpNo);
649 SDValue PromoteFloatOp_SETCC(SDNode *N, unsigned OpNo);
658 SDValue GetScalarizedVector(SDValue Op) {
658 SDValue GetScalarizedVector(SDValue Op) {
660 SDValue ScalarizedOp = getSDValue(ScalarizedId);
664 void SetScalarizedVector(SDValue Op, SDValue Result);
664 void SetScalarizedVector(SDValue Op, SDValue Result);
668 SDValue ScalarizeVecRes_MERGE_VALUES(SDNode *N, unsigned ResNo);
669 SDValue ScalarizeVecRes_BinOp(SDNode *N);
670 SDValue ScalarizeVecRes_TernaryOp(SDNode *N);
671 SDValue ScalarizeVecRes_UnaryOp(SDNode *N);
672 SDValue ScalarizeVecRes_StrictFPOp(SDNode *N);
673 SDValue ScalarizeVecRes_OverflowOp(SDNode *N, unsigned ResNo);
674 SDValue ScalarizeVecRes_InregOp(SDNode *N);
675 SDValue ScalarizeVecRes_VecInregOp(SDNode *N);
677 SDValue ScalarizeVecRes_BITCAST(SDNode *N);
678 SDValue ScalarizeVecRes_BUILD_VECTOR(SDNode *N);
679 SDValue ScalarizeVecRes_EXTRACT_SUBVECTOR(SDNode *N);
680 SDValue ScalarizeVecRes_FP_ROUND(SDNode *N);
681 SDValue ScalarizeVecRes_STRICT_FP_ROUND(SDNode *N);
682 SDValue ScalarizeVecRes_FPOWI(SDNode *N);
683 SDValue ScalarizeVecRes_INSERT_VECTOR_ELT(SDNode *N);
684 SDValue ScalarizeVecRes_LOAD(LoadSDNode *N);
685 SDValue ScalarizeVecRes_SCALAR_TO_VECTOR(SDNode *N);
686 SDValue ScalarizeVecRes_VSELECT(SDNode *N);
687 SDValue ScalarizeVecRes_SELECT(SDNode *N);
688 SDValue ScalarizeVecRes_SELECT_CC(SDNode *N);
689 SDValue ScalarizeVecRes_SETCC(SDNode *N);
690 SDValue ScalarizeVecRes_UNDEF(SDNode *N);
691 SDValue ScalarizeVecRes_VECTOR_SHUFFLE(SDNode *N);
693 SDValue ScalarizeVecRes_MULFIX(SDNode *N);
697 SDValue ScalarizeVecOp_BITCAST(SDNode *N);
698 SDValue ScalarizeVecOp_UnaryOp(SDNode *N);
699 SDValue ScalarizeVecOp_UnaryOp_StrictFP(SDNode *N);
700 SDValue ScalarizeVecOp_CONCAT_VECTORS(SDNode *N);
701 SDValue ScalarizeVecOp_EXTRACT_VECTOR_ELT(SDNode *N);
702 SDValue ScalarizeVecOp_VSELECT(SDNode *N);
703 SDValue ScalarizeVecOp_VSETCC(SDNode *N);
704 SDValue ScalarizeVecOp_STORE(StoreSDNode *N, unsigned OpNo);
705 SDValue ScalarizeVecOp_FP_ROUND(SDNode *N, unsigned OpNo);
706 SDValue ScalarizeVecOp_STRICT_FP_ROUND(SDNode *N, unsigned OpNo);
707 SDValue ScalarizeVecOp_VECREDUCE(SDNode *N);
720 void GetSplitVector(SDValue Op, SDValue &Lo, SDValue &Hi);
720 void GetSplitVector(SDValue Op, SDValue &Lo, SDValue &Hi);
720 void GetSplitVector(SDValue Op, SDValue &Lo, SDValue &Hi);
721 void SetSplitVector(SDValue Op, SDValue Lo, SDValue Hi);
721 void SetSplitVector(SDValue Op, SDValue Lo, SDValue Hi);
721 void SetSplitVector(SDValue Op, SDValue Lo, SDValue Hi);
725 void SplitVecRes_BinOp(SDNode *N, SDValue &Lo, SDValue &Hi);
725 void SplitVecRes_BinOp(SDNode *N, SDValue &Lo, SDValue &Hi);
726 void SplitVecRes_TernaryOp(SDNode *N, SDValue &Lo, SDValue &Hi);
726 void SplitVecRes_TernaryOp(SDNode *N, SDValue &Lo, SDValue &Hi);
727 void SplitVecRes_UnaryOp(SDNode *N, SDValue &Lo, SDValue &Hi);
727 void SplitVecRes_UnaryOp(SDNode *N, SDValue &Lo, SDValue &Hi);
728 void SplitVecRes_ExtendOp(SDNode *N, SDValue &Lo, SDValue &Hi);
728 void SplitVecRes_ExtendOp(SDNode *N, SDValue &Lo, SDValue &Hi);
729 void SplitVecRes_InregOp(SDNode *N, SDValue &Lo, SDValue &Hi);
729 void SplitVecRes_InregOp(SDNode *N, SDValue &Lo, SDValue &Hi);
730 void SplitVecRes_ExtVecInRegOp(SDNode *N, SDValue &Lo, SDValue &Hi);
730 void SplitVecRes_ExtVecInRegOp(SDNode *N, SDValue &Lo, SDValue &Hi);
731 void SplitVecRes_StrictFPOp(SDNode *N, SDValue &Lo, SDValue &Hi);
731 void SplitVecRes_StrictFPOp(SDNode *N, SDValue &Lo, SDValue &Hi);
733 SDValue &Lo, SDValue &Hi);
733 SDValue &Lo, SDValue &Hi);
735 void SplitVecRes_MULFIX(SDNode *N, SDValue &Lo, SDValue &Hi);
735 void SplitVecRes_MULFIX(SDNode *N, SDValue &Lo, SDValue &Hi);
737 void SplitVecRes_BITCAST(SDNode *N, SDValue &Lo, SDValue &Hi);
737 void SplitVecRes_BITCAST(SDNode *N, SDValue &Lo, SDValue &Hi);
738 void SplitVecRes_BUILD_VECTOR(SDNode *N, SDValue &Lo, SDValue &Hi);
738 void SplitVecRes_BUILD_VECTOR(SDNode *N, SDValue &Lo, SDValue &Hi);
739 void SplitVecRes_CONCAT_VECTORS(SDNode *N, SDValue &Lo, SDValue &Hi);
739 void SplitVecRes_CONCAT_VECTORS(SDNode *N, SDValue &Lo, SDValue &Hi);
740 void SplitVecRes_EXTRACT_SUBVECTOR(SDNode *N, SDValue &Lo, SDValue &Hi);
740 void SplitVecRes_EXTRACT_SUBVECTOR(SDNode *N, SDValue &Lo, SDValue &Hi);
741 void SplitVecRes_INSERT_SUBVECTOR(SDNode *N, SDValue &Lo, SDValue &Hi);
741 void SplitVecRes_INSERT_SUBVECTOR(SDNode *N, SDValue &Lo, SDValue &Hi);
742 void SplitVecRes_FPOWI(SDNode *N, SDValue &Lo, SDValue &Hi);
742 void SplitVecRes_FPOWI(SDNode *N, SDValue &Lo, SDValue &Hi);
743 void SplitVecRes_FCOPYSIGN(SDNode *N, SDValue &Lo, SDValue &Hi);
743 void SplitVecRes_FCOPYSIGN(SDNode *N, SDValue &Lo, SDValue &Hi);
744 void SplitVecRes_INSERT_VECTOR_ELT(SDNode *N, SDValue &Lo, SDValue &Hi);
744 void SplitVecRes_INSERT_VECTOR_ELT(SDNode *N, SDValue &Lo, SDValue &Hi);
745 void SplitVecRes_LOAD(LoadSDNode *LD, SDValue &Lo, SDValue &Hi);
745 void SplitVecRes_LOAD(LoadSDNode *LD, SDValue &Lo, SDValue &Hi);
746 void SplitVecRes_MLOAD(MaskedLoadSDNode *MLD, SDValue &Lo, SDValue &Hi);
746 void SplitVecRes_MLOAD(MaskedLoadSDNode *MLD, SDValue &Lo, SDValue &Hi);
747 void SplitVecRes_MGATHER(MaskedGatherSDNode *MGT, SDValue &Lo, SDValue &Hi);
747 void SplitVecRes_MGATHER(MaskedGatherSDNode *MGT, SDValue &Lo, SDValue &Hi);
748 void SplitVecRes_SCALAR_TO_VECTOR(SDNode *N, SDValue &Lo, SDValue &Hi);
748 void SplitVecRes_SCALAR_TO_VECTOR(SDNode *N, SDValue &Lo, SDValue &Hi);
749 void SplitVecRes_SETCC(SDNode *N, SDValue &Lo, SDValue &Hi);
749 void SplitVecRes_SETCC(SDNode *N, SDValue &Lo, SDValue &Hi);
750 void SplitVecRes_VECTOR_SHUFFLE(ShuffleVectorSDNode *N, SDValue &Lo,
751 SDValue &Hi);
752 void SplitVecRes_VAARG(SDNode *N, SDValue &Lo, SDValue &Hi);
752 void SplitVecRes_VAARG(SDNode *N, SDValue &Lo, SDValue &Hi);
756 SDValue SplitVecOp_VSELECT(SDNode *N, unsigned OpNo);
757 SDValue SplitVecOp_VECREDUCE(SDNode *N, unsigned OpNo);
758 SDValue SplitVecOp_UnaryOp(SDNode *N);
759 SDValue SplitVecOp_TruncateHelper(SDNode *N);
761 SDValue SplitVecOp_BITCAST(SDNode *N);
762 SDValue SplitVecOp_EXTRACT_SUBVECTOR(SDNode *N);
763 SDValue SplitVecOp_EXTRACT_VECTOR_ELT(SDNode *N);
764 SDValue SplitVecOp_ExtVecInRegOp(SDNode *N);
765 SDValue SplitVecOp_STORE(StoreSDNode *N, unsigned OpNo);
766 SDValue SplitVecOp_MSTORE(MaskedStoreSDNode *N, unsigned OpNo);
767 SDValue SplitVecOp_MSCATTER(MaskedScatterSDNode *N, unsigned OpNo);
768 SDValue SplitVecOp_MGATHER(MaskedGatherSDNode *MGT, unsigned OpNo);
769 SDValue SplitVecOp_CONCAT_VECTORS(SDNode *N);
770 SDValue SplitVecOp_VSETCC(SDNode *N);
771 SDValue SplitVecOp_FP_ROUND(SDNode *N);
772 SDValue SplitVecOp_FCOPYSIGN(SDNode *N);
784 SDValue GetWidenedVector(SDValue Op) {
784 SDValue GetWidenedVector(SDValue Op) {
786 SDValue WidenedOp = getSDValue(WidenedId);
790 void SetWidenedVector(SDValue Op, SDValue Result);
790 void SetWidenedVector(SDValue Op, SDValue Result);
794 SDValue WidenVecRes_MERGE_VALUES(SDNode* N, unsigned ResNo);
795 SDValue WidenVecRes_BITCAST(SDNode* N);
796 SDValue WidenVecRes_BUILD_VECTOR(SDNode* N);
797 SDValue WidenVecRes_CONCAT_VECTORS(SDNode* N);
798 SDValue WidenVecRes_EXTEND_VECTOR_INREG(SDNode* N);
799 SDValue WidenVecRes_EXTRACT_SUBVECTOR(SDNode* N);
800 SDValue WidenVecRes_INSERT_VECTOR_ELT(SDNode* N);
801 SDValue WidenVecRes_LOAD(SDNode* N);
802 SDValue WidenVecRes_MLOAD(MaskedLoadSDNode* N);
803 SDValue WidenVecRes_MGATHER(MaskedGatherSDNode* N);
804 SDValue WidenVecRes_SCALAR_TO_VECTOR(SDNode* N);
805 SDValue WidenVecRes_SELECT(SDNode* N);
806 SDValue WidenVSELECTAndMask(SDNode *N);
807 SDValue WidenVecRes_SELECT_CC(SDNode* N);
808 SDValue WidenVecRes_SETCC(SDNode* N);
809 SDValue WidenVecRes_UNDEF(SDNode *N);
810 SDValue WidenVecRes_VECTOR_SHUFFLE(ShuffleVectorSDNode *N);
812 SDValue WidenVecRes_Ternary(SDNode *N);
813 SDValue WidenVecRes_Binary(SDNode *N);
814 SDValue WidenVecRes_BinaryCanTrap(SDNode *N);
815 SDValue WidenVecRes_BinaryWithExtraScalarOp(SDNode *N);
816 SDValue WidenVecRes_StrictFP(SDNode *N);
817 SDValue WidenVecRes_OverflowOp(SDNode *N, unsigned ResNo);
818 SDValue WidenVecRes_Convert(SDNode *N);
819 SDValue WidenVecRes_Convert_StrictFP(SDNode *N);
820 SDValue WidenVecRes_FCOPYSIGN(SDNode *N);
821 SDValue WidenVecRes_POWI(SDNode *N);
822 SDValue WidenVecRes_Shift(SDNode *N);
823 SDValue WidenVecRes_Unary(SDNode *N);
824 SDValue WidenVecRes_InregOp(SDNode *N);
828 SDValue WidenVecOp_BITCAST(SDNode *N);
829 SDValue WidenVecOp_CONCAT_VECTORS(SDNode *N);
830 SDValue WidenVecOp_EXTEND(SDNode *N);
831 SDValue WidenVecOp_EXTRACT_VECTOR_ELT(SDNode *N);
832 SDValue WidenVecOp_EXTRACT_SUBVECTOR(SDNode *N);
833 SDValue WidenVecOp_STORE(SDNode* N);
834 SDValue WidenVecOp_MSTORE(SDNode* N, unsigned OpNo);
835 SDValue WidenVecOp_MGATHER(SDNode* N, unsigned OpNo);
836 SDValue WidenVecOp_MSCATTER(SDNode* N, unsigned OpNo);
837 SDValue WidenVecOp_SETCC(SDNode* N);
838 SDValue WidenVecOp_VSELECT(SDNode *N);
840 SDValue WidenVecOp_Convert(SDNode *N);
841 SDValue WidenVecOp_FCOPYSIGN(SDNode *N);
842 SDValue WidenVecOp_VECREDUCE(SDNode *N);
847 SDValue UnrollVectorOp_StrictFP(SDNode *N, unsigned ResNE);
857 SDValue GenWidenVectorLoads(SmallVectorImpl<SDValue> &LdChain,
857 SDValue GenWidenVectorLoads(SmallVectorImpl<SDValue> &LdChain,
865 SDValue GenWidenVectorExtLoads(SmallVectorImpl<SDValue> &LdChain,
865 SDValue GenWidenVectorExtLoads(SmallVectorImpl<SDValue> &LdChain,
872 void GenWidenVectorStores(SmallVectorImpl<SDValue> &StChain, StoreSDNode *ST);
878 void GenWidenVectorTruncStores(SmallVectorImpl<SDValue> &StChain,
885 SDValue ModifyToType(SDValue InOp, EVT NVT, bool FillWithZeroes = false);
885 SDValue ModifyToType(SDValue InOp, EVT NVT, bool FillWithZeroes = false);
889 SDValue convertMask(SDValue InMask, EVT MaskVT, EVT ToMaskVT);
889 SDValue convertMask(SDValue InMask, EVT MaskVT, EVT ToMaskVT);
899 void GetSplitOp(SDValue Op, SDValue &Lo, SDValue &Hi) {
899 void GetSplitOp(SDValue Op, SDValue &Lo, SDValue &Hi) {
899 void GetSplitOp(SDValue Op, SDValue &Lo, SDValue &Hi) {
910 void GetPairElements(SDValue Pair, SDValue &Lo, SDValue &Hi);
910 void GetPairElements(SDValue Pair, SDValue &Lo, SDValue &Hi);
910 void GetPairElements(SDValue Pair, SDValue &Lo, SDValue &Hi);
914 SDValue &Lo, SDValue &Hi);
914 SDValue &Lo, SDValue &Hi);
915 void SplitRes_SELECT (SDNode *N, SDValue &Lo, SDValue &Hi);
915 void SplitRes_SELECT (SDNode *N, SDValue &Lo, SDValue &Hi);
916 void SplitRes_SELECT_CC (SDNode *N, SDValue &Lo, SDValue &Hi);
916 void SplitRes_SELECT_CC (SDNode *N, SDValue &Lo, SDValue &Hi);
917 void SplitRes_UNDEF (SDNode *N, SDValue &Lo, SDValue &Hi);
917 void SplitRes_UNDEF (SDNode *N, SDValue &Lo, SDValue &Hi);
930 void GetExpandedOp(SDValue Op, SDValue &Lo, SDValue &Hi) {
930 void GetExpandedOp(SDValue Op, SDValue &Lo, SDValue &Hi) {
930 void GetExpandedOp(SDValue Op, SDValue &Lo, SDValue &Hi) {
940 void IntegerToVector(SDValue Op, unsigned NumElements,
941 SmallVectorImpl<SDValue> &Ops, EVT EltVT);
945 SDValue &Lo, SDValue &Hi);
945 SDValue &Lo, SDValue &Hi);
946 void ExpandRes_BITCAST (SDNode *N, SDValue &Lo, SDValue &Hi);
946 void ExpandRes_BITCAST (SDNode *N, SDValue &Lo, SDValue &Hi);
947 void ExpandRes_BUILD_PAIR (SDNode *N, SDValue &Lo, SDValue &Hi);
947 void ExpandRes_BUILD_PAIR (SDNode *N, SDValue &Lo, SDValue &Hi);
948 void ExpandRes_EXTRACT_ELEMENT (SDNode *N, SDValue &Lo, SDValue &Hi);
948 void ExpandRes_EXTRACT_ELEMENT (SDNode *N, SDValue &Lo, SDValue &Hi);
949 void ExpandRes_EXTRACT_VECTOR_ELT(SDNode *N, SDValue &Lo, SDValue &Hi);
949 void ExpandRes_EXTRACT_VECTOR_ELT(SDNode *N, SDValue &Lo, SDValue &Hi);
950 void ExpandRes_NormalLoad (SDNode *N, SDValue &Lo, SDValue &Hi);
950 void ExpandRes_NormalLoad (SDNode *N, SDValue &Lo, SDValue &Hi);
951 void ExpandRes_VAARG (SDNode *N, SDValue &Lo, SDValue &Hi);
951 void ExpandRes_VAARG (SDNode *N, SDValue &Lo, SDValue &Hi);
954 SDValue ExpandOp_BITCAST (SDNode *N);
955 SDValue ExpandOp_BUILD_VECTOR (SDNode *N);
956 SDValue ExpandOp_EXTRACT_ELEMENT (SDNode *N);
957 SDValue ExpandOp_INSERT_VECTOR_ELT(SDNode *N);
958 SDValue ExpandOp_SCALAR_TO_VECTOR (SDNode *N);
959 SDValue ExpandOp_NormalStore (SDNode *N, unsigned OpNo);
lib/CodeGen/SelectionDAG/LegalizeTypesGeneric.cpp 35 SDValue &Lo, SDValue &Hi) {
35 SDValue &Lo, SDValue &Hi) {
36 SDValue Op = DisintegrateMERGE_VALUES(N, ResNo);
40 void DAGTypeLegalizer::ExpandRes_BITCAST(SDNode *N, SDValue &Lo, SDValue &Hi) {
40 void DAGTypeLegalizer::ExpandRes_BITCAST(SDNode *N, SDValue &Lo, SDValue &Hi) {
43 SDValue InOp = N->getOperand(0);
118 SDValue CastInOp = DAG.getNode(ISD::BITCAST, dl, NVT, InOp);
120 SmallVector<SDValue, 8> Vals;
131 SDValue LHS = Vals[Slot];
132 SDValue RHS = Vals[Slot + 1];
159 SDValue StackPtr = DAG.CreateStackTemporary(InVT, Alignment);
165 SDValue Store = DAG.getStore(DAG.getEntryNode(), dl, InOp, StackPtr, PtrInfo);
186 void DAGTypeLegalizer::ExpandRes_BUILD_PAIR(SDNode *N, SDValue &Lo,
187 SDValue &Hi) {
193 void DAGTypeLegalizer::ExpandRes_EXTRACT_ELEMENT(SDNode *N, SDValue &Lo,
194 SDValue &Hi) {
196 SDValue Part = cast<ConstantSDNode>(N->getOperand(1))->getZExtValue() ?
205 void DAGTypeLegalizer::ExpandRes_EXTRACT_VECTOR_ELT(SDNode *N, SDValue &Lo,
206 SDValue &Hi) {
207 SDValue OldVec = N->getOperand(0);
226 SDValue NewVec = DAG.getNode(ISD::BITCAST, dl,
232 SDValue Idx = N->getOperand(1);
245 void DAGTypeLegalizer::ExpandRes_NormalLoad(SDNode *N, SDValue &Lo,
246 SDValue &Hi) {
253 SDValue Chain = LD->getChain();
254 SDValue Ptr = LD->getBasePtr();
286 void DAGTypeLegalizer::ExpandRes_VAARG(SDNode *N, SDValue &Lo, SDValue &Hi) {
286 void DAGTypeLegalizer::ExpandRes_VAARG(SDNode *N, SDValue &Lo, SDValue &Hi) {
289 SDValue Chain = N->getOperand(0);
290 SDValue Ptr = N->getOperand(1);
312 void DAGTypeLegalizer::IntegerToVector(SDValue Op, unsigned NumElements,
313 SmallVectorImpl<SDValue> &Ops,
317 SDValue Parts[2];
331 SDValue DAGTypeLegalizer::ExpandOp_BITCAST(SDNode *N) {
356 SmallVector<SDValue, 8> Ops;
359 SDValue Vec =
368 SDValue DAGTypeLegalizer::ExpandOp_BUILD_VECTOR(SDNode *N) {
381 SmallVector<SDValue, 16> NewElts;
385 SDValue Lo, Hi;
394 SDValue NewVec = DAG.getBuildVector(NewVecVT, dl, NewElts);
400 SDValue DAGTypeLegalizer::ExpandOp_EXTRACT_ELEMENT(SDNode *N) {
401 SDValue Lo, Hi;
406 SDValue DAGTypeLegalizer::ExpandOp_INSERT_VECTOR_ELT(SDNode *N) {
412 SDValue Val = N->getOperand(1);
422 SDValue NewVec = DAG.getNode(ISD::BITCAST, dl,
425 SDValue Lo, Hi;
430 SDValue Idx = N->getOperand(2);
442 SDValue DAGTypeLegalizer::ExpandOp_SCALAR_TO_VECTOR(SDNode *N) {
448 SmallVector<SDValue, 16> Ops(NumElts);
450 SDValue UndefVal = DAG.getUNDEF(Ops[0].getValueType());
456 SDValue DAGTypeLegalizer::ExpandOp_NormalStore(SDNode *N, unsigned OpNo) {
464 SDValue Chain = St->getChain();
465 SDValue Ptr = St->getBasePtr();
472 SDValue Lo, Hi;
501 SDValue &Lo, SDValue &Hi) {
501 SDValue &Lo, SDValue &Hi) {
502 SDValue Op = DisintegrateMERGE_VALUES(N, ResNo);
506 void DAGTypeLegalizer::SplitRes_SELECT(SDNode *N, SDValue &Lo, SDValue &Hi) {
506 void DAGTypeLegalizer::SplitRes_SELECT(SDNode *N, SDValue &Lo, SDValue &Hi) {
507 SDValue LL, LH, RL, RH, CL, CH;
512 SDValue Cond = N->getOperand(0);
515 if (SDValue Res = WidenVSELECTAndMask(N))
543 void DAGTypeLegalizer::SplitRes_SELECT_CC(SDNode *N, SDValue &Lo,
544 SDValue &Hi) {
545 SDValue LL, LH, RL, RH;
556 void DAGTypeLegalizer::SplitRes_UNDEF(SDNode *N, SDValue &Lo, SDValue &Hi) {
556 void DAGTypeLegalizer::SplitRes_UNDEF(SDNode *N, SDValue &Lo, SDValue &Hi) {
lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp 64 SmallDenseMap<SDValue, SDValue, 64> LegalizedNodes;
64 SmallDenseMap<SDValue, SDValue, 64> LegalizedNodes;
67 void AddLegalizedOperand(SDValue From, SDValue To) {
67 void AddLegalizedOperand(SDValue From, SDValue To) {
75 SDValue LegalizeOp(SDValue Op);
75 SDValue LegalizeOp(SDValue Op);
78 SDValue TranslateLegalizeResults(SDValue Op, SDValue Result);
78 SDValue TranslateLegalizeResults(SDValue Op, SDValue Result);
78 SDValue TranslateLegalizeResults(SDValue Op, SDValue Result);
81 SDValue UnrollVSETCC(SDValue Op);
81 SDValue UnrollVSETCC(SDValue Op);
87 SDValue Expand(SDValue Op);
87 SDValue Expand(SDValue Op);
91 SDValue ExpandFP_TO_UINT(SDValue Op);
91 SDValue ExpandFP_TO_UINT(SDValue Op);
95 SDValue ExpandUINT_TO_FLOAT(SDValue Op);
95 SDValue ExpandUINT_TO_FLOAT(SDValue Op);
98 SDValue ExpandSEXTINREG(SDValue Op);
98 SDValue ExpandSEXTINREG(SDValue Op);
105 SDValue ExpandANY_EXTEND_VECTOR_INREG(SDValue Op);
105 SDValue ExpandANY_EXTEND_VECTOR_INREG(SDValue Op);
112 SDValue ExpandSIGN_EXTEND_VECTOR_INREG(SDValue Op);
112 SDValue ExpandSIGN_EXTEND_VECTOR_INREG(SDValue Op);
118 SDValue ExpandZERO_EXTEND_VECTOR_INREG(SDValue Op);
118 SDValue ExpandZERO_EXTEND_VECTOR_INREG(SDValue Op);
124 SDValue ExpandABS(SDValue Op);
124 SDValue ExpandABS(SDValue Op);
127 SDValue ExpandBSWAP(SDValue Op);
127 SDValue ExpandBSWAP(SDValue Op);
131 SDValue ExpandVSELECT(SDValue Op);
131 SDValue ExpandVSELECT(SDValue Op);
132 SDValue ExpandSELECT(SDValue Op);
132 SDValue ExpandSELECT(SDValue Op);
133 SDValue ExpandLoad(SDValue Op);
133 SDValue ExpandLoad(SDValue Op);
134 SDValue ExpandStore(SDValue Op);
134 SDValue ExpandStore(SDValue Op);
135 SDValue ExpandFNEG(SDValue Op);
135 SDValue ExpandFNEG(SDValue Op);
136 SDValue ExpandFSUB(SDValue Op);
136 SDValue ExpandFSUB(SDValue Op);
137 SDValue ExpandBITREVERSE(SDValue Op);
137 SDValue ExpandBITREVERSE(SDValue Op);
138 SDValue ExpandCTPOP(SDValue Op);
138 SDValue ExpandCTPOP(SDValue Op);
139 SDValue ExpandCTLZ(SDValue Op);
139 SDValue ExpandCTLZ(SDValue Op);
140 SDValue ExpandCTTZ(SDValue Op);
140 SDValue ExpandCTTZ(SDValue Op);
141 SDValue ExpandFunnelShift(SDValue Op);
141 SDValue ExpandFunnelShift(SDValue Op);
142 SDValue ExpandROT(SDValue Op);
142 SDValue ExpandROT(SDValue Op);
143 SDValue ExpandFMINNUM_FMAXNUM(SDValue Op);
143 SDValue ExpandFMINNUM_FMAXNUM(SDValue Op);
144 SDValue ExpandUADDSUBO(SDValue Op);
144 SDValue ExpandUADDSUBO(SDValue Op);
145 SDValue ExpandSADDSUBO(SDValue Op);
145 SDValue ExpandSADDSUBO(SDValue Op);
146 SDValue ExpandMULO(SDValue Op);
146 SDValue ExpandMULO(SDValue Op);
147 SDValue ExpandAddSubSat(SDValue Op);
147 SDValue ExpandAddSubSat(SDValue Op);
148 SDValue ExpandFixedPointMul(SDValue Op);
148 SDValue ExpandFixedPointMul(SDValue Op);
149 SDValue ExpandStrictFPOp(SDValue Op);
149 SDValue ExpandStrictFPOp(SDValue Op);
155 SDValue Promote(SDValue Op);
155 SDValue Promote(SDValue Op);
160 SDValue PromoteINT_TO_FP(SDValue Op);
160 SDValue PromoteINT_TO_FP(SDValue Op);
166 SDValue PromoteFP_TO_INT(SDValue Op);
166 SDValue PromoteFP_TO_INT(SDValue Op);
210 SDValue OldRoot = DAG.getRoot();
222 SDValue VectorLegalizer::TranslateLegalizeResults(SDValue Op, SDValue Result) {
222 SDValue VectorLegalizer::TranslateLegalizeResults(SDValue Op, SDValue Result) {
222 SDValue VectorLegalizer::TranslateLegalizeResults(SDValue Op, SDValue Result) {
229 SDValue VectorLegalizer::LegalizeOp(SDValue Op) {
229 SDValue VectorLegalizer::LegalizeOp(SDValue Op) {
232 DenseMap<SDValue, SDValue>::iterator I = LegalizedNodes.find(Op);
232 DenseMap<SDValue, SDValue>::iterator I = LegalizedNodes.find(Op);
238 SmallVector<SDValue, 8> Ops;
239 for (const SDValue &Op : Node->op_values())
242 SDValue Result = SDValue(DAG.UpdateNodeOperands(Op.getNode(), Ops),
257 if (SDValue Lowered = TLI.LowerOperation(Result, DAG)) {
285 SDValue Lowered = TLI.LowerOperation(Result, DAG);
303 for (const SDValue &Op : Node->op_values())
496 if (SDValue Tmp1 = TLI.LowerOperation(Op, DAG)) {
520 SDValue VectorLegalizer::Promote(SDValue Op) {
520 SDValue VectorLegalizer::Promote(SDValue Op) {
544 SmallVector<SDValue, 4> Operands(Op.getNumOperands());
569 SDValue VectorLegalizer::PromoteINT_TO_FP(SDValue Op) {
569 SDValue VectorLegalizer::PromoteINT_TO_FP(SDValue Op) {
578 SmallVector<SDValue, 4> Operands(Op.getNumOperands());
596 SDValue VectorLegalizer::PromoteFP_TO_INT(SDValue Op) {
596 SDValue VectorLegalizer::PromoteFP_TO_INT(SDValue Op) {
610 SDValue Promoted = DAG.getNode(NewOpc, dl, NVT, Op.getOperand(0));
622 SDValue VectorLegalizer::ExpandLoad(SDValue Op) {
622 SDValue VectorLegalizer::ExpandLoad(SDValue Op) {
629 SDValue NewChain;
630 SDValue Value;
634 SmallVector<SDValue, 8> Vals;
635 SmallVector<SDValue, 8> LoadChains;
638 SDValue Chain = LD->getChain();
639 SDValue BasePTR = LD->getBasePtr();
658 SmallVector<SDValue, 8> LoadVals;
660 SDValue ScalarLoad;
697 SDValue SrcEltBitMask = DAG.getConstant(
703 SDValue ShAmt = DAG.getConstant(
705 SDValue Lo = DAG.getNode(ISD::SRL, dl, WideVT, LoadVals[WideIdx], ShAmt);
715 SDValue Hi =
746 SDValue Scalarized = TLI.scalarizeVectorLoad(LD, DAG);
763 SDValue VectorLegalizer::ExpandStore(SDValue Op) {
763 SDValue VectorLegalizer::ExpandStore(SDValue Op) {
765 SDValue TF = TLI.scalarizeVectorStore(ST, DAG);
770 SDValue VectorLegalizer::Expand(SDValue Op) {
770 SDValue VectorLegalizer::Expand(SDValue Op) {
887 SDValue VectorLegalizer::ExpandSELECT(SDValue Op) {
887 SDValue VectorLegalizer::ExpandSELECT(SDValue Op) {
894 SDValue Mask = Op.getOperand(0);
895 SDValue Op1 = Op.getOperand(1);
896 SDValue Op2 = Op.getOperand(2);
932 SDValue AllOnes = DAG.getConstant(
934 SDValue NotMask = DAG.getNode(ISD::XOR, DL, MaskTy, Mask, AllOnes);
938 SDValue Val = DAG.getNode(ISD::OR, DL, MaskTy, Op1, Op2);
942 SDValue VectorLegalizer::ExpandSEXTINREG(SDValue Op) {
942 SDValue VectorLegalizer::ExpandSEXTINREG(SDValue Op) {
955 SDValue ShiftSz = DAG.getConstant(BW - OrigBW, DL, VT);
964 SDValue VectorLegalizer::ExpandANY_EXTEND_VECTOR_INREG(SDValue Op) {
964 SDValue VectorLegalizer::ExpandANY_EXTEND_VECTOR_INREG(SDValue Op) {
968 SDValue Src = Op.getOperand(0);
1000 SDValue VectorLegalizer::ExpandSIGN_EXTEND_VECTOR_INREG(SDValue Op) {
1000 SDValue VectorLegalizer::ExpandSIGN_EXTEND_VECTOR_INREG(SDValue Op) {
1003 SDValue Src = Op.getOperand(0);
1015 SDValue ShiftAmount = DAG.getConstant(EltWidth - SrcEltWidth, DL, VT);
1024 SDValue VectorLegalizer::ExpandZERO_EXTEND_VECTOR_INREG(SDValue Op) {
1024 SDValue VectorLegalizer::ExpandZERO_EXTEND_VECTOR_INREG(SDValue Op) {
1028 SDValue Src = Op.getOperand(0);
1046 SDValue Zero = DAG.getConstant(0, DL, SrcVT);
1071 SDValue VectorLegalizer::ExpandBSWAP(SDValue Op) {
1071 SDValue VectorLegalizer::ExpandBSWAP(SDValue Op) {
1089 SDValue VectorLegalizer::ExpandBITREVERSE(SDValue Op) {
1089 SDValue VectorLegalizer::ExpandBITREVERSE(SDValue Op) {
1132 SDValue VectorLegalizer::ExpandVSELECT(SDValue Op) {
1132 SDValue VectorLegalizer::ExpandVSELECT(SDValue Op) {
1137 SDValue Mask = Op.getOperand(0);
1138 SDValue Op1 = Op.getOperand(1);
1139 SDValue Op2 = Op.getOperand(2);
1169 SDValue AllOnes = DAG.getConstant(
1171 SDValue NotMask = DAG.getNode(ISD::XOR, DL, VT, Mask, AllOnes);
1175 SDValue Val = DAG.getNode(ISD::OR, DL, VT, Op1, Op2);
1179 SDValue VectorLegalizer::ExpandABS(SDValue Op) {
1179 SDValue VectorLegalizer::ExpandABS(SDValue Op) {
1181 SDValue Result;
1189 SDValue VectorLegalizer::ExpandFP_TO_UINT(SDValue Op) {
1189 SDValue VectorLegalizer::ExpandFP_TO_UINT(SDValue Op) {
1191 SDValue Result, Chain;
1203 SDValue VectorLegalizer::ExpandUINT_TO_FLOAT(SDValue Op) {
1203 SDValue VectorLegalizer::ExpandUINT_TO_FLOAT(SDValue Op) {
1208 SDValue Result;
1221 SDValue HalfWord = DAG.getConstant(BW / 2, DL, VT);
1227 SDValue HalfWordMask = DAG.getConstant(HWMask, DL, VT);
1230 SDValue TWOHW = DAG.getConstantFP(1ULL << (BW / 2), DL, Op.getValueType());
1233 SDValue HI = DAG.getNode(ISD::SRL, DL, VT, Op.getOperand(0), HalfWord);
1234 SDValue LO = DAG.getNode(ISD::AND, DL, VT, Op.getOperand(0), HalfWordMask);
1239 SDValue fHI = DAG.getNode(ISD::SINT_TO_FP, DL, Op.getValueType(), HI);
1241 SDValue fLO = DAG.getNode(ISD::SINT_TO_FP, DL, Op.getValueType(), LO);
1247 SDValue VectorLegalizer::ExpandFNEG(SDValue Op) {
1247 SDValue VectorLegalizer::ExpandFNEG(SDValue Op) {
1250 SDValue Zero = DAG.getConstantFP(-0.0, DL, Op.getValueType());
1258 SDValue VectorLegalizer::ExpandFSUB(SDValue Op) {
1258 SDValue VectorLegalizer::ExpandFSUB(SDValue Op) {
1270 SDValue VectorLegalizer::ExpandCTPOP(SDValue Op) {
1270 SDValue VectorLegalizer::ExpandCTPOP(SDValue Op) {
1271 SDValue Result;
1278 SDValue VectorLegalizer::ExpandCTLZ(SDValue Op) {
1278 SDValue VectorLegalizer::ExpandCTLZ(SDValue Op) {
1279 SDValue Result;
1286 SDValue VectorLegalizer::ExpandCTTZ(SDValue Op) {
1286 SDValue VectorLegalizer::ExpandCTTZ(SDValue Op) {
1287 SDValue Result;
1294 SDValue VectorLegalizer::ExpandFunnelShift(SDValue Op) {
1294 SDValue VectorLegalizer::ExpandFunnelShift(SDValue Op) {
1295 SDValue Result;
1302 SDValue VectorLegalizer::ExpandROT(SDValue Op) {
1302 SDValue VectorLegalizer::ExpandROT(SDValue Op) {
1303 SDValue Result;
1310 SDValue VectorLegalizer::ExpandFMINNUM_FMAXNUM(SDValue Op) {
1310 SDValue VectorLegalizer::ExpandFMINNUM_FMAXNUM(SDValue Op) {
1311 if (SDValue Expanded = TLI.expandFMINNUM_FMAXNUM(Op.getNode(), DAG))
1316 SDValue VectorLegalizer::ExpandUADDSUBO(SDValue Op) {
1316 SDValue VectorLegalizer::ExpandUADDSUBO(SDValue Op) {
1317 SDValue Result, Overflow;
1329 SDValue VectorLegalizer::ExpandSADDSUBO(SDValue Op) {
1329 SDValue VectorLegalizer::ExpandSADDSUBO(SDValue Op) {
1330 SDValue Result, Overflow;
1342 SDValue VectorLegalizer::ExpandMULO(SDValue Op) {
1342 SDValue VectorLegalizer::ExpandMULO(SDValue Op) {
1343 SDValue Result, Overflow;
1356 SDValue VectorLegalizer::ExpandAddSubSat(SDValue Op) {
1356 SDValue VectorLegalizer::ExpandAddSubSat(SDValue Op) {
1357 if (SDValue Expanded = TLI.expandAddSubSat(Op.getNode(), DAG))
1362 SDValue VectorLegalizer::ExpandFixedPointMul(SDValue Op) {
1362 SDValue VectorLegalizer::ExpandFixedPointMul(SDValue Op) {
1363 if (SDValue Expanded = TLI.expandFixedPointMul(Op.getNode(), DAG))
1368 SDValue VectorLegalizer::ExpandStrictFPOp(SDValue Op) {
1368 SDValue VectorLegalizer::ExpandStrictFPOp(SDValue Op) {
1375 SDValue Chain = Op.getOperand(0);
1378 SmallVector<SDValue, 32> OpValues;
1379 SmallVector<SDValue, 32> OpChains;
1381 SmallVector<SDValue, 4> Opers;
1382 SDValue Idx = DAG.getConstant(i, dl,
1390 SDValue Oper = Op.getOperand(j);
1400 SDValue ScalarOp = DAG.getNode(Op->getOpcode(), dl, ValueVTs, Opers);
1406 SDValue Result = DAG.getBuildVector(VT, dl, OpValues);
1407 SDValue NewChain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, OpChains);
1415 SDValue VectorLegalizer::UnrollVSETCC(SDValue Op) {
1415 SDValue VectorLegalizer::UnrollVSETCC(SDValue Op) {
1419 SDValue LHS = Op.getOperand(0), RHS = Op.getOperand(1), CC = Op.getOperand(2);
1422 SmallVector<SDValue, 8> Ops(NumElems);
1424 SDValue LHSElem = DAG.getNode(
1427 SDValue RHSElem = DAG.getNode(
lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp 37 SDValue R = SDValue();
199 SDValue DAGTypeLegalizer::ScalarizeVecRes_BinOp(SDNode *N) {
200 SDValue LHS = GetScalarizedVector(N->getOperand(0));
201 SDValue RHS = GetScalarizedVector(N->getOperand(1));
206 SDValue DAGTypeLegalizer::ScalarizeVecRes_TernaryOp(SDNode *N) {
207 SDValue Op0 = GetScalarizedVector(N->getOperand(0));
208 SDValue Op1 = GetScalarizedVector(N->getOperand(1));
209 SDValue Op2 = GetScalarizedVector(N->getOperand(2));
214 SDValue DAGTypeLegalizer::ScalarizeVecRes_MULFIX(SDNode *N) {
215 SDValue Op0 = GetScalarizedVector(N->getOperand(0));
216 SDValue Op1 = GetScalarizedVector(N->getOperand(1));
217 SDValue Op2 = N->getOperand(2);
222 SDValue DAGTypeLegalizer::ScalarizeVecRes_StrictFPOp(SDNode *N) {
225 SDValue Chain = N->getOperand(0);
229 SmallVector<SDValue, 4> Opers;
236 SDValue Oper = N->getOperand(i);
244 SDValue Result = DAG.getNode(N->getOpcode(), dl, ValueVTs, Opers);
252 SDValue DAGTypeLegalizer::ScalarizeVecRes_OverflowOp(SDNode *N,
258 SDValue ScalarLHS, ScalarRHS;
263 SmallVector<SDValue, 1> ElemsLHS, ElemsRHS;
281 SDValue OtherVal = DAG.getNode(
289 SDValue DAGTypeLegalizer::ScalarizeVecRes_MERGE_VALUES(SDNode *N,
291 SDValue Op = DisintegrateMERGE_VALUES(N, ResNo);
295 SDValue DAGTypeLegalizer::ScalarizeVecRes_BITCAST(SDNode *N) {
296 SDValue Op = N->getOperand(0);
306 SDValue DAGTypeLegalizer::ScalarizeVecRes_BUILD_VECTOR(SDNode *N) {
308 SDValue InOp = N->getOperand(0);
316 SDValue DAGTypeLegalizer::ScalarizeVecRes_EXTRACT_SUBVECTOR(SDNode *N) {
322 SDValue DAGTypeLegalizer::ScalarizeVecRes_FP_ROUND(SDNode *N) {
324 SDValue Op = GetScalarizedVector(N->getOperand(0));
329 SDValue DAGTypeLegalizer::ScalarizeVecRes_STRICT_FP_ROUND(SDNode *N) {
331 SDValue Op = GetScalarizedVector(N->getOperand(1));
332 SDValue Res = DAG.getNode(ISD::STRICT_FP_ROUND, SDLoc(N),
341 SDValue DAGTypeLegalizer::ScalarizeVecRes_FPOWI(SDNode *N) {
342 SDValue Op = GetScalarizedVector(N->getOperand(0));
347 SDValue DAGTypeLegalizer::ScalarizeVecRes_INSERT_VECTOR_ELT(SDNode *N) {
350 SDValue Op = N->getOperand(1);
358 SDValue DAGTypeLegalizer::ScalarizeVecRes_LOAD(LoadSDNode *N) {
361 SDValue Result = DAG.getLoad(
375 SDValue DAGTypeLegalizer::ScalarizeVecRes_UnaryOp(SDNode *N) {
378 SDValue Op = N->getOperand(0);
399 SDValue DAGTypeLegalizer::ScalarizeVecRes_InregOp(SDNode *N) {
402 SDValue LHS = GetScalarizedVector(N->getOperand(0));
407 SDValue DAGTypeLegalizer::ScalarizeVecRes_VecInregOp(SDNode *N) {
409 SDValue Op = N->getOperand(0);
435 SDValue DAGTypeLegalizer::ScalarizeVecRes_SCALAR_TO_VECTOR(SDNode *N) {
439 SDValue InOp = N->getOperand(0);
445 SDValue DAGTypeLegalizer::ScalarizeVecRes_VSELECT(SDNode *N) {
446 SDValue Cond = N->getOperand(0);
461 SDValue LHS = GetScalarizedVector(N->getOperand(1));
514 SDValue DAGTypeLegalizer::ScalarizeVecRes_SELECT(SDNode *N) {
515 SDValue LHS = GetScalarizedVector(N->getOperand(1));
521 SDValue DAGTypeLegalizer::ScalarizeVecRes_SELECT_CC(SDNode *N) {
522 SDValue LHS = GetScalarizedVector(N->getOperand(2));
529 SDValue DAGTypeLegalizer::ScalarizeVecRes_UNDEF(SDNode *N) {
533 SDValue DAGTypeLegalizer::ScalarizeVecRes_VECTOR_SHUFFLE(SDNode *N) {
535 SDValue Arg = N->getOperand(2).getOperand(0);
542 SDValue DAGTypeLegalizer::ScalarizeVecRes_SETCC(SDNode *N) {
546 SDValue LHS = N->getOperand(0);
547 SDValue RHS = N->getOperand(1);
567 SDValue Res = DAG.getNode(ISD::SETCC, DL, MVT::i1, LHS, RHS,
584 SDValue Res = SDValue();
669 SDValue DAGTypeLegalizer::ScalarizeVecOp_BITCAST(SDNode *N) {
670 SDValue Elt = GetScalarizedVector(N->getOperand(0));
677 SDValue DAGTypeLegalizer::ScalarizeVecOp_UnaryOp(SDNode *N) {
680 SDValue Elt = GetScalarizedVector(N->getOperand(0));
681 SDValue Op = DAG.getNode(N->getOpcode(), SDLoc(N),
690 SDValue DAGTypeLegalizer::ScalarizeVecOp_UnaryOp_StrictFP(SDNode *N) {
693 SDValue Elt = GetScalarizedVector(N->getOperand(1));
694 SDValue Res = DAG.getNode(N->getOpcode(), SDLoc(N),
706 SDValue DAGTypeLegalizer::ScalarizeVecOp_CONCAT_VECTORS(SDNode *N) {
707 SmallVector<SDValue, 8> Ops(N->getNumOperands());
715 SDValue DAGTypeLegalizer::ScalarizeVecOp_EXTRACT_VECTOR_ELT(SDNode *N) {
717 SDValue Res = GetScalarizedVector(N->getOperand(0));
728 SDValue DAGTypeLegalizer::ScalarizeVecOp_VSELECT(SDNode *N) {
729 SDValue ScalarCond = GetScalarizedVector(N->getOperand(0));
739 SDValue DAGTypeLegalizer::ScalarizeVecOp_VSETCC(SDNode *N) {
746 SDValue LHS = GetScalarizedVector(N->getOperand(0));
747 SDValue RHS = GetScalarizedVector(N->getOperand(1));
753 SDValue Res = DAG.getNode(ISD::SETCC, DL, MVT::i1, LHS, RHS,
768 SDValue DAGTypeLegalizer::ScalarizeVecOp_STORE(StoreSDNode *N, unsigned OpNo){
788 SDValue DAGTypeLegalizer::ScalarizeVecOp_FP_ROUND(SDNode *N, unsigned OpNo) {
789 SDValue Elt = GetScalarizedVector(N->getOperand(0));
790 SDValue Res = DAG.getNode(ISD::FP_ROUND, SDLoc(N),
796 SDValue DAGTypeLegalizer::ScalarizeVecOp_STRICT_FP_ROUND(SDNode *N,
799 SDValue Elt = GetScalarizedVector(N->getOperand(1));
800 SDValue Res = DAG.getNode(ISD::STRICT_FP_ROUND, SDLoc(N),
810 SDValue DAGTypeLegalizer::ScalarizeVecOp_VECREDUCE(SDNode *N) {
811 SDValue Res = GetScalarizedVector(N->getOperand(0));
828 SDValue Lo, Hi;
1014 void DAGTypeLegalizer::SplitVecRes_BinOp(SDNode *N, SDValue &Lo,
1015 SDValue &Hi) {
1016 SDValue LHSLo, LHSHi;
1018 SDValue RHSLo, RHSHi;
1028 void DAGTypeLegalizer::SplitVecRes_TernaryOp(SDNode *N, SDValue &Lo,
1029 SDValue &Hi) {
1030 SDValue Op0Lo, Op0Hi;
1032 SDValue Op1Lo, Op1Hi;
1034 SDValue Op2Lo, Op2Hi;
1044 void DAGTypeLegalizer::SplitVecRes_MULFIX(SDNode *N, SDValue &Lo, SDValue &Hi) {
1044 void DAGTypeLegalizer::SplitVecRes_MULFIX(SDNode *N, SDValue &Lo, SDValue &Hi) {
1045 SDValue LHSLo, LHSHi;
1047 SDValue RHSLo, RHSHi;
1050 SDValue Op2 = N->getOperand(2);
1057 void DAGTypeLegalizer::SplitVecRes_BITCAST(SDNode *N, SDValue &Lo,
1058 SDValue &Hi) {
1065 SDValue InOp = N->getOperand(0);
1114 void DAGTypeLegalizer::SplitVecRes_BUILD_VECTOR(SDNode *N, SDValue &Lo,
1115 SDValue &Hi) {
1120 SmallVector<SDValue, 8> LoOps(N->op_begin(), N->op_begin()+LoNumElts);
1123 SmallVector<SDValue, 8> HiOps(N->op_begin()+LoNumElts, N->op_end());
1127 void DAGTypeLegalizer::SplitVecRes_CONCAT_VECTORS(SDNode *N, SDValue &Lo,
1128 SDValue &Hi) {
1141 SmallVector<SDValue, 8> LoOps(N->op_begin(), N->op_begin()+NumSubvectors);
1144 SmallVector<SDValue, 8> HiOps(N->op_begin()+NumSubvectors, N->op_end());
1148 void DAGTypeLegalizer::SplitVecRes_EXTRACT_SUBVECTOR(SDNode *N, SDValue &Lo,
1149 SDValue &Hi) {
1150 SDValue Vec = N->getOperand(0);
1151 SDValue Idx = N->getOperand(1);
1164 void DAGTypeLegalizer::SplitVecRes_INSERT_SUBVECTOR(SDNode *N, SDValue &Lo,
1165 SDValue &Hi) {
1166 SDValue Vec = N->getOperand(0);
1167 SDValue SubVec = N->getOperand(1);
1168 SDValue Idx = N->getOperand(2);
1193 SDValue StackPtr = DAG.CreateStackTemporary(VecVT);
1194 SDValue Store =
1198 SDValue SubVecPtr = TLI.getVectorElementPointer(DAG, StackPtr, VecVT, Idx);
1218 void DAGTypeLegalizer::SplitVecRes_FPOWI(SDNode *N, SDValue &Lo,
1219 SDValue &Hi) {
1226 void DAGTypeLegalizer::SplitVecRes_FCOPYSIGN(SDNode *N, SDValue &Lo,
1227 SDValue &Hi) {
1228 SDValue LHSLo, LHSHi;
1232 SDValue RHSLo, RHSHi;
1233 SDValue RHS = N->getOperand(1);
1245 void DAGTypeLegalizer::SplitVecRes_InregOp(SDNode *N, SDValue &Lo,
1246 SDValue &Hi) {
1247 SDValue LHSLo, LHSHi;
1261 void DAGTypeLegalizer::SplitVecRes_ExtVecInRegOp(SDNode *N, SDValue &Lo,
1262 SDValue &Hi) {
1264 SDValue N0 = N->getOperand(0);
1267 SDValue InLo, InHi;
1299 void DAGTypeLegalizer::SplitVecRes_StrictFPOp(SDNode *N, SDValue &Lo,
1300 SDValue &Hi) {
1302 SDValue Chain = N->getOperand(0);
1307 SmallVector<SDValue, 4> OpsLo;
1308 SmallVector<SDValue, 4> OpsHi;
1316 SDValue Op = N->getOperand(i);
1317 SDValue OpLo = Op;
1318 SDValue OpHi = Op;
1349 SDValue DAGTypeLegalizer::UnrollVectorOp_StrictFP(SDNode *N, unsigned ResNE) {
1350 SDValue Chain = N->getOperand(0);
1356 SmallVector<SDValue, 8> Scalars;
1357 SmallVector<SDValue, 4> Operands(N->getNumOperands());
1367 SmallVector<SDValue, 8> Chains;
1373 SDValue Operand = N->getOperand(j);
1385 SDValue Scalar = DAG.getNode(N->getOpcode(), dl, ChainVTs, Operands);
1407 SDValue &Lo, SDValue &Hi) {
1407 SDValue &Lo, SDValue &Hi) {
1415 SDValue LoLHS, HiLHS, LoRHS, HiRHS;
1440 SDValue OtherVal = DAG.getNode(
1447 void DAGTypeLegalizer::SplitVecRes_INSERT_VECTOR_ELT(SDNode *N, SDValue &Lo,
1448 SDValue &Hi) {
1449 SDValue Vec = N->getOperand(0);
1450 SDValue Elt = N->getOperand(1);
1451 SDValue Idx = N->getOperand(2);
1487 SDValue StackPtr = DAG.CreateStackTemporary(VecVT);
1491 SDValue Store = DAG.getStore(DAG.getEntryNode(), dl, Vec, StackPtr, PtrInfo);
1495 SDValue EltPtr = TLI.getVectorElementPointer(DAG, StackPtr, VecVT, Idx);
1526 void DAGTypeLegalizer::SplitVecRes_SCALAR_TO_VECTOR(SDNode *N, SDValue &Lo,
1527 SDValue &Hi) {
1535 void DAGTypeLegalizer::SplitVecRes_LOAD(LoadSDNode *LD, SDValue &Lo,
1536 SDValue &Hi) {
1543 SDValue Ch = LD->getChain();
1544 SDValue Ptr = LD->getBasePtr();
1545 SDValue Offset = DAG.getUNDEF(Ptr.getValueType());
1574 SDValue &Lo, SDValue &Hi) {
1574 SDValue &Lo, SDValue &Hi) {
1579 SDValue Ch = MLD->getChain();
1580 SDValue Ptr = MLD->getBasePtr();
1581 SDValue Mask = MLD->getMask();
1582 SDValue PassThru = MLD->getPassThru();
1587 SDValue MaskLo, MaskHi;
1601 SDValue PassThruLo, PassThruHi;
1639 SDValue &Lo, SDValue &Hi) {
1639 SDValue &Lo, SDValue &Hi) {
1644 SDValue Ch = MGT->getChain();
1645 SDValue Ptr = MGT->getBasePtr();
1646 SDValue Mask = MGT->getMask();
1647 SDValue PassThru = MGT->getPassThru();
1648 SDValue Index = MGT->getIndex();
1649 SDValue Scale = MGT->getScale();
1653 SDValue MaskLo, MaskHi;
1668 SDValue PassThruLo, PassThruHi;
1674 SDValue IndexHi, IndexLo;
1685 SDValue OpsLo[] = {Ch, PassThruLo, MaskLo, Ptr, IndexLo, Scale};
1689 SDValue OpsHi[] = {Ch, PassThruHi, MaskHi, Ptr, IndexHi, Scale};
1704 void DAGTypeLegalizer::SplitVecRes_SETCC(SDNode *N, SDValue &Lo, SDValue &Hi) {
1704 void DAGTypeLegalizer::SplitVecRes_SETCC(SDNode *N, SDValue &Lo, SDValue &Hi) {
1714 SDValue LL, LH, RL, RH;
1731 void DAGTypeLegalizer::SplitVecRes_UnaryOp(SDNode *N, SDValue &Lo,
1732 SDValue &Hi) {
1755 SDValue NewChain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
1765 SDValue NewChain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
1774 void DAGTypeLegalizer::SplitVecRes_ExtendOp(SDNode *N, SDValue &Lo,
1775 SDValue &Hi) {
1809 SDValue NewSrc =
1824 SDValue &Lo, SDValue &Hi) {
1824 SDValue &Lo, SDValue &Hi) {
1826 SDValue Inputs[4];
1838 SDValue &Output = High ? Hi : Lo;
1889 SmallVector<SDValue, 16> SVOps;
1920 SDValue Op0 = Inputs[InputUsed[0]];
1922 SDValue Op1 = InputUsed[1] == -1U ?
1932 void DAGTypeLegalizer::SplitVecRes_VAARG(SDNode *N, SDValue &Lo, SDValue &Hi) {
1932 void DAGTypeLegalizer::SplitVecRes_VAARG(SDNode *N, SDValue &Lo, SDValue &Hi) {
1935 SDValue Chain = N->getOperand(0);
1936 SDValue Ptr = N->getOperand(1);
1937 SDValue SV = N->getOperand(2);
1963 SDValue Res = SDValue();
2073 SDValue DAGTypeLegalizer::SplitVecOp_VSELECT(SDNode *N, unsigned OpNo) {
2078 SDValue Mask = N->getOperand(0);
2079 SDValue Src0 = N->getOperand(1);
2080 SDValue Src1 = N->getOperand(2);
2085 SDValue Lo, Hi;
2094 SDValue LoOp0, HiOp0, LoOp1, HiOp1, LoMask, HiMask;
2099 SDValue LoSelect =
2101 SDValue HiSelect =
2107 SDValue DAGTypeLegalizer::SplitVecOp_VECREDUCE(SDNode *N, unsigned OpNo) {
2109 SDValue Lo, Hi;
2112 SDValue VecOp = N->getOperand(OpNo);
2145 SDValue Partial = DAG.getNode(CombineOpc, dl, LoOpVT, Lo, Hi, N->getFlags());
2149 SDValue DAGTypeLegalizer::SplitVecOp_UnaryOp(SDNode *N) {
2152 SDValue Lo, Hi;
2168 SDValue Ch = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Lo.getValue(1),
2182 SDValue DAGTypeLegalizer::SplitVecOp_BITCAST(SDNode *N) {
2186 SDValue Lo, Hi;
2198 SDValue DAGTypeLegalizer::SplitVecOp_EXTRACT_SUBVECTOR(SDNode *N) {
2201 SDValue Idx = N->getOperand(1);
2203 SDValue Lo, Hi;
2220 SDValue DAGTypeLegalizer::SplitVecOp_EXTRACT_VECTOR_ELT(SDNode *N) {
2221 SDValue Vec = N->getOperand(0);
2222 SDValue Idx = N->getOperand(1);
2228 SDValue Lo, Hi;
2255 SDValue StackPtr = DAG.CreateStackTemporary(VecVT);
2259 SDValue Store = DAG.getStore(DAG.getEntryNode(), dl, Vec, StackPtr, PtrInfo);
2267 SDValue Load = DAG.getLoad(EltVT, dl, Store, StackPtr,
2277 SDValue DAGTypeLegalizer::SplitVecOp_ExtVecInRegOp(SDNode *N) {
2278 SDValue Lo, Hi;
2287 SDValue DAGTypeLegalizer::SplitVecOp_MGATHER(MaskedGatherSDNode *MGT,
2293 SDValue Ch = MGT->getChain();
2294 SDValue Ptr = MGT->getBasePtr();
2295 SDValue Index = MGT->getIndex();
2296 SDValue Scale = MGT->getScale();
2297 SDValue Mask = MGT->getMask();
2298 SDValue PassThru = MGT->getPassThru();
2301 SDValue MaskLo, MaskHi;
2312 SDValue PassThruLo, PassThruHi;
2318 SDValue IndexHi, IndexLo;
2329 SDValue OpsLo[] = {Ch, PassThruLo, MaskLo, Ptr, IndexLo, Scale};
2330 SDValue Lo = DAG.getMaskedGather(DAG.getVTList(LoVT, MVT::Other), LoVT, dl,
2339 SDValue OpsHi[] = {Ch, PassThruHi, MaskHi, Ptr, IndexHi, Scale};
2340 SDValue Hi = DAG.getMaskedGather(DAG.getVTList(HiVT, MVT::Other), HiVT, dl,
2352 SDValue Res = DAG.getNode(ISD::CONCAT_VECTORS, dl, MGT->getValueType(0), Lo,
2358 SDValue DAGTypeLegalizer::SplitVecOp_MSTORE(MaskedStoreSDNode *N,
2360 SDValue Ch = N->getChain();
2361 SDValue Ptr = N->getBasePtr();
2362 SDValue Mask = N->getMask();
2363 SDValue Data = N->getValue();
2371 SDValue DataLo, DataHi;
2379 SDValue MaskLo, MaskHi;
2389 SDValue Lo, Hi;
2416 SDValue DAGTypeLegalizer::SplitVecOp_MSCATTER(MaskedScatterSDNode *N,
2418 SDValue Ch = N->getChain();
2419 SDValue Ptr = N->getBasePtr();
2420 SDValue Mask = N->getMask();
2421 SDValue Index = N->getIndex();
2422 SDValue Scale = N->getScale();
2423 SDValue Data = N->getValue();
2432 SDValue DataLo, DataHi;
2440 SDValue MaskLo, MaskHi;
2450 SDValue IndexHi, IndexLo;
2456 SDValue Lo;
2462 SDValue OpsLo[] = {Ch, DataLo, MaskLo, Ptr, IndexLo, Scale};
2474 SDValue OpsHi[] = {Lo, DataHi, MaskHi, Ptr, IndexHi, Scale};
2479 SDValue DAGTypeLegalizer::SplitVecOp_STORE(StoreSDNode *N, unsigned OpNo) {
2485 SDValue Ch = N->getChain();
2486 SDValue Ptr = N->getBasePtr();
2491 SDValue Lo, Hi;
2525 SDValue DAGTypeLegalizer::SplitVecOp_CONCAT_VECTORS(SDNode *N) {
2533 SmallVector<SDValue, 32> Elts;
2535 for (const SDValue &Op : N->op_values()) {
2547 SDValue DAGTypeLegalizer::SplitVecOp_TruncateHelper(SDNode *N) {
2565 SDValue InVec = N->getOperand(0);
2600 SDValue InLoVec, InHiVec;
2609 SDValue HalfLo = DAG.getNode(N->getOpcode(), DL, HalfVT, InLoVec);
2610 SDValue HalfHi = DAG.getNode(N->getOpcode(), DL, HalfVT, InHiVec);
2613 SDValue InterVec = DAG.getNode(ISD::CONCAT_VECTORS, DL, InterVT, HalfLo,
2626 SDValue DAGTypeLegalizer::SplitVecOp_VSETCC(SDNode *N) {
2631 SDValue Lo0, Hi0, Lo1, Hi1, LoRes, HiRes;
2641 SDValue Con = DAG.getNode(ISD::CONCAT_VECTORS, DL, WideResVT, LoRes, HiRes);
2650 SDValue DAGTypeLegalizer::SplitVecOp_FP_ROUND(SDNode *N) {
2653 SDValue Lo, Hi;
2668 SDValue NewChain = DAG.getNode(ISD::TokenFactor, DL, MVT::Other,
2679 SDValue DAGTypeLegalizer::SplitVecOp_FCOPYSIGN(SDNode *N) {
2698 SDValue Res = SDValue();
2907 SDValue DAGTypeLegalizer::WidenVecRes_Ternary(SDNode *N) {
2911 SDValue InOp1 = GetWidenedVector(N->getOperand(0));
2912 SDValue InOp2 = GetWidenedVector(N->getOperand(1));
2913 SDValue InOp3 = GetWidenedVector(N->getOperand(2));
2917 SDValue DAGTypeLegalizer::WidenVecRes_Binary(SDNode *N) {
2921 SDValue InOp1 = GetWidenedVector(N->getOperand(0));
2922 SDValue InOp2 = GetWidenedVector(N->getOperand(1));
2926 SDValue DAGTypeLegalizer::WidenVecRes_BinaryWithExtraScalarOp(SDNode *N) {
2930 SDValue InOp1 = GetWidenedVector(N->getOperand(0));
2931 SDValue InOp2 = GetWidenedVector(N->getOperand(1));
2932 SDValue InOp3 = N->getOperand(2);
2940 static SDValue CollectOpsToWiden(SelectionDAG &DAG, const TargetLowering &TLI,
2941 SmallVectorImpl<SDValue> &ConcatOps,
2973 SDValue VecOp = DAG.getUNDEF(NextVT);
2984 SDValue undefVec = DAG.getUNDEF(VT);
2986 SmallVector<SDValue, 16> SubConcatOps(OpsToConcat);
3010 SDValue UndefVal = DAG.getUNDEF(MaxVT);
3018 SDValue DAGTypeLegalizer::WidenVecRes_BinaryCanTrap(SDNode *N) {
3034 SDValue InOp1 = GetWidenedVector(N->getOperand(0));
3035 SDValue InOp2 = GetWidenedVector(N->getOperand(1));
3045 SDValue InOp1 = GetWidenedVector(N->getOperand(0));
3046 SDValue InOp2 = GetWidenedVector(N->getOperand(1));
3049 SmallVector<SDValue, 16> ConcatOps(CurNumElts);
3060 SDValue EOp1 = DAG.getNode(
3063 SDValue EOp2 = DAG.getNode(
3077 SDValue EOp1 = DAG.getNode(
3080 SDValue EOp2 = DAG.getNode(
3093 SDValue DAGTypeLegalizer::WidenVecRes_StrictFP(SDNode *N) {
3113 SmallVector<SDValue, 4> InOps;
3116 SmallVector<SDValue, 16> ConcatOps(CurNumElts);
3117 SmallVector<SDValue, 16> Chains;
3126 SDValue Oper = N->getOperand(i);
3144 SmallVector<SDValue, 4> EOps;
3147 SDValue Op = InOps[i];
3158 SDValue Oper = DAG.getNode(Opcode, dl, OperVT, EOps);
3171 SmallVector<SDValue, 4> EOps;
3174 SDValue Op = InOps[i];
3186 SDValue Oper = DAG.getNode(Opcode, dl, WidenVT, EOps);
3195 SDValue NewChain;
3205 SDValue DAGTypeLegalizer::WidenVecRes_OverflowOp(SDNode *N, unsigned ResNo) {
3210 SDValue WideLHS, WideRHS;
3227 SDValue Zero = DAG.getConstant(
3247 SDValue Zero = DAG.getConstant(
3249 SDValue OtherVal = DAG.getNode(
3257 SDValue DAGTypeLegalizer::WidenVecRes_Convert(SDNode *N) {
3258 SDValue InOp = N->getOperand(0);
3302 SmallVector<SDValue, 16> Ops(NumConcat, DAG.getUNDEF(InVT));
3304 SDValue InVec = DAG.getNode(ISD::CONCAT_VECTORS, DL, InWidenVT, Ops);
3311 SDValue InVal = DAG.getNode(
3323 SmallVector<SDValue, 16> Ops(WidenNumElts, DAG.getUNDEF(EltVT));
3328 SDValue Val = DAG.getNode(
3340 SDValue DAGTypeLegalizer::WidenVecRes_Convert_StrictFP(SDNode *N) {
3341 SDValue InOp = N->getOperand(1);
3343 SmallVector<SDValue, 4> NewOps(N->op_begin(), N->op_end());
3359 SmallVector<SDValue, 16> Ops(WidenNumElts, DAG.getUNDEF(EltVT));
3360 SmallVector<SDValue, 32> OpChains;
3371 SDValue NewChain = DAG.getNode(ISD::TokenFactor, DL, MVT::Other, OpChains);
3377 SDValue DAGTypeLegalizer::WidenVecRes_EXTEND_VECTOR_INREG(SDNode *N) {
3379 SDValue InOp = N->getOperand(0);
3404 SmallVector<SDValue, 16> Ops;
3406 SDValue Val = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, InSVT, InOp,
3430 SDValue DAGTypeLegalizer::WidenVecRes_FCOPYSIGN(SDNode *N) {
3441 SDValue DAGTypeLegalizer::WidenVecRes_POWI(SDNode *N) {
3443 SDValue InOp = GetWidenedVector(N->getOperand(0));
3444 SDValue ShOp = N->getOperand(1);
3448 SDValue DAGTypeLegalizer::WidenVecRes_Shift(SDNode *N) {
3450 SDValue InOp = GetWidenedVector(N->getOperand(0));
3451 SDValue ShOp = N->getOperand(1);
3467 SDValue DAGTypeLegalizer::WidenVecRes_Unary(SDNode *N) {
3470 SDValue InOp = GetWidenedVector(N->getOperand(0));
3474 SDValue DAGTypeLegalizer::WidenVecRes_InregOp(SDNode *N) {
3480 SDValue WidenLHS = GetWidenedVector(N->getOperand(0));
3485 SDValue DAGTypeLegalizer::WidenVecRes_MERGE_VALUES(SDNode *N, unsigned ResNo) {
3486 SDValue WidenVec = DisintegrateMERGE_VALUES(N, ResNo);
3490 SDValue DAGTypeLegalizer::WidenVecRes_BITCAST(SDNode *N) {
3491 SDValue InOp = N->getOperand(0);
3550 SDValue NewVec;
3557 SmallVector<SDValue, 16> Ops(NewNumElts, DAG.getUNDEF(InVT));
3571 SDValue DAGTypeLegalizer::WidenVecRes_BUILD_VECTOR(SDNode *N) {
3584 SmallVector<SDValue, 16> NewOps(N->op_begin(), N->op_end());
3591 SDValue DAGTypeLegalizer::WidenVecRes_CONCAT_VECTORS(SDNode *N) {
3605 SDValue UndefVal = DAG.getUNDEF(InVT);
3606 SmallVector<SDValue, 16> Ops(NumConcat);
3644 SmallVector<SDValue, 16> Ops(WidenNumElts);
3647 SDValue InOp = N->getOperand(i);
3655 SDValue UndefVal = DAG.getUNDEF(EltVT);
3661 SDValue DAGTypeLegalizer::WidenVecRes_EXTRACT_SUBVECTOR(SDNode *N) {
3665 SDValue InOp = N->getOperand(0);
3666 SDValue Idx = N->getOperand(1);
3686 SmallVector<SDValue, 16> Ops(WidenNumElts);
3696 SDValue UndefVal = DAG.getUNDEF(EltVT);
3702 SDValue DAGTypeLegalizer::WidenVecRes_INSERT_VECTOR_ELT(SDNode *N) {
3703 SDValue InOp = GetWidenedVector(N->getOperand(0));
3709 SDValue DAGTypeLegalizer::WidenVecRes_LOAD(SDNode *N) {
3713 SDValue Result;
3714 SmallVector<SDValue, 16> LdChain; // Chain for the series of load
3723 SDValue NewChain;
3736 SDValue DAGTypeLegalizer::WidenVecRes_MLOAD(MaskedLoadSDNode *N) {
3739 SDValue Mask = N->getMask();
3741 SDValue PassThru = GetWidenedVector(N->getPassThru());
3751 SDValue Res = DAG.getMaskedLoad(WidenVT, dl, N->getChain(), N->getBasePtr(),
3761 SDValue DAGTypeLegalizer::WidenVecRes_MGATHER(MaskedGatherSDNode *N) {
3764 SDValue Mask = N->getMask();
3766 SDValue PassThru = GetWidenedVector(N->getPassThru());
3767 SDValue Scale = N->getScale();
3778 SDValue Index = N->getIndex();
3783 SDValue Ops[] = { N->getChain(), PassThru, Mask, N->getBasePtr(), Index,
3785 SDValue Res = DAG.getMaskedGather(DAG.getVTList(WideVT, MVT::Other),
3795 SDValue DAGTypeLegalizer::WidenVecRes_SCALAR_TO_VECTOR(SDNode *N) {
3815 static inline bool isSETCCorConvertedSETCC(SDValue N) {
3841 SDValue DAGTypeLegalizer::convertMask(SDValue InMask, EVT MaskVT,
3841 SDValue DAGTypeLegalizer::convertMask(SDValue InMask, EVT MaskVT,
3849 SmallVector<SDValue, 4> Ops;
3852 SDValue Mask = DAG.getNode(InMask->getOpcode(), SDLoc(InMask), MaskVT, Ops);
3877 SDValue ZeroIdx = DAG.getConstant(0, SDLoc(Mask), IdxTy);
3883 SmallVector<SDValue, 16> SubOps(NumSubVecs, DAG.getUNDEF(SubVT));
3898 SDValue DAGTypeLegalizer::WidenVSELECTAndMask(SDNode *N) {
3900 SDValue Cond = N->getOperand(0);
3946 SDValue VSelOp1 = N->getOperand(1);
3947 SDValue VSelOp2 = N->getOperand(2);
3959 SDValue Mask;
3967 SDValue SETCC0 = Cond->getOperand(0);
3968 SDValue SETCC1 = Cond->getOperand(1);
4004 SDValue DAGTypeLegalizer::WidenVecRes_SELECT(SDNode *N) {
4008 SDValue Cond1 = N->getOperand(0);
4011 if (SDValue Res = WidenVSELECTAndMask(N))
4026 SDValue SplitSelect = SplitVecOp_VSELECT(N, 0);
4027 SDValue Res = ModifyToType(SplitSelect, WidenVT);
4035 SDValue InOp1 = GetWidenedVector(N->getOperand(1));
4036 SDValue InOp2 = GetWidenedVector(N->getOperand(2));
4042 SDValue DAGTypeLegalizer::WidenVecRes_SELECT_CC(SDNode *N) {
4043 SDValue InOp1 = GetWidenedVector(N->getOperand(2));
4044 SDValue InOp2 = GetWidenedVector(N->getOperand(3));
4050 SDValue DAGTypeLegalizer::WidenVecRes_UNDEF(SDNode *N) {
4055 SDValue DAGTypeLegalizer::WidenVecRes_VECTOR_SHUFFLE(ShuffleVectorSDNode *N) {
4063 SDValue InOp1 = GetWidenedVector(N->getOperand(0));
4064 SDValue InOp2 = GetWidenedVector(N->getOperand(1));
4080 SDValue DAGTypeLegalizer::WidenVecRes_SETCC(SDNode *N) {
4087 SDValue InOp1 = N->getOperand(0);
4097 SDValue SplitVSetCC = SplitVecOp_VSETCC(N);
4098 SDValue Res = ModifyToType(SplitVSetCC, WidenVT);
4103 SDValue InOp2 = N->getOperand(1);
4129 SDValue Res = SDValue();
4211 SDValue DAGTypeLegalizer::WidenVecOp_EXTEND(SDNode *N) {
4215 SDValue InOp = N->getOperand(0);
4272 SDValue DAGTypeLegalizer::WidenVecOp_FCOPYSIGN(SDNode *N) {
4279 SDValue DAGTypeLegalizer::WidenVecOp_Convert(SDNode *N) {
4285 SDValue InOp = N->getOperand(N->isStrictFPOpcode() ? 1 : 0);
4298 SDValue Res;
4315 SmallVector<SDValue, 16> Ops(NumElts);
4317 SmallVector<SDValue, 4> NewOps(N->op_begin(), N->op_end());
4318 SmallVector<SDValue, 32> OpChains;
4326 SDValue NewChain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, OpChains);
4340 SDValue DAGTypeLegalizer::WidenVecOp_BITCAST(SDNode *N) {
4342 SDValue InOp = GetWidenedVector(N->getOperand(0));
4354 SDValue BitOp = DAG.getNode(ISD::BITCAST, dl, NewVT, InOp);
4372 SDValue BitOp = DAG.getNode(ISD::BITCAST, dl, NewVT, InOp);
4382 SDValue DAGTypeLegalizer::WidenVecOp_CONCAT_VECTORS(SDNode *N) {
4403 SmallVector<SDValue, 16> Ops(NumElts);
4409 SDValue InOp = N->getOperand(i);
4422 SDValue DAGTypeLegalizer::WidenVecOp_EXTRACT_SUBVECTOR(SDNode *N) {
4423 SDValue InOp = GetWidenedVector(N->getOperand(0));
4428 SDValue DAGTypeLegalizer::WidenVecOp_EXTRACT_VECTOR_ELT(SDNode *N) {
4429 SDValue InOp = GetWidenedVector(N->getOperand(0));
4434 SDValue DAGTypeLegalizer::WidenVecOp_STORE(SDNode *N) {
4442 SmallVector<SDValue, 16> StChain;
4454 SDValue DAGTypeLegalizer::WidenVecOp_MSTORE(SDNode *N, unsigned OpNo) {
4458 SDValue Mask = MST->getMask();
4460 SDValue StVal = MST->getValue();
4493 SDValue DAGTypeLegalizer::WidenVecOp_MGATHER(SDNode *N, unsigned OpNo) {
4496 SDValue DataOp = MG->getPassThru();
4497 SDValue Mask = MG->getMask();
4498 SDValue Scale = MG->getScale();
4501 SDValue Index = GetWidenedVector(MG->getIndex());
4504 SDValue Ops[] = {MG->getChain(), DataOp, Mask, MG->getBasePtr(), Index,
4506 SDValue Res = DAG.getMaskedGather(MG->getVTList(), MG->getMemoryVT(), dl, Ops,
4513 SDValue DAGTypeLegalizer::WidenVecOp_MSCATTER(SDNode *N, unsigned OpNo) {
4515 SDValue DataOp = MSC->getValue();
4516 SDValue Mask = MSC->getMask();
4517 SDValue Index = MSC->getIndex();
4518 SDValue Scale = MSC->getScale();
4541 SDValue Ops[] = {MSC->getChain(), DataOp, Mask, MSC->getBasePtr(), Index,
4548 SDValue DAGTypeLegalizer::WidenVecOp_SETCC(SDNode *N) {
4549 SDValue InOp0 = GetWidenedVector(N->getOperand(0));
4550 SDValue InOp1 = GetWidenedVector(N->getOperand(1));
4566 SDValue WideSETCC = DAG.getNode(ISD::SETCC, SDLoc(N),
4573 SDValue CC = DAG.getNode(
4583 SDValue DAGTypeLegalizer::WidenVecOp_VECREDUCE(SDNode *N) {
4585 SDValue Op = GetWidenedVector(N->getOperand(0));
4590 SDValue NeutralElem;
4639 SDValue DAGTypeLegalizer::WidenVecOp_VSELECT(SDNode *N) {
4646 SDValue Cond = GetWidenedVector(N->getOperand(0));
4647 SDValue LeftIn = DAG.WidenVector(N->getOperand(1), SDLoc(N));
4648 SDValue RightIn = DAG.WidenVector(N->getOperand(2), SDLoc(N));
4651 SDValue Select = DAG.getNode(N->getOpcode(), DL, LeftIn.getValueType(), Cond,
4730 static SDValue BuildVectorFromScalar(SelectionDAG& DAG, EVT VecTy,
4731 SmallVectorImpl<SDValue> &LdOps,
4741 SDValue VecOp = DAG.getNode(ISD::SCALAR_TO_VECTOR, dl, NewVecVT,LdOps[Start]);
4760 SDValue DAGTypeLegalizer::GenWidenVectorLoads(SmallVectorImpl<SDValue> &LdChain,
4760 SDValue DAGTypeLegalizer::GenWidenVectorLoads(SmallVectorImpl<SDValue> &LdChain,
4774 SDValue Chain = LD->getChain();
4775 SDValue BasePtr = LD->getBasePtr();
4787 SDValue LdOp = DAG.getLoad(NewVT, dl, Chain, BasePtr, LD->getPointerInfo(),
4796 SDValue VecOp = DAG.getNode(ISD::SCALAR_TO_VECTOR, dl, NewVecVT, LdOp);
4804 SmallVector<SDValue, 16> ConcatOps(NumConcat);
4805 SDValue UndefVal = DAG.getUNDEF(NewVT);
4813 SmallVector<SDValue, 16> LdOps;
4824 SDValue L;
4837 SmallVector<SDValue, 16> Loads;
4868 SmallVector<SDValue, 16> ConcatOps(End);
4900 SmallVector<SDValue, 16> WidenOps(NumOps);
4901 SDValue UndefVal = DAG.getUNDEF(LdTy);
4912 SDValue
4913 DAGTypeLegalizer::GenWidenVectorExtLoads(SmallVectorImpl<SDValue> &LdChain,
4924 SDValue Chain = LD->getChain();
4925 SDValue BasePtr = LD->getBasePtr();
4936 SmallVector<SDValue, 16> Ops(WidenNumElts);
4944 SDValue NewBasePtr = DAG.getObjectPtrOffset(dl, BasePtr, Offset);
4952 SDValue UndefVal = DAG.getUNDEF(EltVT);
4959 void DAGTypeLegalizer::GenWidenVectorStores(SmallVectorImpl<SDValue> &StChain,
4964 SDValue Chain = ST->getChain();
4965 SDValue BasePtr = ST->getBasePtr();
4969 SDValue ValOp = GetWidenedVector(ST->getValue());
4990 SDValue EOp = DAG.getNode(
5006 SDValue VecOp = DAG.getNode(ISD::BITCAST, dl, NewVecVT, ValOp);
5010 SDValue EOp = DAG.getNode(
5028 DAGTypeLegalizer::GenWidenVectorTruncStores(SmallVectorImpl<SDValue> &StChain,
5032 SDValue Chain = ST->getChain();
5033 SDValue BasePtr = ST->getBasePtr();
5037 SDValue ValOp = GetWidenedVector(ST->getValue());
5054 SDValue EOp = DAG.getNode(
5062 SDValue NewBasePtr = DAG.getObjectPtrOffset(dl, BasePtr, Offset);
5063 SDValue EOp = DAG.getNode(
5075 SDValue DAGTypeLegalizer::ModifyToType(SDValue InOp, EVT NVT,
5075 SDValue DAGTypeLegalizer::ModifyToType(SDValue InOp, EVT NVT,
5092 SmallVector<SDValue, 16> Ops(NumConcat);
5093 SDValue FillVal = FillWithZeroes ? DAG.getConstant(0, dl, InVT) :
5108 SmallVector<SDValue, 16> Ops(WidenNumElts);
5117 SDValue FillVal = FillWithZeroes ? DAG.getConstant(0, dl, EltVT) :
lib/CodeGen/SelectionDAG/ResourcePriorityQueue.cpp 130 const SDValue &Op = ScegN->getOperand(i);
335 const SDValue &Op = SU->getNode()->getOperand(i);
485 const SDValue &Op = ScegN->getOperand(i);
lib/CodeGen/SelectionDAG/ScheduleDAGFast.cpp 227 for (const SDValue &Op : N->op_values()) {
677 const SDValue &Op = N->getOperand(NumLeft-1);
764 DenseMap<SDValue, unsigned> VRBaseMap;
lib/CodeGen/SelectionDAG/ScheduleDAGRRList.cpp 451 for (const SDValue &Op : N->op_values())
467 for (const SDValue &Op : N->op_values())
498 for (const SDValue &Op : N->op_values()) {
525 for (const SDValue &Op : N->op_values())
1161 for (const SDValue &Op : N->op_values()) {
1335 for (const SDValue &Op : N->op_values())
1420 const SDValue &OptionalDef = Node->getOperand(i - Node->getNumValues());
lib/CodeGen/SelectionDAG/ScheduleDAGSDNodes.cpp 141 SDValue ExtraOper = SDValue()) {
142 SmallVector<SDValue, 8> Ops(N->op_begin(), N->op_end());
161 static bool AddGlue(SDNode *N, SDValue Glue, bool AddGlue, SelectionDAG *DAG) {
286 SDValue InGlue = SDValue(nullptr, 0);
350 for (const SDValue &Op : NI->op_values())
380 SDValue GlueVal(N, N->getNumValues()-1);
734 DenseMap<SDValue, unsigned> &VRBaseMap, unsigned Order) {
761 DenseMap<SDValue, unsigned> &VRBaseMap,
829 DenseMap<SDValue, unsigned> VRBaseMap;
lib/CodeGen/SelectionDAG/SelectionDAG.cpp 102 static void NewSDValueDbgMsg(SDValue V, StringRef Msg, SelectionDAG *G) {
176 SDValue NotZero = N->getOperand(i);
204 for (const SDValue &Op : N->op_values()) {
237 for (const SDValue &Op : N->op_values()) {
250 for (const SDValue &Op : N->op_values()) {
268 bool ISD::matchUnaryPredicate(SDValue Op,
295 SDValue LHS, SDValue RHS,
295 SDValue LHS, SDValue RHS,
313 SDValue LHSOp = LHS.getOperand(i);
314 SDValue RHSOp = RHS.getOperand(i);
448 ArrayRef<SDValue> Ops) {
465 SDVTList VTList, ArrayRef<SDValue> OpList) {
935 SDNode *SelectionDAG::FindModifiedNodeSlot(SDNode *N, SDValue Op,
940 SDValue Ops[] = { Op };
955 SDValue Op1, SDValue Op2,
955 SDValue Op1, SDValue Op2,
960 SDValue Ops[] = { Op1, Op2 };
974 SDNode *SelectionDAG::FindModifiedNodeSlot(SDNode *N, ArrayRef<SDValue> Ops,
1098 SDValue SelectionDAG::getFPExtendOrRound(SDValue Op, const SDLoc &DL, EVT VT) {
1098 SDValue SelectionDAG::getFPExtendOrRound(SDValue Op, const SDLoc &DL, EVT VT) {
1104 SDValue SelectionDAG::getAnyExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT) {
1104 SDValue SelectionDAG::getAnyExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT) {
1110 SDValue SelectionDAG::getSExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT) {
1110 SDValue SelectionDAG::getSExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT) {
1116 SDValue SelectionDAG::getZExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT) {
1116 SDValue SelectionDAG::getZExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT) {
1122 SDValue SelectionDAG::getBoolExtOrTrunc(SDValue Op, const SDLoc &SL, EVT VT,
1122 SDValue SelectionDAG::getBoolExtOrTrunc(SDValue Op, const SDLoc &SL, EVT VT,
1131 SDValue SelectionDAG::getZeroExtendInReg(SDValue Op, const SDLoc &DL, EVT VT) {
1131 SDValue SelectionDAG::getZeroExtendInReg(SDValue Op, const SDLoc &DL, EVT VT) {
1143 SDValue SelectionDAG::getPtrExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT) {
1143 SDValue SelectionDAG::getPtrExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT) {
1149 SDValue SelectionDAG::getPtrExtendInReg(SDValue Op, const SDLoc &DL, EVT VT) {
1149 SDValue SelectionDAG::getPtrExtendInReg(SDValue Op, const SDLoc &DL, EVT VT) {
1156 SDValue SelectionDAG::getNOT(const SDLoc &DL, SDValue Val, EVT VT) {
1156 SDValue SelectionDAG::getNOT(const SDLoc &DL, SDValue Val, EVT VT) {
1158 SDValue NegOne =
1163 SDValue SelectionDAG::getLogicalNOT(const SDLoc &DL, SDValue Val, EVT VT) {
1163 SDValue SelectionDAG::getLogicalNOT(const SDLoc &DL, SDValue Val, EVT VT) {
1164 SDValue TrueValue = getBoolConstant(true, DL, VT, VT);
1168 SDValue SelectionDAG::getBoolConstant(bool V, const SDLoc &DL, EVT VT,
1183 SDValue SelectionDAG::getConstant(uint64_t Val, const SDLoc &DL, EVT VT,
1192 SDValue SelectionDAG::getConstant(const APInt &Val, const SDLoc &DL, EVT VT,
1197 SDValue SelectionDAG::getConstant(const ConstantInt &Val, const SDLoc &DL,
1234 SmallVector<SDValue, 2> EltParts;
1253 SmallVector<SDValue, 8> Ops;
1257 SDValue V = getNode(ISD::BITCAST, DL, VT, getBuildVector(ViaVecVT, DL, Ops));
1281 SDValue Result(N, 0);
1290 SDValue SelectionDAG::getIntPtrConstant(uint64_t Val, const SDLoc &DL,
1295 SDValue SelectionDAG::getShiftAmountConstant(uint64_t Val, EVT VT,
1301 SDValue SelectionDAG::getConstantFP(const APFloat &V, const SDLoc &DL, EVT VT,
1306 SDValue SelectionDAG::getConstantFP(const ConstantFP &V, const SDLoc &DL,
1331 SDValue Result(N, 0);
1338 SDValue SelectionDAG::getConstantFP(double Val, const SDLoc &DL, EVT VT,
1356 SDValue SelectionDAG::getGlobalAddress(const GlobalValue *GV, const SDLoc &DL,
1389 SDValue SelectionDAG::getFrameIndex(int FI, EVT VT, bool isTarget) {
1404 SDValue SelectionDAG::getJumpTable(int JTI, EVT VT, bool isTarget,
1423 SDValue SelectionDAG::getConstantPool(const Constant *C, EVT VT,
1451 SDValue SelectionDAG::getConstantPool(MachineConstantPoolValue *C, EVT VT,
1477 SDValue SelectionDAG::getTargetIndex(int Index, EVT VT, int64_t Offset,
1494 SDValue SelectionDAG::getBasicBlock(MachineBasicBlock *MBB) {
1508 SDValue SelectionDAG::getValueType(EVT VT) {
1522 SDValue SelectionDAG::getExternalSymbol(const char *Sym, EVT VT) {
1530 SDValue SelectionDAG::getMCSymbol(MCSymbol *Sym, EVT VT) {
1539 SDValue SelectionDAG::getTargetExternalSymbol(const char *Sym, EVT VT,
1549 SDValue SelectionDAG::getCondCode(ISD::CondCode Cond) {
1564 static void commuteShuffle(SDValue &N1, SDValue &N2, MutableArrayRef<int> M) {
1564 static void commuteShuffle(SDValue &N1, SDValue &N2, MutableArrayRef<int> M) {
1569 SDValue SelectionDAG::getVectorShuffle(EVT VT, const SDLoc &dl, SDValue N1,
1569 SDValue SelectionDAG::getVectorShuffle(EVT VT, const SDLoc &dl, SDValue N1,
1570 SDValue N2, ArrayRef<int> Mask) {
1606 SDValue Splat = BV->getSplatValue(&UndefElements);
1670 SDValue V = N1;
1680 SDValue Splat = BV->getSplatValue(&UndefElements);
1703 const SDValue &Splatted = BV->getOperand(MaskVec[0]);
1704 SDValue NewBV = getSplatBuildVector(BuildVT, dl, Splatted);
1716 SDValue Ops[2] = { N1, N2 };
1737 SDValue V = SDValue(N, 0);
1742 SDValue SelectionDAG::getCommutedVectorShuffle(const ShuffleVectorSDNode &SV) {
1747 SDValue Op0 = SV.getOperand(0);
1748 SDValue Op1 = SV.getOperand(1);
1752 SDValue SelectionDAG::getRegister(unsigned RegNo, EVT VT) {
1767 SDValue SelectionDAG::getRegisterMask(const uint32_t *RegMask) {
1781 SDValue SelectionDAG::getEHLabel(const SDLoc &dl, SDValue Root,
1781 SDValue SelectionDAG::getEHLabel(const SDLoc &dl, SDValue Root,
1786 SDValue SelectionDAG::getLabelNode(unsigned Opcode, const SDLoc &dl,
1787 SDValue Root, MCSymbol *Label) {
1789 SDValue Ops[] = { Root };
1805 SDValue SelectionDAG::getBlockAddress(const BlockAddress *BA, EVT VT,
1825 SDValue SelectionDAG::getSrcValue(const Value *V) {
1843 SDValue SelectionDAG::getMDNode(const MDNode *MD) {
1858 SDValue SelectionDAG::getBitcast(EVT VT, SDValue V) {
1858 SDValue SelectionDAG::getBitcast(EVT VT, SDValue V) {
1865 SDValue SelectionDAG::getAddrSpaceCast(const SDLoc &dl, EVT VT, SDValue Ptr,
1865 SDValue SelectionDAG::getAddrSpaceCast(const SDLoc &dl, EVT VT, SDValue Ptr,
1867 SDValue Ops[] = {Ptr};
1888 SDValue SelectionDAG::getShiftAmountOperand(EVT LHSTy, SDValue Op) {
1888 SDValue SelectionDAG::getShiftAmountOperand(EVT LHSTy, SDValue Op) {
1896 SDValue SelectionDAG::expandVAArg(SDNode *Node) {
1901 SDValue Tmp1 = Node->getOperand(0);
1902 SDValue Tmp2 = Node->getOperand(1);
1905 SDValue VAListLoad = getLoad(TLI.getPointerTy(getDataLayout()), dl, Tmp1,
1907 SDValue VAList = VAListLoad;
1930 SDValue SelectionDAG::expandVACopy(SDNode *Node) {
1937 SDValue Tmp1 =
1944 SDValue SelectionDAG::CreateStackTemporary(EVT VT, unsigned minAlign) {
1955 SDValue SelectionDAG::CreateStackTemporary(EVT VT1, EVT VT2) {
1968 SDValue SelectionDAG::FoldSetCC(EVT VT, SDValue N1, SDValue N2,
1968 SDValue SelectionDAG::FoldSetCC(EVT VT, SDValue N1, SDValue N2,
1968 SDValue SelectionDAG::FoldSetCC(EVT VT, SDValue N1, SDValue N2,
2127 SDValue SelectionDAG::GetDemandedBits(SDValue V, const APInt &DemandedBits) {
2127 SDValue SelectionDAG::GetDemandedBits(SDValue V, const APInt &DemandedBits) {
2140 SDValue SelectionDAG::GetDemandedBits(SDValue V, const APInt &DemandedBits,
2140 SDValue SelectionDAG::GetDemandedBits(SDValue V, const APInt &DemandedBits,
2171 if (SDValue SimplifyLHS =
2190 SDValue Src = V.getOperand(0);
2198 if (SDValue DemandedSrc = GetDemandedBits(Src, SrcDemandedBits))
2208 bool SelectionDAG::SignBitIsZero(SDValue Op, unsigned Depth) const {
2216 bool SelectionDAG::MaskedValueIsZero(SDValue V, const APInt &Mask,
2228 bool SelectionDAG::MaskedValueIsZero(SDValue V, const APInt &Mask,
2235 bool SelectionDAG::MaskedValueIsAllOnes(SDValue V, const APInt &Mask,
2242 bool SelectionDAG::isSplatValue(SDValue V, const APInt &DemandedElts,
2256 SDValue Scl;
2258 SDValue Op = V.getOperand(i);
2291 SDValue Src = V.getOperand(0);
2310 SDValue LHS = V.getOperand(0);
2311 SDValue RHS = V.getOperand(1);
2325 bool SelectionDAG::isSplatValue(SDValue V, bool AllowUndefs) {
2336 SDValue SelectionDAG::getSplatSourceVector(SDValue V, int &SplatIdx) {
2336 SDValue SelectionDAG::getSplatSourceVector(SDValue V, int &SplatIdx) {
2373 SDValue SelectionDAG::getSplatValue(SDValue V) {
2373 SDValue SelectionDAG::getSplatValue(SDValue V) {
2375 if (SDValue SrcVector = getSplatSourceVector(V, SplatIdx))
2384 static const APInt *getValidShiftAmountConstant(SDValue V) {
2397 static const APInt *getValidMinimumShiftAmountConstant(SDValue V) {
2421 KnownBits SelectionDAG::computeKnownBits(SDValue Op, unsigned Depth) const {
2432 KnownBits SelectionDAG::computeKnownBits(SDValue Op, const APInt &DemandedElts,
2472 SDValue SrcOp = Op.getOperand(i);
2519 SDValue LHS = Op.getOperand(0);
2528 SDValue RHS = Op.getOperand(1);
2545 SDValue Sub = Op.getOperand(i);
2559 SDValue Src = Op.getOperand(0);
2560 SDValue Sub = Op.getOperand(1);
2593 SDValue Src = Op.getOperand(0);
2611 SDValue N0 = Op.getOperand(0);
2619 SDValue N0 = Op.getOperand(0);
3152 SDValue InVec = Op.getOperand(0);
3153 SDValue EltNo = Op.getOperand(1);
3176 SDValue InVec = Op.getOperand(0);
3177 SDValue InVal = Op.getOperand(1);
3178 SDValue EltNo = Op.getOperand(2);
3330 SelectionDAG::OverflowKind SelectionDAG::computeOverflowKind(SDValue N0,
3331 SDValue N1) const {
3361 bool SelectionDAG::isKnownToBeAPowerOfTwo(SDValue Val) const {
3402 unsigned SelectionDAG::ComputeNumSignBits(SDValue Op, unsigned Depth) const {
3410 unsigned SelectionDAG::ComputeNumSignBits(SDValue Op, const APInt &DemandedElts,
3446 SDValue SrcOp = Op.getOperand(i);
3494 SDValue N0 = Op.getOperand(0);
3549 SDValue Src = Op.getOperand(0);
3760 SDValue InVec = Op.getOperand(0);
3761 SDValue InVal = Op.getOperand(1);
3762 SDValue EltNo = Op.getOperand(2);
3797 SDValue InVec = Op.getOperand(0);
3798 SDValue EltNo = Op.getOperand(1);
3823 SDValue Src = Op.getOperand(0);
3855 SDValue Src = Op.getOperand(0);
3856 SDValue Sub = Op.getOperand(1);
3968 bool SelectionDAG::isBaseWithConstantOffset(SDValue Op) const {
3980 bool SelectionDAG::isKnownNeverNaN(SDValue Op, bool SNaN, unsigned Depth) const {
4097 bool SelectionDAG::isKnownNeverZeroFloat(SDValue Op) const {
4108 bool SelectionDAG::isKnownNeverZero(SDValue Op) const {
4130 bool SelectionDAG::isEqualTo(SDValue A, SDValue B) const {
4130 bool SelectionDAG::isEqualTo(SDValue A, SDValue B) const {
4145 bool SelectionDAG::haveNoCommonBitsSet(SDValue A, SDValue B) const {
4145 bool SelectionDAG::haveNoCommonBitsSet(SDValue A, SDValue B) const {
4151 static SDValue FoldBUILD_VECTOR(const SDLoc &DL, EVT VT,
4152 ArrayRef<SDValue> Ops,
4164 SDValue IdentitySrc;
4185 static SDValue foldCONCAT_VECTORS(const SDLoc &DL, EVT VT,
4186 ArrayRef<SDValue> Ops,
4208 SDValue IdentitySrc;
4211 SDValue Op = Ops[i];
4234 SmallVector<SDValue, 16> Elts;
4235 for (SDValue Op : Ops) {
4247 for (SDValue Op : Elts)
4251 for (SDValue &Op : Elts)
4256 SDValue V = DAG.getBuildVector(VT, DL, Elts);
4262 SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT) {
4274 SDValue V = SDValue(N, 0);
4279 SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
4280 SDValue Operand, const SDNodeFlags Flags) {
4450 SDValue Ops = { Operand };
4451 if (SDValue Fold = FoldConstantVectorArithmetic(Opcode, DL, VT, Ops))
4466 SDValue Ops[] = {Operand};
4467 if (SDValue V = FoldBUILD_VECTOR(DL, VT, Ops, *this))
4557 SDValue OpOp = Operand.getOperand(0);
4669 SDValue Ops[] = {Operand};
4689 SDValue V = SDValue(N, 0);
4736 SDValue SelectionDAG::FoldConstantArithmetic(unsigned Opcode, const SDLoc &DL,
4749 SDValue SelectionDAG::FoldSymbolOffset(unsigned Opcode, EVT VT,
4769 bool SelectionDAG::isUndef(unsigned Opcode, ArrayRef<SDValue> Ops) {
4778 SDValue Divisor = Ops[1];
4794 SDValue SelectionDAG::FoldConstantArithmetic(unsigned Opcode, const SDLoc &DL,
4808 SDValue Folded = FoldConstantArithmetic(Opcode, DL, VT, C1, C2);
4844 SmallVector<SDValue, 4> Outputs;
4847 SDValue V1 = BV1 ? BV1->getOperand(I) : getUNDEF(SVT);
4848 SDValue V2 = BV2 ? BV2->getOperand(I) : getUNDEF(SVT);
4860 SDValue ScalarResult = getNode(Opcode, DL, SVT, V1, V2);
4882 SDValue SelectionDAG::FoldConstantVectorArithmetic(unsigned Opcode,
4884 ArrayRef<SDValue> Ops,
4933 SmallVector<SDValue, 4> ScalarResults;
4935 SmallVector<SDValue, 4> ScalarOps;
4936 for (SDValue Op : Ops) {
4948 SDValue ScalarOp = InBV->getOperand(i);
4960 SDValue ScalarResult = getNode(Opcode, DL, SVT, ScalarOps, Flags);
4973 SDValue V = getBuildVector(VT, DL, ScalarResults);
4978 SDValue SelectionDAG::foldConstantFPMath(unsigned Opcode, const SDLoc &DL,
4979 EVT VT, SDValue N1, SDValue N2) {
4979 EVT VT, SDValue N1, SDValue N2) {
5036 SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
5037 SDValue N1, SDValue N2, const SDNodeFlags Flags) {
5037 SDValue N1, SDValue N2, const SDNodeFlags Flags) {
5066 SDValue Ops[] = {N1, N2};
5067 if (SDValue V = FoldBUILD_VECTOR(DL, VT, Ops, *this))
5072 SDValue Ops[] = {N1, N2};
5073 if (SDValue V = foldCONCAT_VECTORS(DL, VT, Ops, *this))
5127 if (SDValue V = simplifyFPBinop(Opcode, N1, N2))
5139 if (SDValue V = simplifyShift(N1, N2))
5212 SmallVector<SDValue, 8> Ops;
5215 SDValue Op = N1.getOperand(i);
5257 SDValue Elt = N1.getOperand(N2C->getZExtValue());
5274 SDValue N1Op2 = N1.getOperand(2);
5362 if (SDValue SV =
5366 if (SDValue V = foldConstantFPMath(Opcode, DL, VT, N1, N2))
5420 SDValue Ops[] = {N1, N2};
5440 SDValue V = SDValue(N, 0);
5445 SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
5446 SDValue N1, SDValue N2, SDValue N3,
5446 SDValue N1, SDValue N2, SDValue N3,
5446 SDValue N1, SDValue N2, SDValue N3,
5468 SDValue Ops[] = {N1, N2, N3};
5469 if (SDValue V = FoldBUILD_VECTOR(DL, VT, Ops, *this))
5474 SDValue Ops[] = {N1, N2, N3};
5475 if (SDValue V = foldCONCAT_VECTORS(DL, VT, Ops, *this))
5489 if (SDValue V = FoldSetCC(VT, N1, N2, cast<CondCodeSDNode>(N3)->get(), DL))
5492 SDValue Ops[] = {N1, N2, N3};
5493 if (SDValue V = FoldConstantVectorArithmetic(Opcode, DL, VT, Ops)) {
5501 if (SDValue V = simplifySelect(N1, N2, N3))
5526 SDValue Index = N3;
5565 SDValue Ops[] = {N1, N2, N3};
5585 SDValue V = SDValue(N, 0);
5590 SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
5591 SDValue N1, SDValue N2, SDValue N3, SDValue N4) {
5591 SDValue N1, SDValue N2, SDValue N3, SDValue N4) {
5591 SDValue N1, SDValue N2, SDValue N3, SDValue N4) {
5591 SDValue N1, SDValue N2, SDValue N3, SDValue N4) {
5592 SDValue Ops[] = { N1, N2, N3, N4 };
5596 SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
5597 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
5597 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
5597 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
5597 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
5598 SDValue N5) {
5599 SDValue Ops[] = { N1, N2, N3, N4, N5 };
5605 SDValue SelectionDAG::getStackArgumentTokenFactor(SDValue Chain) {
5605 SDValue SelectionDAG::getStackArgumentTokenFactor(SDValue Chain) {
5606 SmallVector<SDValue, 8> ArgChains;
5627 static SDValue getMemsetValue(SDValue Value, EVT VT, SelectionDAG &DAG,
5627 static SDValue getMemsetValue(SDValue Value, EVT VT, SelectionDAG &DAG,
5669 static SDValue getMemsetStringVal(EVT VT, const SDLoc &dl, SelectionDAG &DAG,
5711 SDValue SelectionDAG::getMemBasePlusOffset(SDValue Base, unsigned Offset,
5711 SDValue SelectionDAG::getMemBasePlusOffset(SDValue Base, unsigned Offset,
5718 static bool isMemSrcFromConstant(SDValue Src, ConstantDataArraySlice &Slice) {
5745 SmallVector<SDValue, 32> &OutChains, unsigned From,
5746 unsigned To, SmallVector<SDValue, 16> &OutLoadChains,
5747 SmallVector<SDValue, 16> &OutStoreChains) {
5750 SmallVector<SDValue, 16> GluedLoadChains;
5757 SDValue LoadToken = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
5762 SDValue NewStore = DAG.getTruncStore(LoadToken, dl, ST->getValue(),
5769 static SDValue getMemcpyLoadsAndStores(SelectionDAG &DAG, const SDLoc &dl,
5770 SDValue Chain, SDValue Dst, SDValue Src,
5770 SDValue Chain, SDValue Dst, SDValue Src,
5770 SDValue Chain, SDValue Dst, SDValue Src,
5833 SmallVector<SDValue, 16> OutLoadChains;
5834 SmallVector<SDValue, 16> OutStoreChains;
5835 SmallVector<SDValue, 32> OutChains;
5841 SDValue Value, Store;
5954 static SDValue getMemmoveLoadsAndStores(SelectionDAG &DAG, const SDLoc &dl,
5955 SDValue Chain, SDValue Dst, SDValue Src,
5955 SDValue Chain, SDValue Dst, SDValue Src,
5955 SDValue Chain, SDValue Dst, SDValue Src,
6007 SmallVector<SDValue, 8> LoadValues;
6008 SmallVector<SDValue, 8> LoadChains;
6009 SmallVector<SDValue, 8> OutChains;
6014 SDValue Value;
6034 SDValue Store;
6064 static SDValue getMemsetStores(SelectionDAG &DAG, const SDLoc &dl,
6065 SDValue Chain, SDValue Dst, SDValue Src,
6065 SDValue Chain, SDValue Dst, SDValue Src,
6065 SDValue Chain, SDValue Dst, SDValue Src,
6105 SmallVector<SDValue, 8> OutChains;
6114 SDValue MemSetValue = getMemsetValue(Src, LargestVT, DAG, dl);
6128 SDValue Value = MemSetValue;
6137 SDValue Store = DAG.getStore(
6159 SDValue SelectionDAG::getMemcpy(SDValue Chain, const SDLoc &dl, SDValue Dst,
6159 SDValue SelectionDAG::getMemcpy(SDValue Chain, const SDLoc &dl, SDValue Dst,
6159 SDValue SelectionDAG::getMemcpy(SDValue Chain, const SDLoc &dl, SDValue Dst,
6160 SDValue Src, SDValue Size, unsigned Align,
6160 SDValue Src, SDValue Size, unsigned Align,
6174 SDValue Result = getMemcpyLoadsAndStores(*this, dl, Chain, Dst, Src,
6184 SDValue Result = TSI->EmitTargetCodeForMemcpy(
6230 std::pair<SDValue,SDValue> CallResult = TLI->LowerCallTo(CLI);
6230 std::pair<SDValue,SDValue> CallResult = TLI->LowerCallTo(CLI);
6234 SDValue SelectionDAG::getAtomicMemcpy(SDValue Chain, const SDLoc &dl,
6234 SDValue SelectionDAG::getAtomicMemcpy(SDValue Chain, const SDLoc &dl,
6235 SDValue Dst, unsigned DstAlign,
6236 SDValue Src, unsigned SrcAlign,
6237 SDValue Size, Type *SizeTy,
6271 std::pair<SDValue, SDValue> CallResult = TLI->LowerCallTo(CLI);
6271 std::pair<SDValue, SDValue> CallResult = TLI->LowerCallTo(CLI);
6275 SDValue SelectionDAG::getMemmove(SDValue Chain, const SDLoc &dl, SDValue Dst,
6275 SDValue SelectionDAG::getMemmove(SDValue Chain, const SDLoc &dl, SDValue Dst,
6275 SDValue SelectionDAG::getMemmove(SDValue Chain, const SDLoc &dl, SDValue Dst,
6276 SDValue Src, SDValue Size, unsigned Align,
6276 SDValue Src, SDValue Size, unsigned Align,
6290 SDValue Result =
6301 SDValue Result = TSI->EmitTargetCodeForMemmove(
6334 std::pair<SDValue,SDValue> CallResult = TLI->LowerCallTo(CLI);
6334 std::pair<SDValue,SDValue> CallResult = TLI->LowerCallTo(CLI);
6338 SDValue SelectionDAG::getAtomicMemmove(SDValue Chain, const SDLoc &dl,
6338 SDValue SelectionDAG::getAtomicMemmove(SDValue Chain, const SDLoc &dl,
6339 SDValue Dst, unsigned DstAlign,
6340 SDValue Src, unsigned SrcAlign,
6341 SDValue Size, Type *SizeTy,
6375 std::pair<SDValue, SDValue> CallResult = TLI->LowerCallTo(CLI);
6375 std::pair<SDValue, SDValue> CallResult = TLI->LowerCallTo(CLI);
6379 SDValue SelectionDAG::getMemset(SDValue Chain, const SDLoc &dl, SDValue Dst,
6379 SDValue SelectionDAG::getMemset(SDValue Chain, const SDLoc &dl, SDValue Dst,
6379 SDValue SelectionDAG::getMemset(SDValue Chain, const SDLoc &dl, SDValue Dst,
6380 SDValue Src, SDValue Size, unsigned Align,
6380 SDValue Src, SDValue Size, unsigned Align,
6393 SDValue Result =
6404 SDValue Result = TSI->EmitTargetCodeForMemset(
6436 std::pair<SDValue,SDValue> CallResult = TLI->LowerCallTo(CLI);
6436 std::pair<SDValue,SDValue> CallResult = TLI->LowerCallTo(CLI);
6440 SDValue SelectionDAG::getAtomicMemset(SDValue Chain, const SDLoc &dl,
6440 SDValue SelectionDAG::getAtomicMemset(SDValue Chain, const SDLoc &dl,
6441 SDValue Dst, unsigned DstAlign,
6442 SDValue Value, SDValue Size, Type *SizeTy,
6442 SDValue Value, SDValue Size, Type *SizeTy,
6476 std::pair<SDValue, SDValue> CallResult = TLI->LowerCallTo(CLI);
6476 std::pair<SDValue, SDValue> CallResult = TLI->LowerCallTo(CLI);
6480 SDValue SelectionDAG::getAtomic(unsigned Opcode, const SDLoc &dl, EVT MemVT,
6481 SDVTList VTList, ArrayRef<SDValue> Ops,
6502 SDValue SelectionDAG::getAtomicCmpSwap(unsigned Opcode, const SDLoc &dl,
6503 EVT MemVT, SDVTList VTs, SDValue Chain,
6504 SDValue Ptr, SDValue Cmp, SDValue Swp,
6504 SDValue Ptr, SDValue Cmp, SDValue Swp,
6504 SDValue Ptr, SDValue Cmp, SDValue Swp,
6510 SDValue Ops[] = {Chain, Ptr, Cmp, Swp};
6514 SDValue SelectionDAG::getAtomic(unsigned Opcode, const SDLoc &dl, EVT MemVT,
6515 SDValue Chain, SDValue Ptr, SDValue Val,
6515 SDValue Chain, SDValue Ptr, SDValue Val,
6515 SDValue Chain, SDValue Ptr, SDValue Val,
6538 SDValue Ops[] = {Chain, Ptr, Val};
6542 SDValue SelectionDAG::getAtomic(unsigned Opcode, const SDLoc &dl, EVT MemVT,
6543 EVT VT, SDValue Chain, SDValue Ptr,
6543 EVT VT, SDValue Chain, SDValue Ptr,
6548 SDValue Ops[] = {Chain, Ptr};
6553 SDValue SelectionDAG::getMergeValues(ArrayRef<SDValue> Ops, const SDLoc &dl) {
6553 SDValue SelectionDAG::getMergeValues(ArrayRef<SDValue> Ops, const SDLoc &dl) {
6564 SDValue SelectionDAG::getMemIntrinsicNode(
6565 unsigned Opcode, const SDLoc &dl, SDVTList VTList, ArrayRef<SDValue> Ops,
6581 SDValue SelectionDAG::getMemIntrinsicNode(unsigned Opcode, const SDLoc &dl,
6583 ArrayRef<SDValue> Ops, EVT MemVT,
6619 SDValue V(N, 0);
6624 SDValue SelectionDAG::getLifetimeNode(bool IsStart, const SDLoc &dl,
6625 SDValue Chain, int FrameIndex,
6629 SDValue Ops[2] = {
6649 SDValue V(N, 0);
6659 SelectionDAG &DAG, SDValue Ptr,
6683 SelectionDAG &DAG, SDValue Ptr,
6684 SDValue OffsetOp) {
6693 SDValue SelectionDAG::getLoad(ISD::MemIndexedMode AM, ISD::LoadExtType ExtType,
6694 EVT VT, const SDLoc &dl, SDValue Chain,
6695 SDValue Ptr, SDValue Offset,
6695 SDValue Ptr, SDValue Offset,
6718 SDValue SelectionDAG::getLoad(ISD::MemIndexedMode AM, ISD::LoadExtType ExtType,
6719 EVT VT, const SDLoc &dl, SDValue Chain,
6720 SDValue Ptr, SDValue Offset, EVT MemVT,
6720 SDValue Ptr, SDValue Offset, EVT MemVT,
6744 SDValue Ops[] = { Chain, Ptr, Offset };
6762 SDValue V(N, 0);
6767 SDValue SelectionDAG::getLoad(EVT VT, const SDLoc &dl, SDValue Chain,
6767 SDValue SelectionDAG::getLoad(EVT VT, const SDLoc &dl, SDValue Chain,
6768 SDValue Ptr, MachinePointerInfo PtrInfo,
6772 SDValue Undef = getUNDEF(Ptr.getValueType());
6777 SDValue SelectionDAG::getLoad(EVT VT, const SDLoc &dl, SDValue Chain,
6777 SDValue SelectionDAG::getLoad(EVT VT, const SDLoc &dl, SDValue Chain,
6778 SDValue Ptr, MachineMemOperand *MMO) {
6779 SDValue Undef = getUNDEF(Ptr.getValueType());
6784 SDValue SelectionDAG::getExtLoad(ISD::LoadExtType ExtType, const SDLoc &dl,
6785 EVT VT, SDValue Chain, SDValue Ptr,
6785 EVT VT, SDValue Chain, SDValue Ptr,
6790 SDValue Undef = getUNDEF(Ptr.getValueType());
6795 SDValue SelectionDAG::getExtLoad(ISD::LoadExtType ExtType, const SDLoc &dl,
6796 EVT VT, SDValue Chain, SDValue Ptr, EVT MemVT,
6796 EVT VT, SDValue Chain, SDValue Ptr, EVT MemVT,
6798 SDValue Undef = getUNDEF(Ptr.getValueType());
6803 SDValue SelectionDAG::getIndexedLoad(SDValue OrigLoad, const SDLoc &dl,
6803 SDValue SelectionDAG::getIndexedLoad(SDValue OrigLoad, const SDLoc &dl,
6804 SDValue Base, SDValue Offset,
6804 SDValue Base, SDValue Offset,
6818 SDValue SelectionDAG::getStore(SDValue Chain, const SDLoc &dl, SDValue Val,
6818 SDValue SelectionDAG::getStore(SDValue Chain, const SDLoc &dl, SDValue Val,
6818 SDValue SelectionDAG::getStore(SDValue Chain, const SDLoc &dl, SDValue Val,
6819 SDValue Ptr, MachinePointerInfo PtrInfo,
6839 SDValue SelectionDAG::getStore(SDValue Chain, const SDLoc &dl, SDValue Val,
6839 SDValue SelectionDAG::getStore(SDValue Chain, const SDLoc &dl, SDValue Val,
6839 SDValue SelectionDAG::getStore(SDValue Chain, const SDLoc &dl, SDValue Val,
6840 SDValue Ptr, MachineMemOperand *MMO) {
6845 SDValue Undef = getUNDEF(Ptr.getValueType());
6846 SDValue Ops[] = { Chain, Val, Ptr, Undef };
6864 SDValue V(N, 0);
6869 SDValue SelectionDAG::getTruncStore(SDValue Chain, const SDLoc &dl, SDValue Val,
6869 SDValue SelectionDAG::getTruncStore(SDValue Chain, const SDLoc &dl, SDValue Val,
6869 SDValue SelectionDAG::getTruncStore(SDValue Chain, const SDLoc &dl, SDValue Val,
6870 SDValue Ptr, MachinePointerInfo PtrInfo,
6891 SDValue SelectionDAG::getTruncStore(SDValue Chain, const SDLoc &dl, SDValue Val,
6891 SDValue SelectionDAG::getTruncStore(SDValue Chain, const SDLoc &dl, SDValue Val,
6891 SDValue SelectionDAG::getTruncStore(SDValue Chain, const SDLoc &dl, SDValue Val,
6892 SDValue Ptr, EVT SVT,
6912 SDValue Undef = getUNDEF(Ptr.getValueType());
6913 SDValue Ops[] = { Chain, Val, Ptr, Undef };
6931 SDValue V(N, 0);
6936 SDValue SelectionDAG::getIndexedStore(SDValue OrigStore, const SDLoc &dl,
6936 SDValue SelectionDAG::getIndexedStore(SDValue OrigStore, const SDLoc &dl,
6937 SDValue Base, SDValue Offset,
6937 SDValue Base, SDValue Offset,
6942 SDValue Ops[] = { ST->getChain(), ST->getValue(), Base, Offset };
6959 SDValue V(N, 0);
6964 SDValue SelectionDAG::getMaskedLoad(EVT VT, const SDLoc &dl, SDValue Chain,
6964 SDValue SelectionDAG::getMaskedLoad(EVT VT, const SDLoc &dl, SDValue Chain,
6965 SDValue Ptr, SDValue Mask, SDValue PassThru,
6965 SDValue Ptr, SDValue Mask, SDValue PassThru,
6965 SDValue Ptr, SDValue Mask, SDValue PassThru,
6969 SDValue Ops[] = { Chain, Ptr, Mask, PassThru };
6987 SDValue V(N, 0);
6992 SDValue SelectionDAG::getMaskedStore(SDValue Chain, const SDLoc &dl,
6992 SDValue SelectionDAG::getMaskedStore(SDValue Chain, const SDLoc &dl,
6993 SDValue Val, SDValue Ptr, SDValue Mask,
6993 SDValue Val, SDValue Ptr, SDValue Mask,
6993 SDValue Val, SDValue Ptr, SDValue Mask,
6999 SDValue Ops[] = { Chain, Val, Ptr, Mask };
7017 SDValue V(N, 0);
7022 SDValue SelectionDAG::getMaskedGather(SDVTList VTs, EVT VT, const SDLoc &dl,
7023 ArrayRef<SDValue> Ops,
7058 SDValue V(N, 0);
7063 SDValue SelectionDAG::getMaskedScatter(SDVTList VTs, EVT VT, const SDLoc &dl,
7064 ArrayRef<SDValue> Ops,
7096 SDValue V(N, 0);
7101 SDValue SelectionDAG::simplifySelect(SDValue Cond, SDValue T, SDValue F) {
7101 SDValue SelectionDAG::simplifySelect(SDValue Cond, SDValue T, SDValue F) {
7101 SDValue SelectionDAG::simplifySelect(SDValue Cond, SDValue T, SDValue F) {
7101 SDValue SelectionDAG::simplifySelect(SDValue Cond, SDValue T, SDValue F) {
7131 SDValue SelectionDAG::simplifyShift(SDValue X, SDValue Y) {
7131 SDValue SelectionDAG::simplifyShift(SDValue X, SDValue Y) {
7131 SDValue SelectionDAG::simplifyShift(SDValue X, SDValue Y) {
7156 SDValue SelectionDAG::simplifyFPBinop(unsigned Opcode, SDValue X, SDValue Y) {
7156 SDValue SelectionDAG::simplifyFPBinop(unsigned Opcode, SDValue X, SDValue Y) {
7156 SDValue SelectionDAG::simplifyFPBinop(unsigned Opcode, SDValue X, SDValue Y) {
7180 SDValue SelectionDAG::getVAArg(EVT VT, const SDLoc &dl, SDValue Chain,
7180 SDValue SelectionDAG::getVAArg(EVT VT, const SDLoc &dl, SDValue Chain,
7181 SDValue Ptr, SDValue SV, unsigned Align) {
7181 SDValue Ptr, SDValue SV, unsigned Align) {
7182 SDValue Ops[] = { Chain, Ptr, SV, getTargetConstant(Align, dl, MVT::i32) };
7186 SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
7198 SmallVector<SDValue, 8> NewOps(Ops.begin(), Ops.end());
7202 SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
7203 ArrayRef<SDValue> Ops, const SDNodeFlags Flags) {
7217 if (SDValue V = FoldBUILD_VECTOR(DL, VT, Ops, *this))
7221 if (SDValue V = foldCONCAT_VECTORS(DL, VT, Ops, *this))
7262 SDValue V(N, 0);
7267 SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL,
7268 ArrayRef<EVT> ResultTys, ArrayRef<SDValue> Ops) {
7272 SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
7273 ArrayRef<SDValue> Ops) {
7317 SDValue V(N, 0);
7322 SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL,
7327 SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
7328 SDValue N1) {
7329 SDValue Ops[] = { N1 };
7333 SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
7334 SDValue N1, SDValue N2) {
7334 SDValue N1, SDValue N2) {
7335 SDValue Ops[] = { N1, N2 };
7339 SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
7340 SDValue N1, SDValue N2, SDValue N3) {
7340 SDValue N1, SDValue N2, SDValue N3) {
7340 SDValue N1, SDValue N2, SDValue N3) {
7341 SDValue Ops[] = { N1, N2, N3 };
7345 SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
7346 SDValue N1, SDValue N2, SDValue N3, SDValue N4) {
7346 SDValue N1, SDValue N2, SDValue N3, SDValue N4) {
7346 SDValue N1, SDValue N2, SDValue N3, SDValue N4) {
7346 SDValue N1, SDValue N2, SDValue N3, SDValue N4) {
7347 SDValue Ops[] = { N1, N2, N3, N4 };
7351 SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
7352 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
7352 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
7352 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
7352 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
7353 SDValue N5) {
7354 SDValue Ops[] = { N1, N2, N3, N4, N5 };
7448 SDNode *SelectionDAG::UpdateNodeOperands(SDNode *N, SDValue Op) {
7473 SDNode *SelectionDAG::UpdateNodeOperands(SDNode *N, SDValue Op1, SDValue Op2) {
7473 SDNode *SelectionDAG::UpdateNodeOperands(SDNode *N, SDValue Op1, SDValue Op2) {
7503 UpdateNodeOperands(SDNode *N, SDValue Op1, SDValue Op2, SDValue Op3) {
7503 UpdateNodeOperands(SDNode *N, SDValue Op1, SDValue Op2, SDValue Op3) {
7503 UpdateNodeOperands(SDNode *N, SDValue Op1, SDValue Op2, SDValue Op3) {
7504 SDValue Ops[] = { Op1, Op2, Op3 };
7509 UpdateNodeOperands(SDNode *N, SDValue Op1, SDValue Op2,
7509 UpdateNodeOperands(SDNode *N, SDValue Op1, SDValue Op2,
7510 SDValue Op3, SDValue Op4) {
7510 SDValue Op3, SDValue Op4) {
7511 SDValue Ops[] = { Op1, Op2, Op3, Op4 };
7516 UpdateNodeOperands(SDNode *N, SDValue Op1, SDValue Op2,
7516 UpdateNodeOperands(SDNode *N, SDValue Op1, SDValue Op2,
7517 SDValue Op3, SDValue Op4, SDValue Op5) {
7517 SDValue Op3, SDValue Op4, SDValue Op5) {
7517 SDValue Op3, SDValue Op4, SDValue Op5) {
7518 SDValue Ops[] = { Op1, Op2, Op3, Op4, Op5 };
7523 UpdateNodeOperands(SDNode *N, ArrayRef<SDValue> Ops) {
7595 EVT VT, SDValue Op1) {
7597 SDValue Ops[] = { Op1 };
7602 EVT VT, SDValue Op1,
7603 SDValue Op2) {
7605 SDValue Ops[] = { Op1, Op2 };
7610 EVT VT, SDValue Op1,
7611 SDValue Op2, SDValue Op3) {
7611 SDValue Op2, SDValue Op3) {
7613 SDValue Ops[] = { Op1, Op2, Op3 };
7618 EVT VT, ArrayRef<SDValue> Ops) {
7624 EVT VT1, EVT VT2, ArrayRef<SDValue> Ops) {
7637 ArrayRef<SDValue> Ops) {
7644 SDValue Op1, SDValue Op2) {
7644 SDValue Op1, SDValue Op2) {
7646 SDValue Ops[] = { Op1, Op2 };
7651 SDVTList VTs,ArrayRef<SDValue> Ops) {
7696 SDVTList VTs, ArrayRef<SDValue> Ops) {
7791 SDValue InputChain = Node->getOperand(0);
7792 SDValue OutputChain = SDValue(Node, 1);
7795 SmallVector<SDValue, 3> Ops;
7830 EVT VT, SDValue Op1) {
7832 SDValue Ops[] = { Op1 };
7837 EVT VT, SDValue Op1, SDValue Op2) {
7837 EVT VT, SDValue Op1, SDValue Op2) {
7839 SDValue Ops[] = { Op1, Op2 };
7844 EVT VT, SDValue Op1, SDValue Op2,
7844 EVT VT, SDValue Op1, SDValue Op2,
7845 SDValue Op3) {
7847 SDValue Ops[] = { Op1, Op2, Op3 };
7852 EVT VT, ArrayRef<SDValue> Ops) {
7858 EVT VT1, EVT VT2, SDValue Op1,
7859 SDValue Op2) {
7861 SDValue Ops[] = { Op1, Op2 };
7866 EVT VT1, EVT VT2, SDValue Op1,
7867 SDValue Op2, SDValue Op3) {
7867 SDValue Op2, SDValue Op3) {
7869 SDValue Ops[] = { Op1, Op2, Op3 };
7875 ArrayRef<SDValue> Ops) {
7882 SDValue Op1, SDValue Op2) {
7882 SDValue Op1, SDValue Op2) {
7884 SDValue Ops[] = { Op1, Op2 };
7890 SDValue Op1, SDValue Op2,
7890 SDValue Op1, SDValue Op2,
7891 SDValue Op3) {
7893 SDValue Ops[] = { Op1, Op2, Op3 };
7899 ArrayRef<SDValue> Ops) {
7906 ArrayRef<SDValue> Ops) {
7913 ArrayRef<SDValue> Ops) {
7941 SDValue SelectionDAG::getTargetExtractSubreg(int SRIdx, const SDLoc &DL, EVT VT,
7942 SDValue Operand) {
7943 SDValue SRIdxVal = getTargetConstant(SRIdx, DL, MVT::i32);
7951 SDValue SelectionDAG::getTargetInsertSubreg(int SRIdx, const SDLoc &DL, EVT VT,
7952 SDValue Operand, SDValue Subreg) {
7952 SDValue Operand, SDValue Subreg) {
7953 SDValue SRIdxVal = getTargetConstant(SRIdx, DL, MVT::i32);
7962 ArrayRef<SDValue> Ops,
8021 void SelectionDAG::transferDbgValues(SDValue From, SDValue To,
8021 void SelectionDAG::transferDbgValues(SDValue From, SDValue To,
8093 SDValue N0 = N.getOperand(0);
8094 SDValue N1 = N.getOperand(1);
8160 void SelectionDAG::ReplaceAllUsesWith(SDValue FromN, SDValue To) {
8160 void SelectionDAG::ReplaceAllUsesWith(SDValue FromN, SDValue To) {
8267 void SelectionDAG::ReplaceAllUsesWith(SDNode *From, const SDValue *To) {
8292 const SDValue &ToOp = To[Use.getResNo()];
8314 void SelectionDAG::ReplaceAllUsesOfValueWith(SDValue From, SDValue To){
8314 void SelectionDAG::ReplaceAllUsesOfValueWith(SDValue From, SDValue To){
8461 void SelectionDAG::ReplaceAllUsesOfValuesWith(const SDValue *From,
8462 const SDValue *To,
8621 SDValue SelectionDAG::makeEquivalentMemoryOrdering(LoadSDNode *OldLoad,
8622 SDValue NewMemOp) {
8628 SDValue OldChain = SDValue(OldLoad, 1);
8629 SDValue NewChain = SDValue(NewMemOp.getNode(), 1);
8633 SDValue TokenFactor =
8640 SDValue SelectionDAG::getSymbolFunctionGlobalAddress(SDValue Op,
8640 SDValue SelectionDAG::getSymbolFunctionGlobalAddress(SDValue Op,
8670 bool llvm::isNullConstant(SDValue V) {
8675 bool llvm::isNullFPConstant(SDValue V) {
8680 bool llvm::isAllOnesConstant(SDValue V) {
8685 bool llvm::isOneConstant(SDValue V) {
8690 SDValue llvm::peekThroughBitcasts(SDValue V) {
8690 SDValue llvm::peekThroughBitcasts(SDValue V) {
8696 SDValue llvm::peekThroughOneUseBitcasts(SDValue V) {
8696 SDValue llvm::peekThroughOneUseBitcasts(SDValue V) {
8702 SDValue llvm::peekThroughExtractSubvectors(SDValue V) {
8702 SDValue llvm::peekThroughExtractSubvectors(SDValue V) {
8708 bool llvm::isBitwiseNot(SDValue V, bool AllowUndefs) {
8718 ConstantSDNode *llvm::isConstOrConstSplat(SDValue N, bool AllowUndefs,
8741 ConstantSDNode *llvm::isConstOrConstSplat(SDValue N, const APInt &DemandedElts,
8765 ConstantFPSDNode *llvm::isConstOrConstSplatFP(SDValue N, bool AllowUndefs) {
8779 ConstantFPSDNode *llvm::isConstOrConstSplatFP(SDValue N,
8796 bool llvm::isNullOrNullSplat(SDValue N, bool AllowUndefs) {
8802 bool llvm::isOneOrOneSplat(SDValue N) {
8809 bool llvm::isAllOnesOrAllOnesSplat(SDValue N) {
8965 bool SDValue::reachesChainWithoutSideEffects(SDValue Dest,
9014 SDValue
9024 SDValue Op = Extract->getOperand(0);
9075 SDValue PrevOp;
9082 SDValue Op0 = Op.getOperand(0);
9083 SDValue Op1 = Op.getOperand(1);
9110 SDValue SelectionDAG::UnrollVectorOp(SDNode *N, unsigned ResNE) {
9119 SmallVector<SDValue, 8> Scalars;
9120 SmallVector<SDValue, 4> Operands(N->getNumOperands());
9131 SDValue Operand = N->getOperand(j);
9179 std::pair<SDValue, SDValue> SelectionDAG::UnrollVectorOverflowOp(
9179 std::pair<SDValue, SDValue> SelectionDAG::UnrollVectorOverflowOp(
9200 SmallVector<SDValue, 8> LHSScalars;
9201 SmallVector<SDValue, 8> RHSScalars;
9207 SmallVector<SDValue, 8> ResScalars;
9208 SmallVector<SDValue, 8> OvScalars;
9210 SDValue Res = getNode(Opcode, dl, VTs, LHSScalars[i], RHSScalars[i]);
9211 SDValue Ov =
9257 unsigned SelectionDAG::InferPtrAlignment(SDValue Ptr) const {
9309 std::pair<SDValue, SDValue>
9309 std::pair<SDValue, SDValue>
9310 SelectionDAG::SplitVector(const SDValue &N, const SDLoc &DL, const EVT &LoVT,
9315 SDValue Lo, Hi;
9325 SDValue SelectionDAG::WidenVector(const SDValue &N, const SDLoc &DL) {
9325 SDValue SelectionDAG::WidenVector(const SDValue &N, const SDLoc &DL) {
9333 void SelectionDAG::ExtractVectorElements(SDValue Op,
9334 SmallVectorImpl<SDValue> &Args,
9386 SDValue OpVal = getOperand(i);
9426 SDValue BuildVectorSDNode::getSplatValue(const APInt &DemandedElts,
9436 SDValue Splatted;
9440 SDValue Op = getOperand(i);
9461 SDValue BuildVectorSDNode::getSplatValue(BitVector *UndefElements) const {
9509 for (const SDValue &Op : op_values()) {
9538 SDNode *SelectionDAG::isConstantIntBuildVectorOrConstantInt(SDValue N) {
9552 SDNode *SelectionDAG::isConstantFPBuildVectorOrConstantFP(SDValue N) {
9562 void SelectionDAG::createOperands(SDNode *Node, ArrayRef<SDValue> Vals) {
9584 SDValue SelectionDAG::getTokenFactor(const SDLoc &DL,
9585 SmallVectorImpl<SDValue> &Vals) {
9590 SDValue NewTF = getNode(ISD::TokenFactor, DL, MVT::Other, ExtractedTFs);
9615 for (const SDValue &Op : N->op_values())
lib/CodeGen/SelectionDAG/SelectionDAGAddressAnalysis.cpp 169 SDValue Ptr = N->getBasePtr();
172 SDValue Base = DAG.getTargetLoweringInfo().unwrapAddress(Ptr);
173 SDValue Index = SDValue();
245 SDValue PotentialBase = Base->getOperand(0);
lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp 190 static SDValue getCopyFromPartsVector(SelectionDAG &DAG, const SDLoc &DL,
191 const SDValue *Parts, unsigned NumParts,
200 static SDValue getCopyFromParts(SelectionDAG &DAG, const SDLoc &DL,
201 const SDValue *Parts, unsigned NumParts,
211 SDValue Val = Parts[0];
225 SDValue Lo, Hi;
268 SDValue Lo, Hi;
357 static SDValue getCopyFromPartsVector(SelectionDAG &DAG, const SDLoc &DL,
358 const SDValue *Parts, unsigned NumParts,
366 SDValue Val = Parts[0];
393 SmallVector<SDValue, 8> Ops(NumIntermediates);
491 SDValue Val, SDValue *Parts, unsigned NumParts,
491 SDValue Val, SDValue *Parts, unsigned NumParts,
498 static void getCopyToParts(SelectionDAG &DAG, const SDLoc &DL, SDValue Val,
499 SDValue *Parts, unsigned NumParts, MVT PartVT,
585 SDValue OddVal = DAG.getNode(ISD::SRL, DL, ValueVT, Val,
611 SDValue &Part0 = Parts[i];
612 SDValue &Part1 = Parts[i+StepSize/2];
630 static SDValue widenVectorToPartType(SelectionDAG &DAG,
631 SDValue Val, const SDLoc &DL, EVT PartVT) {
643 SmallVector<SDValue, 16> Ops;
645 SDValue EltUndef = DAG.getUNDEF(ElementVT);
659 SDValue Val, SDValue *Parts, unsigned NumParts,
659 SDValue Val, SDValue *Parts, unsigned NumParts,
674 } else if (SDValue Widened = widenVectorToPartType(DAG, Val, DL, PartVT)) {
732 if (SDValue Widened = widenVectorToPartType(DAG, Val, DL, BuiltVectorTy))
739 SmallVector<SDValue, 8> Ops(NumIntermediates);
799 SDValue RegsForValue::getCopyFromRegs(SelectionDAG &DAG,
801 const SDLoc &dl, SDValue &Chain,
802 SDValue *Flag, const Value *V) const {
810 SmallVector<SDValue, 4> Values(ValueVTs.size());
811 SmallVector<SDValue, 8> Parts;
823 SDValue P;
886 void RegsForValue::getCopyToRegs(SDValue Val, SelectionDAG &DAG,
887 const SDLoc &dl, SDValue &Chain, SDValue *Flag,
887 const SDLoc &dl, SDValue &Chain, SDValue *Flag,
895 SmallVector<SDValue, 8> Parts(NumRegs);
913 SmallVector<SDValue, 8> Chains(NumRegs);
915 SDValue Part;
945 std::vector<SDValue> &Ops) const {
962 SDValue Res = DAG.getTargetConstant(Flag, dl, MVT::i32);
1034 SDValue SelectionDAGBuilder::getRoot() {
1039 SDValue Root = PendingLoads[0];
1046 SDValue Root = DAG.getTokenFactor(getCurSDLoc(), PendingLoads);
1052 SDValue SelectionDAGBuilder::getControlRoot() {
1053 SDValue Root = DAG.getRoot();
1160 SDValue Val) {
1297 SDValue N = NodeMap[V];
1370 SDValue SelectionDAGBuilder::getCopyFromRegs(const Value *V, Type *Ty) {
1372 SDValue Result;
1380 SDValue Chain = DAG.getEntryNode();
1390 SDValue SelectionDAGBuilder::getValue(const Value *V) {
1394 SDValue &N = NodeMap[V];
1399 if (SDValue copyFromReg = getCopyFromRegs(V, V->getType()))
1403 SDValue Val = getValueImpl(V);
1417 SDValue SelectionDAGBuilder::getNonRegisterValue(const Value *V) {
1419 SDValue &N = NodeMap[V];
1432 SDValue Val = getValueImpl(V);
1440 SDValue SelectionDAGBuilder::getValueImpl(const Value *V) {
1466 SDValue N1 = NodeMap[V];
1472 SmallVector<SDValue, 4> Constants;
1489 SmallVector<SDValue, 4> Ops;
1512 SmallVector<SDValue, 4> Constants(NumElts);
1534 SmallVector<SDValue, 16> Ops;
1543 SDValue Op;
1571 SDValue Chain = DAG.getEntryNode();
1628 SDValue Ret = DAG.getNode(ISD::CATCHRET, getCurSDLoc(), MVT::Other,
1755 SDValue Ret =
1767 SDValue Chain = getControlRoot();
1769 SmallVector<SDValue, 8> OutVals;
1796 SDValue RetPtr = DAG.getCopyFromReg(DAG.getEntryNode(), getCurSDLoc(),
1798 SDValue RetOp = getValue(I.getOperand(0));
1806 SmallVector<SDValue, 4> Chains(NumValues);
1810 SDValue Ptr = DAG.getObjectPtrOffset(getCurSDLoc(), RetPtr, Offsets[i]);
1812 SDValue Val = RetOp.getValue(RetOp.getResNo() + i);
1827 SDValue RetOp = getValue(I.getOperand(0));
1857 SmallVector<SDValue, 4> Parts(NumParts);
2312 SDValue Cond;
2313 SDValue CondLHS = getValue(CB.CmpLHS);
2339 SDValue True = DAG.getConstant(1, dl, CondLHS.getValueType());
2342 SDValue CondRHS = getValue(CB.CmpRHS);
2359 SDValue CmpOp = getValue(CB.CmpMHS);
2366 SDValue SUB = DAG.getNode(ISD::SUB, dl,
2385 SDValue True = DAG.getConstant(1, dl, Cond.getValueType());
2389 SDValue BrCond = DAG.getNode(ISD::BRCOND, dl,
2407 SDValue Index = DAG.getCopyFromReg(getControlRoot(), getCurSDLoc(),
2409 SDValue Table = DAG.getJumpTable(JT.JTI, PTy);
2410 SDValue BrJumpTable = DAG.getNode(ISD::BR_JT, getCurSDLoc(),
2424 SDValue SwitchOp = getValue(JTH.SValue);
2426 SDValue Sub = DAG.getNode(ISD::SUB, dl, VT, SwitchOp,
2439 SDValue CopyTo = DAG.getCopyToReg(getControlRoot(), dl,
2447 SDValue CMP = DAG.getSetCC(
2452 SDValue BrCond = DAG.getNode(ISD::BRCOND, dl,
2474 static SDValue getLoadStackGuard(SelectionDAG &DAG, const SDLoc &DL,
2475 SDValue &Chain) {
2513 SDValue Guard;
2515 SDValue StackSlotPtr = DAG.getFrameIndex(FI, PtrTy);
2520 SDValue GuardVal = DAG.getLoad(
2550 std::pair<SDValue, SDValue> Result = TLI.LowerCallTo(CLI);
2550 std::pair<SDValue, SDValue> Result = TLI.LowerCallTo(CLI);
2557 SDValue Chain = DAG.getEntryNode();
2562 SDValue GuardPtr = getValue(IRGuard);
2571 SDValue Sub = DAG.getNode(ISD::SUB, dl, VT, Guard, GuardVal);
2573 SDValue Cmp = DAG.getSetCC(dl, TLI.getSetCCResultType(DAG.getDataLayout(),
2580 SDValue BrCond = DAG.getNode(ISD::BRCOND, dl,
2584 SDValue Br = DAG.getNode(ISD::BR, dl,
2604 SDValue Chain =
2623 SDValue SwitchOp = getValue(B.SValue);
2625 SDValue RangeSub =
2642 SDValue Sub = RangeSub;
2650 SDValue CopyTo = DAG.getCopyToReg(getControlRoot(), dl, B.Reg, Sub);
2659 SDValue Root = CopyTo;
2662 SDValue RangeCmp = DAG.getSetCC(dl,
2688 SDValue ShiftOp = DAG.getCopyFromReg(getControlRoot(), dl, Reg, VT);
2689 SDValue Cmp;
2707 SDValue SwitchVal = DAG.getNode(ISD::SHL, dl, VT,
2711 SDValue AndOp = DAG.getNode(ISD::AND, dl,
2727 SDValue BrAnd = DAG.getNode(ISD::BRCOND, dl,
2776 SmallVector<SDValue, 8> Ops;
2885 SDValue Ops[2];
2902 SDValue Res = DAG.getNode(ISD::MERGE_VALUES, dl,
2966 SDValue Op2 = getValue(I.getOperand(1));
3105 SDValue Op = getValue(I.getOperand(0));
3106 SDValue UnNodeValue = DAG.getNode(Opcode, getCurSDLoc(), Op.getValueType(),
3125 SDValue Op1 = getValue(I.getOperand(0));
3126 SDValue Op2 = getValue(I.getOperand(1));
3127 SDValue BinNodeValue = DAG.getNode(Opcode, getCurSDLoc(), Op1.getValueType(),
3133 SDValue Op1 = getValue(I.getOperand(0));
3134 SDValue Op2 = getValue(I.getOperand(1));
3180 SDValue Res = DAG.getNode(Opcode, getCurSDLoc(), Op1.getValueType(), Op1, Op2,
3186 SDValue Op1 = getValue(I.getOperand(0));
3187 SDValue Op2 = getValue(I.getOperand(1));
3202 SDValue Op1 = getValue(I.getOperand(0));
3203 SDValue Op2 = getValue(I.getOperand(1));
3229 SDValue Op1 = getValue(I.getOperand(0));
3230 SDValue Op2 = getValue(I.getOperand(1));
3257 SmallVector<SDValue, 4> Values(NumValues);
3258 SDValue Cond = getValue(I.getOperand(0));
3259 SDValue LHSVal = getValue(I.getOperand(1));
3260 SDValue RHSVal = getValue(I.getOperand(2));
3365 SmallVector<SDValue, 3> Ops(BaseOps.begin(), BaseOps.end());
3380 SDValue N = getValue(I.getOperand(0));
3389 SDValue N = getValue(I.getOperand(0));
3398 SDValue N = getValue(I.getOperand(0));
3406 SDValue N = getValue(I.getOperand(0));
3417 SDValue N = getValue(I.getOperand(0));
3425 SDValue N = getValue(I.getOperand(0));
3433 SDValue N = getValue(I.getOperand(0));
3441 SDValue N = getValue(I.getOperand(0));
3449 SDValue N = getValue(I.getOperand(0));
3458 SDValue N = getValue(I.getOperand(0));
3472 SDValue N = getValue(I.getOperand(0));
3482 SDValue N = getValue(I.getOperand(0));
3506 SDValue N = getValue(SV);
3520 SDValue InVec = getValue(I.getOperand(0));
3521 SDValue InVal = getValue(I.getOperand(1));
3522 SDValue InIdx = DAG.getSExtOrTrunc(getValue(I.getOperand(2)), getCurSDLoc(),
3531 SDValue InVec = getValue(I.getOperand(0));
3532 SDValue InIdx = DAG.getSExtOrTrunc(getValue(I.getOperand(1)), getCurSDLoc(),
3540 SDValue Src1 = getValue(I.getOperand(0));
3541 SDValue Src2 = getValue(I.getOperand(1));
3551 SDValue FirstElt = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL,
3604 SmallVector<SDValue, 8> ConcatOps;
3624 SDValue UndefVal = DAG.getUNDEF(SrcVT);
3626 SmallVector<SDValue, 8> MOps1(NumConcat, UndefVal);
3627 SmallVector<SDValue, 8> MOps2(NumConcat, UndefVal);
3643 SDValue Result = DAG.getVectorShuffle(PaddedVT, DL, Src1, Src2, MappedOps);
3690 SDValue &Src = Input == 0 ? Src1 : Src2;
3720 SmallVector<SDValue,8> Ops;
3722 SDValue Res;
3727 SDValue &Src = Idx < (int)SrcNumElts ? Src1 : Src2;
3764 SmallVector<SDValue, 4> Values(NumAggValues);
3772 SDValue Agg = getValue(Op0);
3780 SDValue Val = getValue(Op1);
3820 SmallVector<SDValue, 4> Values(NumValValues);
3822 SDValue Agg = getValue(Op0);
3839 SDValue N = getValue(Op0);
3890 SDValue OffsVal = VectorWidth ?
3907 SDValue IdxN = getValue(Idx);
3927 SDValue Scale = DAG.getConstant(ElementSize.getZExtValue(), dl,
3959 SDValue AllocSize = getValue(I.getArraySize());
3990 SDValue Ops[] = {getRoot(), AllocSize, DAG.getConstant(Align, dl, IntPtr)};
3992 SDValue DSA = DAG.getNode(ISD::DYNAMIC_STACKALLOC, dl, VTs, Ops);
4019 SDValue Ptr = getValue(SV);
4041 SDValue Root;
4069 SmallVector<SDValue, 4> Values(NumValues);
4070 SmallVector<SDValue, 4> Chains(std::min(MaxParallelChains, NumValues));
4082 SDValue Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
4087 SDValue A = DAG.getNode(ISD::ADD, dl,
4102 SDValue L = DAG.getLoad(MemVTs[i], dl, Root, A,
4114 SDValue Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
4138 SDValue Src = getValue(SrcV);
4144 SDValue CopyNode = DAG.getCopyToReg(getRoot(), getCurSDLoc(), VReg,
4177 SDValue L = DAG.getCopyFromReg(
4217 SDValue Src = getValue(SrcV);
4218 SDValue Ptr = getValue(PtrV);
4220 SDValue Root = getRoot();
4221 SmallVector<SDValue, 4> Chains(std::min(MaxParallelChains, NumValues));
4244 SDValue Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
4249 SDValue Add = DAG.getNode(ISD::ADD, dl, PtrVT, Ptr,
4251 SDValue Val = SDValue(Src.getNode(), Src.getResNo() + i);
4254 SDValue St =
4260 SDValue StoreNode = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
4293 SDValue Ptr = getValue(PtrOperand);
4294 SDValue Src0 = getValue(Src0Operand);
4295 SDValue Mask = getValue(MaskOperand);
4309 SDValue StoreNode = DAG.getMaskedStore(getRoot(), sdl, Src0, Ptr, Mask, VT,
4331 static bool getUniformBase(const Value *&Ptr, SDValue &Base, SDValue &Index,
4331 static bool getUniformBase(const Value *&Ptr, SDValue &Base, SDValue &Index,
4332 ISD::MemIndexType &IndexType, SDValue &Scale,
4389 SDValue Src0 = getValue(I.getArgOperand(0));
4390 SDValue Mask = getValue(I.getArgOperand(3));
4400 SDValue Base;
4401 SDValue Index;
4403 SDValue Scale;
4419 SDValue Ops[] = { getRoot(), Src0, Mask, Base, Index, Scale };
4420 SDValue Scatter = DAG.getMaskedScatter(DAG.getVTList(MVT::Other), VT, sdl,
4453 SDValue Ptr = getValue(PtrOperand);
4454 SDValue Src0 = getValue(Src0Operand);
4455 SDValue Mask = getValue(MaskOperand);
4475 SDValue InChain = AddToChain ? DAG.getRoot() : DAG.getEntryNode();
4483 SDValue Load = DAG.getMaskedLoad(VT, sdl, InChain, Ptr, Mask, Src0, VT, MMO,
4495 SDValue Src0 = getValue(I.getArgOperand(3));
4496 SDValue Mask = getValue(I.getArgOperand(2));
4508 SDValue Root = DAG.getRoot();
4509 SDValue Base;
4510 SDValue Index;
4512 SDValue Scale;
4540 SDValue Ops[] = { Root, Src0, Mask, Base, Index, Scale };
4541 SDValue Gather = DAG.getMaskedGather(DAG.getVTList(VT, MVT::Other), VT, sdl,
4544 SDValue OutChain = Gather.getValue(1);
4556 SDValue InChain = getRoot();
4575 SDValue L = DAG.getAtomicCmpSwap(ISD::ATOMIC_CMP_SWAP_WITH_SUCCESS,
4581 SDValue OutChain = L.getValue(2);
4609 SDValue InChain = getRoot();
4625 SDValue L =
4630 SDValue OutChain = L.getValue(1);
4639 SDValue Ops[3];
4653 SDValue InChain = getRoot();
4684 SDValue Ptr = getValue(I.getPointerOperand());
4689 SDValue L = DAG.getLoad(MemVT, dl, InChain, Ptr, MMO);
4694 SDValue OutChain = L.getValue(1);
4702 SDValue L = DAG.getAtomic(ISD::ATOMIC_LOAD, dl, MemVT, MemVT, InChain,
4705 SDValue OutChain = L.getValue(1);
4719 SDValue InChain = getRoot();
4739 SDValue Val = getValue(I.getValueOperand());
4742 SDValue Ptr = getValue(I.getPointerOperand());
4747 SDValue S = DAG.getStore(InChain, dl, Val, Ptr, MMO);
4751 SDValue OutChain = DAG.getAtomic(ISD::ATOMIC_STORE, dl, MemVT, InChain,
4770 SmallVector<SDValue, 8> Ops;
4822 SDValue Result;
4840 SDValue Chain = Result.getValue(Result.getNode()->getNumValues()-1);
4864 static SDValue GetSignificand(SelectionDAG &DAG, SDValue Op, const SDLoc &dl) {
4864 static SDValue GetSignificand(SelectionDAG &DAG, SDValue Op, const SDLoc &dl) {
4865 SDValue t1 = DAG.getNode(ISD::AND, dl, MVT::i32, Op,
4867 SDValue t2 = DAG.getNode(ISD::OR, dl, MVT::i32, t1,
4877 static SDValue GetExponent(SelectionDAG &DAG, SDValue Op,
4877 static SDValue GetExponent(SelectionDAG &DAG, SDValue Op,
4879 SDValue t0 = DAG.getNode(ISD::AND, dl, MVT::i32, Op,
4881 SDValue t1 = DAG.getNode(
4884 SDValue t2 = DAG.getNode(ISD::SUB, dl, MVT::i32, t1,
4890 static SDValue getF32Constant(SelectionDAG &DAG, unsigned Flt,
4896 static SDValue getLimitedPrecisionExp2(SDValue t0, const SDLoc &dl,
4896 static SDValue getLimitedPrecisionExp2(SDValue t0, const SDLoc &dl,
4901 SDValue IntegerPartOfX = DAG.getNode(ISD::FP_TO_SINT, dl, MVT::i32, t0);
4904 SDValue t1 = DAG.getNode(ISD::SINT_TO_FP, dl, MVT::f32, IntegerPartOfX);
4905 SDValue X = DAG.getNode(ISD::FSUB, dl, MVT::f32, t0, t1);
4913 SDValue TwoToFractionalPartOfX;
4922 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
4924 SDValue t3 = DAG.getNode(ISD::FADD, dl, MVT::f32, t2,
4926 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
4938 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
4940 SDValue t3 = DAG.getNode(ISD::FADD, dl, MVT::f32, t2,
4942 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
4943 SDValue t5 = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
4945 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
4959 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
4961 SDValue t3 = DAG.getNode(ISD::FADD, dl, MVT::f32, t2,
4963 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
4964 SDValue t5 = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
4966 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
4967 SDValue t7 = DAG.getNode(ISD::FADD, dl, MVT::f32, t6,
4969 SDValue t8 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t7, X);
4970 SDValue t9 = DAG.getNode(ISD::FADD, dl, MVT::f32, t8,
4972 SDValue t10 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t9, X);
4973 SDValue t11 = DAG.getNode(ISD::FADD, dl, MVT::f32, t10,
4975 SDValue t12 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t11, X);
4981 SDValue t13 = DAG.getNode(ISD::BITCAST, dl, MVT::i32, TwoToFractionalPartOfX);
4988 static SDValue expandExp(const SDLoc &dl, SDValue Op, SelectionDAG &DAG,
4988 static SDValue expandExp(const SDLoc &dl, SDValue Op, SelectionDAG &DAG,
4999 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, Op,
5010 static SDValue expandLog(const SDLoc &dl, SDValue Op, SelectionDAG &DAG,
5010 static SDValue expandLog(const SDLoc &dl, SDValue Op, SelectionDAG &DAG,
5016 SDValue Op1 = DAG.getNode(ISD::BITCAST, dl, MVT::i32, Op);
5019 SDValue Exp = GetExponent(DAG, Op1, TLI, dl);
5020 SDValue LogOfExponent =
5026 SDValue X = GetSignificand(DAG, Op1, dl);
5028 SDValue LogOfMantissa;
5037 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5039 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5041 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5054 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5056 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5058 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5059 SDValue t3 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5061 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5062 SDValue t5 = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5064 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5079 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5081 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5083 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5084 SDValue t3 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5086 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5087 SDValue t5 = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5089 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5090 SDValue t7 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t6,
5092 SDValue t8 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t7, X);
5093 SDValue t9 = DAG.getNode(ISD::FADD, dl, MVT::f32, t8,
5095 SDValue t10 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t9, X);
5109 static SDValue expandLog2(const SDLoc &dl, SDValue Op, SelectionDAG &DAG,
5109 static SDValue expandLog2(const SDLoc &dl, SDValue Op, SelectionDAG &DAG,
5115 SDValue Op1 = DAG.getNode(ISD::BITCAST, dl, MVT::i32, Op);
5118 SDValue LogOfExponent = GetExponent(DAG, Op1, TLI, dl);
5122 SDValue X = GetSignificand(DAG, Op1, dl);
5126 SDValue Log2ofMantissa;
5133 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5135 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5137 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5150 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5152 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5154 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5155 SDValue t3 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5157 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5158 SDValue t5 = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5160 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5176 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5178 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5180 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5181 SDValue t3 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5183 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5184 SDValue t5 = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5186 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5187 SDValue t7 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t6,
5189 SDValue t8 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t7, X);
5190 SDValue t9 = DAG.getNode(ISD::FADD, dl, MVT::f32, t8,
5192 SDValue t10 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t9, X);
5206 static SDValue expandLog10(const SDLoc &dl, SDValue Op, SelectionDAG &DAG,
5206 static SDValue expandLog10(const SDLoc &dl, SDValue Op, SelectionDAG &DAG,
5212 SDValue Op1 = DAG.getNode(ISD::BITCAST, dl, MVT::i32, Op);
5215 SDValue Exp = GetExponent(DAG, Op1, TLI, dl);
5216 SDValue LogOfExponent = DAG.getNode(ISD::FMUL, dl, MVT::f32, Exp,
5221 SDValue X = GetSignificand(DAG, Op1, dl);
5223 SDValue Log10ofMantissa;
5232 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5234 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5236 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5248 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5250 SDValue t1 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t0,
5252 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5253 SDValue t3 = DAG.getNode(ISD::FADD, dl, MVT::f32, t2,
5255 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5269 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5271 SDValue t1 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t0,
5273 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5274 SDValue t3 = DAG.getNode(ISD::FADD, dl, MVT::f32, t2,
5276 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5277 SDValue t5 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t4,
5279 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5280 SDValue t7 = DAG.getNode(ISD::FADD, dl, MVT::f32, t6,
5282 SDValue t8 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t7, X);
5296 static SDValue expandExp2(const SDLoc &dl, SDValue Op, SelectionDAG &DAG,
5296 static SDValue expandExp2(const SDLoc &dl, SDValue Op, SelectionDAG &DAG,
5308 static SDValue expandPow(const SDLoc &dl, SDValue LHS, SDValue RHS,
5308 static SDValue expandPow(const SDLoc &dl, SDValue LHS, SDValue RHS,
5308 static SDValue expandPow(const SDLoc &dl, SDValue LHS, SDValue RHS,
5326 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, RHS,
5336 static SDValue ExpandPowI(const SDLoc &DL, SDValue LHS, SDValue RHS,
5336 static SDValue ExpandPowI(const SDLoc &DL, SDValue LHS, SDValue RHS,
5336 static SDValue ExpandPowI(const SDLoc &DL, SDValue LHS, SDValue RHS,
5360 SDValue Res; // Logically starts equal to 1.0
5361 SDValue CurSquare = LHS;
5393 const SDValue &N) {
5396 SDValue Op = N.getOperand(1);
5410 for (SDValue Op : N->op_values())
5423 DILocation *DL, bool IsDbgDeclare, const SDValue &N) {
5524 SDValue LCandidate = peekThroughBitcasts(N);
5587 SDDbgValue *SelectionDAGBuilder::getDbgValue(SDValue N,
5632 SDValue Callee = DAG.getExternalSymbol(
5644 SDValue Res;
5674 SDValue Chain = getRoot();
5675 SDValue RegName =
5687 SDValue Chain = getRoot();
5688 SDValue RegName =
5702 SDValue Op1 = getValue(I.getArgOperand(0));
5703 SDValue Op2 = getValue(I.getArgOperand(1));
5704 SDValue Op3 = getValue(I.getArgOperand(2));
5713 SDValue MC = DAG.getMemcpy(getRoot(), sdl, Op1, Op2, Op3, Align, isVol,
5722 SDValue Op1 = getValue(I.getArgOperand(0));
5723 SDValue Op2 = getValue(I.getArgOperand(1));
5724 SDValue Op3 = getValue(I.getArgOperand(2));
5729 SDValue MS = DAG.getMemset(getRoot(), sdl, Op1, Op2, Op3, Align, isVol,
5736 SDValue Op1 = getValue(I.getArgOperand(0));
5737 SDValue Op2 = getValue(I.getArgOperand(1));
5738 SDValue Op3 = getValue(I.getArgOperand(2));
5747 SDValue MM = DAG.getMemmove(getRoot(), sdl, Op1, Op2, Op3, Align, isVol,
5755 SDValue Dst = getValue(MI.getRawDest());
5756 SDValue Src = getValue(MI.getRawSource());
5757 SDValue Length = getValue(MI.getLength());
5764 SDValue MC = DAG.getAtomicMemcpy(getRoot(), sdl, Dst, DstAlign, Src,
5773 SDValue Dst = getValue(MI.getRawDest());
5774 SDValue Src = getValue(MI.getRawSource());
5775 SDValue Length = getValue(MI.getLength());
5782 SDValue MC = DAG.getAtomicMemmove(getRoot(), sdl, Dst, DstAlign, Src,
5791 SDValue Dst = getValue(MI.getRawDest());
5792 SDValue Val = getValue(MI.getValue());
5793 SDValue Length = getValue(MI.getLength());
5799 SDValue MC = DAG.getAtomicMemset(getRoot(), sdl, Dst, DstAlign, Val, Length,
5850 SDValue &N = NodeMap[Address];
5964 SDValue Ops[2];
5967 SDValue Op = DAG.getNode(ISD::EH_SJLJ_SETJMP, sdl,
6154 SDValue Mul = DAG.getNode(ISD::FMUL, sdl,
6158 SDValue Add = DAG.getNode(ISD::FADD, sdl,
6180 SDValue Tmp = getValue(I.getArgOperand(0));
6185 SDValue Op = getRoot();
6203 SDValue Arg = getValue(I.getArgOperand(0));
6211 SDValue Arg = getValue(I.getArgOperand(0));
6219 SDValue Arg = getValue(I.getArgOperand(0));
6227 SDValue X = getValue(I.getArgOperand(0));
6228 SDValue Y = getValue(I.getArgOperand(1));
6229 SDValue Z = getValue(I.getArgOperand(2));
6231 SDValue BitWidthC = DAG.getConstant(VT.getScalarSizeInBits(), sdl, VT);
6232 SDValue Zero = DAG.getConstant(0, sdl, VT);
6233 SDValue ShAmt = DAG.getNode(ISD::UREM, sdl, VT, Z, BitWidthC);
6255 SDValue NegShAmt = DAG.getNode(ISD::SUB, sdl, VT, Zero, Z);
6262 SDValue NegZ = DAG.getNode(ISD::SUB, sdl, VT, Zero, Z);
6263 SDValue NShAmt = DAG.getNode(ISD::UREM, sdl, VT, NegZ, BitWidthC);
6264 SDValue ShX = DAG.getNode(ISD::SHL, sdl, VT, X, IsFSHL ? ShAmt : NShAmt);
6265 SDValue ShY = DAG.getNode(ISD::SRL, sdl, VT, X, IsFSHL ? NShAmt : ShAmt);
6272 SDValue InvShAmt = DAG.getNode(ISD::SUB, sdl, VT, BitWidthC, ShAmt);
6273 SDValue ShX = DAG.getNode(ISD::SHL, sdl, VT, X, IsFSHL ? ShAmt : InvShAmt);
6274 SDValue ShY = DAG.getNode(ISD::SRL, sdl, VT, Y, IsFSHL ? InvShAmt : ShAmt);
6275 SDValue Or = DAG.getNode(ISD::OR, sdl, VT, ShX, ShY);
6285 SDValue IsZeroShift = DAG.getSetCC(sdl, CCVT, ShAmt, Zero, ISD::SETEQ);
6290 SDValue Op1 = getValue(I.getArgOperand(0));
6291 SDValue Op2 = getValue(I.getArgOperand(1));
6296 SDValue Op1 = getValue(I.getArgOperand(0));
6297 SDValue Op2 = getValue(I.getArgOperand(1));
6302 SDValue Op1 = getValue(I.getArgOperand(0));
6303 SDValue Op2 = getValue(I.getArgOperand(1));
6308 SDValue Op1 = getValue(I.getArgOperand(0));
6309 SDValue Op2 = getValue(I.getArgOperand(1));
6315 SDValue Op1 = getValue(I.getArgOperand(0));
6316 SDValue Op2 = getValue(I.getArgOperand(1));
6317 SDValue Op3 = getValue(I.getArgOperand(2));
6323 SDValue Op1 = getValue(I.getArgOperand(0));
6324 SDValue Op2 = getValue(I.getArgOperand(1));
6325 SDValue Op3 = getValue(I.getArgOperand(2));
6331 SDValue Op1 = getValue(I.getArgOperand(0));
6332 SDValue Op2 = getValue(I.getArgOperand(1));
6333 SDValue Op3 = getValue(I.getArgOperand(2));
6339 SDValue Op = getRoot();
6352 SDValue Op = getRoot();
6370 SDValue Chain = getRoot();
6391 SDValue Src, Chain = getRoot();
6403 SDValue FIN = DAG.getFrameIndex(FI, PtrTy);
6447 SDValue Ops[6];
6509 std::pair<SDValue, SDValue> Result = TLI.LowerCallTo(CLI);
6509 std::pair<SDValue, SDValue> Result = TLI.LowerCallTo(CLI);
6530 SDValue Op1 = getValue(I.getArgOperand(0));
6531 SDValue Op2 = getValue(I.getArgOperand(1));
6544 SDValue Ops[5];
6552 SDValue Result = DAG.getMemIntrinsicNode(ISD::PREFETCH, sdl,
6681 SDValue OffsetSym = DAG.getMCSymbol(FrameAllocSym, PtrVT);
6682 SDValue OffsetVal =
6687 SDValue FPVal = getValue(FP);
6688 SDValue Add = DAG.getNode(ISD::ADD, sdl, PtrVT, FPVal, OffsetVal);
6701 SDValue N =
6717 SmallVector<SDValue, 8> Ops;
6720 SDValue LogEntryVal = getValue(I.getArgOperand(0));
6721 SDValue StrSizeVal = getValue(I.getArgOperand(1));
6723 SDValue Chain = getRoot();
6734 SDValue patchableNode = SDValue(MN, 0);
6748 SmallVector<SDValue, 8> Ops;
6753 SDValue LogTypeId = getValue(I.getArgOperand(0));
6754 SDValue LogEntryVal = getValue(I.getArgOperand(1));
6755 SDValue StrSizeVal = getValue(I.getArgOperand(2));
6757 SDValue Chain = getRoot();
6769 SDValue patchableNode = SDValue(MN, 0);
6795 SmallVector<SDValue, 16> Ops;
6808 SDValue Target;
6819 SDValue Val = getValue(I.getArgOperand(Op + 1));
6839 SDValue N(DAG.getMachineNode(TargetOpcode::ICALL_BRANCH_FUNNEL,
6858 SDValue Val = TSI.EmitTargetCodeForSetTag(
6867 SDValue Ptr = getValue(I.getOperand(0));
6868 SDValue Const = getValue(I.getOperand(1));
6984 SDValue Chain = getRoot();
6990 SDValue Result;
7017 SDValue OutChain = Result.getValue(1);
7019 SDValue FPResult = Result.getValue(0);
7023 std::pair<SDValue, SDValue>
7023 std::pair<SDValue, SDValue>
7054 std::pair<SDValue, SDValue> Result = TLI.LowerCallTo(CLI);
7054 std::pair<SDValue, SDValue> Result = TLI.LowerCallTo(CLI);
7096 void SelectionDAGBuilder::LowerCallTo(ImmutableCallSite CS, SDValue Callee,
7126 SDValue ArgNode = getValue(V);
7154 SDValue ArgNode = getValue(V);
7177 std::pair<SDValue, SDValue> Result = lowerInvokable(CLI, EHPadBB);
7177 std::pair<SDValue, SDValue> Result = lowerInvokable(CLI, EHPadBB);
7190 SDValue Src = CLI.InVals.back();
7193 SDValue CopyNode = CLI.DAG.getCopyToReg(Result.second, CLI.DL, VReg, Src);
7198 static SDValue getMemCmpLoad(const Value *PtrVal, MVT LoadVT,
7219 SDValue Root;
7231 SDValue Ptr = Builder.getValue(PtrVal);
7232 SDValue LoadVal = Builder.DAG.getLoad(LoadVT, Builder.getCurSDLoc(), Root,
7244 SDValue Value,
7272 std::pair<SDValue, SDValue> Res = TSI.EmitTargetCodeForMemcmp(
7272 std::pair<SDValue, SDValue> Res = TSI.EmitTargetCodeForMemcmp(
7332 SDValue LoadL = getMemCmpLoad(LHS, LoadVT, *this);
7333 SDValue LoadR = getMemCmpLoad(RHS, LoadVT, *this);
7342 SDValue Cmp = DAG.getSetCC(getCurSDLoc(), MVT::i1, LoadL, LoadR, ISD::SETNE);
7358 std::pair<SDValue, SDValue> Res =
7358 std::pair<SDValue, SDValue> Res =
7377 SDValue Dst = getValue(I.getArgOperand(0));
7378 SDValue Src = getValue(I.getArgOperand(1));
7379 SDValue Size = getValue(I.getArgOperand(2));
7393 SDValue MC = DAG.getMemcpy(getRoot(), sdl, Dst, Src, Size, Align, isVol,
7405 SDValue DstPlusSize = DAG.getNode(ISD::ADD, sdl, Dst.getValueType(),
7420 std::pair<SDValue, SDValue> Res =
7420 std::pair<SDValue, SDValue> Res =
7443 std::pair<SDValue, SDValue> Res =
7443 std::pair<SDValue, SDValue> Res =
7466 std::pair<SDValue, SDValue> Res =
7466 std::pair<SDValue, SDValue> Res =
7487 std::pair<SDValue, SDValue> Res =
7487 std::pair<SDValue, SDValue> Res =
7511 SDValue Tmp = getValue(I.getArgOperand(0));
7527 SDValue Tmp0 = getValue(I.getArgOperand(0));
7528 SDValue Tmp1 = getValue(I.getArgOperand(1));
7570 SDValue LHS = getValue(I.getArgOperand(0));
7571 SDValue RHS = getValue(I.getArgOperand(1));
7708 SDValue Callee = getValue(I.getCalledValue());
7728 SDValue CallOperand;
7835 static SDValue getAddressForMemoryInput(SDValue Chain, const SDLoc &Location,
7835 static SDValue getAddressForMemoryInput(SDValue Chain, const SDLoc &Location,
7864 SDValue StackSlot = DAG.getFrameIndex(SSFI, TLI.getFrameIndexTy(DL));
7986 const std::vector<SDValue> &AsmNodeOperands) {
8126 SDValue Flag, Chain = (HasSideEffect) ? getRoot() : DAG.getRoot();
8175 std::vector<SDValue> AsmNodeOperands;
8244 SDValue InOperandVal = OpInfo.CallOperand;
8313 std::vector<SDValue> Ops;
8412 SmallVector<SDValue, 1> ResultValues;
8413 SmallVector<SDValue, 8> OutChains;
8456 SDValue Val;
8482 SDValue Store = DAG.getStore(Chain, getCurSDLoc(), Val, getValue(Ptr),
8489 for (const SDValue &V : Val->op_values())
8504 SDValue V = DAG.getNode(ISD::MERGE_VALUES, getCurSDLoc(),
8531 SmallVector<SDValue, 1> Ops;
8548 SDValue V = DAG.getVAArg(
8576 SDValue SelectionDAGBuilder::lowerRangeToAssertZExt(SelectionDAG &DAG,
8578 SDValue Op) {
8599 SDValue ZExt = DAG.getNode(ISD::AssertZext, SL, Op.getValueType(), Op,
8605 SmallVector<SDValue, 4> Ops;
8622 unsigned ArgIdx, unsigned NumArgs, SDValue Callee, Type *ReturnTy,
8667 const SDLoc &DL, SmallVectorImpl<SDValue> &Ops,
8670 SDValue OpVal = Builder.getValue(CS.getArgument(i));
8692 SDValue Chain, InFlag, Callee, NullPtr;
8693 SmallVector<SDValue, 32> Ops;
8713 SDValue IDVal = getValue(CI.getOperand(PatchPointOpers::IDPos));
8716 SDValue NBytesVal = getValue(CI.getOperand(PatchPointOpers::NBytesPos));
8762 SDValue Callee = getValue(CS->getOperand(PatchPointOpers::TargetPos));
8774 SDValue NArgVal = getValue(CS.getArgument(PatchPointOpers::NArgPos));
8791 std::pair<SDValue, SDValue> Result = lowerInvokable(CLI, EHPadBB);
8791 std::pair<SDValue, SDValue> Result = lowerInvokable(CLI, EHPadBB);
8805 SmallVector<SDValue, 8> Ops;
8808 SDValue IDVal = getValue(CS->getOperand(PatchPointOpers::IDPos));
8811 SDValue NBytesVal = getValue(CS->getOperand(PatchPointOpers::NBytesPos));
8888 SDValue From[] = {SDValue(Call, 0), SDValue(Call, 1)};
8889 SDValue To[] = {SDValue(MN, 1), SDValue(MN, 2)};
8902 SDValue Op1 = getValue(I.getArgOperand(0));
8903 SDValue Op2;
8908 SDValue Res;
8986 std::pair<SDValue, SDValue>
8986 std::pair<SDValue, SDValue>
9022 SDValue DemoteStackSlot;
9124 SDValue Op = SDValue(Args[i].Node.getNode(),
9200 SmallVector<SDValue, 4> Parts(NumParts);
9258 SmallVector<SDValue, 4> InVals;
9289 SmallVector<SDValue, 4> ReturnValues;
9302 SmallVector<SDValue, 4> Chains(NumValues);
9310 SDValue Add = CLI.DAG.getNode(ISD::ADD, CLI.DL, PtrVT, DemoteStackSlot,
9313 SDValue L = CLI.DAG.getLoad(
9352 SDValue Res = CLI.DAG.getNode(ISD::MERGE_VALUES, CLI.DL,
9358 SmallVectorImpl<SDValue> &Results,
9360 if (SDValue Res = LowerOperation(SDValue(N, 0), DAG))
9364 SDValue TargetLowering::LowerOperation(SDValue Op, SelectionDAG &DAG) const {
9364 SDValue TargetLowering::LowerOperation(SDValue Op, SelectionDAG &DAG) const {
9370 SDValue Op = getNonRegisterValue(V);
9382 SDValue Chain = DAG.getEntryNode();
9511 FunctionLoweringInfo *FuncInfo, SmallVectorImpl<SDValue> &Chains,
9515 SDValue ArgVal, bool &ArgHasUses) {
9728 SmallVector<SDValue, 8> InVals;
9729 SDValue NewRoot = TLI->LowerFormalArguments(
9762 SDValue ArgValue = getCopyFromParts(DAG, dl, &InVals[0], 1, RegVT, VT,
9778 SmallVector<SDValue, 4> Chains;
9781 SmallVector<SDValue, 4> ArgValues;
9846 SDValue Res = DAG.getMergeValues(makeArrayRef(ArgValues.data(), NumValues),
10034 void SelectionDAGBuilder::updateDAGForMaybeTailCall(SDValue MaybeTC) {
10074 SDValue CondLHS = getValue(Cond);
10078 SDValue Or = DAG.getNode(ISD::OR, DL, VT, CondLHS,
10080 SDValue Cond = DAG.getSetCC(
10097 SDValue BrCond =
lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h 100 DenseMap<const Value*, SDValue> NodeMap;
104 DenseMap<const Value*, SDValue> UnusedArgNodeMap;
133 SmallVector<SDValue, 8> PendingLoads;
144 SmallVector<SDValue, 8> PendingExports;
451 SDValue getRoot();
456 SDValue getControlRoot();
474 SDValue getCopyFromRegs(const Value *V, Type *Ty);
484 void resolveDanglingDebugInfo(const Value *V, SDValue Val);
500 SDValue getValue(const Value *V);
510 SDValue getNonRegisterValue(const Value *V);
511 SDValue getValueImpl(const Value *V);
513 void setValue(const Value *V, SDValue NewN) {
514 SDValue &N = NodeMap[V];
519 void setUnusedArgValue(const Value *V, SDValue NewN) {
520 SDValue &N = UnusedArgNodeMap[V];
540 void LowerCallTo(ImmutableCallSite CS, SDValue Callee, bool IsTailCall,
545 SDValue lowerRangeToAssertZExt(SelectionDAG &DAG, const Instruction &I,
546 SDValue Op);
550 unsigned NumArgs, SDValue Callee,
553 std::pair<SDValue, SDValue>
553 std::pair<SDValue, SDValue>
606 SDValue LowerAsSTATEPOINT(StatepointLoweringInfo &SI);
613 void LowerCallSiteWithDeoptBundle(const CallBase *Call, SDValue Callee,
619 void LowerCallSiteWithDeoptBundleImpl(const CallBase *Call, SDValue Callee,
773 SDValue Value, bool IsSigned);
784 bool IsDbgDeclare, const SDValue &N);
791 void updateDAGForMaybeTailCall(SDValue MaybeTC);
794 SDDbgValue *getDbgValue(SDValue N, DILocalVariable *Variable,
861 SDValue getCopyFromRegs(SelectionDAG &DAG, FunctionLoweringInfo &FuncInfo,
862 const SDLoc &dl, SDValue &Chain, SDValue *Flag,
862 const SDLoc &dl, SDValue &Chain, SDValue *Flag,
870 void getCopyToRegs(SDValue Val, SelectionDAG &DAG, const SDLoc &dl,
871 SDValue &Chain, SDValue *Flag, const Value *V = nullptr,
871 SDValue &Chain, SDValue *Flag, const Value *V = nullptr,
879 SelectionDAG &DAG, std::vector<SDValue> &Ops) const;
lib/CodeGen/SelectionDAG/SelectionDAGDumper.cpp 804 for (const SDValue &Op : N->op_values()) {
851 const SDValue Value) {
885 const SDValue Op = N->getOperand(i);
894 for (const SDValue &Op : N->op_values())
922 for (const SDValue &Op : N->op_values()) {
lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp 753 for (const SDValue &Op : N->op_values())
766 SDValue Src = N->getOperand(2);
1137 for (const SDValue &Op : N->op_values()) {
1971 bool SelectionDAGISel::CheckAndMask(SDValue LHS, ConstantSDNode *RHS,
2000 bool SelectionDAGISel::CheckOrMask(SDValue LHS, ConstantSDNode *RHS,
2030 void SelectionDAGISel::SelectInlineAsmMemoryOperands(std::vector<SDValue> &Ops,
2032 std::vector<SDValue> InOps;
2067 std::vector<SDValue> SelOps;
2114 for (const SDValue &Op : ImmedUse->op_values()) {
2127 for (const SDValue &Op : Root->op_values()) {
2143 bool SelectionDAGISel::IsProfitableToFold(SDValue N, SDNode *U,
2151 bool SelectionDAGISel::IsLegalToFold(SDValue N, SDNode *U, SDNode *Root,
2221 std::vector<SDValue> Ops(N->op_begin(), N->op_end());
2225 SDValue New = CurDAG->getNode(Branch ? ISD::INLINEASM_BR : ISD::INLINEASM, DL, VTs, Ops);
2238 SDValue New = CurDAG->getCopyFromReg(
2252 SDValue New = CurDAG->getCopyToReg(
2283 SDNode *NodeToMatch, SDValue InputChain,
2309 SDValue ChainVal = SDValue(ChainNode, ChainNode->getNumValues()-1);
2340 static SDValue
2346 SmallVector<SDValue, 3> InputChains;
2355 std::function<void(const SDValue)> AddChains = [&](const SDValue V) {
2363 for (const SDValue &Op : V->op_values())
2385 for (SDValue V : InputChains)
2402 ArrayRef<SDValue> Ops, unsigned EmitNodeInfo) {
2463 SDValue N,
2464 const SmallVectorImpl<std::pair<SDValue, SDNode*>> &RecordedNodes) {
2474 SDValue N,
2475 const SmallVectorImpl<std::pair<SDValue, SDNode*>> &RecordedNodes,
2506 CheckType(const unsigned char *MatcherTable, unsigned &MatcherIndex, SDValue N,
2517 SDValue N, const TargetLowering *TLI, const DataLayout &DL,
2527 SDValue N) {
2534 SDValue N) {
2542 SDValue N, const TargetLowering *TLI, const DataLayout &DL) {
2553 SDValue N) {
2564 SDValue N, unsigned ChildNo) {
2572 SDValue N, const SelectionDAGISel &SDISel) {
2585 SDValue N, const SelectionDAGISel &SDISel) {
2603 unsigned Index, SDValue N,
2606 SmallVectorImpl<std::pair<SDValue, SDNode*>> &RecordedNodes) {
2689 SmallVector<SDValue, 4> NodeStack;
2698 SDValue InputChain, InputGlue;
2711 SmallVectorImpl<std::pair<SDValue, SDNode *>> &RecordedNodes;
2716 SmallVectorImpl<std::pair<SDValue, SDNode *>> &RN,
2740 for (auto &J : I.NodeStack)
2804 SmallVector<SDValue, 8> NodeStack;
2805 SDValue N = SDValue(NodeToMatch, 0);
2815 SmallVector<std::pair<SDValue, SDNode*>, 8> RecordedNodes;
2824 SDValue InputChain, InputGlue;
3025 SmallVector<SDValue, 8> Operands;
3235 SDValue Imm = RecordedNodes[RecNo].first;
3347 SDValue Res = RunSDNodeXForm(RecordedNodes[RecNo].first, XFormNo);
3403 SmallVector<SDValue, 8> Ops;
3424 SDValue V = NodeToMatch->getOperand(i);
3534 SDValue Res = RecordedNodes[ResSlot].first;
lib/CodeGen/SelectionDAG/SelectionDAGPrinter.cpp 97 SDValue Op = EI.getNode()->getOperand(EI.getOperand());
lib/CodeGen/SelectionDAG/StatepointLowering.cpp 64 static void pushStackMapConstant(SmallVectorImpl<SDValue>& Ops,
92 SDValue
125 SDValue SpillSlot = Builder.DAG.CreateStackTemporary(ValueType);
225 SDValue Incoming = Builder.getValue(IncomingValue);
233 SDValue OldLocation = Builder.StatepointLowering.getLocation(Incoming);
266 SDValue Loc =
281 DenseMap<SDValue, const Value *> Seen;
286 SDValue SD = Builder.getValue(Ptrs[i]);
313 static std::pair<SDValue, SDNode *> lowerCallFromStatepointLoweringInfo(
315 SelectionDAGBuilder &Builder, SmallVectorImpl<SDValue> &PendingExports) {
316 SDValue ReturnValue, CallEndVal;
367 static std::tuple<SDValue, SDValue, MachineMemOperand*>
367 static std::tuple<SDValue, SDValue, MachineMemOperand*>
368 spillIncomingStatepointValue(SDValue Incoming, SDValue Chain,
368 spillIncomingStatepointValue(SDValue Incoming, SDValue Chain,
370 SDValue Loc = Builder.StatepointLowering.getLocation(Incoming);
414 static void lowerIncomingStatepointValue(SDValue Incoming, bool LiveInOnly,
415 SmallVectorImpl<SDValue> &Ops,
421 SDValue Chain = Builder.getRoot();
477 lowerStatepointMetaArgs(SmallVectorImpl<SDValue> &Ops,
551 SDValue Incoming;
586 SDValue Incoming = Builder.getValue(V);
608 SDValue SDV = Builder.getValue(V);
609 SDValue Loc = Builder.StatepointLowering.getLocation(SDV);
634 SDValue SelectionDAGBuilder::LowerAsSTATEPOINT(
662 SmallVector<SDValue, 10> LoweredMetaArgs;
671 SDValue ReturnVal;
680 SDValue Chain = CallNode->getOperand(0);
682 SDValue Glue;
700 SmallVector<SDValue, 8> TSOps;
718 SDValue GCTransitionStart =
728 SmallVector<SDValue, 40> Ops;
742 SDValue CallTarget = SDValue(CallNode->getOperand(1).getNode(), 0);
791 SmallVector<SDValue, 8> TEOps;
808 SDValue GCTransitionStart =
848 SDValue ActualCallee;
888 SDValue ReturnValue = LowerAsSTATEPOINT(SI);
907 SDValue Chain = DAG.getEntryNode();
926 const CallBase *Call, SDValue Callee, const BasicBlock *EHPadBB,
952 if (SDValue ReturnVal = LowerAsSTATEPOINT(SI)) {
959 const CallBase *Call, SDValue Callee, const BasicBlock *EHPadBB) {
981 SDValue CopyFromReg = getCopyFromRegs(I, RetTy);
1005 SDValue SD = getValue(DerivedPtr);
1020 SDValue SpillSlot = DAG.getTargetFrameIndex(Index, getFrameIndexTy());
1025 SDValue Chain = getRoot();
1038 SDValue SpillLoad = DAG.getLoad(LoadVT, getCurSDLoc(), Chain,
1049 SDValue Callee = DAG.getExternalSymbol(TLI.getLibcallName(RTLIB::DEOPTIMIZE),
lib/CodeGen/SelectionDAG/StatepointLowering.h 52 SDValue getLocation(SDValue Val) {
52 SDValue getLocation(SDValue Val) {
59 void setLocation(SDValue Val, SDValue Location) {
59 void setLocation(SDValue Val, SDValue Location) {
92 SDValue allocateStackSlot(EVT ValueType, SelectionDAGBuilder &Builder);
111 DenseMap<SDValue, SDValue> Locations;
111 DenseMap<SDValue, SDValue> Locations;
lib/CodeGen/SelectionDAG/TargetLowering.cpp 52 SDValue &Chain) const {
77 const SmallVectorImpl<SDValue> &OutVals) const {
89 SDValue Value = OutVals[I];
121 std::pair<SDValue, SDValue>
121 std::pair<SDValue, SDValue>
123 ArrayRef<SDValue> Ops,
131 SDValue NewOp = Ops[i];
147 SDValue Callee = DAG.getExternalSymbol(getLibcallName(LC),
276 SDValue &NewLHS, SDValue &NewRHS,
276 SDValue &NewLHS, SDValue &NewRHS,
278 const SDLoc &dl, const SDValue OldLHS,
279 const SDValue OldRHS) const {
380 SDValue Ops[2] = {NewLHS, NewRHS};
393 SDValue Tmp = DAG.getNode(
422 SDValue TargetLowering::getPICJumpTableRelocBase(SDValue Table,
422 SDValue TargetLowering::getPICJumpTableRelocBase(SDValue Table,
468 bool TargetLowering::ShrinkDemandedConstant(SDValue Op, const APInt &Demanded,
495 SDValue NewC = TLO.DAG.getConstant(Demanded & C, DL, VT);
496 SDValue NewOp = TLO.DAG.getNode(Opcode, DL, VT, Op.getOperand(0), NewC);
510 bool TargetLowering::ShrinkDemandedOp(SDValue Op, unsigned BitWidth,
542 SDValue X = DAG.getNode(
547 SDValue Z = DAG.getNode(ISD::ANY_EXTEND, dl, Op.getValueType(), X);
554 bool TargetLowering::SimplifyDemandedBits(SDValue Op, const APInt &DemandedBits,
569 bool TargetLowering::SimplifyDemandedBits(SDValue Op, const APInt &DemandedBits,
584 SDValue TargetLowering::SimplifyMultipleUseDemandedBits(
585 SDValue Op, const APInt &DemandedBits, const APInt &DemandedElts,
603 SDValue Src = peekThroughBitcasts(Op.getOperand(0));
610 if (SDValue V = SimplifyMultipleUseDemandedBits(
632 if (SDValue V = SimplifyMultipleUseDemandedBits(
651 if (SDValue V = SimplifyMultipleUseDemandedBits(
705 SDValue Vec = Op.getOperand(0);
738 if (SDValue V = SimplifyMultipleUseDemandedBitsForTargetNode(
754 SDValue Op, const APInt &OriginalDemandedBits,
815 SDValue Src = Op.getOperand(0);
837 SDValue Vec = Op.getOperand(0);
838 SDValue Scl = Op.getOperand(1);
875 SDValue Base = Op.getOperand(0);
876 SDValue Sub = Op.getOperand(1);
915 SDValue Src = Op.getOperand(0);
973 SDValue Op0 = Op.getOperand(0);
974 SDValue Op1 = Op.getOperand(1);
994 SDValue DemandedOp0 = SimplifyMultipleUseDemandedBits(
996 SDValue DemandedOp1 = SimplifyMultipleUseDemandedBits(
1001 SDValue NewOp = TLO.DAG.getVectorShuffle(VT, dl, Op0, Op1, ShuffleMask);
1008 SDValue Op0 = Op.getOperand(0);
1009 SDValue Op1 = Op.getOperand(1);
1035 SDValue Xor = TLO.DAG.getNode(ISD::XOR, dl, VT, Op0.getOperand(0), Op1);
1051 SDValue DemandedOp0 = SimplifyMultipleUseDemandedBits(
1053 SDValue DemandedOp1 = SimplifyMultipleUseDemandedBits(
1058 SDValue NewOp = TLO.DAG.getNode(Op.getOpcode(), dl, VT, Op0, Op1);
1086 SDValue Op0 = Op.getOperand(0);
1087 SDValue Op1 = Op.getOperand(1);
1100 SDValue DemandedOp0 = SimplifyMultipleUseDemandedBits(
1102 SDValue DemandedOp1 = SimplifyMultipleUseDemandedBits(
1107 SDValue NewOp = TLO.DAG.getNode(Op.getOpcode(), dl, VT, Op0, Op1);
1132 SDValue Op0 = Op.getOperand(0);
1133 SDValue Op1 = Op.getOperand(1);
1146 SDValue DemandedOp0 = SimplifyMultipleUseDemandedBits(
1148 SDValue DemandedOp1 = SimplifyMultipleUseDemandedBits(
1153 SDValue NewOp = TLO.DAG.getNode(Op.getOpcode(), dl, VT, Op0, Op1);
1186 SDValue ANDC =
1197 SDValue New = TLO.DAG.getNOT(dl, Op0, VT);
1246 SDValue Op0 = Op.getOperand(0);
1247 SDValue Op1 = Op.getOperand(1);
1274 SDValue Op0 = Op.getOperand(0);
1275 SDValue Op1 = Op.getOperand(1);
1303 SDValue NewSA = TLO.DAG.getConstant(Diff, dl, Op1.getValueType());
1324 SDValue InnerOp = Op0.getOperand(0);
1332 SDValue NarrowShl =
1352 SDValue NewSA = TLO.DAG.getConstant(ShAmt - InnerShAmt, dl,
1354 SDValue NewExt = TLO.DAG.getNode(ISD::ANY_EXTEND, dl, VT,
1371 SDValue Op0 = Op.getOperand(0);
1372 SDValue Op1 = Op.getOperand(1);
1409 SDValue NewSA = TLO.DAG.getConstant(Diff, dl, ShiftVT);
1430 SDValue Op0 = Op.getOperand(0);
1431 SDValue Op1 = Op.getOperand(1);
1481 SDValue NewSA =
1494 SDValue Op0 = Op.getOperand(0);
1495 SDValue Op1 = Op.getOperand(1);
1496 SDValue Op2 = Op.getOperand(2);
1532 SDValue Src = Op.getOperand(0);
1542 SDValue Op0 = Op.getOperand(0);
1559 SDValue ShiftAmt =
1622 SDValue Src = Op.getOperand(0);
1655 SDValue Src = Op.getOperand(0);
1703 SDValue Src = Op.getOperand(0);
1727 SDValue Src = Op.getOperand(0);
1738 if (SDValue NewSrc = SimplifyMultipleUseDemandedBits(
1760 SDValue Shift = Src.getOperand(1);
1774 SDValue NewTrunc =
1800 SDValue Src = Op.getOperand(0);
1801 SDValue Idx = Op.getOperand(1);
1827 SDValue Src = Op.getOperand(0);
1844 SDValue Sign = TLO.DAG.getNode(ISD::FGETSIGN, dl, Ty, Src);
1849 SDValue ShAmt = TLO.DAG.getConstant(ShVal, dl, VT);
1923 SDValue Op0 = Op.getOperand(0), Op1 = Op.getOperand(1);
1938 SDValue NewOp =
1947 SDValue DemandedOp0 = SimplifyMultipleUseDemandedBits(
1949 SDValue DemandedOp1 = SimplifyMultipleUseDemandedBits(
1956 SDValue NewOp =
1971 SDValue Neg1 = TLO.DAG.getAllOnesConstant(dl, VT);
1976 SDValue NewOp = TLO.DAG.getNode(Op.getOpcode(), dl, VT, Op0, Neg1, Flags);
2016 bool TargetLowering::SimplifyDemandedVectorElts(SDValue Op,
2037 static APInt getKnownUndefForVectorBinop(SDValue BO, SelectionDAG &DAG,
2057 SDValue Elt = BV->getOperand(Index);
2074 SDValue C0 = getUndefOrConstantElt(BO.getOperand(0), i, UndefOp0);
2075 SDValue C1 = getUndefOrConstantElt(BO.getOperand(1), i, UndefOp1);
2084 SDValue Op, const APInt &OriginalDemandedElts, APInt &KnownUndef,
2129 SDValue Src = Op.getOperand(0);
2219 SmallVector<SDValue, 32> Ops(Op->op_begin(), Op->op_end());
2233 SDValue SrcOp = Op.getOperand(i);
2248 SDValue SubOp = Op.getOperand(i);
2262 SDValue Base = Op.getOperand(0);
2263 SDValue Sub = Op.getOperand(1);
2294 SDValue Src = Op.getOperand(0);
2311 SDValue Vec = Op.getOperand(0);
2312 SDValue Scl = Op.getOperand(1);
2420 SDValue LegalShuffle =
2450 SDValue Src = Op.getOperand(0);
2577 void TargetLowering::computeKnownBitsForTargetNode(const SDValue Op,
2598 void TargetLowering::computeKnownBitsForFrameIndex(const SDValue Op,
2613 unsigned TargetLowering::ComputeNumSignBitsForTargetNode(SDValue Op,
2627 SDValue Op, const APInt &DemandedElts, APInt &KnownUndef, APInt &KnownZero,
2639 SDValue Op, const APInt &DemandedBits, const APInt &DemandedElts,
2651 SDValue TargetLowering::SimplifyMultipleUseDemandedBitsForTargetNode(
2652 SDValue Op, const APInt &DemandedBits, const APInt &DemandedElts,
2664 SDValue
2665 TargetLowering::buildLegalVectorShuffle(EVT VT, const SDLoc &DL, SDValue N0,
2666 SDValue N1, MutableArrayRef<int> Mask,
2685 bool TargetLowering::isKnownNeverNaNForTargetNode(SDValue Op,
2779 SDValue TargetLowering::foldSetCCWithAnd(EVT VT, SDValue N0, SDValue N1,
2779 SDValue TargetLowering::foldSetCCWithAnd(EVT VT, SDValue N0, SDValue N1,
2779 SDValue TargetLowering::foldSetCCWithAnd(EVT VT, SDValue N0, SDValue N1,
2793 SDValue X, Y;
2805 SDValue Zero = DAG.getConstant(0, DL, OpVT);
2829 SDValue NotX = DAG.getNOT(SDLoc(X), X, OpVT);
2830 SDValue NewAnd = DAG.getNode(ISD::AND, SDLoc(N0), OpVT, NotX, Y);
2847 SDValue TargetLowering::optimizeSetCCOfSignedTruncationCheck(
2848 EVT SCCVT, SDValue N0, SDValue N1, ISD::CondCode Cond, DAGCombinerInfo &DCI,
2848 EVT SCCVT, SDValue N0, SDValue N1, ISD::CondCode Cond, DAGCombinerInfo &DCI,
2864 SDValue X = N0->getOperand(0);
2926 SDValue ShiftAmt = DAG.getConstant(MaskedBits, DL, XVT);
2927 SDValue T0 = DAG.getNode(ISD::SHL, DL, XVT, X, ShiftAmt);
2928 SDValue T1 = DAG.getNode(ISD::SRA, DL, XVT, T0, ShiftAmt);
2929 SDValue T2 = DAG.getSetCC(DL, SCCVT, T1, X, NewCond);
2935 SDValue TargetLowering::optimizeSetCCByHoistingAndByConstFromLogicalShift(
2936 EVT SCCVT, SDValue N0, SDValue N1C, ISD::CondCode Cond,
2936 EVT SCCVT, SDValue N0, SDValue N1C, ISD::CondCode Cond,
2945 SDValue X, C, Y;
2986 SDValue Mask = N0.getOperand(1);
2999 SDValue T0 = DAG.getNode(NewShiftOpcode, DL, VT, X, Y);
3000 SDValue T1 = DAG.getNode(ISD::AND, DL, VT, T0, C);
3001 SDValue T2 = DAG.getSetCC(DL, SCCVT, T1, N1C, Cond);
3008 SDValue TargetLowering::foldSetCCWithBinOp(EVT VT, SDValue N0, SDValue N1,
3008 SDValue TargetLowering::foldSetCCWithBinOp(EVT VT, SDValue N0, SDValue N1,
3008 SDValue TargetLowering::foldSetCCWithBinOp(EVT VT, SDValue N0, SDValue N1,
3021 SDValue X = N0.getOperand(0);
3022 SDValue Y = N0.getOperand(1);
3041 SDValue One = DAG.getConstant(1, DL, ShiftVT);
3042 SDValue YShl1 = DAG.getNode(ISD::SHL, DL, N1.getValueType(), Y, One);
3050 SDValue TargetLowering::SimplifySetCC(EVT VT, SDValue N0, SDValue N1,
3050 SDValue TargetLowering::SimplifySetCC(EVT VT, SDValue N0, SDValue N1,
3050 SDValue TargetLowering::SimplifySetCC(EVT VT, SDValue N0, SDValue N1,
3058 if (SDValue Fold = DAG.FoldSetCC(VT, N0, N1, Cond, dl))
3101 SDValue Zero = DAG.getConstant(0, dl, N0.getValueType());
3107 SDValue CTPOP = N0;
3116 SDValue CTOp = CTPOP.getOperand(0);
3121 SDValue NegOne = DAG.getAllOnesConstant(dl, CTVT);
3122 SDValue Add = DAG.getNode(ISD::ADD, dl, CTVT, CTOp, NegOne);
3123 SDValue And = DAG.getNode(ISD::AND, dl, CTVT, CTOp, Add);
3133 SDValue Zero = DAG.getConstant(0, dl, CTVT);
3134 SDValue NegOne = DAG.getAllOnesConstant(dl, CTVT);
3136 SDValue Add = DAG.getNode(ISD::ADD, dl, CTVT, CTOp, NegOne);
3137 SDValue And = DAG.getNode(ISD::AND, dl, CTVT, CTOp, Add);
3138 SDValue LHS = DAG.getSetCC(dl, VT, CTOp, Zero, InvCond);
3139 SDValue RHS = DAG.getSetCC(dl, VT, And, Zero, Cond);
3150 SDValue PreExt;
3192 SDValue Trunc = DAG.getNode(ISD::TRUNCATE, dl, MinVT, PreExt);
3197 SDValue C = DAG.getConstant(C1.trunc(MinBits), dl, MinVT);
3209 SDValue TopSetCC = N0->getOperand(0);
3276 SDValue Ptr = Lod->getBasePtr();
3281 SDValue NewLoad = DAG.getLoad(
3337 SDValue NewConst = DAG.getConstant(C1.trunc(InSize), dl, newVT);
3339 SDValue NewSetCC = DAG.getSetCC(dl, NewSetCCVT, N0.getOperand(0),
3360 SDValue ZextOp;
3411 SDValue Val;
3430 SDValue Op0 = N0;
3479 if (SDValue V =
3579 if (SDValue CC = optimizeSetCCByHoistingAndByConstFromLogicalShift(
3598 SDValue ConstMinusOne =
3656 SDValue Shift = DAG.getNode(ISD::SRL, dl, CmpTy, N0.getOperand(0),
3659 SDValue CmpRHS = DAG.getConstant(C1.lshr(ShiftBits), dl, CmpTy);
3687 SDValue Shift = DAG.getNode(ISD::SRL, dl, CmpTy, N0,
3689 SDValue CmpRHS = DAG.getConstant(NewC, dl, CmpTy);
3712 SDValue NegN1 = DAG.getNode(ISD::FNEG, dl, N0.getValueType(), N1);
3846 if (SDValue V = foldSetCCWithBinOp(VT, N0, N1, Cond, dl, DCI))
3852 if (SDValue V = foldSetCCWithBinOp(VT, N1, N0, Cond, dl, DCI))
3855 if (SDValue V = foldSetCCWithAnd(VT, N0, N1, Cond, dl, DCI))
3868 if (SDValue Folded = buildUREMEqFold(VT, N0, N1, Cond, DCI, dl))
3871 if (SDValue Folded = buildSREMEqFold(VT, N0, N1, Cond, DCI, dl))
3879 SDValue Temp;
3946 SDValue N1 = N->getOperand(0);
3947 SDValue N2 = N->getOperand(1);
3964 SDValue TargetLowering::PerformDAGCombine(SDNode *N,
4028 SDValue TargetLowering::LowerAsmOutputForConstraint(
4029 SDValue &Chain, SDValue &Flag, SDLoc DL, const AsmOperandInfo &OpInfo,
4029 SDValue &Chain, SDValue &Flag, SDLoc DL, const AsmOperandInfo &OpInfo,
4036 void TargetLowering::LowerAsmOperandForConstraint(SDValue Op,
4038 std::vector<SDValue> &Ops,
4475 SDValue Op, SelectionDAG *DAG) {
4494 std::vector<SDValue> ResultOps;
4525 SDValue Op,
4562 static SDValue BuildExactSDIV(const TargetLowering &TLI, SDNode *N,
4565 SDValue Op0 = N->getOperand(0);
4566 SDValue Op1 = N->getOperand(1);
4573 SmallVector<SDValue, 16> Shifts, Factors;
4598 SDValue Shift, Factor;
4607 SDValue Res = Op0;
4621 SDValue TargetLowering::BuildSDIVPow2(SDNode *N, const APInt &Divisor,
4635 SDValue TargetLowering::BuildSDIV(SDNode *N, SelectionDAG &DAG,
4654 SmallVector<SDValue, 16> MagicFactors, Factors, Shifts, ShiftMasks;
4686 SDValue N0 = N->getOperand(0);
4687 SDValue N1 = N->getOperand(1);
4693 SDValue MagicFactor, Factor, Shift, ShiftMask;
4708 SDValue Q;
4714 SDValue LoHi =
4732 SDValue SignShift = DAG.getConstant(EltBits - 1, dl, ShVT);
4733 SDValue T = DAG.getNode(ISD::SRL, dl, VT, Q, SignShift);
4744 SDValue TargetLowering::BuildUDIV(SDNode *N, SelectionDAG &DAG,
4760 SmallVector<SDValue, 16> PreShifts, PostShifts, MagicFactors, NPQFactors;
4804 SDValue N0 = N->getOperand(0);
4805 SDValue N1 = N->getOperand(1);
4811 SDValue PreShift, PostShift, MagicFactor, NPQFactor;
4823 SDValue Q = N0;
4834 SDValue LoHi =
4849 SDValue NPQ = DAG.getNode(ISD::SUB, dl, VT, N0, Q);
4868 SDValue One = DAG.getConstant(1, dl, VT);
4869 SDValue IsOne = DAG.getSetCC(dl, VT, N1, One, ISD::SETEQ);
4878 turnVectorIntoSplatVector(MutableArrayRef<SDValue> Values,
4879 std::function<bool(SDValue)> Predicate,
4880 SDValue AlternativeReplacement = SDValue()) {
4881 SDValue Replacement;
4906 SDValue TargetLowering::buildUREMEqFold(EVT SETCCVT, SDValue REMNode,
4906 SDValue TargetLowering::buildUREMEqFold(EVT SETCCVT, SDValue REMNode,
4907 SDValue CompTargetNode,
4912 if (SDValue Folded = prepareUREMEqFold(SETCCVT, REMNode, CompTargetNode, Cond,
4922 SDValue
4923 TargetLowering::prepareUREMEqFold(EVT SETCCVT, SDValue REMNode,
4924 SDValue CompTargetNode, ISD::CondCode Cond,
4955 SmallVector<SDValue, 16> PAmts, KAmts, QAmts;
5009 SDValue N = REMNode.getOperand(0);
5010 SDValue D = REMNode.getOperand(1);
5025 SDValue PVal, KVal, QVal;
5047 SDValue Op0 = DAG.getNode(ISD::MUL, DL, VT, N, PVal);
5073 SDValue TargetLowering::buildSREMEqFold(EVT SETCCVT, SDValue REMNode,
5073 SDValue TargetLowering::buildSREMEqFold(EVT SETCCVT, SDValue REMNode,
5074 SDValue CompTargetNode,
5079 if (SDValue Folded = prepareSREMEqFold(SETCCVT, REMNode, CompTargetNode, Cond,
5090 SDValue
5091 TargetLowering::prepareSREMEqFold(EVT SETCCVT, SDValue REMNode,
5092 SDValue CompTargetNode, ISD::CondCode Cond,
5130 SmallVector<SDValue, 16> PAmts, AAmts, KAmts, QAmts;
5212 SDValue N = REMNode.getOperand(0);
5213 SDValue D = REMNode.getOperand(1);
5228 SDValue PVal, AVal, KVal, QVal;
5256 SDValue Op0 = DAG.getNode(ISD::MUL, DL, VT, N, PVal);
5283 SDValue Fold =
5304 SDValue IntMin = DAG.getConstant(
5306 SDValue IntMax = DAG.getConstant(
5308 SDValue Zero =
5312 SDValue DivisorIsIntMin = DAG.getSetCC(DL, SETCCVT, D, IntMin, ISD::SETEQ);
5316 SDValue Masked = DAG.getNode(ISD::AND, DL, VT, N, IntMax);
5318 SDValue MaskedIsZero = DAG.getSetCC(DL, SETCCVT, Masked, Zero, Cond);
5325 SDValue Blended =
5332 verifyReturnAddressArgumentIsConstant(SDValue Op, SelectionDAG &DAG) const {
5342 char TargetLowering::isNegatibleForFree(SDValue Op, SelectionDAG &DAG,
5458 SDValue TargetLowering::getNegatedExpression(SDValue Op, SelectionDAG &DAG,
5458 SDValue TargetLowering::getNegatedExpression(SDValue Op, SelectionDAG &DAG,
5477 SmallVector<SDValue, 4> Ops;
5478 for (SDValue C : Op->op_values()) {
5543 SDValue Neg2 = getNegatedExpression(Op.getOperand(2), DAG, LegalOperations,
5552 SDValue Neg0 = getNegatedExpression(
5559 SDValue Neg1 = getNegatedExpression(Op.getOperand(1), DAG, LegalOperations,
5587 SDValue LHS, SDValue RHS,
5587 SDValue LHS, SDValue RHS,
5588 SmallVectorImpl<SDValue> &Result,
5590 MulExpansionKind Kind, SDValue LL,
5591 SDValue LH, SDValue RL, SDValue RH) const {
5591 SDValue LH, SDValue RL, SDValue RH) const {
5591 SDValue LH, SDValue RL, SDValue RH) const {
5632 SDValue Lo, Hi;
5651 SDValue Zero = DAG.getConstant(0, dl, HiLoVT);
5678 SDValue Shift = DAG.getConstant(ShiftAmount, dl, ShiftAmountTy);
5714 SDValue Next = DAG.getNode(ISD::ZERO_EXTEND, dl, VT, Hi);
5725 SDValue Zero = DAG.getConstant(0, dl, HiLoVT);
5737 SDValue Carry = Next.getValue(1);
5754 SDValue NextSub = DAG.getNode(ISD::SUB, dl, VT, Next,
5769 bool TargetLowering::expandMUL(SDNode *N, SDValue &Lo, SDValue &Hi, EVT HiLoVT,
5769 bool TargetLowering::expandMUL(SDNode *N, SDValue &Lo, SDValue &Hi, EVT HiLoVT,
5771 SDValue LL, SDValue LH, SDValue RL,
5771 SDValue LL, SDValue LH, SDValue RL,
5771 SDValue LL, SDValue LH, SDValue RL,
5772 SDValue RH) const {
5773 SmallVector<SDValue, 2> Result;
5785 bool TargetLowering::expandFunnelShift(SDNode *Node, SDValue &Result,
5797 SDValue X = Node->getOperand(0);
5798 SDValue Y = Node->getOperand(1);
5799 SDValue Z = Node->getOperand(2);
5806 SDValue BitWidthC = DAG.getConstant(EltSizeInBits, DL, ShVT);
5807 SDValue Zero = DAG.getConstant(0, DL, ShVT);
5809 SDValue ShAmt;
5811 SDValue Mask = DAG.getConstant(EltSizeInBits - 1, DL, ShVT);
5817 SDValue InvShAmt = DAG.getNode(ISD::SUB, DL, ShVT, BitWidthC, ShAmt);
5818 SDValue ShX = DAG.getNode(ISD::SHL, DL, VT, X, IsFSHL ? ShAmt : InvShAmt);
5819 SDValue ShY = DAG.getNode(ISD::SRL, DL, VT, Y, IsFSHL ? InvShAmt : ShAmt);
5820 SDValue Or = DAG.getNode(ISD::OR, DL, VT, ShX, ShY);
5828 SDValue IsZeroShift = DAG.getSetCC(DL, CCVT, ShAmt, Zero, ISD::SETEQ);
5834 bool TargetLowering::expandROT(SDNode *Node, SDValue &Result,
5839 SDValue Op0 = Node->getOperand(0);
5840 SDValue Op1 = Node->getOperand(1);
5844 SDValue BitWidthC = DAG.getConstant(EltSizeInBits, DL, ShVT);
5849 SDValue Sub = DAG.getNode(ISD::SUB, DL, ShVT, BitWidthC, Op1);
5869 SDValue BitWidthMinusOneC = DAG.getConstant(EltSizeInBits - 1, DL, ShVT);
5870 SDValue NegOp1 = DAG.getNode(ISD::SUB, DL, ShVT, BitWidthC, Op1);
5871 SDValue And0 = DAG.getNode(ISD::AND, DL, ShVT, Op1, BitWidthMinusOneC);
5872 SDValue And1 = DAG.getNode(ISD::AND, DL, ShVT, NegOp1, BitWidthMinusOneC);
5878 bool TargetLowering::expandFP_TO_SINT(SDNode *Node, SDValue &Result,
5881 SDValue Src = Node->getOperand(OpNo);
5904 SDValue ExponentMask = DAG.getConstant(0x7F800000, dl, IntVT);
5905 SDValue ExponentLoBit = DAG.getConstant(23, dl, IntVT);
5906 SDValue Bias = DAG.getConstant(127, dl, IntVT);
5907 SDValue SignMask = DAG.getConstant(APInt::getSignMask(SrcEltBits), dl, IntVT);
5908 SDValue SignLowBit = DAG.getConstant(SrcEltBits - 1, dl, IntVT);
5909 SDValue MantissaMask = DAG.getConstant(0x007FFFFF, dl, IntVT);
5911 SDValue Bits = DAG.getNode(ISD::BITCAST, dl, IntVT, Src);
5913 SDValue ExponentBits = DAG.getNode(
5916 SDValue Exponent = DAG.getNode(ISD::SUB, dl, IntVT, ExponentBits, Bias);
5918 SDValue Sign = DAG.getNode(ISD::SRA, dl, IntVT,
5923 SDValue R = DAG.getNode(ISD::OR, dl, IntVT,
5941 SDValue Ret = DAG.getNode(ISD::SUB, dl, DstVT,
5949 bool TargetLowering::expandFP_TO_UINT(SDNode *Node, SDValue &Result,
5950 SDValue &Chain,
5954 SDValue Src = Node->getOperand(OpNo);
5985 SDValue Cst = DAG.getConstantFP(APF, dl, SrcVT);
5986 SDValue Sel = DAG.getSetCC(dl, SetCCVT, Src, Cst, ISD::SETLT);
6000 SDValue SrcBiased;
6006 SDValue Val = DAG.getSelect(dl, SrcVT, Sel, Src, SrcBiased);
6007 SDValue Ofs = DAG.getSelect(dl, DstVT, Sel, DAG.getConstant(0, dl, DstVT),
6009 SDValue SInt;
6023 SDValue True = DAG.getNode(ISD::FP_TO_SINT, dl, DstVT, Src);
6025 SDValue False = DAG.getNode(ISD::FP_TO_SINT, dl, DstVT,
6034 bool TargetLowering::expandUINT_TO_FP(SDNode *Node, SDValue &Result,
6036 SDValue Src = Node->getOperand(0);
6059 SDValue Fast = DAG.getNode(ISD::SINT_TO_FP, dl, DstVT, Src);
6061 SDValue ShiftConst = DAG.getConstant(1, dl, ShiftVT);
6062 SDValue Shr = DAG.getNode(ISD::SRL, dl, SrcVT, Src, ShiftConst);
6063 SDValue AndConst = DAG.getConstant(1, dl, SrcVT);
6064 SDValue And = DAG.getNode(ISD::AND, dl, SrcVT, Src, AndConst);
6065 SDValue Or = DAG.getNode(ISD::OR, dl, SrcVT, And, Shr);
6067 SDValue SignCvt = DAG.getNode(ISD::SINT_TO_FP, dl, DstVT, Or);
6068 SDValue Slow = DAG.getNode(ISD::FADD, dl, DstVT, SignCvt, SignCvt);
6077 SDValue SignBitTest = DAG.getSetCC(
6098 SDValue TwoP52 = DAG.getConstant(UINT64_C(0x4330000000000000), dl, SrcVT);
6099 SDValue TwoP84PlusTwoP52 = DAG.getConstantFP(
6101 SDValue TwoP84 = DAG.getConstant(UINT64_C(0x4530000000000000), dl, SrcVT);
6102 SDValue LoMask = DAG.getConstant(UINT64_C(0x00000000FFFFFFFF), dl, SrcVT);
6103 SDValue HiShift = DAG.getConstant(32, dl, ShiftVT);
6105 SDValue Lo = DAG.getNode(ISD::AND, dl, SrcVT, Src, LoMask);
6106 SDValue Hi = DAG.getNode(ISD::SRL, dl, SrcVT, Src, HiShift);
6107 SDValue LoOr = DAG.getNode(ISD::OR, dl, SrcVT, Lo, TwoP52);
6108 SDValue HiOr = DAG.getNode(ISD::OR, dl, SrcVT, Hi, TwoP84);
6109 SDValue LoFlt = DAG.getBitcast(DstVT, LoOr);
6110 SDValue HiFlt = DAG.getBitcast(DstVT, HiOr);
6111 SDValue HiSub = DAG.getNode(ISD::FSUB, dl, DstVT, HiFlt, TwoP84PlusTwoP52);
6119 SDValue TargetLowering::expandFMINNUM_FMAXNUM(SDNode *Node,
6126 SDValue Quiet0 = Node->getOperand(0);
6127 SDValue Quiet1 = Node->getOperand(1);
6159 bool TargetLowering::expandCTPOP(SDNode *Node, SDValue &Result,
6164 SDValue Op = Node->getOperand(0);
6182 SDValue Mask55 =
6184 SDValue Mask33 =
6186 SDValue Mask0F =
6188 SDValue Mask01 =
6219 bool TargetLowering::expandCTLZ(SDNode *Node, SDValue &Result,
6224 SDValue Op = Node->getOperand(0);
6238 SDValue CTLZ = DAG.getNode(ISD::CTLZ_ZERO_UNDEF, dl, VT, Op);
6239 SDValue Zero = DAG.getConstant(0, dl, VT);
6240 SDValue SrcIsZero = DAG.getSetCC(dl, SetCCVT, Op, Zero, ISD::SETEQ);
6263 SDValue Tmp = DAG.getConstant(1ULL << i, dl, ShVT);
6272 bool TargetLowering::expandCTTZ(SDNode *Node, SDValue &Result,
6276 SDValue Op = Node->getOperand(0);
6290 SDValue CTTZ = DAG.getNode(ISD::CTTZ_ZERO_UNDEF, dl, VT, Op);
6291 SDValue Zero = DAG.getConstant(0, dl, VT);
6292 SDValue SrcIsZero = DAG.getSetCC(dl, SetCCVT, Op, Zero, ISD::SETEQ);
6311 SDValue Tmp = DAG.getNode(
6327 bool TargetLowering::expandABS(SDNode *N, SDValue &Result,
6332 SDValue Op = N->getOperand(0);
6340 SDValue Shift =
6343 SDValue Add = DAG.getNode(ISD::ADD, dl, VT, Op, Shift);
6348 SDValue TargetLowering::scalarizeVectorLoad(LoadSDNode *LD,
6351 SDValue Chain = LD->getChain();
6352 SDValue BasePTR = LD->getBasePtr();
6364 SmallVector<SDValue, 8> Vals;
6365 SmallVector<SDValue, 8> LoadChains;
6368 SDValue ScalarLoad =
6380 SDValue NewChain = DAG.getNode(ISD::TokenFactor, SL, MVT::Other, LoadChains);
6381 SDValue Value = DAG.getBuildVector(LD->getValueType(0), SL, Vals);
6386 SDValue TargetLowering::scalarizeVectorStore(StoreSDNode *ST,
6390 SDValue Chain = ST->getChain();
6391 SDValue BasePtr = ST->getBasePtr();
6392 SDValue Value = ST->getValue();
6415 SDValue CurrVal = DAG.getConstant(0, SL, IntVT);
6418 SDValue Elt = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, SL, RegSclVT, Value,
6420 SDValue Trunc = DAG.getNode(ISD::TRUNCATE, SL, MemSclVT, Elt);
6421 SDValue ExtElt = DAG.getNode(ISD::ZERO_EXTEND, SL, IntVT, Trunc);
6424 SDValue ShiftAmount =
6426 SDValue ShiftedElt =
6441 SmallVector<SDValue, 8> Stores;
6443 SDValue Elt = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, SL, RegSclVT, Value,
6446 SDValue Ptr = DAG.getObjectPtrOffset(SL, BasePtr, Idx * Stride);
6449 SDValue Store = DAG.getTruncStore(
6460 std::pair<SDValue, SDValue>
6460 std::pair<SDValue, SDValue>
6464 SDValue Chain = LD->getChain();
6465 SDValue Ptr = LD->getBasePtr();
6477 SDValue Scalarized = scalarizeVectorLoad(LD, DAG);
6485 SDValue newLoad = DAG.getLoad(intVT, dl, Chain, Ptr,
6487 SDValue Result = DAG.getNode(ISD::BITCAST, dl, LoadedVT, newLoad);
6503 SDValue StackBase = DAG.CreateStackTemporary(LoadedVT, RegVT);
6505 SmallVector<SDValue, 8> Stores;
6506 SDValue StackPtr = StackBase;
6512 SDValue PtrIncrement = DAG.getConstant(RegBytes, dl, PtrVT);
6513 SDValue StackPtrIncrement = DAG.getConstant(RegBytes, dl, StackPtrVT);
6518 SDValue Load = DAG.getLoad(
6536 SDValue Load =
6549 SDValue TF = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Stores);
6579 SDValue Lo, Hi;
6603 SDValue ShiftAmount =
6606 SDValue Result = DAG.getNode(ISD::SHL, dl, VT, Hi, ShiftAmount);
6609 SDValue TF = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Lo.getValue(1),
6615 SDValue TargetLowering::expandUnalignedStore(StoreSDNode *ST,
6619 SDValue Chain = ST->getChain();
6620 SDValue Ptr = ST->getBasePtr();
6621 SDValue Val = ST->getValue();
6634 SDValue Result = scalarizeVectorStore(ST, DAG);
6640 SDValue Result = DAG.getNode(ISD::BITCAST, dl, intVT, Val);
6656 SDValue StackPtr = DAG.CreateStackTemporary(StoreMemVT, RegVT);
6660 SDValue Store = DAG.getTruncStore(
6666 SDValue PtrIncrement = DAG.getConstant(RegBytes, dl, PtrVT);
6667 SDValue StackPtrIncrement = DAG.getConstant(RegBytes, dl, StackPtrVT);
6668 SmallVector<SDValue, 8> Stores;
6674 SDValue Load = DAG.getLoad(
6695 SDValue Load = DAG.getExtLoad(
6705 SDValue Result = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Stores);
6717 SDValue ShiftAmount = DAG.getConstant(
6719 SDValue Lo = Val;
6720 SDValue Hi = DAG.getNode(ISD::SRL, dl, VT, Val, ShiftAmount);
6723 SDValue Store1, Store2;
6736 SDValue Result =
6741 SDValue
6742 TargetLowering::IncrementMemoryAddress(SDValue Addr, SDValue Mask,
6742 TargetLowering::IncrementMemoryAddress(SDValue Addr, SDValue Mask,
6746 SDValue Increment;
6754 SDValue MaskInIntReg = DAG.getBitcast(MaskIntVT, Mask);
6764 SDValue Scale = DAG.getConstant(DataVT.getScalarSizeInBits() / 8, DL,
6773 static SDValue clampDynamicVectorIndex(SelectionDAG &DAG,
6774 SDValue Idx,
6793 SDValue TargetLowering::getVectorElementPointer(SelectionDAG &DAG,
6794 SDValue VecPtr, EVT VecVT,
6795 SDValue Index) const {
6820 SDValue TargetLowering::LowerToTLSEmulatedModel(const GlobalAddressSDNode *GA,
6839 SDValue EmuTlsGetAddr = DAG.getExternalSymbol("__emutls_get_address", PtrVT);
6844 std::pair<SDValue, SDValue> CallResult = LowerCallTo(CLI);
6844 std::pair<SDValue, SDValue> CallResult = LowerCallTo(CLI);
6857 SDValue TargetLowering::lowerCmpEqZeroToCtlzSrl(SDValue Op,
6857 SDValue TargetLowering::lowerCmpEqZeroToCtlzSrl(SDValue Op,
6867 SDValue Zext = Op.getOperand(0);
6873 SDValue Clz = DAG.getNode(ISD::CTLZ, dl, VT, Zext);
6874 SDValue Scc = DAG.getNode(ISD::SRL, dl, VT, Clz,
6882 SDValue TargetLowering::expandAddSubSat(SDNode *Node, SelectionDAG &DAG) const {
6884 SDValue LHS = Node->getOperand(0);
6885 SDValue RHS = Node->getOperand(1);
6894 SDValue Max = DAG.getNode(ISD::UMAX, dl, VT, LHS, RHS);
6899 SDValue InvRHS = DAG.getNOT(dl, RHS, VT);
6900 SDValue Min = DAG.getNode(ISD::UMIN, dl, VT, LHS, InvRHS);
6925 SDValue Result = DAG.getNode(OverflowOp, dl, DAG.getVTList(VT, BoolVT),
6927 SDValue SumDiff = Result.getValue(0);
6928 SDValue Overflow = Result.getValue(1);
6929 SDValue Zero = DAG.getConstant(0, dl, VT);
6930 SDValue AllOnes = DAG.getAllOnesConstant(dl, VT);
6935 SDValue OverflowMask = DAG.getSExtOrTrunc(Overflow, dl, VT);
6943 SDValue OverflowMask = DAG.getSExtOrTrunc(Overflow, dl, VT);
6944 SDValue Not = DAG.getNOT(dl, OverflowMask, VT);
6954 SDValue SatMin = DAG.getConstant(MinVal, dl, VT);
6955 SDValue SatMax = DAG.getConstant(MaxVal, dl, VT);
6956 SDValue SumNeg = DAG.getSetCC(dl, BoolVT, SumDiff, Zero, ISD::SETLT);
6962 SDValue
6971 SDValue LHS = Node->getOperand(0);
6972 SDValue RHS = Node->getOperand(1);
6988 SDValue Result =
6990 SDValue Product = Result.getValue(0);
6991 SDValue Overflow = Result.getValue(1);
6992 SDValue Zero = DAG.getConstant(0, dl, VT);
6996 SDValue SatMin = DAG.getConstant(MinVal, dl, VT);
6997 SDValue SatMax = DAG.getConstant(MaxVal, dl, VT);
6998 SDValue ProdNeg = DAG.getSetCC(dl, BoolVT, Product, Zero, ISD::SETLT);
7002 SDValue Result =
7004 SDValue Product = Result.getValue(0);
7005 SDValue Overflow = Result.getValue(1);
7008 SDValue SatMax = DAG.getConstant(MaxVal, dl, VT);
7020 SDValue Lo, Hi;
7024 SDValue Result = DAG.getNode(LoHiOp, dl, DAG.getVTList(VT, VT), LHS, RHS);
7046 SDValue Result = DAG.getNode(ISD::FSHR, dl, VT, Hi, Lo,
7058 SDValue LowMask = DAG.getConstant(APInt::getLowBitsSet(VTSize, Scale),
7070 SDValue SatMin = DAG.getConstant(APInt::getSignedMinValue(VTSize), dl, VT);
7071 SDValue SatMax = DAG.getConstant(APInt::getSignedMaxValue(VTSize), dl, VT);
7074 SDValue Sign = DAG.getNode(ISD::SRA, dl, VT, Lo,
7076 SDValue Overflow = DAG.getSetCC(dl, BoolVT, Hi, Sign, ISD::SETNE);
7079 SDValue Zero = DAG.getConstant(0, dl, VT);
7080 SDValue ResultIfOverflow = DAG.getSelectCC(dl, Hi, Zero, SatMin, SatMax,
7090 SDValue LowMask = DAG.getConstant(APInt::getLowBitsSet(VTSize, Scale - 1),
7095 SDValue HighMask =
7103 SDNode *Node, SDValue &Result, SDValue &Overflow, SelectionDAG &DAG) const {
7103 SDNode *Node, SDValue &Result, SDValue &Overflow, SelectionDAG &DAG) const {
7105 SDValue LHS = Node->getOperand(0);
7106 SDValue RHS = Node->getOperand(1);
7112 SDValue CarryIn = DAG.getConstant(0, dl, Node->getValueType(1));
7113 SDValue NodeCarry = DAG.getNode(OpcCarry, dl, Node->getVTList(),
7127 SDValue SetCC = DAG.getSetCC(dl, SetCCType, Result, LHS, CC);
7132 SDNode *Node, SDValue &Result, SDValue &Overflow, SelectionDAG &DAG) const {
7132 SDNode *Node, SDValue &Result, SDValue &Overflow, SelectionDAG &DAG) const {
7134 SDValue LHS = Node->getOperand(0);
7135 SDValue RHS = Node->getOperand(1);
7148 SDValue Sat = DAG.getNode(OpcSat, dl, LHS.getValueType(), LHS, RHS);
7149 SDValue SetCC = DAG.getSetCC(dl, OType, Result, Sat, ISD::SETNE);
7154 SDValue Zero = DAG.getConstant(0, dl, LHS.getValueType());
7162 SDValue ResultLowerThanLHS = DAG.getSetCC(dl, OType, Result, LHS, ISD::SETLT);
7163 SDValue ConditionRHS =
7171 bool TargetLowering::expandMULO(SDNode *Node, SDValue &Result,
7172 SDValue &Overflow, SelectionDAG &DAG) const {
7176 SDValue LHS = Node->getOperand(0);
7177 SDValue RHS = Node->getOperand(1);
7188 SDValue ShiftAmt = DAG.getConstant(C.logBase2(), dl, ShiftAmtTy);
7203 SDValue BottomHalf;
7204 SDValue TopHalf;
7218 SDValue Mul = DAG.getNode(ISD::MUL, dl, WideVT, LHS, RHS);
7220 SDValue ShiftAmt = DAG.getConstant(VT.getScalarSizeInBits(), dl,
7243 SDValue HiLHS;
7244 SDValue HiRHS;
7266 SDValue Ret;
7275 SDValue Args[] = { LHS, HiLHS, RHS, HiRHS };
7278 SDValue Args[] = { HiLHS, LHS, HiRHS, RHS };
7295 SDValue ShiftAmt = DAG.getConstant(
7298 SDValue Sign = DAG.getNode(ISD::SRA, dl, VT, BottomHalf, ShiftAmt);
7315 SDValue TargetLowering::expandVecReduce(SDNode *Node, SelectionDAG &DAG) const {
7340 SDValue Op = Node->getOperand(0);
7350 SDValue Lo, Hi;
7360 SmallVector<SDValue, 8> Ops;
7363 SDValue Res = Ops[0];
lib/Target/AArch64/AArch64ISelDAGToDAG.cpp 64 bool SelectInlineAsmMemoryOperand(const SDValue &Op,
66 std::vector<SDValue> &OutOps) override;
70 bool SelectArithExtendedRegister(SDValue N, SDValue &Reg, SDValue &Shift);
70 bool SelectArithExtendedRegister(SDValue N, SDValue &Reg, SDValue &Shift);
70 bool SelectArithExtendedRegister(SDValue N, SDValue &Reg, SDValue &Shift);
71 bool SelectArithImmed(SDValue N, SDValue &Val, SDValue &Shift);
71 bool SelectArithImmed(SDValue N, SDValue &Val, SDValue &Shift);
71 bool SelectArithImmed(SDValue N, SDValue &Val, SDValue &Shift);
72 bool SelectNegArithImmed(SDValue N, SDValue &Val, SDValue &Shift);
72 bool SelectNegArithImmed(SDValue N, SDValue &Val, SDValue &Shift);
72 bool SelectNegArithImmed(SDValue N, SDValue &Val, SDValue &Shift);
73 bool SelectArithShiftedRegister(SDValue N, SDValue &Reg, SDValue &Shift) {
73 bool SelectArithShiftedRegister(SDValue N, SDValue &Reg, SDValue &Shift) {
73 bool SelectArithShiftedRegister(SDValue N, SDValue &Reg, SDValue &Shift) {
76 bool SelectLogicalShiftedRegister(SDValue N, SDValue &Reg, SDValue &Shift) {
76 bool SelectLogicalShiftedRegister(SDValue N, SDValue &Reg, SDValue &Shift) {
76 bool SelectLogicalShiftedRegister(SDValue N, SDValue &Reg, SDValue &Shift) {
79 bool SelectAddrModeIndexed7S8(SDValue N, SDValue &Base, SDValue &OffImm) {
79 bool SelectAddrModeIndexed7S8(SDValue N, SDValue &Base, SDValue &OffImm) {
79 bool SelectAddrModeIndexed7S8(SDValue N, SDValue &Base, SDValue &OffImm) {
82 bool SelectAddrModeIndexed7S16(SDValue N, SDValue &Base, SDValue &OffImm) {
82 bool SelectAddrModeIndexed7S16(SDValue N, SDValue &Base, SDValue &OffImm) {
82 bool SelectAddrModeIndexed7S16(SDValue N, SDValue &Base, SDValue &OffImm) {
85 bool SelectAddrModeIndexed7S32(SDValue N, SDValue &Base, SDValue &OffImm) {
85 bool SelectAddrModeIndexed7S32(SDValue N, SDValue &Base, SDValue &OffImm) {
85 bool SelectAddrModeIndexed7S32(SDValue N, SDValue &Base, SDValue &OffImm) {
88 bool SelectAddrModeIndexed7S64(SDValue N, SDValue &Base, SDValue &OffImm) {
88 bool SelectAddrModeIndexed7S64(SDValue N, SDValue &Base, SDValue &OffImm) {
88 bool SelectAddrModeIndexed7S64(SDValue N, SDValue &Base, SDValue &OffImm) {
91 bool SelectAddrModeIndexed7S128(SDValue N, SDValue &Base, SDValue &OffImm) {
91 bool SelectAddrModeIndexed7S128(SDValue N, SDValue &Base, SDValue &OffImm) {
91 bool SelectAddrModeIndexed7S128(SDValue N, SDValue &Base, SDValue &OffImm) {
94 bool SelectAddrModeIndexedS9S128(SDValue N, SDValue &Base, SDValue &OffImm) {
94 bool SelectAddrModeIndexedS9S128(SDValue N, SDValue &Base, SDValue &OffImm) {
94 bool SelectAddrModeIndexedS9S128(SDValue N, SDValue &Base, SDValue &OffImm) {
97 bool SelectAddrModeIndexedU6S128(SDValue N, SDValue &Base, SDValue &OffImm) {
97 bool SelectAddrModeIndexedU6S128(SDValue N, SDValue &Base, SDValue &OffImm) {
97 bool SelectAddrModeIndexedU6S128(SDValue N, SDValue &Base, SDValue &OffImm) {
100 bool SelectAddrModeIndexed8(SDValue N, SDValue &Base, SDValue &OffImm) {
100 bool SelectAddrModeIndexed8(SDValue N, SDValue &Base, SDValue &OffImm) {
100 bool SelectAddrModeIndexed8(SDValue N, SDValue &Base, SDValue &OffImm) {
103 bool SelectAddrModeIndexed16(SDValue N, SDValue &Base, SDValue &OffImm) {
103 bool SelectAddrModeIndexed16(SDValue N, SDValue &Base, SDValue &OffImm) {
103 bool SelectAddrModeIndexed16(SDValue N, SDValue &Base, SDValue &OffImm) {
106 bool SelectAddrModeIndexed32(SDValue N, SDValue &Base, SDValue &OffImm) {
106 bool SelectAddrModeIndexed32(SDValue N, SDValue &Base, SDValue &OffImm) {
106 bool SelectAddrModeIndexed32(SDValue N, SDValue &Base, SDValue &OffImm) {
109 bool SelectAddrModeIndexed64(SDValue N, SDValue &Base, SDValue &OffImm) {
109 bool SelectAddrModeIndexed64(SDValue N, SDValue &Base, SDValue &OffImm) {
109 bool SelectAddrModeIndexed64(SDValue N, SDValue &Base, SDValue &OffImm) {
112 bool SelectAddrModeIndexed128(SDValue N, SDValue &Base, SDValue &OffImm) {
112 bool SelectAddrModeIndexed128(SDValue N, SDValue &Base, SDValue &OffImm) {
112 bool SelectAddrModeIndexed128(SDValue N, SDValue &Base, SDValue &OffImm) {
115 bool SelectAddrModeUnscaled8(SDValue N, SDValue &Base, SDValue &OffImm) {
115 bool SelectAddrModeUnscaled8(SDValue N, SDValue &Base, SDValue &OffImm) {
115 bool SelectAddrModeUnscaled8(SDValue N, SDValue &Base, SDValue &OffImm) {
118 bool SelectAddrModeUnscaled16(SDValue N, SDValue &Base, SDValue &OffImm) {
118 bool SelectAddrModeUnscaled16(SDValue N, SDValue &Base, SDValue &OffImm) {
118 bool SelectAddrModeUnscaled16(SDValue N, SDValue &Base, SDValue &OffImm) {
121 bool SelectAddrModeUnscaled32(SDValue N, SDValue &Base, SDValue &OffImm) {
121 bool SelectAddrModeUnscaled32(SDValue N, SDValue &Base, SDValue &OffImm) {
121 bool SelectAddrModeUnscaled32(SDValue N, SDValue &Base, SDValue &OffImm) {
124 bool SelectAddrModeUnscaled64(SDValue N, SDValue &Base, SDValue &OffImm) {
124 bool SelectAddrModeUnscaled64(SDValue N, SDValue &Base, SDValue &OffImm) {
124 bool SelectAddrModeUnscaled64(SDValue N, SDValue &Base, SDValue &OffImm) {
127 bool SelectAddrModeUnscaled128(SDValue N, SDValue &Base, SDValue &OffImm) {
127 bool SelectAddrModeUnscaled128(SDValue N, SDValue &Base, SDValue &OffImm) {
127 bool SelectAddrModeUnscaled128(SDValue N, SDValue &Base, SDValue &OffImm) {
132 bool SelectAddrModeWRO(SDValue N, SDValue &Base, SDValue &Offset,
132 bool SelectAddrModeWRO(SDValue N, SDValue &Base, SDValue &Offset,
132 bool SelectAddrModeWRO(SDValue N, SDValue &Base, SDValue &Offset,
133 SDValue &SignExtend, SDValue &DoShift) {
133 SDValue &SignExtend, SDValue &DoShift) {
138 bool SelectAddrModeXRO(SDValue N, SDValue &Base, SDValue &Offset,
138 bool SelectAddrModeXRO(SDValue N, SDValue &Base, SDValue &Offset,
138 bool SelectAddrModeXRO(SDValue N, SDValue &Base, SDValue &Offset,
139 SDValue &SignExtend, SDValue &DoShift) {
139 SDValue &SignExtend, SDValue &DoShift) {
143 bool SelectDupZeroOrUndef(SDValue N) {
149 auto Opnd0 = N->getOperand(0);
169 SDValue createDTuple(ArrayRef<SDValue> Vecs);
169 SDValue createDTuple(ArrayRef<SDValue> Vecs);
170 SDValue createQTuple(ArrayRef<SDValue> Vecs);
170 SDValue createQTuple(ArrayRef<SDValue> Vecs);
174 SDValue createTuple(ArrayRef<SDValue> Vecs, const unsigned RegClassIDs[],
174 SDValue createTuple(ArrayRef<SDValue> Vecs, const unsigned RegClassIDs[],
209 bool SelectShiftedRegister(SDValue N, bool AllowROR, SDValue &Reg,
209 bool SelectShiftedRegister(SDValue N, bool AllowROR, SDValue &Reg,
210 SDValue &Shift);
211 bool SelectAddrModeIndexed7S(SDValue N, unsigned Size, SDValue &Base,
211 bool SelectAddrModeIndexed7S(SDValue N, unsigned Size, SDValue &Base,
212 SDValue &OffImm) {
215 bool SelectAddrModeIndexedBitWidth(SDValue N, bool IsSignedImm, unsigned BW,
216 unsigned Size, SDValue &Base,
217 SDValue &OffImm);
218 bool SelectAddrModeIndexed(SDValue N, unsigned Size, SDValue &Base,
218 bool SelectAddrModeIndexed(SDValue N, unsigned Size, SDValue &Base,
219 SDValue &OffImm);
220 bool SelectAddrModeUnscaled(SDValue N, unsigned Size, SDValue &Base,
220 bool SelectAddrModeUnscaled(SDValue N, unsigned Size, SDValue &Base,
221 SDValue &OffImm);
222 bool SelectAddrModeWRO(SDValue N, unsigned Size, SDValue &Base,
222 bool SelectAddrModeWRO(SDValue N, unsigned Size, SDValue &Base,
223 SDValue &Offset, SDValue &SignExtend,
223 SDValue &Offset, SDValue &SignExtend,
224 SDValue &DoShift);
225 bool SelectAddrModeXRO(SDValue N, unsigned Size, SDValue &Base,
225 bool SelectAddrModeXRO(SDValue N, unsigned Size, SDValue &Base,
226 SDValue &Offset, SDValue &SignExtend,
226 SDValue &Offset, SDValue &SignExtend,
227 SDValue &DoShift);
228 bool isWorthFolding(SDValue V) const;
229 bool SelectExtendedSHL(SDValue N, unsigned Size, bool WantExtend,
230 SDValue &Offset, SDValue &SignExtend);
230 SDValue &Offset, SDValue &SignExtend);
233 bool SelectCVTFixedPosOperand(SDValue N, SDValue &FixedPos) {
233 bool SelectCVTFixedPosOperand(SDValue N, SDValue &FixedPos) {
237 bool SelectCVTFixedPosOperand(SDValue N, SDValue &FixedPos, unsigned Width);
237 bool SelectCVTFixedPosOperand(SDValue N, SDValue &FixedPos, unsigned Width);
256 static bool isIntImmediate(SDValue N, uint64_t &Imm) {
270 const SDValue &Op, unsigned ConstraintID, std::vector<SDValue> &OutOps) {
270 const SDValue &Op, unsigned ConstraintID, std::vector<SDValue> &OutOps) {
282 SDValue RC = CurDAG->getTargetConstant(TRC->getID(), dl, MVT::i64);
283 SDValue NewOp =
296 bool AArch64DAGToDAGISel::SelectArithImmed(SDValue N, SDValue &Val,
296 bool AArch64DAGToDAGISel::SelectArithImmed(SDValue N, SDValue &Val,
297 SDValue &Shift) {
326 bool AArch64DAGToDAGISel::SelectNegArithImmed(SDValue N, SDValue &Val,
326 bool AArch64DAGToDAGISel::SelectNegArithImmed(SDValue N, SDValue &Val,
327 SDValue &Shift) {
359 static AArch64_AM::ShiftExtendType getShiftTypeForNode(SDValue N) {
376 static bool isWorthFoldingSHL(SDValue V) {
399 bool AArch64DAGToDAGISel::isWorthFolding(SDValue V) const {
410 const SDValue LHS = V.getOperand(0);
411 const SDValue RHS = V.getOperand(1);
427 bool AArch64DAGToDAGISel::SelectShiftedRegister(SDValue N, bool AllowROR,
428 SDValue &Reg, SDValue &Shift) {
428 SDValue &Reg, SDValue &Shift) {
451 getExtendTypeForNode(SDValue N, bool IsLoadStore = false) {
503 static bool checkHighLaneIndex(SDNode *DL, SDValue &LaneOp, int &LaneIdx) {
508 SDValue SV = DL->getOperand(0);
512 SDValue EV = SV.getOperand(1);
526 static bool checkV64LaneV128(SDValue Op0, SDValue Op1, SDValue &StdOp,
526 static bool checkV64LaneV128(SDValue Op0, SDValue Op1, SDValue &StdOp,
526 static bool checkV64LaneV128(SDValue Op0, SDValue Op1, SDValue &StdOp,
527 SDValue &LaneOp, int &LaneIdx) {
543 SDValue Op0 = N->getOperand(0);
544 SDValue Op1 = N->getOperand(1);
545 SDValue MLAOp1; // Will hold ordinary multiplicand for MLA.
546 SDValue MLAOp2; // Will hold lane-accessed multiplicand for MLA.
559 SDValue LaneIdxVal = CurDAG->getTargetConstant(LaneIdx, dl, MVT::i64);
561 SDValue Ops[] = { Op0, MLAOp1, MLAOp2, LaneIdxVal };
588 SDValue SMULLOp0;
589 SDValue SMULLOp1;
596 SDValue LaneIdxVal = CurDAG->getTargetConstant(LaneIdx, dl, MVT::i64);
598 SDValue Ops[] = { SMULLOp0, SMULLOp1, LaneIdxVal };
635 static SDValue narrowIfNeeded(SelectionDAG *CurDAG, SDValue N) {
635 static SDValue narrowIfNeeded(SelectionDAG *CurDAG, SDValue N) {
640 SDValue SubReg = CurDAG->getTargetConstant(AArch64::sub_32, dl, MVT::i32);
649 bool AArch64DAGToDAGISel::SelectArithExtendedRegister(SDValue N, SDValue &Reg,
649 bool AArch64DAGToDAGISel::SelectArithExtendedRegister(SDValue N, SDValue &Reg,
650 SDValue &Shift) {
697 static bool isWorthFoldingADDlow(SDValue N) {
716 bool AArch64DAGToDAGISel::SelectAddrModeIndexedBitWidth(SDValue N, bool IsSignedImm,
718 SDValue &Base,
719 SDValue &OffImm) {
779 bool AArch64DAGToDAGISel::SelectAddrModeIndexed(SDValue N, unsigned Size,
780 SDValue &Base, SDValue &OffImm) {
780 SDValue &Base, SDValue &OffImm) {
846 bool AArch64DAGToDAGISel::SelectAddrModeUnscaled(SDValue N, unsigned Size,
847 SDValue &Base,
848 SDValue &OffImm) {
872 static SDValue Widen(SelectionDAG *CurDAG, SDValue N) {
872 static SDValue Widen(SelectionDAG *CurDAG, SDValue N) {
874 SDValue SubReg = CurDAG->getTargetConstant(AArch64::sub_32, dl, MVT::i32);
875 SDValue ImpDef = SDValue(
884 bool AArch64DAGToDAGISel::SelectExtendedSHL(SDValue N, unsigned Size,
885 bool WantExtend, SDValue &Offset,
886 SDValue &SignExtend) {
916 bool AArch64DAGToDAGISel::SelectAddrModeWRO(SDValue N, unsigned Size,
917 SDValue &Base, SDValue &Offset,
917 SDValue &Base, SDValue &Offset,
918 SDValue &SignExtend,
919 SDValue &DoShift) {
922 SDValue LHS = N.getOperand(0);
923 SDValue RHS = N.getOperand(1);
1005 bool AArch64DAGToDAGISel::SelectAddrModeXRO(SDValue N, unsigned Size,
1006 SDValue &Base, SDValue &Offset,
1006 SDValue &Base, SDValue &Offset,
1007 SDValue &SignExtend,
1008 SDValue &DoShift) {
1011 SDValue LHS = N.getOperand(0);
1012 SDValue RHS = N.getOperand(1);
1045 SDValue Ops[] = { RHS };
1048 SDValue MOVIV = SDValue(MOVI, 0);
1081 SDValue AArch64DAGToDAGISel::createDTuple(ArrayRef<SDValue> Regs) {
1081 SDValue AArch64DAGToDAGISel::createDTuple(ArrayRef<SDValue> Regs) {
1090 SDValue AArch64DAGToDAGISel::createQTuple(ArrayRef<SDValue> Regs) {
1090 SDValue AArch64DAGToDAGISel::createQTuple(ArrayRef<SDValue> Regs) {
1099 SDValue AArch64DAGToDAGISel::createTuple(ArrayRef<SDValue> Regs,
1099 SDValue AArch64DAGToDAGISel::createTuple(ArrayRef<SDValue> Regs,
1111 SmallVector<SDValue, 4> Ops;
1137 SmallVector<SDValue, 4> Regs(N->op_begin() + Vec0Off,
1139 SDValue RegSeq = createQTuple(Regs);
1141 SmallVector<SDValue, 6> Ops;
1215 SDValue Chain = LD->getChain();
1216 SDValue Base = LD->getBasePtr();
1220 SDValue Offset = CurDAG->getTargetConstant(OffsetVal, dl, MVT::i64);
1221 SDValue Ops[] = { Base, Offset, Chain };
1225 SDValue LoadedVal = SDValue(Res, 1);
1227 SDValue SubReg = CurDAG->getTargetConstant(AArch64::sub_32, dl, MVT::i32);
1247 SDValue Chain = N->getOperand(0);
1249 SDValue Ops[] = {N->getOperand(2), // Mem operand;
1255 SDValue SuperReg = SDValue(Ld, 0);
1273 SDValue Chain = N->getOperand(0);
1275 SDValue Ops[] = {N->getOperand(1), // Mem operand
1288 SDValue SuperReg = SDValue(Ld, 1);
1308 SmallVector<SDValue, 4> Regs(N->op_begin() + 2, N->op_begin() + 2 + NumVecs);
1309 SDValue RegSeq = Is128Bit ? createQTuple(Regs) : createDTuple(Regs);
1311 SDValue Ops[] = {RegSeq, N->getOperand(NumVecs + 2), N->getOperand(0)};
1330 SmallVector<SDValue, 4> Regs(N->op_begin() + 1, N->op_begin() + 1 + NumVecs);
1331 SDValue RegSeq = Is128Bit ? createQTuple(Regs) : createDTuple(Regs);
1333 SDValue Ops[] = {RegSeq,
1351 SDValue operator()(SDValue V64Reg) {
1351 SDValue operator()(SDValue V64Reg) {
1358 SDValue Undef =
1367 static SDValue NarrowVector(SDValue V128Reg, SelectionDAG &DAG) {
1367 static SDValue NarrowVector(SDValue V128Reg, SelectionDAG &DAG) {
1384 SmallVector<SDValue, 4> Regs(N->op_begin() + 2, N->op_begin() + 2 + NumVecs);
1390 SDValue RegSeq = createQTuple(Regs);
1397 SDValue Ops[] = {RegSeq, CurDAG->getTargetConstant(LaneNo, dl, MVT::i64),
1400 SDValue SuperReg = SDValue(Ld, 0);
1406 SDValue NV = CurDAG->getTargetExtractSubreg(QSubs[i], dl, WideVT, SuperReg);
1423 SmallVector<SDValue, 4> Regs(N->op_begin() + 1, N->op_begin() + 1 + NumVecs);
1429 SDValue RegSeq = createQTuple(Regs);
1437 SDValue Ops[] = {RegSeq,
1449 SDValue SuperReg = SDValue(Ld, 1);
1458 SDValue NV = CurDAG->getTargetExtractSubreg(QSubs[i], dl, WideVT,
1478 SmallVector<SDValue, 4> Regs(N->op_begin() + 2, N->op_begin() + 2 + NumVecs);
1484 SDValue RegSeq = createQTuple(Regs);
1489 SDValue Ops[] = {RegSeq, CurDAG->getTargetConstant(LaneNo, dl, MVT::i64),
1507 SmallVector<SDValue, 4> Regs(N->op_begin() + 1, N->op_begin() + 1 + NumVecs);
1513 SDValue RegSeq = createQTuple(Regs);
1521 SDValue Ops[] = {RegSeq, CurDAG->getTargetConstant(LaneNo, dl, MVT::i64),
1535 unsigned &Opc, SDValue &Opd0,
1627 SDValue &Opd0, unsigned &Immr,
1636 SDValue Op = N->getOperand(0);
1660 SDValue &Opd0, unsigned &LSB,
1705 static bool isBitfieldExtractOpFromShr(SDNode *N, unsigned &Opc, SDValue &Opd0,
1781 SDValue Op = N->getOperand(0);
1787 SDValue Opd0 = Widen(CurDAG, Op.getOperand(0));
1790 SDValue Ops[] = {Opd0, CurDAG->getTargetConstant(Immr, dl, VT),
1797 SDValue &Opd0, unsigned &Immr, unsigned &Imms,
1839 SDValue Opd0;
1849 SDValue Ops64[] = {Opd0, CurDAG->getTargetConstant(Immr, dl, MVT::i64),
1853 SDValue SubReg = CurDAG->getTargetConstant(AArch64::sub_32, dl, MVT::i32);
1859 SDValue Ops[] = {Opd0, CurDAG->getTargetConstant(Immr, dl, VT),
1897 static void getUsefulBits(SDValue Op, APInt &UsefulBits, unsigned Depth = 0);
1899 static void getUsefulBitsFromAndWithImmediate(SDValue Op, APInt &UsefulBits,
1908 static void getUsefulBitsFromBitfieldMoveOpd(SDValue Op, APInt &UsefulBits,
1935 static void getUsefulBitsFromUBFM(SDValue Op, APInt &UsefulBits,
1945 static void getUsefulBitsFromOrWithShiftedReg(SDValue Op, APInt &UsefulBits,
1973 static void getUsefulBitsFromBFM(SDValue Op, SDValue Orig, APInt &UsefulBits,
1973 static void getUsefulBitsFromBFM(SDValue Op, SDValue Orig, APInt &UsefulBits,
2029 SDValue Orig, unsigned Depth) {
2076 static void getUsefulBits(SDValue Op, APInt &UsefulBits, unsigned Depth) {
2103 static SDValue getLeftShift(SelectionDAG *CurDAG, SDValue Op, int ShlAmount) {
2103 static SDValue getLeftShift(SelectionDAG *CurDAG, SDValue Op, int ShlAmount) {
2133 static bool isBitfieldPositioningOp(SelectionDAG *CurDAG, SDValue Op,
2135 SDValue &Src, int &ShiftAmount,
2213 SDValue And = N->getOperand(0);
2273 SDValue Ops[] = {And.getOperand(0), SDValue(MOVI, 0),
2317 SDValue Dst, Src;
2320 SDValue OrOpd0Val = N->getOperand(I % 2);
2322 SDValue OrOpd1Val = N->getOperand((I + 1) % 2);
2385 SDValue Ops[] = {Dst, Src, CurDAG->getTargetConstant(ImmR, DL, VT),
2396 SDValue And0 = N->getOperand(0);
2397 SDValue And1 = N->getOperand(1);
2412 SDValue Src = And1->getOperand(0);
2413 SDValue Dst = And0->getOperand(0);
2430 SDValue Ops[] = {Dst, SDValue(LSR, 0),
2471 SDValue Op0;
2483 SDValue Ops[] = {Op0, CurDAG->getTargetConstant(ImmR, DL, VT),
2524 SDValue ShiftAmt = N->getOperand(1);
2526 SDValue NewShiftAmt;
2534 SDValue Add0 = ShiftAmt->getOperand(0);
2535 SDValue Add1 = ShiftAmt->getOperand(1);
2558 SDValue Zero =
2583 SDValue SubReg = CurDAG->getTargetConstant(AArch64::sub_32, DL, MVT::i32);
2590 SDValue Ops[] = {N->getOperand(0), NewShiftAmt};
2596 AArch64DAGToDAGISel::SelectCVTFixedPosOperand(SDValue N, SDValue &FixedPos,
2596 AArch64DAGToDAGISel::SelectCVTFixedPosOperand(SDValue N, SDValue &FixedPos,
2801 SDValue Ops[] = {N->getOperand(1), N->getOperand(2), N->getOperand(3),
2825 SDValue IRG_SP = N->getOperand(2);
2835 SDValue FiOp = CurDAG->getTargetFrameIndex(
2943 SDValue New = CurDAG->getCopyFromReg(
2948 SDValue New = CurDAG->getCopyFromReg(
2962 SDValue TFI = CurDAG->getTargetFrameIndex(
2965 SDValue Ops[] = { TFI, CurDAG->getTargetConstant(0, DL, MVT::i32),
2979 SDValue MemAddr = Node->getOperand(2);
2981 SDValue Chain = Node->getOperand(0);
2998 SDValue Chain = Node->getOperand(0);
2999 SDValue ValLo = Node->getOperand(2);
3000 SDValue ValHi = Node->getOperand(3);
3001 SDValue MemAddr = Node->getOperand(4);
3004 SDValue Ops[] = {ValLo, ValHi, MemAddr, Chain};
lib/Target/AArch64/AArch64ISelLowering.cpp 913 static bool optimizeLogicalImm(SDValue Op, unsigned Size, uint64_t Imm,
989 SDValue New;
1000 SDValue EncConst = TLO.DAG.getTargetConstant(Enc, DL, VT);
1009 SDValue Op, const APInt &Demanded, TargetLoweringOpt &TLO) const {
1053 const SDValue Op, KnownBits &Known,
1597 static bool isCMN(SDValue Op, ISD::CondCode CC) {
1602 static SDValue emitComparison(SDValue LHS, SDValue RHS, ISD::CondCode CC,
1602 static SDValue emitComparison(SDValue LHS, SDValue RHS, ISD::CondCode CC,
1602 static SDValue emitComparison(SDValue LHS, SDValue RHS, ISD::CondCode CC,
1700 static SDValue emitConditionalComparison(SDValue LHS, SDValue RHS,
1700 static SDValue emitConditionalComparison(SDValue LHS, SDValue RHS,
1700 static SDValue emitConditionalComparison(SDValue LHS, SDValue RHS,
1701 ISD::CondCode CC, SDValue CCOp,
1717 SDValue SubOp0 = RHS.getOperand(0);
1727 SDValue Condition = DAG.getConstant(Predicate, DL, MVT_CC);
1730 SDValue NZCVOp = DAG.getConstant(NZCV, DL, MVT::i32);
1748 static bool canEmitConjunction(const SDValue Val, bool &CanNegate,
1766 SDValue O0 = Val->getOperand(0);
1767 SDValue O1 = Val->getOperand(1);
1810 static SDValue emitConjunctionRec(SelectionDAG &DAG, SDValue Val,
1810 static SDValue emitConjunctionRec(SelectionDAG &DAG, SDValue Val,
1811 AArch64CC::CondCode &OutCC, bool Negate, SDValue CCOp,
1816 SDValue LHS = Val->getOperand(0);
1817 SDValue RHS = Val->getOperand(1);
1833 SDValue ExtraCmp;
1855 SDValue LHS = Val->getOperand(0);
1862 SDValue RHS = Val->getOperand(1);
1909 SDValue CmpR = emitConjunctionRec(DAG, RHS, RHSCC, NegateR, CCOp, Predicate);
1912 SDValue CmpL = emitConjunctionRec(DAG, LHS, OutCC, NegateL, CmpR, RHSCC);
1922 static SDValue emitConjunction(SelectionDAG &DAG, SDValue Val,
1922 static SDValue emitConjunction(SelectionDAG &DAG, SDValue Val,
1936 static unsigned getCmpOperandFoldingProfit(SDValue Op) {
1970 static SDValue getAArch64Cmp(SDValue LHS, SDValue RHS, ISD::CondCode CC,
1970 static SDValue getAArch64Cmp(SDValue LHS, SDValue RHS, ISD::CondCode CC,
1970 static SDValue getAArch64Cmp(SDValue LHS, SDValue RHS, ISD::CondCode CC,
1971 SDValue &AArch64cc, SelectionDAG &DAG,
2040 SDValue TheLHS = isCMN(LHS, CC) ? LHS.getOperand(1) : LHS;
2048 SDValue Cmp;
2075 SDValue SExt =
2101 static std::pair<SDValue, SDValue>
2101 static std::pair<SDValue, SDValue>
2102 getAArch64XALUOOp(AArch64CC::CondCode &CC, SDValue Op, SelectionDAG &DAG) {
2105 SDValue Value, Overflow;
2107 SDValue LHS = Op.getOperand(0);
2108 SDValue RHS = Op.getOperand(1);
2142 SDValue Mul = DAG.getNode(ISD::MUL, DL, MVT::i64, LHS, RHS);
2143 SDValue Add = DAG.getNode(ISD::ADD, DL, MVT::i64, Mul,
2156 SDValue UpperBits = DAG.getNode(ISD::SRL, DL, MVT::i64, Add,
2159 SDValue LowerBits = DAG.getNode(ISD::SRA, DL, MVT::i32, Value,
2172 SDValue UpperBits = DAG.getNode(ISD::SRL, DL, MVT::i64, Mul,
2186 SDValue UpperBits = DAG.getNode(ISD::MULHS, DL, MVT::i64, LHS, RHS);
2187 SDValue LowerBits = DAG.getNode(ISD::SRA, DL, MVT::i64, Value,
2195 SDValue UpperBits = DAG.getNode(ISD::MULHU, DL, MVT::i64, LHS, RHS);
2216 SDValue AArch64TargetLowering::LowerF128Call(SDValue Op, SelectionDAG &DAG,
2216 SDValue AArch64TargetLowering::LowerF128Call(SDValue Op, SelectionDAG &DAG,
2218 SmallVector<SDValue, 2> Ops(Op->op_begin(), Op->op_end());
2225 static bool isOverflowIntrOpRes(SDValue Op) {
2232 static SDValue LowerXOR(SDValue Op, SelectionDAG &DAG) {
2232 static SDValue LowerXOR(SDValue Op, SelectionDAG &DAG) {
2233 SDValue Sel = Op.getOperand(0);
2234 SDValue Other = Op.getOperand(1);
2249 SDValue TVal = DAG.getConstant(1, dl, MVT::i32);
2250 SDValue FVal = DAG.getConstant(0, dl, MVT::i32);
2252 SDValue Value, Overflow;
2254 SDValue CCVal = DAG.getConstant(getInvertedCondCode(CC), dl, MVT::i32);
2272 SDValue LHS = Sel.getOperand(0);
2273 SDValue RHS = Sel.getOperand(1);
2274 SDValue TVal = Sel.getOperand(2);
2275 SDValue FVal = Sel.getOperand(3);
2298 SDValue CCVal;
2299 SDValue Cmp = getAArch64Cmp(LHS, RHS, CC, CCVal, DAG, dl);
2312 static SDValue LowerADDC_ADDE_SUBC_SUBE(SDValue Op, SelectionDAG &DAG) {
2312 static SDValue LowerADDC_ADDE_SUBC_SUBE(SDValue Op, SelectionDAG &DAG) {
2348 static SDValue LowerXALUO(SDValue Op, SelectionDAG &DAG) {
2348 static SDValue LowerXALUO(SDValue Op, SelectionDAG &DAG) {
2356 SDValue Value, Overflow;
2360 SDValue TVal = DAG.getConstant(1, dl, MVT::i32);
2361 SDValue FVal = DAG.getConstant(0, dl, MVT::i32);
2366 SDValue CCVal = DAG.getConstant(getInvertedCondCode(CC), dl, MVT::i32);
2379 static SDValue LowerPREFETCH(SDValue Op, SelectionDAG &DAG) {
2379 static SDValue LowerPREFETCH(SDValue Op, SelectionDAG &DAG) {
2405 SDValue AArch64TargetLowering::LowerFP_EXTEND(SDValue Op,
2405 SDValue AArch64TargetLowering::LowerFP_EXTEND(SDValue Op,
2415 SDValue AArch64TargetLowering::LowerFP_ROUND(SDValue Op,
2415 SDValue AArch64TargetLowering::LowerFP_ROUND(SDValue Op,
2428 SDValue SrcVal = Op.getOperand(0);
2434 SDValue AArch64TargetLowering::LowerVectorFP_TO_INT(SDValue Op,
2434 SDValue AArch64TargetLowering::LowerVectorFP_TO_INT(SDValue Op,
2455 SDValue Cv =
2466 SDValue Ext = DAG.getNode(ISD::FP_EXTEND, dl, ExtVT, Op.getOperand(0));
2474 SDValue AArch64TargetLowering::LowerFP_TO_INT(SDValue Op,
2474 SDValue AArch64TargetLowering::LowerFP_TO_INT(SDValue Op,
2499 SmallVector<SDValue, 2> Ops(Op->op_begin(), Op->op_end());
2504 static SDValue LowerVectorINT_TO_FP(SDValue Op, SelectionDAG &DAG) {
2504 static SDValue LowerVectorINT_TO_FP(SDValue Op, SelectionDAG &DAG) {
2510 SDValue In = Op.getOperand(0);
2532 SDValue AArch64TargetLowering::LowerINT_TO_FP(SDValue Op,
2532 SDValue AArch64TargetLowering::LowerINT_TO_FP(SDValue Op,
2565 SDValue AArch64TargetLowering::LowerFSINCOS(SDValue Op,
2565 SDValue AArch64TargetLowering::LowerFSINCOS(SDValue Op,
2570 SDValue Arg = Op.getOperand(0);
2586 SDValue Callee =
2595 std::pair<SDValue, SDValue> CallResult = LowerCallTo(CLI);
2595 std::pair<SDValue, SDValue> CallResult = LowerCallTo(CLI);
2599 static SDValue LowerBITCAST(SDValue Op, SelectionDAG &DAG) {
2599 static SDValue LowerBITCAST(SDValue Op, SelectionDAG &DAG) {
2631 static SDValue addRequiredExtensionForVectorMULL(SDValue N, SelectionDAG &DAG,
2631 static SDValue addRequiredExtensionForVectorMULL(SDValue N, SelectionDAG &DAG,
2655 for (const SDValue &Elt : N->op_values()) {
2674 static SDValue skipExtensionForVectorMULL(SDNode *N, SelectionDAG &DAG) {
2687 SmallVector<SDValue, 8> Ops;
2730 SDValue AArch64TargetLowering::LowerFLT_ROUNDS_(SDValue Op,
2730 SDValue AArch64TargetLowering::LowerFLT_ROUNDS_(SDValue Op,
2738 SDValue FPCR_64 = DAG.getNode(ISD::INTRINSIC_WO_CHAIN, dl, MVT::i64,
2741 SDValue FPCR_32 = DAG.getNode(ISD::TRUNCATE, dl, MVT::i32, FPCR_64);
2742 SDValue FltRounds = DAG.getNode(ISD::ADD, dl, MVT::i32, FPCR_32,
2744 SDValue RMODE = DAG.getNode(ISD::SRL, dl, MVT::i32, FltRounds,
2750 static SDValue LowerMUL(SDValue Op, SelectionDAG &DAG) {
2750 static SDValue LowerMUL(SDValue Op, SelectionDAG &DAG) {
2797 SDValue Op0;
2798 SDValue Op1 = skipExtensionForVectorMULL(N1, DAG);
2809 SDValue N00 = skipExtensionForVectorMULL(N0->getOperand(0).getNode(), DAG);
2810 SDValue N01 = skipExtensionForVectorMULL(N0->getOperand(1).getNode(), DAG);
2819 SDValue AArch64TargetLowering::LowerINTRINSIC_WO_CHAIN(SDValue Op,
2819 SDValue AArch64TargetLowering::LowerINTRINSIC_WO_CHAIN(SDValue Op,
2832 SDValue Result = DAG.getNode(ISD::BITCAST, dl, MVT::v1i64,
2880 SDValue FnOp = Op.getOperand(1);
2881 SDValue IncomingFPOp = Op.getOperand(2);
2892 bool AArch64TargetLowering::isVectorLoadExtDesirable(SDValue ExtVal) const {
2897 static SDValue LowerTruncateVectorStore(SDLoc DL, StoreSDNode *ST,
2903 SDValue Value = ST->getValue();
2912 SDValue Undef = DAG.getUNDEF(MVT::i16);
2913 SDValue UndefVec = DAG.getBuildVector(MVT::v4i16, DL,
2916 SDValue TruncExt = DAG.getNode(ISD::CONCAT_VECTORS, DL, MVT::v8i16,
2918 SDValue Trunc = DAG.getNode(ISD::TRUNCATE, DL, MVT::v8i8, TruncExt);
2921 SDValue ExtractTrunc = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, MVT::i32,
2931 SDValue AArch64TargetLowering::LowerSTORE(SDValue Op,
2931 SDValue AArch64TargetLowering::LowerSTORE(SDValue Op,
2937 SDValue Value = StoreNode->getValue();
2959 SDValue AArch64TargetLowering::LowerOperation(SDValue Op,
2959 SDValue AArch64TargetLowering::LowerOperation(SDValue Op,
3134 SDValue AArch64TargetLowering::LowerFormalArguments(
3135 SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
3137 SelectionDAG &DAG, SmallVectorImpl<SDValue> &InVals) const {
3144 DenseMap<unsigned, SDValue> CopiedRegs;
3180 SmallVector<SDValue, 16> ArgValues;
3195 SDValue FrameIdxN = DAG.getFrameIndex(FrameIdx, PtrVT);
3201 SDValue ArgValue;
3269 SDValue FIN = DAG.getFrameIndex(FI, getPointerTy(DAG.getDataLayout()));
3358 SDValue Copy = DAG.getCopyToReg(DAG.getEntryNode(), DL, Reg, InVals[I]);
3394 SDValue &Chain) const {
3401 SmallVector<SDValue, 8> MemOps;
3420 SDValue FIN = DAG.getFrameIndex(GPRIdx, PtrVT);
3424 SDValue Val = DAG.getCopyFromReg(Chain, DL, VReg, MVT::i64);
3425 SDValue Store = DAG.getStore(
3452 SDValue FIN = DAG.getFrameIndex(FPRIdx, PtrVT);
3456 SDValue Val = DAG.getCopyFromReg(Chain, DL, VReg, MVT::f128);
3458 SDValue Store = DAG.getStore(
3477 SDValue AArch64TargetLowering::LowerCallResult(
3478 SDValue Chain, SDValue InFlag, CallingConv::ID CallConv, bool isVarArg,
3478 SDValue Chain, SDValue InFlag, CallingConv::ID CallConv, bool isVarArg,
3480 SelectionDAG &DAG, SmallVectorImpl<SDValue> &InVals, bool isThisReturn,
3481 SDValue ThisVal) const {
3487 DenseMap<unsigned, SDValue> CopiedRegs;
3507 SDValue Val = CopiedRegs.lookup(VA.getLocReg());
3559 SDValue Callee, CallingConv::ID CalleeCC, bool isVarArg,
3561 const SmallVectorImpl<SDValue> &OutVals,
3675 SDValue AArch64TargetLowering::addTokenForArgument(SDValue Chain,
3675 SDValue AArch64TargetLowering::addTokenForArgument(SDValue Chain,
3679 SmallVector<SDValue, 8> ArgChains;
3715 SDValue
3717 SmallVectorImpl<SDValue> &InVals) const {
3721 SmallVector<SDValue, 32> &OutVals = CLI.OutVals;
3723 SDValue Chain = CLI.Chain;
3724 SDValue Callee = CLI.Callee;
3843 SDValue StackPtr = DAG.getCopyFromReg(Chain, DL, AArch64::SP,
3846 SmallVector<std::pair<unsigned, SDValue>, 8> RegsToPass;
3848 SmallVector<SDValue, 8> MemOpChains;
3854 SDValue Val = DAG.getCopyFromReg(Chain, DL, F.VReg, F.VT);
3863 SDValue Arg = OutVals[realArgIdx];
3921 SDValue &Bits =
3946 SDValue DstAddr;
3962 SDValue PtrOff = DAG.getIntPtrConstant(Offset, DL);
3978 SDValue PtrOff = DAG.getIntPtrConstant(Offset, DL);
3986 SDValue SizeNode =
3988 SDValue Cpy = DAG.getMemcpy(
4003 SDValue Store = DAG.getStore(Chain, DL, Arg, DstAddr, DstInfo);
4014 SDValue InFlag;
4060 std::vector<SDValue> Ops;
4122 SDValue Ret = DAG.getNode(AArch64ISD::TC_RETURN, DL, NodeTys, Ops);
4159 SDValue
4160 AArch64TargetLowering::LowerReturn(SDValue Chain, CallingConv::ID CallConv,
4163 const SmallVectorImpl<SDValue> &OutVals,
4177 SDValue Flag;
4178 SmallVector<std::pair<unsigned, SDValue>, 4> RetVals;
4184 SDValue Arg = OutVals[realRVLocIdx];
4214 SDValue &Bits =
4227 SmallVector<SDValue, 4> RetOps(1, Chain);
4240 SDValue Val = DAG.getCopyFromReg(RetOps[0], DL, SRetReg,
4278 SDValue AArch64TargetLowering::getTargetNode(GlobalAddressSDNode *N, EVT Ty,
4285 SDValue AArch64TargetLowering::getTargetNode(JumpTableSDNode *N, EVT Ty,
4291 SDValue AArch64TargetLowering::getTargetNode(ConstantPoolSDNode *N, EVT Ty,
4298 SDValue AArch64TargetLowering::getTargetNode(BlockAddressSDNode* N, EVT Ty,
4306 SDValue AArch64TargetLowering::getGOT(NodeTy *N, SelectionDAG &DAG,
4311 SDValue GotAddr = getTargetNode(N, Ty, DAG, AArch64II::MO_GOT | Flags);
4319 SDValue AArch64TargetLowering::getAddrLarge(NodeTy *N, SelectionDAG &DAG,
4335 SDValue AArch64TargetLowering::getAddr(NodeTy *N, SelectionDAG &DAG,
4340 SDValue Hi = getTargetNode(N, Ty, DAG, AArch64II::MO_PAGE | Flags);
4341 SDValue Lo = getTargetNode(N, Ty, DAG,
4343 SDValue ADRP = DAG.getNode(AArch64ISD::ADRP, DL, Ty, Hi);
4349 SDValue AArch64TargetLowering::getAddrTiny(NodeTy *N, SelectionDAG &DAG,
4354 SDValue Sym = getTargetNode(N, Ty, DAG, Flags);
4358 SDValue AArch64TargetLowering::LowerGlobalAddress(SDValue Op,
4358 SDValue AArch64TargetLowering::LowerGlobalAddress(SDValue Op,
4374 SDValue Result;
4418 SDValue
4419 AArch64TargetLowering::LowerDarwinGlobalTLSAddress(SDValue Op,
4429 SDValue TLVPAddr =
4431 SDValue DescAddr = DAG.getNode(AArch64ISD::LOADgot, DL, PtrVT, TLVPAddr);
4435 SDValue Chain = DAG.getEntryNode();
4436 SDValue FuncTLVGet = DAG.getLoad(
4486 SDValue AArch64TargetLowering::LowerELFTLSDescCallSeq(SDValue SymAddr,
4486 SDValue AArch64TargetLowering::LowerELFTLSDescCallSeq(SDValue SymAddr,
4491 SDValue Chain = DAG.getEntryNode();
4496 SDValue Glue = Chain.getValue(1);
4501 SDValue
4502 AArch64TargetLowering::LowerELFGlobalTLSAddress(SDValue Op,
4523 SDValue TPOff;
4528 SDValue ThreadBase = DAG.getNode(AArch64ISD::THREAD_POINTER, DL, PtrVT);
4531 SDValue HiVar = DAG.getTargetGlobalAddress(
4533 SDValue LoVar = DAG.getTargetGlobalAddress(
4537 SDValue TPWithOff_lo =
4542 SDValue TPWithOff =
4565 SDValue SymAddr = DAG.getTargetExternalSymbol("_TLS_MODULE_BASE_", PtrVT,
4574 SDValue HiVar = DAG.getTargetGlobalAddress(
4576 SDValue LoVar = DAG.getTargetGlobalAddress(
4590 SDValue SymAddr =
4601 SDValue
4602 AArch64TargetLowering::LowerWindowsGlobalTLSAddress(SDValue Op,
4606 SDValue Chain = DAG.getEntryNode();
4610 SDValue TEB = DAG.getRegister(AArch64::X18, MVT::i64);
4614 SDValue TLSArray =
4623 SDValue TLSIndexHi =
4625 SDValue TLSIndexLo = DAG.getTargetExternalSymbol(
4627 SDValue ADRP = DAG.getNode(AArch64ISD::ADRP, DL, PtrVT, TLSIndexHi);
4628 SDValue TLSIndex =
4636 SDValue Slot = DAG.getNode(ISD::SHL, DL, PtrVT, TLSIndex,
4638 SDValue TLS = DAG.getLoad(PtrVT, DL, Chain,
4645 SDValue TGAHi = DAG.getTargetGlobalAddress(
4647 SDValue TGALo = DAG.getTargetGlobalAddress(
4652 SDValue Addr =
4660 SDValue AArch64TargetLowering::LowerGlobalTLSAddress(SDValue Op,
4660 SDValue AArch64TargetLowering::LowerGlobalTLSAddress(SDValue Op,
4676 SDValue AArch64TargetLowering::LowerBR_CC(SDValue Op, SelectionDAG &DAG) const {
4676 SDValue AArch64TargetLowering::LowerBR_CC(SDValue Op, SelectionDAG &DAG) const {
4677 SDValue Chain = Op.getOperand(0);
4679 SDValue LHS = Op.getOperand(2);
4680 SDValue RHS = Op.getOperand(3);
4681 SDValue Dest = Op.getOperand(4);
4715 SDValue Value, Overflow;
4720 SDValue CCVal = DAG.getConstant(OFCC, dl, MVT::i32);
4742 SDValue Test = LHS.getOperand(0);
4758 SDValue Test = LHS.getOperand(0);
4785 SDValue CCVal;
4786 SDValue Cmp = getAArch64Cmp(LHS, RHS, CC, CCVal, DAG, dl);
4796 SDValue Cmp = emitComparison(LHS, RHS, CC, dl, DAG);
4799 SDValue CC1Val = DAG.getConstant(CC1, dl, MVT::i32);
4800 SDValue BR1 =
4803 SDValue CC2Val = DAG.getConstant(CC2, dl, MVT::i32);
4811 SDValue AArch64TargetLowering::LowerFCOPYSIGN(SDValue Op,
4811 SDValue AArch64TargetLowering::LowerFCOPYSIGN(SDValue Op,
4816 SDValue In1 = Op.getOperand(0);
4817 SDValue In2 = Op.getOperand(1);
4827 SDValue VecVal1, VecVal2;
4862 SDValue BuildVec = DAG.getConstant(EltMask, DL, VecVT);
4872 SDValue Sel =
4885 SDValue AArch64TargetLowering::LowerCTPOP(SDValue Op, SelectionDAG &DAG) const {
4885 SDValue AArch64TargetLowering::LowerCTPOP(SDValue Op, SelectionDAG &DAG) const {
4901 SDValue Val = Op.getOperand(0);
4910 SDValue CtPop = DAG.getNode(ISD::CTPOP, DL, MVT::v8i8, Val);
4911 SDValue UaddLV = DAG.getNode(
4943 SDValue AArch64TargetLowering::LowerSETCC(SDValue Op, SelectionDAG &DAG) const {
4943 SDValue AArch64TargetLowering::LowerSETCC(SDValue Op, SelectionDAG &DAG) const {
4948 SDValue LHS = Op.getOperand(0);
4949 SDValue RHS = Op.getOperand(1);
4955 SDValue TVal = DAG.getConstant(1, dl, VT);
4956 SDValue FVal = DAG.getConstant(0, dl, VT);
4972 SDValue CCVal;
4973 SDValue Cmp =
4988 SDValue Cmp = emitComparison(LHS, RHS, CC, dl, DAG);
4994 SDValue CC1Val = DAG.getConstant(CC1, dl, MVT::i32);
5007 SDValue CC1Val = DAG.getConstant(CC1, dl, MVT::i32);
5008 SDValue CS1 =
5011 SDValue CC2Val = DAG.getConstant(CC2, dl, MVT::i32);
5016 SDValue AArch64TargetLowering::LowerSELECT_CC(ISD::CondCode CC, SDValue LHS,
5016 SDValue AArch64TargetLowering::LowerSELECT_CC(ISD::CondCode CC, SDValue LHS,
5017 SDValue RHS, SDValue TVal,
5017 SDValue RHS, SDValue TVal,
5018 SDValue FVal, const SDLoc &dl,
5153 SDValue CCVal;
5154 SDValue Cmp = getAArch64Cmp(LHS, RHS, CC, CCVal, DAG, dl);
5164 SDValue Cmp = emitComparison(LHS, RHS, CC, dl, DAG);
5190 SDValue CC1Val = DAG.getConstant(CC1, dl, MVT::i32);
5191 SDValue CS1 = DAG.getNode(AArch64ISD::CSEL, dl, VT, TVal, FVal, CC1Val, Cmp);
5196 SDValue CC2Val = DAG.getConstant(CC2, dl, MVT::i32);
5204 SDValue AArch64TargetLowering::LowerSELECT_CC(SDValue Op,
5204 SDValue AArch64TargetLowering::LowerSELECT_CC(SDValue Op,
5207 SDValue LHS = Op.getOperand(0);
5208 SDValue RHS = Op.getOperand(1);
5209 SDValue TVal = Op.getOperand(2);
5210 SDValue FVal = Op.getOperand(3);
5215 SDValue AArch64TargetLowering::LowerSELECT(SDValue Op,
5215 SDValue AArch64TargetLowering::LowerSELECT(SDValue Op,
5217 SDValue CCVal = Op->getOperand(0);
5218 SDValue TVal = Op->getOperand(1);
5219 SDValue FVal = Op->getOperand(2);
5230 SDValue Value, Overflow;
5232 SDValue CCVal = DAG.getConstant(OFCC, DL, MVT::i32);
5240 SDValue LHS, RHS;
5253 SDValue AArch64TargetLowering::LowerJumpTable(SDValue Op,
5253 SDValue AArch64TargetLowering::LowerJumpTable(SDValue Op,
5268 SDValue AArch64TargetLowering::LowerBR_JT(SDValue Op,
5268 SDValue AArch64TargetLowering::LowerBR_JT(SDValue Op,
5273 SDValue JT = Op.getOperand(1);
5274 SDValue Entry = Op.getOperand(2);
5284 SDValue AArch64TargetLowering::LowerConstantPool(SDValue Op,
5284 SDValue AArch64TargetLowering::LowerConstantPool(SDValue Op,
5301 SDValue AArch64TargetLowering::LowerBlockAddress(SDValue Op,
5301 SDValue AArch64TargetLowering::LowerBlockAddress(SDValue Op,
5313 SDValue AArch64TargetLowering::LowerDarwin_VASTART(SDValue Op,
5313 SDValue AArch64TargetLowering::LowerDarwin_VASTART(SDValue Op,
5319 SDValue FR = DAG.getFrameIndex(FuncInfo->getVarArgsStackIndex(),
5327 SDValue AArch64TargetLowering::LowerWin64_VASTART(SDValue Op,
5327 SDValue AArch64TargetLowering::LowerWin64_VASTART(SDValue Op,
5333 SDValue FR = DAG.getFrameIndex(FuncInfo->getVarArgsGPRSize() > 0
5342 SDValue AArch64TargetLowering::LowerAAPCS_VASTART(SDValue Op,
5342 SDValue AArch64TargetLowering::LowerAAPCS_VASTART(SDValue Op,
5351 SDValue Chain = Op.getOperand(0);
5352 SDValue VAList = Op.getOperand(1);
5354 SmallVector<SDValue, 4> MemOps;
5357 SDValue Stack = DAG.getFrameIndex(FuncInfo->getVarArgsStackIndex(), PtrVT);
5364 SDValue GRTop, GRTopAddr;
5381 SDValue VRTop, VRTopAddr;
5395 SDValue GROffsAddr =
5402 SDValue VROffsAddr =
5411 SDValue AArch64TargetLowering::LowerVASTART(SDValue Op,
5411 SDValue AArch64TargetLowering::LowerVASTART(SDValue Op,
5423 SDValue AArch64TargetLowering::LowerVACOPY(SDValue Op,
5423 SDValue AArch64TargetLowering::LowerVACOPY(SDValue Op,
5440 SDValue AArch64TargetLowering::LowerVAARG(SDValue Op, SelectionDAG &DAG) const {
5440 SDValue AArch64TargetLowering::LowerVAARG(SDValue Op, SelectionDAG &DAG) const {
5447 SDValue Chain = Op.getOperand(0);
5448 SDValue Addr = Op.getOperand(1);
5453 SDValue VAList =
5482 SDValue VANext = DAG.getNode(ISD::ADD, DL, PtrVT, VAList,
5487 SDValue APStore =
5493 SDValue WideFP =
5496 SDValue NarrowFP = DAG.getNode(ISD::FP_ROUND, DL, VT, WideFP.getValue(0),
5498 SDValue Ops[] = { NarrowFP, WideFP.getValue(1) };
5506 SDValue AArch64TargetLowering::LowerFRAMEADDR(SDValue Op,
5506 SDValue AArch64TargetLowering::LowerFRAMEADDR(SDValue Op,
5514 SDValue FrameAddr =
5527 SDValue AArch64TargetLowering::LowerSPONENTRY(SDValue Op,
5527 SDValue AArch64TargetLowering::LowerSPONENTRY(SDValue Op,
5557 SDValue AArch64TargetLowering::LowerADDROFRETURNADDR(SDValue Op,
5557 SDValue AArch64TargetLowering::LowerADDROFRETURNADDR(SDValue Op,
5564 SDValue FrameAddr =
5566 SDValue Offset = DAG.getConstant(8, DL, getPointerTy(DAG.getDataLayout()));
5571 SDValue AArch64TargetLowering::LowerRETURNADDR(SDValue Op,
5571 SDValue AArch64TargetLowering::LowerRETURNADDR(SDValue Op,
5581 SDValue FrameAddr = LowerFRAMEADDR(Op, DAG);
5582 SDValue Offset = DAG.getConstant(8, DL, getPointerTy(DAG.getDataLayout()));
5595 SDValue AArch64TargetLowering::LowerShiftRightParts(SDValue Op,
5595 SDValue AArch64TargetLowering::LowerShiftRightParts(SDValue Op,
5601 SDValue ShOpLo = Op.getOperand(0);
5602 SDValue ShOpHi = Op.getOperand(1);
5603 SDValue ShAmt = Op.getOperand(2);
5608 SDValue RevShAmt = DAG.getNode(ISD::SUB, dl, MVT::i64,
5610 SDValue HiBitsForLo = DAG.getNode(ISD::SHL, dl, VT, ShOpHi, RevShAmt);
5614 SDValue Cmp = emitComparison(ShAmt, DAG.getConstant(0, dl, MVT::i64),
5616 SDValue CCVal = DAG.getConstant(AArch64CC::EQ, dl, MVT::i32);
5621 SDValue ExtraShAmt = DAG.getNode(ISD::SUB, dl, MVT::i64, ShAmt,
5624 SDValue LoBitsForLo = DAG.getNode(ISD::SRL, dl, VT, ShOpLo, ShAmt);
5625 SDValue LoForNormalShift =
5631 SDValue LoForBigShift = DAG.getNode(Opc, dl, VT, ShOpHi, ExtraShAmt);
5632 SDValue Lo = DAG.getNode(AArch64ISD::CSEL, dl, VT, LoForBigShift,
5637 SDValue HiForNormalShift = DAG.getNode(Opc, dl, VT, ShOpHi, ShAmt);
5638 SDValue HiForBigShift =
5643 SDValue Hi = DAG.getNode(AArch64ISD::CSEL, dl, VT, HiForBigShift,
5646 SDValue Ops[2] = { Lo, Hi };
5652 SDValue AArch64TargetLowering::LowerShiftLeftParts(SDValue Op,
5652 SDValue AArch64TargetLowering::LowerShiftLeftParts(SDValue Op,
5658 SDValue ShOpLo = Op.getOperand(0);
5659 SDValue ShOpHi = Op.getOperand(1);
5660 SDValue ShAmt = Op.getOperand(2);
5663 SDValue RevShAmt = DAG.getNode(ISD::SUB, dl, MVT::i64,
5665 SDValue LoBitsForHi = DAG.getNode(ISD::SRL, dl, VT, ShOpLo, RevShAmt);
5669 SDValue Cmp = emitComparison(ShAmt, DAG.getConstant(0, dl, MVT::i64),
5671 SDValue CCVal = DAG.getConstant(AArch64CC::EQ, dl, MVT::i32);
5676 SDValue ExtraShAmt = DAG.getNode(ISD::SUB, dl, MVT::i64, ShAmt,
5678 SDValue HiBitsForHi = DAG.getNode(ISD::SHL, dl, VT, ShOpHi, ShAmt);
5679 SDValue HiForNormalShift =
5682 SDValue HiForBigShift = DAG.getNode(ISD::SHL, dl, VT, ShOpLo, ExtraShAmt);
5687 SDValue Hi = DAG.getNode(AArch64ISD::CSEL, dl, VT, HiForBigShift,
5692 SDValue LoForBigShift = DAG.getConstant(0, dl, VT);
5693 SDValue LoForNormalShift = DAG.getNode(ISD::SHL, dl, VT, ShOpLo, ShAmt);
5694 SDValue Lo = DAG.getNode(AArch64ISD::CSEL, dl, VT, LoForBigShift,
5697 SDValue Ops[2] = { Lo, Hi };
5749 static SDValue getEstimate(const AArch64Subtarget *ST, unsigned Opcode,
5750 SDValue Operand, SelectionDAG &DAG,
5771 SDValue AArch64TargetLowering::getSqrtEstimate(SDValue Operand,
5771 SDValue AArch64TargetLowering::getSqrtEstimate(SDValue Operand,
5778 if (SDValue Estimate = getEstimate(Subtarget, AArch64ISD::FRSQRTE, Operand,
5789 SDValue Step = DAG.getNode(ISD::FMUL, DL, VT, Estimate, Estimate,
5797 SDValue FPZero = DAG.getConstantFP(0.0, DL, VT);
5798 SDValue Eq = DAG.getSetCC(DL, CCVT, Operand, FPZero, ISD::SETEQ);
5813 SDValue AArch64TargetLowering::getRecipEstimate(SDValue Operand,
5813 SDValue AArch64TargetLowering::getRecipEstimate(SDValue Operand,
5817 if (SDValue Estimate = getEstimate(Subtarget, AArch64ISD::FRECPE, Operand,
5828 SDValue Step = DAG.getNode(AArch64ISD::FRECPS, DL, VT, Operand,
6064 SDValue Op, std::string &Constraint, std::vector<SDValue> &Ops,
6064 SDValue Op, std::string &Constraint, std::vector<SDValue> &Ops,
6066 SDValue Result;
6221 static SDValue WidenVector(SDValue V64Reg, SelectionDAG &DAG) {
6221 static SDValue WidenVector(SDValue V64Reg, SelectionDAG &DAG) {
6234 static unsigned getExtFactor(SDValue &V) {
6241 static SDValue NarrowVector(SDValue V128Reg, SelectionDAG &DAG) {
6241 static SDValue NarrowVector(SDValue V128Reg, SelectionDAG &DAG) {
6253 SDValue AArch64TargetLowering::ReconstructShuffle(SDValue Op,
6253 SDValue AArch64TargetLowering::ReconstructShuffle(SDValue Op,
6262 SDValue Vec;
6269 SDValue ShuffleVec;
6276 ShuffleSourceInfo(SDValue Vec)
6280 bool operator ==(SDValue OtherVec) { return Vec == OtherVec; }
6287 SDValue V = Op.getOperand(i);
6301 SDValue SourceVec = V.getOperand(0);
6379 SDValue VEXTSrc1 =
6382 SDValue VEXTSrc2 =
6416 SDValue Entry = Op.getOperand(i);
6447 SDValue ShuffleOps[] = { DAG.getUNDEF(ShuffleVT), DAG.getUNDEF(ShuffleVT) };
6451 SDValue Shuffle = DAG.getVectorShuffle(ShuffleVT, dl, ShuffleOps[0],
6453 SDValue V = DAG.getNode(ISD::BITCAST, dl, VT, Shuffle);
6717 static SDValue tryFormConcatFromShuffle(SDValue Op, SelectionDAG &DAG) {
6717 static SDValue tryFormConcatFromShuffle(SDValue Op, SelectionDAG &DAG) {
6720 SDValue V0 = Op.getOperand(0);
6721 SDValue V1 = Op.getOperand(1);
6747 static SDValue GeneratePerfectShuffle(unsigned PFEntry, SDValue LHS,
6747 static SDValue GeneratePerfectShuffle(unsigned PFEntry, SDValue LHS,
6748 SDValue RHS, SelectionDAG &DAG,
6779 SDValue OpLHS, OpRHS;
6818 SDValue Lane = DAG.getConstant(OpNum - OP_VDUP0, dl, MVT::i64);
6849 static SDValue GenerateTBL(SDValue Op, ArrayRef<int> ShuffleMask,
6849 static SDValue GenerateTBL(SDValue Op, ArrayRef<int> ShuffleMask,
6852 SDValue V1 = Op.getOperand(0);
6853 SDValue V2 = Op.getOperand(1);
6859 SmallVector<SDValue, 8> TBLMask;
6874 SDValue V1Cst = DAG.getNode(ISD::BITCAST, DL, IndexVT, V1);
6875 SDValue V2Cst = DAG.getNode(ISD::BITCAST, DL, IndexVT, V2);
6877 SDValue Shuffle;
6924 SDValue AArch64TargetLowering::LowerVECTOR_SHUFFLE(SDValue Op,
6924 SDValue AArch64TargetLowering::LowerVECTOR_SHUFFLE(SDValue Op,
6937 SDValue V1 = Op.getOperand(0);
6938 SDValue V2 = Op.getOperand(1);
7022 if (SDValue Concat = tryFormConcatFromShuffle(Op, DAG))
7029 SDValue DstVec = DstIsLeft ? V1 : V2;
7030 SDValue DstLaneV = DAG.getConstant(Anomaly, dl, MVT::i64);
7032 SDValue SrcVec = V1;
7038 SDValue SrcLaneV = DAG.getConstant(SrcLane, dl, MVT::i64);
7076 SDValue AArch64TargetLowering::LowerSPLAT_VECTOR(SDValue Op,
7076 SDValue AArch64TargetLowering::LowerSPLAT_VECTOR(SDValue Op,
7082 SDValue SplatVal = Op.getOperand(0);
7134 static SDValue tryAdvSIMDModImm64(unsigned NewOp, SDValue Op, SelectionDAG &DAG,
7134 static SDValue tryAdvSIMDModImm64(unsigned NewOp, SDValue Op, SelectionDAG &DAG,
7145 SDValue Mov = DAG.getNode(NewOp, dl, MovTy,
7155 static SDValue tryAdvSIMDModImm32(unsigned NewOp, SDValue Op, SelectionDAG &DAG,
7155 static SDValue tryAdvSIMDModImm32(unsigned NewOp, SDValue Op, SelectionDAG &DAG,
7157 const SDValue *LHS = nullptr) {
7184 SDValue Mov;
7203 static SDValue tryAdvSIMDModImm16(unsigned NewOp, SDValue Op, SelectionDAG &DAG,
7203 static SDValue tryAdvSIMDModImm16(unsigned NewOp, SDValue Op, SelectionDAG &DAG,
7205 const SDValue *LHS = nullptr) {
7224 SDValue Mov;
7243 static SDValue tryAdvSIMDModImm321s(unsigned NewOp, SDValue Op,
7243 static SDValue tryAdvSIMDModImm321s(unsigned NewOp, SDValue Op,
7263 SDValue Mov = DAG.getNode(NewOp, dl, MovTy,
7274 static SDValue tryAdvSIMDModImm8(unsigned NewOp, SDValue Op, SelectionDAG &DAG,
7274 static SDValue tryAdvSIMDModImm8(unsigned NewOp, SDValue Op, SelectionDAG &DAG,
7285 SDValue Mov = DAG.getNode(NewOp, dl, MovTy,
7295 static SDValue tryAdvSIMDModImmFP(unsigned NewOp, SDValue Op, SelectionDAG &DAG,
7295 static SDValue tryAdvSIMDModImmFP(unsigned NewOp, SDValue Op, SelectionDAG &DAG,
7316 SDValue Mov = DAG.getNode(NewOp, dl, MovTy,
7328 static bool isAllConstantBuildVector(const SDValue &PotentialBVec,
7363 static SDValue tryLowerToSLI(SDNode *N, SelectionDAG &DAG) {
7372 const SDValue And = N->getOperand(0);
7377 SDValue Shift = N->getOperand(1);
7405 SDValue X = And.getOperand(0);
7406 SDValue Y = Shift.getOperand(0);
7410 SDValue ResultSLI =
7424 SDValue AArch64TargetLowering::LowerVectorOR(SDValue Op,
7424 SDValue AArch64TargetLowering::LowerVectorOR(SDValue Op,
7428 if (SDValue Res = tryLowerToSLI(Op.getNode(), DAG))
7434 SDValue LHS = Op.getOperand(0);
7448 SDValue NewOp;
7469 static SDValue NormalizeBuildVector(SDValue Op,
7469 static SDValue NormalizeBuildVector(SDValue Op,
7479 SmallVector<SDValue, 16> Ops;
7480 for (SDValue Lane : Op->ops()) {
7500 static SDValue ConstantBuildVector(SDValue Op, SelectionDAG &DAG) {
7500 static SDValue ConstantBuildVector(SDValue Op, SelectionDAG &DAG) {
7507 SDValue NewOp;
7541 SDValue AArch64TargetLowering::LowerBUILD_VECTOR(SDValue Op,
7541 SDValue AArch64TargetLowering::LowerBUILD_VECTOR(SDValue Op,
7563 if (SDValue V = ConstantBuildVector(Op, DAG))
7586 SDValue Value;
7587 SDValue ConstantValue;
7589 SDValue V = Op.getOperand(i);
7635 SDValue V = Op.getOperand(i);
7639 SDValue N0 = N->getOperand(0);
7673 SDValue LHS =
7676 SDValue RHS =
7702 SDValue Lane = Value.getOperand(1);
7716 SmallVector<SDValue, 8> Ops;
7727 SDValue Val = DAG.getBuildVector(VecVT, dl, Ops);
7742 SDValue Vec = DAG.getSplatBuildVector(VT, dl, ConstantValue),
7752 SDValue V = Op.getOperand(i);
7753 SDValue LaneIdx = DAG.getConstant(i, dl, MVT::i64);
7772 if (SDValue shuffle = ReconstructShuffle(Op, DAG))
7787 SDValue Vec = DAG.getUNDEF(VT);
7788 SDValue Op0 = Op.getOperand(0);
7809 SDValue V = Op.getOperand(i);
7812 SDValue LaneIdx = DAG.getConstant(i, dl, MVT::i64);
7824 SDValue AArch64TargetLowering::LowerINSERT_VECTOR_ELT(SDValue Op,
7824 SDValue AArch64TargetLowering::LowerINSERT_VECTOR_ELT(SDValue Op,
7848 SDValue WideVec = WidenVector(Op.getOperand(0), DAG);
7851 SDValue Node = DAG.getNode(ISD::INSERT_VECTOR_ELT, DL, WideTy, WideVec,
7857 SDValue
7858 AArch64TargetLowering::LowerEXTRACT_VECTOR_ELT(SDValue Op,
7882 SDValue WideVec = WidenVector(Op.getOperand(0), DAG);
7894 SDValue AArch64TargetLowering::LowerEXTRACT_SUBVECTOR(SDValue Op,
7894 SDValue AArch64TargetLowering::LowerEXTRACT_SUBVECTOR(SDValue Op,
7962 static bool getVShiftImm(SDValue Op, unsigned ElementBits, int64_t &Cnt) {
7982 static bool isVShiftLImm(SDValue Op, EVT VT, bool isLong, int64_t &Cnt) {
7993 static bool isVShiftRImm(SDValue Op, EVT VT, bool isNarrow, int64_t &Cnt) {
8001 SDValue AArch64TargetLowering::LowerVectorSRA_SRL_SHL(SDValue Op,
8001 SDValue AArch64TargetLowering::LowerVectorSRA_SRL_SHL(SDValue Op,
8039 SDValue NegShift = DAG.getNode(AArch64ISD::NEG, DL, VT, Op.getOperand(1));
8040 SDValue NegShiftLeft =
8050 static SDValue EmitVectorComparison(SDValue LHS, SDValue RHS,
8050 static SDValue EmitVectorComparison(SDValue LHS, SDValue RHS,
8050 static SDValue EmitVectorComparison(SDValue LHS, SDValue RHS,
8068 SDValue Fcmeq;
8107 SDValue Cmeq;
8145 SDValue AArch64TargetLowering::LowerVSETCC(SDValue Op,
8145 SDValue AArch64TargetLowering::LowerVSETCC(SDValue Op,
8148 SDValue LHS = Op.getOperand(0);
8149 SDValue RHS = Op.getOperand(1);
8156 SDValue Cmp =
8170 SDValue NewSetcc = DAG.getSetCC(dl, MVT::v4i16, LHS, RHS, CC);
8187 SDValue Cmp =
8193 SDValue Cmp2 =
8209 static SDValue getReductionSDNode(unsigned Op, SDLoc DL, SDValue ScalarOp,
8209 static SDValue getReductionSDNode(unsigned Op, SDLoc DL, SDValue ScalarOp,
8211 SDValue VecOp = ScalarOp.getOperand(0);
8212 auto Rdx = DAG.getNode(Op, DL, VecOp.getSimpleValueType(), VecOp);
8217 SDValue AArch64TargetLowering::LowerVECREDUCE(SDValue Op,
8217 SDValue AArch64TargetLowering::LowerVECREDUCE(SDValue Op,
8250 SDValue AArch64TargetLowering::LowerATOMIC_LOAD_SUB(SDValue Op,
8250 SDValue AArch64TargetLowering::LowerATOMIC_LOAD_SUB(SDValue Op,
8259 SDValue RHS = Op.getOperand(2);
8267 SDValue AArch64TargetLowering::LowerATOMIC_LOAD_AND(SDValue Op,
8267 SDValue AArch64TargetLowering::LowerATOMIC_LOAD_AND(SDValue Op,
8276 SDValue RHS = Op.getOperand(2);
8284 SDValue AArch64TargetLowering::LowerWindowsDYNAMIC_STACKALLOC(
8285 SDValue Op, SDValue Chain, SDValue &Size, SelectionDAG &DAG) const {
8285 SDValue Op, SDValue Chain, SDValue &Size, SelectionDAG &DAG) const {
8285 SDValue Op, SDValue Chain, SDValue &Size, SelectionDAG &DAG) const {
8288 SDValue Callee = DAG.getTargetExternalSymbol("__chkstk", PtrVT, 0);
8312 SDValue
8313 AArch64TargetLowering::LowerDYNAMIC_STACKALLOC(SDValue Op,
8320 SDValue Chain = Op.getOperand(0);
8321 SDValue Size = Op.getOperand(1);
8327 SDValue SP = DAG.getCopyFromReg(Chain, dl, AArch64::SP, MVT::i64);
8334 SDValue Ops[2] = {SP, Chain};
8342 SDValue SP = DAG.getCopyFromReg(Chain, dl, AArch64::SP, MVT::i64);
8353 SDValue Ops[2] = {SP, Chain};
8477 const SDValue &Base = Mem->getBasePtr();
8553 bool AArch64TargetLowering::isZExtFree(SDValue Val, EVT VT2) const {
9269 static SDValue foldVectorXorShiftIntoCmp(SDNode *N, SelectionDAG &DAG,
9277 SDValue Shift = N->getOperand(0);
9278 SDValue Ones = N->getOperand(1);
9293 static SDValue performIntegerAbsCombine(SDNode *N, SelectionDAG &DAG) {
9296 SDValue N0 = N->getOperand(0);
9297 SDValue N1 = N->getOperand(1);
9307 SDValue Neg = DAG.getNode(ISD::SUB, DL, VT, DAG.getConstant(0, DL, VT),
9310 SDValue Cmp =
9320 static SDValue performXorCombine(SDNode *N, SelectionDAG &DAG,
9326 if (SDValue Cmp = foldVectorXorShiftIntoCmp(N, DAG, Subtarget))
9332 SDValue
9347 SDValue N0 = N->getOperand(0);
9349 SDValue Zero = DAG.getConstant(0, DL, VT);
9350 SDValue Pow2MinusOne = DAG.getConstant((1ULL << Lg2) - 1, DL, VT);
9353 SDValue CCVal;
9354 SDValue Cmp = getAArch64Cmp(N0, Zero, ISD::SETLT, CCVal, DAG, DL);
9355 SDValue Add = DAG.getNode(ISD::ADD, DL, VT, N0, Pow2MinusOne);
9356 SDValue CSel = DAG.getNode(AArch64ISD::CSEL, DL, VT, Add, N0, CCVal, Cmp);
9363 SDValue SRA =
9375 static SDValue performMulCombine(SDNode *N, SelectionDAG &DAG,
9398 SDValue N0 = N->getOperand(0);
9457 SDValue ShiftedVal = DAG.getNode(ISD::SHL, DL, VT, N0,
9460 SDValue AddSubN0 = ShiftValUseIsN0 ? ShiftedVal : N0;
9461 SDValue AddSubN1 = ShiftValUseIsN0 ? N0 : ShiftedVal;
9462 SDValue Res = DAG.getNode(AddSubOpc, DL, VT, AddSubN0, AddSubN1);
9475 static SDValue performVectorCompareAndMaskUnaryOpCombine(SDNode *N,
9509 SDValue SourceConst = DAG.getNode(N->getOpcode(), DL, VT, SDValue(BV, 0));
9511 SDValue MaskConst = DAG.getNode(ISD::BITCAST, DL, IntVT, SourceConst);
9512 SDValue NewAnd = DAG.getNode(ISD::AND, DL, IntVT,
9514 SDValue Res = DAG.getNode(ISD::BITCAST, DL, VT, NewAnd);
9521 static SDValue performIntToFpCombine(SDNode *N, SelectionDAG &DAG,
9525 if (SDValue Res = performVectorCompareAndMaskUnaryOpCombine(N, DAG))
9539 SDValue N0 = N->getOperand(0);
9544 SDValue Load = DAG.getLoad(VT, SDLoc(N), LN0->getChain(), LN0->getBasePtr(),
9562 static SDValue performFpToIntCombine(SDNode *N, SelectionDAG &DAG,
9571 SDValue Op = N->getOperand(0);
9576 SDValue ConstVec = Op->getOperand(1);
9624 SDValue FixConv =
9637 static SDValue performFDivCombine(SDNode *N, SelectionDAG &DAG,
9643 SDValue Op = N->getOperand(0);
9650 SDValue ConstVec = N->getOperand(1);
9691 SDValue ConvInput = Op.getOperand(0);
9706 static bool findEXTRHalf(SDValue N, SDValue &Src, uint32_t &ShiftAmount,
9706 static bool findEXTRHalf(SDValue N, SDValue &Src, uint32_t &ShiftAmount,
9728 static SDValue tryCombineToEXTR(SDNode *N,
9739 SDValue LHS;
9745 SDValue RHS;
9768 static SDValue tryCombineToBSL(SDNode *N,
9777 SDValue N0 = N->getOperand(0);
9781 SDValue N1 = N->getOperand(1);
9815 static SDValue performORCombine(SDNode *N, TargetLowering::DAGCombinerInfo &DCI,
9824 if (SDValue Res = tryCombineToEXTR(N, DCI))
9827 if (SDValue Res = tryCombineToBSL(N, DCI))
9833 static SDValue performANDCombine(SDNode *N,
9836 SDValue LHS = N->getOperand(0);
9853 SDValue NewOp;
9873 static SDValue performSRLCombine(SDNode *N,
9883 SDValue N0 = N->getOperand(0);
9886 SDValue N1 = N->getOperand(1);
9887 SDValue N00 = N0.getOperand(0);
9901 static SDValue performBitcastCombine(SDNode *N,
9925 SDValue Op0 = N->getOperand(0);
9943 SDValue Source = Op0->getOperand(0)->getOperand(0);
9959 SDValue HalfIdx = DAG.getConstant(NumElements, dl, MVT::i64);
9962 SDValue SubReg = DAG.getTargetConstant(AArch64::dsub, dl, MVT::i32);
9969 static SDValue performConcatVectorsCombine(SDNode *N,
9974 SDValue N0 = N->getOperand(0), N1 = N->getOperand(1);
9990 SDValue N00 = N0->getOperand(0);
9991 SDValue N10 = N1->getOperand(0);
10034 SDValue RHS = N1->getOperand(0);
10051 static SDValue tryCombineFixedPointConvert(SDNode *N,
10068 SDValue Op1 = N->getOperand(1);
10071 SDValue IID = N->getOperand(0);
10072 SDValue Shift = N->getOperand(2);
10073 SDValue Vec = Op1.getOperand(0);
10074 SDValue Lane = Op1.getOperand(1);
10091 SDValue Convert =
10113 static SDValue tryExtendDUPToExtractHigh(SDValue N, SelectionDAG &DAG) {
10113 static SDValue tryExtendDUPToExtractHigh(SDValue N, SelectionDAG &DAG) {
10148 static bool isEssentiallyExtractHighSubvector(SDValue N) {
10159 const SDValue *Opnd0;
10160 const SDValue *Opnd1;
10166 const SDValue *Cmp;
10190 static bool isSetCC(SDValue Op, SetCCInfoAndKind &SetCCInfo) {
10233 static bool isSetCCOrZExtSetCC(const SDValue& Op, SetCCInfoAndKind &Info) {
10246 static SDValue performSetccAddFolding(SDNode *Op, SelectionDAG &DAG) {
10248 SDValue LHS = Op->getOperand(0);
10249 SDValue RHS = Op->getOperand(1);
10266 SDValue CCVal;
10267 SDValue Cmp;
10296 static SDValue performAddSubLongCombine(SDNode *N,
10310 SDValue LHS = N->getOperand(0);
10311 SDValue RHS = N->getOperand(1);
10345 static SDValue tryCombineLongOpWithDup(unsigned IID, SDNode *N,
10351 SDValue LHS = N->getOperand(1);
10352 SDValue RHS = N->getOperand(2);
10374 static SDValue tryCombineShiftImm(unsigned IID, SDNode *N, SelectionDAG &DAG) {
10445 static SDValue tryCombineCRC32(unsigned Mask, SDNode *N, SelectionDAG &DAG) {
10446 SDValue AndN = N->getOperand(2);
10458 static SDValue combineAcrossLanesIntrinsic(unsigned Opc, SDNode *N,
10468 static SDValue performIntrinsicCombine(SDNode *N,
10526 static SDValue performExtendCombine(SDNode *N,
10539 SDValue NewABD = tryCombineLongOpWithDup(IID, ABDNode, DCI, DAG);
10585 SDValue Src = N->getOperand(0);
10604 SDValue Lo, Hi;
10624 static SDValue splitStoreSplat(SelectionDAG &DAG, StoreSDNode &St,
10625 SDValue SplatVal, unsigned NumVecElts) {
10635 SDValue BasePtr = St.getBasePtr();
10639 SDValue NewST1 =
10653 SDValue OffsetPtr =
10679 static SDValue replaceZeroVectorStore(SelectionDAG &DAG, StoreSDNode &St) {
10680 SDValue StVal = St.getValue();
10715 SDValue EltVal = StVal.getOperand(I);
10732 SDValue SplatVal =
10742 static SDValue replaceSplatVectorStore(SelectionDAG &DAG, StoreSDNode &St) {
10743 SDValue StVal = St.getValue();
10765 SDValue SplatVal;
10795 static SDValue splitStores(SDNode *N, TargetLowering::DAGCombinerInfo &DCI,
10803 SDValue StVal = S->getValue();
10811 if (SDValue ReplacedZeroSplat = replaceZeroVectorStore(DAG, *S))
10842 if (SDValue ReplacedSplat = replaceSplatVectorStore(DAG, *S))
10850 SDValue SubVector0 = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, HalfVT, StVal,
10852 SDValue SubVector1 = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, HalfVT, StVal,
10854 SDValue BasePtr = S->getBasePtr();
10855 SDValue NewST1 =
10858 SDValue OffsetPtr = DAG.getNode(ISD::ADD, DL, MVT::i64, BasePtr,
10867 static SDValue performPostLD1Combine(SDNode *N,
10883 SDValue Lane;
10907 SDValue Addr = LD->getOperand(1);
10908 SDValue Vector = N->getOperand(0);
10918 SDValue Inc = User->getOperand(User->getOperand(0) == Addr ? 1 : 0);
10939 SmallVector<SDValue, 8> Ops;
10951 SDValue UpdN = DAG.getMemIntrinsicNode(NewOp, SDLoc(N), SDTys, Ops,
10956 SDValue NewResults[] = {
10971 static bool performTBISimplification(SDValue Addr,
10986 static SDValue performSTORECombine(SDNode *N,
10990 if (SDValue Split = splitStores(N, DCI, DAG, Subtarget))
11003 static SDValue performNEONPostLDSTCombine(SDNode *N,
11010 SDValue Addr = N->getOperand(AddrOpIdx);
11091 SDValue Inc = User->getOperand(User->getOperand(0) == Addr ? 1 : 0);
11101 SmallVector<SDValue, 8> Ops;
11121 SDValue UpdN = DAG.getMemIntrinsicNode(NewOpc, SDLoc(N), SDTys, Ops,
11126 std::vector<SDValue> NewResults;
11142 bool checkValueWidth(SDValue V, unsigned width, ISD::LoadExtType &ExtType) {
11321 SDValue performCONDCombine(SDNode *N,
11352 SDValue AddValue = AndNode->getOperand(0);
11359 SDValue AddInputValue1 = AddValue.getNode()->getOperand(0);
11360 SDValue AddInputValue2 = AddValue.getNode()->getOperand(1);
11361 SDValue SubsInputValue = SubsNode->getOperand(1);
11386 SDValue Ops[] = { AddValue, SubsNode->getOperand(1) };
11388 SDValue NewValue = DAG.getNode(CondOpcode, SDLoc(SubsNode), VTs, Ops);
11395 static SDValue performBRCONDCombine(SDNode *N,
11405 if (SDValue NV = performCONDCombine(N, DCI, DAG, 2, 3))
11407 SDValue Chain = N->getOperand(0);
11408 SDValue Dest = N->getOperand(1);
11409 SDValue CCVal = N->getOperand(2);
11410 SDValue Cmp = N->getOperand(3);
11426 SDValue LHS = Cmp.getOperand(0);
11427 SDValue RHS = Cmp.getOperand(1);
11445 SDValue BR;
11461 static SDValue getTestBitOperand(SDValue Op, unsigned &Bit, bool &Invert,
11461 static SDValue getTestBitOperand(SDValue Op, unsigned &Bit, bool &Invert,
11534 static SDValue performTBZCombine(SDNode *N,
11539 SDValue TestSrc = N->getOperand(1);
11540 SDValue NewTestSrc = getTestBitOperand(TestSrc, Bit, Invert, DAG);
11565 static SDValue performVSelectCombine(SDNode *N, SelectionDAG &DAG) {
11566 SDValue N0 = N->getOperand(0);
11580 SDValue IfTrue = N->getOperand(1);
11581 SDValue IfFalse = N->getOperand(2);
11582 SDValue SetCC =
11594 static SDValue performSelectCombine(SDNode *N,
11597 SDValue N0 = N->getOperand(0);
11639 SDValue LHS =
11641 SDValue RHS =
11643 SDValue SetCC = DAG.getNode(ISD::SETCC, DL, CCVT, LHS, RHS, N0.getOperand(2));
11647 SDValue Mask = DAG.getVectorShuffle(CCVT, DL, SetCC, SetCC, DUPMask);
11655 static SDValue performNVCASTCombine(SDNode *N) {
11665 static SDValue performGlobalAddressCombine(SDNode *N, SelectionDAG &DAG,
11710 SDValue Result = DAG.getGlobalAddress(GV, DL, MVT::i64, Offset);
11715 SDValue AArch64TargetLowering::PerformDAGCombine(SDNode *N,
11816 SDValue &Chain) const {
11822 SDValue TCChain = Chain;
11856 bool AArch64TargetLowering::getIndexedAddressParts(SDNode *Op, SDValue &Base,
11857 SDValue &Offset,
11880 bool AArch64TargetLowering::getPreIndexedAddressParts(SDNode *N, SDValue &Base,
11881 SDValue &Offset,
11885 SDValue Ptr;
11903 SDNode *N, SDNode *Op, SDValue &Base, SDValue &Offset,
11903 SDNode *N, SDNode *Op, SDValue &Base, SDValue &Offset,
11906 SDValue Ptr;
11927 static void ReplaceBITCASTResults(SDNode *N, SmallVectorImpl<SDValue> &Results,
11930 SDValue Op = N->getOperand(0);
11945 SmallVectorImpl<SDValue> &Results,
11949 SDValue Lo, Hi;
11953 SDValue InterVal = DAG.getNode(InterOp, dl, LoVT, Lo, Hi);
11954 SDValue SplitVal = DAG.getNode(AcrossOp, dl, LoVT, InterVal);
11958 static std::pair<SDValue, SDValue> splitInt128(SDValue N, SelectionDAG &DAG) {
11958 static std::pair<SDValue, SDValue> splitInt128(SDValue N, SelectionDAG &DAG) {
11958 static std::pair<SDValue, SDValue> splitInt128(SDValue N, SelectionDAG &DAG) {
11960 SDValue Lo = DAG.getNode(ISD::TRUNCATE, DL, MVT::i64, N);
11961 SDValue Hi = DAG.getNode(ISD::TRUNCATE, DL, MVT::i64,
11968 static SDValue createGPRPairNode(SelectionDAG &DAG, SDValue V) {
11968 static SDValue createGPRPairNode(SelectionDAG &DAG, SDValue V) {
11970 SDValue VLo = DAG.getAnyExtOrTrunc(V, dl, MVT::i64);
11971 SDValue VHi = DAG.getAnyExtOrTrunc(
11976 SDValue RegClass =
11978 SDValue SubReg0 = DAG.getTargetConstant(AArch64::sube64, dl, MVT::i32);
11979 SDValue SubReg1 = DAG.getTargetConstant(AArch64::subo64, dl, MVT::i32);
11980 const SDValue Ops[] = { RegClass, VLo, SubReg0, VHi, SubReg1 };
11986 SmallVectorImpl<SDValue> &Results,
11995 SDValue Ops[] = {
12040 SDValue Ops[] = {N->getOperand(1), Desired.first, Desired.second,
12055 SDNode *N, SmallVectorImpl<SDValue> &Results, SelectionDAG &DAG) const {
12349 SDValue X, ConstantSDNode *XC, ConstantSDNode *CC, SDValue Y,
12349 SDValue X, ConstantSDNode *XC, ConstantSDNode *CC, SDValue Y,
lib/Target/AArch64/AArch64ISelLowering.h 264 void computeKnownBitsForTargetNode(const SDValue Op, KnownBits &Known,
277 bool targetShrinkDemandedConstant(SDValue Op, const APInt &Demanded,
294 SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
294 SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
298 SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const override;
324 SDValue ReconstructShuffle(SDValue Op, SelectionDAG &DAG) const;
324 SDValue ReconstructShuffle(SDValue Op, SelectionDAG &DAG) const;
353 bool isZExtFree(SDValue Val, EVT VT2) const override;
490 bool hasAndNotCompare(SDValue V) const override {
495 bool hasAndNot(SDValue Y) const override {
505 SDValue X, ConstantSDNode *XC, ConstantSDNode *CC, SDValue Y,
505 SDValue X, ConstantSDNode *XC, ConstantSDNode *CC, SDValue Y,
583 SDValue LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv,
583 SDValue LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv,
587 SmallVectorImpl<SDValue> &InVals) const override;
589 SDValue LowerCall(CallLoweringInfo & /*CLI*/,
590 SmallVectorImpl<SDValue> &InVals) const override;
592 SDValue LowerCallResult(SDValue Chain, SDValue InFlag,
592 SDValue LowerCallResult(SDValue Chain, SDValue InFlag,
592 SDValue LowerCallResult(SDValue Chain, SDValue InFlag,
596 SmallVectorImpl<SDValue> &InVals, bool isThisReturn,
597 SDValue ThisVal) const;
599 SDValue LowerSTORE(SDValue Op, SelectionDAG &DAG) const;
599 SDValue LowerSTORE(SDValue Op, SelectionDAG &DAG) const;
601 SDValue LowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG) const;
601 SDValue LowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG) const;
604 SDValue Callee, CallingConv::ID CalleeCC, bool isVarArg,
606 const SmallVectorImpl<SDValue> &OutVals,
612 SDValue addTokenForArgument(SDValue Chain, SelectionDAG &DAG,
612 SDValue addTokenForArgument(SDValue Chain, SelectionDAG &DAG,
618 SDValue &Chain) const;
625 SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
625 SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
627 const SmallVectorImpl<SDValue> &OutVals, const SDLoc &DL,
630 SDValue getTargetNode(GlobalAddressSDNode *N, EVT Ty, SelectionDAG &DAG,
632 SDValue getTargetNode(JumpTableSDNode *N, EVT Ty, SelectionDAG &DAG,
634 SDValue getTargetNode(ConstantPoolSDNode *N, EVT Ty, SelectionDAG &DAG,
636 SDValue getTargetNode(BlockAddressSDNode *N, EVT Ty, SelectionDAG &DAG,
639 SDValue getGOT(NodeTy *N, SelectionDAG &DAG, unsigned Flags = 0) const;
641 SDValue getAddrLarge(NodeTy *N, SelectionDAG &DAG, unsigned Flags = 0) const;
643 SDValue getAddr(NodeTy *N, SelectionDAG &DAG, unsigned Flags = 0) const;
645 SDValue getAddrTiny(NodeTy *N, SelectionDAG &DAG, unsigned Flags = 0) const;
646 SDValue LowerADDROFRETURNADDR(SDValue Op, SelectionDAG &DAG) const;
646 SDValue LowerADDROFRETURNADDR(SDValue Op, SelectionDAG &DAG) const;
647 SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const;
647 SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const;
648 SDValue LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const;
648 SDValue LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const;
649 SDValue LowerDarwinGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const;
649 SDValue LowerDarwinGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const;
650 SDValue LowerELFGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const;
650 SDValue LowerELFGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const;
651 SDValue LowerELFTLSDescCallSeq(SDValue SymAddr, const SDLoc &DL,
651 SDValue LowerELFTLSDescCallSeq(SDValue SymAddr, const SDLoc &DL,
653 SDValue LowerWindowsGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const;
653 SDValue LowerWindowsGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const;
654 SDValue LowerSETCC(SDValue Op, SelectionDAG &DAG) const;
654 SDValue LowerSETCC(SDValue Op, SelectionDAG &DAG) const;
655 SDValue LowerBR_CC(SDValue Op, SelectionDAG &DAG) const;
655 SDValue LowerBR_CC(SDValue Op, SelectionDAG &DAG) const;
656 SDValue LowerSELECT(SDValue Op, SelectionDAG &DAG) const;
656 SDValue LowerSELECT(SDValue Op, SelectionDAG &DAG) const;
657 SDValue LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const;
657 SDValue LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const;
658 SDValue LowerSELECT_CC(ISD::CondCode CC, SDValue LHS, SDValue RHS,
658 SDValue LowerSELECT_CC(ISD::CondCode CC, SDValue LHS, SDValue RHS,
658 SDValue LowerSELECT_CC(ISD::CondCode CC, SDValue LHS, SDValue RHS,
659 SDValue TVal, SDValue FVal, const SDLoc &dl,
659 SDValue TVal, SDValue FVal, const SDLoc &dl,
661 SDValue LowerJumpTable(SDValue Op, SelectionDAG &DAG) const;
661 SDValue LowerJumpTable(SDValue Op, SelectionDAG &DAG) const;
662 SDValue LowerBR_JT(SDValue Op, SelectionDAG &DAG) const;
662 SDValue LowerBR_JT(SDValue Op, SelectionDAG &DAG) const;
663 SDValue LowerConstantPool(SDValue Op, SelectionDAG &DAG) const;
663 SDValue LowerConstantPool(SDValue Op, SelectionDAG &DAG) const;
664 SDValue LowerBlockAddress(SDValue Op, SelectionDAG &DAG) const;
664 SDValue LowerBlockAddress(SDValue Op, SelectionDAG &DAG) const;
665 SDValue LowerAAPCS_VASTART(SDValue Op, SelectionDAG &DAG) const;
665 SDValue LowerAAPCS_VASTART(SDValue Op, SelectionDAG &DAG) const;
666 SDValue LowerDarwin_VASTART(SDValue Op, SelectionDAG &DAG) const;
666 SDValue LowerDarwin_VASTART(SDValue Op, SelectionDAG &DAG) const;
667 SDValue LowerWin64_VASTART(SDValue Op, SelectionDAG &DAG) const;
667 SDValue LowerWin64_VASTART(SDValue Op, SelectionDAG &DAG) const;
668 SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG) const;
668 SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG) const;
669 SDValue LowerVACOPY(SDValue Op, SelectionDAG &DAG) const;
669 SDValue LowerVACOPY(SDValue Op, SelectionDAG &DAG) const;
670 SDValue LowerVAARG(SDValue Op, SelectionDAG &DAG) const;
670 SDValue LowerVAARG(SDValue Op, SelectionDAG &DAG) const;
671 SDValue LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const;
671 SDValue LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const;
672 SDValue LowerSPONENTRY(SDValue Op, SelectionDAG &DAG) const;
672 SDValue LowerSPONENTRY(SDValue Op, SelectionDAG &DAG) const;
673 SDValue LowerRETURNADDR(SDValue Op, SelectionDAG &DAG) const;
673 SDValue LowerRETURNADDR(SDValue Op, SelectionDAG &DAG) const;
674 SDValue LowerFLT_ROUNDS_(SDValue Op, SelectionDAG &DAG) const;
674 SDValue LowerFLT_ROUNDS_(SDValue Op, SelectionDAG &DAG) const;
675 SDValue LowerINSERT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const;
675 SDValue LowerINSERT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const;
676 SDValue LowerEXTRACT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const;
676 SDValue LowerEXTRACT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const;
677 SDValue LowerSCALAR_TO_VECTOR(SDValue Op, SelectionDAG &DAG) const;
677 SDValue LowerSCALAR_TO_VECTOR(SDValue Op, SelectionDAG &DAG) const;
678 SDValue LowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG) const;
678 SDValue LowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG) const;
679 SDValue LowerVECTOR_SHUFFLE(SDValue Op, SelectionDAG &DAG) const;
679 SDValue LowerVECTOR_SHUFFLE(SDValue Op, SelectionDAG &DAG) const;
680 SDValue LowerSPLAT_VECTOR(SDValue Op, SelectionDAG &DAG) const;
680 SDValue LowerSPLAT_VECTOR(SDValue Op, SelectionDAG &DAG) const;
681 SDValue LowerEXTRACT_SUBVECTOR(SDValue Op, SelectionDAG &DAG) const;
681 SDValue LowerEXTRACT_SUBVECTOR(SDValue Op, SelectionDAG &DAG) const;
682 SDValue LowerVectorSRA_SRL_SHL(SDValue Op, SelectionDAG &DAG) const;
682 SDValue LowerVectorSRA_SRL_SHL(SDValue Op, SelectionDAG &DAG) const;
683 SDValue LowerShiftLeftParts(SDValue Op, SelectionDAG &DAG) const;
683 SDValue LowerShiftLeftParts(SDValue Op, SelectionDAG &DAG) const;
684 SDValue LowerShiftRightParts(SDValue Op, SelectionDAG &DAG) const;
684 SDValue LowerShiftRightParts(SDValue Op, SelectionDAG &DAG) const;
685 SDValue LowerVSETCC(SDValue Op, SelectionDAG &DAG) const;
685 SDValue LowerVSETCC(SDValue Op, SelectionDAG &DAG) const;
686 SDValue LowerCTPOP(SDValue Op, SelectionDAG &DAG) const;
686 SDValue LowerCTPOP(SDValue Op, SelectionDAG &DAG) const;
687 SDValue LowerF128Call(SDValue Op, SelectionDAG &DAG,
687 SDValue LowerF128Call(SDValue Op, SelectionDAG &DAG,
689 SDValue LowerFCOPYSIGN(SDValue Op, SelectionDAG &DAG) const;
689 SDValue LowerFCOPYSIGN(SDValue Op, SelectionDAG &DAG) const;
690 SDValue LowerFP_EXTEND(SDValue Op, SelectionDAG &DAG) const;
690 SDValue LowerFP_EXTEND(SDValue Op, SelectionDAG &DAG) const;
691 SDValue LowerFP_ROUND(SDValue Op, SelectionDAG &DAG) const;
691 SDValue LowerFP_ROUND(SDValue Op, SelectionDAG &DAG) const;
692 SDValue LowerVectorFP_TO_INT(SDValue Op, SelectionDAG &DAG) const;
692 SDValue LowerVectorFP_TO_INT(SDValue Op, SelectionDAG &DAG) const;
693 SDValue LowerFP_TO_INT(SDValue Op, SelectionDAG &DAG) const;
693 SDValue LowerFP_TO_INT(SDValue Op, SelectionDAG &DAG) const;
694 SDValue LowerINT_TO_FP(SDValue Op, SelectionDAG &DAG) const;
694 SDValue LowerINT_TO_FP(SDValue Op, SelectionDAG &DAG) const;
695 SDValue LowerVectorOR(SDValue Op, SelectionDAG &DAG) const;
695 SDValue LowerVectorOR(SDValue Op, SelectionDAG &DAG) const;
696 SDValue LowerCONCAT_VECTORS(SDValue Op, SelectionDAG &DAG) const;
696 SDValue LowerCONCAT_VECTORS(SDValue Op, SelectionDAG &DAG) const;
697 SDValue LowerFSINCOS(SDValue Op, SelectionDAG &DAG) const;
697 SDValue LowerFSINCOS(SDValue Op, SelectionDAG &DAG) const;
698 SDValue LowerVECREDUCE(SDValue Op, SelectionDAG &DAG) const;
698 SDValue LowerVECREDUCE(SDValue Op, SelectionDAG &DAG) const;
699 SDValue LowerATOMIC_LOAD_SUB(SDValue Op, SelectionDAG &DAG) const;
699 SDValue LowerATOMIC_LOAD_SUB(SDValue Op, SelectionDAG &DAG) const;
700 SDValue LowerATOMIC_LOAD_AND(SDValue Op, SelectionDAG &DAG) const;
700 SDValue LowerATOMIC_LOAD_AND(SDValue Op, SelectionDAG &DAG) const;
701 SDValue LowerDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG) const;
701 SDValue LowerDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG) const;
702 SDValue LowerWindowsDYNAMIC_STACKALLOC(SDValue Op, SDValue Chain,
702 SDValue LowerWindowsDYNAMIC_STACKALLOC(SDValue Op, SDValue Chain,
702 SDValue LowerWindowsDYNAMIC_STACKALLOC(SDValue Op, SDValue Chain,
703 SDValue &Size,
706 SDValue BuildSDIVPow2(SDNode *N, const APInt &Divisor, SelectionDAG &DAG,
708 SDValue getSqrtEstimate(SDValue Operand, SelectionDAG &DAG, int Enabled,
708 SDValue getSqrtEstimate(SDValue Operand, SelectionDAG &DAG, int Enabled,
711 SDValue getRecipEstimate(SDValue Operand, SelectionDAG &DAG, int Enabled,
711 SDValue getRecipEstimate(SDValue Operand, SelectionDAG &DAG, int Enabled,
731 void LowerAsmOperandForConstraint(SDValue Op, std::string &Constraint,
732 std::vector<SDValue> &Ops,
744 bool isVectorLoadExtDesirable(SDValue ExtVal) const override;
745 bool isUsedByReturnOnly(SDNode *N, SDValue &Chain) const override;
747 bool getIndexedAddressParts(SDNode *Op, SDValue &Base, SDValue &Offset,
747 bool getIndexedAddressParts(SDNode *Op, SDValue &Base, SDValue &Offset,
750 bool getPreIndexedAddressParts(SDNode *N, SDValue &Base, SDValue &Offset,
750 bool getPreIndexedAddressParts(SDNode *N, SDValue &Base, SDValue &Offset,
753 bool getPostIndexedAddressParts(SDNode *N, SDNode *Op, SDValue &Base,
754 SDValue &Offset, ISD::MemIndexedMode &AM,
757 void ReplaceNodeResults(SDNode *N, SmallVectorImpl<SDValue> &Results,
lib/Target/AArch64/AArch64SelectionDAGInfo.cpp 18 SDValue AArch64SelectionDAGInfo::EmitTargetCodeForMemset(
19 SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src,
19 SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src,
19 SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src,
20 SDValue Size, unsigned Align, bool isVolatile,
50 std::pair<SDValue, SDValue> CallResult = TLI.LowerCallTo(CLI);
50 std::pair<SDValue, SDValue> CallResult = TLI.LowerCallTo(CLI);
62 static SDValue EmitUnrolledSetTag(SelectionDAG &DAG, const SDLoc &dl,
63 SDValue Chain, SDValue Ptr, uint64_t ObjSize,
63 SDValue Chain, SDValue Ptr, uint64_t ObjSize,
69 SDValue TagSrc = Ptr;
81 SmallVector<SDValue, 8> OutChains;
85 SDValue AddrNode = DAG.getMemBasePlusOffset(Ptr, OffsetScaled * 16, dl);
86 SDValue St = DAG.getMemIntrinsicNode(
97 SDValue AddrNode = DAG.getMemBasePlusOffset(Ptr, OffsetScaled * 16, dl);
98 SDValue St = DAG.getMemIntrinsicNode(
108 SDValue Res = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, OutChains);
112 SDValue AArch64SelectionDAGInfo::EmitTargetCodeForSetTag(
113 SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Addr,
113 SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Addr,
114 SDValue Size, MachinePointerInfo DstPtrInfo, bool ZeroData) const {
140 SDValue Ops[] = {DAG.getConstant(ObjSize, dl, MVT::i64), Addr, Chain};
lib/Target/AArch64/AArch64SelectionDAGInfo.h 22 SDValue EmitTargetCodeForMemset(SelectionDAG &DAG, const SDLoc &dl,
23 SDValue Chain, SDValue Dst, SDValue Src,
23 SDValue Chain, SDValue Dst, SDValue Src,
23 SDValue Chain, SDValue Dst, SDValue Src,
24 SDValue Size, unsigned Align, bool isVolatile,
26 SDValue EmitTargetCodeForSetTag(SelectionDAG &DAG, const SDLoc &dl,
27 SDValue Chain, SDValue Op1, SDValue Op2,
27 SDValue Chain, SDValue Op1, SDValue Op2,
27 SDValue Chain, SDValue Op1, SDValue Op2,
lib/Target/AMDGPU/AMDGPUISelDAGToDAG.cpp 73 static bool isNullConstantOrUndef(SDValue V) {
81 static bool getConstantValue(SDValue N, uint32_t &Out) {
162 std::pair<SDValue, SDValue> foldFrameIndex(SDValue N) const;
162 std::pair<SDValue, SDValue> foldFrameIndex(SDValue N) const;
162 std::pair<SDValue, SDValue> foldFrameIndex(SDValue N) const;
163 bool isNoNanSrc(SDValue N) const;
175 SDNode *glueCopyToOp(SDNode *N, SDValue NewChain, SDValue Glue) const;
175 SDNode *glueCopyToOp(SDNode *N, SDValue NewChain, SDValue Glue) const;
176 SDNode *glueCopyToM0(SDNode *N, SDValue Val) const;
180 virtual bool SelectADDRVTX_READ(SDValue Addr, SDValue &Base, SDValue &Offset);
180 virtual bool SelectADDRVTX_READ(SDValue Addr, SDValue &Base, SDValue &Offset);
180 virtual bool SelectADDRVTX_READ(SDValue Addr, SDValue &Base, SDValue &Offset);
181 virtual bool SelectADDRIndirect(SDValue Addr, SDValue &Base, SDValue &Offset);
181 virtual bool SelectADDRIndirect(SDValue Addr, SDValue &Base, SDValue &Offset);
181 virtual bool SelectADDRIndirect(SDValue Addr, SDValue &Base, SDValue &Offset);
182 bool isDSOffsetLegal(SDValue Base, unsigned Offset,
184 bool SelectDS1Addr1Offset(SDValue Ptr, SDValue &Base, SDValue &Offset) const;
184 bool SelectDS1Addr1Offset(SDValue Ptr, SDValue &Base, SDValue &Offset) const;
184 bool SelectDS1Addr1Offset(SDValue Ptr, SDValue &Base, SDValue &Offset) const;
185 bool SelectDS64Bit4ByteAligned(SDValue Ptr, SDValue &Base, SDValue &Offset0,
185 bool SelectDS64Bit4ByteAligned(SDValue Ptr, SDValue &Base, SDValue &Offset0,
185 bool SelectDS64Bit4ByteAligned(SDValue Ptr, SDValue &Base, SDValue &Offset0,
186 SDValue &Offset1) const;
187 bool SelectMUBUF(SDValue Addr, SDValue &SRsrc, SDValue &VAddr,
187 bool SelectMUBUF(SDValue Addr, SDValue &SRsrc, SDValue &VAddr,
187 bool SelectMUBUF(SDValue Addr, SDValue &SRsrc, SDValue &VAddr,
188 SDValue &SOffset, SDValue &Offset, SDValue &Offen,
188 SDValue &SOffset, SDValue &Offset, SDValue &Offen,
188 SDValue &SOffset, SDValue &Offset, SDValue &Offen,
189 SDValue &Idxen, SDValue &Addr64, SDValue &GLC, SDValue &SLC,
189 SDValue &Idxen, SDValue &Addr64, SDValue &GLC, SDValue &SLC,
189 SDValue &Idxen, SDValue &Addr64, SDValue &GLC, SDValue &SLC,
189 SDValue &Idxen, SDValue &Addr64, SDValue &GLC, SDValue &SLC,
190 SDValue &TFE, SDValue &DLC, SDValue &SWZ) const;
190 SDValue &TFE, SDValue &DLC, SDValue &SWZ) const;
190 SDValue &TFE, SDValue &DLC, SDValue &SWZ) const;
191 bool SelectMUBUFAddr64(SDValue Addr, SDValue &SRsrc, SDValue &VAddr,
191 bool SelectMUBUFAddr64(SDValue Addr, SDValue &SRsrc, SDValue &VAddr,
191 bool SelectMUBUFAddr64(SDValue Addr, SDValue &SRsrc, SDValue &VAddr,
192 SDValue &SOffset, SDValue &Offset, SDValue &GLC,
192 SDValue &SOffset, SDValue &Offset, SDValue &GLC,
192 SDValue &SOffset, SDValue &Offset, SDValue &GLC,
193 SDValue &SLC, SDValue &TFE, SDValue &DLC,
193 SDValue &SLC, SDValue &TFE, SDValue &DLC,
193 SDValue &SLC, SDValue &TFE, SDValue &DLC,
194 SDValue &SWZ) const;
195 bool SelectMUBUFAddr64(SDValue Addr, SDValue &SRsrc,
195 bool SelectMUBUFAddr64(SDValue Addr, SDValue &SRsrc,
196 SDValue &VAddr, SDValue &SOffset, SDValue &Offset,
196 SDValue &VAddr, SDValue &SOffset, SDValue &Offset,
196 SDValue &VAddr, SDValue &SOffset, SDValue &Offset,
197 SDValue &SLC) const;
199 SDValue Addr, SDValue &RSrc, SDValue &VAddr,
199 SDValue Addr, SDValue &RSrc, SDValue &VAddr,
199 SDValue Addr, SDValue &RSrc, SDValue &VAddr,
200 SDValue &SOffset, SDValue &ImmOffset) const;
200 SDValue &SOffset, SDValue &ImmOffset) const;
202 SDValue Addr, SDValue &SRsrc, SDValue &Soffset,
202 SDValue Addr, SDValue &SRsrc, SDValue &Soffset,
202 SDValue Addr, SDValue &SRsrc, SDValue &Soffset,
203 SDValue &Offset) const;
205 bool SelectMUBUFOffset(SDValue Addr, SDValue &SRsrc, SDValue &SOffset,
205 bool SelectMUBUFOffset(SDValue Addr, SDValue &SRsrc, SDValue &SOffset,
205 bool SelectMUBUFOffset(SDValue Addr, SDValue &SRsrc, SDValue &SOffset,
206 SDValue &Offset, SDValue &GLC, SDValue &SLC,
206 SDValue &Offset, SDValue &GLC, SDValue &SLC,
206 SDValue &Offset, SDValue &GLC, SDValue &SLC,
207 SDValue &TFE, SDValue &DLC, SDValue &SWZ) const;
207 SDValue &TFE, SDValue &DLC, SDValue &SWZ) const;
207 SDValue &TFE, SDValue &DLC, SDValue &SWZ) const;
208 bool SelectMUBUFOffset(SDValue Addr, SDValue &SRsrc, SDValue &Soffset,
208 bool SelectMUBUFOffset(SDValue Addr, SDValue &SRsrc, SDValue &Soffset,
208 bool SelectMUBUFOffset(SDValue Addr, SDValue &SRsrc, SDValue &Soffset,
209 SDValue &Offset, SDValue &SLC) const;
209 SDValue &Offset, SDValue &SLC) const;
210 bool SelectMUBUFOffset(SDValue Addr, SDValue &SRsrc, SDValue &Soffset,
210 bool SelectMUBUFOffset(SDValue Addr, SDValue &SRsrc, SDValue &Soffset,
210 bool SelectMUBUFOffset(SDValue Addr, SDValue &SRsrc, SDValue &Soffset,
211 SDValue &Offset) const;
214 bool SelectFlatOffset(SDNode *N, SDValue Addr, SDValue &VAddr,
214 bool SelectFlatOffset(SDNode *N, SDValue Addr, SDValue &VAddr,
215 SDValue &Offset, SDValue &SLC) const;
215 SDValue &Offset, SDValue &SLC) const;
216 bool SelectFlatAtomic(SDNode *N, SDValue Addr, SDValue &VAddr,
216 bool SelectFlatAtomic(SDNode *N, SDValue Addr, SDValue &VAddr,
217 SDValue &Offset, SDValue &SLC) const;
217 SDValue &Offset, SDValue &SLC) const;
218 bool SelectFlatAtomicSigned(SDNode *N, SDValue Addr, SDValue &VAddr,
218 bool SelectFlatAtomicSigned(SDNode *N, SDValue Addr, SDValue &VAddr,
219 SDValue &Offset, SDValue &SLC) const;
219 SDValue &Offset, SDValue &SLC) const;
221 bool SelectSMRDOffset(SDValue ByteOffsetNode, SDValue &Offset,
221 bool SelectSMRDOffset(SDValue ByteOffsetNode, SDValue &Offset,
223 SDValue Expand32BitAddress(SDValue Addr) const;
223 SDValue Expand32BitAddress(SDValue Addr) const;
224 bool SelectSMRD(SDValue Addr, SDValue &SBase, SDValue &Offset,
224 bool SelectSMRD(SDValue Addr, SDValue &SBase, SDValue &Offset,
224 bool SelectSMRD(SDValue Addr, SDValue &SBase, SDValue &Offset,
226 bool SelectSMRDImm(SDValue Addr, SDValue &SBase, SDValue &Offset) const;
226 bool SelectSMRDImm(SDValue Addr, SDValue &SBase, SDValue &Offset) const;
226 bool SelectSMRDImm(SDValue Addr, SDValue &SBase, SDValue &Offset) const;
227 bool SelectSMRDImm32(SDValue Addr, SDValue &SBase, SDValue &Offset) const;
227 bool SelectSMRDImm32(SDValue Addr, SDValue &SBase, SDValue &Offset) const;
227 bool SelectSMRDImm32(SDValue Addr, SDValue &SBase, SDValue &Offset) const;
228 bool SelectSMRDSgpr(SDValue Addr, SDValue &SBase, SDValue &Offset) const;
228 bool SelectSMRDSgpr(SDValue Addr, SDValue &SBase, SDValue &Offset) const;
228 bool SelectSMRDSgpr(SDValue Addr, SDValue &SBase, SDValue &Offset) const;
229 bool SelectSMRDBufferImm(SDValue Addr, SDValue &Offset) const;
229 bool SelectSMRDBufferImm(SDValue Addr, SDValue &Offset) const;
230 bool SelectSMRDBufferImm32(SDValue Addr, SDValue &Offset) const;
230 bool SelectSMRDBufferImm32(SDValue Addr, SDValue &Offset) const;
231 bool SelectMOVRELOffset(SDValue Index, SDValue &Base, SDValue &Offset) const;
231 bool SelectMOVRELOffset(SDValue Index, SDValue &Base, SDValue &Offset) const;
231 bool SelectMOVRELOffset(SDValue Index, SDValue &Base, SDValue &Offset) const;
233 bool SelectVOP3Mods_NNaN(SDValue In, SDValue &Src, SDValue &SrcMods) const;
233 bool SelectVOP3Mods_NNaN(SDValue In, SDValue &Src, SDValue &SrcMods) const;
233 bool SelectVOP3Mods_NNaN(SDValue In, SDValue &Src, SDValue &SrcMods) const;
234 bool SelectVOP3Mods_f32(SDValue In, SDValue &Src, SDValue &SrcMods) const;
234 bool SelectVOP3Mods_f32(SDValue In, SDValue &Src, SDValue &SrcMods) const;
234 bool SelectVOP3Mods_f32(SDValue In, SDValue &Src, SDValue &SrcMods) const;
235 bool SelectVOP3ModsImpl(SDValue In, SDValue &Src, unsigned &SrcMods) const;
235 bool SelectVOP3ModsImpl(SDValue In, SDValue &Src, unsigned &SrcMods) const;
236 bool SelectVOP3Mods(SDValue In, SDValue &Src, SDValue &SrcMods) const;
236 bool SelectVOP3Mods(SDValue In, SDValue &Src, SDValue &SrcMods) const;
236 bool SelectVOP3Mods(SDValue In, SDValue &Src, SDValue &SrcMods) const;
237 bool SelectVOP3NoMods(SDValue In, SDValue &Src) const;
237 bool SelectVOP3NoMods(SDValue In, SDValue &Src) const;
238 bool SelectVOP3Mods0(SDValue In, SDValue &Src, SDValue &SrcMods,
238 bool SelectVOP3Mods0(SDValue In, SDValue &Src, SDValue &SrcMods,
238 bool SelectVOP3Mods0(SDValue In, SDValue &Src, SDValue &SrcMods,
239 SDValue &Clamp, SDValue &Omod) const;
239 SDValue &Clamp, SDValue &Omod) const;
240 bool SelectVOP3NoMods0(SDValue In, SDValue &Src, SDValue &SrcMods,
240 bool SelectVOP3NoMods0(SDValue In, SDValue &Src, SDValue &SrcMods,
240 bool SelectVOP3NoMods0(SDValue In, SDValue &Src, SDValue &SrcMods,
241 SDValue &Clamp, SDValue &Omod) const;
241 SDValue &Clamp, SDValue &Omod) const;
243 bool SelectVOP3Mods0Clamp0OMod(SDValue In, SDValue &Src, SDValue &SrcMods,
243 bool SelectVOP3Mods0Clamp0OMod(SDValue In, SDValue &Src, SDValue &SrcMods,
243 bool SelectVOP3Mods0Clamp0OMod(SDValue In, SDValue &Src, SDValue &SrcMods,
244 SDValue &Clamp,
245 SDValue &Omod) const;
247 bool SelectVOP3OMods(SDValue In, SDValue &Src,
247 bool SelectVOP3OMods(SDValue In, SDValue &Src,
248 SDValue &Clamp, SDValue &Omod) const;
248 SDValue &Clamp, SDValue &Omod) const;
250 bool SelectVOP3PMods(SDValue In, SDValue &Src, SDValue &SrcMods) const;
250 bool SelectVOP3PMods(SDValue In, SDValue &Src, SDValue &SrcMods) const;
250 bool SelectVOP3PMods(SDValue In, SDValue &Src, SDValue &SrcMods) const;
251 bool SelectVOP3PMods0(SDValue In, SDValue &Src, SDValue &SrcMods,
251 bool SelectVOP3PMods0(SDValue In, SDValue &Src, SDValue &SrcMods,
251 bool SelectVOP3PMods0(SDValue In, SDValue &Src, SDValue &SrcMods,
252 SDValue &Clamp) const;
254 bool SelectVOP3OpSel(SDValue In, SDValue &Src, SDValue &SrcMods) const;
254 bool SelectVOP3OpSel(SDValue In, SDValue &Src, SDValue &SrcMods) const;
254 bool SelectVOP3OpSel(SDValue In, SDValue &Src, SDValue &SrcMods) const;
255 bool SelectVOP3OpSel0(SDValue In, SDValue &Src, SDValue &SrcMods,
255 bool SelectVOP3OpSel0(SDValue In, SDValue &Src, SDValue &SrcMods,
255 bool SelectVOP3OpSel0(SDValue In, SDValue &Src, SDValue &SrcMods,
256 SDValue &Clamp) const;
258 bool SelectVOP3OpSelMods(SDValue In, SDValue &Src, SDValue &SrcMods) const;
258 bool SelectVOP3OpSelMods(SDValue In, SDValue &Src, SDValue &SrcMods) const;
258 bool SelectVOP3OpSelMods(SDValue In, SDValue &Src, SDValue &SrcMods) const;
259 bool SelectVOP3OpSelMods0(SDValue In, SDValue &Src, SDValue &SrcMods,
259 bool SelectVOP3OpSelMods0(SDValue In, SDValue &Src, SDValue &SrcMods,
259 bool SelectVOP3OpSelMods0(SDValue In, SDValue &Src, SDValue &SrcMods,
260 SDValue &Clamp) const;
261 bool SelectVOP3PMadMixModsImpl(SDValue In, SDValue &Src, unsigned &Mods) const;
261 bool SelectVOP3PMadMixModsImpl(SDValue In, SDValue &Src, unsigned &Mods) const;
262 bool SelectVOP3PMadMixMods(SDValue In, SDValue &Src, SDValue &SrcMods) const;
262 bool SelectVOP3PMadMixMods(SDValue In, SDValue &Src, SDValue &SrcMods) const;
262 bool SelectVOP3PMadMixMods(SDValue In, SDValue &Src, SDValue &SrcMods) const;
264 SDValue getHi16Elt(SDValue In) const;
264 SDValue getHi16Elt(SDValue In) const;
266 SDValue getMaterializedScalarImm32(int64_t Val, const SDLoc &DL) const;
277 SDNode *getS_BFE(unsigned Opcode, const SDLoc &DL, SDValue Val,
300 bool SelectGlobalValueConstantOffset(SDValue Addr, SDValue& IntPtr);
300 bool SelectGlobalValueConstantOffset(SDValue Addr, SDValue& IntPtr);
301 bool SelectGlobalValueVariableOffset(SDValue Addr, SDValue &BaseReg,
301 bool SelectGlobalValueVariableOffset(SDValue Addr, SDValue &BaseReg,
302 SDValue& Offset);
309 bool SelectADDRIndirect(SDValue Addr, SDValue &Base,
309 bool SelectADDRIndirect(SDValue Addr, SDValue &Base,
310 SDValue &Offset) override;
311 bool SelectADDRVTX_READ(SDValue Addr, SDValue &Base,
311 bool SelectADDRVTX_READ(SDValue Addr, SDValue &Base,
312 SDValue &Offset) override;
323 static SDValue stripBitcast(SDValue Val) {
323 static SDValue stripBitcast(SDValue Val) {
328 static bool isExtractHiElt(SDValue In, SDValue &Out) {
328 static bool isExtractHiElt(SDValue In, SDValue &Out) {
333 SDValue Srl = In.getOperand(0);
348 static SDValue stripExtractLoElt(SDValue In) {
348 static SDValue stripExtractLoElt(SDValue In) {
350 SDValue Src = In.getOperand(0);
404 SDValue Lo = N->getOperand(0);
405 SDValue Hi = N->getOperand(1);
418 SDValue TiedIn = CurDAG->getNode(ISD::SCALAR_TO_VECTOR, SDLoc(N), VT, Lo);
419 SDValue Ops[] = {
431 SDValue NewLoadHi =
446 SDValue TiedIn = getHi16Elt(Hi);
461 SDValue Ops[] = {
465 SDValue NewLoadLo =
506 bool AMDGPUDAGToDAGISel::isNoNanSrc(SDValue N) const {
581 SDValue SubRegOp = N->getOperand(OpNo + 1);
589 SDNode *AMDGPUDAGToDAGISel::glueCopyToOp(SDNode *N, SDValue NewChain,
590 SDValue Glue) const {
591 SmallVector <SDValue, 8> Ops;
600 SDNode *AMDGPUDAGToDAGISel::glueCopyToM0(SDNode *N, SDValue Val) const {
606 SDValue M0 = Lowering.copyToM0(*CurDAG, N->getOperand(0), SDLoc(N), Val);
632 const SDValue Ops[] = {
668 SDValue RegClass = CurDAG->getTargetConstant(RegClassID, DL, MVT::i32);
681 SmallVector<SDValue, 32 * 2 + 1> RegSeqArgs(NumVectorElts * 2 + 1);
791 SDValue RC, SubReg0, SubReg1;
804 const SDValue Ops[] = { RC, N->getOperand(0), SubReg0,
941 bool AMDGPUDAGToDAGISel::SelectADDRVTX_READ(SDValue Addr, SDValue &Base,
941 bool AMDGPUDAGToDAGISel::SelectADDRVTX_READ(SDValue Addr, SDValue &Base,
942 SDValue &Offset) {
946 bool AMDGPUDAGToDAGISel::SelectADDRIndirect(SDValue Addr, SDValue &Base,
946 bool AMDGPUDAGToDAGISel::SelectADDRIndirect(SDValue Addr, SDValue &Base,
947 SDValue &Offset) {
970 SDValue AMDGPUDAGToDAGISel::getMaterializedScalarImm32(int64_t Val,
981 SDValue LHS = N->getOperand(0);
982 SDValue RHS = N->getOperand(1);
990 SDValue Sub0 = CurDAG->getTargetConstant(AMDGPU::sub0, DL, MVT::i32);
991 SDValue Sub1 = CurDAG->getTargetConstant(AMDGPU::sub1, DL, MVT::i32);
1010 SDValue Args[] = { SDValue(Lo0, 0), SDValue(Lo1, 0) };
1013 SDValue Args[] = { SDValue(Lo0, 0), SDValue(Lo1, 0), N->getOperand(2) };
1016 SDValue AddHiArgs[] = {
1023 SDValue RegSequenceArgs[] = {
1044 SDValue LHS = N->getOperand(0);
1045 SDValue RHS = N->getOperand(1);
1046 SDValue CI = N->getOperand(2);
1071 SDValue Ops[10];
1085 SDValue Ops[8];
1106 SDValue Ops[] = { N->getOperand(0), N->getOperand(1), N->getOperand(2) };
1122 SDValue CarryIn = N->getOperand(3);
1124 SDValue VCC = CurDAG->getCopyToReg(CurDAG->getEntryNode(), SL,
1127 SDValue Ops[10];
1146 SDValue Clamp = CurDAG->getTargetConstant(0, SL, MVT::i1);
1147 SDValue Ops[] = { N->getOperand(0), N->getOperand(1), N->getOperand(2),
1152 bool AMDGPUDAGToDAGISel::isDSOffsetLegal(SDValue Base, unsigned Offset,
1167 bool AMDGPUDAGToDAGISel::SelectDS1Addr1Offset(SDValue Addr, SDValue &Base,
1167 bool AMDGPUDAGToDAGISel::SelectDS1Addr1Offset(SDValue Addr, SDValue &Base,
1168 SDValue &Offset) const {
1171 SDValue N0 = Addr.getOperand(0);
1172 SDValue N1 = Addr.getOperand(1);
1185 SDValue Zero = CurDAG->getTargetConstant(0, DL, MVT::i32);
1190 SDValue Sub = CurDAG->getNode(ISD::SUB, DL, MVT::i32,
1194 SmallVector<SDValue, 3> Opnds;
1224 SDValue Zero = CurDAG->getTargetConstant(0, DL, MVT::i32);
1240 bool AMDGPUDAGToDAGISel::SelectDS64Bit4ByteAligned(SDValue Addr, SDValue &Base,
1240 bool AMDGPUDAGToDAGISel::SelectDS64Bit4ByteAligned(SDValue Addr, SDValue &Base,
1241 SDValue &Offset0,
1242 SDValue &Offset1) const {
1246 SDValue N0 = Addr.getOperand(0);
1247 SDValue N1 = Addr.getOperand(1);
1266 SDValue Zero = CurDAG->getTargetConstant(0, DL, MVT::i32);
1271 SDValue Sub = CurDAG->getNode(ISD::SUB, DL, MVT::i32,
1275 SmallVector<SDValue, 3> Opnds;
1301 SDValue Zero = CurDAG->getTargetConstant(0, DL, MVT::i32);
1320 bool AMDGPUDAGToDAGISel::SelectMUBUF(SDValue Addr, SDValue &Ptr,
1320 bool AMDGPUDAGToDAGISel::SelectMUBUF(SDValue Addr, SDValue &Ptr,
1321 SDValue &VAddr, SDValue &SOffset,
1321 SDValue &VAddr, SDValue &SOffset,
1322 SDValue &Offset, SDValue &Offen,
1322 SDValue &Offset, SDValue &Offen,
1323 SDValue &Idxen, SDValue &Addr64,
1323 SDValue &Idxen, SDValue &Addr64,
1324 SDValue &GLC, SDValue &SLC,
1324 SDValue &GLC, SDValue &SLC,
1325 SDValue &TFE, SDValue &DLC,
1325 SDValue &TFE, SDValue &DLC,
1326 SDValue &SWZ) const {
1347 SDValue N0 = Addr;
1359 SDValue N2 = N0.getOperand(0);
1360 SDValue N3 = N0.getOperand(1);
1415 bool AMDGPUDAGToDAGISel::SelectMUBUFAddr64(SDValue Addr, SDValue &SRsrc,
1415 bool AMDGPUDAGToDAGISel::SelectMUBUFAddr64(SDValue Addr, SDValue &SRsrc,
1416 SDValue &VAddr, SDValue &SOffset,
1416 SDValue &VAddr, SDValue &SOffset,
1417 SDValue &Offset, SDValue &GLC,
1417 SDValue &Offset, SDValue &GLC,
1418 SDValue &SLC, SDValue &TFE,
1418 SDValue &SLC, SDValue &TFE,
1419 SDValue &DLC, SDValue &SWZ) const {
1419 SDValue &DLC, SDValue &SWZ) const {
1420 SDValue Ptr, Offen, Idxen, Addr64;
1444 bool AMDGPUDAGToDAGISel::SelectMUBUFAddr64(SDValue Addr, SDValue &SRsrc,
1444 bool AMDGPUDAGToDAGISel::SelectMUBUFAddr64(SDValue Addr, SDValue &SRsrc,
1445 SDValue &VAddr, SDValue &SOffset,
1445 SDValue &VAddr, SDValue &SOffset,
1446 SDValue &Offset,
1447 SDValue &SLC) const {
1449 SDValue GLC, TFE, DLC, SWZ;
1459 std::pair<SDValue, SDValue> AMDGPUDAGToDAGISel::foldFrameIndex(SDValue N) const {
1459 std::pair<SDValue, SDValue> AMDGPUDAGToDAGISel::foldFrameIndex(SDValue N) const {
1459 std::pair<SDValue, SDValue> AMDGPUDAGToDAGISel::foldFrameIndex(SDValue N) const {
1464 SDValue TFI = CurDAG->getTargetFrameIndex(FI->getIndex(),
1480 SDValue Addr, SDValue &Rsrc,
1480 SDValue Addr, SDValue &Rsrc,
1481 SDValue &VAddr, SDValue &SOffset,
1481 SDValue &VAddr, SDValue &SOffset,
1482 SDValue &ImmOffset) const {
1493 SDValue HighBits = CurDAG->getTargetConstant(Imm & ~4095, DL, MVT::i32);
1512 SDValue N0 = Addr.getOperand(0);
1513 SDValue N1 = Addr.getOperand(1);
1547 SDValue Addr,
1548 SDValue &SRsrc,
1549 SDValue &SOffset,
1550 SDValue &Offset) const {
1573 bool AMDGPUDAGToDAGISel::SelectMUBUFOffset(SDValue Addr, SDValue &SRsrc,
1573 bool AMDGPUDAGToDAGISel::SelectMUBUFOffset(SDValue Addr, SDValue &SRsrc,
1574 SDValue &SOffset, SDValue &Offset,
1574 SDValue &SOffset, SDValue &Offset,
1575 SDValue &GLC, SDValue &SLC,
1575 SDValue &GLC, SDValue &SLC,
1576 SDValue &TFE, SDValue &DLC,
1576 SDValue &TFE, SDValue &DLC,
1577 SDValue &SWZ) const {
1578 SDValue Ptr, VAddr, Offen, Idxen, Addr64;
1602 bool AMDGPUDAGToDAGISel::SelectMUBUFOffset(SDValue Addr, SDValue &SRsrc,
1602 bool AMDGPUDAGToDAGISel::SelectMUBUFOffset(SDValue Addr, SDValue &SRsrc,
1603 SDValue &Soffset, SDValue &Offset
1603 SDValue &Soffset, SDValue &Offset
1605 SDValue GLC, SLC, TFE, DLC, SWZ;
1609 bool AMDGPUDAGToDAGISel::SelectMUBUFOffset(SDValue Addr, SDValue &SRsrc,
1609 bool AMDGPUDAGToDAGISel::SelectMUBUFOffset(SDValue Addr, SDValue &SRsrc,
1610 SDValue &Soffset, SDValue &Offset,
1610 SDValue &Soffset, SDValue &Offset,
1611 SDValue &SLC) const {
1612 SDValue GLC, TFE, DLC, SWZ;
1624 for (SDValue V : N->op_values())
1633 SDValue Addr,
1634 SDValue &VAddr,
1635 SDValue &Offset,
1636 SDValue &SLC) const {
1643 SDValue N0 = Addr.getOperand(0);
1644 SDValue N1 = Addr.getOperand(1);
1688 SDValue Sub0 = CurDAG->getTargetConstant(AMDGPU::sub0, DL, MVT::i32);
1689 SDValue Sub1 = CurDAG->getTargetConstant(AMDGPU::sub1, DL, MVT::i32);
1696 SDValue AddOffsetLo
1698 SDValue AddOffsetHi
1702 SDValue Clamp = CurDAG->getTargetConstant(0, DL, MVT::i1);
1712 SDValue RegSequenceArgs[] = {
1729 SDValue Addr,
1730 SDValue &VAddr,
1731 SDValue &Offset,
1732 SDValue &SLC) const {
1737 SDValue Addr,
1738 SDValue &VAddr,
1739 SDValue &Offset,
1740 SDValue &SLC) const {
1744 bool AMDGPUDAGToDAGISel::SelectSMRDOffset(SDValue ByteOffsetNode,
1745 SDValue &Offset, bool &Imm) const {
1770 SDValue C32Bit = CurDAG->getTargetConstant(ByteOffset, SL, MVT::i32);
1778 SDValue AMDGPUDAGToDAGISel::Expand32BitAddress(SDValue Addr) const {
1778 SDValue AMDGPUDAGToDAGISel::Expand32BitAddress(SDValue Addr) const {
1788 SDValue AddrHi = CurDAG->getTargetConstant(AddrHiVal, SL, MVT::i32);
1790 const SDValue Ops[] = {
1803 bool AMDGPUDAGToDAGISel::SelectSMRD(SDValue Addr, SDValue &SBase,
1803 bool AMDGPUDAGToDAGISel::SelectSMRD(SDValue Addr, SDValue &SBase,
1804 SDValue &Offset, bool &Imm) const {
1812 SDValue N0 = Addr.getOperand(0);
1813 SDValue N1 = Addr.getOperand(1);
1826 bool AMDGPUDAGToDAGISel::SelectSMRDImm(SDValue Addr, SDValue &SBase,
1826 bool AMDGPUDAGToDAGISel::SelectSMRDImm(SDValue Addr, SDValue &SBase,
1827 SDValue &Offset) const {
1832 bool AMDGPUDAGToDAGISel::SelectSMRDImm32(SDValue Addr, SDValue &SBase,
1832 bool AMDGPUDAGToDAGISel::SelectSMRDImm32(SDValue Addr, SDValue &SBase,
1833 SDValue &Offset) const {
1845 bool AMDGPUDAGToDAGISel::SelectSMRDSgpr(SDValue Addr, SDValue &SBase,
1845 bool AMDGPUDAGToDAGISel::SelectSMRDSgpr(SDValue Addr, SDValue &SBase,
1846 SDValue &Offset) const {
1852 bool AMDGPUDAGToDAGISel::SelectSMRDBufferImm(SDValue Addr,
1853 SDValue &Offset) const {
1858 bool AMDGPUDAGToDAGISel::SelectSMRDBufferImm32(SDValue Addr,
1859 SDValue &Offset) const {
1870 bool AMDGPUDAGToDAGISel::SelectMOVRELOffset(SDValue Index,
1871 SDValue &Base,
1872 SDValue &Offset) const {
1876 SDValue N0 = Index.getOperand(0);
1877 SDValue N1 = Index.getOperand(1);
1899 SDValue Val, uint32_t Offset,
1905 SDValue PackedConst = CurDAG->getTargetConstant(PackedVal, DL, MVT::i32);
1915 const SDValue &Shl = N->getOperand(0);
1941 const SDValue &Srl = N->getOperand(0);
1963 const SDValue &And = N->getOperand(0);
1993 SDValue Src = N->getOperand(0);
2016 SDValue Cond = N->getOperand(1);
2038 SDValue Cond = N->getOperand(1);
2078 SDValue VCC = CurDAG->getCopyToReg(N->getOperand(0), SL, CondReg, Cond);
2095 SDValue Src0 = N->getOperand(0);
2096 SDValue Src1 = N->getOperand(1);
2097 SDValue Src2 = N->getOperand(2);
2113 SDValue Zero = CurDAG->getTargetConstant(0, SDLoc(), MVT::i32);
2114 SDValue Ops[] = {
2146 SDValue SRsrc, VAddr, SOffset, Offset, SLC;
2151 SDValue CmpVal = Mem->getOperand(2);
2155 SDValue Ops[] = {
2164 SDValue SRsrc, SOffset, Offset, SLC;
2169 SDValue CmpVal = Mem->getOperand(2);
2170 SDValue Ops[] = {
2187 SDValue Extract
2201 SDValue Chain = N->getOperand(0);
2202 SDValue Ptr = N->getOperand(2);
2207 SDValue Offset;
2209 SDValue PtrBase = Ptr.getOperand(0);
2210 SDValue PtrOffset = Ptr.getOperand(1);
2224 SDValue Ops[] = {
2267 SDValue BaseOffset = N->getOperand(HasVSrc ? 3 : 2);
2305 SDValue Chain = N->getOperand(0);
2306 SDValue OffsetField = CurDAG->getTargetConstant(ImmOffset, SL, MVT::i32);
2309 SDValue GDS = CurDAG->getTargetConstant(1, SL, MVT::i1);
2312 SmallVector<SDValue, 5> Ops;
2356 SDValue Src = N->getOperand(1);
2378 bool AMDGPUDAGToDAGISel::SelectVOP3ModsImpl(SDValue In, SDValue &Src,
2378 bool AMDGPUDAGToDAGISel::SelectVOP3ModsImpl(SDValue In, SDValue &Src,
2396 bool AMDGPUDAGToDAGISel::SelectVOP3Mods(SDValue In, SDValue &Src,
2396 bool AMDGPUDAGToDAGISel::SelectVOP3Mods(SDValue In, SDValue &Src,
2397 SDValue &SrcMods) const {
2407 bool AMDGPUDAGToDAGISel::SelectVOP3Mods_NNaN(SDValue In, SDValue &Src,
2407 bool AMDGPUDAGToDAGISel::SelectVOP3Mods_NNaN(SDValue In, SDValue &Src,
2408 SDValue &SrcMods) const {
2413 bool AMDGPUDAGToDAGISel::SelectVOP3Mods_f32(SDValue In, SDValue &Src,
2413 bool AMDGPUDAGToDAGISel::SelectVOP3Mods_f32(SDValue In, SDValue &Src,
2414 SDValue &SrcMods) const {
2422 bool AMDGPUDAGToDAGISel::SelectVOP3NoMods(SDValue In, SDValue &Src) const {
2422 bool AMDGPUDAGToDAGISel::SelectVOP3NoMods(SDValue In, SDValue &Src) const {
2430 bool AMDGPUDAGToDAGISel::SelectVOP3Mods0(SDValue In, SDValue &Src,
2430 bool AMDGPUDAGToDAGISel::SelectVOP3Mods0(SDValue In, SDValue &Src,
2431 SDValue &SrcMods, SDValue &Clamp,
2431 SDValue &SrcMods, SDValue &Clamp,
2432 SDValue &Omod) const {
2440 bool AMDGPUDAGToDAGISel::SelectVOP3Mods0Clamp0OMod(SDValue In, SDValue &Src,
2440 bool AMDGPUDAGToDAGISel::SelectVOP3Mods0Clamp0OMod(SDValue In, SDValue &Src,
2441 SDValue &SrcMods,
2442 SDValue &Clamp,
2443 SDValue &Omod) const {
2448 bool AMDGPUDAGToDAGISel::SelectVOP3OMods(SDValue In, SDValue &Src,
2448 bool AMDGPUDAGToDAGISel::SelectVOP3OMods(SDValue In, SDValue &Src,
2449 SDValue &Clamp, SDValue &Omod) const {
2449 SDValue &Clamp, SDValue &Omod) const {
2459 bool AMDGPUDAGToDAGISel::SelectVOP3PMods(SDValue In, SDValue &Src,
2459 bool AMDGPUDAGToDAGISel::SelectVOP3PMods(SDValue In, SDValue &Src,
2460 SDValue &SrcMods) const {
2472 SDValue Lo = stripBitcast(Src.getOperand(0));
2473 SDValue Hi = stripBitcast(Src.getOperand(1));
2513 bool AMDGPUDAGToDAGISel::SelectVOP3PMods0(SDValue In, SDValue &Src,
2513 bool AMDGPUDAGToDAGISel::SelectVOP3PMods0(SDValue In, SDValue &Src,
2514 SDValue &SrcMods,
2515 SDValue &Clamp) const {
2524 bool AMDGPUDAGToDAGISel::SelectVOP3OpSel(SDValue In, SDValue &Src,
2524 bool AMDGPUDAGToDAGISel::SelectVOP3OpSel(SDValue In, SDValue &Src,
2525 SDValue &SrcMods) const {
2532 bool AMDGPUDAGToDAGISel::SelectVOP3OpSel0(SDValue In, SDValue &Src,
2532 bool AMDGPUDAGToDAGISel::SelectVOP3OpSel0(SDValue In, SDValue &Src,
2533 SDValue &SrcMods,
2534 SDValue &Clamp) const {
2543 bool AMDGPUDAGToDAGISel::SelectVOP3OpSelMods(SDValue In, SDValue &Src,
2543 bool AMDGPUDAGToDAGISel::SelectVOP3OpSelMods(SDValue In, SDValue &Src,
2544 SDValue &SrcMods) const {
2549 bool AMDGPUDAGToDAGISel::SelectVOP3OpSelMods0(SDValue In, SDValue &Src,
2549 bool AMDGPUDAGToDAGISel::SelectVOP3OpSelMods0(SDValue In, SDValue &Src,
2550 SDValue &SrcMods,
2551 SDValue &Clamp) const {
2562 bool AMDGPUDAGToDAGISel::SelectVOP3PMadMixModsImpl(SDValue In, SDValue &Src,
2562 bool AMDGPUDAGToDAGISel::SelectVOP3PMadMixModsImpl(SDValue In, SDValue &Src,
2603 bool AMDGPUDAGToDAGISel::SelectVOP3PMadMixMods(SDValue In, SDValue &Src,
2603 bool AMDGPUDAGToDAGISel::SelectVOP3PMadMixMods(SDValue In, SDValue &Src,
2604 SDValue &SrcMods) const {
2611 SDValue AMDGPUDAGToDAGISel::getHi16Elt(SDValue In) const {
2611 SDValue AMDGPUDAGToDAGISel::getHi16Elt(SDValue In) const {
2626 SDValue Src;
2747 bool R600DAGToDAGISel::SelectGlobalValueConstantOffset(SDValue Addr,
2748 SDValue& IntPtr) {
2757 bool R600DAGToDAGISel::SelectGlobalValueVariableOffset(SDValue Addr,
2758 SDValue& BaseReg, SDValue &Offset) {
2758 SDValue& BaseReg, SDValue &Offset) {
2804 bool R600DAGToDAGISel::SelectADDRIndirect(SDValue Addr, SDValue &Base,
2804 bool R600DAGToDAGISel::SelectADDRIndirect(SDValue Addr, SDValue &Base,
2805 SDValue &Offset) {
2828 bool R600DAGToDAGISel::SelectADDRVTX_READ(SDValue Addr, SDValue &Base,
2828 bool R600DAGToDAGISel::SelectADDRVTX_READ(SDValue Addr, SDValue &Base,
2829 SDValue &Offset) {
lib/Target/AMDGPU/AMDGPUISelLowering.cpp 51 unsigned AMDGPUTargetLowering::numBitsUnsigned(SDValue Op, SelectionDAG &DAG) {
57 unsigned AMDGPUTargetLowering::numBitsSigned(SDValue Op, SelectionDAG &DAG) {
819 bool AMDGPUTargetLowering::isZExtFree(SDValue Val, EVT VT2) const {
1019 SDValue AMDGPUTargetLowering::LowerReturn(
1020 SDValue Chain, CallingConv::ID CallConv,
1023 const SmallVectorImpl<SDValue> &OutVals,
1046 SDValue AMDGPUTargetLowering::addTokenForArgument(SDValue Chain,
1046 SDValue AMDGPUTargetLowering::addTokenForArgument(SDValue Chain,
1050 SmallVector<SDValue, 8> ArgChains;
1082 SDValue AMDGPUTargetLowering::lowerUnhandledCall(CallLoweringInfo &CLI,
1083 SmallVectorImpl<SDValue> &InVals,
1085 SDValue Callee = CLI.Callee;
1109 SDValue AMDGPUTargetLowering::LowerCall(CallLoweringInfo &CLI,
1110 SmallVectorImpl<SDValue> &InVals) const {
1114 SDValue AMDGPUTargetLowering::LowerDYNAMIC_STACKALLOC(SDValue Op,
1114 SDValue AMDGPUTargetLowering::LowerDYNAMIC_STACKALLOC(SDValue Op,
1125 SDValue AMDGPUTargetLowering::LowerOperation(SDValue Op,
1125 SDValue AMDGPUTargetLowering::LowerOperation(SDValue Op,
1167 SmallVectorImpl<SDValue> &Results,
1191 SDValue AMDGPUTargetLowering::LowerGlobalAddress(AMDGPUMachineFunction* MFI,
1192 SDValue Op,
1226 SDValue AMDGPUTargetLowering::LowerCONCAT_VECTORS(SDValue Op,
1226 SDValue AMDGPUTargetLowering::LowerCONCAT_VECTORS(SDValue Op,
1228 SmallVector<SDValue, 8> Args;
1233 SDValue Lo = DAG.getNode(ISD::BITCAST, SL, MVT::i32, Op.getOperand(0));
1234 SDValue Hi = DAG.getNode(ISD::BITCAST, SL, MVT::i32, Op.getOperand(1));
1236 SDValue BV = DAG.getBuildVector(MVT::v2i32, SL, { Lo, Hi });
1246 SDValue AMDGPUTargetLowering::LowerEXTRACT_SUBVECTOR(SDValue Op,
1246 SDValue AMDGPUTargetLowering::LowerEXTRACT_SUBVECTOR(SDValue Op,
1249 SmallVector<SDValue, 8> Args;
1259 SDValue AMDGPUTargetLowering::combineFMinMaxLegacy(const SDLoc &DL, EVT VT,
1260 SDValue LHS, SDValue RHS,
1260 SDValue LHS, SDValue RHS,
1261 SDValue True, SDValue False,
1261 SDValue True, SDValue False,
1262 SDValue CC,
1332 std::pair<SDValue, SDValue>
1332 std::pair<SDValue, SDValue>
1333 AMDGPUTargetLowering::split64BitValue(SDValue Op, SelectionDAG &DAG) const {
1336 SDValue Vec = DAG.getNode(ISD::BITCAST, SL, MVT::v2i32, Op);
1338 const SDValue Zero = DAG.getConstant(0, SL, MVT::i32);
1339 const SDValue One = DAG.getConstant(1, SL, MVT::i32);
1341 SDValue Lo = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, SL, MVT::i32, Vec, Zero);
1342 SDValue Hi = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, SL, MVT::i32, Vec, One);
1347 SDValue AMDGPUTargetLowering::getLoHalf64(SDValue Op, SelectionDAG &DAG) const {
1347 SDValue AMDGPUTargetLowering::getLoHalf64(SDValue Op, SelectionDAG &DAG) const {
1350 SDValue Vec = DAG.getNode(ISD::BITCAST, SL, MVT::v2i32, Op);
1351 const SDValue Zero = DAG.getConstant(0, SL, MVT::i32);
1355 SDValue AMDGPUTargetLowering::getHiHalf64(SDValue Op, SelectionDAG &DAG) const {
1355 SDValue AMDGPUTargetLowering::getHiHalf64(SDValue Op, SelectionDAG &DAG) const {
1358 SDValue Vec = DAG.getNode(ISD::BITCAST, SL, MVT::v2i32, Op);
1359 const SDValue One = DAG.getConstant(1, SL, MVT::i32);
1381 std::pair<SDValue, SDValue>
1381 std::pair<SDValue, SDValue>
1382 AMDGPUTargetLowering::splitVector(const SDValue &N, const SDLoc &DL,
1390 SDValue Lo = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, LoVT, N,
1392 SDValue Hi = DAG.getNode(
1398 SDValue AMDGPUTargetLowering::SplitVectorLoad(const SDValue Op,
1398 SDValue AMDGPUTargetLowering::SplitVectorLoad(const SDValue Op,
1409 SDValue BasePtr = Load->getBasePtr();
1417 SDValue Lo, Hi;
1427 SDValue LoLoad = DAG.getExtLoad(Load->getExtensionType(), SL, LoVT,
1430 SDValue HiPtr = DAG.getObjectPtrOffset(SL, BasePtr, Size);
1431 SDValue HiLoad =
1437 SDValue Join;
1450 SDValue Ops[] = {Join, DAG.getNode(ISD::TokenFactor, SL, MVT::Other,
1457 SDValue AMDGPUTargetLowering::WidenVectorLoad(SDValue Op,
1457 SDValue AMDGPUTargetLowering::WidenVectorLoad(SDValue Op,
1462 SDValue BasePtr = Load->getBasePtr();
1472 SDValue WideLoad = DAG.getExtLoad(
1482 SDValue AMDGPUTargetLowering::SplitVectorStore(SDValue Op,
1482 SDValue AMDGPUTargetLowering::SplitVectorStore(SDValue Op,
1485 SDValue Val = Store->getValue();
1494 SDValue Chain = Store->getChain();
1495 SDValue BasePtr = Store->getBasePtr();
1500 SDValue Lo, Hi;
1506 SDValue HiPtr = DAG.getObjectPtrOffset(SL, BasePtr, LoMemVT.getStoreSize());
1513 SDValue LoStore =
1516 SDValue HiStore =
1526 SDValue AMDGPUTargetLowering::LowerDIVREM24(SDValue Op, SelectionDAG &DAG,
1526 SDValue AMDGPUTargetLowering::LowerDIVREM24(SDValue Op, SelectionDAG &DAG,
1530 SDValue LHS = Op.getOperand(0);
1531 SDValue RHS = Op.getOperand(1);
1552 SDValue jq = DAG.getConstant(1, DL, IntVT);
1567 SDValue ia = LHS;
1570 SDValue ib = RHS;
1573 SDValue fa = DAG.getNode(ToFp, DL, FltVT, ia);
1576 SDValue fb = DAG.getNode(ToFp, DL, FltVT, ib);
1578 SDValue fq = DAG.getNode(ISD::FMUL, DL, FltVT,
1585 SDValue fqneg = DAG.getNode(ISD::FNEG, DL, FltVT, fq);
1591 SDValue fr = DAG.getNode(OpCode, DL, FltVT, fqneg, fb, fa);
1594 SDValue iq = DAG.getNode(ToInt, DL, IntVT, fq);
1605 SDValue cv = DAG.getSetCC(DL, SetCCVT, fr, fb, ISD::SETOGE);
1611 SDValue Div = DAG.getNode(ISD::ADD, DL, VT, iq, jq);
1614 SDValue Rem = DAG.getNode(ISD::MUL, DL, VT, Div, RHS);
1619 SDValue InRegSize
1624 SDValue TruncMask = DAG.getConstant((UINT64_C(1) << DivBits) - 1, DL, VT);
1632 void AMDGPUTargetLowering::LowerUDIVREM64(SDValue Op,
1634 SmallVectorImpl<SDValue> &Results) const {
1642 SDValue One = DAG.getConstant(1, DL, HalfVT);
1643 SDValue Zero = DAG.getConstant(0, DL, HalfVT);
1646 SDValue LHS = Op.getOperand(0);
1647 SDValue LHS_Lo = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, HalfVT, LHS, Zero);
1648 SDValue LHS_Hi = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, HalfVT, LHS, One);
1650 SDValue RHS = Op.getOperand(1);
1651 SDValue RHS_Lo = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, HalfVT, RHS, Zero);
1652 SDValue RHS_Hi = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, HalfVT, RHS, One);
1657 SDValue Res = DAG.getNode(ISD::UDIVREM, DL, DAG.getVTList(HalfVT, HalfVT),
1660 SDValue DIV = DAG.getBuildVector(MVT::v2i32, DL, {Res.getValue(0), Zero});
1661 SDValue REM = DAG.getBuildVector(MVT::v2i32, DL, {Res.getValue(1), Zero});
1674 SDValue Cvt_Lo = DAG.getNode(ISD::UINT_TO_FP, DL, MVT::f32, RHS_Lo);
1675 SDValue Cvt_Hi = DAG.getNode(ISD::UINT_TO_FP, DL, MVT::f32, RHS_Hi);
1676 SDValue Mad1 = DAG.getNode(FMAD, DL, MVT::f32, Cvt_Hi,
1679 SDValue Rcp = DAG.getNode(AMDGPUISD::RCP, DL, MVT::f32, Mad1);
1680 SDValue Mul1 = DAG.getNode(ISD::FMUL, DL, MVT::f32, Rcp,
1682 SDValue Mul2 = DAG.getNode(ISD::FMUL, DL, MVT::f32, Mul1,
1684 SDValue Trunc = DAG.getNode(ISD::FTRUNC, DL, MVT::f32, Mul2);
1685 SDValue Mad2 = DAG.getNode(FMAD, DL, MVT::f32, Trunc,
1688 SDValue Rcp_Lo = DAG.getNode(ISD::FP_TO_UINT, DL, HalfVT, Mad2);
1689 SDValue Rcp_Hi = DAG.getNode(ISD::FP_TO_UINT, DL, HalfVT, Trunc);
1690 SDValue Rcp64 = DAG.getBitcast(VT,
1693 SDValue Zero64 = DAG.getConstant(0, DL, VT);
1694 SDValue One64 = DAG.getConstant(1, DL, VT);
1695 SDValue Zero1 = DAG.getConstant(0, DL, MVT::i1);
1698 SDValue Neg_RHS = DAG.getNode(ISD::SUB, DL, VT, Zero64, RHS);
1699 SDValue Mullo1 = DAG.getNode(ISD::MUL, DL, VT, Neg_RHS, Rcp64);
1700 SDValue Mulhi1 = DAG.getNode(ISD::MULHU, DL, VT, Rcp64, Mullo1);
1701 SDValue Mulhi1_Lo = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, HalfVT, Mulhi1,
1703 SDValue Mulhi1_Hi = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, HalfVT, Mulhi1,
1706 SDValue Add1_Lo = DAG.getNode(ISD::ADDCARRY, DL, HalfCarryVT, Rcp_Lo,
1708 SDValue Add1_Hi = DAG.getNode(ISD::ADDCARRY, DL, HalfCarryVT, Rcp_Hi,
1710 SDValue Add1_HiNc = DAG.getNode(ISD::ADD, DL, HalfVT, Rcp_Hi, Mulhi1_Hi);
1711 SDValue Add1 = DAG.getBitcast(VT,
1714 SDValue Mullo2 = DAG.getNode(ISD::MUL, DL, VT, Neg_RHS, Add1);
1715 SDValue Mulhi2 = DAG.getNode(ISD::MULHU, DL, VT, Add1, Mullo2);
1716 SDValue Mulhi2_Lo = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, HalfVT, Mulhi2,
1718 SDValue Mulhi2_Hi = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, HalfVT, Mulhi2,
1721 SDValue Add2_Lo = DAG.getNode(ISD::ADDCARRY, DL, HalfCarryVT, Add1_Lo,
1723 SDValue Add2_HiC = DAG.getNode(ISD::ADDCARRY, DL, HalfCarryVT, Add1_HiNc,
1725 SDValue Add2_Hi = DAG.getNode(ISD::ADDCARRY, DL, HalfCarryVT, Add2_HiC,
1727 SDValue Add2 = DAG.getBitcast(VT,
1729 SDValue Mulhi3 = DAG.getNode(ISD::MULHU, DL, VT, LHS, Add2);
1731 SDValue Mul3 = DAG.getNode(ISD::MUL, DL, VT, RHS, Mulhi3);
1733 SDValue Mul3_Lo = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, HalfVT, Mul3, Zero);
1734 SDValue Mul3_Hi = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, HalfVT, Mul3, One);
1735 SDValue Sub1_Lo = DAG.getNode(ISD::SUBCARRY, DL, HalfCarryVT, LHS_Lo,
1737 SDValue Sub1_Hi = DAG.getNode(ISD::SUBCARRY, DL, HalfCarryVT, LHS_Hi,
1739 SDValue Sub1_Mi = DAG.getNode(ISD::SUB, DL, HalfVT, LHS_Hi, Mul3_Hi);
1740 SDValue Sub1 = DAG.getBitcast(VT,
1743 SDValue MinusOne = DAG.getConstant(0xffffffffu, DL, HalfVT);
1744 SDValue C1 = DAG.getSelectCC(DL, Sub1_Hi, RHS_Hi, MinusOne, Zero,
1746 SDValue C2 = DAG.getSelectCC(DL, Sub1_Lo, RHS_Lo, MinusOne, Zero,
1748 SDValue C3 = DAG.getSelectCC(DL, Sub1_Hi, RHS_Hi, C2, C1, ISD::SETEQ);
1755 SDValue Sub2_Lo = DAG.getNode(ISD::SUBCARRY, DL, HalfCarryVT, Sub1_Lo,
1757 SDValue Sub2_Mi = DAG.getNode(ISD::SUBCARRY, DL, HalfCarryVT, Sub1_Mi,
1759 SDValue Sub2_Hi = DAG.getNode(ISD::SUBCARRY, DL, HalfCarryVT, Sub2_Mi,
1761 SDValue Sub2 = DAG.getBitcast(VT,
1764 SDValue Add3 = DAG.getNode(ISD::ADD, DL, VT, Mulhi3, One64);
1766 SDValue C4 = DAG.getSelectCC(DL, Sub2_Hi, RHS_Hi, MinusOne, Zero,
1768 SDValue C5 = DAG.getSelectCC(DL, Sub2_Lo, RHS_Lo, MinusOne, Zero,
1770 SDValue C6 = DAG.getSelectCC(DL, Sub2_Hi, RHS_Hi, C5, C4, ISD::SETEQ);
1773 SDValue Add4 = DAG.getNode(ISD::ADD, DL, VT, Add3, One64);
1775 SDValue Sub3_Lo = DAG.getNode(ISD::SUBCARRY, DL, HalfCarryVT, Sub2_Lo,
1777 SDValue Sub3_Mi = DAG.getNode(ISD::SUBCARRY, DL, HalfCarryVT, Sub2_Mi,
1779 SDValue Sub3_Hi = DAG.getNode(ISD::SUBCARRY, DL, HalfCarryVT, Sub3_Mi,
1781 SDValue Sub3 = DAG.getBitcast(VT,
1787 SDValue Sel1 = DAG.getSelectCC(DL, C6, Zero, Add4, Add3, ISD::SETNE);
1788 SDValue Div = DAG.getSelectCC(DL, C3, Zero, Sel1, Mulhi3, ISD::SETNE);
1790 SDValue Sel2 = DAG.getSelectCC(DL, C6, Zero, Sub3, Sub2, ISD::SETNE);
1791 SDValue Rem = DAG.getSelectCC(DL, C3, Zero, Sel2, Sub1, ISD::SETNE);
1801 SDValue DIV_Part = DAG.getNode(ISD::UDIV, DL, HalfVT, LHS_Hi, RHS_Lo);
1802 SDValue REM_Part = DAG.getNode(ISD::UREM, DL, HalfVT, LHS_Hi, RHS_Lo);
1804 SDValue REM_Lo = DAG.getSelectCC(DL, RHS_Hi, Zero, REM_Part, LHS_Hi, ISD::SETEQ);
1805 SDValue REM = DAG.getBuildVector(MVT::v2i32, DL, {REM_Lo, Zero});
1808 SDValue DIV_Hi = DAG.getSelectCC(DL, RHS_Hi, Zero, DIV_Part, Zero, ISD::SETEQ);
1809 SDValue DIV_Lo = Zero;
1815 SDValue POS = DAG.getConstant(bitPos, DL, HalfVT);
1817 SDValue HBit = DAG.getNode(ISD::SRL, DL, HalfVT, LHS_Lo, POS);
1826 SDValue BIT = DAG.getConstant(1ULL << bitPos, DL, HalfVT);
1827 SDValue realBIT = DAG.getSelectCC(DL, REM, RHS, BIT, Zero, ISD::SETUGE);
1832 SDValue REM_sub = DAG.getNode(ISD::SUB, DL, VT, REM, RHS);
1836 SDValue DIV = DAG.getBuildVector(MVT::v2i32, DL, {DIV_Lo, DIV_Hi});
1842 SDValue AMDGPUTargetLowering::LowerUDIVREM(SDValue Op,
1842 SDValue AMDGPUTargetLowering::LowerUDIVREM(SDValue Op,
1848 SmallVector<SDValue, 2> Results;
1854 if (SDValue Res = LowerDIVREM24(Op, DAG, false))
1858 SDValue Num = Op.getOperand(0);
1859 SDValue Den = Op.getOperand(1);
1863 SDValue RCP = DAG.getNode(AMDGPUISD::URECIP, DL, VT, Den);
1866 SDValue RCP_LO = DAG.getNode(ISD::MUL, DL, VT, RCP, Den);
1869 SDValue RCP_HI = DAG.getNode(ISD::MULHU, DL, VT, RCP, Den);
1872 SDValue NEG_RCP_LO = DAG.getNode(ISD::SUB, DL, VT, DAG.getConstant(0, DL, VT),
1876 SDValue ABS_RCP_LO = DAG.getSelectCC(DL, RCP_HI, DAG.getConstant(0, DL, VT),
1881 SDValue E = DAG.getNode(ISD::MULHU, DL, VT, ABS_RCP_LO, RCP);
1884 SDValue RCP_A_E = DAG.getNode(ISD::ADD, DL, VT, RCP, E);
1887 SDValue RCP_S_E = DAG.getNode(ISD::SUB, DL, VT, RCP, E);
1890 SDValue Tmp0 = DAG.getSelectCC(DL, RCP_HI, DAG.getConstant(0, DL, VT),
1894 SDValue Quotient = DAG.getNode(ISD::MULHU, DL, VT, Tmp0, Num);
1897 SDValue Num_S_Remainder = DAG.getNode(ISD::MUL, DL, VT, Quotient, Den);
1900 SDValue Remainder = DAG.getNode(ISD::SUB, DL, VT, Num, Num_S_Remainder);
1903 SDValue Remainder_GE_Den = DAG.getSelectCC(DL, Remainder, Den,
1908 SDValue Remainder_GE_Zero = DAG.getSelectCC(DL, Num,
1914 SDValue Tmp1 = DAG.getNode(ISD::AND, DL, VT, Remainder_GE_Den,
1920 SDValue Quotient_A_One = DAG.getNode(ISD::ADD, DL, VT, Quotient,
1924 SDValue Quotient_S_One = DAG.getNode(ISD::SUB, DL, VT, Quotient,
1928 SDValue Div = DAG.getSelectCC(DL, Tmp1, DAG.getConstant(0, DL, VT),
1938 SDValue Remainder_S_Den = DAG.getNode(ISD::SUB, DL, VT, Remainder, Den);
1941 SDValue Remainder_A_Den = DAG.getNode(ISD::ADD, DL, VT, Remainder, Den);
1944 SDValue Rem = DAG.getSelectCC(DL, Tmp1, DAG.getConstant(0, DL, VT),
1950 SDValue Ops[2] = {
1957 SDValue AMDGPUTargetLowering::LowerSDIVREM(SDValue Op,
1957 SDValue AMDGPUTargetLowering::LowerSDIVREM(SDValue Op,
1962 SDValue LHS = Op.getOperand(0);
1963 SDValue RHS = Op.getOperand(1);
1965 SDValue Zero = DAG.getConstant(0, DL, VT);
1966 SDValue NegOne = DAG.getConstant(-1, DL, VT);
1969 if (SDValue Res = LowerDIVREM24(Op, DAG, true))
1979 SDValue LHS_Lo = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, HalfVT, LHS, Zero);
1980 SDValue RHS_Lo = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, HalfVT, RHS, Zero);
1981 SDValue DIVREM = DAG.getNode(ISD::SDIVREM, DL, DAG.getVTList(HalfVT, HalfVT),
1983 SDValue Res[2] = {
1990 SDValue LHSign = DAG.getSelectCC(DL, LHS, Zero, NegOne, Zero, ISD::SETLT);
1991 SDValue RHSign = DAG.getSelectCC(DL, RHS, Zero, NegOne, Zero, ISD::SETLT);
1992 SDValue DSign = DAG.getNode(ISD::XOR, DL, VT, LHSign, RHSign);
1993 SDValue RSign = LHSign; // Remainder sign is the same as LHS
2001 SDValue Div = DAG.getNode(ISD::UDIVREM, DL, DAG.getVTList(VT, VT), LHS, RHS);
2002 SDValue Rem = Div.getValue(1);
2010 SDValue Res[2] = {
2018 SDValue AMDGPUTargetLowering::LowerFREM(SDValue Op, SelectionDAG &DAG) const {
2018 SDValue AMDGPUTargetLowering::LowerFREM(SDValue Op, SelectionDAG &DAG) const {
2021 SDValue X = Op.getOperand(0);
2022 SDValue Y = Op.getOperand(1);
2026 SDValue Div = DAG.getNode(ISD::FDIV, SL, VT, X, Y);
2027 SDValue Floor = DAG.getNode(ISD::FTRUNC, SL, VT, Div);
2028 SDValue Mul = DAG.getNode(ISD::FMUL, SL, VT, Floor, Y);
2033 SDValue AMDGPUTargetLowering::LowerFCEIL(SDValue Op, SelectionDAG &DAG) const {
2033 SDValue AMDGPUTargetLowering::LowerFCEIL(SDValue Op, SelectionDAG &DAG) const {
2035 SDValue Src = Op.getOperand(0);
2041 SDValue Trunc = DAG.getNode(ISD::FTRUNC, SL, MVT::f64, Src);
2043 const SDValue Zero = DAG.getConstantFP(0.0, SL, MVT::f64);
2044 const SDValue One = DAG.getConstantFP(1.0, SL, MVT::f64);
2049 SDValue Lt0 = DAG.getSetCC(SL, SetCCVT, Src, Zero, ISD::SETOGT);
2050 SDValue NeTrunc = DAG.getSetCC(SL, SetCCVT, Src, Trunc, ISD::SETONE);
2051 SDValue And = DAG.getNode(ISD::AND, SL, SetCCVT, Lt0, NeTrunc);
2053 SDValue Add = DAG.getNode(ISD::SELECT, SL, MVT::f64, And, One, Zero);
2058 static SDValue extractF64Exponent(SDValue Hi, const SDLoc &SL,
2058 static SDValue extractF64Exponent(SDValue Hi, const SDLoc &SL,
2063 SDValue ExpPart = DAG.getNode(AMDGPUISD::BFE_U32, SL, MVT::i32,
2067 SDValue Exp = DAG.getNode(ISD::SUB, SL, MVT::i32, ExpPart,
2073 SDValue AMDGPUTargetLowering::LowerFTRUNC(SDValue Op, SelectionDAG &DAG) const {
2073 SDValue AMDGPUTargetLowering::LowerFTRUNC(SDValue Op, SelectionDAG &DAG) const {
2075 SDValue Src = Op.getOperand(0);
2079 const SDValue Zero = DAG.getConstant(0, SL, MVT::i32);
2080 const SDValue One = DAG.getConstant(1, SL, MVT::i32);
2082 SDValue VecSrc = DAG.getNode(ISD::BITCAST, SL, MVT::v2i32, Src);
2086 SDValue Hi = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, SL, MVT::i32, VecSrc, One);
2088 SDValue Exp = extractF64Exponent(Hi, SL, DAG);
2093 const SDValue SignBitMask = DAG.getConstant(UINT32_C(1) << 31, SL, MVT::i32);
2094 SDValue SignBit = DAG.getNode(ISD::AND, SL, MVT::i32, Hi, SignBitMask);
2097 SDValue SignBit64 = DAG.getBuildVector(MVT::v2i32, SL, {Zero, SignBit});
2100 SDValue BcInt = DAG.getNode(ISD::BITCAST, SL, MVT::i64, Src);
2101 const SDValue FractMask
2104 SDValue Shr = DAG.getNode(ISD::SRA, SL, MVT::i64, FractMask, Exp);
2105 SDValue Not = DAG.getNOT(SL, Shr, MVT::i64);
2106 SDValue Tmp0 = DAG.getNode(ISD::AND, SL, MVT::i64, BcInt, Not);
2111 const SDValue FiftyOne = DAG.getConstant(FractBits - 1, SL, MVT::i32);
2113 SDValue ExpLt0 = DAG.getSetCC(SL, SetCCVT, Exp, Zero, ISD::SETLT);
2114 SDValue ExpGt51 = DAG.getSetCC(SL, SetCCVT, Exp, FiftyOne, ISD::SETGT);
2116 SDValue Tmp1 = DAG.getNode(ISD::SELECT, SL, MVT::i64, ExpLt0, SignBit64, Tmp0);
2117 SDValue Tmp2 = DAG.getNode(ISD::SELECT, SL, MVT::i64, ExpGt51, BcInt, Tmp1);
2122 SDValue AMDGPUTargetLowering::LowerFRINT(SDValue Op, SelectionDAG &DAG) const {
2122 SDValue AMDGPUTargetLowering::LowerFRINT(SDValue Op, SelectionDAG &DAG) const {
2124 SDValue Src = Op.getOperand(0);
2129 SDValue C1 = DAG.getConstantFP(C1Val, SL, MVT::f64);
2130 SDValue CopySign = DAG.getNode(ISD::FCOPYSIGN, SL, MVT::f64, C1, Src);
2134 SDValue Tmp1 = DAG.getNode(ISD::FADD, SL, MVT::f64, Src, CopySign);
2135 SDValue Tmp2 = DAG.getNode(ISD::FSUB, SL, MVT::f64, Tmp1, CopySign);
2137 SDValue Fabs = DAG.getNode(ISD::FABS, SL, MVT::f64, Src);
2140 SDValue C2 = DAG.getConstantFP(C2Val, SL, MVT::f64);
2144 SDValue Cond = DAG.getSetCC(SL, SetCCVT, Fabs, C2, ISD::SETOGT);
2149 SDValue AMDGPUTargetLowering::LowerFNEARBYINT(SDValue Op, SelectionDAG &DAG) const {
2149 SDValue AMDGPUTargetLowering::LowerFNEARBYINT(SDValue Op, SelectionDAG &DAG) const {
2161 SDValue AMDGPUTargetLowering::LowerFROUND32_16(SDValue Op, SelectionDAG &DAG) const {
2161 SDValue AMDGPUTargetLowering::LowerFROUND32_16(SDValue Op, SelectionDAG &DAG) const {
2163 SDValue X = Op.getOperand(0);
2166 SDValue T = DAG.getNode(ISD::FTRUNC, SL, VT, X);
2170 SDValue Diff = DAG.getNode(ISD::FSUB, SL, VT, X, T);
2172 SDValue AbsDiff = DAG.getNode(ISD::FABS, SL, VT, Diff);
2174 const SDValue Zero = DAG.getConstantFP(0.0, SL, VT);
2175 const SDValue One = DAG.getConstantFP(1.0, SL, VT);
2176 const SDValue Half = DAG.getConstantFP(0.5, SL, VT);
2178 SDValue SignOne = DAG.getNode(ISD::FCOPYSIGN, SL, VT, One, X);
2183 SDValue Cmp = DAG.getSetCC(SL, SetCCVT, AbsDiff, Half, ISD::SETOGE);
2185 SDValue Sel = DAG.getNode(ISD::SELECT, SL, VT, Cmp, SignOne, Zero);
2190 SDValue AMDGPUTargetLowering::LowerFROUND64(SDValue Op, SelectionDAG &DAG) const {
2190 SDValue AMDGPUTargetLowering::LowerFROUND64(SDValue Op, SelectionDAG &DAG) const {
2192 SDValue X = Op.getOperand(0);
2194 SDValue L = DAG.getNode(ISD::BITCAST, SL, MVT::i64, X);
2196 const SDValue Zero = DAG.getConstant(0, SL, MVT::i32);
2197 const SDValue One = DAG.getConstant(1, SL, MVT::i32);
2198 const SDValue NegOne = DAG.getConstant(-1, SL, MVT::i32);
2199 const SDValue FiftyOne = DAG.getConstant(51, SL, MVT::i32);
2203 SDValue BC = DAG.getNode(ISD::BITCAST, SL, MVT::v2i32, X);
2205 SDValue Hi = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, SL, MVT::i32, BC, One);
2207 SDValue Exp = extractF64Exponent(Hi, SL, DAG);
2209 const SDValue Mask = DAG.getConstant(INT64_C(0x000fffffffffffff), SL,
2212 SDValue M = DAG.getNode(ISD::SRA, SL, MVT::i64, Mask, Exp);
2213 SDValue D = DAG.getNode(ISD::SRA, SL, MVT::i64,
2218 SDValue Tmp0 = DAG.getNode(ISD::AND, SL, MVT::i64, L, M);
2219 SDValue Tmp1 = DAG.getSetCC(SL, SetCCVT,
2223 SDValue Tmp2 = DAG.getNode(ISD::SELECT, SL, MVT::i64, Tmp1,
2225 SDValue K = DAG.getNode(ISD::ADD, SL, MVT::i64, L, Tmp2);
2230 SDValue ExpLt0 = DAG.getSetCC(SL, SetCCVT, Exp, Zero, ISD::SETLT);
2231 SDValue ExpGt51 = DAG.getSetCC(SL, SetCCVT, Exp, FiftyOne, ISD::SETGT);
2232 SDValue ExpEqNegOne = DAG.getSetCC(SL, SetCCVT, NegOne, Exp, ISD::SETEQ);
2234 SDValue Mag = DAG.getNode(ISD::SELECT, SL, MVT::f64,
2239 SDValue S = DAG.getNode(ISD::FCOPYSIGN, SL, MVT::f64, Mag, X);
2247 SDValue AMDGPUTargetLowering::LowerFROUND(SDValue Op, SelectionDAG &DAG) const {
2247 SDValue AMDGPUTargetLowering::LowerFROUND(SDValue Op, SelectionDAG &DAG) const {
2259 SDValue AMDGPUTargetLowering::LowerFFLOOR(SDValue Op, SelectionDAG &DAG) const {
2259 SDValue AMDGPUTargetLowering::LowerFFLOOR(SDValue Op, SelectionDAG &DAG) const {
2261 SDValue Src = Op.getOperand(0);
2267 SDValue Trunc = DAG.getNode(ISD::FTRUNC, SL, MVT::f64, Src);
2269 const SDValue Zero = DAG.getConstantFP(0.0, SL, MVT::f64);
2270 const SDValue NegOne = DAG.getConstantFP(-1.0, SL, MVT::f64);
2275 SDValue Lt0 = DAG.getSetCC(SL, SetCCVT, Src, Zero, ISD::SETOLT);
2276 SDValue NeTrunc = DAG.getSetCC(SL, SetCCVT, Src, Trunc, ISD::SETONE);
2277 SDValue And = DAG.getNode(ISD::AND, SL, SetCCVT, Lt0, NeTrunc);
2279 SDValue Add = DAG.getNode(ISD::SELECT, SL, MVT::f64, And, NegOne, Zero);
2284 SDValue AMDGPUTargetLowering::LowerFLOG(SDValue Op, SelectionDAG &DAG,
2284 SDValue AMDGPUTargetLowering::LowerFLOG(SDValue Op, SelectionDAG &DAG,
2289 SDValue Operand = Op.getOperand(0);
2290 SDValue Log2Operand = DAG.getNode(ISD::FLOG2, SL, VT, Operand);
2291 SDValue Log2BaseInvertedOperand = DAG.getConstantFP(Log2BaseInverted, SL, VT);
2297 SDValue AMDGPUTargetLowering::lowerFEXP(SDValue Op, SelectionDAG &DAG) const {
2297 SDValue AMDGPUTargetLowering::lowerFEXP(SDValue Op, SelectionDAG &DAG) const {
2300 SDValue Src = Op.getOperand(0);
2302 const SDValue K = DAG.getConstantFP(numbers::log2e, SL, VT);
2303 SDValue Mul = DAG.getNode(ISD::FMUL, SL, VT, Src, K, Op->getFlags());
2315 SDValue AMDGPUTargetLowering::LowerCTLZ_CTTZ(SDValue Op, SelectionDAG &DAG) const {
2315 SDValue AMDGPUTargetLowering::LowerCTLZ_CTTZ(SDValue Op, SelectionDAG &DAG) const {
2317 SDValue Src = Op.getOperand(0);
2335 SDValue Vec = DAG.getNode(ISD::BITCAST, SL, MVT::v2i32, Src);
2337 const SDValue Zero = DAG.getConstant(0, SL, MVT::i32);
2338 const SDValue One = DAG.getConstant(1, SL, MVT::i32);
2340 SDValue Lo = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, SL, MVT::i32, Vec, Zero);
2341 SDValue Hi = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, SL, MVT::i32, Vec, One);
2346 SDValue HiOrLo = isCtlzOpc(Op.getOpcode()) ? Hi : Lo;
2347 SDValue Hi0orLo0 = DAG.getSetCC(SL, SetCCVT, HiOrLo, Zero, ISD::SETEQ);
2349 SDValue OprLo = DAG.getNode(ISDOpc, SL, MVT::i32, Lo);
2350 SDValue OprHi = DAG.getNode(ISDOpc, SL, MVT::i32, Hi);
2352 const SDValue Bits32 = DAG.getConstant(32, SL, MVT::i32);
2353 SDValue Add, NewOpr;
2369 SDValue LoOrHi = isCtlzOpc(Op.getOpcode()) ? Lo : Hi;
2370 SDValue Lo0OrHi0 = DAG.getSetCC(SL, SetCCVT, LoOrHi, Zero, ISD::SETEQ);
2371 SDValue SrcIsZero = DAG.getNode(ISD::AND, SL, SetCCVT, Lo0OrHi0, Hi0orLo0);
2378 const SDValue Bits32 = DAG.getConstant(64, SL, MVT::i32);
2389 SDValue AMDGPUTargetLowering::LowerINT_TO_FP32(SDValue Op, SelectionDAG &DAG,
2389 SDValue AMDGPUTargetLowering::LowerINT_TO_FP32(SDValue Op, SelectionDAG &DAG,
2411 SDValue Src = Op.getOperand(0);
2412 SDValue L = Src;
2414 SDValue S;
2416 const SDValue SignBit = DAG.getConstant(63, SL, MVT::i64);
2419 SDValue LPlusS = DAG.getNode(ISD::ADD, SL, MVT::i64, L, S);
2427 SDValue ZeroI32 = DAG.getConstant(0, SL, MVT::i32);
2428 SDValue ZeroI64 = DAG.getConstant(0, SL, MVT::i64);
2429 SDValue LZ = DAG.getNode(ISD::CTLZ_ZERO_UNDEF, SL, MVT::i64, L);
2432 SDValue K = DAG.getConstant(127U + 63U, SL, MVT::i32);
2433 SDValue E = DAG.getSelect(SL, MVT::i32,
2438 SDValue U = DAG.getNode(ISD::AND, SL, MVT::i64,
2442 SDValue T = DAG.getNode(ISD::AND, SL, MVT::i64, U,
2445 SDValue UShl = DAG.getNode(ISD::SRL, SL, MVT::i64,
2448 SDValue V = DAG.getNode(ISD::OR, SL, MVT::i32,
2452 SDValue C = DAG.getConstant(0x8000000000ULL, SL, MVT::i64);
2453 SDValue RCmp = DAG.getSetCC(SL, SetCCVT, T, C, ISD::SETUGT);
2454 SDValue TCmp = DAG.getSetCC(SL, SetCCVT, T, C, ISD::SETEQ);
2456 SDValue One = DAG.getConstant(1, SL, MVT::i32);
2458 SDValue VTrunc1 = DAG.getNode(ISD::AND, SL, MVT::i32, V, One);
2460 SDValue R = DAG.getSelect(SL, MVT::i32,
2470 SDValue RNeg = DAG.getNode(ISD::FNEG, SL, MVT::f32, R);
2474 SDValue AMDGPUTargetLowering::LowerINT_TO_FP64(SDValue Op, SelectionDAG &DAG,
2474 SDValue AMDGPUTargetLowering::LowerINT_TO_FP64(SDValue Op, SelectionDAG &DAG,
2477 SDValue Src = Op.getOperand(0);
2479 SDValue BC = DAG.getNode(ISD::BITCAST, SL, MVT::v2i32, Src);
2481 SDValue Lo = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, SL, MVT::i32, BC,
2483 SDValue Hi = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, SL, MVT::i32, BC,
2486 SDValue CvtHi = DAG.getNode(Signed ? ISD::SINT_TO_FP : ISD::UINT_TO_FP,
2489 SDValue CvtLo = DAG.getNode(ISD::UINT_TO_FP, SL, MVT::f64, Lo);
2491 SDValue LdExp = DAG.getNode(AMDGPUISD::LDEXP, SL, MVT::f64, CvtHi,
2497 SDValue AMDGPUTargetLowering::LowerUINT_TO_FP(SDValue Op,
2497 SDValue AMDGPUTargetLowering::LowerUINT_TO_FP(SDValue Op,
2507 SDValue Src = Op.getOperand(0);
2509 SDValue IntToFp32 = DAG.getNode(Op.getOpcode(), DL, MVT::f32, Src);
2510 SDValue FPRoundFlag = DAG.getIntPtrConstant(0, SDLoc(Op));
2511 SDValue FPRound =
2524 SDValue AMDGPUTargetLowering::LowerSINT_TO_FP(SDValue Op,
2524 SDValue AMDGPUTargetLowering::LowerSINT_TO_FP(SDValue Op,
2534 SDValue Src = Op.getOperand(0);
2536 SDValue IntToFp32 = DAG.getNode(Op.getOpcode(), DL, MVT::f32, Src);
2537 SDValue FPRoundFlag = DAG.getIntPtrConstant(0, SDLoc(Op));
2538 SDValue FPRound =
2551 SDValue AMDGPUTargetLowering::LowerFP64_TO_INT(SDValue Op, SelectionDAG &DAG,
2551 SDValue AMDGPUTargetLowering::LowerFP64_TO_INT(SDValue Op, SelectionDAG &DAG,
2555 SDValue Src = Op.getOperand(0);
2557 SDValue Trunc = DAG.getNode(ISD::FTRUNC, SL, MVT::f64, Src);
2559 SDValue K0 = DAG.getConstantFP(BitsToDouble(UINT64_C(0x3df0000000000000)), SL,
2561 SDValue K1 = DAG.getConstantFP(BitsToDouble(UINT64_C(0xc1f0000000000000)), SL,
2564 SDValue Mul = DAG.getNode(ISD::FMUL, SL, MVT::f64, Trunc, K0);
2566 SDValue FloorMul = DAG.getNode(ISD::FFLOOR, SL, MVT::f64, Mul);
2569 SDValue Fma = DAG.getNode(ISD::FMA, SL, MVT::f64, FloorMul, K1, Trunc);
2571 SDValue Hi = DAG.getNode(Signed ? ISD::FP_TO_SINT : ISD::FP_TO_UINT, SL,
2573 SDValue Lo = DAG.getNode(ISD::FP_TO_UINT, SL, MVT::i32, Fma);
2575 SDValue Result = DAG.getBuildVector(MVT::v2i32, SL, {Lo, Hi});
2580 SDValue AMDGPUTargetLowering::LowerFP_TO_FP16(SDValue Op, SelectionDAG &DAG) const {
2580 SDValue AMDGPUTargetLowering::LowerFP_TO_FP16(SDValue Op, SelectionDAG &DAG) const {
2582 SDValue N0 = Op.getOperand(0);
2599 SDValue Zero = DAG.getConstant(0, DL, MVT::i32);
2600 SDValue One = DAG.getConstant(1, DL, MVT::i32);
2601 SDValue U = DAG.getNode(ISD::BITCAST, DL, MVT::i64, N0);
2602 SDValue UH = DAG.getNode(ISD::SRL, DL, MVT::i64, U,
2606 SDValue E = DAG.getNode(ISD::SRL, DL, MVT::i32, UH,
2615 SDValue M = DAG.getNode(ISD::SRL, DL, MVT::i32, UH,
2620 SDValue MaskedSig = DAG.getNode(ISD::AND, DL, MVT::i32, UH,
2624 SDValue Lo40Set = DAG.getSelectCC(DL, MaskedSig, Zero, Zero, One, ISD::SETEQ);
2628 SDValue I = DAG.getNode(ISD::OR, DL, MVT::i32,
2633 SDValue N = DAG.getNode(ISD::OR, DL, MVT::i32, M,
2638 SDValue OneSubExp = DAG.getNode(ISD::SUB, DL, MVT::i32,
2640 SDValue B = DAG.getNode(ISD::SMAX, DL, MVT::i32, OneSubExp, Zero);
2644 SDValue SigSetHigh = DAG.getNode(ISD::OR, DL, MVT::i32, M,
2647 SDValue D = DAG.getNode(ISD::SRL, DL, MVT::i32, SigSetHigh, B);
2648 SDValue D0 = DAG.getNode(ISD::SHL, DL, MVT::i32, D, B);
2649 SDValue D1 = DAG.getSelectCC(DL, D0, SigSetHigh, One, Zero, ISD::SETNE);
2652 SDValue V = DAG.getSelectCC(DL, E, One, D, N, ISD::SETLT);
2653 SDValue VLow3 = DAG.getNode(ISD::AND, DL, MVT::i32, V,
2657 SDValue V0 = DAG.getSelectCC(DL, VLow3, DAG.getConstant(3, DL, MVT::i32),
2659 SDValue V1 = DAG.getSelectCC(DL, VLow3, DAG.getConstant(5, DL, MVT::i32),
2670 SDValue Sign = DAG.getNode(ISD::SRL, DL, MVT::i32, UH,
2679 SDValue AMDGPUTargetLowering::LowerFP_TO_SINT(SDValue Op,
2679 SDValue AMDGPUTargetLowering::LowerFP_TO_SINT(SDValue Op,
2681 SDValue Src = Op.getOperand(0);
2689 SDValue FPExtend = DAG.getNode(ISD::FP_EXTEND, DL, MVT::f32, Src);
2690 SDValue FpToInt32 =
2702 SDValue AMDGPUTargetLowering::LowerFP_TO_UINT(SDValue Op,
2702 SDValue AMDGPUTargetLowering::LowerFP_TO_UINT(SDValue Op,
2704 SDValue Src = Op.getOperand(0);
2712 SDValue FPExtend = DAG.getNode(ISD::FP_EXTEND, DL, MVT::f32, Src);
2713 SDValue FpToInt32 =
2725 SDValue AMDGPUTargetLowering::LowerSIGN_EXTEND_INREG(SDValue Op,
2725 SDValue AMDGPUTargetLowering::LowerSIGN_EXTEND_INREG(SDValue Op,
2733 SDValue Src = Op.getOperand(0);
2738 SmallVector<SDValue, 8> Args;
2741 SDValue VTOp = DAG.getValueType(ExtraVT.getScalarType());
2752 static bool isU24(SDValue Op, SelectionDAG &DAG) {
2756 static bool isI24(SDValue Op, SelectionDAG &DAG) {
2763 static SDValue simplifyI24(SDNode *Node24,
2768 SDValue LHS = IsIntrin ? Node24->getOperand(1) : Node24->getOperand(0);
2769 SDValue RHS = IsIntrin ? Node24->getOperand(2) : Node24->getOperand(1);
2782 SDValue DemandedLHS = DAG.GetDemandedBits(LHS, Demanded);
2783 SDValue DemandedRHS = DAG.GetDemandedBits(RHS, Demanded);
2801 static SDValue constantFoldBFE(SelectionDAG &DAG, IntTy Src0, uint32_t Offset,
2844 SDValue AMDGPUTargetLowering::performLoadCombine(SDNode *N,
2871 SDValue Ops[2];
2885 SDValue NewLoad
2889 SDValue BC = DAG.getNode(ISD::BITCAST, SL, VT, NewLoad);
2896 SDValue AMDGPUTargetLowering::performStoreCombine(SDNode *N,
2935 SDValue Val = SN->getValue();
2940 SDValue CastVal = DAG.getNode(ISD::BITCAST, SL, NewVT, Val);
2942 SDValue CastBack = DAG.getNode(ISD::BITCAST, SL, VT, CastVal);
2953 SDValue AMDGPUTargetLowering::performAssertSZExtCombine(SDNode *N,
2956 SDValue N0 = N->getOperand(0);
2961 SDValue N1 = N->getOperand(1);
2965 SDValue Src = N0.getOperand(0);
2968 SDValue NewInReg = DAG.getNode(N->getOpcode(), SL, SrcVT, Src, N1);
2976 SDValue AMDGPUTargetLowering::performIntrinsicWOChainCombine(
2990 SDValue AMDGPUTargetLowering::splitBinaryBitConstantOpImpl(
2992 unsigned Opc, SDValue LHS,
2995 SDValue Lo, Hi;
2998 SDValue LoRHS = DAG.getConstant(ValLo, SL, MVT::i32);
2999 SDValue HiRHS = DAG.getConstant(ValHi, SL, MVT::i32);
3001 SDValue LoAnd = DAG.getNode(Opc, SL, MVT::i32, Lo, LoRHS);
3002 SDValue HiAnd = DAG.getNode(Opc, SL, MVT::i32, Hi, HiRHS);
3009 SDValue Vec = DAG.getBuildVector(MVT::v2i32, SL, {LoAnd, HiAnd});
3013 SDValue AMDGPUTargetLowering::performShlCombine(SDNode *N,
3021 SDValue LHS = N->getOperand(0);
3035 SDValue X = LHS->getOperand(0);
3041 SDValue Vec = DAG.getBuildVector(MVT::v2i16, SL,
3054 SDValue Shl = DAG.getNode(ISD::SHL, SL, XVT, X, SDValue(RHS, 0));
3070 SDValue ShiftAmt = DAG.getConstant(RHSVal - 32, SL, MVT::i32);
3072 SDValue Lo = DAG.getNode(ISD::TRUNCATE, SL, MVT::i32, LHS);
3073 SDValue NewShift = DAG.getNode(ISD::SHL, SL, MVT::i32, Lo, ShiftAmt);
3075 const SDValue Zero = DAG.getConstant(0, SL, MVT::i32);
3077 SDValue Vec = DAG.getBuildVector(MVT::v2i32, SL, {Zero, NewShift});
3081 SDValue AMDGPUTargetLowering::performSraCombine(SDNode *N,
3096 SDValue Hi = getHiHalf64(N->getOperand(0), DAG);
3097 SDValue NewShift = DAG.getNode(ISD::SRA, SL, MVT::i32, Hi,
3100 SDValue BuildVec = DAG.getBuildVector(MVT::v2i32, SL, {Hi, NewShift});
3106 SDValue Hi = getHiHalf64(N->getOperand(0), DAG);
3107 SDValue NewShift = DAG.getNode(ISD::SRA, SL, MVT::i32, Hi,
3109 SDValue BuildVec = DAG.getBuildVector(MVT::v2i32, SL, {NewShift, NewShift});
3116 SDValue AMDGPUTargetLowering::performSrlCombine(SDNode *N,
3123 SDValue LHS = N->getOperand(0);
3151 SDValue One = DAG.getConstant(1, SL, MVT::i32);
3152 SDValue Zero = DAG.getConstant(0, SL, MVT::i32);
3154 SDValue VecOp = DAG.getNode(ISD::BITCAST, SL, MVT::v2i32, LHS);
3155 SDValue Hi = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, SL, MVT::i32, VecOp, One);
3157 SDValue NewConst = DAG.getConstant(ShiftAmt - 32, SL, MVT::i32);
3158 SDValue NewShift = DAG.getNode(ISD::SRL, SL, MVT::i32, Hi, NewConst);
3160 SDValue BuildPair = DAG.getBuildVector(MVT::v2i32, SL, {NewShift, Zero});
3165 SDValue AMDGPUTargetLowering::performTruncateCombine(
3170 SDValue Src = N->getOperand(0);
3174 SDValue Vec = Src.getOperand(0);
3176 SDValue Elt0 = Vec.getOperand(0);
3195 SDValue BV = stripBitcast(Src.getOperand(0));
3198 SDValue SrcElt = BV.getOperand(1);
3221 SDValue Amt = Src.getOperand(1);
3231 SDValue Trunc = DAG.getNode(ISD::TRUNCATE, SL, MidVT,
3240 SDValue ShrunkShift = DAG.getNode(Src.getOpcode(), SL, MidVT,
3254 static SDValue getMul24(SelectionDAG &DAG, const SDLoc &SL,
3255 SDValue N0, SDValue N1, unsigned Size, bool Signed) {
3255 SDValue N0, SDValue N1, unsigned Size, bool Signed) {
3267 SDValue Mul = DAG.getNode(MulOpc, SL,
3274 SDValue AMDGPUTargetLowering::performMulCombine(SDNode *N,
3289 SDValue N0 = N->getOperand(0);
3290 SDValue N1 = N->getOperand(1);
3302 SDValue Mul;
3321 SDValue AMDGPUTargetLowering::performMulhsCombine(SDNode *N,
3331 SDValue N0 = N->getOperand(0);
3332 SDValue N1 = N->getOperand(1);
3340 SDValue Mulhi = DAG.getNode(AMDGPUISD::MULHI_I24, DL, MVT::i32, N0, N1);
3345 SDValue AMDGPUTargetLowering::performMulhuCombine(SDNode *N,
3355 SDValue N0 = N->getOperand(0);
3356 SDValue N1 = N->getOperand(1);
3364 SDValue Mulhi = DAG.getNode(AMDGPUISD::MULHI_U24, DL, MVT::i32, N0, N1);
3369 SDValue AMDGPUTargetLowering::performMulLoHi24Combine(
3374 if (SDValue V = simplifyI24(N, DCI))
3377 SDValue N0 = N->getOperand(0);
3378 SDValue N1 = N->getOperand(1);
3387 SDValue MulLo = DAG.getNode(MulLoOpc, SL, MVT::i32, N0, N1);
3388 SDValue MulHi = DAG.getNode(MulHiOpc, SL, MVT::i32, N0, N1);
3392 static bool isNegativeOne(SDValue Val) {
3398 SDValue AMDGPUTargetLowering::getFFBX_U32(SelectionDAG &DAG,
3399 SDValue Op,
3411 SDValue FFBX = DAG.getNode(Opc, DL, MVT::i32, Op);
3425 SDValue AMDGPUTargetLowering::performCtlz_CttzCombine(const SDLoc &SL, SDValue Cond,
3425 SDValue AMDGPUTargetLowering::performCtlz_CttzCombine(const SDLoc &SL, SDValue Cond,
3426 SDValue LHS, SDValue RHS,
3426 SDValue LHS, SDValue RHS,
3434 SDValue CmpLHS = Cond.getOperand(0);
3460 static SDValue distributeOpThroughSelect(TargetLowering::DAGCombinerInfo &DCI,
3463 SDValue Cond,
3464 SDValue N1,
3465 SDValue N2) {
3469 SDValue NewSelect = DAG.getNode(ISD::SELECT, SL, VT, Cond,
3482 static SDValue foldFreeOpFromSelect(TargetLowering::DAGCombinerInfo &DCI,
3483 SDValue N) {
3485 SDValue Cond = N.getOperand(0);
3486 SDValue LHS = N.getOperand(1);
3487 SDValue RHS = N.getOperand(2);
3508 SDValue NewLHS = LHS.getOperand(0);
3509 SDValue NewRHS = RHS;
3531 SDValue NewSelect = DAG.getNode(ISD::SELECT, SL, VT,
3542 SDValue AMDGPUTargetLowering::performSelectCombine(SDNode *N,
3544 if (SDValue Folded = foldFreeOpFromSelect(DCI, SDValue(N, 0)))
3547 SDValue Cond = N->getOperand(0);
3552 SDValue LHS = Cond.getOperand(0);
3553 SDValue RHS = Cond.getOperand(1);
3554 SDValue CC = Cond.getOperand(2);
3556 SDValue True = N->getOperand(1);
3557 SDValue False = N->getOperand(2);
3571 SDValue NewCond = DAG.getSetCC(SL, Cond.getValueType(), LHS, RHS, NewCC);
3576 SDValue MinMax
3600 bool AMDGPUTargetLowering::isConstantCostlierToNegate(SDValue N) const {
3631 SDValue AMDGPUTargetLowering::performFNegCombine(SDNode *N,
3634 SDValue N0 = N->getOperand(0);
3661 SDValue LHS = N0.getOperand(0);
3662 SDValue RHS = N0.getOperand(1);
3674 SDValue Res = DAG.getNode(ISD::FADD, SL, VT, LHS, RHS, N0->getFlags());
3685 SDValue LHS = N0.getOperand(0);
3686 SDValue RHS = N0.getOperand(1);
3695 SDValue Res = DAG.getNode(Opc, SL, VT, LHS, RHS, N0->getFlags());
3708 SDValue LHS = N0.getOperand(0);
3709 SDValue MHS = N0.getOperand(1);
3710 SDValue RHS = N0.getOperand(2);
3724 SDValue Res = DAG.getNode(Opc, SL, VT, LHS, MHS, RHS);
3742 SDValue LHS = N0.getOperand(0);
3743 SDValue RHS = N0.getOperand(1);
3750 SDValue NegLHS = DAG.getNode(ISD::FNEG, SL, VT, LHS);
3751 SDValue NegRHS = DAG.getNode(ISD::FNEG, SL, VT, RHS);
3754 SDValue Res = DAG.getNode(Opposite, SL, VT, NegLHS, NegRHS, N0->getFlags());
3762 SDValue Ops[3];
3766 SDValue Res = DAG.getNode(AMDGPUISD::FMED3, SL, VT, Ops, N0->getFlags());
3783 SDValue CvtSrc = N0.getOperand(0);
3795 SDValue Neg = DAG.getNode(ISD::FNEG, SL, CvtSrc.getValueType(), CvtSrc);
3799 SDValue CvtSrc = N0.getOperand(0);
3811 SDValue Neg = DAG.getNode(ISD::FNEG, SL, CvtSrc.getValueType(), CvtSrc);
3820 SDValue Src = N0.getOperand(0);
3824 SDValue IntFNeg = DAG.getNode(ISD::XOR, SL, SrcVT, Src,
3833 SDValue AMDGPUTargetLowering::performFAbsCombine(SDNode *N,
3836 SDValue N0 = N->getOperand(0);
3845 SDValue Src = N0.getOperand(0);
3849 SDValue IntFAbs = DAG.getNode(ISD::AND, SL, SrcVT, Src,
3858 SDValue AMDGPUTargetLowering::performRcpCombine(SDNode *N,
3870 SDValue AMDGPUTargetLowering::PerformDAGCombine(SDNode *N,
3887 SDValue Src = N->getOperand(0);
3895 SmallVector<SDValue, 8> CastedElts;
3898 SDValue Elt = Src.getOperand(I);
3914 SDValue Src = N->getOperand(0);
3919 SDValue BV = DAG.getNode(ISD::BUILD_VECTOR, SL, MVT::v2i32,
3930 SDValue Vec = DAG.getNode(ISD::BUILD_VECTOR, SL, MVT::v2i32,
3969 if (SDValue V = simplifyI24(N, DCI))
3998 SDValue BitsFrom = N->getOperand(0);
4044 SDValue ShiftVal = DAG.getConstant(OffsetVal, DL, MVT::i32);
4086 SDValue AMDGPUTargetLowering::CreateLiveInRegister(SelectionDAG &DAG,
4122 SDValue AMDGPUTargetLowering::loadStackInputValue(SelectionDAG &DAG,
4131 SDValue Ptr = DAG.getFrameIndex(FI, MVT::i32);
4138 SDValue AMDGPUTargetLowering::storeStackInputValue(SelectionDAG &DAG,
4140 SDValue Chain,
4141 SDValue ArgVal,
4146 SDValue Ptr = DAG.getConstant(Offset, SL, MVT::i32);
4147 SDValue Store = DAG.getStore(Chain, SL, ArgVal, Ptr, DstInfo, 4,
4152 SDValue AMDGPUTargetLowering::loadInputValue(SelectionDAG &DAG,
4158 SDValue V = Arg.isRegister() ?
4354 SDValue AMDGPUTargetLowering::getSqrtEstimate(SDValue Operand,
4354 SDValue AMDGPUTargetLowering::getSqrtEstimate(SDValue Operand,
4372 SDValue AMDGPUTargetLowering::getRecipEstimate(SDValue Operand,
4372 SDValue AMDGPUTargetLowering::getRecipEstimate(SDValue Operand,
4394 const SDValue Op, KnownBits &Known,
4536 SDValue Op, const APInt &DemandedElts, const SelectionDAG &DAG,
4577 bool AMDGPUTargetLowering::isKnownNeverNaNForTargetNode(SDValue Op,
lib/Target/AMDGPU/AMDGPUISelLowering.h 36 SDValue getFFBX_U32(SelectionDAG &DAG, SDValue Op, const SDLoc &DL, unsigned Opc) const;
36 SDValue getFFBX_U32(SelectionDAG &DAG, SDValue Op, const SDLoc &DL, unsigned Opc) const;
39 static unsigned numBitsUnsigned(SDValue Op, SelectionDAG &DAG);
40 static unsigned numBitsSigned(SDValue Op, SelectionDAG &DAG);
44 SDValue LowerEXTRACT_SUBVECTOR(SDValue Op, SelectionDAG &DAG) const;
44 SDValue LowerEXTRACT_SUBVECTOR(SDValue Op, SelectionDAG &DAG) const;
45 SDValue LowerCONCAT_VECTORS(SDValue Op, SelectionDAG &DAG) const;
45 SDValue LowerCONCAT_VECTORS(SDValue Op, SelectionDAG &DAG) const;
49 SDValue LowerFREM(SDValue Op, SelectionDAG &DAG) const;
49 SDValue LowerFREM(SDValue Op, SelectionDAG &DAG) const;
50 SDValue LowerFCEIL(SDValue Op, SelectionDAG &DAG) const;
50 SDValue LowerFCEIL(SDValue Op, SelectionDAG &DAG) const;
51 SDValue LowerFTRUNC(SDValue Op, SelectionDAG &DAG) const;
51 SDValue LowerFTRUNC(SDValue Op, SelectionDAG &DAG) const;
52 SDValue LowerFRINT(SDValue Op, SelectionDAG &DAG) const;
52 SDValue LowerFRINT(SDValue Op, SelectionDAG &DAG) const;
53 SDValue LowerFNEARBYINT(SDValue Op, SelectionDAG &DAG) const;
53 SDValue LowerFNEARBYINT(SDValue Op, SelectionDAG &DAG) const;
55 SDValue LowerFROUND32_16(SDValue Op, SelectionDAG &DAG) const;
55 SDValue LowerFROUND32_16(SDValue Op, SelectionDAG &DAG) const;
56 SDValue LowerFROUND64(SDValue Op, SelectionDAG &DAG) const;
56 SDValue LowerFROUND64(SDValue Op, SelectionDAG &DAG) const;
57 SDValue LowerFROUND(SDValue Op, SelectionDAG &DAG) const;
57 SDValue LowerFROUND(SDValue Op, SelectionDAG &DAG) const;
58 SDValue LowerFFLOOR(SDValue Op, SelectionDAG &DAG) const;
58 SDValue LowerFFLOOR(SDValue Op, SelectionDAG &DAG) const;
59 SDValue LowerFLOG(SDValue Op, SelectionDAG &DAG,
59 SDValue LowerFLOG(SDValue Op, SelectionDAG &DAG,
61 SDValue lowerFEXP(SDValue Op, SelectionDAG &DAG) const;
61 SDValue lowerFEXP(SDValue Op, SelectionDAG &DAG) const;
63 SDValue LowerCTLZ_CTTZ(SDValue Op, SelectionDAG &DAG) const;
63 SDValue LowerCTLZ_CTTZ(SDValue Op, SelectionDAG &DAG) const;
65 SDValue LowerINT_TO_FP32(SDValue Op, SelectionDAG &DAG, bool Signed) const;
65 SDValue LowerINT_TO_FP32(SDValue Op, SelectionDAG &DAG, bool Signed) const;
66 SDValue LowerINT_TO_FP64(SDValue Op, SelectionDAG &DAG, bool Signed) const;
66 SDValue LowerINT_TO_FP64(SDValue Op, SelectionDAG &DAG, bool Signed) const;
67 SDValue LowerUINT_TO_FP(SDValue Op, SelectionDAG &DAG) const;
67 SDValue LowerUINT_TO_FP(SDValue Op, SelectionDAG &DAG) const;
68 SDValue LowerSINT_TO_FP(SDValue Op, SelectionDAG &DAG) const;
68 SDValue LowerSINT_TO_FP(SDValue Op, SelectionDAG &DAG) const;
70 SDValue LowerFP64_TO_INT(SDValue Op, SelectionDAG &DAG, bool Signed) const;
70 SDValue LowerFP64_TO_INT(SDValue Op, SelectionDAG &DAG, bool Signed) const;
71 SDValue LowerFP_TO_FP16(SDValue Op, SelectionDAG &DAG) const;
71 SDValue LowerFP_TO_FP16(SDValue Op, SelectionDAG &DAG) const;
72 SDValue LowerFP_TO_UINT(SDValue Op, SelectionDAG &DAG) const;
72 SDValue LowerFP_TO_UINT(SDValue Op, SelectionDAG &DAG) const;
73 SDValue LowerFP_TO_SINT(SDValue Op, SelectionDAG &DAG) const;
73 SDValue LowerFP_TO_SINT(SDValue Op, SelectionDAG &DAG) const;
75 SDValue LowerSIGN_EXTEND_INREG(SDValue Op, SelectionDAG &DAG) const;
75 SDValue LowerSIGN_EXTEND_INREG(SDValue Op, SelectionDAG &DAG) const;
79 SDValue performLoadCombine(SDNode *N, DAGCombinerInfo &DCI) const;
80 SDValue performStoreCombine(SDNode *N, DAGCombinerInfo &DCI) const;
81 SDValue performAssertSZExtCombine(SDNode *N, DAGCombinerInfo &DCI) const;
82 SDValue performIntrinsicWOChainCombine(SDNode *N, DAGCombinerInfo &DCI) const;
84 SDValue splitBinaryBitConstantOpImpl(DAGCombinerInfo &DCI, const SDLoc &SL,
85 unsigned Opc, SDValue LHS,
87 SDValue performShlCombine(SDNode *N, DAGCombinerInfo &DCI) const;
88 SDValue performSraCombine(SDNode *N, DAGCombinerInfo &DCI) const;
89 SDValue performSrlCombine(SDNode *N, DAGCombinerInfo &DCI) const;
90 SDValue performTruncateCombine(SDNode *N, DAGCombinerInfo &DCI) const;
91 SDValue performMulCombine(SDNode *N, DAGCombinerInfo &DCI) const;
92 SDValue performMulhsCombine(SDNode *N, DAGCombinerInfo &DCI) const;
93 SDValue performMulhuCombine(SDNode *N, DAGCombinerInfo &DCI) const;
94 SDValue performMulLoHi24Combine(SDNode *N, DAGCombinerInfo &DCI) const;
95 SDValue performCtlz_CttzCombine(const SDLoc &SL, SDValue Cond, SDValue LHS,
95 SDValue performCtlz_CttzCombine(const SDLoc &SL, SDValue Cond, SDValue LHS,
95 SDValue performCtlz_CttzCombine(const SDLoc &SL, SDValue Cond, SDValue LHS,
96 SDValue RHS, DAGCombinerInfo &DCI) const;
97 SDValue performSelectCombine(SDNode *N, DAGCombinerInfo &DCI) const;
99 bool isConstantCostlierToNegate(SDValue N) const;
100 SDValue performFNegCombine(SDNode *N, DAGCombinerInfo &DCI) const;
101 SDValue performFAbsCombine(SDNode *N, DAGCombinerInfo &DCI) const;
102 SDValue performRcpCombine(SDNode *N, DAGCombinerInfo &DCI) const;
106 virtual SDValue LowerGlobalAddress(AMDGPUMachineFunction *MFI, SDValue Op,
106 virtual SDValue LowerGlobalAddress(AMDGPUMachineFunction *MFI, SDValue Op,
110 std::pair<SDValue, SDValue> split64BitValue(SDValue Op,
110 std::pair<SDValue, SDValue> split64BitValue(SDValue Op,
110 std::pair<SDValue, SDValue> split64BitValue(SDValue Op,
112 SDValue getLoHalf64(SDValue Op, SelectionDAG &DAG) const;
112 SDValue getLoHalf64(SDValue Op, SelectionDAG &DAG) const;
113 SDValue getHiHalf64(SDValue Op, SelectionDAG &DAG) const;
113 SDValue getHiHalf64(SDValue Op, SelectionDAG &DAG) const;
122 std::pair<SDValue, SDValue> splitVector(const SDValue &N, const SDLoc &DL,
122 std::pair<SDValue, SDValue> splitVector(const SDValue &N, const SDLoc &DL,
122 std::pair<SDValue, SDValue> splitVector(const SDValue &N, const SDLoc &DL,
127 SDValue SplitVectorLoad(SDValue Op, SelectionDAG &DAG) const;
127 SDValue SplitVectorLoad(SDValue Op, SelectionDAG &DAG) const;
130 SDValue WidenVectorLoad(SDValue Op, SelectionDAG &DAG) const;
130 SDValue WidenVectorLoad(SDValue Op, SelectionDAG &DAG) const;
133 SDValue SplitVectorStore(SDValue Op, SelectionDAG &DAG) const;
133 SDValue SplitVectorStore(SDValue Op, SelectionDAG &DAG) const;
135 SDValue LowerSTORE(SDValue Op, SelectionDAG &DAG) const;
135 SDValue LowerSTORE(SDValue Op, SelectionDAG &DAG) const;
136 SDValue LowerSDIVREM(SDValue Op, SelectionDAG &DAG) const;
136 SDValue LowerSDIVREM(SDValue Op, SelectionDAG &DAG) const;
137 SDValue LowerUDIVREM(SDValue Op, SelectionDAG &DAG) const;
137 SDValue LowerUDIVREM(SDValue Op, SelectionDAG &DAG) const;
138 SDValue LowerDIVREM24(SDValue Op, SelectionDAG &DAG, bool sign) const;
138 SDValue LowerDIVREM24(SDValue Op, SelectionDAG &DAG, bool sign) const;
139 void LowerUDIVREM64(SDValue Op, SelectionDAG &DAG,
140 SmallVectorImpl<SDValue> &Results) const;
149 bool mayIgnoreSignedZero(SDValue Op) const {
160 static inline SDValue stripBitcast(SDValue Val) {
160 static inline SDValue stripBitcast(SDValue Val) {
173 bool isZExtFree(SDValue Val, EVT VT2) const override;
201 SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
201 SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
203 const SmallVectorImpl<SDValue> &OutVals, const SDLoc &DL,
206 SDValue addTokenForArgument(SDValue Chain,
206 SDValue addTokenForArgument(SDValue Chain,
211 SDValue lowerUnhandledCall(CallLoweringInfo &CLI,
212 SmallVectorImpl<SDValue> &InVals,
214 SDValue LowerCall(CallLoweringInfo &CLI,
215 SmallVectorImpl<SDValue> &InVals) const override;
217 SDValue LowerDYNAMIC_STACKALLOC(SDValue Op,
217 SDValue LowerDYNAMIC_STACKALLOC(SDValue Op,
220 SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
220 SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
221 SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const override;
223 SmallVectorImpl<SDValue> &Results,
226 SDValue combineFMinMaxLegacy(const SDLoc &DL, EVT VT, SDValue LHS,
226 SDValue combineFMinMaxLegacy(const SDLoc &DL, EVT VT, SDValue LHS,
227 SDValue RHS, SDValue True, SDValue False,
227 SDValue RHS, SDValue True, SDValue False,
227 SDValue RHS, SDValue True, SDValue False,
228 SDValue CC, DAGCombinerInfo &DCI) const;
242 bool isFsqrtCheap(SDValue Operand, SelectionDAG &DAG) const override {
245 SDValue getSqrtEstimate(SDValue Operand, SelectionDAG &DAG, int Enabled,
245 SDValue getSqrtEstimate(SDValue Operand, SelectionDAG &DAG, int Enabled,
248 SDValue getRecipEstimate(SDValue Operand, SelectionDAG &DAG, int Enabled,
248 SDValue getRecipEstimate(SDValue Operand, SelectionDAG &DAG, int Enabled,
257 void computeKnownBitsForTargetNode(const SDValue Op,
263 unsigned ComputeNumSignBitsForTargetNode(SDValue Op, const APInt &DemandedElts,
267 bool isKnownNeverNaNForTargetNode(SDValue Op,
277 SDValue CreateLiveInRegister(SelectionDAG &DAG,
282 SDValue CreateLiveInRegister(SelectionDAG &DAG,
289 SDValue CreateLiveInRegisterRaw(SelectionDAG &DAG,
297 SDValue loadStackInputValue(SelectionDAG &DAG,
302 SDValue storeStackInputValue(SelectionDAG &DAG,
304 SDValue Chain,
305 SDValue ArgVal,
308 SDValue loadInputValue(SelectionDAG &DAG,
lib/Target/AMDGPU/R600ISelLowering.cpp 473 SDValue R600TargetLowering::LowerOperation(SDValue Op, SelectionDAG &DAG) const {
473 SDValue R600TargetLowering::LowerOperation(SDValue Op, SelectionDAG &DAG) const {
490 SDValue Result = LowerLOAD(Op, DAG);
501 SDValue Chain = Op.getOperand(0);
507 const SDValue Args[8] = {
546 SDValue TexArgs[19] = {
570 SDValue Args[8] = {
651 SmallVectorImpl<SDValue> &Results,
672 SDValue Result;
678 SDValue Op = SDValue(N, 1);
679 SDValue RES = LowerSDIVREM(Op, DAG);
685 SDValue Op = SDValue(N, 0);
692 SDValue R600TargetLowering::vectorToVerticalVector(SelectionDAG &DAG,
693 SDValue Vector) const {
697 SmallVector<SDValue, 8> Args;
708 SDValue R600TargetLowering::LowerEXTRACT_VECTOR_ELT(SDValue Op,
708 SDValue R600TargetLowering::LowerEXTRACT_VECTOR_ELT(SDValue Op,
711 SDValue Vector = Op.getOperand(0);
712 SDValue Index = Op.getOperand(1);
723 SDValue R600TargetLowering::LowerINSERT_VECTOR_ELT(SDValue Op,
723 SDValue R600TargetLowering::LowerINSERT_VECTOR_ELT(SDValue Op,
726 SDValue Vector = Op.getOperand(0);
727 SDValue Value = Op.getOperand(1);
728 SDValue Index = Op.getOperand(2);
735 SDValue Insert = DAG.getNode(ISD::INSERT_VECTOR_ELT, DL, Op.getValueType(),
740 SDValue R600TargetLowering::LowerGlobalAddress(AMDGPUMachineFunction *MFI,
741 SDValue Op,
751 SDValue GA = DAG.getTargetGlobalAddress(GV, SDLoc(GSD), ConstPtrVT);
755 SDValue R600TargetLowering::LowerTrig(SDValue Op, SelectionDAG &DAG) const {
755 SDValue R600TargetLowering::LowerTrig(SDValue Op, SelectionDAG &DAG) const {
759 SDValue Arg = Op.getOperand(0);
763 SDValue FractPart = DAG.getNode(AMDGPUISD::FRACT, DL, VT,
779 SDValue TrigVal = DAG.getNode(TrigNode, DL, VT,
789 SDValue R600TargetLowering::LowerSHLParts(SDValue Op, SelectionDAG &DAG) const {
789 SDValue R600TargetLowering::LowerSHLParts(SDValue Op, SelectionDAG &DAG) const {
793 SDValue Lo = Op.getOperand(0);
794 SDValue Hi = Op.getOperand(1);
795 SDValue Shift = Op.getOperand(2);
796 SDValue Zero = DAG.getConstant(0, DL, VT);
797 SDValue One = DAG.getConstant(1, DL, VT);
799 SDValue Width = DAG.getConstant(VT.getSizeInBits(), DL, VT);
800 SDValue Width1 = DAG.getConstant(VT.getSizeInBits() - 1, DL, VT);
801 SDValue BigShift = DAG.getNode(ISD::SUB, DL, VT, Shift, Width);
802 SDValue CompShift = DAG.getNode(ISD::SUB, DL, VT, Width1, Shift);
809 SDValue Overflow = DAG.getNode(ISD::SRL, DL, VT, Lo, CompShift);
812 SDValue HiSmall = DAG.getNode(ISD::SHL, DL, VT, Hi, Shift);
814 SDValue LoSmall = DAG.getNode(ISD::SHL, DL, VT, Lo, Shift);
816 SDValue HiBig = DAG.getNode(ISD::SHL, DL, VT, Lo, BigShift);
817 SDValue LoBig = Zero;
825 SDValue R600TargetLowering::LowerSRXParts(SDValue Op, SelectionDAG &DAG) const {
825 SDValue R600TargetLowering::LowerSRXParts(SDValue Op, SelectionDAG &DAG) const {
829 SDValue Lo = Op.getOperand(0);
830 SDValue Hi = Op.getOperand(1);
831 SDValue Shift = Op.getOperand(2);
832 SDValue Zero = DAG.getConstant(0, DL, VT);
833 SDValue One = DAG.getConstant(1, DL, VT);
837 SDValue Width = DAG.getConstant(VT.getSizeInBits(), DL, VT);
838 SDValue Width1 = DAG.getConstant(VT.getSizeInBits() - 1, DL, VT);
839 SDValue BigShift = DAG.getNode(ISD::SUB, DL, VT, Shift, Width);
840 SDValue CompShift = DAG.getNode(ISD::SUB, DL, VT, Width1, Shift);
847 SDValue Overflow = DAG.getNode(ISD::SHL, DL, VT, Hi, CompShift);
850 SDValue HiSmall = DAG.getNode(SRA ? ISD::SRA : ISD::SRL, DL, VT, Hi, Shift);
851 SDValue LoSmall = DAG.getNode(ISD::SRL, DL, VT, Lo, Shift);
854 SDValue LoBig = DAG.getNode(SRA ? ISD::SRA : ISD::SRL, DL, VT, Hi, BigShift);
855 SDValue HiBig = SRA ? DAG.getNode(ISD::SRA, DL, VT, Hi, Width1) : Zero;
863 SDValue R600TargetLowering::LowerUADDSUBO(SDValue Op, SelectionDAG &DAG,
863 SDValue R600TargetLowering::LowerUADDSUBO(SDValue Op, SelectionDAG &DAG,
868 SDValue Lo = Op.getOperand(0);
869 SDValue Hi = Op.getOperand(1);
871 SDValue OVF = DAG.getNode(ovf, DL, VT, Lo, Hi);
876 SDValue Res = DAG.getNode(mainop, DL, VT, Lo, Hi);
881 SDValue R600TargetLowering::lowerFP_TO_UINT(SDValue Op, SelectionDAG &DAG) const {
881 SDValue R600TargetLowering::lowerFP_TO_UINT(SDValue Op, SelectionDAG &DAG) const {
891 SDValue R600TargetLowering::lowerFP_TO_SINT(SDValue Op, SelectionDAG &DAG) const {
891 SDValue R600TargetLowering::lowerFP_TO_SINT(SDValue Op, SelectionDAG &DAG) const {
901 SDValue R600TargetLowering::LowerImplicitParameter(SelectionDAG &DAG, EVT VT,
916 bool R600TargetLowering::isZero(SDValue Op) const {
926 bool R600TargetLowering::isHWTrueValue(SDValue Op) const {
933 bool R600TargetLowering::isHWFalseValue(SDValue Op) const {
940 SDValue R600TargetLowering::LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const {
940 SDValue R600TargetLowering::LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const {
944 SDValue LHS = Op.getOperand(0);
945 SDValue RHS = Op.getOperand(1);
946 SDValue True = Op.getOperand(2);
947 SDValue False = Op.getOperand(3);
948 SDValue CC = Op.getOperand(4);
949 SDValue Temp;
953 SDValue MinMax = combineFMinMaxLegacy(DL, VT, LHS, RHS, True, False, CC, DCI);
1026 SDValue Cond = LHS;
1027 SDValue Zero = RHS;
1050 SDValue SelectNode = DAG.getNode(ISD::SELECT_CC, DL, CompareVT,
1059 SDValue HWTrue, HWFalse;
1074 SDValue Cond = DAG.getNode(ISD::SELECT_CC, DL, CompareVT, LHS, RHS, HWTrue, HWFalse, CC);
1087 SDValue R600TargetLowering::stackPtrToRegIndex(SDValue Ptr,
1087 SDValue R600TargetLowering::stackPtrToRegIndex(SDValue Ptr,
1138 SDValue R600TargetLowering::lowerPrivateTruncStore(StoreSDNode *Store,
1146 SDValue Mask;
1157 SDValue OldChain = Store->getChain();
1160 SDValue Chain = VectorTrunc ? OldChain->getOperand(0) : OldChain;
1161 SDValue BasePtr = Store->getBasePtr();
1162 SDValue Offset = Store->getOffset();
1165 SDValue LoadPtr = BasePtr;
1172 SDValue Ptr = DAG.getNode(ISD::AND, DL, MVT::i32, LoadPtr,
1179 SDValue Dst = DAG.getLoad(MVT::i32, DL, Chain, Ptr, PtrInfo);
1184 SDValue ByteIdx = DAG.getNode(ISD::AND, DL, MVT::i32, LoadPtr,
1188 SDValue ShiftAmt = DAG.getNode(ISD::SHL, DL, MVT::i32, ByteIdx,
1193 SDValue SExtValue = DAG.getNode(ISD::SIGN_EXTEND, DL, MVT::i32,
1197 SDValue MaskedValue = DAG.getZeroExtendInReg(SExtValue, DL, MemVT);
1200 SDValue ShiftedValue = DAG.getNode(ISD::SHL, DL, MVT::i32,
1204 SDValue DstMask = DAG.getNode(ISD::SHL, DL, MVT::i32, Mask, ShiftAmt);
1214 SDValue Value = DAG.getNode(ISD::OR, DL, MVT::i32, Dst, ShiftedValue);
1218 SDValue NewStore = DAG.getStore(Chain, DL, Value, Ptr, PtrInfo);
1229 SDValue R600TargetLowering::LowerSTORE(SDValue Op, SelectionDAG &DAG) const {
1229 SDValue R600TargetLowering::LowerSTORE(SDValue Op, SelectionDAG &DAG) const {
1233 SDValue Chain = StoreNode->getChain();
1234 SDValue Ptr = StoreNode->getBasePtr();
1235 SDValue Value = StoreNode->getValue();
1251 SDValue NewChain = DAG.getNode(AMDGPUISD::DUMMY_CHAIN, DL, MVT::Other, Chain);
1253 SDValue NewStore = DAG.getTruncStore(
1270 SDValue DWordAddr = DAG.getNode(ISD::SRL, DL, PtrVT, Ptr,
1278 SDValue MaskConstant;
1287 SDValue ByteIndex = DAG.getNode(ISD::AND, DL, PtrVT, Ptr,
1289 SDValue BitShift = DAG.getNode(ISD::SHL, DL, VT, ByteIndex,
1293 SDValue Mask = DAG.getNode(ISD::SHL, DL, VT, MaskConstant, BitShift);
1296 SDValue TruncValue = DAG.getNode(ISD::AND, DL, VT, Value, MaskConstant);
1297 SDValue ShiftedValue = DAG.getNode(ISD::SHL, DL, VT, TruncValue, BitShift);
1301 SDValue Src[4] = {
1307 SDValue Input = DAG.getBuildVector(MVT::v4i32, DL, Src);
1308 SDValue Args[3] = { Chain, Input, DWordAddr };
1384 SDValue R600TargetLowering::lowerPrivateExtLoad(SDValue Op,
1384 SDValue R600TargetLowering::lowerPrivateExtLoad(SDValue Op,
1392 SDValue BasePtr = Load->getBasePtr();
1393 SDValue Chain = Load->getChain();
1394 SDValue Offset = Load->getOffset();
1396 SDValue LoadPtr = BasePtr;
1403 SDValue Ptr = DAG.getNode(ISD::AND, DL, MVT::i32, LoadPtr,
1410 SDValue Read = DAG.getLoad(MVT::i32, DL, Chain, Ptr, PtrInfo);
1413 SDValue ByteIdx = DAG.getNode(ISD::AND, DL, MVT::i32,
1417 SDValue ShiftAmt = DAG.getNode(ISD::SHL, DL, MVT::i32, ByteIdx,
1421 SDValue Ret = DAG.getNode(ISD::SRL, DL, MVT::i32, Read, ShiftAmt);
1427 SDValue MemEltVTNode = DAG.getValueType(MemEltVT);
1433 SDValue Ops[] = {
1441 SDValue R600TargetLowering::LowerLOAD(SDValue Op, SelectionDAG &DAG) const {
1441 SDValue R600TargetLowering::LowerLOAD(SDValue Op, SelectionDAG &DAG) const {
1454 SDValue Chain = LoadNode->getChain();
1455 SDValue Ptr = LoadNode->getBasePtr();
1468 SDValue Result;
1488 SDValue MergedValues[2] = {
1505 SDValue NewLoad = DAG.getExtLoad(
1508 SDValue Res = DAG.getNode(ISD::SIGN_EXTEND_INREG, DL, VT, NewLoad,
1511 SDValue MergedValues[2] = { Res, Chain };
1529 SDValue R600TargetLowering::LowerBRCOND(SDValue Op, SelectionDAG &DAG) const {
1529 SDValue R600TargetLowering::LowerBRCOND(SDValue Op, SelectionDAG &DAG) const {
1530 SDValue Chain = Op.getOperand(0);
1531 SDValue Cond = Op.getOperand(1);
1532 SDValue Jump = Op.getOperand(2);
1538 SDValue R600TargetLowering::lowerFrameIndex(SDValue Op,
1538 SDValue R600TargetLowering::lowerFrameIndex(SDValue Op,
1578 SDValue R600TargetLowering::LowerFormalArguments(
1579 SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
1581 SelectionDAG &DAG, SmallVectorImpl<SDValue> &InVals) const {
1606 SDValue Register = DAG.getCopyFromReg(Chain, DL, Reg, VT);
1639 SDValue Arg = DAG.getLoad(
1687 static SDValue CompactSwizzlableVector(
1688 SelectionDAG &DAG, SDValue VectorEntry,
1695 SDValue NewBldVec[4];
1737 static SDValue ReorganizeVector(SelectionDAG &DAG, SDValue VectorEntry,
1737 static SDValue ReorganizeVector(SelectionDAG &DAG, SDValue VectorEntry,
1744 SDValue NewBldVec[4];
1777 SDValue R600TargetLowering::OptimizeSwizzle(SDValue BuildVector, SDValue Swz[4],
1777 SDValue R600TargetLowering::OptimizeSwizzle(SDValue BuildVector, SDValue Swz[4],
1777 SDValue R600TargetLowering::OptimizeSwizzle(SDValue BuildVector, SDValue Swz[4],
1801 SDValue R600TargetLowering::constBufferLoad(LoadSDNode *LoadNode, int Block,
1805 SDValue Chain = LoadNode->getChain();
1806 SDValue Ptr = LoadNode->getBasePtr();
1818 SDValue Slots[4];
1825 SDValue NewPtr = DAG.getNode(ISD::ADD, DL, Ptr.getValueType(), Ptr,
1835 SDValue Result = DAG.getBuildVector(NewVT, DL, makeArrayRef(Slots, NumElements));
1840 SDValue MergedValues[2] = {
1851 SDValue R600TargetLowering::PerformDAGCombine(SDNode *N,
1859 SDValue Arg = N->getOperand(0);
1873 SDValue FNeg = N->getOperand(0);
1877 SDValue SelectCC = FNeg.getOperand(0);
1899 SDValue InVec = N->getOperand(0);
1900 SDValue InVal = N->getOperand(1);
1901 SDValue EltNo = N->getOperand(2);
1921 SmallVector<SDValue, 8> Ops;
1951 SDValue Arg = N->getOperand(0);
1973 if (SDValue Ret = AMDGPUTargetLowering::PerformDAGCombine(N, DCI))
1981 SDValue LHS = N->getOperand(0);
1986 SDValue RHS = N->getOperand(1);
1987 SDValue True = N->getOperand(2);
1988 SDValue False = N->getOperand(3);
2019 SDValue Arg = N->getOperand(1);
2023 SDValue NewArgs[8] = {
2037 SDValue Arg = N->getOperand(1);
2041 SDValue NewArgs[19] = {
2068 SDValue Ptr = LoadNode->getBasePtr();
2082 SDValue &Src, SDValue &Neg, SDValue &Abs,
2082 SDValue &Src, SDValue &Neg, SDValue &Abs,
2082 SDValue &Src, SDValue &Neg, SDValue &Abs,
2083 SDValue &Sel, SDValue &Imm,
2083 SDValue &Sel, SDValue &Imm,
2109 SDValue CstOffset = Src.getOperand(0);
2220 SDValue FakeOp;
2222 std::vector<SDValue> Ops(Node->op_begin(), Node->op_end());
2258 SDValue &Src = Ops[OperandIdx[i] - 1];
2259 SDValue &Neg = Ops[NegIdx[i] - 1];
2260 SDValue &Abs = Ops[AbsIdx[i] - 1];
2265 SDValue &Sel = (SelIdx > -1) ? Ops[SelIdx] : FakeOp;
2271 SDValue &Src = Ops[i];
2296 SDValue &Src = Ops[OperandIdx[i] - 1];
2297 SDValue &Neg = Ops[NegIdx[i] - 1];
2298 SDValue FakeAbs;
2299 SDValue &Abs = (AbsIdx[i] > -1) ? Ops[AbsIdx[i] - 1] : FakeAbs;
2307 SDValue &Sel = (SelIdx > -1) ? Ops[SelIdx] : FakeOp;
2308 SDValue &Imm = Ops[ImmIdx];
lib/Target/AMDGPU/R600ISelLowering.h 35 SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
35 SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
36 SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const override;
38 SmallVectorImpl<SDValue> &Results,
41 SDValue LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv,
41 SDValue LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv,
45 SmallVectorImpl<SDValue> &InVals) const override;
63 SDValue LowerImplicitParameter(SelectionDAG &DAG, EVT VT, const SDLoc &DL,
68 SDValue OptimizeSwizzle(SDValue BuildVector, SDValue Swz[], SelectionDAG &DAG,
68 SDValue OptimizeSwizzle(SDValue BuildVector, SDValue Swz[], SelectionDAG &DAG,
68 SDValue OptimizeSwizzle(SDValue BuildVector, SDValue Swz[], SelectionDAG &DAG,
70 SDValue vectorToVerticalVector(SelectionDAG &DAG, SDValue Vector) const;
70 SDValue vectorToVerticalVector(SelectionDAG &DAG, SDValue Vector) const;
72 SDValue lowerFrameIndex(SDValue Op, SelectionDAG &DAG) const;
72 SDValue lowerFrameIndex(SDValue Op, SelectionDAG &DAG) const;
73 SDValue LowerEXTRACT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const;
73 SDValue LowerEXTRACT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const;
74 SDValue LowerINSERT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const;
74 SDValue LowerINSERT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const;
75 SDValue LowerGlobalAddress(AMDGPUMachineFunction *MFI, SDValue Op,
75 SDValue LowerGlobalAddress(AMDGPUMachineFunction *MFI, SDValue Op,
77 SDValue LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const;
77 SDValue LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const;
79 SDValue lowerPrivateTruncStore(StoreSDNode *Store, SelectionDAG &DAG) const;
80 SDValue LowerSTORE(SDValue Op, SelectionDAG &DAG) const;
80 SDValue LowerSTORE(SDValue Op, SelectionDAG &DAG) const;
81 SDValue lowerFP_TO_UINT(SDValue Op, SelectionDAG &DAG) const;
81 SDValue lowerFP_TO_UINT(SDValue Op, SelectionDAG &DAG) const;
82 SDValue lowerFP_TO_SINT(SDValue Op, SelectionDAG &DAG) const;
82 SDValue lowerFP_TO_SINT(SDValue Op, SelectionDAG &DAG) const;
84 SDValue lowerPrivateExtLoad(SDValue Op, SelectionDAG &DAG) const;
84 SDValue lowerPrivateExtLoad(SDValue Op, SelectionDAG &DAG) const;
85 SDValue LowerLOAD(SDValue Op, SelectionDAG &DAG) const;
85 SDValue LowerLOAD(SDValue Op, SelectionDAG &DAG) const;
86 SDValue LowerBRCOND(SDValue Op, SelectionDAG &DAG) const;
86 SDValue LowerBRCOND(SDValue Op, SelectionDAG &DAG) const;
87 SDValue LowerTrig(SDValue Op, SelectionDAG &DAG) const;
87 SDValue LowerTrig(SDValue Op, SelectionDAG &DAG) const;
88 SDValue LowerSHLParts(SDValue Op, SelectionDAG &DAG) const;
88 SDValue LowerSHLParts(SDValue Op, SelectionDAG &DAG) const;
89 SDValue LowerSRXParts(SDValue Op, SelectionDAG &DAG) const;
89 SDValue LowerSRXParts(SDValue Op, SelectionDAG &DAG) const;
90 SDValue LowerUADDSUBO(SDValue Op, SelectionDAG &DAG,
90 SDValue LowerUADDSUBO(SDValue Op, SelectionDAG &DAG,
93 SDValue stackPtrToRegIndex(SDValue Ptr, unsigned StackWidth,
93 SDValue stackPtrToRegIndex(SDValue Ptr, unsigned StackWidth,
97 bool isZero(SDValue Op) const;
98 bool isHWTrueValue(SDValue Op) const;
99 bool isHWFalseValue(SDValue Op) const;
101 bool FoldOperand(SDNode *ParentNode, unsigned SrcIdx, SDValue &Src,
102 SDValue &Neg, SDValue &Abs, SDValue &Sel, SDValue &Imm,
102 SDValue &Neg, SDValue &Abs, SDValue &Sel, SDValue &Imm,
102 SDValue &Neg, SDValue &Abs, SDValue &Sel, SDValue &Imm,
102 SDValue &Neg, SDValue &Abs, SDValue &Sel, SDValue &Imm,
104 SDValue constBufferLoad(LoadSDNode *LoadNode, int Block,
lib/Target/AMDGPU/SIISelLowering.cpp 1397 SDValue SITargetLowering::lowerKernArgParameterPtr(SelectionDAG &DAG,
1399 SDValue Chain,
1413 SDValue BasePtr = DAG.getCopyFromReg(Chain, SL,
1419 SDValue SITargetLowering::getImplicitArgPtr(SelectionDAG &DAG,
1426 SDValue SITargetLowering::convertArgType(SelectionDAG &DAG, EVT VT, EVT MemVT,
1427 const SDLoc &SL, SDValue Val,
1457 SDValue SITargetLowering::lowerKernargMemParameter(
1459 const SDLoc &SL, SDValue Chain,
1478 SDValue Ptr = lowerKernArgParameterPtr(DAG, SL, Chain, AlignDownOffset);
1479 SDValue Load = DAG.getLoad(MVT::i32, SL, Chain, Ptr, PtrInfo, 4,
1483 SDValue ShiftAmt = DAG.getConstant(OffsetDiff * 8, SL, MVT::i32);
1484 SDValue Extract = DAG.getNode(ISD::SRL, SL, MVT::i32, Load, ShiftAmt);
1486 SDValue ArgVal = DAG.getNode(ISD::TRUNCATE, SL, IntVT, Extract);
1494 SDValue Ptr = lowerKernArgParameterPtr(DAG, SL, Chain, Offset);
1495 SDValue Load = DAG.getLoad(MemVT, SL, Chain, Ptr, PtrInfo, Align,
1499 SDValue Val = convertArgType(DAG, VT, MemVT, SL, Load, Signed, Arg);
1503 SDValue SITargetLowering::lowerStackParameter(SelectionDAG &DAG, CCValAssign &VA,
1504 const SDLoc &SL, SDValue Chain,
1521 SDValue FIN = DAG.getFrameIndex(FI, MVT::i32);
1522 SDValue ArgValue;
1552 SDValue SITargetLowering::getPreloadedValue(SelectionDAG &DAG,
2017 SDValue SITargetLowering::LowerFormalArguments(
2018 SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
2020 SelectionDAG &DAG, SmallVectorImpl<SDValue> &InVals) const {
2112 SmallVector<SDValue, 16> Chains;
2138 SDValue Arg = lowerKernargMemParameter(
2157 SDValue Val = lowerStackParameter(DAG, VA, DL, Chain, Arg);
2171 SDValue Val = DAG.getCopyFromReg(Chain, DL, Reg, VT);
2258 SDValue
2259 SITargetLowering::LowerReturn(SDValue Chain, CallingConv::ID CallConv,
2262 const SmallVectorImpl<SDValue> &OutVals,
2288 SDValue Flag;
2289 SmallVector<SDValue, 48> RetOps;
2295 SDValue ReturnAddrReg = CreateLiveInRegister(
2298 SDValue ReturnAddrVirtualReg = DAG.getRegister(
2313 SDValue Arg = OutVals[RealRVLocIdx];
2368 SDValue SITargetLowering::LowerCallResult(
2369 SDValue Chain, SDValue InFlag, CallingConv::ID CallConv, bool IsVarArg,
2369 SDValue Chain, SDValue InFlag, CallingConv::ID CallConv, bool IsVarArg,
2371 SelectionDAG &DAG, SmallVectorImpl<SDValue> &InVals, bool IsThisReturn,
2372 SDValue ThisVal) const {
2384 SDValue Val;
2430 SmallVectorImpl<std::pair<unsigned, SDValue>> &RegsToPass,
2431 SmallVectorImpl<SDValue> &MemOpChains,
2432 SDValue Chain) const {
2483 SDValue InputReg;
2498 SDValue ArgStore = storeStackInputValue(DAG, DL, Chain, InputReg,
2527 SDValue InputReg;
2535 SDValue Y = loadInputValue(DAG, ArgRC, MVT::i32, DL, *IncomingArgY);
2543 SDValue Z = loadInputValue(DAG, ArgRC, MVT::i32, DL, *IncomingArgZ);
2564 SDValue ArgStore = storeStackInputValue(DAG, DL, Chain, InputReg,
2585 SDValue Callee, CallingConv::ID CalleeCC, bool IsVarArg,
2587 const SmallVectorImpl<SDValue> &OutVals,
2668 SDValue SITargetLowering::LowerCall(CallLoweringInfo &CLI,
2669 SmallVectorImpl<SDValue> &InVals) const {
2673 SmallVector<SDValue, 32> &OutVals = CLI.OutVals;
2675 SDValue Chain = CLI.Chain;
2676 SDValue Callee = CLI.Callee;
2762 SmallVector<std::pair<unsigned, SDValue>, 8> RegsToPass;
2769 SmallVector<SDValue, 4> CopyFromChains;
2772 SDValue ScratchRSrcReg
2779 SmallVector<SDValue, 8> MemOpChains;
2786 SDValue Arg = OutVals[realArgIdx];
2816 SDValue DstAddr;
2822 SDValue PtrOff = DAG.getConstant(Offset, DL, PtrVT);
2858 SDValue SizeNode =
2860 SDValue Cpy = DAG.getMemcpy(
2869 SDValue Store = DAG.getStore(Chain, DL, Arg, DstAddr, DstInfo,
2884 SDValue InFlag;
2892 SDValue PhysReturnAddrReg;
2898 SDValue ReturnAddrReg = CreateLiveInRegister(
2919 std::vector<SDValue> Ops;
2964 SDValue Call = DAG.getNode(AMDGPUISD::CALL, DL, NodeTys, Ops);
3948 SDValue SITargetLowering::splitUnaryVectorOp(SDValue Op,
3948 SDValue SITargetLowering::splitUnaryVectorOp(SDValue Op,
3954 SDValue Lo, Hi;
3958 SDValue OpLo = DAG.getNode(Opc, SL, Lo.getValueType(), Lo,
3960 SDValue OpHi = DAG.getNode(Opc, SL, Hi.getValueType(), Hi,
3968 SDValue SITargetLowering::splitBinaryVectorOp(SDValue Op,
3968 SDValue SITargetLowering::splitBinaryVectorOp(SDValue Op,
3974 SDValue Lo0, Hi0;
3976 SDValue Lo1, Hi1;
3981 SDValue OpLo = DAG.getNode(Opc, SL, Lo0.getValueType(), Lo0, Lo1,
3983 SDValue OpHi = DAG.getNode(Opc, SL, Hi0.getValueType(), Hi0, Hi1,
3989 SDValue SITargetLowering::splitTernaryVectorOp(SDValue Op,
3989 SDValue SITargetLowering::splitTernaryVectorOp(SDValue Op,
3995 SDValue Lo0, Hi0;
3997 SDValue Lo1, Hi1;
3999 SDValue Lo2, Hi2;
4004 SDValue OpLo = DAG.getNode(Opc, SL, Lo0.getValueType(), Lo0, Lo1, Lo2,
4006 SDValue OpHi = DAG.getNode(Opc, SL, Hi0.getValueType(), Hi0, Hi1, Hi2,
4013 SDValue SITargetLowering::LowerOperation(SDValue Op, SelectionDAG &DAG) const {
4013 SDValue SITargetLowering::LowerOperation(SDValue Op, SelectionDAG &DAG) const {
4019 SDValue Result = LowerLOAD(Op, DAG);
4086 static SDValue adjustLoadValueTypeImpl(SDValue Result, EVT LoadVT,
4086 static SDValue adjustLoadValueTypeImpl(SDValue Result, EVT LoadVT,
4098 SmallVector<SDValue, 4> Elts;
4100 for (SDValue &Elt : Elts)
4113 SDValue SITargetLowering::adjustLoadValueType(unsigned Opcode,
4116 ArrayRef<SDValue> Ops,
4133 SDValue Load
4141 SDValue Adjusted = adjustLoadValueTypeImpl(Load, LoadVT, DL, DAG, Unpacked);
4146 SDValue SITargetLowering::lowerIntrinsicLoad(MemSDNode *M, bool IsFormat,
4148 ArrayRef<SDValue> Ops) const {
4174 SDValue MemNode = getMemIntrinsicNode(Opc, DL, VTList, Ops, CastVT,
4181 static SDValue lowerICMPIntrinsic(const SITargetLowering &TLI,
4192 SDValue LHS = N->getOperand(1);
4193 SDValue RHS = N->getOperand(2);
4210 SDValue SetCC = DAG.getNode(AMDGPUISD::SETCC, DL, CCVT, LHS, RHS,
4217 static SDValue lowerFCMPIntrinsic(const SITargetLowering &TLI,
4228 SDValue Src0 = N->getOperand(1);
4229 SDValue Src1 = N->getOperand(2);
4242 SDValue SetCC = DAG.getNode(AMDGPUISD::SETCC, SL, CCVT, Src0,
4250 SmallVectorImpl<SDValue> &Results,
4254 if (SDValue Res = lowerINSERT_VECTOR_ELT(SDValue(N, 0), DAG))
4259 if (SDValue Res = lowerEXTRACT_VECTOR_ELT(SDValue(N, 0), DAG))
4267 SDValue Src0 = N->getOperand(1);
4268 SDValue Src1 = N->getOperand(2);
4270 SDValue Cvt = DAG.getNode(AMDGPUISD::CVT_PKRTZ_F16_F32, SL, MVT::i32,
4279 SDValue Src0 = N->getOperand(1);
4280 SDValue Src1 = N->getOperand(2);
4297 SDValue Cvt = DAG.getNode(Opcode, SL, MVT::i32, Src0, Src1);
4306 if (SDValue Res = LowerINTRINSIC_W_CHAIN(SDValue(N, 0), DAG)) {
4324 SDValue LHS = DAG.getNode(ISD::BITCAST, SL, NewVT, N->getOperand(1));
4325 SDValue RHS = DAG.getNode(ISD::BITCAST, SL, NewVT, N->getOperand(2));
4334 SDValue NewSelect = DAG.getNode(ISD::SELECT, SL, SelectVT,
4347 SDValue BC = DAG.getNode(ISD::BITCAST, SL, MVT::i32, N->getOperand(0));
4349 SDValue Op = DAG.getNode(ISD::XOR, SL, MVT::i32,
4360 SDValue BC = DAG.getNode(ISD::BITCAST, SL, MVT::i32, N->getOperand(0));
4362 SDValue Op = DAG.getNode(ISD::AND, SL, MVT::i32,
4374 static SDNode *findUser(SDValue Value, unsigned Opcode) {
4434 SDValue SITargetLowering::LowerBRCOND(SDValue BRCOND,
4434 SDValue SITargetLowering::LowerBRCOND(SDValue BRCOND,
4439 SDValue Target = BRCOND.getOperand(2);
4476 SmallVector<SDValue, 4> Ops;
4489 SDValue Ops[] = {
4499 SDValue Ops[] = {
4503 SDValue NewBR = DAG.getNode(ISD::BR, DL, BR->getVTList(), Ops);
4508 SDValue Chain = SDValue(Result, Result->getNumValues() - 1);
4533 SDValue SITargetLowering::LowerRETURNADDR(SDValue Op,
4533 SDValue SITargetLowering::LowerRETURNADDR(SDValue Op,
4558 SDValue SITargetLowering::getFPExtOrFPTrunc(SelectionDAG &DAG,
4559 SDValue Op,
4567 SDValue SITargetLowering::lowerFP_ROUND(SDValue Op, SelectionDAG &DAG) const {
4567 SDValue SITargetLowering::lowerFP_ROUND(SDValue Op, SelectionDAG &DAG) const {
4571 SDValue Src = Op.getOperand(0);
4578 SDValue FpToFp16 = DAG.getNode(ISD::FP_TO_FP16, DL, MVT::i32, Src);
4579 SDValue Trunc = DAG.getNode(ISD::TRUNCATE, DL, MVT::i16, FpToFp16);
4583 SDValue SITargetLowering::lowerFMINNUM_FMAXNUM(SDValue Op,
4583 SDValue SITargetLowering::lowerFMINNUM_FMAXNUM(SDValue Op,
4602 SDValue SITargetLowering::lowerTRAP(SDValue Op, SelectionDAG &DAG) const {
4602 SDValue SITargetLowering::lowerTRAP(SDValue Op, SelectionDAG &DAG) const {
4604 SDValue Chain = Op.getOperand(0);
4614 SDValue QueuePtr = CreateLiveInRegister(
4616 SDValue SGPR01 = DAG.getRegister(AMDGPU::SGPR0_SGPR1, MVT::i64);
4617 SDValue ToReg = DAG.getCopyToReg(Chain, SL, SGPR01,
4619 SDValue Ops[] = {
4628 SDValue SITargetLowering::lowerDEBUGTRAP(SDValue Op, SelectionDAG &DAG) const {
4628 SDValue SITargetLowering::lowerDEBUGTRAP(SDValue Op, SelectionDAG &DAG) const {
4630 SDValue Chain = Op.getOperand(0);
4644 SDValue Ops[] = {
4651 SDValue SITargetLowering::getSegmentAperture(unsigned AS, const SDLoc &DL,
4666 SDValue EncodingImm = DAG.getTargetConstant(Encoding, DL, MVT::i16);
4667 SDValue ApertureReg = SDValue(
4669 SDValue ShiftAmount = DAG.getTargetConstant(WidthM1 + 1, DL, MVT::i32);
4678 SDValue QueuePtr = CreateLiveInRegister(
4685 SDValue Ptr = DAG.getObjectPtrOffset(DL, QueuePtr, StructOffset);
4700 SDValue SITargetLowering::lowerADDRSPACECAST(SDValue Op,
4700 SDValue SITargetLowering::lowerADDRSPACECAST(SDValue Op,
4705 SDValue Src = ASC->getOperand(0);
4706 SDValue FlatNullPtr = DAG.getConstant(0, SL, MVT::i64);
4718 SDValue SegmentNullPtr = DAG.getConstant(NullVal, SL, MVT::i32);
4719 SDValue NonNull = DAG.getSetCC(SL, MVT::i1, Src, FlatNullPtr, ISD::SETNE);
4720 SDValue Ptr = DAG.getNode(ISD::TRUNCATE, SL, MVT::i32, Src);
4734 SDValue SegmentNullPtr = DAG.getConstant(NullVal, SL, MVT::i32);
4736 SDValue NonNull
4739 SDValue Aperture = getSegmentAperture(ASC->getSrcAddressSpace(), SL, DAG);
4740 SDValue CvtPtr
4764 SDValue SITargetLowering::lowerINSERT_SUBVECTOR(SDValue Op,
4764 SDValue SITargetLowering::lowerINSERT_SUBVECTOR(SDValue Op,
4766 SDValue Vec = Op.getOperand(0);
4767 SDValue Ins = Op.getOperand(1);
4768 SDValue Idx = Op.getOperand(2);
4777 SDValue Elt = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, SL, EltVT, Ins,
4785 SDValue SITargetLowering::lowerINSERT_VECTOR_ELT(SDValue Op,
4785 SDValue SITargetLowering::lowerINSERT_VECTOR_ELT(SDValue Op,
4787 SDValue Vec = Op.getOperand(0);
4788 SDValue InsVal = Op.getOperand(1);
4789 SDValue Idx = Op.getOperand(2);
4803 SDValue BCVec = DAG.getNode(ISD::BITCAST, SL, MVT::v2i32, Vec);
4805 SDValue LoHalf = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, SL, MVT::i32, BCVec,
4807 SDValue HiHalf = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, SL, MVT::i32, BCVec,
4810 SDValue LoVec = DAG.getNode(ISD::BITCAST, SL, MVT::v2i16, LoHalf);
4811 SDValue HiVec = DAG.getNode(ISD::BITCAST, SL, MVT::v2i16, HiHalf);
4815 SDValue InsHalf = DAG.getNode(ISD::INSERT_VECTOR_ELT, SL, MVT::v2i16,
4822 SDValue Concat = InsertLo ?
4839 SDValue ExtVal = DAG.getNode(ISD::BITCAST, SL, IntVT,
4843 SDValue ScaleFactor = DAG.getConstant(Log2_32(EltSize), SL, MVT::i32);
4846 SDValue ScaledIdx = DAG.getNode(ISD::SHL, SL, MVT::i32, Idx, ScaleFactor);
4848 SDValue BCVec = DAG.getNode(ISD::BITCAST, SL, IntVT, Vec);
4849 SDValue BFM = DAG.getNode(ISD::SHL, SL, IntVT,
4853 SDValue LHS = DAG.getNode(ISD::AND, SL, IntVT, BFM, ExtVal);
4854 SDValue RHS = DAG.getNode(ISD::AND, SL, IntVT,
4857 SDValue BFI = DAG.getNode(ISD::OR, SL, IntVT, LHS, RHS);
4861 SDValue SITargetLowering::lowerEXTRACT_VECTOR_ELT(SDValue Op,
4861 SDValue SITargetLowering::lowerEXTRACT_VECTOR_ELT(SDValue Op,
4866 SDValue Vec = Op.getOperand(0);
4867 SDValue Idx = Op.getOperand(1);
4879 if (SDValue Combined = performExtractVectorEltCombine(Op.getNode(), DCI))
4886 SDValue ScaleFactor = DAG.getConstant(Log2_32(EltSize), SL, MVT::i32);
4889 SDValue ScaledIdx = DAG.getNode(ISD::SHL, SL, MVT::i32, Idx, ScaleFactor);
4891 SDValue BC = DAG.getNode(ISD::BITCAST, SL, IntVT, Vec);
4892 SDValue Elt = DAG.getNode(ISD::SRL, SL, IntVT, BC, ScaledIdx);
4895 SDValue Result = DAG.getNode(ISD::TRUNCATE, SL, MVT::i16, Elt);
4907 SDValue SITargetLowering::lowerVECTOR_SHUFFLE(SDValue Op,
4907 SDValue SITargetLowering::lowerVECTOR_SHUFFLE(SDValue Op,
4927 SmallVector<SDValue, 4> Pieces;
4933 SDValue SubVec = DAG.getNode(ISD::EXTRACT_SUBVECTOR, SL,
4945 SDValue Vec0 = SVN->getOperand(VecIdx0);
4946 SDValue Elt0 = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, SL, EltVT,
4949 SDValue Vec1 = SVN->getOperand(VecIdx1);
4950 SDValue Elt1 = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, SL, EltVT,
4959 SDValue SITargetLowering::lowerBUILD_VECTOR(SDValue Op,
4959 SDValue SITargetLowering::lowerBUILD_VECTOR(SDValue Op,
4969 SDValue Lo = DAG.getBuildVector(HalfVT, SL,
4971 SDValue Hi = DAG.getBuildVector(HalfVT, SL,
4974 SDValue CastLo = DAG.getNode(ISD::BITCAST, SL, MVT::i32, Lo);
4975 SDValue CastHi = DAG.getNode(ISD::BITCAST, SL, MVT::i32, Hi);
4977 SDValue Blend = DAG.getBuildVector(MVT::v2i32, SL, { CastLo, CastHi });
4984 SDValue Lo = Op.getOperand(0);
4985 SDValue Hi = Op.getOperand(1);
4990 SDValue ExtLo = DAG.getNode(ISD::ANY_EXTEND, SL, MVT::i32, Lo);
4997 SDValue ShlHi = DAG.getNode(ISD::SHL, SL, MVT::i32, Hi,
5005 SDValue Or = DAG.getNode(ISD::OR, SL, MVT::i32, Lo, ShlHi);
5018 static SDValue
5052 SDValue PtrLo =
5054 SDValue PtrHi;
5064 SDValue SITargetLowering::LowerGlobalAddress(AMDGPUMachineFunction *MFI,
5065 SDValue Op,
5081 SDValue GA = DAG.getTargetGlobalAddress(GV, DL, MVT::i32, GSD->getOffset(),
5092 SDValue GOTAddr = buildPCRelGlobalAddress(DAG, GV, DL, 0, PtrVT,
5107 SDValue SITargetLowering::copyToM0(SelectionDAG &DAG, SDValue Chain,
5107 SDValue SITargetLowering::copyToM0(SelectionDAG &DAG, SDValue Chain,
5108 const SDLoc &DL, SDValue V) const {
5123 SDValue SITargetLowering::lowerImplicitZextParam(SelectionDAG &DAG,
5124 SDValue Op,
5128 SDValue Param = lowerKernargMemParameter(DAG, MVT::i32, MVT::i32, SL,
5135 static SDValue emitNonHSAIntrinsicError(SelectionDAG &DAG, const SDLoc &DL,
5144 static SDValue emitRemovedIntrinsicError(SelectionDAG &DAG, const SDLoc &DL,
5153 static SDValue getBuildDwordsVector(SelectionDAG &DAG, SDLoc DL,
5154 ArrayRef<SDValue> Elts) {
5177 SmallVector<SDValue, 16> VecElts(NumElts);
5179 SDValue Elt = Elts[i];
5192 static bool parseCachePolicy(SDValue CachePolicy, SelectionDAG &DAG,
5193 SDValue *GLC, SDValue *SLC, SDValue *DLC) {
5193 SDValue *GLC, SDValue *SLC, SDValue *DLC) {
5193 SDValue *GLC, SDValue *SLC, SDValue *DLC) {
5217 static SDValue constructRetValue(SelectionDAG &DAG,
5254 SDValue N = SDValue(Result, 0);
5255 SDValue CastRes = DAG.getNode(ISD::BITCAST, DL, CastVT, N);
5258 SmallVector<SDValue, 4> BVElts;
5269 SDValue PreTFCRes;
5271 SDValue NewVec = DAG.getBuildVector(AdjVT, DL, BVElts);
5291 SmallVector<SDValue, 1> TFCElt;
5293 SDValue TFCRes = DAG.getNode(ISD::BITCAST, DL, ResultTypes[1], TFCElt[0]);
5297 static bool parseTexFail(SDValue TexFailCtrl, SelectionDAG &DAG, SDValue *TFE,
5297 static bool parseTexFail(SDValue TexFailCtrl, SelectionDAG &DAG, SDValue *TFE,
5298 SDValue *LWE, bool &IsTexFail) {
5315 SDValue SITargetLowering::lowerImage(SDValue Op,
5315 SDValue SITargetLowering::lowerImage(SDValue Op,
5335 SDValue VData;
5348 SDValue VData2 = Op.getOperand(3);
5416 SmallVector<SDValue, 4> VAddrs;
5449 SDValue AddrLo, AddrHi;
5490 SDValue VAddr;
5494 SDValue True = DAG.getTargetConstant(1, DL, MVT::i1);
5495 SDValue False = DAG.getTargetConstant(0, DL, MVT::i1);
5497 SDValue Unorm;
5509 SDValue TFE;
5510 SDValue LWE;
5511 SDValue TexFail = Op.getOperand(CtrlIdx);
5534 SDValue Undef = DAG.getUNDEF(Op.getValueType());
5553 SDValue GLC;
5554 SDValue SLC;
5555 SDValue DLC;
5567 SmallVector<SDValue, 26> Ops;
5571 for (const SDValue &Addr : VAddrs)
5624 SmallVector<SDValue, 1> Elt;
5638 SDValue SITargetLowering::lowerSBuffer(EVT VT, SDLoc DL, SDValue Rsrc,
5638 SDValue SITargetLowering::lowerSBuffer(EVT VT, SDLoc DL, SDValue Rsrc,
5639 SDValue Offset, SDValue GLC, SDValue DLC,
5639 SDValue Offset, SDValue GLC, SDValue DLC,
5639 SDValue Offset, SDValue GLC, SDValue DLC,
5649 SDValue Ops[] = {
5661 SmallVector<SDValue, 4> Loads;
5676 SDValue Ops[] = {
5704 SDValue SITargetLowering::LowerINTRINSIC_WO_CHAIN(SDValue Op,
5704 SDValue SITargetLowering::LowerINTRINSIC_WO_CHAIN(SDValue Op,
5770 SDValue Rsq = DAG.getNode(AMDGPUISD::RSQ, DL, VT, Op.getOperand(1));
5771 SDValue Tmp = DAG.getNode(ISD::FMINNUM, DL, VT, Rsq,
5862 SDValue GLC;
5863 SDValue DLC = DAG.getTargetConstant(0, DL, MVT::i1);
5873 SDValue ToM0 = DAG.getCopyToReg(DAG.getEntryNode(), DL, AMDGPU::M0,
5879 SDValue S = DAG.getNode(
5887 SDValue Ops[] = {
5901 SDValue Ops[] = {
5915 SDValue ToM0 = DAG.getCopyToReg(DAG.getEntryNode(), DL, AMDGPU::M0,
5917 SDValue Ops[] = {
5978 SDValue Numerator = Op.getOperand(1);
5979 SDValue Denominator = Op.getOperand(2);
5986 SDValue Src0 = Param->isAllOnesValue() ? Numerator : Denominator;
6043 SDValue Node = DAG.getNode(Opcode, DL, MVT::i32,
6063 SDValue GA = DAG.getTargetGlobalAddress(GV, DL, MVT::i32, 0,
6072 SDValue Aperture = getSegmentAperture(AS, SL, DAG);
6073 SDValue SrcVec = DAG.getNode(ISD::BITCAST, DL, MVT::v2i32,
6076 SDValue SrcHi = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, SL, MVT::i32, SrcVec,
6094 static unsigned getBufferOffsetForMMO(SDValue VOffset,
6095 SDValue SOffset,
6096 SDValue Offset,
6097 SDValue VIndex = SDValue()) {
6113 SDValue SITargetLowering::LowerINTRINSIC_W_CHAIN(SDValue Op,
6113 SDValue SITargetLowering::LowerINTRINSIC_W_CHAIN(SDValue Op,
6122 SDValue Chain = M->getOperand(0);
6123 SDValue M0 = M->getOperand(2);
6124 SDValue Value = M->getOperand(3);
6187 SDValue Ops[] = {
6232 SDValue Ops[] = {
6248 SDValue Ops[] = {
6290 SDValue Ops[] = {
6310 SDValue Ops[] = {
6337 SDValue Ops[] = {
6361 SDValue Ops[] = {
6385 SDValue Ops[] = {
6418 SDValue Ops[] = {
6490 SDValue Ops[] = {
6564 SDValue Ops[] = {
6631 SDValue Ops[] = {
6656 SDValue Ops[] = {
6677 SDValue Ops[] = {
6709 SDValue SITargetLowering::getMemIntrinsicNode(unsigned Opcode, const SDLoc &DL,
6711 ArrayRef<SDValue> Ops, EVT MemVT,
6729 auto NewOp = DAG.getMemIntrinsicNode(Opcode, DL, WidenedVTList, Ops,
6732 auto Extract = DAG.getNode(
6740 SDValue SITargetLowering::handleD16VData(SDValue VData,
6740 SDValue SITargetLowering::handleD16VData(SDValue VData,
6754 SDValue IntVData = DAG.getNode(ISD::BITCAST, DL, IntStoreVT, VData);
6758 SDValue ZExt = DAG.getNode(ISD::ZERO_EXTEND, DL, EquivStoreVT, IntVData);
6766 SDValue SITargetLowering::LowerINTRINSIC_VOID(SDValue Op,
6766 SDValue SITargetLowering::LowerINTRINSIC_VOID(SDValue Op,
6769 SDValue Chain = Op.getOperand(0);
6780 const SDValue Ops[] = {
6799 SDValue Src0 = Op.getOperand(4);
6800 SDValue Src1 = Op.getOperand(5);
6804 SDValue Undef = DAG.getUNDEF(MVT::f32);
6805 const SDValue Ops[] = {
6832 SDValue VData = Op.getOperand(2);
6843 SDValue Ops[] = {
6863 SDValue VData = Op.getOperand(2);
6868 SDValue Ops[] = {
6888 SDValue VData = Op.getOperand(2);
6893 SDValue Ops[] = {
6914 SDValue VData = Op.getOperand(2);
6923 SDValue Ops[] = {
6958 SDValue VData = Op.getOperand(2);
6972 SDValue Ops[] = {
7002 SDValue VData = Op.getOperand(2);
7017 SDValue Ops[] = {
7049 SDValue Ops[] = {
7076 SDValue Ops[] = {
7111 std::pair<SDValue, SDValue> SITargetLowering::splitBufferOffsets(
7111 std::pair<SDValue, SDValue> SITargetLowering::splitBufferOffsets(
7112 SDValue Offset, SelectionDAG &DAG) const {
7115 SDValue N0 = Offset;
7142 auto OverflowVal = DAG.getConstant(Overflow, DL, MVT::i32);
7146 SDValue Ops[] = { N0, OverflowVal };
7161 unsigned SITargetLowering::setBufferOffsets(SDValue CombinedOffset,
7162 SelectionDAG &DAG, SDValue *Offsets,
7176 SDValue N0 = CombinedOffset.getOperand(0);
7177 SDValue N1 = CombinedOffset.getOperand(1);
7195 SDValue SITargetLowering::handleByteShortBufferLoads(SelectionDAG &DAG,
7197 ArrayRef<SDValue> Ops,
7204 SDValue BufferLoad = DAG.getMemIntrinsicNode(Opc, DL, ResList,
7207 SDValue LoadVal = DAG.getNode(ISD::TRUNCATE, DL, IntVT, BufferLoad);
7214 SDValue SITargetLowering::handleByteShortBufferStores(SelectionDAG &DAG,
7216 SDValue Ops[],
7221 SDValue BufferStoreExt = DAG.getNode(ISD::ANY_EXTEND, DL, MVT::i32, Ops[1]);
7225 ArrayRef<SDValue> OpsRef = makeArrayRef(&Ops[0], 9);
7230 static SDValue getLoadExtOrTrunc(SelectionDAG &DAG,
7231 ISD::LoadExtType ExtType, SDValue Op,
7250 SDValue SITargetLowering::widenLoad(LoadSDNode *Ld, DAGCombinerInfo &DCI) const {
7276 SDValue Ptr = Ld->getBasePtr();
7277 SDValue NewLoad = DAG.getLoad(ISD::UNINDEXED, ISD::NON_EXTLOAD,
7293 SDValue Cvt = NewLoad;
7320 SDValue SITargetLowering::LowerLOAD(SDValue Op, SelectionDAG &DAG) const {
7320 SDValue SITargetLowering::LowerLOAD(SDValue Op, SelectionDAG &DAG) const {
7333 SDValue Chain = Load->getChain();
7334 SDValue BasePtr = Load->getBasePtr();
7339 SDValue NewLD = DAG.getExtLoad(ISD::EXTLOAD, DL, MVT::i32, Chain,
7343 SDValue Ops[] = {
7351 SmallVector<SDValue, 3> Elts;
7353 SDValue Elt = DAG.getNode(ISD::SRL, DL, MVT::i32, NewLD,
7359 SDValue Ops[] = {
7375 SDValue Ops[2];
7487 SDValue SITargetLowering::LowerSELECT(SDValue Op, SelectionDAG &DAG) const {
7487 SDValue SITargetLowering::LowerSELECT(SDValue Op, SelectionDAG &DAG) const {
7492 SDValue Cond = Op.getOperand(0);
7494 SDValue Zero = DAG.getConstant(0, DL, MVT::i32);
7495 SDValue One = DAG.getConstant(1, DL, MVT::i32);
7497 SDValue LHS = DAG.getNode(ISD::BITCAST, DL, MVT::v2i32, Op.getOperand(1));
7498 SDValue RHS = DAG.getNode(ISD::BITCAST, DL, MVT::v2i32, Op.getOperand(2));
7500 SDValue Lo0 = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, MVT::i32, LHS, Zero);
7501 SDValue Lo1 = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, MVT::i32, RHS, Zero);
7503 SDValue Lo = DAG.getSelect(DL, MVT::i32, Cond, Lo0, Lo1);
7505 SDValue Hi0 = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, MVT::i32, LHS, One);
7506 SDValue Hi1 = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, MVT::i32, RHS, One);
7508 SDValue Hi = DAG.getSelect(DL, MVT::i32, Cond, Hi0, Hi1);
7510 SDValue Res = DAG.getBuildVector(MVT::v2i32, DL, {Lo, Hi});
7516 SDValue SITargetLowering::lowerFastUnsafeFDIV(SDValue Op,
7516 SDValue SITargetLowering::lowerFastUnsafeFDIV(SDValue Op,
7519 SDValue LHS = Op.getOperand(0);
7520 SDValue RHS = Op.getOperand(1);
7552 SDValue FNegRHS = DAG.getNode(ISD::FNEG, SL, VT, RHS);
7561 SDValue Recip = DAG.getNode(AMDGPUISD::RCP, SL, VT, RHS);
7568 static SDValue getFPBinOp(SelectionDAG &DAG, unsigned Opcode, const SDLoc &SL,
7569 EVT VT, SDValue A, SDValue B, SDValue GlueChain) {
7569 EVT VT, SDValue A, SDValue B, SDValue GlueChain) {
7569 EVT VT, SDValue A, SDValue B, SDValue GlueChain) {
7588 static SDValue getFPTernOp(SelectionDAG &DAG, unsigned Opcode, const SDLoc &SL,
7589 EVT VT, SDValue A, SDValue B, SDValue C,
7589 EVT VT, SDValue A, SDValue B, SDValue C,
7589 EVT VT, SDValue A, SDValue B, SDValue C,
7590 SDValue GlueChain) {
7609 SDValue SITargetLowering::LowerFDIV16(SDValue Op, SelectionDAG &DAG) const {
7609 SDValue SITargetLowering::LowerFDIV16(SDValue Op, SelectionDAG &DAG) const {
7610 if (SDValue FastLowered = lowerFastUnsafeFDIV(Op, DAG))
7614 SDValue Src0 = Op.getOperand(0);
7615 SDValue Src1 = Op.getOperand(1);
7617 SDValue CvtSrc0 = DAG.getNode(ISD::FP_EXTEND, SL, MVT::f32, Src0);
7618 SDValue CvtSrc1 = DAG.getNode(ISD::FP_EXTEND, SL, MVT::f32, Src1);
7620 SDValue RcpSrc1 = DAG.getNode(AMDGPUISD::RCP, SL, MVT::f32, CvtSrc1);
7621 SDValue Quot = DAG.getNode(ISD::FMUL, SL, MVT::f32, CvtSrc0, RcpSrc1);
7623 SDValue FPRoundFlag = DAG.getTargetConstant(0, SL, MVT::i32);
7624 SDValue BestQuot = DAG.getNode(ISD::FP_ROUND, SL, MVT::f16, Quot, FPRoundFlag);
7630 SDValue SITargetLowering::lowerFDIV_FAST(SDValue Op, SelectionDAG &DAG) const {
7630 SDValue SITargetLowering::lowerFDIV_FAST(SDValue Op, SelectionDAG &DAG) const {
7632 SDValue LHS = Op.getOperand(1);
7633 SDValue RHS = Op.getOperand(2);
7635 SDValue r1 = DAG.getNode(ISD::FABS, SL, MVT::f32, RHS);
7638 const SDValue K0 = DAG.getConstantFP(K0Val, SL, MVT::f32);
7641 const SDValue K1 = DAG.getConstantFP(K1Val, SL, MVT::f32);
7643 const SDValue One = DAG.getConstantFP(1.0, SL, MVT::f32);
7648 SDValue r2 = DAG.getSetCC(SL, SetCCVT, r1, K0, ISD::SETOGT);
7650 SDValue r3 = DAG.getNode(ISD::SELECT, SL, MVT::f32, r2, K1, One);
7656 SDValue r0 = DAG.getNode(AMDGPUISD::RCP, SL, MVT::f32, r1);
7658 SDValue Mul = DAG.getNode(ISD::FMUL, SL, MVT::f32, LHS, r0);
7665 static const SDValue getSPDenormModeValue(int SPDenormMode, SelectionDAG &DAG,
7676 SDValue SITargetLowering::LowerFDIV32(SDValue Op, SelectionDAG &DAG) const {
7676 SDValue SITargetLowering::LowerFDIV32(SDValue Op, SelectionDAG &DAG) const {
7677 if (SDValue FastLowered = lowerFastUnsafeFDIV(Op, DAG))
7681 SDValue LHS = Op.getOperand(0);
7682 SDValue RHS = Op.getOperand(1);
7684 const SDValue One = DAG.getConstantFP(1.0, SL, MVT::f32);
7688 SDValue DenominatorScaled = DAG.getNode(AMDGPUISD::DIV_SCALE, SL, ScaleVT,
7690 SDValue NumeratorScaled = DAG.getNode(AMDGPUISD::DIV_SCALE, SL, ScaleVT,
7694 SDValue ApproxRcp = DAG.getNode(AMDGPUISD::RCP, SL, MVT::f32,
7696 SDValue NegDivScale0 = DAG.getNode(ISD::FNEG, SL, MVT::f32,
7702 const SDValue BitField = DAG.getTargetConstant(Denorm32Reg, SL, MVT::i16);
7707 SDValue EnableDenorm;
7709 const SDValue EnableDenormValue =
7715 const SDValue EnableDenormValue = DAG.getConstant(FP_DENORM_FLUSH_NONE,
7722 SDValue Ops[3] = {
7731 SDValue Fma0 = getFPTernOp(DAG, ISD::FMA, SL, MVT::f32, NegDivScale0,
7734 SDValue Fma1 = getFPTernOp(DAG, ISD::FMA, SL, MVT::f32, Fma0, ApproxRcp,
7737 SDValue Mul = getFPBinOp(DAG, ISD::FMUL, SL, MVT::f32, NumeratorScaled,
7740 SDValue Fma2 = getFPTernOp(DAG, ISD::FMA, SL, MVT::f32, NegDivScale0, Mul,
7743 SDValue Fma3 = getFPTernOp(DAG, ISD::FMA, SL, MVT::f32, Fma2, Fma1, Mul, Fma2);
7745 SDValue Fma4 = getFPTernOp(DAG, ISD::FMA, SL, MVT::f32, NegDivScale0, Fma3,
7750 SDValue DisableDenorm;
7752 const SDValue DisableDenormValue =
7759 const SDValue DisableDenormValue =
7767 SDValue OutputChain = DAG.getNode(ISD::TokenFactor, SL, MVT::Other,
7772 SDValue Scale = NumeratorScaled.getValue(1);
7773 SDValue Fmas = DAG.getNode(AMDGPUISD::DIV_FMAS, SL, MVT::f32,
7779 SDValue SITargetLowering::LowerFDIV64(SDValue Op, SelectionDAG &DAG) const {
7779 SDValue SITargetLowering::LowerFDIV64(SDValue Op, SelectionDAG &DAG) const {
7784 SDValue X = Op.getOperand(0);
7785 SDValue Y = Op.getOperand(1);
7787 const SDValue One = DAG.getConstantFP(1.0, SL, MVT::f64);
7791 SDValue DivScale0 = DAG.getNode(AMDGPUISD::DIV_SCALE, SL, ScaleVT, Y, Y, X);
7793 SDValue NegDivScale0 = DAG.getNode(ISD::FNEG, SL, MVT::f64, DivScale0);
7795 SDValue Rcp = DAG.getNode(AMDGPUISD::RCP, SL, MVT::f64, DivScale0);
7797 SDValue Fma0 = DAG.getNode(ISD::FMA, SL, MVT::f64, NegDivScale0, Rcp, One);
7799 SDValue Fma1 = DAG.getNode(ISD::FMA, SL, MVT::f64, Rcp, Fma0, Rcp);
7801 SDValue Fma2 = DAG.getNode(ISD::FMA, SL, MVT::f64, NegDivScale0, Fma1, One);
7803 SDValue DivScale1 = DAG.getNode(AMDGPUISD::DIV_SCALE, SL, ScaleVT, X, Y, X);
7805 SDValue Fma3 = DAG.getNode(ISD::FMA, SL, MVT::f64, Fma1, Fma2, Fma1);
7806 SDValue Mul = DAG.getNode(ISD::FMUL, SL, MVT::f64, DivScale1, Fma3);
7808 SDValue Fma4 = DAG.getNode(ISD::FMA, SL, MVT::f64,
7811 SDValue Scale;
7817 const SDValue Hi = DAG.getConstant(1, SL, MVT::i32);
7820 SDValue NumBC = DAG.getNode(ISD::BITCAST, SL, MVT::v2i32, X);
7821 SDValue DenBC = DAG.getNode(ISD::BITCAST, SL, MVT::v2i32, Y);
7822 SDValue Scale0BC = DAG.getNode(ISD::BITCAST, SL, MVT::v2i32, DivScale0);
7823 SDValue Scale1BC = DAG.getNode(ISD::BITCAST, SL, MVT::v2i32, DivScale1);
7825 SDValue NumHi = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, SL, MVT::i32, NumBC, Hi);
7826 SDValue DenHi = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, SL, MVT::i32, DenBC, Hi);
7828 SDValue Scale0Hi
7830 SDValue Scale1Hi
7833 SDValue CmpDen = DAG.getSetCC(SL, MVT::i1, DenHi, Scale0Hi, ISD::SETEQ);
7834 SDValue CmpNum = DAG.getSetCC(SL, MVT::i1, NumHi, Scale1Hi, ISD::SETEQ);
7840 SDValue Fmas = DAG.getNode(AMDGPUISD::DIV_FMAS, SL, MVT::f64,
7846 SDValue SITargetLowering::LowerFDIV(SDValue Op, SelectionDAG &DAG) const {
7846 SDValue SITargetLowering::LowerFDIV(SDValue Op, SelectionDAG &DAG) const {
7861 SDValue SITargetLowering::LowerSTORE(SDValue Op, SelectionDAG &DAG) const {
7861 SDValue SITargetLowering::LowerSTORE(SDValue Op, SelectionDAG &DAG) const {
7945 SDValue SITargetLowering::LowerTrig(SDValue Op, SelectionDAG &DAG) const {
7945 SDValue SITargetLowering::LowerTrig(SDValue Op, SelectionDAG &DAG) const {
7948 SDValue Arg = Op.getOperand(0);
7949 SDValue TrigVal;
7953 SDValue OneOver2Pi = DAG.getConstantFP(0.5 / M_PI, DL, VT);
7956 SDValue MulVal = DAG.getNode(ISD::FMUL, DL, VT, Arg, OneOver2Pi);
7972 SDValue SITargetLowering::LowerATOMIC_CMP_SWAP(SDValue Op, SelectionDAG &DAG) const {
7972 SDValue SITargetLowering::LowerATOMIC_CMP_SWAP(SDValue Op, SelectionDAG &DAG) const {
7984 SDValue ChainIn = Op.getOperand(0);
7985 SDValue Addr = Op.getOperand(1);
7986 SDValue Old = Op.getOperand(2);
7987 SDValue New = Op.getOperand(3);
7992 SDValue NewOld = DAG.getBuildVector(VecType, DL, {New, Old});
7993 SDValue Ops[] = { ChainIn, Addr, NewOld };
8003 SDValue SITargetLowering::performUCharToFloatCombine(SDNode *N,
8013 SDValue Src = N->getOperand(0);
8022 SDValue Cvt = DAG.getNode(AMDGPUISD::CVT_F32_UBYTE0, DL, VT, Src);
8045 SDValue SITargetLowering::performSHLPtrCombine(SDNode *N,
8049 SDValue N0 = N->getOperand(0);
8050 SDValue N1 = N->getOperand(1);
8081 SDValue ShlX = DAG.getNode(ISD::SHL, SL, VT, N0.getOperand(0), N1);
8082 SDValue COffset = DAG.getConstant(Offset, SL, MVT::i32);
8092 SDValue SITargetLowering::performMemSDNodeCombine(MemSDNode *N,
8094 SDValue Ptr = N->getBasePtr();
8100 SDValue NewPtr = performSHLPtrCombine(Ptr.getNode(), N->getAddressSpace(),
8103 SmallVector<SDValue, 8> NewOps(N->op_begin(), N->op_end());
8124 SDValue SITargetLowering::splitBinaryBitConstantOp(
8127 unsigned Opc, SDValue LHS,
8148 static bool isBoolSGPR(SDValue V) {
8185 static uint32_t getPermuteMask(SelectionDAG &DAG, SDValue V) {
8228 SDValue SITargetLowering::performAndCombine(SDNode *N,
8235 SDValue LHS = N->getOperand(0);
8236 SDValue RHS = N->getOperand(1);
8241 if (SDValue Split
8261 SDValue BFE = DAG.getNode(AMDGPUISD::BFE_U32, SL, MVT::i32,
8266 SDValue Ext = DAG.getNode(ISD::AssertZext, SL, VT, BFE,
8268 SDValue Shl = DAG.getNode(ISD::SHL, SDLoc(LHS), VT, Ext,
8296 SDValue X = LHS.getOperand(0);
8297 SDValue Y = RHS.getOperand(0);
8414 SDValue SITargetLowering::performOrCombine(SDNode *N,
8417 SDValue LHS = N->getOperand(0);
8418 SDValue RHS = N->getOperand(1);
8425 SDValue Src = LHS.getOperand(0);
8513 SDValue ExtSrc = RHS.getOperand(0);
8517 SDValue LowLHS, HiBits;
8519 SDValue LowOr = DAG.getNode(ISD::OR, SL, MVT::i32, LowLHS, ExtSrc);
8524 SDValue Vec = DAG.getNode(ISD::BUILD_VECTOR, SL, MVT::v2i32,
8532 if (SDValue Split
8540 SDValue SITargetLowering::performXorCombine(SDNode *N,
8546 SDValue LHS = N->getOperand(0);
8547 SDValue RHS = N->getOperand(1);
8551 if (SDValue Split
8616 SDValue SITargetLowering::performZeroExtendCombine(SDNode *N,
8626 SDValue Src = N->getOperand(0);
8633 SDValue BCSrc = Src.getOperand(0);
8642 SDValue SITargetLowering::performSignExtendInRegCombine(SDNode *N,
8645 SDValue Src = N->getOperand(0);
8654 SDValue Ops[] = {
8669 SDValue BufferLoadSignExt = DCI.DAG.getMemIntrinsicNode(Opc, SDLoc(N),
8679 SDValue SITargetLowering::performClassCombine(SDNode *N,
8682 SDValue Mask = N->getOperand(1);
8696 SDValue SITargetLowering::performRcpCombine(SDNode *N,
8699 SDValue N0 = N->getOperand(0);
8713 bool SITargetLowering::isCanonicalized(SelectionDAG &DAG, SDValue Op,
8813 SDValue SrcOp = Op.getOperand(i);
8834 SDValue Src = Op.getOperand(0);
8837 SDValue TruncSrc = Src.getOperand(0);
8872 SDValue SITargetLowering::getCanonicalConstantFP(
8898 static bool vectorEltWillFoldAway(SDValue Op) {
8902 SDValue SITargetLowering::performFCanonicalizeCombine(
8906 SDValue N0 = N->getOperand(0);
8930 SDValue NewElts[2];
8931 SDValue Lo = N0.getOperand(0);
8932 SDValue Hi = N0.getOperand(1);
8937 SDValue Op = N0.getOperand(I);
8978 SDValue Canon0 = DAG.getNode(ISD::FCANONICALIZE, SL, VT,
8980 SDValue Canon1 = getCanonicalConstantFP(DAG, SL, VT, CRHS->getValueAPF());
9011 SDValue SITargetLowering::performIntMed3ImmCombine(
9013 SDValue Op0, SDValue Op1, bool Signed) const {
9013 SDValue Op0, SDValue Op1, bool Signed) const {
9041 SDValue Tmp1 = DAG.getNode(ExtOp, SL, NVT, Op0->getOperand(0));
9042 SDValue Tmp2 = DAG.getNode(ExtOp, SL, NVT, Op0->getOperand(1));
9043 SDValue Tmp3 = DAG.getNode(ExtOp, SL, NVT, Op1);
9045 SDValue Med3 = DAG.getNode(Med3Opc, SL, NVT, Tmp1, Tmp2, Tmp3);
9049 static ConstantFPSDNode *getSplatConstantFP(SDValue Op) {
9061 SDValue SITargetLowering::performFPMed3ImmCombine(SelectionDAG &DAG,
9063 SDValue Op0,
9064 SDValue Op1) const {
9097 SDValue Var = Op0.getOperand(0);
9115 SDValue SITargetLowering::performMinMaxCombine(SDNode *N,
9121 SDValue Op0 = N->getOperand(0);
9122 SDValue Op1 = N->getOperand(1);
9159 if (SDValue Med3 = performIntMed3ImmCombine(DAG, SDLoc(N), Op0, Op1, true))
9164 if (SDValue Med3 = performIntMed3ImmCombine(DAG, SDLoc(N), Op0, Op1, false))
9177 if (SDValue Res = performFPMed3ImmCombine(DAG, SDLoc(N), Op0, Op1))
9184 static bool isClampZeroToOne(SDValue A, SDValue B) {
9184 static bool isClampZeroToOne(SDValue A, SDValue B) {
9197 SDValue SITargetLowering::performFMed3Combine(SDNode *N,
9206 SDValue Src0 = N->getOperand(0);
9207 SDValue Src1 = N->getOperand(1);
9208 SDValue Src2 = N->getOperand(2);
9241 SDValue SITargetLowering::performCvtPkRTZCombine(SDNode *N,
9243 SDValue Src0 = N->getOperand(0);
9244 SDValue Src1 = N->getOperand(1);
9250 SDValue SITargetLowering::performExtractVectorEltCombine(
9252 SDValue Vec = N->getOperand(0);
9262 SDValue Idx = N->getOperand(1);
9263 SDValue Elt = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, SL, EltVT,
9276 SDValue Idx = N->getOperand(1);
9295 SDValue Elt0 = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, SL, EltVT,
9297 SDValue Elt1 = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, SL, EltVT,
9318 SDValue Idx = N->getOperand(1);
9320 SDValue V;
9322 SDValue IC = DAG.getConstant(I, SL, IdxVT);
9323 SDValue Elt = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, SL, EltVT, Vec, IC);
9352 SDValue Cast = DAG.getNode(ISD::BITCAST, SL, NewVT, Vec);
9355 SDValue Elt = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, SL, MVT::i32, Cast,
9358 SDValue Srl = DAG.getNode(ISD::SRL, SL, MVT::i32, Elt,
9362 SDValue Trunc = DAG.getNode(ISD::TRUNCATE, SL, EltVT.changeTypeToInteger(), Srl);
9370 SDValue
9373 SDValue Vec = N->getOperand(0);
9374 SDValue Idx = N->getOperand(2);
9392 SDValue Ins = N->getOperand(1);
9395 SmallVector<SDValue, 16> Ops;
9397 SDValue IC = DAG.getConstant(I, SL, IdxVT);
9398 SDValue Elt = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, SL, EltVT, Vec, IC);
9399 SDValue V = DAG.getSelectCC(SL, Idx, IC, Ins, Elt, ISD::SETEQ);
9432 SDValue SITargetLowering::reassociateScalarOps(SDNode *N,
9439 SDValue Op0 = N->getOperand(0);
9440 SDValue Op1 = N->getOperand(1);
9451 SDValue Op2 = Op1.getOperand(1);
9466 SDValue Add1 = DAG.getNode(Opc, SL, VT, Op0, Op1);
9470 static SDValue getMad64_32(SelectionDAG &DAG, const SDLoc &SL,
9472 SDValue N0, SDValue N1, SDValue N2,
9472 SDValue N0, SDValue N1, SDValue N2,
9472 SDValue N0, SDValue N1, SDValue N2,
9476 SDValue Mad = DAG.getNode(MadOpc, SL, VTs, N0, N1, N2);
9480 SDValue SITargetLowering::performAddCombine(SDNode *N,
9485 SDValue LHS = N->getOperand(0);
9486 SDValue RHS = N->getOperand(1);
9495 SDValue MulLHS = LHS.getOperand(0);
9496 SDValue MulRHS = LHS.getOperand(1);
9497 SDValue AddRHS = RHS;
9518 if (SDValue V = reassociateScalarOps(N, DAG)) {
9538 auto Cond = RHS.getOperand(0);
9542 SDValue Args[] = { LHS, DAG.getConstant(0, SL, MVT::i32), Cond };
9550 SDValue Args[] = { LHS, RHS.getOperand(0), RHS.getOperand(2) };
9557 SDValue SITargetLowering::performSubCombine(SDNode *N,
9566 SDValue LHS = N->getOperand(0);
9567 SDValue RHS = N->getOperand(1);
9574 SDValue Args[] = { LHS.getOperand(0), RHS, LHS.getOperand(2) };
9580 SDValue SITargetLowering::performAddCarrySubCarryCombine(SDNode *N,
9591 SDValue LHS = N->getOperand(0);
9599 SDValue Args[] = { LHS.getOperand(0), LHS.getOperand(1), N->getOperand(2) };
9605 SDValue SITargetLowering::performFAddCombine(SDNode *N,
9614 SDValue LHS = N->getOperand(0);
9615 SDValue RHS = N->getOperand(1);
9622 SDValue A = LHS.getOperand(0);
9626 const SDValue Two = DAG.getConstantFP(2.0, SL, VT);
9634 SDValue A = RHS.getOperand(0);
9638 const SDValue Two = DAG.getConstantFP(2.0, SL, VT);
9647 SDValue SITargetLowering::performFSubCombine(SDNode *N,
9662 SDValue LHS = N->getOperand(0);
9663 SDValue RHS = N->getOperand(1);
9666 SDValue A = LHS.getOperand(0);
9670 const SDValue Two = DAG.getConstantFP(2.0, SL, VT);
9671 SDValue NegRHS = DAG.getNode(ISD::FNEG, SL, VT, RHS);
9681 SDValue A = RHS.getOperand(0);
9685 const SDValue NegTwo = DAG.getConstantFP(-2.0, SL, VT);
9694 SDValue SITargetLowering::performFMACombine(SDNode *N,
9705 SDValue Op1 = N->getOperand(0);
9706 SDValue Op2 = N->getOperand(1);
9707 SDValue FMA = N->getOperand(2);
9727 SDValue Vec1 = Op1.getOperand(0);
9728 SDValue Idx1 = Op1.getOperand(1);
9729 SDValue Vec2 = Op2.getOperand(0);
9731 SDValue FMAOp1 = FMA.getOperand(0);
9732 SDValue FMAOp2 = FMA.getOperand(1);
9733 SDValue FMAAcc = FMA.getOperand(2);
9745 SDValue Vec3 = FMAOp1.getOperand(0);
9746 SDValue Vec4 = FMAOp2.getOperand(0);
9747 SDValue Idx2 = FMAOp1.getOperand(1);
9769 SDValue SITargetLowering::performSetCCCombine(SDNode *N,
9774 SDValue LHS = N->getOperand(0);
9775 SDValue RHS = N->getOperand(1);
9865 SDValue SITargetLowering::performCvtF32UByteNCombine(SDNode *N,
9871 SDValue Src = N->getOperand(0);
9872 SDValue Srl = N->getOperand(0);
9908 SDValue SITargetLowering::performClampCombine(SDNode *N,
9933 SDValue SITargetLowering::PerformDAGCombine(SDNode *N,
9967 if (SDValue Widended = widenLoad(cast<LoadSDNode>(N), DCI))
10018 SDValue Src = N->getOperand(0);
10044 SDValue Src = N->getOperand(0);
10049 SDValue Ext = DAG.getNode(ISD::ANY_EXTEND, SL, MVT::i32, Src);
10179 SmallVector<SDValue, 12> Ops;
10220 SDValue Op = DAG.getTargetConstant(Idx, SDLoc(User), MVT::i32);
10237 static bool isFrameIndexOp(SDValue Op) {
10251 SDValue SrcVal = Node->getOperand(2);
10259 SDValue VReg = DAG.getRegister(
10263 SDValue ToVReg
10266 SDValue ToResultReg
10275 SmallVector<SDValue, 8> Ops;
10315 SDValue Src0 = Node->getOperand(0);
10316 SDValue Src1 = Node->getOperand(1);
10317 SDValue Src2 = Node->getOperand(2);
10329 SDValue UndefReg = DAG.getRegister(MRI.createVirtualRegister(RC), VT);
10331 SDValue ImpDef = DAG.getCopyToReg(DAG.getEntryNode(), SDLoc(Node),
10352 SmallVector<SDValue, 4> Ops = { Src0, Src1, Src2 };
10365 SDValue VDstIn = Node->getOperand(6);
10371 SmallVector<SDValue, 8> Ops = { SDValue(FI, 0), Node->getOperand(1),
10464 static SDValue buildSMovImm32(SelectionDAG &DAG, const SDLoc &DL,
10466 SDValue K = DAG.getTargetConstant(Val, DL, MVT::i32);
10472 SDValue Ptr) const {
10478 const SDValue Ops0[] = {
10486 SDValue SubRegHi = SDValue(DAG.getMachineNode(AMDGPU::REG_SEQUENCE, DL,
10490 const SDValue Ops1[] = {
10506 SDValue Ptr, uint32_t RsrcDword1,
10508 SDValue PtrLo = DAG.getTargetExtractSubreg(AMDGPU::sub0, DL, MVT::i32, Ptr);
10509 SDValue PtrHi = DAG.getTargetExtractSubreg(AMDGPU::sub1, DL, MVT::i32, Ptr);
10516 SDValue DataLo = buildSMovImm32(DAG, DL,
10518 SDValue DataHi = buildSMovImm32(DAG, DL, RsrcDword2And3 >> 32);
10520 const SDValue Ops[] = {
10727 void SITargetLowering::computeKnownBitsForFrameIndex(const SDValue Op,
10893 bool SITargetLowering::isKnownNeverNaNForTargetNode(SDValue Op,
lib/Target/AMDGPU/SIISelLowering.h 40 SDValue lowerKernArgParameterPtr(SelectionDAG &DAG, const SDLoc &SL,
41 SDValue Chain, uint64_t Offset) const;
42 SDValue getImplicitArgPtr(SelectionDAG &DAG, const SDLoc &SL) const;
43 SDValue lowerKernargMemParameter(SelectionDAG &DAG, EVT VT, EVT MemVT,
44 const SDLoc &SL, SDValue Chain,
48 SDValue lowerStackParameter(SelectionDAG &DAG, CCValAssign &VA,
49 const SDLoc &SL, SDValue Chain,
51 SDValue getPreloadedValue(SelectionDAG &DAG,
56 SDValue LowerGlobalAddress(AMDGPUMachineFunction *MFI, SDValue Op,
56 SDValue LowerGlobalAddress(AMDGPUMachineFunction *MFI, SDValue Op,
58 SDValue lowerImplicitZextParam(SelectionDAG &DAG, SDValue Op,
58 SDValue lowerImplicitZextParam(SelectionDAG &DAG, SDValue Op,
60 SDValue lowerImage(SDValue Op, const AMDGPU::ImageDimIntrinsicInfo *Intr,
60 SDValue lowerImage(SDValue Op, const AMDGPU::ImageDimIntrinsicInfo *Intr,
62 SDValue lowerSBuffer(EVT VT, SDLoc DL, SDValue Rsrc, SDValue Offset,
62 SDValue lowerSBuffer(EVT VT, SDLoc DL, SDValue Rsrc, SDValue Offset,
62 SDValue lowerSBuffer(EVT VT, SDLoc DL, SDValue Rsrc, SDValue Offset,
63 SDValue GLC, SDValue DLC, SelectionDAG &DAG) const;
63 SDValue GLC, SDValue DLC, SelectionDAG &DAG) const;
65 SDValue LowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG) const;
65 SDValue LowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG) const;
66 SDValue LowerINTRINSIC_W_CHAIN(SDValue Op, SelectionDAG &DAG) const;
66 SDValue LowerINTRINSIC_W_CHAIN(SDValue Op, SelectionDAG &DAG) const;
67 SDValue LowerINTRINSIC_VOID(SDValue Op, SelectionDAG &DAG) const;
67 SDValue LowerINTRINSIC_VOID(SDValue Op, SelectionDAG &DAG) const;
75 std::pair<SDValue, SDValue> splitBufferOffsets(SDValue Offset,
75 std::pair<SDValue, SDValue> splitBufferOffsets(SDValue Offset,
75 std::pair<SDValue, SDValue> splitBufferOffsets(SDValue Offset,
78 SDValue widenLoad(LoadSDNode *Ld, DAGCombinerInfo &DCI) const;
79 SDValue LowerLOAD(SDValue Op, SelectionDAG &DAG) const;
79 SDValue LowerLOAD(SDValue Op, SelectionDAG &DAG) const;
80 SDValue LowerSELECT(SDValue Op, SelectionDAG &DAG) const;
80 SDValue LowerSELECT(SDValue Op, SelectionDAG &DAG) const;
81 SDValue lowerFastUnsafeFDIV(SDValue Op, SelectionDAG &DAG) const;
81 SDValue lowerFastUnsafeFDIV(SDValue Op, SelectionDAG &DAG) const;
82 SDValue lowerFDIV_FAST(SDValue Op, SelectionDAG &DAG) const;
82 SDValue lowerFDIV_FAST(SDValue Op, SelectionDAG &DAG) const;
83 SDValue LowerFDIV16(SDValue Op, SelectionDAG &DAG) const;
83 SDValue LowerFDIV16(SDValue Op, SelectionDAG &DAG) const;
84 SDValue LowerFDIV32(SDValue Op, SelectionDAG &DAG) const;
84 SDValue LowerFDIV32(SDValue Op, SelectionDAG &DAG) const;
85 SDValue LowerFDIV64(SDValue Op, SelectionDAG &DAG) const;
85 SDValue LowerFDIV64(SDValue Op, SelectionDAG &DAG) const;
86 SDValue LowerFDIV(SDValue Op, SelectionDAG &DAG) const;
86 SDValue LowerFDIV(SDValue Op, SelectionDAG &DAG) const;
87 SDValue LowerINT_TO_FP(SDValue Op, SelectionDAG &DAG, bool Signed) const;
87 SDValue LowerINT_TO_FP(SDValue Op, SelectionDAG &DAG, bool Signed) const;
88 SDValue LowerSTORE(SDValue Op, SelectionDAG &DAG) const;
88 SDValue LowerSTORE(SDValue Op, SelectionDAG &DAG) const;
89 SDValue LowerTrig(SDValue Op, SelectionDAG &DAG) const;
89 SDValue LowerTrig(SDValue Op, SelectionDAG &DAG) const;
90 SDValue LowerATOMIC_CMP_SWAP(SDValue Op, SelectionDAG &DAG) const;
90 SDValue LowerATOMIC_CMP_SWAP(SDValue Op, SelectionDAG &DAG) const;
91 SDValue LowerBRCOND(SDValue Op, SelectionDAG &DAG) const;
91 SDValue LowerBRCOND(SDValue Op, SelectionDAG &DAG) const;
92 SDValue LowerRETURNADDR(SDValue Op, SelectionDAG &DAG) const;
92 SDValue LowerRETURNADDR(SDValue Op, SelectionDAG &DAG) const;
93 SDValue adjustLoadValueType(unsigned Opcode, MemSDNode *M,
94 SelectionDAG &DAG, ArrayRef<SDValue> Ops,
97 SDValue lowerIntrinsicLoad(MemSDNode *M, bool IsFormat, SelectionDAG &DAG,
98 ArrayRef<SDValue> Ops) const;
102 SDValue getMemIntrinsicNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
103 ArrayRef<SDValue> Ops, EVT MemVT,
106 SDValue handleD16VData(SDValue VData, SelectionDAG &DAG) const;
106 SDValue handleD16VData(SDValue VData, SelectionDAG &DAG) const;
110 SDValue getFPExtOrFPTrunc(SelectionDAG &DAG,
111 SDValue Op,
115 SDValue convertArgType(
116 SelectionDAG &DAG, EVT VT, EVT MemVT, const SDLoc &SL, SDValue Val,
120 SDValue lowerFP_ROUND(SDValue Op, SelectionDAG &DAG) const;
120 SDValue lowerFP_ROUND(SDValue Op, SelectionDAG &DAG) const;
121 SDValue lowerFMINNUM_FMAXNUM(SDValue Op, SelectionDAG &DAG) const;
121 SDValue lowerFMINNUM_FMAXNUM(SDValue Op, SelectionDAG &DAG) const;
123 SDValue getSegmentAperture(unsigned AS, const SDLoc &DL,
126 SDValue lowerADDRSPACECAST(SDValue Op, SelectionDAG &DAG) const;
126 SDValue lowerADDRSPACECAST(SDValue Op, SelectionDAG &DAG) const;
127 SDValue lowerINSERT_SUBVECTOR(SDValue Op, SelectionDAG &DAG) const;
127 SDValue lowerINSERT_SUBVECTOR(SDValue Op, SelectionDAG &DAG) const;
128 SDValue lowerINSERT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const;
128 SDValue lowerINSERT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const;
129 SDValue lowerEXTRACT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const;
129 SDValue lowerEXTRACT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const;
130 SDValue lowerVECTOR_SHUFFLE(SDValue Op, SelectionDAG &DAG) const;
130 SDValue lowerVECTOR_SHUFFLE(SDValue Op, SelectionDAG &DAG) const;
131 SDValue lowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG) const;
131 SDValue lowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG) const;
132 SDValue lowerTRAP(SDValue Op, SelectionDAG &DAG) const;
132 SDValue lowerTRAP(SDValue Op, SelectionDAG &DAG) const;
133 SDValue lowerDEBUGTRAP(SDValue Op, SelectionDAG &DAG) const;
133 SDValue lowerDEBUGTRAP(SDValue Op, SelectionDAG &DAG) const;
137 SDValue performUCharToFloatCombine(SDNode *N,
139 SDValue performSHLPtrCombine(SDNode *N,
144 SDValue performMemSDNodeCombine(MemSDNode *N, DAGCombinerInfo &DCI) const;
146 SDValue splitBinaryBitConstantOp(DAGCombinerInfo &DCI, const SDLoc &SL,
147 unsigned Opc, SDValue LHS,
150 SDValue performAndCombine(SDNode *N, DAGCombinerInfo &DCI) const;
151 SDValue performOrCombine(SDNode *N, DAGCombinerInfo &DCI) const;
152 SDValue performXorCombine(SDNode *N, DAGCombinerInfo &DCI) const;
153 SDValue performZeroExtendCombine(SDNode *N, DAGCombinerInfo &DCI) const;
154 SDValue performSignExtendInRegCombine(SDNode *N, DAGCombinerInfo &DCI) const;
155 SDValue performClassCombine(SDNode *N, DAGCombinerInfo &DCI) const;
156 SDValue getCanonicalConstantFP(SelectionDAG &DAG, const SDLoc &SL, EVT VT,
158 SDValue performFCanonicalizeCombine(SDNode *N, DAGCombinerInfo &DCI) const;
160 SDValue performFPMed3ImmCombine(SelectionDAG &DAG, const SDLoc &SL,
161 SDValue Op0, SDValue Op1) const;
161 SDValue Op0, SDValue Op1) const;
162 SDValue performIntMed3ImmCombine(SelectionDAG &DAG, const SDLoc &SL,
163 SDValue Op0, SDValue Op1, bool Signed) const;
163 SDValue Op0, SDValue Op1, bool Signed) const;
164 SDValue performMinMaxCombine(SDNode *N, DAGCombinerInfo &DCI) const;
165 SDValue performFMed3Combine(SDNode *N, DAGCombinerInfo &DCI) const;
166 SDValue performCvtPkRTZCombine(SDNode *N, DAGCombinerInfo &DCI) const;
167 SDValue performExtractVectorEltCombine(SDNode *N, DAGCombinerInfo &DCI) const;
168 SDValue performInsertVectorEltCombine(SDNode *N, DAGCombinerInfo &DCI) const;
170 SDValue reassociateScalarOps(SDNode *N, SelectionDAG &DAG) const;
173 SDValue performAddCombine(SDNode *N, DAGCombinerInfo &DCI) const;
174 SDValue performAddCarrySubCarryCombine(SDNode *N, DAGCombinerInfo &DCI) const;
175 SDValue performSubCombine(SDNode *N, DAGCombinerInfo &DCI) const;
176 SDValue performFAddCombine(SDNode *N, DAGCombinerInfo &DCI) const;
177 SDValue performFSubCombine(SDNode *N, DAGCombinerInfo &DCI) const;
178 SDValue performFMACombine(SDNode *N, DAGCombinerInfo &DCI) const;
179 SDValue performSetCCCombine(SDNode *N, DAGCombinerInfo &DCI) const;
180 SDValue performCvtF32UByteNCombine(SDNode *N, DAGCombinerInfo &DCI) const;
181 SDValue performClampCombine(SDNode *N, DAGCombinerInfo &DCI) const;
182 SDValue performRcpCombine(SDNode *N, DAGCombinerInfo &DCI) const;
208 unsigned setBufferOffsets(SDValue CombinedOffset, SelectionDAG &DAG,
209 SDValue *Offsets, unsigned Align = 4) const;
212 SDValue handleByteShortBufferLoads(SelectionDAG &DAG, EVT LoadVT, SDLoc DL,
213 ArrayRef<SDValue> Ops, MemSDNode *M) const;
216 SDValue handleByteShortBufferStores(SelectionDAG &DAG, EVT VDataType,
217 SDLoc DL, SDValue Ops[],
290 SDValue LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv,
290 SDValue LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv,
294 SmallVectorImpl<SDValue> &InVals) const override;
301 SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool IsVarArg,
301 SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool IsVarArg,
303 const SmallVectorImpl<SDValue> &OutVals, const SDLoc &DL,
310 SmallVectorImpl<std::pair<unsigned, SDValue>> &RegsToPass,
311 SmallVectorImpl<SDValue> &MemOpChains,
312 SDValue Chain) const;
314 SDValue LowerCallResult(SDValue Chain, SDValue InFlag,
314 SDValue LowerCallResult(SDValue Chain, SDValue InFlag,
314 SDValue LowerCallResult(SDValue Chain, SDValue InFlag,
318 SmallVectorImpl<SDValue> &InVals, bool isThisReturn,
319 SDValue ThisVal) const;
324 SDValue Callee, CallingConv::ID CalleeCC, bool isVarArg,
326 const SmallVectorImpl<SDValue> &OutVals,
329 SDValue LowerCall(CallLoweringInfo &CLI,
330 SmallVectorImpl<SDValue> &InVals) const override;
352 SDValue splitUnaryVectorOp(SDValue Op, SelectionDAG &DAG) const;
352 SDValue splitUnaryVectorOp(SDValue Op, SelectionDAG &DAG) const;
353 SDValue splitBinaryVectorOp(SDValue Op, SelectionDAG &DAG) const;
353 SDValue splitBinaryVectorOp(SDValue Op, SelectionDAG &DAG) const;
354 SDValue splitTernaryVectorOp(SDValue Op, SelectionDAG &DAG) const;
354 SDValue splitTernaryVectorOp(SDValue Op, SelectionDAG &DAG) const;
355 SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
355 SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
357 void ReplaceNodeResults(SDNode *N, SmallVectorImpl<SDValue> &Results,
360 SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const override;
368 SDValue Ptr) const;
369 MachineSDNode *buildRSRC(SelectionDAG &DAG, const SDLoc &DL, SDValue Ptr,
375 SDValue copyToM0(SelectionDAG &DAG, SDValue Chain, const SDLoc &DL,
375 SDValue copyToM0(SelectionDAG &DAG, SDValue Chain, const SDLoc &DL,
376 SDValue V) const;
380 void computeKnownBitsForFrameIndex(const SDValue Op,
389 bool isCanonicalized(SelectionDAG &DAG, SDValue Op,
393 bool isKnownNeverNaNForTargetNode(SDValue Op,
lib/Target/AMDGPU/SIInstrInfo.cpp 232 SDValue Off0 = Load0->getOperand(OffIdx0);
233 SDValue Off1 = Load1->getOperand(OffIdx1);
lib/Target/ARC/ARCISelDAGToDAG.cpp 47 bool SelectFrameADDR_ri(SDValue Addr, SDValue &Base, SDValue &Offset);
47 bool SelectFrameADDR_ri(SDValue Addr, SDValue &Base, SDValue &Offset);
47 bool SelectFrameADDR_ri(SDValue Addr, SDValue &Base, SDValue &Offset);
48 bool SelectAddrModeS9(SDValue Addr, SDValue &Base, SDValue &Offset);
48 bool SelectAddrModeS9(SDValue Addr, SDValue &Base, SDValue &Offset);
48 bool SelectAddrModeS9(SDValue Addr, SDValue &Base, SDValue &Offset);
49 bool SelectAddrModeImm(SDValue Addr, SDValue &Base, SDValue &Offset);
49 bool SelectAddrModeImm(SDValue Addr, SDValue &Base, SDValue &Offset);
49 bool SelectAddrModeImm(SDValue Addr, SDValue &Base, SDValue &Offset);
50 bool SelectAddrModeFar(SDValue Addr, SDValue &Base, SDValue &Offset);
50 bool SelectAddrModeFar(SDValue Addr, SDValue &Base, SDValue &Offset);
50 bool SelectAddrModeFar(SDValue Addr, SDValue &Base, SDValue &Offset);
51 bool SelectCMOVPred(SDValue N, SDValue &Pred, SDValue &Reg) {
51 bool SelectCMOVPred(SDValue N, SDValue &Pred, SDValue &Reg) {
51 bool SelectCMOVPred(SDValue N, SDValue &Pred, SDValue &Reg) {
75 bool ARCDAGToDAGISel::SelectAddrModeImm(SDValue Addr, SDValue &Base,
75 bool ARCDAGToDAGISel::SelectAddrModeImm(SDValue Addr, SDValue &Base,
76 SDValue &Offset) {
85 bool ARCDAGToDAGISel::SelectAddrModeS9(SDValue Addr, SDValue &Base,
85 bool ARCDAGToDAGISel::SelectAddrModeS9(SDValue Addr, SDValue &Base,
86 SDValue &Offset) {
127 bool ARCDAGToDAGISel::SelectAddrModeFar(SDValue Addr, SDValue &Base,
127 bool ARCDAGToDAGISel::SelectAddrModeFar(SDValue Addr, SDValue &Base,
128 SDValue &Offset) {
146 bool ARCDAGToDAGISel::SelectFrameADDR_ri(SDValue Addr, SDValue &Base,
146 bool ARCDAGToDAGISel::SelectFrameADDR_ri(SDValue Addr, SDValue &Base,
147 SDValue &Offset) {
lib/Target/ARC/ARCISelLowering.cpp 36 static SDValue lowerCallResult(SDValue Chain, SDValue InFlag,
36 static SDValue lowerCallResult(SDValue Chain, SDValue InFlag,
36 static SDValue lowerCallResult(SDValue Chain, SDValue InFlag,
39 SmallVectorImpl<SDValue> &InVals);
163 SDValue ARCTargetLowering::LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const {
163 SDValue ARCTargetLowering::LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const {
164 SDValue LHS = Op.getOperand(0);
165 SDValue RHS = Op.getOperand(1);
167 SDValue TVal = Op.getOperand(2);
168 SDValue FVal = Op.getOperand(3);
172 SDValue Cmp = DAG.getNode(ARCISD::CMP, dl, MVT::Glue, LHS, RHS);
177 SDValue ARCTargetLowering::LowerSIGN_EXTEND_INREG(SDValue Op,
177 SDValue ARCTargetLowering::LowerSIGN_EXTEND_INREG(SDValue Op,
179 SDValue Op0 = Op.getOperand(0);
190 SDValue LS = DAG.getNode(ISD::SHL, dl, MVT::i32, Op0,
192 SDValue SR = DAG.getNode(ISD::SRA, dl, MVT::i32, LS,
197 SDValue ARCTargetLowering::LowerBR_CC(SDValue Op, SelectionDAG &DAG) const {
197 SDValue ARCTargetLowering::LowerBR_CC(SDValue Op, SelectionDAG &DAG) const {
198 SDValue Chain = Op.getOperand(0);
200 SDValue LHS = Op.getOperand(2);
201 SDValue RHS = Op.getOperand(3);
202 SDValue Dest = Op.getOperand(4);
210 SDValue ARCTargetLowering::LowerJumpTable(SDValue Op, SelectionDAG &DAG) const {
210 SDValue ARCTargetLowering::LowerJumpTable(SDValue Op, SelectionDAG &DAG) const {
212 SDValue GA = DAG.getTargetJumpTable(N->getIndex(), MVT::i32);
223 SDValue ARCTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
224 SmallVectorImpl<SDValue> &InVals) const {
228 SmallVectorImpl<SDValue> &OutVals = CLI.OutVals;
230 SDValue Chain = CLI.Chain;
231 SDValue Callee = CLI.Callee;
257 SmallVector<std::pair<unsigned, SDValue>, 4> RegsToPass;
258 SmallVector<SDValue, 12> MemOpChains;
260 SDValue StackPtr;
264 SDValue Arg = OutVals[i];
293 SDValue SOffset = DAG.getIntPtrConstant(VA.getLocMemOffset(), dl);
294 SDValue PtrOff = DAG.getNode(
297 SDValue Store =
313 SDValue Glue;
335 SmallVector<SDValue, 8> Ops;
370 static SDValue lowerCallResult(SDValue Chain, SDValue Glue,
370 static SDValue lowerCallResult(SDValue Chain, SDValue Glue,
370 static SDValue lowerCallResult(SDValue Chain, SDValue Glue,
373 SmallVectorImpl<SDValue> &InVals) {
379 SDValue RetValue;
396 SmallVector<SDValue, 4> MemOpChains;
400 SDValue StackPtr = DAG.getRegister(ARC::SP, MVT::i32);
401 SDValue SpLoc = DAG.getNode(ISD::ADD, dl, MVT::i32, StackPtr,
403 SDValue Load =
424 SDValue SDV;
431 SDValue ARCTargetLowering::LowerFormalArguments(
432 SDValue Chain, CallingConv::ID CallConv, bool IsVarArg,
434 SelectionDAG &DAG, SmallVectorImpl<SDValue> &InVals) const {
446 SDValue ARCTargetLowering::LowerCallArguments(
447 SDValue Chain, CallingConv::ID CallConv, bool IsVarArg,
449 SmallVectorImpl<SDValue> &InVals) const {
474 SmallVector<SDValue, 4> CFRegNode;
476 SmallVector<SDValue, 4> MemOps;
481 SDValue ArgIn;
510 SDValue FIN = DAG.getFrameIndex(FI, MVT::i32);
535 SDValue FIN = DAG.getFrameIndex(VarFI, MVT::i32);
540 SDValue Val = DAG.getCopyFromReg(Chain, dl, VReg, MVT::i32);
542 SDValue VAObj = DAG.getNode(ISD::ADD, dl, MVT::i32, FIN,
545 SDValue Store =
569 SDValue FIN = DAG.getFrameIndex(FI, MVT::i32);
604 SDValue
605 ARCTargetLowering::LowerReturn(SDValue Chain, CallingConv::ID CallConv,
608 const SmallVectorImpl<SDValue> &OutVals,
627 SDValue Flag;
628 SmallVector<SDValue, 4> RetOps(1, Chain);
629 SmallVector<SDValue, 4> MemOpChains;
647 SDValue FIN = DAG.getFrameIndex(FI, MVT::i32);
686 SDValue ARCTargetLowering::PerformDAGCombine(SDNode *N,
709 SDValue ARCTargetLowering::LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const {
709 SDValue ARCTargetLowering::LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const {
723 SDValue ARCTargetLowering::LowerGlobalAddress(SDValue Op,
723 SDValue ARCTargetLowering::LowerGlobalAddress(SDValue Op,
729 SDValue GA = DAG.getTargetGlobalAddress(GV, dl, MVT::i32, Offset);
733 static SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG) {
733 static SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG) {
741 SDValue FR = DAG.getFrameIndex(FuncInfo->getVarArgsFrameIndex(), PtrVT);
747 SDValue ARCTargetLowering::LowerOperation(SDValue Op, SelectionDAG &DAG) const {
747 SDValue ARCTargetLowering::LowerOperation(SDValue Op, SelectionDAG &DAG) const {
lib/Target/ARC/ARCISelLowering.h 66 SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
66 SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
81 SDValue LowerCallArguments(SDValue Chain, CallingConv::ID CallConv,
81 SDValue LowerCallArguments(SDValue Chain, CallingConv::ID CallConv,
85 SmallVectorImpl<SDValue> &InVals) const;
87 SDValue LowerJumpTable(SDValue Op, SelectionDAG &DAG) const;
87 SDValue LowerJumpTable(SDValue Op, SelectionDAG &DAG) const;
88 SDValue LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const;
88 SDValue LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const;
89 SDValue LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const;
89 SDValue LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const;
90 SDValue LowerBR_CC(SDValue Op, SelectionDAG &DAG) const;
90 SDValue LowerBR_CC(SDValue Op, SelectionDAG &DAG) const;
91 SDValue LowerSIGN_EXTEND_INREG(SDValue Op, SelectionDAG &DAG) const;
91 SDValue LowerSIGN_EXTEND_INREG(SDValue Op, SelectionDAG &DAG) const;
92 SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const;
92 SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const;
93 SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const override;
95 SDValue LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv,
95 SDValue LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv,
99 SmallVectorImpl<SDValue> &InVals) const override;
101 SDValue LowerCall(TargetLowering::CallLoweringInfo &CLI,
102 SmallVectorImpl<SDValue> &InVals) const override;
104 SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
104 SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
106 const SmallVectorImpl<SDValue> &OutVals, const SDLoc &dl,
lib/Target/ARM/ARMISelDAGToDAG.cpp 74 inline SDValue getI32Imm(unsigned Imm, const SDLoc &dl) {
81 bool isShifterOpProfitable(const SDValue &Shift,
83 bool SelectRegShifterOperand(SDValue N, SDValue &A,
83 bool SelectRegShifterOperand(SDValue N, SDValue &A,
84 SDValue &B, SDValue &C,
84 SDValue &B, SDValue &C,
86 bool SelectImmShifterOperand(SDValue N, SDValue &A,
86 bool SelectImmShifterOperand(SDValue N, SDValue &A,
87 SDValue &B, bool CheckProfitability = true);
88 bool SelectShiftRegShifterOperand(SDValue N, SDValue &A,
88 bool SelectShiftRegShifterOperand(SDValue N, SDValue &A,
89 SDValue &B, SDValue &C) {
89 SDValue &B, SDValue &C) {
93 bool SelectShiftImmShifterOperand(SDValue N, SDValue &A,
93 bool SelectShiftImmShifterOperand(SDValue N, SDValue &A,
94 SDValue &B) {
99 bool SelectAddLikeOr(SDNode *Parent, SDValue N, SDValue &Out);
99 bool SelectAddLikeOr(SDNode *Parent, SDValue N, SDValue &Out);
101 bool SelectAddrModeImm12(SDValue N, SDValue &Base, SDValue &OffImm);
101 bool SelectAddrModeImm12(SDValue N, SDValue &Base, SDValue &OffImm);
101 bool SelectAddrModeImm12(SDValue N, SDValue &Base, SDValue &OffImm);
102 bool SelectLdStSOReg(SDValue N, SDValue &Base, SDValue &Offset, SDValue &Opc);
102 bool SelectLdStSOReg(SDValue N, SDValue &Base, SDValue &Offset, SDValue &Opc);
102 bool SelectLdStSOReg(SDValue N, SDValue &Base, SDValue &Offset, SDValue &Opc);
102 bool SelectLdStSOReg(SDValue N, SDValue &Base, SDValue &Offset, SDValue &Opc);
104 bool SelectCMOVPred(SDValue N, SDValue &Pred, SDValue &Reg) {
104 bool SelectCMOVPred(SDValue N, SDValue &Pred, SDValue &Reg) {
104 bool SelectCMOVPred(SDValue N, SDValue &Pred, SDValue &Reg) {
111 bool SelectAddrMode2OffsetReg(SDNode *Op, SDValue N,
112 SDValue &Offset, SDValue &Opc);
112 SDValue &Offset, SDValue &Opc);
113 bool SelectAddrMode2OffsetImm(SDNode *Op, SDValue N,
114 SDValue &Offset, SDValue &Opc);
114 SDValue &Offset, SDValue &Opc);
115 bool SelectAddrMode2OffsetImmPre(SDNode *Op, SDValue N,
116 SDValue &Offset, SDValue &Opc);
116 SDValue &Offset, SDValue &Opc);
117 bool SelectAddrOffsetNone(SDValue N, SDValue &Base);
117 bool SelectAddrOffsetNone(SDValue N, SDValue &Base);
118 bool SelectAddrMode3(SDValue N, SDValue &Base,
118 bool SelectAddrMode3(SDValue N, SDValue &Base,
119 SDValue &Offset, SDValue &Opc);
119 SDValue &Offset, SDValue &Opc);
120 bool SelectAddrMode3Offset(SDNode *Op, SDValue N,
121 SDValue &Offset, SDValue &Opc);
121 SDValue &Offset, SDValue &Opc);
122 bool IsAddressingMode5(SDValue N, SDValue &Base, SDValue &Offset, bool FP16);
122 bool IsAddressingMode5(SDValue N, SDValue &Base, SDValue &Offset, bool FP16);
122 bool IsAddressingMode5(SDValue N, SDValue &Base, SDValue &Offset, bool FP16);
123 bool SelectAddrMode5(SDValue N, SDValue &Base, SDValue &Offset);
123 bool SelectAddrMode5(SDValue N, SDValue &Base, SDValue &Offset);
123 bool SelectAddrMode5(SDValue N, SDValue &Base, SDValue &Offset);
124 bool SelectAddrMode5FP16(SDValue N, SDValue &Base, SDValue &Offset);
124 bool SelectAddrMode5FP16(SDValue N, SDValue &Base, SDValue &Offset);
124 bool SelectAddrMode5FP16(SDValue N, SDValue &Base, SDValue &Offset);
125 bool SelectAddrMode6(SDNode *Parent, SDValue N, SDValue &Addr,SDValue &Align);
125 bool SelectAddrMode6(SDNode *Parent, SDValue N, SDValue &Addr,SDValue &Align);
125 bool SelectAddrMode6(SDNode *Parent, SDValue N, SDValue &Addr,SDValue &Align);
126 bool SelectAddrMode6Offset(SDNode *Op, SDValue N, SDValue &Offset);
126 bool SelectAddrMode6Offset(SDNode *Op, SDValue N, SDValue &Offset);
128 bool SelectAddrModePC(SDValue N, SDValue &Offset, SDValue &Label);
128 bool SelectAddrModePC(SDValue N, SDValue &Offset, SDValue &Label);
128 bool SelectAddrModePC(SDValue N, SDValue &Offset, SDValue &Label);
131 bool SelectThumbAddrModeRR(SDValue N, SDValue &Base, SDValue &Offset);
131 bool SelectThumbAddrModeRR(SDValue N, SDValue &Base, SDValue &Offset);
131 bool SelectThumbAddrModeRR(SDValue N, SDValue &Base, SDValue &Offset);
132 bool SelectThumbAddrModeRRSext(SDValue N, SDValue &Base, SDValue &Offset);
132 bool SelectThumbAddrModeRRSext(SDValue N, SDValue &Base, SDValue &Offset);
132 bool SelectThumbAddrModeRRSext(SDValue N, SDValue &Base, SDValue &Offset);
133 bool SelectThumbAddrModeImm5S(SDValue N, unsigned Scale, SDValue &Base,
133 bool SelectThumbAddrModeImm5S(SDValue N, unsigned Scale, SDValue &Base,
134 SDValue &OffImm);
135 bool SelectThumbAddrModeImm5S1(SDValue N, SDValue &Base,
135 bool SelectThumbAddrModeImm5S1(SDValue N, SDValue &Base,
136 SDValue &OffImm);
137 bool SelectThumbAddrModeImm5S2(SDValue N, SDValue &Base,
137 bool SelectThumbAddrModeImm5S2(SDValue N, SDValue &Base,
138 SDValue &OffImm);
139 bool SelectThumbAddrModeImm5S4(SDValue N, SDValue &Base,
139 bool SelectThumbAddrModeImm5S4(SDValue N, SDValue &Base,
140 SDValue &OffImm);
141 bool SelectThumbAddrModeSP(SDValue N, SDValue &Base, SDValue &OffImm);
141 bool SelectThumbAddrModeSP(SDValue N, SDValue &Base, SDValue &OffImm);
141 bool SelectThumbAddrModeSP(SDValue N, SDValue &Base, SDValue &OffImm);
143 bool SelectTAddrModeImm7(SDValue N, SDValue &Base, SDValue &OffImm);
143 bool SelectTAddrModeImm7(SDValue N, SDValue &Base, SDValue &OffImm);
143 bool SelectTAddrModeImm7(SDValue N, SDValue &Base, SDValue &OffImm);
146 bool SelectT2AddrModeImm12(SDValue N, SDValue &Base, SDValue &OffImm);
146 bool SelectT2AddrModeImm12(SDValue N, SDValue &Base, SDValue &OffImm);
146 bool SelectT2AddrModeImm12(SDValue N, SDValue &Base, SDValue &OffImm);
147 bool SelectT2AddrModeImm8(SDValue N, SDValue &Base,
147 bool SelectT2AddrModeImm8(SDValue N, SDValue &Base,
148 SDValue &OffImm);
149 bool SelectT2AddrModeImm8Offset(SDNode *Op, SDValue N,
150 SDValue &OffImm);
152 bool SelectT2AddrModeImm7Offset(SDNode *Op, SDValue N, SDValue &OffImm);
152 bool SelectT2AddrModeImm7Offset(SDNode *Op, SDValue N, SDValue &OffImm);
153 bool SelectT2AddrModeImm7Offset(SDNode *Op, SDValue N, SDValue &OffImm,
153 bool SelectT2AddrModeImm7Offset(SDNode *Op, SDValue N, SDValue &OffImm,
156 bool SelectT2AddrModeImm7(SDValue N, SDValue &Base, SDValue &OffImm);
156 bool SelectT2AddrModeImm7(SDValue N, SDValue &Base, SDValue &OffImm);
156 bool SelectT2AddrModeImm7(SDValue N, SDValue &Base, SDValue &OffImm);
157 bool SelectT2AddrModeSoReg(SDValue N, SDValue &Base,
157 bool SelectT2AddrModeSoReg(SDValue N, SDValue &Base,
158 SDValue &OffReg, SDValue &ShImm);
158 SDValue &OffReg, SDValue &ShImm);
159 bool SelectT2AddrModeExclusive(SDValue N, SDValue &Base, SDValue &OffImm);
159 bool SelectT2AddrModeExclusive(SDValue N, SDValue &Base, SDValue &OffImm);
159 bool SelectT2AddrModeExclusive(SDValue N, SDValue &Base, SDValue &OffImm);
215 SDValue PredicateMask);
218 SDValue PredicateMask, SDValue Inactive);
218 SDValue PredicateMask, SDValue Inactive);
268 bool SelectInlineAsmMemoryOperand(const SDValue &Op, unsigned ConstraintID,
269 std::vector<SDValue> &OutOps) override;
272 SDNode *createGPRPairNode(EVT VT, SDValue V0, SDValue V1);
272 SDNode *createGPRPairNode(EVT VT, SDValue V0, SDValue V1);
273 SDNode *createSRegPairNode(EVT VT, SDValue V0, SDValue V1);
273 SDNode *createSRegPairNode(EVT VT, SDValue V0, SDValue V1);
274 SDNode *createDRegPairNode(EVT VT, SDValue V0, SDValue V1);
274 SDNode *createDRegPairNode(EVT VT, SDValue V0, SDValue V1);
275 SDNode *createQRegPairNode(EVT VT, SDValue V0, SDValue V1);
275 SDNode *createQRegPairNode(EVT VT, SDValue V0, SDValue V1);
278 SDNode *createQuadSRegsNode(EVT VT, SDValue V0, SDValue V1, SDValue V2, SDValue V3);
278 SDNode *createQuadSRegsNode(EVT VT, SDValue V0, SDValue V1, SDValue V2, SDValue V3);
278 SDNode *createQuadSRegsNode(EVT VT, SDValue V0, SDValue V1, SDValue V2, SDValue V3);
278 SDNode *createQuadSRegsNode(EVT VT, SDValue V0, SDValue V1, SDValue V2, SDValue V3);
279 SDNode *createQuadDRegsNode(EVT VT, SDValue V0, SDValue V1, SDValue V2, SDValue V3);
279 SDNode *createQuadDRegsNode(EVT VT, SDValue V0, SDValue V1, SDValue V2, SDValue V3);
279 SDNode *createQuadDRegsNode(EVT VT, SDValue V0, SDValue V1, SDValue V2, SDValue V3);
279 SDNode *createQuadDRegsNode(EVT VT, SDValue V0, SDValue V1, SDValue V2, SDValue V3);
280 SDNode *createQuadQRegsNode(EVT VT, SDValue V0, SDValue V1, SDValue V2, SDValue V3);
280 SDNode *createQuadQRegsNode(EVT VT, SDValue V0, SDValue V1, SDValue V2, SDValue V3);
280 SDNode *createQuadQRegsNode(EVT VT, SDValue V0, SDValue V1, SDValue V2, SDValue V3);
280 SDNode *createQuadQRegsNode(EVT VT, SDValue V0, SDValue V1, SDValue V2, SDValue V3);
283 SDValue GetVLDSTAlign(SDValue Align, const SDLoc &dl, unsigned NumVecs,
283 SDValue GetVLDSTAlign(SDValue Align, const SDLoc &dl, unsigned NumVecs,
291 bool canExtractShiftFromMul(const SDValue &N, unsigned MaxShift,
292 unsigned &PowerOfTwo, SDValue &NewMulConst) const;
296 void replaceDAGValue(const SDValue &N, SDValue M);
296 void replaceDAGValue(const SDValue &N, SDValue M);
312 static bool isInt32Immediate(SDValue N, unsigned &Imm) {
328 static bool isScaledConstantInRange(SDValue Node, int Scale,
367 SDValue N0 = N->getOperand(0);
368 SDValue N1 = N->getOperand(1);
395 SDValue Srl = N1.getOperand(0);
403 SDValue CPTmp0;
404 SDValue CPTmp1;
405 SDValue CPTmp2;
474 bool ARMDAGToDAGISel::isShifterOpProfitable(const SDValue &Shift,
486 bool ARMDAGToDAGISel::canExtractShiftFromMul(const SDValue &N,
489 SDValue &NewMulConst) const {
520 void ARMDAGToDAGISel::replaceDAGValue(const SDValue &N, SDValue M) {
520 void ARMDAGToDAGISel::replaceDAGValue(const SDValue &N, SDValue M) {
525 bool ARMDAGToDAGISel::SelectImmShifterOperand(SDValue N,
526 SDValue &BaseReg,
527 SDValue &Opc,
536 SDValue NewMulConst;
564 bool ARMDAGToDAGISel::SelectRegShifterOperand(SDValue N,
565 SDValue &BaseReg,
566 SDValue &ShReg,
567 SDValue &Opc,
593 bool ARMDAGToDAGISel::SelectAddLikeOr(SDNode *Parent, SDValue N, SDValue &Out) {
593 bool ARMDAGToDAGISel::SelectAddLikeOr(SDNode *Parent, SDValue N, SDValue &Out) {
600 bool ARMDAGToDAGISel::SelectAddrModeImm12(SDValue N,
601 SDValue &Base,
602 SDValue &OffImm) {
653 bool ARMDAGToDAGISel::SelectLdStSOReg(SDValue N, SDValue &Base, SDValue &Offset,
653 bool ARMDAGToDAGISel::SelectLdStSOReg(SDValue N, SDValue &Base, SDValue &Offset,
653 bool ARMDAGToDAGISel::SelectLdStSOReg(SDValue N, SDValue &Base, SDValue &Offset,
654 SDValue &Opc) {
746 SDValue NewMulConst;
761 bool ARMDAGToDAGISel::SelectAddrMode2OffsetReg(SDNode *Op, SDValue N,
762 SDValue &Offset, SDValue &Opc) {
762 SDValue &Offset, SDValue &Opc) {
797 bool ARMDAGToDAGISel::SelectAddrMode2OffsetImmPre(SDNode *Op, SDValue N,
798 SDValue &Offset, SDValue &Opc) {
798 SDValue &Offset, SDValue &Opc) {
817 bool ARMDAGToDAGISel::SelectAddrMode2OffsetImm(SDNode *Op, SDValue N,
818 SDValue &Offset, SDValue &Opc) {
818 SDValue &Offset, SDValue &Opc) {
837 bool ARMDAGToDAGISel::SelectAddrOffsetNone(SDValue N, SDValue &Base) {
837 bool ARMDAGToDAGISel::SelectAddrOffsetNone(SDValue N, SDValue &Base) {
842 bool ARMDAGToDAGISel::SelectAddrMode3(SDValue N,
843 SDValue &Base, SDValue &Offset,
843 SDValue &Base, SDValue &Offset,
844 SDValue &Opc) {
896 bool ARMDAGToDAGISel::SelectAddrMode3Offset(SDNode *Op, SDValue N,
897 SDValue &Offset, SDValue &Opc) {
897 SDValue &Offset, SDValue &Opc) {
918 bool ARMDAGToDAGISel::IsAddressingMode5(SDValue N, SDValue &Base, SDValue &Offset,
918 bool ARMDAGToDAGISel::IsAddressingMode5(SDValue N, SDValue &Base, SDValue &Offset,
918 bool ARMDAGToDAGISel::IsAddressingMode5(SDValue N, SDValue &Base, SDValue &Offset,
977 bool ARMDAGToDAGISel::SelectAddrMode5(SDValue N,
978 SDValue &Base, SDValue &Offset) {
978 SDValue &Base, SDValue &Offset) {
982 bool ARMDAGToDAGISel::SelectAddrMode5FP16(SDValue N,
983 SDValue &Base, SDValue &Offset) {
983 SDValue &Base, SDValue &Offset) {
987 bool ARMDAGToDAGISel::SelectAddrMode6(SDNode *Parent, SDValue N, SDValue &Addr,
987 bool ARMDAGToDAGISel::SelectAddrMode6(SDNode *Parent, SDValue N, SDValue &Addr,
988 SDValue &Align) {
1016 bool ARMDAGToDAGISel::SelectAddrMode6Offset(SDNode *Op, SDValue N,
1017 SDValue &Offset) {
1030 bool ARMDAGToDAGISel::SelectAddrModePC(SDValue N,
1031 SDValue &Offset, SDValue &Label) {
1031 SDValue &Offset, SDValue &Label) {
1034 SDValue N1 = N.getOperand(1);
1048 static bool shouldUseZeroOffsetLdSt(SDValue N) {
1062 bool ARMDAGToDAGISel::SelectThumbAddrModeRRSext(SDValue N, SDValue &Base,
1062 bool ARMDAGToDAGISel::SelectThumbAddrModeRRSext(SDValue N, SDValue &Base,
1063 SDValue &Offset) {
1078 bool ARMDAGToDAGISel::SelectThumbAddrModeRR(SDValue N, SDValue &Base,
1078 bool ARMDAGToDAGISel::SelectThumbAddrModeRR(SDValue N, SDValue &Base,
1079 SDValue &Offset) {
1086 ARMDAGToDAGISel::SelectThumbAddrModeImm5S(SDValue N, unsigned Scale,
1087 SDValue &Base, SDValue &OffImm) {
1087 SDValue &Base, SDValue &OffImm) {
1124 ARMDAGToDAGISel::SelectThumbAddrModeImm5S4(SDValue N, SDValue &Base,
1124 ARMDAGToDAGISel::SelectThumbAddrModeImm5S4(SDValue N, SDValue &Base,
1125 SDValue &OffImm) {
1130 ARMDAGToDAGISel::SelectThumbAddrModeImm5S2(SDValue N, SDValue &Base,
1130 ARMDAGToDAGISel::SelectThumbAddrModeImm5S2(SDValue N, SDValue &Base,
1131 SDValue &OffImm) {
1136 ARMDAGToDAGISel::SelectThumbAddrModeImm5S1(SDValue N, SDValue &Base,
1136 ARMDAGToDAGISel::SelectThumbAddrModeImm5S1(SDValue N, SDValue &Base,
1137 SDValue &OffImm) {
1141 bool ARMDAGToDAGISel::SelectThumbAddrModeSP(SDValue N,
1142 SDValue &Base, SDValue &OffImm) {
1142 SDValue &Base, SDValue &OffImm) {
1188 bool ARMDAGToDAGISel::SelectTAddrModeImm7(SDValue N, SDValue &Base,
1188 bool ARMDAGToDAGISel::SelectTAddrModeImm7(SDValue N, SDValue &Base,
1189 SDValue &OffImm) {
1215 bool ARMDAGToDAGISel::SelectT2AddrModeImm12(SDValue N,
1216 SDValue &Base, SDValue &OffImm) {
1216 SDValue &Base, SDValue &OffImm) {
1271 bool ARMDAGToDAGISel::SelectT2AddrModeImm8(SDValue N,
1272 SDValue &Base, SDValue &OffImm) {
1272 SDValue &Base, SDValue &OffImm) {
1298 bool ARMDAGToDAGISel::SelectT2AddrModeImm8Offset(SDNode *Op, SDValue N,
1299 SDValue &OffImm){
1316 bool ARMDAGToDAGISel::SelectT2AddrModeImm7(SDValue N, SDValue &Base,
1316 bool ARMDAGToDAGISel::SelectT2AddrModeImm7(SDValue N, SDValue &Base,
1317 SDValue &OffImm) {
1344 bool ARMDAGToDAGISel::SelectT2AddrModeImm7Offset(SDNode *Op, SDValue N,
1345 SDValue &OffImm) {
1349 bool ARMDAGToDAGISel::SelectT2AddrModeImm7Offset(SDNode *Op, SDValue N,
1350 SDValue &OffImm,
1368 bool ARMDAGToDAGISel::SelectT2AddrModeSoReg(SDValue N,
1369 SDValue &Base,
1370 SDValue &OffReg, SDValue &ShImm) {
1370 SDValue &OffReg, SDValue &ShImm) {
1414 SDValue NewMulConst;
1428 bool ARMDAGToDAGISel::SelectT2AddrModeExclusive(SDValue N, SDValue &Base,
1428 bool ARMDAGToDAGISel::SelectT2AddrModeExclusive(SDValue N, SDValue &Base,
1429 SDValue &OffImm) {
1460 static inline SDValue getAL(SelectionDAG *CurDAG, const SDLoc &dl) {
1476 SDValue Offset, AMOpc;
1523 SDValue Chain = LD->getChain();
1524 SDValue Base = LD->getBasePtr();
1525 SDValue Ops[]= { Base, AMOpc, getAL(CurDAG, SDLoc(N)),
1533 SDValue Chain = LD->getChain();
1534 SDValue Base = LD->getBasePtr();
1535 SDValue Ops[]= { Base, Offset, AMOpc, getAL(CurDAG, SDLoc(N)),
1564 SDValue Chain = LD->getChain();
1565 SDValue Base = LD->getBasePtr();
1566 SDValue Ops[]= { Base, getAL(CurDAG, SDLoc(N)),
1583 SDValue Offset;
1612 SDValue Chain = LD->getChain();
1613 SDValue Base = LD->getBasePtr();
1614 SDValue Ops[]= { Base, Offset, getAL(CurDAG, SDLoc(N)),
1635 SDValue Offset;
1673 SDValue Chain = LD->getChain();
1674 SDValue Base = LD->getBasePtr();
1675 SDValue Ops[] = {Base, Offset,
1689 SDNode *ARMDAGToDAGISel::createGPRPairNode(EVT VT, SDValue V0, SDValue V1) {
1689 SDNode *ARMDAGToDAGISel::createGPRPairNode(EVT VT, SDValue V0, SDValue V1) {
1691 SDValue RegClass =
1693 SDValue SubReg0 = CurDAG->getTargetConstant(ARM::gsub_0, dl, MVT::i32);
1694 SDValue SubReg1 = CurDAG->getTargetConstant(ARM::gsub_1, dl, MVT::i32);
1695 const SDValue Ops[] = { RegClass, V0, SubReg0, V1, SubReg1 };
1700 SDNode *ARMDAGToDAGISel::createSRegPairNode(EVT VT, SDValue V0, SDValue V1) {
1700 SDNode *ARMDAGToDAGISel::createSRegPairNode(EVT VT, SDValue V0, SDValue V1) {
1702 SDValue RegClass =
1704 SDValue SubReg0 = CurDAG->getTargetConstant(ARM::ssub_0, dl, MVT::i32);
1705 SDValue SubReg1 = CurDAG->getTargetConstant(ARM::ssub_1, dl, MVT::i32);
1706 const SDValue Ops[] = { RegClass, V0, SubReg0, V1, SubReg1 };
1711 SDNode *ARMDAGToDAGISel::createDRegPairNode(EVT VT, SDValue V0, SDValue V1) {
1711 SDNode *ARMDAGToDAGISel::createDRegPairNode(EVT VT, SDValue V0, SDValue V1) {
1713 SDValue RegClass = CurDAG->getTargetConstant(ARM::QPRRegClassID, dl,
1715 SDValue SubReg0 = CurDAG->getTargetConstant(ARM::dsub_0, dl, MVT::i32);
1716 SDValue SubReg1 = CurDAG->getTargetConstant(ARM::dsub_1, dl, MVT::i32);
1717 const SDValue Ops[] = { RegClass, V0, SubReg0, V1, SubReg1 };
1722 SDNode *ARMDAGToDAGISel::createQRegPairNode(EVT VT, SDValue V0, SDValue V1) {
1722 SDNode *ARMDAGToDAGISel::createQRegPairNode(EVT VT, SDValue V0, SDValue V1) {
1724 SDValue RegClass = CurDAG->getTargetConstant(ARM::QQPRRegClassID, dl,
1726 SDValue SubReg0 = CurDAG->getTargetConstant(ARM::qsub_0, dl, MVT::i32);
1727 SDValue SubReg1 = CurDAG->getTargetConstant(ARM::qsub_1, dl, MVT::i32);
1728 const SDValue Ops[] = { RegClass, V0, SubReg0, V1, SubReg1 };
1733 SDNode *ARMDAGToDAGISel::createQuadSRegsNode(EVT VT, SDValue V0, SDValue V1,
1733 SDNode *ARMDAGToDAGISel::createQuadSRegsNode(EVT VT, SDValue V0, SDValue V1,
1734 SDValue V2, SDValue V3) {
1734 SDValue V2, SDValue V3) {
1736 SDValue RegClass =
1738 SDValue SubReg0 = CurDAG->getTargetConstant(ARM::ssub_0, dl, MVT::i32);
1739 SDValue SubReg1 = CurDAG->getTargetConstant(ARM::ssub_1, dl, MVT::i32);
1740 SDValue SubReg2 = CurDAG->getTargetConstant(ARM::ssub_2, dl, MVT::i32);
1741 SDValue SubReg3 = CurDAG->getTargetConstant(ARM::ssub_3, dl, MVT::i32);
1742 const SDValue Ops[] = { RegClass, V0, SubReg0, V1, SubReg1,
1748 SDNode *ARMDAGToDAGISel::createQuadDRegsNode(EVT VT, SDValue V0, SDValue V1,
1748 SDNode *ARMDAGToDAGISel::createQuadDRegsNode(EVT VT, SDValue V0, SDValue V1,
1749 SDValue V2, SDValue V3) {
1749 SDValue V2, SDValue V3) {
1751 SDValue RegClass = CurDAG->getTargetConstant(ARM::QQPRRegClassID, dl,
1753 SDValue SubReg0 = CurDAG->getTargetConstant(ARM::dsub_0, dl, MVT::i32);
1754 SDValue SubReg1 = CurDAG->getTargetConstant(ARM::dsub_1, dl, MVT::i32);
1755 SDValue SubReg2 = CurDAG->getTargetConstant(ARM::dsub_2, dl, MVT::i32);
1756 SDValue SubReg3 = CurDAG->getTargetConstant(ARM::dsub_3, dl, MVT::i32);
1757 const SDValue Ops[] = { RegClass, V0, SubReg0, V1, SubReg1,
1763 SDNode *ARMDAGToDAGISel::createQuadQRegsNode(EVT VT, SDValue V0, SDValue V1,
1763 SDNode *ARMDAGToDAGISel::createQuadQRegsNode(EVT VT, SDValue V0, SDValue V1,
1764 SDValue V2, SDValue V3) {
1764 SDValue V2, SDValue V3) {
1766 SDValue RegClass = CurDAG->getTargetConstant(ARM::QQQQPRRegClassID, dl,
1768 SDValue SubReg0 = CurDAG->getTargetConstant(ARM::qsub_0, dl, MVT::i32);
1769 SDValue SubReg1 = CurDAG->getTargetConstant(ARM::qsub_1, dl, MVT::i32);
1770 SDValue SubReg2 = CurDAG->getTargetConstant(ARM::qsub_2, dl, MVT::i32);
1771 SDValue SubReg3 = CurDAG->getTargetConstant(ARM::qsub_3, dl, MVT::i32);
1772 const SDValue Ops[] = { RegClass, V0, SubReg0, V1, SubReg1,
1780 SDValue ARMDAGToDAGISel::GetVLDSTAlign(SDValue Align, const SDLoc &dl,
1780 SDValue ARMDAGToDAGISel::GetVLDSTAlign(SDValue Align, const SDLoc &dl,
1916 static bool isPerfectIncrement(SDValue Inc, EVT VecTy, unsigned NumVecs) {
1928 SDValue MemAddr, Align;
1935 SDValue Chain = N->getOperand(0);
1975 SDValue Pred = getAL(CurDAG, dl);
1976 SDValue Reg0 = CurDAG->getRegister(0, MVT::i32);
1978 SmallVector<SDValue, 7> Ops;
1987 SDValue Inc = N->getOperand(AddrOpIdx + 1);
2012 SDValue ImplDef =
2014 const SDValue OpsA[] = { MemAddr, Align, Reg0, ImplDef, Pred, Reg0, Chain };
2023 SDValue Inc = N->getOperand(AddrOpIdx + 1);
2046 SDValue SuperReg = SDValue(VLd, 0);
2067 SDValue MemAddr, Align;
2077 SDValue Chain = N->getOperand(0);
2107 SDValue Pred = getAL(CurDAG, dl);
2108 SDValue Reg0 = CurDAG->getRegister(0, MVT::i32);
2109 SmallVector<SDValue, 7> Ops;
2113 SDValue SrcReg;
2118 SDValue V0 = N->getOperand(Vec0Idx + 0);
2119 SDValue V1 = N->getOperand(Vec0Idx + 1);
2123 SDValue V2 = N->getOperand(Vec0Idx + 2);
2126 SDValue V3 = (NumVecs == 3)
2133 SDValue Q0 = N->getOperand(Vec0Idx);
2134 SDValue Q1 = N->getOperand(Vec0Idx + 1);
2143 SDValue Inc = N->getOperand(AddrOpIdx + 1);
2174 SDValue V0 = N->getOperand(Vec0Idx + 0);
2175 SDValue V1 = N->getOperand(Vec0Idx + 1);
2176 SDValue V2 = N->getOperand(Vec0Idx + 2);
2177 SDValue V3 = (NumVecs == 3)
2180 SDValue RegSeq = SDValue(createQuadQRegsNode(MVT::v8i64, V0, V1, V2, V3), 0);
2184 const SDValue OpsA[] = { MemAddr, Align, Reg0, RegSeq, Pred, Reg0, Chain };
2195 SDValue Inc = N->getOperand(AddrOpIdx + 1);
2218 SDValue MemAddr, Align;
2228 SDValue Chain = N->getOperand(0);
2277 SDValue Pred = getAL(CurDAG, dl);
2278 SDValue Reg0 = CurDAG->getRegister(0, MVT::i32);
2280 SmallVector<SDValue, 8> Ops;
2284 SDValue Inc = N->getOperand(AddrOpIdx + 1);
2290 SDValue SuperReg;
2291 SDValue V0 = N->getOperand(Vec0Idx + 0);
2292 SDValue V1 = N->getOperand(Vec0Idx + 1);
2299 SDValue V2 = N->getOperand(Vec0Idx + 2);
2300 SDValue V3 = (NumVecs == 3)
2340 SDValue PredicateMask) {
2347 SDValue PredicateMask,
2348 SDValue Inactive) {
2372 SmallVector<SDValue, 8> Ops;
2404 SmallVector<SDValue, 8> Ops;
2430 SmallVector<SDValue, 8> Ops;
2438 SDValue CarryIn = N->getOperand(FirstInputOp + 2);
2483 auto Data = SDValue(
2485 SDValue Chain = N->getOperand(0);
2487 SDValue Ops[] = {Data, N->getOperand(2), Chain};
2509 SDValue MemAddr, Align;
2514 SDValue Chain = N->getOperand(0);
2562 SDValue Pred = getAL(CurDAG, dl);
2563 SDValue Reg0 = CurDAG->getRegister(0, MVT::i32);
2567 SmallVector<SDValue, 6> Ops;
2575 SDValue Inc = N->getOperand(2);
2591 const SDValue OpsA[] = { MemAddr, Align, Pred, Reg0, Chain };
2596 const SDValue OpsB[] = { MemAddr, Align, Pred, Reg0, Chain };
2599 SDValue ImplDef =
2601 const SDValue OpsA[] = { MemAddr, Align, ImplDef, Pred, Reg0, Chain };
2605 SDValue SuperReg = SDValue(VLdA, 0);
2607 const SDValue OpsB[] = { MemAddr, Align, SuperReg, Pred, Reg0, Chain };
2619 SDValue SuperReg = SDValue(VLdDup, 0);
2665 SDValue Reg0 = CurDAG->getRegister(0, MVT::i32);
2671 SDValue Ops[] = { N->getOperand(0).getOperand(0),
2680 SDValue ShOpc =
2683 SDValue Ops[] = { N->getOperand(0).getOperand(0), ShOpc,
2690 SDValue Ops[] = { N->getOperand(0).getOperand(0),
2713 SDValue Reg0 = CurDAG->getRegister(0, MVT::i32);
2715 SDValue Ops[] = { N->getOperand(0).getOperand(0),
2735 SDValue Reg0 = CurDAG->getRegister(0, MVT::i32);
2737 SDValue Ops[] = { N->getOperand(0).getOperand(0),
2756 SDValue Reg0 = CurDAG->getRegister(0, MVT::i32);
2758 SDValue Ops[] = { N->getOperand(0).getOperand(0),
2780 SDValue XORSrc0 = N->getOperand(0);
2781 SDValue XORSrc1 = N->getOperand(1);
2790 SDValue ADDSrc0 = XORSrc0.getOperand(0);
2791 SDValue ADDSrc1 = XORSrc0.getOperand(1);
2792 SDValue SRASrc0 = XORSrc1.getOperand(0);
2793 SDValue SRASrc1 = XORSrc1.getOperand(1);
2822 SDValue Ops[] = {N->getOperand(1), N->getOperand(2), N->getOperand(3),
2855 SDValue And = N->getOperand(0);
2859 SDValue Zero = N->getOperand(1);
2863 SDValue X = And.getOperand(0);
2879 SDValue Ops[] = { Src, CurDAG->getTargetConstant(Imm, dl, MVT::i32),
2884 SDValue Ops[] = {CurDAG->getRegister(ARM::CPSR, MVT::i32), Src,
2939 SDValue Ptr = ST->getBasePtr();
2949 SDValue Ops[] = {ST->getValue(),
2988 SDValue CPIdx = CurDAG->getTargetConstantPool(
2994 SDValue Ops[] = {
3003 SDValue Ops[] = {
3033 SDValue TFI = CurDAG->getTargetFrameIndex(
3047 SDValue Ops[] = { TFI, CurDAG->getTargetConstant(0, dl, MVT::i32),
3073 SDValue V = N->getOperand(0);
3075 SDValue ShImmOp = CurDAG->getTargetConstant(ShImm, dl, MVT::i32);
3076 SDValue Reg0 = CurDAG->getRegister(0, MVT::i32);
3078 SDValue Ops[] = { V, V, ShImmOp, getAL(CurDAG, dl), Reg0, Reg0 };
3082 SDValue Ops[] = { V, V, Reg0, ShImmOp, getAL(CurDAG, dl), Reg0,
3092 SDValue V = N->getOperand(0);
3094 SDValue ShImmOp = CurDAG->getTargetConstant(ShImm, dl, MVT::i32);
3095 SDValue Reg0 = CurDAG->getRegister(0, MVT::i32);
3097 SDValue Ops[] = { V, V, ShImmOp, getAL(CurDAG, dl), Reg0, Reg0 };
3101 SDValue Ops[] = { V, V, Reg0, ShImmOp, getAL(CurDAG, dl), Reg0,
3132 SDValue NewImm =
3140 SDValue Ops[] = {CurDAG->getRegister(ARM::CPSR, MVT::i32),
3146 SDValue Ops[] = {N->getOperand(0), NewImm, getAL(CurDAG, dl),
3169 SDValue N0 = N->getOperand(0), N1 = N->getOperand(1);
3174 SDValue N2 = N0.getOperand(1);
3183 SDValue Imm16 = CurDAG->getTargetConstant((N2CVal & 0xFFFF0000U) >> 16,
3185 SDValue Ops[] = { N0.getOperand(0), Imm16,
3196 SDValue Ops[] = { N->getOperand(0), N->getOperand(1),
3205 SDValue Ops[] = { N->getOperand(0), N->getOperand(1), N->getOperand(2),
3212 SDValue Ops[] = { N->getOperand(0), N->getOperand(1), N->getOperand(2),
3224 SDValue Ops[] = { N->getOperand(0), N->getOperand(1), N->getOperand(2),
3231 SDValue Ops[] = { N->getOperand(0), N->getOperand(1), N->getOperand(2),
3255 SDValue SmulLoHi = N->getOperand(1);
3256 SDValue Subc = N->getOperand(2);
3266 SDValue Ops[] = { SmulLoHi.getOperand(0), SmulLoHi.getOperand(1),
3288 SDValue Ops[] = { N->getOperand(1),
3299 SDValue Ops[] = { N->getOperand(1),
3324 SDValue Chain = N->getOperand(0);
3325 SDValue N1 = N->getOperand(1);
3326 SDValue N2 = N->getOperand(2);
3327 SDValue N3 = N->getOperand(3);
3328 SDValue InFlag = N->getOperand(4);
3337 SDValue Int = InFlag.getOperand(0);
3342 SDValue Elements = Int.getOperand(2);
3343 SDValue Size = CurDAG->getTargetConstant(
3347 SDValue Args[] = { Elements, Size, Int.getOperand(0) };
3354 SDValue EndArgs[] = { SDValue(LoopDec, 0), N1, Chain };
3383 SDValue Tmp2 = CurDAG->getTargetConstant(CC, dl, MVT::i32);
3384 SDValue Ops[] = { N1, Tmp2, N3, Chain, InFlag };
3403 SDValue X = N->getOperand(0);
3415 SDValue Ops[] = { X, CurDAG->getTargetConstant(Addend, dl, MVT::i32),
3421 SDValue Ops[] = {CurDAG->getRegister(ARM::CPSR, MVT::i32), X,
3428 SDValue Ops2[] = {SDValue(Add, 0), CurDAG->getConstant(0, dl, MVT::i32)};
3437 SDValue InFlag = N->getOperand(4);
3444 SDValue ARMcc = N->getOperand(2);
3457 SDValue NewARMcc = CurDAG->getConstant((unsigned)CC, dl, MVT::i32);
3458 SDValue Ops[] = {N->getOperand(0), N->getOperand(1), NewARMcc,
3485 SDValue Pred = getAL(CurDAG, dl);
3486 SDValue PredReg = CurDAG->getRegister(0, MVT::i32);
3487 SDValue Ops[] = { N->getOperand(0), N->getOperand(1), Pred, PredReg };
3508 SDValue Pred = getAL(CurDAG, dl);
3509 SDValue PredReg = CurDAG->getRegister(0, MVT::i32);
3510 SDValue Ops[] = { N->getOperand(0), N->getOperand(1), Pred, PredReg };
3530 SDValue Pred = getAL(CurDAG, dl);
3531 SDValue PredReg = CurDAG->getRegister(0, MVT::i32);
3532 SDValue Ops[] = { N->getOperand(0), N->getOperand(1), Pred, PredReg };
3806 SDValue Chain = N->getOperand(0);
3814 SmallVector<SDValue, 5> Ops;
3838 SDValue Chain = N->getOperand(0);
3839 SDValue MemAddr = N->getOperand(2);
3856 SDValue Ops[] = {MemAddr, getAL(CurDAG, dl),
3864 SDValue OutChain = isThumb ? SDValue(Ld, 2) : SDValue(Ld, 1);
3866 SDValue Result;
3870 SDValue SubRegIdx =
3879 SDValue Result;
3883 SDValue SubRegIdx =
3898 SDValue Chain = N->getOperand(0);
3899 SDValue Val0 = N->getOperand(2);
3900 SDValue Val1 = N->getOperand(3);
3901 SDValue MemAddr = N->getOperand(4);
3909 SmallVector<SDValue, 7> Ops;
4298 std::vector<SDValue> &Ops) {
4420 std::vector<SDValue> Ops;
4496 SDValue Ops[] = { CurDAG->getTargetConstant(SYSmValue, DL, MVT::i32),
4535 std::vector<SDValue> Ops;
4551 SDValue WriteValue[] = { N->getOperand(2), N->getOperand(3) };
4607 SDValue Ops[] = { CurDAG->getTargetConstant(SYSmValue, DL, MVT::i32),
4631 std::vector<SDValue> AsmNodeOperands;
4645 SDValue Glue = N->getGluedNode() ? N->getOperand(NumOps-1)
4651 SDValue op = N->getOperand(i);
4669 SDValue op = N->getOperand(++i);
4691 SDValue op = N->getOperand(++i);
4707 SDValue V0 = N->getOperand(i+1);
4708 SDValue V1 = N->getOperand(i+2);
4711 SDValue PairedReg;
4721 SDValue Chain = SDValue(N,0);
4724 SDValue RegCopy = CurDAG->getCopyFromReg(Chain, dl, GPVR, MVT::Untyped,
4728 SDValue Sub0 = CurDAG->getTargetExtractSubreg(ARM::gsub_0, dl, MVT::i32,
4730 SDValue Sub1 = CurDAG->getTargetExtractSubreg(ARM::gsub_1, dl, MVT::i32,
4732 SDValue T0 = CurDAG->getCopyToReg(Sub0, dl, Reg0, Sub0,
4734 SDValue T1 = CurDAG->getCopyToReg(Sub1, dl, Reg1, Sub1, T0.getValue(1));
4737 std::vector<SDValue> Ops(GU->op_begin(), GU->op_end()-1);
4744 SDValue Chain = AsmNodeOperands[InlineAsm::Op_InputChain];
4747 SDValue T0 = CurDAG->getCopyFromReg(Chain, dl, Reg0, MVT::i32,
4749 SDValue T1 = CurDAG->getCopyFromReg(Chain, dl, Reg1, MVT::i32,
4751 SDValue Pair = SDValue(createGPRPairNode(MVT::Untyped, T0, T1), 0);
4787 SDValue New = CurDAG->getNode(N->getOpcode(), SDLoc(N),
4796 SelectInlineAsmMemoryOperand(const SDValue &Op, unsigned ConstraintID,
4797 std::vector<SDValue> &OutOps) {
lib/Target/ARM/ARMISelLowering.cpp 1762 static bool isSRL16(const SDValue &Op) {
1770 static bool isSRA16(const SDValue &Op) {
1778 static bool isSHL16(const SDValue &Op) {
1790 static bool isS16(const SDValue &Op, SelectionDAG &DAG) {
1925 SDValue ARMTargetLowering::LowerCallResult(
1926 SDValue Chain, SDValue InFlag, CallingConv::ID CallConv, bool isVarArg,
1926 SDValue Chain, SDValue InFlag, CallingConv::ID CallConv, bool isVarArg,
1928 SelectionDAG &DAG, SmallVectorImpl<SDValue> &InVals, bool isThisReturn,
1929 SDValue ThisVal) const {
1949 SDValue Val;
1952 SDValue Lo = DAG.getCopyFromReg(Chain, dl, VA.getLocReg(), MVT::i32,
1957 SDValue Hi = DAG.getCopyFromReg(Chain, dl, VA.getLocReg(), MVT::i32,
1966 SDValue Vec = DAG.getNode(ISD::UNDEF, dl, MVT::v2f64);
2006 SDValue ARMTargetLowering::LowerMemOpCallTo(SDValue Chain, SDValue StackPtr,
2006 SDValue ARMTargetLowering::LowerMemOpCallTo(SDValue Chain, SDValue StackPtr,
2006 SDValue ARMTargetLowering::LowerMemOpCallTo(SDValue Chain, SDValue StackPtr,
2007 SDValue Arg, const SDLoc &dl,
2012 SDValue PtrOff = DAG.getIntPtrConstant(LocMemOffset, dl);
2021 SDValue Chain, SDValue &Arg,
2021 SDValue Chain, SDValue &Arg,
2024 SDValue &StackPtr,
2025 SmallVectorImpl<SDValue> &MemOpChains,
2027 SDValue fmrrd = DAG.getNode(ARMISD::VMOVRRD, dl,
2049 SDValue
2051 SmallVectorImpl<SDValue> &InVals) const {
2055 SmallVectorImpl<SDValue> &OutVals = CLI.OutVals;
2057 SDValue Chain = CLI.Chain;
2058 SDValue Callee = CLI.Callee;
2122 SDValue StackPtr =
2126 SmallVector<SDValue, 8> MemOpChains;
2134 SDValue Arg = OutVals[realArgIdx];
2159 SDValue Op0 = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, MVT::f64, Arg,
2161 SDValue Op1 = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, MVT::f64, Arg,
2212 SDValue Const = DAG.getConstant(4*i, dl, MVT::i32);
2213 SDValue AddArg = DAG.getNode(ISD::ADD, dl, PtrVT, Arg, Const);
2214 SDValue Load = DAG.getLoad(PtrVT, dl, Chain, AddArg,
2231 SDValue StkPtrOff = DAG.getIntPtrConstant(LocMemOffset, dl);
2232 SDValue Dst = DAG.getNode(ISD::ADD, dl, PtrVT, StackPtr, StkPtrOff);
2233 SDValue SrcOffset = DAG.getIntPtrConstant(4*offset, dl);
2234 SDValue Src = DAG.getNode(ISD::ADD, dl, PtrVT, Arg, SrcOffset);
2235 SDValue SizeNode = DAG.getConstant(Flags.getByValSize() - 4*offset, dl,
2237 SDValue AlignNode = DAG.getConstant(Flags.getByValAlign(), dl,
2241 SDValue Ops[] = { Chain, Dst, Src, SizeNode, AlignNode};
2258 SDValue InFlag;
2296 SDValue CPAddr = DAG.getTargetConstantPool(CPV, PtrVt, 4);
2310 SDValue CPAddr = DAG.getTargetConstantPool(CPV, PtrVt, 4);
2360 SDValue CPAddr = DAG.getTargetConstantPool(CPV, PtrVt, 4);
2365 SDValue PICLabel = DAG.getConstant(ARMPCLabelIndex, dl, MVT::i32);
2391 std::vector<SDValue> Ops;
2428 SDValue Ret = DAG.getNode(ARMISD::TC_RETURN, dl, NodeTys, Ops);
2508 bool MatchingStackOffset(SDValue Arg, unsigned Offset, ISD::ArgFlagsTy Flags,
2534 SDValue Ptr = Ld->getBasePtr();
2552 SDValue Callee, CallingConv::ID CalleeCC, bool isVarArg,
2555 const SmallVectorImpl<SDValue> &OutVals,
2641 SDValue Arg = OutVals[realArgIdx];
2686 static SDValue LowerInterruptReturn(SmallVectorImpl<SDValue> &RetOps,
2686 static SDValue LowerInterruptReturn(SmallVectorImpl<SDValue> &RetOps,
2719 SDValue
2720 ARMTargetLowering::LowerReturn(SDValue Chain, CallingConv::ID CallConv,
2723 const SmallVectorImpl<SDValue> &OutVals,
2735 SDValue Flag;
2736 SmallVector<SDValue, 4> RetOps;
2751 SDValue Arg = OutVals[realRVLocIdx];
2766 SDValue ZE = Arg.getOperand(0);
2768 SDValue BC = ZE.getOperand(0);
2789 SDValue Half = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, MVT::f64, Arg,
2791 SDValue HalfGPRs = DAG.getNode(ARMISD::VMOVRRD, dl,
2813 SDValue fmrrd = DAG.getNode(ARMISD::VMOVRRD, dl,
2868 bool ARMTargetLowering::isUsedByReturnOnly(SDNode *N, SDValue &Chain) const {
2874 SDValue TCChain = Chain;
2897 SDValue UseChain = UI->getOperand(0);
2957 static SDValue LowerWRITE_REGISTER(SDValue Op, SelectionDAG &DAG) {
2957 static SDValue LowerWRITE_REGISTER(SDValue Op, SelectionDAG &DAG) {
2959 SDValue WriteValue = Op->getOperand(2);
2965 SDValue Lo = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i32, WriteValue,
2967 SDValue Hi = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i32, WriteValue,
2969 SDValue Ops[] = { Op->getOperand(0), Op->getOperand(1), Lo, Hi };
2979 SDValue ARMTargetLowering::LowerConstantPool(SDValue Op,
2979 SDValue ARMTargetLowering::LowerConstantPool(SDValue Op,
2985 SDValue Res;
3003 SDValue GA = DAG.getTargetGlobalAddress(dyn_cast<GlobalValue>(GV),
3021 SDValue ARMTargetLowering::LowerBlockAddress(SDValue Op,
3021 SDValue ARMTargetLowering::LowerBlockAddress(SDValue Op,
3029 SDValue CPAddr;
3042 SDValue Result = DAG.getLoad(
3047 SDValue PICLabel = DAG.getConstant(ARMPCLabelIndex, DL, MVT::i32);
3075 SDValue
3076 ARMTargetLowering::LowerGlobalTLSAddressDarwin(SDValue Op,
3084 SDValue DescAddr = LowerGlobalAddressDarwin(Op, DAG);
3088 SDValue Chain = DAG.getEntryNode();
3089 SDValue FuncTLVGet = DAG.getLoad(
3120 SDValue
3121 ARMTargetLowering::LowerGlobalTLSAddressWindows(SDValue Op,
3125 SDValue Chain = DAG.getEntryNode();
3130 SDValue Ops[] = {Chain,
3137 SDValue CurrentTEB = DAG.getNode(ISD::INTRINSIC_W_CHAIN, DL,
3140 SDValue TEB = CurrentTEB.getValue(0);
3145 SDValue TLSArray =
3153 SDValue TLSIndex =
3158 SDValue Slot = DAG.getNode(ISD::SHL, DL, PtrVT, TLSIndex,
3160 SDValue TLS = DAG.getLoad(PtrVT, DL, Chain,
3167 SDValue Offset = DAG.getLoad(
3176 SDValue
3188 SDValue Argument = DAG.getTargetConstantPool(CPV, PtrVT, 4);
3193 SDValue Chain = Argument.getValue(1);
3195 SDValue PICLabel = DAG.getConstant(ARMPCLabelIndex, dl, MVT::i32);
3211 std::pair<SDValue, SDValue> CallResult = LowerCallTo(CLI);
3211 std::pair<SDValue, SDValue> CallResult = LowerCallTo(CLI);
3217 SDValue
3223 SDValue Offset;
3224 SDValue Chain = DAG.getEntryNode();
3227 SDValue ThreadPointer = DAG.getNode(ARMISD::THREAD_POINTER, dl, PtrVT);
3246 SDValue PICLabel = DAG.getConstant(ARMPCLabelIndex, dl, MVT::i32);
3269 SDValue
3270 ARMTargetLowering::LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const {
3317 static SDValue promoteToConstantPool(const ARMTargetLowering *TLI,
3403 SDValue CPAddr =
3423 SDValue ARMTargetLowering::LowerGlobalAddress(SDValue Op,
3423 SDValue ARMTargetLowering::LowerGlobalAddress(SDValue Op,
3436 SDValue ARMTargetLowering::LowerGlobalAddressELF(SDValue Op,
3436 SDValue ARMTargetLowering::LowerGlobalAddressELF(SDValue Op,
3446 if (SDValue V = promoteToConstantPool(this, GV, DAG, PtrVT, dl))
3451 SDValue G = DAG.getTargetGlobalAddress(GV, dl, PtrVT, 0,
3453 SDValue Result = DAG.getNode(ARMISD::WrapperPIC, dl, PtrVT, G);
3461 SDValue G = DAG.getTargetGlobalAddress(GV, dl, PtrVT);
3462 SDValue Result = DAG.getNode(ARMISD::WrapperPIC, dl, PtrVT, G);
3466 SDValue RelAddr;
3469 SDValue G = DAG.getTargetGlobalAddress(GV, dl, PtrVT, 0, ARMII::MO_SBREL);
3474 SDValue CPAddr = DAG.getTargetConstantPool(CPV, PtrVT, 4);
3480 SDValue SB = DAG.getCopyFromReg(DAG.getEntryNode(), dl, ARM::R9, PtrVT);
3481 SDValue Result = DAG.getNode(ISD::ADD, dl, PtrVT, SB, RelAddr);
3494 SDValue CPAddr = DAG.getTargetConstantPool(GV, PtrVT, 4);
3502 SDValue ARMTargetLowering::LowerGlobalAddressDarwin(SDValue Op,
3502 SDValue ARMTargetLowering::LowerGlobalAddressDarwin(SDValue Op,
3518 SDValue G = DAG.getTargetGlobalAddress(GV, dl, PtrVT, 0, ARMII::MO_NONLAZY);
3519 SDValue Result = DAG.getNode(Wrapper, dl, PtrVT, G);
3527 SDValue ARMTargetLowering::LowerGlobalAddressWindows(SDValue Op,
3527 SDValue ARMTargetLowering::LowerGlobalAddressWindows(SDValue Op,
3543 SDValue Result;
3559 SDValue
3560 ARMTargetLowering::LowerEH_SJLJ_SETJMP(SDValue Op, SelectionDAG &DAG) const {
3562 SDValue Val = DAG.getConstant(0, dl, MVT::i32);
3568 SDValue
3569 ARMTargetLowering::LowerEH_SJLJ_LONGJMP(SDValue Op, SelectionDAG &DAG) const {
3575 SDValue ARMTargetLowering::LowerEH_SJLJ_SETUP_DISPATCH(SDValue Op,
3575 SDValue ARMTargetLowering::LowerEH_SJLJ_SETUP_DISPATCH(SDValue Op,
3582 SDValue ARMTargetLowering::LowerINTRINSIC_VOID(
3583 SDValue Op, SelectionDAG &DAG, const ARMSubtarget *Subtarget) const {
3595 SDValue Chain = Op.getOperand(0);
3603 SDValue ReturnAddress =
3606 SDValue Callee =
3608 SDValue RegisterMask = DAG.getRegisterMask(Mask);
3624 SDValue
3625 ARMTargetLowering::LowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG,
3636 const SDValue &Operand = Op.getOperand(1);
3638 SDValue SRA =
3640 SDValue XOR = DAG.getNode(ISD::XOR, dl, VTy, SRA, Operand);
3641 SDValue SHL =
3643 SDValue OR =
3645 SDValue Result = DAG.getNode(ISD::CTLZ, dl, VTy, OR);
3651 const SDValue &Operand = Op.getOperand(1);
3654 SDValue Hi = DAG.getNode(ISD::EXTRACT_ELEMENT, dl, VTy, Operand,
3656 SDValue Lo = DAG.getNode(ISD::EXTRACT_ELEMENT, dl, VTy, Operand,
3658 SDValue Constant0 = DAG.getConstant(0, dl, VTy);
3659 SDValue Constant1 = DAG.getConstant(1, dl, VTy);
3660 SDValue Constant31 = DAG.getConstant(31, dl, VTy);
3661 SDValue SRAHi = DAG.getNode(ISD::SRA, dl, VTy, Hi, Constant31);
3662 SDValue XORHi = DAG.getNode(ISD::XOR, dl, VTy, SRAHi, Hi);
3663 SDValue SHLHi = DAG.getNode(ISD::SHL, dl, VTy, XORHi, Constant1);
3664 SDValue ORHi = DAG.getNode(ISD::OR, dl, VTy, SHLHi, Constant1);
3665 SDValue CLSHi = DAG.getNode(ISD::CTLZ, dl, VTy, ORHi);
3666 SDValue CheckLo =
3668 SDValue HiIsZero =
3670 SDValue AdjustedLo =
3672 SDValue CLZAdjustedLo = DAG.getNode(ISD::CTLZ, dl, VTy, AdjustedLo);
3673 SDValue Result =
3683 SDValue CPAddr;
3691 SDValue Result = DAG.getLoad(
3696 SDValue PICLabel = DAG.getConstant(ARMPCLabelIndex, dl, MVT::i32);
3754 static SDValue LowerATOMIC_FENCE(SDValue Op, SelectionDAG &DAG,
3754 static SDValue LowerATOMIC_FENCE(SDValue Op, SelectionDAG &DAG,
3791 static SDValue LowerPREFETCH(SDValue Op, SelectionDAG &DAG,
3791 static SDValue LowerPREFETCH(SDValue Op, SelectionDAG &DAG,
3818 static SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG) {
3818 static SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG) {
3826 SDValue FR = DAG.getFrameIndex(FuncInfo->getVarArgsFrameIndex(), PtrVT);
3832 SDValue ARMTargetLowering::GetF64FormalArgument(CCValAssign &VA,
3834 SDValue &Root,
3848 SDValue ArgValue = DAG.getCopyFromReg(Root, dl, Reg, MVT::i32);
3850 SDValue ArgValue2;
3856 SDValue FIN = DAG.getFrameIndex(FI, getPointerTy(DAG.getDataLayout()));
3878 const SDLoc &dl, SDValue &Chain,
3910 SDValue FIN = DAG.getFrameIndex(FrameIndex, PtrVT);
3912 SmallVector<SDValue, 4> MemOps;
3918 SDValue Val = DAG.getCopyFromReg(Chain, dl, VReg, MVT::i32);
3919 SDValue Store = DAG.getStore(Val.getValue(1), dl, Val, FIN,
3932 const SDLoc &dl, SDValue &Chain,
3951 SDValue ARMTargetLowering::LowerFormalArguments(
3952 SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
3954 SelectionDAG &DAG, SmallVectorImpl<SDValue> &InVals) const {
3966 SmallVector<SDValue, 16> ArgValues;
3967 SDValue ArgValue;
4027 SDValue ArgValue1 = GetF64FormalArgument(VA, ArgLocs[++i],
4030 SDValue ArgValue2;
4033 SDValue FIN = DAG.getFrameIndex(FI, PtrVT);
4134 SDValue FIN = DAG.getFrameIndex(FI, PtrVT);
4156 static bool isFloatingPointZero(SDValue Op) {
4162 SDValue WrapperOp = Op.getOperand(1).getOperand(0);
4171 SDValue BitcastOp = Op->getOperand(0);
4181 SDValue ARMTargetLowering::getARMCmp(SDValue LHS, SDValue RHS, ISD::CondCode CC,
4181 SDValue ARMTargetLowering::getARMCmp(SDValue LHS, SDValue RHS, ISD::CondCode CC,
4181 SDValue ARMTargetLowering::getARMCmp(SDValue LHS, SDValue RHS, ISD::CondCode CC,
4182 SDValue &ARMcc, SelectionDAG &DAG,
4259 SDValue ShiftAmt = DAG.getConstant(ShiftBits, dl, MVT::i32);
4279 SDValue Shift = DAG.getNode(ARMISD::LSLS, dl,
4283 SDValue Chain = DAG.getCopyToReg(DAG.getEntryNode(), dl, ARM::CPSR,
4322 SDValue ARMTargetLowering::getVFPCmp(SDValue LHS, SDValue RHS,
4322 SDValue ARMTargetLowering::getVFPCmp(SDValue LHS, SDValue RHS,
4322 SDValue ARMTargetLowering::getVFPCmp(SDValue LHS, SDValue RHS,
4325 SDValue Cmp;
4335 SDValue
4336 ARMTargetLowering::duplicateCmp(SDValue Cmp, SelectionDAG &DAG) const {
4358 std::pair<SDValue, SDValue>
4358 std::pair<SDValue, SDValue>
4359 ARMTargetLowering::getARMXALUOOp(SDValue Op, SelectionDAG &DAG,
4360 SDValue &ARMcc) const {
4363 SDValue Value, OverflowCmp;
4364 SDValue LHS = Op.getOperand(0);
4365 SDValue RHS = Op.getOperand(1);
4428 SDValue
4429 ARMTargetLowering::LowerSignedALUO(SDValue Op, SelectionDAG &DAG) const {
4434 SDValue Value, OverflowCmp;
4435 SDValue ARMcc;
4437 SDValue CCR = DAG.getRegister(ARM::CPSR, MVT::i32);
4440 SDValue TVal = DAG.getConstant(1, dl, MVT::i32);
4441 SDValue FVal = DAG.getConstant(0, dl, MVT::i32);
4444 SDValue Overflow = DAG.getNode(ARMISD::CMOV, dl, VT, TVal, FVal,
4451 static SDValue ConvertBooleanCarryToCarryFlag(SDValue BoolCarry,
4451 static SDValue ConvertBooleanCarryToCarryFlag(SDValue BoolCarry,
4458 SDValue Carry = DAG.getNode(ARMISD::SUBC, DL,
4464 static SDValue ConvertCarryFlagToBooleanCarry(SDValue Flags, EVT VT,
4464 static SDValue ConvertCarryFlagToBooleanCarry(SDValue Flags, EVT VT,
4475 SDValue ARMTargetLowering::LowerUnsignedALUO(SDValue Op,
4475 SDValue ARMTargetLowering::LowerUnsignedALUO(SDValue Op,
4481 SDValue LHS = Op.getOperand(0);
4482 SDValue RHS = Op.getOperand(1);
4487 SDValue Value;
4488 SDValue Overflow;
4512 static SDValue LowerSADDSUBSAT(SDValue Op, SelectionDAG &DAG,
4512 static SDValue LowerSADDSUBSAT(SDValue Op, SelectionDAG &DAG,
4534 SDValue Add =
4541 SDValue ARMTargetLowering::LowerSELECT(SDValue Op, SelectionDAG &DAG) const {
4541 SDValue ARMTargetLowering::LowerSELECT(SDValue Op, SelectionDAG &DAG) const {
4542 SDValue Cond = Op.getOperand(0);
4543 SDValue SelectTrue = Op.getOperand(1);
4544 SDValue SelectFalse = Op.getOperand(2);
4554 SDValue Value, OverflowCmp;
4555 SDValue ARMcc;
4557 SDValue CCR = DAG.getRegister(ARM::CPSR, MVT::i32);
4579 SDValue True;
4580 SDValue False;
4591 SDValue ARMcc = Cond.getOperand(2);
4592 SDValue CCR = Cond.getOperand(3);
4593 SDValue Cmp = duplicateCmp(Cond.getOperand(4), DAG);
4660 SDValue ARMTargetLowering::getCMOV(const SDLoc &dl, EVT VT, SDValue FalseVal,
4660 SDValue ARMTargetLowering::getCMOV(const SDLoc &dl, EVT VT, SDValue FalseVal,
4661 SDValue TrueVal, SDValue ARMcc, SDValue CCR,
4661 SDValue TrueVal, SDValue ARMcc, SDValue CCR,
4661 SDValue TrueVal, SDValue ARMcc, SDValue CCR,
4662 SDValue Cmp, SelectionDAG &DAG) const {
4669 SDValue TrueLow = TrueVal.getValue(0);
4670 SDValue TrueHigh = TrueVal.getValue(1);
4671 SDValue FalseLow = FalseVal.getValue(0);
4672 SDValue FalseHigh = FalseVal.getValue(1);
4674 SDValue Low = DAG.getNode(ARMISD::CMOV, dl, MVT::i32, FalseLow, TrueLow,
4676 SDValue High = DAG.getNode(ARMISD::CMOV, dl, MVT::i32, FalseHigh, TrueHigh,
4700 static bool isLowerSaturate(const SDValue LHS, const SDValue RHS,
4700 static bool isLowerSaturate(const SDValue LHS, const SDValue RHS,
4701 const SDValue TrueVal, const SDValue FalseVal,
4701 const SDValue TrueVal, const SDValue FalseVal,
4702 const ISD::CondCode CC, const SDValue K) {
4710 static bool isUpperSaturate(const SDValue LHS, const SDValue RHS,
4710 static bool isUpperSaturate(const SDValue LHS, const SDValue RHS,
4711 const SDValue TrueVal, const SDValue FalseVal,
4711 const SDValue TrueVal, const SDValue FalseVal,
4712 const ISD::CondCode CC, const SDValue K) {
4736 static bool isSaturatingConditional(const SDValue &Op, SDValue &V,
4736 static bool isSaturatingConditional(const SDValue &Op, SDValue &V,
4738 SDValue LHS1 = Op.getOperand(0);
4739 SDValue RHS1 = Op.getOperand(1);
4740 SDValue TrueVal1 = Op.getOperand(2);
4741 SDValue FalseVal1 = Op.getOperand(3);
4744 const SDValue Op2 = isa<ConstantSDNode>(TrueVal1) ? FalseVal1 : TrueVal1;
4748 SDValue LHS2 = Op2.getOperand(0);
4749 SDValue RHS2 = Op2.getOperand(1);
4750 SDValue TrueVal2 = Op2.getOperand(2);
4751 SDValue FalseVal2 = Op2.getOperand(3);
4756 SDValue *K1 = isa<ConstantSDNode>(LHS1) ? &LHS1 : isa<ConstantSDNode>(RHS1)
4759 SDValue *K2 = isa<ConstantSDNode>(LHS2) ? &LHS2 : isa<ConstantSDNode>(RHS2)
4762 SDValue K2Tmp = isa<ConstantSDNode>(TrueVal2) ? TrueVal2 : FalseVal2;
4763 SDValue V1Tmp = (K1 && *K1 == LHS1) ? RHS1 : LHS1;
4764 SDValue V2Tmp = (K2 && *K2 == LHS2) ? RHS2 : LHS2;
4765 SDValue V2 = (K2Tmp == TrueVal2) ? FalseVal2 : TrueVal2;
4771 SDValue V2TmpReg = V2Tmp;
4782 const SDValue *LowerCheckOp =
4788 const SDValue *UpperCheckOp =
4835 static bool isLowerSaturatingConditional(const SDValue &Op, SDValue &V,
4835 static bool isLowerSaturatingConditional(const SDValue &Op, SDValue &V,
4836 SDValue &SatK)
4838 SDValue LHS = Op.getOperand(0);
4839 SDValue RHS = Op.getOperand(1);
4841 SDValue TrueVal = Op.getOperand(2);
4842 SDValue FalseVal = Op.getOperand(3);
4844 SDValue *K = isa<ConstantSDNode>(LHS) ? &LHS : isa<ConstantSDNode>(RHS)
4852 SDValue KTmp = isa<ConstantSDNode>(TrueVal) ? TrueVal : FalseVal;
4854 SDValue VTmp = (K && *K == LHS) ? RHS : LHS;
4879 SDValue ARMTargetLowering::LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const {
4879 SDValue ARMTargetLowering::LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const {
4884 SDValue SatValue;
4903 SDValue LowerSatConstant;
4906 SDValue ShiftV = DAG.getNode(ISD::SRA, dl, VT, SatValue,
4909 SDValue NotShiftV = DAG.getNode(ISD::XOR, dl, VT, ShiftV,
4916 SDValue LHS = Op.getOperand(0);
4917 SDValue RHS = Op.getOperand(1);
4919 SDValue TrueVal = Op.getOperand(2);
4920 SDValue FalseVal = Op.getOperand(3);
4967 SDValue ARMcc;
4968 SDValue Cmp = getARMCmp(LHS, RHS, CC, ARMcc, DAG, dl);
5008 SDValue ARMcc;
5009 SDValue CCR = DAG.getRegister(ARM::CPSR, MVT::i32);
5010 SDValue Cmp = getARMCmp(LHS, RHS, CC, ARMcc, DAG, dl);
5042 SDValue ARMcc = DAG.getConstant(CondCode, dl, MVT::i32);
5043 SDValue Cmp = getVFPCmp(LHS, RHS, DAG, dl);
5044 SDValue CCR = DAG.getRegister(ARM::CPSR, MVT::i32);
5045 SDValue Result = getCMOV(dl, VT, FalseVal, TrueVal, ARMcc, CCR, Cmp, DAG);
5047 SDValue ARMcc2 = DAG.getConstant(CondCode2, dl, MVT::i32);
5049 SDValue Cmp2 = getVFPCmp(LHS, RHS, DAG, dl);
5057 static bool canChangeToInt(SDValue Op, bool &SeenZero,
5078 static SDValue bitcastf32Toi32(SDValue Op, SelectionDAG &DAG) {
5078 static SDValue bitcastf32Toi32(SDValue Op, SelectionDAG &DAG) {
5090 static void expandf64Toi32(SDValue Op, SelectionDAG &DAG,
5091 SDValue &RetVal1, SDValue &RetVal2) {
5091 SDValue &RetVal1, SDValue &RetVal2) {
5101 SDValue Ptr = Ld->getBasePtr();
5108 SDValue NewPtr = DAG.getNode(ISD::ADD, dl,
5121 SDValue
5122 ARMTargetLowering::OptimizeVFPBrcond(SDValue Op, SelectionDAG &DAG) const {
5123 SDValue Chain = Op.getOperand(0);
5125 SDValue LHS = Op.getOperand(2);
5126 SDValue RHS = Op.getOperand(3);
5127 SDValue Dest = Op.getOperand(4);
5143 SDValue Mask = DAG.getConstant(0x7fffffff, dl, MVT::i32);
5144 SDValue ARMcc;
5150 SDValue Cmp = getARMCmp(LHS, RHS, CC, ARMcc, DAG, dl);
5151 SDValue CCR = DAG.getRegister(ARM::CPSR, MVT::i32);
5156 SDValue LHS1, LHS2;
5157 SDValue RHS1, RHS2;
5165 SDValue Ops[] = { Chain, ARMcc, LHS1, LHS2, RHS1, RHS2, Dest };
5172 SDValue ARMTargetLowering::LowerBRCOND(SDValue Op, SelectionDAG &DAG) const {
5172 SDValue ARMTargetLowering::LowerBRCOND(SDValue Op, SelectionDAG &DAG) const {
5173 SDValue Chain = Op.getOperand(0);
5174 SDValue Cond = Op.getOperand(1);
5175 SDValue Dest = Op.getOperand(2);
5191 SDValue Value, OverflowCmp;
5192 SDValue ARMcc;
5200 SDValue CCR = DAG.getRegister(ARM::CPSR, MVT::i32);
5209 SDValue ARMTargetLowering::LowerBR_CC(SDValue Op, SelectionDAG &DAG) const {
5209 SDValue ARMTargetLowering::LowerBR_CC(SDValue Op, SelectionDAG &DAG) const {
5210 SDValue Chain = Op.getOperand(0);
5212 SDValue LHS = Op.getOperand(2);
5213 SDValue RHS = Op.getOperand(3);
5214 SDValue Dest = Op.getOperand(4);
5243 SDValue Value, OverflowCmp;
5244 SDValue ARMcc;
5254 SDValue CCR = DAG.getRegister(ARM::CPSR, MVT::i32);
5261 SDValue ARMcc;
5262 SDValue Cmp = getARMCmp(LHS, RHS, CC, ARMcc, DAG, dl);
5263 SDValue CCR = DAG.getRegister(ARM::CPSR, MVT::i32);
5271 if (SDValue Result = OptimizeVFPBrcond(Op, DAG))
5278 SDValue ARMcc = DAG.getConstant(CondCode, dl, MVT::i32);
5279 SDValue Cmp = getVFPCmp(LHS, RHS, DAG, dl);
5280 SDValue CCR = DAG.getRegister(ARM::CPSR, MVT::i32);
5282 SDValue Ops[] = { Chain, Dest, ARMcc, CCR, Cmp };
5283 SDValue Res = DAG.getNode(ARMISD::BRCOND, dl, VTList, Ops);
5286 SDValue Ops[] = { Res, Dest, ARMcc, CCR, Res.getValue(1) };
5292 SDValue ARMTargetLowering::LowerBR_JT(SDValue Op, SelectionDAG &DAG) const {
5292 SDValue ARMTargetLowering::LowerBR_JT(SDValue Op, SelectionDAG &DAG) const {
5293 SDValue Chain = Op.getOperand(0);
5294 SDValue Table = Op.getOperand(1);
5295 SDValue Index = Op.getOperand(2);
5300 SDValue JTI = DAG.getTargetJumpTable(JT->getIndex(), PTy);
5303 SDValue Addr = DAG.getNode(ISD::ADD, dl, PTy, Table, Index);
5328 static SDValue LowerVectorFP_TO_INT(SDValue Op, SelectionDAG &DAG) {
5328 static SDValue LowerVectorFP_TO_INT(SDValue Op, SelectionDAG &DAG) {
5359 SDValue ARMTargetLowering::LowerFP_TO_INT(SDValue Op, SelectionDAG &DAG) const {
5359 SDValue ARMTargetLowering::LowerFP_TO_INT(SDValue Op, SelectionDAG &DAG) const {
5379 static SDValue LowerVectorINT_TO_FP(SDValue Op, SelectionDAG &DAG) {
5379 static SDValue LowerVectorINT_TO_FP(SDValue Op, SelectionDAG &DAG) {
5424 SDValue ARMTargetLowering::LowerINT_TO_FP(SDValue Op, SelectionDAG &DAG) const {
5424 SDValue ARMTargetLowering::LowerINT_TO_FP(SDValue Op, SelectionDAG &DAG) const {
5444 SDValue ARMTargetLowering::LowerFCOPYSIGN(SDValue Op, SelectionDAG &DAG) const {
5444 SDValue ARMTargetLowering::LowerFCOPYSIGN(SDValue Op, SelectionDAG &DAG) const {
5446 SDValue Tmp0 = Op.getOperand(0);
5447 SDValue Tmp1 = Op.getOperand(1);
5458 SDValue Mask = DAG.getNode(ARMISD::VMOVIMM, dl, MVT::v2i32,
5480 SDValue AllOnes = DAG.getTargetConstant(ARM_AM::createVMOVModImm(0xe, 0xff),
5483 SDValue MaskNot = DAG.getNode(ISD::XOR, dl, OpVT, Mask,
5486 SDValue Res = DAG.getNode(ISD::OR, dl, OpVT,
5507 SDValue Mask1 = DAG.getConstant(0x80000000, dl, MVT::i32);
5508 SDValue Mask2 = DAG.getConstant(0x7fffffff, dl, MVT::i32);
5520 SDValue Lo = Tmp0.getValue(0);
5521 SDValue Hi = DAG.getNode(ISD::AND, dl, MVT::i32, Tmp0.getValue(1), Mask2);
5526 SDValue ARMTargetLowering::LowerRETURNADDR(SDValue Op, SelectionDAG &DAG) const{
5526 SDValue ARMTargetLowering::LowerRETURNADDR(SDValue Op, SelectionDAG &DAG) const{
5538 SDValue FrameAddr = LowerFRAMEADDR(Op, DAG);
5539 SDValue Offset = DAG.getConstant(4, dl, MVT::i32);
5550 SDValue ARMTargetLowering::LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const {
5550 SDValue ARMTargetLowering::LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const {
5561 SDValue FrameAddr = DAG.getCopyFromReg(DAG.getEntryNode(), dl, FrameReg, VT);
5583 static void ExpandREAD_REGISTER(SDNode *N, SmallVectorImpl<SDValue> &Results,
5591 SDValue Read = DAG.getNode(ISD::READ_REGISTER, DL,
5608 static SDValue CombineVMOVDRRCandidateWithVecOp(const SDNode *BC,
5610 SDValue Op = BC->getOperand(0);
5642 SDValue ExtractSrc = Op.getOperand(0);
5646 SDValue BitCast = DAG.getNode(ISD::BITCAST, dl, VecVT, ExtractSrc);
5656 static SDValue ExpandBITCAST(SDNode *N, SelectionDAG &DAG,
5660 SDValue Op = N->getOperand(0);
5683 SDValue Ops[] = { Op.getOperand(0), Op.getOperand(1) };
5684 SDValue Copy = DAG.getNode(ISD::CopyFromReg, SDLoc(Op), MVT::f16, Ops);
5729 SDValue Cvt = DAG.getNode(ARMISD::VMOVrh, SDLoc(Op), MVT::i32, Op);
5743 if (SDValue Val = CombineVMOVDRRCandidateWithVecOp(N, DAG))
5746 SDValue Lo = DAG.getNode(ISD::EXTRACT_ELEMENT, dl, MVT::i32, Op,
5748 SDValue Hi = DAG.getNode(ISD::EXTRACT_ELEMENT, dl, MVT::i32, Op,
5756 SDValue Cvt;
5778 static SDValue getZeroVector(EVT VT, SelectionDAG &DAG, const SDLoc &dl) {
5781 SDValue EncodedVal = DAG.getTargetConstant(0, dl, MVT::i32);
5783 SDValue Vmov = DAG.getNode(ARMISD::VMOVIMM, dl, VmovVT, EncodedVal);
5789 SDValue ARMTargetLowering::LowerShiftRightParts(SDValue Op,
5789 SDValue ARMTargetLowering::LowerShiftRightParts(SDValue Op,
5795 SDValue ShOpLo = Op.getOperand(0);
5796 SDValue ShOpHi = Op.getOperand(1);
5797 SDValue ShAmt = Op.getOperand(2);
5798 SDValue ARMcc;
5799 SDValue CCR = DAG.getRegister(ARM::CPSR, MVT::i32);
5804 SDValue RevShAmt = DAG.getNode(ISD::SUB, dl, MVT::i32,
5806 SDValue Tmp1 = DAG.getNode(ISD::SRL, dl, VT, ShOpLo, ShAmt);
5807 SDValue ExtraShAmt = DAG.getNode(ISD::SUB, dl, MVT::i32, ShAmt,
5809 SDValue Tmp2 = DAG.getNode(ISD::SHL, dl, VT, ShOpHi, RevShAmt);
5810 SDValue LoSmallShift = DAG.getNode(ISD::OR, dl, VT, Tmp1, Tmp2);
5811 SDValue LoBigShift = DAG.getNode(Opc, dl, VT, ShOpHi, ExtraShAmt);
5812 SDValue CmpLo = getARMCmp(ExtraShAmt, DAG.getConstant(0, dl, MVT::i32),
5814 SDValue Lo = DAG.getNode(ARMISD::CMOV, dl, VT, LoSmallShift, LoBigShift,
5817 SDValue HiSmallShift = DAG.getNode(Opc, dl, VT, ShOpHi, ShAmt);
5818 SDValue HiBigShift = Opc == ISD::SRA
5822 SDValue CmpHi = getARMCmp(ExtraShAmt, DAG.getConstant(0, dl, MVT::i32),
5824 SDValue Hi = DAG.getNode(ARMISD::CMOV, dl, VT, HiSmallShift, HiBigShift,
5827 SDValue Ops[2] = { Lo, Hi };
5833 SDValue ARMTargetLowering::LowerShiftLeftParts(SDValue Op,
5833 SDValue ARMTargetLowering::LowerShiftLeftParts(SDValue Op,
5839 SDValue ShOpLo = Op.getOperand(0);
5840 SDValue ShOpHi = Op.getOperand(1);
5841 SDValue ShAmt = Op.getOperand(2);
5842 SDValue ARMcc;
5843 SDValue CCR = DAG.getRegister(ARM::CPSR, MVT::i32);
5846 SDValue RevShAmt = DAG.getNode(ISD::SUB, dl, MVT::i32,
5848 SDValue Tmp1 = DAG.getNode(ISD::SRL, dl, VT, ShOpLo, RevShAmt);
5849 SDValue Tmp2 = DAG.getNode(ISD::SHL, dl, VT, ShOpHi, ShAmt);
5850 SDValue HiSmallShift = DAG.getNode(ISD::OR, dl, VT, Tmp1, Tmp2);
5852 SDValue ExtraShAmt = DAG.getNode(ISD::SUB, dl, MVT::i32, ShAmt,
5854 SDValue HiBigShift = DAG.getNode(ISD::SHL, dl, VT, ShOpLo, ExtraShAmt);
5855 SDValue CmpHi = getARMCmp(ExtraShAmt, DAG.getConstant(0, dl, MVT::i32),
5857 SDValue Hi = DAG.getNode(ARMISD::CMOV, dl, VT, HiSmallShift, HiBigShift,
5860 SDValue CmpLo = getARMCmp(ExtraShAmt, DAG.getConstant(0, dl, MVT::i32),
5862 SDValue LoSmallShift = DAG.getNode(ISD::SHL, dl, VT, ShOpLo, ShAmt);
5863 SDValue Lo = DAG.getNode(ARMISD::CMOV, dl, VT, LoSmallShift,
5866 SDValue Ops[2] = { Lo, Hi };
5870 SDValue ARMTargetLowering::LowerFLT_ROUNDS_(SDValue Op,
5870 SDValue ARMTargetLowering::LowerFLT_ROUNDS_(SDValue Op,
5877 SDValue Ops[] = { DAG.getEntryNode(),
5880 SDValue FPSCR = DAG.getNode(ISD::INTRINSIC_W_CHAIN, dl, MVT::i32, Ops);
5881 SDValue FltRounds = DAG.getNode(ISD::ADD, dl, MVT::i32, FPSCR,
5883 SDValue RMODE = DAG.getNode(ISD::SRL, dl, MVT::i32, FltRounds,
5889 static SDValue LowerCTTZ(SDNode *N, SelectionDAG &DAG,
5896 SDValue X = N->getOperand(0);
5897 SDValue NX = DAG.getNode(ISD::SUB, dl, VT, getZeroVector(VT, DAG, dl), X);
5898 SDValue LSB = DAG.getNode(ISD::AND, dl, VT, X, NX);
5904 SDValue One = DAG.getNode(ARMISD::VMOVIMM, dl, VT,
5906 SDValue Bits = DAG.getNode(ISD::SUB, dl, VT, LSB, One);
5914 SDValue WidthMinus1 =
5917 SDValue CTLZ = DAG.getNode(ISD::CTLZ, dl, VT, LSB);
5924 SDValue Bits;
5927 SDValue FF = DAG.getNode(ARMISD::VMOVIMM, dl, VT,
5931 SDValue One = DAG.getNode(ARMISD::VMOVIMM, dl, VT,
5941 SDValue rbit = DAG.getNode(ISD::BITREVERSE, dl, VT, N->getOperand(0));
5945 static SDValue LowerCTPOP(SDNode *N, SelectionDAG &DAG,
5957 SDValue Res = DAG.getBitcast(VT8Bit, N->getOperand(0));
5964 SmallVector<SDValue, 8> Ops;
5981 static bool getVShiftImm(SDValue Op, unsigned ElementBits, int64_t &Cnt) {
6002 static bool isVShiftLImm(SDValue Op, EVT VT, bool isLong, int64_t &Cnt) {
6016 static bool isVShiftRImm(SDValue Op, EVT VT, bool isNarrow, bool isIntrinsic,
6031 static SDValue LowerShift(SDNode *N, SelectionDAG &DAG,
6067 SDValue NegatedCount = DAG.getNode(
6074 static SDValue Expand64BitShift(SDNode *N, SelectionDAG &DAG,
6089 SDValue ShAmt = N->getOperand(1);
6116 SDValue Lo = DAG.getNode(ISD::EXTRACT_ELEMENT, dl, MVT::i32, N->getOperand(0),
6119 SDValue Hi = DAG.getNode(ISD::EXTRACT_ELEMENT, dl, MVT::i32, N->getOperand(0),
6139 SDValue Lo = DAG.getNode(ISD::EXTRACT_ELEMENT, dl, MVT::i32, N->getOperand(0),
6141 SDValue Hi = DAG.getNode(ISD::EXTRACT_ELEMENT, dl, MVT::i32, N->getOperand(0),
6156 static SDValue LowerVSETCC(SDValue Op, SelectionDAG &DAG,
6156 static SDValue LowerVSETCC(SDValue Op, SelectionDAG &DAG,
6162 SDValue Op0 = Op.getOperand(0);
6163 SDValue Op1 = Op.getOperand(1);
6164 SDValue CC = Op.getOperand(2);
6193 SDValue CastOp0 = DAG.getNode(ISD::BITCAST, dl, SplitVT, Op0);
6194 SDValue CastOp1 = DAG.getNode(ISD::BITCAST, dl, SplitVT, Op1);
6195 SDValue Cmp = DAG.getNode(ISD::SETCC, dl, SplitVT, CastOp0, CastOp1,
6197 SDValue Reversed = DAG.getNode(ARMISD::VREV64, dl, SplitVT, Cmp);
6198 SDValue Merged = DAG.getNode(ISD::AND, dl, SplitVT, Cmp, Reversed);
6237 SDValue TmpOp0 = DAG.getNode(ARMISD::VCMP, dl, CmpVT, Op1, Op0,
6239 SDValue TmpOp1 = DAG.getNode(ARMISD::VCMP, dl, CmpVT, Op0, Op1,
6241 SDValue Result = DAG.getNode(ISD::OR, dl, CmpVT, TmpOp0, TmpOp1);
6249 SDValue TmpOp0 = DAG.getNode(ARMISD::VCMP, dl, CmpVT, Op1, Op0,
6251 SDValue TmpOp1 = DAG.getNode(ARMISD::VCMP, dl, CmpVT, Op0, Op1,
6253 SDValue Result = DAG.getNode(ISD::OR, dl, CmpVT, TmpOp0, TmpOp1);
6282 SDValue AndOp;
6295 SDValue Result = DAG.getNode(ARMISD::VTST, dl, CmpVT, Op0, Op1);
6308 SDValue SingleOp;
6319 SDValue Result;
6336 static SDValue LowerSETCCCARRY(SDValue Op, SelectionDAG &DAG) {
6336 static SDValue LowerSETCCCARRY(SDValue Op, SelectionDAG &DAG) {
6337 SDValue LHS = Op.getOperand(0);
6338 SDValue RHS = Op.getOperand(1);
6339 SDValue Carry = Op.getOperand(2);
6340 SDValue Cond = Op.getOperand(3);
6353 SDValue Cmp = DAG.getNode(ARMISD::SUBE, DL, VTs, LHS, RHS, Carry);
6355 SDValue FVal = DAG.getConstant(0, DL, MVT::i32);
6356 SDValue TVal = DAG.getConstant(1, DL, MVT::i32);
6357 SDValue ARMcc = DAG.getConstant(
6359 SDValue CCR = DAG.getRegister(ARM::CPSR, MVT::i32);
6360 SDValue Chain = DAG.getCopyToReg(DAG.getEntryNode(), DL, ARM::CPSR,
6369 static SDValue isVMOVModifiedImm(uint64_t SplatBits, uint64_t SplatUndef,
6509 SDValue ARMTargetLowering::LowerConstantFP(SDValue Op, SelectionDAG &DAG,
6509 SDValue ARMTargetLowering::LowerConstantFP(SDValue Op, SelectionDAG &DAG,
6530 SDValue Lo = DAG.getConstant(INTVal.trunc(32), DL, MVT::i32);
6531 SDValue Hi = DAG.getConstant(INTVal.lshr(32).trunc(32), DL, MVT::i32);
6563 SDValue NewVal = DAG.getTargetConstant(ImmVal, DL, MVT::i32);
6564 SDValue VecConstant = DAG.getNode(ARMISD::VMOVFPIMM, DL, MVT::v2f32,
6585 SDValue NewVal = isVMOVModifiedImm(iVal & 0xffffffffU, 0, 32, DAG, SDLoc(Op),
6589 SDValue VecConstant = DAG.getNode(ARMISD::VMOVIMM, DL, VMovVT,
6595 SDValue VecFConstant = DAG.getNode(ISD::BITCAST, DL, MVT::v2f32,
6606 SDValue VecConstant = DAG.getNode(ARMISD::VMVNIMM, DL, VMovVT, NewVal);
6612 SDValue VecFConstant = DAG.getNode(ISD::BITCAST, DL, MVT::v2f32,
7014 static SDValue IsSingleInstrConstant(SDValue N, SelectionDAG &DAG,
7014 static SDValue IsSingleInstrConstant(SDValue N, SelectionDAG &DAG,
7031 static SDValue LowerBUILD_VECTOR_i1(SDValue Op, SelectionDAG &DAG,
7031 static SDValue LowerBUILD_VECTOR_i1(SDValue Op, SelectionDAG &DAG,
7055 SDValue FirstOp = Op.getOperand(0);
7061 SDValue Ext = DAG.getNode(ISD::SIGN_EXTEND_INREG, dl, MVT::i32, FirstOp,
7069 SDValue V = Op.getOperand(i);
7078 SDValue Base = DAG.getNode(ARMISD::PREDICATE_CAST, dl, VT,
7081 SDValue V = Op.getOperand(i);
7093 SDValue ARMTargetLowering::LowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG,
7093 SDValue ARMTargetLowering::LowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG,
7113 SDValue Val = isVMOVModifiedImm(SplatBits.getZExtValue(),
7119 SDValue Vmov = DAG.getNode(ARMISD::VMOVIMM, dl, VmovVT, Val);
7130 SDValue Vmov = DAG.getNode(ARMISD::VMVNIMM, dl, VmovVT, Val);
7138 SDValue Val = DAG.getTargetConstant(ImmVal, dl, MVT::i32);
7160 DenseMap<SDValue, unsigned> ValueCounts;
7161 SDValue Value;
7163 SDValue V = Op.getOperand(i);
7199 SDValue N;
7232 SmallVector<SDValue, 3> Ops;
7242 SmallVector<SDValue, 8> Ops;
7250 SDValue Val = DAG.getBuildVector(VecVT, dl, Ops);
7256 SDValue Val = IsSingleInstrConstant(Value, DAG, ST, dl);
7270 SDValue shuffle = ReconstructShuffle(Op, DAG);
7278 SmallVector<SDValue, 64> Ops(Op->op_begin(), Op->op_begin() + NumElts);
7281 SDValue Lower =
7285 SDValue Upper = DAG.getBuildVector(
7301 SmallVector<SDValue, 8> Ops;
7304 SDValue Val = DAG.getNode(ARMISD::BUILD_VECTOR, dl, VecVT, Ops);
7315 SDValue Vec = DAG.getUNDEF(VT);
7317 SDValue V = Op.getOperand(i);
7320 SDValue LaneIdx = DAG.getConstant(i, dl, MVT::i32);
7331 SDValue ARMTargetLowering::ReconstructShuffle(SDValue Op,
7331 SDValue ARMTargetLowering::ReconstructShuffle(SDValue Op,
7339 SDValue Vec;
7346 SDValue ShuffleVec;
7353 ShuffleSourceInfo(SDValue Vec) : Vec(Vec), ShuffleVec(Vec) {}
7355 bool operator ==(SDValue OtherVec) { return Vec == OtherVec; }
7362 SDValue V = Op.getOperand(i);
7376 SDValue SourceVec = V.getOperand(0);
7452 SDValue VEXTSrc1 =
7455 SDValue VEXTSrc2 =
7488 SDValue Entry = Op.getOperand(i);
7518 SDValue ShuffleOps[] = { DAG.getUNDEF(ShuffleVT), DAG.getUNDEF(ShuffleVT) };
7522 SDValue Shuffle = buildLegalVectorShuffle(ShuffleVT, dl, ShuffleOps[0],
7614 static SDValue GeneratePerfectShuffle(unsigned PFEntry, SDValue LHS,
7614 static SDValue GeneratePerfectShuffle(unsigned PFEntry, SDValue LHS,
7615 SDValue RHS, SelectionDAG &DAG,
7627 SDValue OpLHS, OpRHS;
7672 static SDValue LowerVECTOR_SHUFFLEv8i8(SDValue Op,
7672 static SDValue LowerVECTOR_SHUFFLEv8i8(SDValue Op,
7676 SDValue V1 = Op.getOperand(0);
7677 SDValue V2 = Op.getOperand(1);
7680 SmallVector<SDValue, 8> VTBLMask;
7693 static SDValue LowerReverse_VECTOR_SHUFFLEv16i8_v8i16(SDValue Op,
7693 static SDValue LowerReverse_VECTOR_SHUFFLEv16i8_v8i16(SDValue Op,
7696 SDValue OpLHS = Op.getOperand(0);
7723 static SDValue PromoteMVEPredVector(SDLoc dl, SDValue Pred, EVT VT,
7723 static SDValue PromoteMVEPredVector(SDLoc dl, SDValue Pred, EVT VT,
7728 SDValue AllOnes =
7732 SDValue AllZeroes =
7739 SDValue RecastV1;
7750 SDValue PredAsVector =
7758 static SDValue LowerVECTOR_SHUFFLE_i1(SDValue Op, SelectionDAG &DAG,
7758 static SDValue LowerVECTOR_SHUFFLE_i1(SDValue Op, SelectionDAG &DAG,
7767 SDValue V1 = Op.getOperand(0);
7770 SDValue cast = DAG.getNode(ARMISD::PREDICATE_CAST, dl, MVT::i32, V1);
7771 SDValue rbit = DAG.getNode(ISD::BITREVERSE, dl, MVT::i32, cast);
7772 SDValue srl = DAG.getNode(ISD::SRL, dl, MVT::i32, rbit,
7785 SDValue PredAsVector = PromoteMVEPredVector(dl, V1, VT, DAG);
7789 SDValue Shuffled = DAG.getVectorShuffle(NewVT, dl, PredAsVector,
7798 static SDValue LowerVECTOR_SHUFFLE(SDValue Op, SelectionDAG &DAG,
7798 static SDValue LowerVECTOR_SHUFFLE(SDValue Op, SelectionDAG &DAG,
7800 SDValue V1 = Op.getOperand(0);
7801 SDValue V2 = Op.getOperand(1);
7908 SDValue SubV1 = V1->getOperand(0);
7909 SDValue SubV2 = V1->getOperand(1);
7923 SDValue Res = DAG.getNode(ShuffleOpc, dl, DAG.getVTList(SubVT, SubVT),
7971 SmallVector<SDValue, 8> Ops;
7981 SDValue Val = DAG.getNode(ARMISD::BUILD_VECTOR, dl, VecVT, Ops);
7989 if (SDValue NewOp = LowerVECTOR_SHUFFLEv8i8(Op, ShuffleMask, DAG))
7995 static SDValue LowerINSERT_VECTOR_ELT_i1(SDValue Op, SelectionDAG &DAG,
7995 static SDValue LowerINSERT_VECTOR_ELT_i1(SDValue Op, SelectionDAG &DAG,
8003 SDValue Conv =
8009 SDValue Ext = DAG.getNode(ISD::SIGN_EXTEND_INREG, dl, MVT::i32,
8011 SDValue BFI = DAG.getNode(ARMISD::BFI, dl, MVT::i32, Conv, Ext,
8016 SDValue ARMTargetLowering::LowerINSERT_VECTOR_ELT(SDValue Op,
8016 SDValue ARMTargetLowering::LowerINSERT_VECTOR_ELT(SDValue Op,
8019 SDValue Lane = Op.getOperand(2);
8023 SDValue Elt = Op.getOperand(1);
8043 SDValue VecIn = Op.getOperand(0);
8048 SDValue IElt = DAG.getNode(ISD::BITCAST, dl, IEltVT, Elt);
8049 SDValue IVecIn = DAG.getNode(ISD::BITCAST, dl, IVecVT, VecIn);
8050 SDValue IVecOut = DAG.getNode(ISD::INSERT_VECTOR_ELT, dl, IVecVT,
8058 static SDValue LowerEXTRACT_VECTOR_ELT_i1(SDValue Op, SelectionDAG &DAG,
8058 static SDValue LowerEXTRACT_VECTOR_ELT_i1(SDValue Op, SelectionDAG &DAG,
8066 SDValue Conv =
8071 SDValue Shift = DAG.getNode(ISD::SRL, dl, MVT::i32, Conv,
8076 static SDValue LowerEXTRACT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG,
8076 static SDValue LowerEXTRACT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG,
8079 SDValue Lane = Op.getOperand(1);
8083 SDValue Vec = Op.getOperand(0);
8097 static SDValue LowerCONCAT_VECTORS_i1(SDValue Op, SelectionDAG &DAG,
8097 static SDValue LowerCONCAT_VECTORS_i1(SDValue Op, SelectionDAG &DAG,
8099 SDValue V1 = Op.getOperand(0);
8100 SDValue V2 = Op.getOperand(1);
8113 SDValue NewV1 = PromoteMVEPredVector(dl, V1, Op1VT, DAG);
8114 SDValue NewV2 = PromoteMVEPredVector(dl, V2, Op2VT, DAG);
8127 SDValue ConVec = DAG.getNode(ISD::UNDEF, dl, ConcatVT);
8132 SDValue Elt = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, MVT::i32, NewV,
8149 static SDValue LowerCONCAT_VECTORS(SDValue Op, SelectionDAG &DAG,
8149 static SDValue LowerCONCAT_VECTORS(SDValue Op, SelectionDAG &DAG,
8160 SDValue Val = DAG.getUNDEF(MVT::v2f64);
8161 SDValue Op0 = Op.getOperand(0);
8162 SDValue Op1 = Op.getOperand(1);
8174 static SDValue LowerEXTRACT_SUBVECTOR(SDValue Op, SelectionDAG &DAG,
8174 static SDValue LowerEXTRACT_SUBVECTOR(SDValue Op, SelectionDAG &DAG,
8176 SDValue V1 = Op.getOperand(0);
8177 SDValue V2 = Op.getOperand(1);
8189 SDValue NewV1 = PromoteMVEPredVector(dl, V1, Op1VT, DAG);
8197 SDValue SubVec = DAG.getNode(ISD::UNDEF, dl, SubVT);
8199 SDValue Elt = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, MVT::i32, NewV1,
8305 static SDValue AddRequiredExtensionForVMULL(SDValue N, SelectionDAG &DAG,
8305 static SDValue AddRequiredExtensionForVMULL(SDValue N, SelectionDAG &DAG,
8327 static SDValue SkipLoadExtensionForVMULL(LoadSDNode *LD, SelectionDAG& DAG) {
8351 static SDValue SkipExtensionForVMULL(SDNode *N, SelectionDAG &DAG) {
8362 SDValue newLoad = SkipLoadExtensionForVMULL(LD, DAG);
8365 SDValue extLoad =
8389 SmallVector<SDValue, 8> Ops;
8423 static SDValue LowerMUL(SDValue Op, SelectionDAG &DAG) {
8423 static SDValue LowerMUL(SDValue Op, SelectionDAG &DAG) {
8470 SDValue Op0;
8471 SDValue Op1 = SkipExtensionForVMULL(N1, DAG);
8488 SDValue N00 = SkipExtensionForVMULL(N0->getOperand(0).getNode(), DAG);
8489 SDValue N01 = SkipExtensionForVMULL(N0->getOperand(1).getNode(), DAG);
8498 static SDValue LowerSDIV_v4i8(SDValue X, SDValue Y, const SDLoc &dl,
8498 static SDValue LowerSDIV_v4i8(SDValue X, SDValue Y, const SDLoc &dl,
8498 static SDValue LowerSDIV_v4i8(SDValue X, SDValue Y, const SDLoc &dl,
8529 static SDValue LowerSDIV_v4i16(SDValue N0, SDValue N1, const SDLoc &dl,
8529 static SDValue LowerSDIV_v4i16(SDValue N0, SDValue N1, const SDLoc &dl,
8529 static SDValue LowerSDIV_v4i16(SDValue N0, SDValue N1, const SDLoc &dl,
8533 SDValue N2;
8568 static SDValue LowerSDIV(SDValue Op, SelectionDAG &DAG,
8568 static SDValue LowerSDIV(SDValue Op, SelectionDAG &DAG,
8575 SDValue N0 = Op.getOperand(0);
8576 SDValue N1 = Op.getOperand(1);
8577 SDValue N2, N3;
8604 static SDValue LowerUDIV(SDValue Op, SelectionDAG &DAG,
8604 static SDValue LowerUDIV(SDValue Op, SelectionDAG &DAG,
8612 SDValue N0 = Op.getOperand(0);
8613 SDValue N1 = Op.getOperand(1);
8614 SDValue N2, N3;
8648 SDValue BN1 = DAG.getNode(ISD::SINT_TO_FP, dl, MVT::v4f32, N1);
8681 static SDValue LowerADDSUBCARRY(SDValue Op, SelectionDAG &DAG) {
8681 static SDValue LowerADDSUBCARRY(SDValue Op, SelectionDAG &DAG) {
8686 SDValue Carry = Op.getOperand(2);
8690 SDValue Result;
8725 SDValue ARMTargetLowering::LowerFSINCOS(SDValue Op, SelectionDAG &DAG) const {
8725 SDValue ARMTargetLowering::LowerFSINCOS(SDValue Op, SelectionDAG &DAG) const {
8731 SDValue Arg = Op.getOperand(0);
8745 SDValue SRet;
8774 SDValue Callee = DAG.getExternalSymbol(LibcallName, getPointerTy(DL));
8781 std::pair<SDValue, SDValue> CallResult = LowerCallTo(CLI);
8781 std::pair<SDValue, SDValue> CallResult = LowerCallTo(CLI);
8786 SDValue LoadSin =
8790 SDValue Add = DAG.getNode(ISD::ADD, dl, PtrVT, SRet,
8792 SDValue LoadCos =
8800 SDValue ARMTargetLowering::LowerWindowsDIVLibCall(SDValue Op, SelectionDAG &DAG,
8800 SDValue ARMTargetLowering::LowerWindowsDIVLibCall(SDValue Op, SelectionDAG &DAG,
8802 SDValue &Chain) const {
8817 SDValue ES = DAG.getExternalSymbol(Name, TLI.getPointerTy(DL));
8841 SDValue
8880 SDValue ARMTargetLowering::LowerDIV_Windows(SDValue Op, SelectionDAG &DAG,
8880 SDValue ARMTargetLowering::LowerDIV_Windows(SDValue Op, SelectionDAG &DAG,
8886 SDValue DBZCHK = DAG.getNode(ARMISD::WIN__DBZCHK, dl, MVT::Other,
8892 static SDValue WinDBZCheckDenominator(SelectionDAG &DAG, SDNode *N, SDValue InChain) {
8892 static SDValue WinDBZCheckDenominator(SelectionDAG &DAG, SDNode *N, SDValue InChain) {
8894 SDValue Op = N->getOperand(1);
8897 SDValue Lo = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i32, Op,
8899 SDValue Hi = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i32, Op,
8906 SDValue Op, SelectionDAG &DAG, bool Signed,
8907 SmallVectorImpl<SDValue> &Results) const {
8915 SDValue DBZCHK = WinDBZCheckDenominator(DAG, Op.getNode(), DAG.getEntryNode());
8917 SDValue Result = LowerWindowsDIVLibCall(Op, DAG, Signed, DBZCHK);
8919 SDValue Lower = DAG.getNode(ISD::TRUNCATE, dl, MVT::i32, Result);
8920 SDValue Upper = DAG.getNode(ISD::SRL, dl, MVT::i64, Result,
8928 static SDValue LowerPredicateLoad(SDValue Op, SelectionDAG &DAG) {
8928 static SDValue LowerPredicateLoad(SDValue Op, SelectionDAG &DAG) {
8947 SDValue Load = DAG.getExtLoad(
8951 SDValue Pred = DAG.getNode(ARMISD::PREDICATE_CAST, dl, MVT::v16i1, Load);
8958 static SDValue LowerPredicateStore(SDValue Op, SelectionDAG &DAG) {
8958 static SDValue LowerPredicateStore(SDValue Op, SelectionDAG &DAG) {
8970 SDValue Build = ST->getValue();
8972 SmallVector<SDValue, 16> Ops;
8980 SDValue GRP = DAG.getNode(ARMISD::PREDICATE_CAST, dl, MVT::i32, Build);
8987 static SDValue LowerMLOAD(SDValue Op, SelectionDAG &DAG) {
8987 static SDValue LowerMLOAD(SDValue Op, SelectionDAG &DAG) {
8990 SDValue Mask = N->getMask();
8991 SDValue PassThru = N->getPassThru();
9005 SDValue ZeroVec = DAG.getNode(ARMISD::VMOVIMM, dl, VT,
9007 SDValue NewLoad = DAG.getMaskedLoad(
9010 SDValue Combo = NewLoad;
9018 static SDValue LowerAtomicLoadStore(SDValue Op, SelectionDAG &DAG) {
9018 static SDValue LowerAtomicLoadStore(SDValue Op, SelectionDAG &DAG) {
9029 SmallVectorImpl<SDValue> &Results,
9035 SDValue Ops[] = { N->getOperand(0), // Chain
9044 SDValue Cycles32 = DAG.getNode(ISD::INTRINSIC_W_CHAIN, DL,
9051 static SDValue createGPRPairNode(SelectionDAG &DAG, SDValue V) {
9051 static SDValue createGPRPairNode(SelectionDAG &DAG, SDValue V) {
9053 SDValue VLo = DAG.getAnyExtOrTrunc(V, dl, MVT::i32);
9054 SDValue VHi = DAG.getAnyExtOrTrunc(
9060 SDValue RegClass =
9062 SDValue SubReg0 = DAG.getTargetConstant(ARM::gsub_0, dl, MVT::i32);
9063 SDValue SubReg1 = DAG.getTargetConstant(ARM::gsub_1, dl, MVT::i32);
9064 const SDValue Ops[] = { RegClass, VLo, SubReg0, VHi, SubReg1 };
9070 SmallVectorImpl<SDValue> & Results,
9074 SDValue Ops[] = {N->getOperand(1),
9096 static SDValue LowerFPOWI(SDValue Op, const ARMSubtarget &Subtarget,
9096 static SDValue LowerFPOWI(SDValue Op, const ARMSubtarget &Subtarget,
9104 SDValue Val = Op.getOperand(0);
9106 SDValue Exponent = DAG.getNode(ISD::SINT_TO_FP, dl, Ty, Op.getOperand(1));
9107 SDValue Callee = DAG.getExternalSymbol(Ty == MVT::f32 ? "powf" : "pow",
9128 SDValue InChain = DAG.getEntryNode();
9129 SDValue TCChain = InChain;
9142 std::pair<SDValue, SDValue> CI = TLI.LowerCallTo(CLI);
9142 std::pair<SDValue, SDValue> CI = TLI.LowerCallTo(CLI);
9148 SDValue ARMTargetLowering::LowerOperation(SDValue Op, SelectionDAG &DAG) const {
9148 SDValue ARMTargetLowering::LowerOperation(SDValue Op, SelectionDAG &DAG) const {
9242 static void ReplaceLongIntrinsic(SDNode *N, SmallVectorImpl<SDValue> &Results,
9258 SDValue Lo = DAG.getNode(ISD::EXTRACT_ELEMENT, dl, MVT::i32,
9261 SDValue Hi = DAG.getNode(ISD::EXTRACT_ELEMENT, dl, MVT::i32,
9265 SDValue LongMul = DAG.getNode(Opc, dl,
9276 SmallVectorImpl<SDValue> &Results,
9278 SDValue Res;
10818 static inline bool isZeroOrAllOnes(SDValue N, bool AllOnes) {
10835 SDValue &CC, bool &Invert,
10836 SDValue &OtherOp,
10842 SDValue N1 = N->getOperand(1);
10843 SDValue N2 = N->getOperand(2);
10908 SDValue combineSelectAndUse(SDNode *N, SDValue Slct, SDValue OtherOp,
10908 SDValue combineSelectAndUse(SDNode *N, SDValue Slct, SDValue OtherOp,
10908 SDValue combineSelectAndUse(SDNode *N, SDValue Slct, SDValue OtherOp,
10913 SDValue NonConstantVal;
10914 SDValue CCOp;
10921 SDValue TrueVal = OtherOp;
10922 SDValue FalseVal = DAG.getNode(N->getOpcode(), SDLoc(N), VT,
10934 SDValue combineSelectAndUseCommutative(SDNode *N, bool AllOnes,
10936 SDValue N0 = N->getOperand(0);
10937 SDValue N1 = N->getOperand(1);
10939 if (SDValue Result = combineSelectAndUse(N, N0, N1, DCI, AllOnes))
10942 if (SDValue Result = combineSelectAndUse(N, N1, N0, DCI, AllOnes))
10959 static SDValue AddCombineToVPADD(SDNode *N, SDValue N0, SDValue N1,
10959 static SDValue AddCombineToVPADD(SDNode *N, SDValue N0, SDValue N1,
10959 static SDValue AddCombineToVPADD(SDNode *N, SDValue N0, SDValue N1,
10978 SmallVector<SDValue, 8> Ops;
10987 static SDValue AddCombineVUZPToVPADDL(SDNode *N, SDValue N0, SDValue N1,
10987 static SDValue AddCombineVUZPToVPADDL(SDNode *N, SDValue N0, SDValue N1,
10987 static SDValue AddCombineVUZPToVPADDL(SDNode *N, SDValue N0, SDValue N1,
10997 SDValue N00 = N0.getOperand(0);
10998 SDValue N10 = N1.getOperand(0);
11017 SmallVector<SDValue, 8> Ops;
11029 SDValue Concat = DAG.getNode(ISD::CONCAT_VECTORS, SDLoc(N), ConcatVT,
11039 static SDValue
11040 AddCombineBUILD_VECTORToVPADDL(SDNode *N, SDValue N0, SDValue N1,
11040 AddCombineBUILD_VECTORToVPADDL(SDNode *N, SDValue N0, SDValue N1,
11064 SDValue Vec = N0->getOperand(0)->getOperand(0);
11075 SDValue ExtVec0 = N0->getOperand(i);
11076 SDValue ExtVec1 = N1->getOperand(i);
11112 SmallVector<SDValue, 8> Ops;
11132 SDValue tmp = DAG.getNode(ISD::INTRINSIC_WO_CHAIN, dl, widenType, Ops);
11137 static SDValue findMUL_LOHI(SDValue V) {
11137 static SDValue findMUL_LOHI(SDValue V) {
11144 static SDValue AddCombineTo64BitSMLAL16(SDNode *AddcNode, SDNode *AddeNode,
11154 SDValue Mul = AddcNode->getOperand(0);
11155 SDValue Lo = AddcNode->getOperand(1);
11163 SDValue SRA = AddeNode->getOperand(0);
11164 SDValue Hi = AddeNode->getOperand(1);
11183 SDValue Op0;
11184 SDValue Op1;
11207 SDValue SMLAL = DAG.getNode(Opcode, dl, DAG.getVTList(MVT::i32, MVT::i32),
11210 SDValue HiMLALResult(SMLAL.getNode(), 1);
11211 SDValue LoMLALResult(SMLAL.getNode(), 0);
11217 SDValue resNode(AddcNode, 0);
11221 static SDValue AddCombineTo64bitMLAL(SDNode *AddeSubeNode,
11260 SDValue AddcSubcOp0 = AddcSubcNode->getOperand(0);
11261 SDValue AddcSubcOp1 = AddcSubcNode->getOperand(1);
11281 SDValue AddeSubeOp0 = AddeSubeNode->getOperand(0);
11282 SDValue AddeSubeOp1 = AddeSubeNode->getOperand(1);
11290 SDValue MULOp = findMUL_LOHI(AddeSubeOp0);
11303 SDValue *HiAddSub = nullptr;
11304 SDValue *LoMul = nullptr;
11305 SDValue *LowAddSub = nullptr;
11341 SmallVector<SDValue, 8> Ops;
11360 SDValue NewNode = DAG.getNode(FinalOpc, SDLoc(AddcSubcNode), MVT::i32, Ops);
11373 SDValue MLALNode = DAG.getNode(FinalOpc, SDLoc(AddcSubcNode),
11377 SDValue HiMLALResult(MLALNode.getNode(), 1);
11380 SDValue LoMLALResult(MLALNode.getNode(), 0);
11387 static SDValue AddCombineTo64bitUMAAL(SDNode *AddeNode,
11406 SDValue AddHi;
11427 SDValue Ops[] = { UmlalNode->getOperand(0), UmlalNode->getOperand(1),
11429 SDValue UMAAL = DAG.getNode(ARMISD::UMAAL, SDLoc(AddcNode),
11442 static SDValue PerformUMLALCombine(SDNode *N, SelectionDAG &DAG,
11464 static SDValue PerformAddcSubcCombine(SDNode *N,
11471 SDValue LHS = N->getOperand(0);
11472 SDValue RHS = N->getOperand(1);
11481 SDValue RHS = N->getOperand(1);
11497 static SDValue PerformAddeSubeCombine(SDNode *N,
11502 SDValue RHS = N->getOperand(1);
11525 static SDValue PerformABSCombine(SDNode *N,
11528 SDValue res;
11544 static SDValue PerformADDECombine(SDNode *N,
11561 static SDValue PerformADDCombineWithOperands(SDNode *N, SDValue N0, SDValue N1,
11561 static SDValue PerformADDCombineWithOperands(SDNode *N, SDValue N0, SDValue N1,
11561 static SDValue PerformADDCombineWithOperands(SDNode *N, SDValue N0, SDValue N1,
11565 if (SDValue Result = AddCombineToVPADD(N, N0, N1, DCI, Subtarget))
11569 if (SDValue Result = AddCombineVUZPToVPADDL(N, N0, N1, DCI, Subtarget))
11571 if (SDValue Result = AddCombineBUILD_VECTORToVPADDL(N, N0, N1, DCI,
11577 if (SDValue Result = combineSelectAndUse(N, N0, N1, DCI))
11597 SDValue N1 = N->getOperand(0);
11638 static SDValue PerformSHLSimplify(SDNode *N,
11698 SDValue SHL = N->getOperand(0);
11728 SDValue X = SHL.getOperand(0);
11729 SDValue BinOp = DAG.getNode(N->getOpcode(), dl, MVT::i32, X,
11732 SDValue Res = DAG.getNode(ISD::SHL, dl, MVT::i32, BinOp, SHL.getOperand(1));
11743 static SDValue PerformADDCombine(SDNode *N,
11746 SDValue N0 = N->getOperand(0);
11747 SDValue N1 = N->getOperand(1);
11750 if (SDValue Result = PerformSHLSimplify(N, DCI, Subtarget))
11754 if (SDValue Result = PerformADDCombineWithOperands(N, N0, N1, DCI, Subtarget))
11763 static SDValue PerformSUBCombine(SDNode *N,
11765 SDValue N0 = N->getOperand(0);
11766 SDValue N1 = N->getOperand(1);
11770 if (SDValue Result = combineSelectAndUse(N, N1, N0, DCI))
11791 static SDValue PerformVMULCombine(SDNode *N,
11798 SDValue N0 = N->getOperand(0);
11799 SDValue N1 = N->getOperand(1);
11815 SDValue N00 = N0->getOperand(0);
11816 SDValue N01 = N0->getOperand(1);
11822 static SDValue PerformMULCombine(SDNode *N,
11847 SDValue V = N->getOperand(0);
11850 SDValue Res;
11905 static SDValue CombineANDShift(SDNode *N,
11959 SDValue SHL = DAG.getNode(ISD::SHL, DL, MVT::i32, N0->getOperand(0),
11970 SDValue SHL = DAG.getNode(ISD::SRL, DL, MVT::i32, N0->getOperand(0),
11983 SDValue SHL = DAG.getNode(ISD::SHL, DL, MVT::i32, N0->getOperand(0),
11996 SDValue SHL = DAG.getNode(ISD::SRL, DL, MVT::i32, N0->getOperand(0),
12009 static SDValue PerformANDCombine(SDNode *N,
12028 SDValue Val = isVMOVModifiedImm((~SplatBits).getZExtValue(),
12033 SDValue Input =
12035 SDValue Vbic = DAG.getNode(ARMISD::VBICIMM, dl, VbicVT, Input, Val);
12043 if (SDValue Result = combineSelectAndUseCommutative(N, true, DCI))
12046 if (SDValue Result = PerformSHLSimplify(N, DCI, Subtarget))
12051 if (SDValue Result = CombineANDShift(N, DCI, Subtarget))
12058 static SDValue PerformORCombineToSMULWBT(SDNode *OR,
12066 SDValue SRL = OR->getOperand(0);
12067 SDValue SHL = OR->getOperand(1);
12093 SDValue OpS16 = SMULLOHI->getOperand(0);
12094 SDValue OpS32 = SMULLOHI->getOperand(1);
12113 SDValue Res = DAG.getNode(Opcode, dl, MVT::i32, OpS32, OpS16);
12118 static SDValue PerformORCombineToBFI(SDNode *N,
12126 SDValue N0 = N->getOperand(0);
12127 SDValue N1 = N->getOperand(1);
12143 SDValue N00 = N0.getOperand(0);
12148 SDValue MaskOp = N0.getOperand(1);
12155 SDValue Res;
12226 SDValue ShAmt = N00.getOperand(1);
12261 static SDValue PerformORCombine_i1(SDNode *N,
12267 SDValue N0 = N->getOperand(0);
12268 SDValue N1 = N->getOperand(1);
12297 SmallVector<SDValue, 4> Ops0;
12302 SmallVector<SDValue, 4> Ops1;
12308 SDValue NewN0 = DCI.DAG.getNode(N0->getOpcode(), SDLoc(N0), VT, Ops0);
12309 SDValue NewN1 = DCI.DAG.getNode(N1->getOpcode(), SDLoc(N1), VT, Ops1);
12310 SDValue And = DCI.DAG.getNode(ISD::AND, SDLoc(N), VT, NewN0, NewN1);
12316 static SDValue PerformORCombine(SDNode *N,
12335 SDValue Val = isVMOVModifiedImm(SplatBits.getZExtValue(),
12340 SDValue Input =
12342 SDValue Vorr = DAG.getNode(ARMISD::VORRIMM, dl, VorrVT, Input, Val);
12350 if (SDValue Result = combineSelectAndUseCommutative(N, false, DCI))
12352 if (SDValue Result = PerformORCombineToSMULWBT(N, DCI, Subtarget))
12356 SDValue N0 = N->getOperand(0);
12357 SDValue N1 = N->getOperand(1);
12389 SDValue Result = DAG.getNode(ARMISD::VBSL, dl, CanonicalVT,
12406 if (SDValue Res = PerformORCombineToBFI(N, DCI, Subtarget))
12410 if (SDValue Result = PerformSHLSimplify(N, DCI, Subtarget))
12416 static SDValue PerformXORCombine(SDNode *N,
12427 if (SDValue Result = combineSelectAndUseCommutative(N, false, DCI))
12430 if (SDValue Result = PerformSHLSimplify(N, DCI, Subtarget))
12440 static SDValue ParseBFI(SDNode *N, APInt &ToMask, APInt &FromMask) {
12443 SDValue From = N->getOperand(1);
12469 static SDValue FindBFIToCombineWith(SDNode *N) {
12473 SDValue From = ParseBFI(N, ToMask, FromMask);
12474 SDValue To = N->getOperand(0);
12479 SDValue V = To;
12483 SDValue NewFrom = ParseBFI(V.getNode(), NewToMask, NewFromMask);
12513 static SDValue PerformBFICombine(SDNode *N,
12515 SDValue N1 = N->getOperand(1);
12538 SDValue CombineBFI = FindBFIToCombineWith(N);
12544 SDValue From1 = ParseBFI(N, ToMask1, FromMask1);
12547 SDValue From2 = ParseBFI(CombineBFI.getNode(), ToMask2, FromMask2);
12572 static SDValue PerformVMOVRRDCombine(SDNode *N,
12576 SDValue InDouble = N->getOperand(0);
12591 SDValue BasePtr = LD->getBasePtr();
12592 SDValue NewLD1 =
12596 SDValue OffsetPtr = DAG.getNode(ISD::ADD, DL, MVT::i32, BasePtr,
12599 SDValue NewLD2 = DAG.getLoad(MVT::i32, DL, LD->getChain(), OffsetPtr,
12607 SDValue Result = DCI.CombineTo(N, NewLD1, NewLD2);
12616 static SDValue PerformVMOVDRRCombine(SDNode *N, SelectionDAG &DAG) {
12618 SDValue Op0 = N->getOperand(0);
12619 SDValue Op1 = N->getOperand(1);
12648 static SDValue PerformBUILD_VECTORCombine(SDNode *N,
12657 if (SDValue RV = PerformVMOVDRRCombine(N, DAG))
12666 SmallVector<SDValue, 8> Ops;
12669 SDValue V = DAG.getNode(ISD::BITCAST, dl, MVT::f64, N->getOperand(i));
12675 SDValue BV = DAG.getBuildVector(FloatVT, dl, Ops);
12680 static SDValue
12719 SDValue Elt = N->getOperand(Idx);
12747 SDValue Vec = DAG.getUNDEF(VecVT);
12750 SDValue V = N->getOperand(Idx);
12762 SDValue LaneIdx = DAG.getConstant(Idx, dl, MVT::i32);
12771 static SDValue
12774 SDValue Op = N->getOperand(0);
12791 static SDValue PerformInsertEltCombine(SDNode *N,
12805 SDValue Vec = DAG.getNode(ISD::BITCAST, dl, FloatVT, N->getOperand(0));
12806 SDValue V = DAG.getNode(ISD::BITCAST, dl, MVT::f64, N->getOperand(1));
12810 SDValue InsElt = DAG.getNode(ISD::INSERT_VECTOR_ELT, dl, FloatVT,
12817 static SDValue PerformVECTOR_SHUFFLECombine(SDNode *N, SelectionDAG &DAG) {
12828 SDValue Op0 = N->getOperand(0);
12829 SDValue Op1 = N->getOperand(1);
12835 SDValue Concat0Op1 = Op0.getOperand(1);
12836 SDValue Concat1Op1 = Op1.getOperand(1);
12847 SDValue NewConcat = DAG.getNode(ISD::CONCAT_VECTORS, SDLoc(N), VT,
12872 static SDValue CombineBaseUpdate(SDNode *N,
12879 SDValue Addr = N->getOperand(AddrOpIdx);
12978 SDValue Inc = User->getOperand(User->getOperand(0) == Addr ? 1 : 0);
13038 SmallVector<SDValue, 8> Ops;
13059 SDValue &StVal = Ops[Ops.size()-2];
13064 SDValue UpdN = DAG.getMemIntrinsicNode(NewOpc, dl, SDTys, Ops, LoadVT,
13068 SmallVector<SDValue, 5> NewResults;
13075 SDValue &LdVal = NewResults[0];
13088 static SDValue PerformVLDCombine(SDNode *N,
13149 SDValue Ops[] = { VLD->getOperand(0), VLD->getOperand(2) };
13151 SDValue VLDDup = DAG.getMemIntrinsicNode(NewOpc, SDLoc(VLD), SDTys,
13168 std::vector<SDValue> VLDDupResults;
13179 static SDValue PerformVDUPLANECombine(SDNode *N,
13181 SDValue Op = N->getOperand(0);
13210 static SDValue PerformVDUPCombine(SDNode *N,
13214 SDValue Op = N->getOperand(0);
13225 SDValue Ops[] = { LD->getOperand(0), LD->getOperand(1),
13228 SDValue VLDDup = DAG.getMemIntrinsicNode(ARMISD::VLD1DUP, SDLoc(N), SDTys,
13238 static SDValue PerformLOADCombine(SDNode *N,
13253 static SDValue PerformTruncatingStoreCombine(StoreSDNode *St,
13255 SDValue StVal = St->getValue();
13284 SDValue WideVec = DAG.getNode(ISD::BITCAST, DL, WideVecVT, StVal);
13294 SDValue Shuff = DAG.getVectorShuffle(
13314 SDValue ShuffWide = DAG.getNode(ISD::BITCAST, DL, StoreVecVT, Shuff);
13315 SmallVector<SDValue, 8> Chains;
13316 SDValue Increment = DAG.getConstant(StoreType.getSizeInBits() / 8, DL,
13318 SDValue BasePtr = St->getBasePtr();
13323 SDValue SubVec = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, StoreType,
13325 SDValue Ch =
13338 static SDValue PerformSplittingToNarrowingStores(StoreSDNode *St,
13342 SDValue Trunc = St->getValue();
13364 SDValue Ch = St->getChain();
13365 SDValue BasePtr = St->getBasePtr();
13373 SmallVector<SDValue, 4> Stores;
13376 SDValue NewPtr = DAG.getObjectPtrOffset(DL, BasePtr, NewOffset);
13378 SDValue Extract =
13381 SDValue Store = DAG.getTruncStore(
13391 static SDValue PerformSTORECombine(SDNode *N,
13397 SDValue StVal = St->getValue();
13401 if (SDValue Store = PerformTruncatingStoreCombine(St, DCI.DAG))
13405 if (SDValue NewToken = PerformSplittingToNarrowingStores(St, DCI.DAG))
13418 SDValue BasePtr = St->getBasePtr();
13419 SDValue NewST1 = DAG.getStore(
13424 SDValue OffsetPtr = DAG.getNode(ISD::ADD, DL, MVT::i32, BasePtr,
13440 SDValue IntVec = StVal.getOperand(0);
13443 SDValue Vec = DAG.getNode(ISD::BITCAST, dl, FloatVT, IntVec);
13444 SDValue ExtElt = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, MVT::f64,
13447 SDValue V = DAG.getNode(ISD::BITCAST, dl, MVT::i64, ExtElt);
13474 static SDValue PerformVCVTCombine(SDNode *N, SelectionDAG &DAG,
13479 SDValue Op = N->getOperand(0);
13484 SDValue ConstVec = Op->getOperand(1);
13511 SDValue FixConv = DAG.getNode(
13531 static SDValue PerformVDIVCombine(SDNode *N, SelectionDAG &DAG,
13536 SDValue Op = N->getOperand(0);
13542 SDValue ConstVec = N->getOperand(1);
13567 SDValue ConvInput = Op.getOperand(0);
13582 static SDValue PerformIntrinsicCombine(SDNode *N, SelectionDAG &DAG) {
13741 static SDValue PerformShiftCombine(SDNode *N,
13749 SDValue N1 = N->getOperand(1);
13751 SDValue N0 = N->getOperand(0);
13768 SDValue N0 = N->getOperand(0);
13784 SDValue SHL = DAG.getNode(ISD::SHL, DL, MVT::i32, N0->getOperand(0),
13829 static SDValue PerformSplittingToWideningLoad(SDNode *N, SelectionDAG &DAG) {
13830 SDValue N0 = N->getOperand(0);
13858 SDValue Ch = LD->getChain();
13859 SDValue BasePtr = LD->getBasePtr();
13866 SDValue Offset = DAG.getUNDEF(BasePtr.getValueType());
13870 SDValue NewPtr = DAG.getObjectPtrOffset(DL, BasePtr, NewOffset);
13876 SDValue NewLoad1 =
13879 SDValue NewLoad2 =
13884 SDValue NewChain = DAG.getNode(ISD::TokenFactor, DL, MVT::Other,
13893 static SDValue PerformExtendCombine(SDNode *N, SelectionDAG &DAG,
13895 SDValue N0 = N->getOperand(0);
13902 SDValue Vec = N0.getOperand(0);
13903 SDValue Lane = N0.getOperand(1);
13929 if (SDValue NewLoad = PerformSplittingToWideningLoad(N, DAG))
13935 static const APInt *isPowerOf2Constant(SDValue V) {
13943 SDValue ARMTargetLowering::PerformCMOVToBFICombine(SDNode *CMOV, SelectionDAG &DAG) const {
13957 SDValue Op0 = CMOV->getOperand(0);
13958 SDValue Op1 = CMOV->getOperand(1);
13961 SDValue CmpZ = CMOV->getOperand(4);
13968 SDValue And = CmpZ->getOperand(0);
13974 SDValue X = And->getOperand(0);
13990 SDValue Y = Op1->getOperand(0);
14008 SDValue V = Y;
14039 static SDValue SearchLoopIntrinsic(SDValue N, ISD::CondCode &CC, int &Imm,
14039 static SDValue SearchLoopIntrinsic(SDValue N, ISD::CondCode &CC, int &Imm,
14076 static SDValue PerformHWLoopCombine(SDNode *N,
14092 SDValue Cond;
14095 SDValue Chain = N->getOperand(0);
14096 SDValue Dest;
14115 SDValue Int = SearchLoopIntrinsic(Cond, CC, Imm, Negate);
14143 SDValue Elements = Int.getOperand(2);
14148 SDValue OtherTarget = Br->getOperand(1);
14152 SDValue NewBrOps[] = { Br->getOperand(0), Dest };
14153 SDValue NewBr = DAG.getNode(ISD::BR, SDLoc(Br), MVT::Other, NewBrOps);
14158 SDValue Res;
14161 SDValue Ops[] = { Chain, Elements, Dest };
14168 SDValue Ops[] = { Chain, Elements, OtherTarget };
14174 SDValue Size = DAG.getTargetConstant(
14176 SDValue Args[] = { Int.getOperand(0), Elements, Size, };
14177 SDValue LoopDec = DAG.getNode(ARMISD::LOOP_DEC, dl,
14182 SDValue Target = IsFalseIfZero(CC, Imm) ? Dest : OtherTarget;
14192 SDValue EndArgs[] = { Chain, SDValue(LoopDec.getNode(), 0), Target };
14199 SDValue
14201 SDValue Cmp = N->getOperand(4);
14208 SDValue LHS = Cmp.getOperand(0);
14209 SDValue RHS = Cmp.getOperand(1);
14210 SDValue Chain = N->getOperand(0);
14211 SDValue BB = N->getOperand(1);
14212 SDValue ARMcc = N->getOperand(2);
14239 SDValue
14241 SDValue Cmp = N->getOperand(4);
14248 SDValue LHS = Cmp.getOperand(0);
14249 SDValue RHS = Cmp.getOperand(1);
14250 SDValue FalseVal = N->getOperand(0);
14251 SDValue TrueVal = N->getOperand(1);
14252 SDValue ARMcc = N->getOperand(2);
14258 SDValue R = PerformCMOVToBFICombine(N, DAG);
14280 SDValue Res;
14285 SDValue ARMcc;
14286 SDValue NewCmp = getARMCmp(LHS, RHS, ISD::SETNE, ARMcc, DAG, dl);
14316 SDValue Sub = DAG.getNode(ISD::SUB, dl, VT, LHS, RHS);
14329 SDValue Sub = DAG.getNode(ISD::SUB, dl, VT, LHS, RHS);
14331 SDValue Neg = DAG.getNode(ISD::USUBO, dl, VTs, FalseVal, Sub);
14334 SDValue Carry =
14343 SDValue Sub =
14345 SDValue CPSRGlue = DAG.getCopyToReg(DAG.getEntryNode(), dl, ARM::CPSR,
14357 SDValue Sub =
14359 SDValue CPSRGlue = DAG.getCopyToReg(DAG.getEntryNode(), dl, ARM::CPSR,
14391 SDValue Subc = DAG.getNode(ISD::USUBO, dl, VTs, FalseVal, TrueVal);
14416 SDValue ARMTargetLowering::PerformDAGCombine(SDNode *N,
14692 bool ARMTargetLowering::isZExtFree(SDValue Val, EVT VT2) const {
14809 bool ARMTargetLowering::isVectorLoadExtDesirable(SDValue ExtVal) const {
15124 bool isSEXTLoad, SDValue &Base,
15125 SDValue &Offset, bool &isInc,
15183 bool isSEXTLoad, SDValue &Base,
15184 SDValue &Offset, bool &isInc,
15208 bool isSEXTLoad, bool isLE, SDValue &Base,
15209 SDValue &Offset, bool &isInc,
15257 ARMTargetLowering::getPreIndexedAddressParts(SDNode *N, SDValue &Base,
15258 SDValue &Offset,
15265 SDValue Ptr;
15306 SDValue &Base,
15307 SDValue &Offset,
15311 SDValue Ptr;
15378 void ARMTargetLowering::computeKnownBitsForTargetNode(const SDValue Op,
15393 SDValue LHS = Op.getOperand(0);
15394 SDValue RHS = Op.getOperand(1);
15443 const SDValue &SrcSV = Op.getOperand(0);
15472 ARMTargetLowering::targetShrinkDemandedConstant(SDValue Op,
15521 SDValue NewC = TLO.DAG.getConstant(NewMask, DL, VT);
15522 SDValue NewOp = TLO.DAG.getNode(ISD::AND, DL, VT, Op.getOperand(0), NewC);
15751 void ARMTargetLowering::LowerAsmOperandForConstraint(SDValue Op,
15753 std::vector<SDValue>&Ops,
15755 SDValue Result;
15957 SDValue ARMTargetLowering::LowerDivRem(SDValue Op, SelectionDAG &DAG) const {
15957 SDValue ARMTargetLowering::LowerDivRem(SDValue Op, SelectionDAG &DAG) const {
15980 const SDValue Dividend = Op->getOperand(0);
15981 const SDValue Divisor = Op->getOperand(1);
15982 SDValue Div = DAG.getNode(DivOpcode, dl, VT, Dividend, Divisor);
15983 SDValue Mul = DAG.getNode(ISD::MUL, dl, VT, Div, Divisor);
15984 SDValue Rem = DAG.getNode(ISD::SUB, dl, VT, Dividend, Mul);
15986 SDValue Values[2] = {Div, Rem};
15992 SDValue InChain = DAG.getEntryNode();
15998 SDValue Callee = DAG.getExternalSymbol(getLibcallName(LC),
16011 std::pair<SDValue, SDValue> CallInfo = LowerCallTo(CLI);
16011 std::pair<SDValue, SDValue> CallInfo = LowerCallTo(CLI);
16017 SDValue ARMTargetLowering::LowerREM(SDNode *N, SelectionDAG &DAG) const {
16037 SDValue InChain = DAG.getEntryNode();
16041 SDValue Callee = DAG.getExternalSymbol(getLibcallName(LC),
16052 std::pair<SDValue, SDValue> CallResult = LowerCallTo(CLI);
16052 std::pair<SDValue, SDValue> CallResult = LowerCallTo(CLI);
16060 SDValue
16061 ARMTargetLowering::LowerDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG) const {
16066 SDValue Chain = Op.getOperand(0);
16067 SDValue Size = Op.getOperand(1);
16072 SDValue SP = DAG.getCopyFromReg(Chain, DL, ARM::SP, MVT::i32);
16079 SDValue Ops[2] = { SP, Chain };
16083 SDValue Words = DAG.getNode(ISD::SRL, DL, MVT::i32, Size,
16086 SDValue Flag;
16093 SDValue NewSP = DAG.getCopyFromReg(Chain, DL, ARM::SP, MVT::i32);
16096 SDValue Ops[2] = { NewSP, Chain };
16100 SDValue ARMTargetLowering::LowerFP_EXTEND(SDValue Op, SelectionDAG &DAG) const {
16100 SDValue ARMTargetLowering::LowerFP_EXTEND(SDValue Op, SelectionDAG &DAG) const {
16101 SDValue SrcVal = Op.getOperand(0);
16147 SDValue ARMTargetLowering::LowerFP_ROUND(SDValue Op, SelectionDAG &DAG) const {
16147 SDValue ARMTargetLowering::LowerFP_ROUND(SDValue Op, SelectionDAG &DAG) const {
16148 SDValue SrcVal = Op.getOperand(0);
16174 void ARMTargetLowering::lowerABS(SDNode *N, SmallVectorImpl<SDValue> &Results,
16179 SDValue Hi, Lo, Tmp;
lib/Target/ARM/ARMISelLowering.h 304 SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
304 SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
308 void ReplaceNodeResults(SDNode *N, SmallVectorImpl<SDValue>&Results,
331 SDValue PerformCMOVCombine(SDNode *N, SelectionDAG &DAG) const;
332 SDValue PerformBRCONDCombine(SDNode *N, SelectionDAG &DAG) const;
333 SDValue PerformCMOVToBFICombine(SDNode *N, SelectionDAG &DAG) const;
334 SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const override;
354 bool isZExtFree(SDValue Val, EVT VT2) const override;
360 bool isVectorLoadExtDesirable(SDValue ExtVal) const override;
399 bool getPreIndexedAddressParts(SDNode *N, SDValue &Base, SDValue &Offset,
399 bool getPreIndexedAddressParts(SDNode *N, SDValue &Base, SDValue &Offset,
406 bool getPostIndexedAddressParts(SDNode *N, SDNode *Op, SDValue &Base,
407 SDValue &Offset, ISD::MemIndexedMode &AM,
410 void computeKnownBitsForTargetNode(const SDValue Op, KnownBits &Known,
415 bool targetShrinkDemandedConstant(SDValue Op, const APInt &Demanded,
438 void LowerAsmOperandForConstraint(SDValue Op, std::string &Constraint,
439 std::vector<SDValue> &Ops,
657 std::pair<SDValue, SDValue> getARMXALUOOp(SDValue Op, SelectionDAG &DAG, SDValue &ARMcc) const;
657 std::pair<SDValue, SDValue> getARMXALUOOp(SDValue Op, SelectionDAG &DAG, SDValue &ARMcc) const;
657 std::pair<SDValue, SDValue> getARMXALUOOp(SDValue Op, SelectionDAG &DAG, SDValue &ARMcc) const;
657 std::pair<SDValue, SDValue> getARMXALUOOp(SDValue Op, SelectionDAG &DAG, SDValue &ARMcc) const;
659 using RegsToPassVector = SmallVector<std::pair<unsigned, SDValue>, 8>;
661 void PassF64ArgInRegs(const SDLoc &dl, SelectionDAG &DAG, SDValue Chain,
662 SDValue &Arg, RegsToPassVector &RegsToPass,
664 SDValue &StackPtr,
665 SmallVectorImpl<SDValue> &MemOpChains,
667 SDValue GetF64FormalArgument(CCValAssign &VA, CCValAssign &NextVA,
668 SDValue &Root, SelectionDAG &DAG,
675 SDValue LowerMemOpCallTo(SDValue Chain, SDValue StackPtr, SDValue Arg,
675 SDValue LowerMemOpCallTo(SDValue Chain, SDValue StackPtr, SDValue Arg,
675 SDValue LowerMemOpCallTo(SDValue Chain, SDValue StackPtr, SDValue Arg,
675 SDValue LowerMemOpCallTo(SDValue Chain, SDValue StackPtr, SDValue Arg,
679 SDValue LowerEH_SJLJ_SETJMP(SDValue Op, SelectionDAG &DAG) const;
679 SDValue LowerEH_SJLJ_SETJMP(SDValue Op, SelectionDAG &DAG) const;
680 SDValue LowerEH_SJLJ_LONGJMP(SDValue Op, SelectionDAG &DAG) const;
680 SDValue LowerEH_SJLJ_LONGJMP(SDValue Op, SelectionDAG &DAG) const;
681 SDValue LowerEH_SJLJ_SETUP_DISPATCH(SDValue Op, SelectionDAG &DAG) const;
681 SDValue LowerEH_SJLJ_SETUP_DISPATCH(SDValue Op, SelectionDAG &DAG) const;
682 SDValue LowerINTRINSIC_VOID(SDValue Op, SelectionDAG &DAG,
682 SDValue LowerINTRINSIC_VOID(SDValue Op, SelectionDAG &DAG,
684 SDValue LowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG,
684 SDValue LowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG,
686 SDValue LowerBlockAddress(SDValue Op, SelectionDAG &DAG) const;
686 SDValue LowerBlockAddress(SDValue Op, SelectionDAG &DAG) const;
687 SDValue LowerConstantPool(SDValue Op, SelectionDAG &DAG) const;
687 SDValue LowerConstantPool(SDValue Op, SelectionDAG &DAG) const;
688 SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const;
688 SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const;
689 SDValue LowerGlobalAddressDarwin(SDValue Op, SelectionDAG &DAG) const;
689 SDValue LowerGlobalAddressDarwin(SDValue Op, SelectionDAG &DAG) const;
690 SDValue LowerGlobalAddressELF(SDValue Op, SelectionDAG &DAG) const;
690 SDValue LowerGlobalAddressELF(SDValue Op, SelectionDAG &DAG) const;
691 SDValue LowerGlobalAddressWindows(SDValue Op, SelectionDAG &DAG) const;
691 SDValue LowerGlobalAddressWindows(SDValue Op, SelectionDAG &DAG) const;
692 SDValue LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const;
692 SDValue LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const;
693 SDValue LowerToTLSGeneralDynamicModel(GlobalAddressSDNode *GA,
695 SDValue LowerToTLSExecModels(GlobalAddressSDNode *GA,
698 SDValue LowerGlobalTLSAddressDarwin(SDValue Op, SelectionDAG &DAG) const;
698 SDValue LowerGlobalTLSAddressDarwin(SDValue Op, SelectionDAG &DAG) const;
699 SDValue LowerGlobalTLSAddressWindows(SDValue Op, SelectionDAG &DAG) const;
699 SDValue LowerGlobalTLSAddressWindows(SDValue Op, SelectionDAG &DAG) const;
700 SDValue LowerGLOBAL_OFFSET_TABLE(SDValue Op, SelectionDAG &DAG) const;
700 SDValue LowerGLOBAL_OFFSET_TABLE(SDValue Op, SelectionDAG &DAG) const;
701 SDValue LowerBR_JT(SDValue Op, SelectionDAG &DAG) const;
701 SDValue LowerBR_JT(SDValue Op, SelectionDAG &DAG) const;
702 SDValue LowerSignedALUO(SDValue Op, SelectionDAG &DAG) const;
702 SDValue LowerSignedALUO(SDValue Op, SelectionDAG &DAG) const;
703 SDValue LowerUnsignedALUO(SDValue Op, SelectionDAG &DAG) const;
703 SDValue LowerUnsignedALUO(SDValue Op, SelectionDAG &DAG) const;
704 SDValue LowerSELECT(SDValue Op, SelectionDAG &DAG) const;
704 SDValue LowerSELECT(SDValue Op, SelectionDAG &DAG) const;
705 SDValue LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const;
705 SDValue LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const;
706 SDValue LowerBRCOND(SDValue Op, SelectionDAG &DAG) const;
706 SDValue LowerBRCOND(SDValue Op, SelectionDAG &DAG) const;
707 SDValue LowerBR_CC(SDValue Op, SelectionDAG &DAG) const;
707 SDValue LowerBR_CC(SDValue Op, SelectionDAG &DAG) const;
708 SDValue LowerFCOPYSIGN(SDValue Op, SelectionDAG &DAG) const;
708 SDValue LowerFCOPYSIGN(SDValue Op, SelectionDAG &DAG) const;
709 SDValue LowerRETURNADDR(SDValue Op, SelectionDAG &DAG) const;
709 SDValue LowerRETURNADDR(SDValue Op, SelectionDAG &DAG) const;
710 SDValue LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const;
710 SDValue LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const;
711 SDValue LowerShiftRightParts(SDValue Op, SelectionDAG &DAG) const;
711 SDValue LowerShiftRightParts(SDValue Op, SelectionDAG &DAG) const;
712 SDValue LowerShiftLeftParts(SDValue Op, SelectionDAG &DAG) const;
712 SDValue LowerShiftLeftParts(SDValue Op, SelectionDAG &DAG) const;
713 SDValue LowerFLT_ROUNDS_(SDValue Op, SelectionDAG &DAG) const;
713 SDValue LowerFLT_ROUNDS_(SDValue Op, SelectionDAG &DAG) const;
714 SDValue LowerConstantFP(SDValue Op, SelectionDAG &DAG,
714 SDValue LowerConstantFP(SDValue Op, SelectionDAG &DAG,
716 SDValue LowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG,
716 SDValue LowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG,
718 SDValue LowerINSERT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const;
718 SDValue LowerINSERT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const;
719 SDValue LowerFSINCOS(SDValue Op, SelectionDAG &DAG) const;
719 SDValue LowerFSINCOS(SDValue Op, SelectionDAG &DAG) const;
720 SDValue LowerDivRem(SDValue Op, SelectionDAG &DAG) const;
720 SDValue LowerDivRem(SDValue Op, SelectionDAG &DAG) const;
721 SDValue LowerDIV_Windows(SDValue Op, SelectionDAG &DAG, bool Signed) const;
721 SDValue LowerDIV_Windows(SDValue Op, SelectionDAG &DAG, bool Signed) const;
722 void ExpandDIV_Windows(SDValue Op, SelectionDAG &DAG, bool Signed,
723 SmallVectorImpl<SDValue> &Results) const;
724 SDValue LowerWindowsDIVLibCall(SDValue Op, SelectionDAG &DAG, bool Signed,
724 SDValue LowerWindowsDIVLibCall(SDValue Op, SelectionDAG &DAG, bool Signed,
725 SDValue &Chain) const;
726 SDValue LowerREM(SDNode *N, SelectionDAG &DAG) const;
727 SDValue LowerDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG) const;
727 SDValue LowerDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG) const;
728 SDValue LowerFP_ROUND(SDValue Op, SelectionDAG &DAG) const;
728 SDValue LowerFP_ROUND(SDValue Op, SelectionDAG &DAG) const;
729 SDValue LowerFP_EXTEND(SDValue Op, SelectionDAG &DAG) const;
729 SDValue LowerFP_EXTEND(SDValue Op, SelectionDAG &DAG) const;
730 SDValue LowerFP_TO_INT(SDValue Op, SelectionDAG &DAG) const;
730 SDValue LowerFP_TO_INT(SDValue Op, SelectionDAG &DAG) const;
731 SDValue LowerINT_TO_FP(SDValue Op, SelectionDAG &DAG) const;
731 SDValue LowerINT_TO_FP(SDValue Op, SelectionDAG &DAG) const;
732 void lowerABS(SDNode *N, SmallVectorImpl<SDValue> &Results,
738 SDValue BuildSDIVPow2(SDNode *N, const APInt &Divisor, SelectionDAG &DAG,
752 SDValue ReconstructShuffle(SDValue Op, SelectionDAG &DAG) const;
752 SDValue ReconstructShuffle(SDValue Op, SelectionDAG &DAG) const;
754 SDValue LowerCallResult(SDValue Chain, SDValue InFlag,
754 SDValue LowerCallResult(SDValue Chain, SDValue InFlag,
754 SDValue LowerCallResult(SDValue Chain, SDValue InFlag,
758 SmallVectorImpl<SDValue> &InVals, bool isThisReturn,
759 SDValue ThisVal) const;
771 SDValue
772 LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
775 SmallVectorImpl<SDValue> &InVals) const override;
778 SDValue &Chain, const Value *OrigArg,
783 const SDLoc &dl, SDValue &Chain,
787 SDValue LowerCall(TargetLowering::CallLoweringInfo &CLI,
788 SmallVectorImpl<SDValue> &InVals) const override;
797 SDValue Callee, CallingConv::ID CalleeCC, bool isVarArg,
800 const SmallVectorImpl<SDValue> &OutVals,
809 SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
809 SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
811 const SmallVectorImpl<SDValue> &OutVals,
814 bool isUsedByReturnOnly(SDNode *N, SDValue &Chain) const override;
822 SDValue getCMOV(const SDLoc &dl, EVT VT, SDValue FalseVal, SDValue TrueVal,
822 SDValue getCMOV(const SDLoc &dl, EVT VT, SDValue FalseVal, SDValue TrueVal,
822 SDValue getCMOV(const SDLoc &dl, EVT VT, SDValue FalseVal, SDValue TrueVal,
823 SDValue ARMcc, SDValue CCR, SDValue Cmp,
823 SDValue ARMcc, SDValue CCR, SDValue Cmp,
823 SDValue ARMcc, SDValue CCR, SDValue Cmp,
825 SDValue getARMCmp(SDValue LHS, SDValue RHS, ISD::CondCode CC,
825 SDValue getARMCmp(SDValue LHS, SDValue RHS, ISD::CondCode CC,
825 SDValue getARMCmp(SDValue LHS, SDValue RHS, ISD::CondCode CC,
826 SDValue &ARMcc, SelectionDAG &DAG, const SDLoc &dl) const;
827 SDValue getVFPCmp(SDValue LHS, SDValue RHS, SelectionDAG &DAG,
827 SDValue getVFPCmp(SDValue LHS, SDValue RHS, SelectionDAG &DAG,
827 SDValue getVFPCmp(SDValue LHS, SDValue RHS, SelectionDAG &DAG,
829 SDValue duplicateCmp(SDValue Cmp, SelectionDAG &DAG) const;
829 SDValue duplicateCmp(SDValue Cmp, SelectionDAG &DAG) const;
831 SDValue OptimizeVFPBrcond(SDValue Op, SelectionDAG &DAG) const;
831 SDValue OptimizeVFPBrcond(SDValue Op, SelectionDAG &DAG) const;
lib/Target/ARM/ARMSelectionDAGInfo.cpp 23 SDValue ARMSelectionDAGInfo::EmitSpecializedLibcall(
24 SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src,
24 SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src,
24 SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src,
25 SDValue Size, unsigned Align, RTLIB::Libcall LC) const {
122 std::pair<SDValue,SDValue> CallResult = TLI->LowerCallTo(CLI);
122 std::pair<SDValue,SDValue> CallResult = TLI->LowerCallTo(CLI);
127 SDValue ARMSelectionDAGInfo::EmitTargetCodeForMemcpy(
128 SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src,
128 SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src,
128 SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src,
129 SDValue Size, unsigned Align, bool isVolatile, bool AlwaysInline,
156 SDValue TFOps[6];
157 SDValue Loads[6];
241 SDValue ARMSelectionDAGInfo::EmitTargetCodeForMemmove(
242 SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src,
242 SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src,
242 SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src,
243 SDValue Size, unsigned Align, bool isVolatile,
249 SDValue ARMSelectionDAGInfo::EmitTargetCodeForMemset(
250 SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src,
250 SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src,
250 SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src,
251 SDValue Size, unsigned Align, bool isVolatile,
lib/Target/ARM/ARMSelectionDAGInfo.h 40 SDValue EmitTargetCodeForMemcpy(SelectionDAG &DAG, const SDLoc &dl,
41 SDValue Chain, SDValue Dst, SDValue Src,
41 SDValue Chain, SDValue Dst, SDValue Src,
41 SDValue Chain, SDValue Dst, SDValue Src,
42 SDValue Size, unsigned Align, bool isVolatile,
47 SDValue
48 EmitTargetCodeForMemmove(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain,
49 SDValue Dst, SDValue Src, SDValue Size,
49 SDValue Dst, SDValue Src, SDValue Size,
49 SDValue Dst, SDValue Src, SDValue Size,
55 SDValue EmitTargetCodeForMemset(SelectionDAG &DAG, const SDLoc &dl,
56 SDValue Chain, SDValue Op1, SDValue Op2,
56 SDValue Chain, SDValue Op1, SDValue Op2,
56 SDValue Chain, SDValue Op1, SDValue Op2,
57 SDValue Op3, unsigned Align, bool isVolatile,
60 SDValue EmitSpecializedLibcall(SelectionDAG &DAG, const SDLoc &dl,
61 SDValue Chain, SDValue Dst, SDValue Src,
61 SDValue Chain, SDValue Dst, SDValue Src,
61 SDValue Chain, SDValue Dst, SDValue Src,
62 SDValue Size, unsigned Align,
lib/Target/AVR/AVRISelDAGToDAG.cpp 38 bool SelectAddr(SDNode *Op, SDValue N, SDValue &Base, SDValue &Disp);
38 bool SelectAddr(SDNode *Op, SDValue N, SDValue &Base, SDValue &Disp);
38 bool SelectAddr(SDNode *Op, SDValue N, SDValue &Base, SDValue &Disp);
43 bool SelectInlineAsmMemoryOperand(const SDValue &Op, unsigned ConstraintCode,
44 std::vector<SDValue> &OutOps) override;
64 bool AVRDAGToDAGISel::SelectAddr(SDNode *Op, SDValue N, SDValue &Base,
64 bool AVRDAGToDAGISel::SelectAddr(SDNode *Op, SDValue N, SDValue &Base,
65 SDValue &Disp) {
202 bool AVRDAGToDAGISel::SelectInlineAsmMemoryOperand(const SDValue &Op,
204 std::vector<SDValue> &OutOps) {
225 SDValue Base, Disp;
240 SDValue CopyFromRegOp = Op->getOperand(0);
241 SDValue ImmOp = Op->getOperand(1);
263 SDValue Base, Disp;
270 SDValue CopyToReg =
273 SDValue NewCopyFromRegOp =
299 SDValue CopyToReg = CurDAG->getCopyToReg(Op, dl, VReg, Op);
300 SDValue CopyFromReg =
314 SDValue TFI =
327 SDValue BasePtr = ST->getBasePtr();
342 SDValue Chain = ST->getChain();
345 SDValue Offset = CurDAG->getTargetConstant(CST, DL, MVT::i16);
346 SDValue Ops[] = {BasePtr.getOperand(0), Offset, ST->getValue(), Chain};
372 SDValue Chain = LD->getChain();
373 SDValue Ptr = LD->getBasePtr();
381 SDValue RegZ = CurDAG->getRegister(AVR::R31R30, MVT::i16);
417 SDValue InFlag;
418 SDValue Chain = N->getOperand(0);
419 SDValue Callee = N->getOperand(1);
435 SmallVector<SDValue, 8> Ops;
457 SDValue Chain = N->getOperand(0);
458 SDValue JmpAddr = N->getOperand(1);
480 SDValue Lhs = N->getOperand(0);
481 SDValue Rhs = N->getOperand(1);
483 SDValue InChain = CurDAG->getEntryNode();
484 SDValue InGlue = SDValue(Mul, 0);
488 SDValue CopyFromLo =
499 SDValue CopyFromHi =
lib/Target/AVR/AVRISelLowering.cpp 278 SDValue AVRTargetLowering::LowerShifts(SDValue Op, SelectionDAG &DAG) const {
278 SDValue AVRTargetLowering::LowerShifts(SDValue Op, SelectionDAG &DAG) const {
310 SDValue Victim = N->getOperand(0);
339 SDValue AVRTargetLowering::LowerDivRem(SDValue Op, SelectionDAG &DAG) const {
339 SDValue AVRTargetLowering::LowerDivRem(SDValue Op, SelectionDAG &DAG) const {
368 SDValue InChain = DAG.getEntryNode();
372 for (SDValue const &Value : Op->op_values()) {
380 SDValue Callee = DAG.getExternalSymbol(getLibcallName(LC),
394 std::pair<SDValue, SDValue> CallInfo = LowerCallTo(CLI);
394 std::pair<SDValue, SDValue> CallInfo = LowerCallTo(CLI);
398 SDValue AVRTargetLowering::LowerGlobalAddress(SDValue Op,
398 SDValue AVRTargetLowering::LowerGlobalAddress(SDValue Op,
406 SDValue Result =
411 SDValue AVRTargetLowering::LowerBlockAddress(SDValue Op,
411 SDValue AVRTargetLowering::LowerBlockAddress(SDValue Op,
416 SDValue Result = DAG.getTargetBlockAddress(BA, getPointerTy(DL));
443 SDValue AVRTargetLowering::getAVRCmp(SDValue LHS, SDValue RHS, ISD::CondCode CC,
443 SDValue AVRTargetLowering::getAVRCmp(SDValue LHS, SDValue RHS, ISD::CondCode CC,
443 SDValue AVRTargetLowering::getAVRCmp(SDValue LHS, SDValue RHS, ISD::CondCode CC,
444 SDValue &AVRcc, SelectionDAG &DAG,
446 SDValue Cmp;
538 SDValue LHSlo = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i16, LHS,
540 SDValue LHShi = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i16, LHS,
542 SDValue RHSlo = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i16, RHS,
544 SDValue RHShi = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i16, RHS,
549 SDValue Top = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i8, LHShi,
557 SDValue LHS_0 = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i32, LHS,
559 SDValue LHS_1 = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i32, LHS,
562 SDValue LHS0 = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i16, LHS_0,
564 SDValue LHS1 = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i16, LHS_0,
566 SDValue LHS2 = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i16, LHS_1,
568 SDValue LHS3 = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i16, LHS_1,
571 SDValue RHS_0 = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i32, RHS,
573 SDValue RHS_1 = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i32, RHS,
576 SDValue RHS0 = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i16, RHS_0,
578 SDValue RHS1 = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i16, RHS_0,
580 SDValue RHS2 = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i16, RHS_1,
582 SDValue RHS3 = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i16, RHS_1,
587 SDValue Top = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i8, LHS3,
619 SDValue AVRTargetLowering::LowerBR_CC(SDValue Op, SelectionDAG &DAG) const {
619 SDValue AVRTargetLowering::LowerBR_CC(SDValue Op, SelectionDAG &DAG) const {
620 SDValue Chain = Op.getOperand(0);
622 SDValue LHS = Op.getOperand(2);
623 SDValue RHS = Op.getOperand(3);
624 SDValue Dest = Op.getOperand(4);
627 SDValue TargetCC;
628 SDValue Cmp = getAVRCmp(LHS, RHS, CC, TargetCC, DAG, dl);
634 SDValue AVRTargetLowering::LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const {
634 SDValue AVRTargetLowering::LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const {
635 SDValue LHS = Op.getOperand(0);
636 SDValue RHS = Op.getOperand(1);
637 SDValue TrueV = Op.getOperand(2);
638 SDValue FalseV = Op.getOperand(3);
642 SDValue TargetCC;
643 SDValue Cmp = getAVRCmp(LHS, RHS, CC, TargetCC, DAG, dl);
646 SDValue Ops[] = {TrueV, FalseV, TargetCC, Cmp};
651 SDValue AVRTargetLowering::LowerSETCC(SDValue Op, SelectionDAG &DAG) const {
651 SDValue AVRTargetLowering::LowerSETCC(SDValue Op, SelectionDAG &DAG) const {
652 SDValue LHS = Op.getOperand(0);
653 SDValue RHS = Op.getOperand(1);
657 SDValue TargetCC;
658 SDValue Cmp = getAVRCmp(LHS, RHS, CC, TargetCC, DAG, DL);
660 SDValue TrueV = DAG.getConstant(1, DL, Op.getValueType());
661 SDValue FalseV = DAG.getConstant(0, DL, Op.getValueType());
663 SDValue Ops[] = {TrueV, FalseV, TargetCC, Cmp};
668 SDValue AVRTargetLowering::LowerVASTART(SDValue Op, SelectionDAG &DAG) const {
668 SDValue AVRTargetLowering::LowerVASTART(SDValue Op, SelectionDAG &DAG) const {
677 SDValue FI = DAG.getFrameIndex(AFI->getVarArgsFrameIndex(), getPointerTy(DL));
683 SDValue AVRTargetLowering::LowerOperation(SDValue Op, SelectionDAG &DAG) const {
683 SDValue AVRTargetLowering::LowerOperation(SDValue Op, SelectionDAG &DAG) const {
716 SmallVectorImpl<SDValue> &Results,
724 SDValue Sub = DAG.getNode(
732 SDValue Res = LowerOperation(SDValue(N, 0), DAG);
772 bool AVRTargetLowering::getPreIndexedAddressParts(SDNode *N, SDValue &Base,
773 SDValue &Offset,
829 SDValue &Base,
830 SDValue &Offset,
915 SDValue Callee = CLI.Callee;
1049 SDValue AVRTargetLowering::LowerFormalArguments(
1050 SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
1052 SmallVectorImpl<SDValue> &InVals) const {
1065 SDValue ArgValue;
1122 SDValue FIN = DAG.getFrameIndex(FI, getPointerTy(DL));
1145 SDValue AVRTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
1146 SmallVectorImpl<SDValue> &InVals) const {
1150 SmallVectorImpl<SDValue> &OutVals = CLI.OutVals;
1152 SDValue Chain = CLI.Chain;
1153 SDValue Callee = CLI.Callee;
1192 SmallVector<std::pair<unsigned, SDValue>, 8> RegsToPass;
1200 SDValue Arg = OutVals[AI];
1242 SDValue Arg = OutVals[Loc];
1247 SDValue PtrOff = DAG.getNode(
1262 SDValue InFlag;
1270 SmallVector<SDValue, 8> Ops;
1311 SDValue AVRTargetLowering::LowerCallResult(
1312 SDValue Chain, SDValue InFlag, CallingConv::ID CallConv, bool isVarArg,
1312 SDValue Chain, SDValue InFlag, CallingConv::ID CallConv, bool isVarArg,
1314 SmallVectorImpl<SDValue> &InVals) const {
1369 SDValue
1370 AVRTargetLowering::LowerReturn(SDValue Chain, CallingConv::ID CallConv,
1373 const SmallVectorImpl<SDValue> &OutVals,
1397 SDValue Flag;
1398 SmallVector<SDValue, 4> RetOps(1, Chain);
1902 void AVRTargetLowering::LowerAsmOperandForConstraint(SDValue Op,
1904 std::vector<SDValue> &Ops,
1906 SDValue Result(0, 0);
lib/Target/AVR/AVRISelLowering.h 86 SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
86 SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
88 void ReplaceNodeResults(SDNode *N, SmallVectorImpl<SDValue> &Results,
95 bool getPreIndexedAddressParts(SDNode *N, SDValue &Base, SDValue &Offset,
95 bool getPreIndexedAddressParts(SDNode *N, SDValue &Base, SDValue &Offset,
99 bool getPostIndexedAddressParts(SDNode *N, SDNode *Op, SDValue &Base,
100 SDValue &Offset, ISD::MemIndexedMode &AM,
124 void LowerAsmOperandForConstraint(SDValue Op, std::string &Constraint,
125 std::vector<SDValue> &Ops,
137 SDValue getAVRCmp(SDValue LHS, SDValue RHS, ISD::CondCode CC, SDValue &AVRcc,
137 SDValue getAVRCmp(SDValue LHS, SDValue RHS, ISD::CondCode CC, SDValue &AVRcc,
137 SDValue getAVRCmp(SDValue LHS, SDValue RHS, ISD::CondCode CC, SDValue &AVRcc,
137 SDValue getAVRCmp(SDValue LHS, SDValue RHS, ISD::CondCode CC, SDValue &AVRcc,
139 SDValue LowerShifts(SDValue Op, SelectionDAG &DAG) const;
139 SDValue LowerShifts(SDValue Op, SelectionDAG &DAG) const;
140 SDValue LowerDivRem(SDValue Op, SelectionDAG &DAG) const;
140 SDValue LowerDivRem(SDValue Op, SelectionDAG &DAG) const;
141 SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const;
141 SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const;
142 SDValue LowerBlockAddress(SDValue Op, SelectionDAG &DAG) const;
142 SDValue LowerBlockAddress(SDValue Op, SelectionDAG &DAG) const;
143 SDValue LowerBR_CC(SDValue Op, SelectionDAG &DAG) const;
143 SDValue LowerBR_CC(SDValue Op, SelectionDAG &DAG) const;
144 SDValue LowerINLINEASM(SDValue Op, SelectionDAG &DAG) const;
144 SDValue LowerINLINEASM(SDValue Op, SelectionDAG &DAG) const;
145 SDValue LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const;
145 SDValue LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const;
146 SDValue LowerSETCC(SDValue Op, SelectionDAG &DAG) const;
146 SDValue LowerSETCC(SDValue Op, SelectionDAG &DAG) const;
147 SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG) const;
147 SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG) const;
156 SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
156 SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
158 const SmallVectorImpl<SDValue> &OutVals, const SDLoc &dl,
160 SDValue LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv,
160 SDValue LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv,
164 SmallVectorImpl<SDValue> &InVals) const override;
165 SDValue LowerCall(TargetLowering::CallLoweringInfo &CLI,
166 SmallVectorImpl<SDValue> &InVals) const override;
167 SDValue LowerCallResult(SDValue Chain, SDValue InFlag,
167 SDValue LowerCallResult(SDValue Chain, SDValue InFlag,
167 SDValue LowerCallResult(SDValue Chain, SDValue InFlag,
171 SmallVectorImpl<SDValue> &InVals) const;
lib/Target/BPF/BPFISelDAGToDAG.cpp 62 bool SelectInlineAsmMemoryOperand(const SDValue &Op, unsigned ConstraintCode,
63 std::vector<SDValue> &OutOps) override;
73 bool SelectAddr(SDValue Addr, SDValue &Base, SDValue &Offset);
73 bool SelectAddr(SDValue Addr, SDValue &Base, SDValue &Offset);
73 bool SelectAddr(SDValue Addr, SDValue &Base, SDValue &Offset);
74 bool SelectFIAddr(SDValue Addr, SDValue &Base, SDValue &Offset);
74 bool SelectFIAddr(SDValue Addr, SDValue &Base, SDValue &Offset);
74 bool SelectFIAddr(SDValue Addr, SDValue &Base, SDValue &Offset);
99 bool BPFDAGToDAGISel::SelectAddr(SDValue Addr, SDValue &Base, SDValue &Offset) {
99 bool BPFDAGToDAGISel::SelectAddr(SDValue Addr, SDValue &Base, SDValue &Offset) {
99 bool BPFDAGToDAGISel::SelectAddr(SDValue Addr, SDValue &Base, SDValue &Offset) {
135 bool BPFDAGToDAGISel::SelectFIAddr(SDValue Addr, SDValue &Base,
135 bool BPFDAGToDAGISel::SelectFIAddr(SDValue Addr, SDValue &Base,
136 SDValue &Offset) {
160 const SDValue &Op, unsigned ConstraintCode, std::vector<SDValue> &OutOps) {
160 const SDValue &Op, unsigned ConstraintCode, std::vector<SDValue> &OutOps) {
161 SDValue Op0, Op1;
172 SDValue AluOp = CurDAG->getTargetConstant(ISD::ADD, DL, MVT::i32);;
211 SDValue Chain = Node->getOperand(0);
212 SDValue N1 = Node->getOperand(1);
213 SDValue Skb = Node->getOperand(2);
214 SDValue N3 = Node->getOperand(3);
216 SDValue R6Reg = CurDAG->getRegister(BPF::R6, MVT::i64);
228 SDValue TFI = CurDAG->getTargetFrameIndex(FI, VT);
263 SDValue OP1 = LDAddrNode->getOperand(0);
264 SDValue OP2 = LDAddrNode->getOperand(1);
283 SDValue OP1 = LDAddrNode->getOperand(0);
306 SDValue NVal = CurDAG->getConstant(val, DL, MVT::i64);
311 SDValue From[] = {SDValue(Node, 0), SDValue(Node, 1)};
312 SDValue To[] = {NVal, NVal};
477 SDValue BaseV = Node->getOperand(0);
lib/Target/BPF/BPFISelLowering.cpp 46 SDValue Val) {
190 SDValue BPFTargetLowering::LowerOperation(SDValue Op, SelectionDAG &DAG) const {
190 SDValue BPFTargetLowering::LowerOperation(SDValue Op, SelectionDAG &DAG) const {
206 SDValue BPFTargetLowering::LowerFormalArguments(
207 SDValue Chain, CallingConv::ID CallConv, bool IsVarArg,
209 SelectionDAG &DAG, SmallVectorImpl<SDValue> &InVals) const {
242 SDValue ArgValue = DAG.getCopyFromReg(Chain, DL, VReg, RegVT);
275 SDValue BPFTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
276 SmallVectorImpl<SDValue> &InVals) const {
281 SDValue Chain = CLI.Chain;
282 SDValue Callee = CLI.Callee;
321 SmallVector<std::pair<unsigned, SDValue>, MaxArgs> RegsToPass;
328 SDValue Arg = OutVals[i];
354 SDValue InFlag;
379 SmallVector<SDValue, 8> Ops;
406 SDValue
407 BPFTargetLowering::LowerReturn(SDValue Chain, CallingConv::ID CallConv,
410 const SmallVectorImpl<SDValue> &OutVals,
429 SDValue Flag;
430 SmallVector<SDValue, 4> RetOps(1, Chain);
454 SDValue BPFTargetLowering::LowerCallResult(
455 SDValue Chain, SDValue InFlag, CallingConv::ID CallConv, bool IsVarArg,
455 SDValue Chain, SDValue InFlag, CallingConv::ID CallConv, bool IsVarArg,
457 SelectionDAG &DAG, SmallVectorImpl<SDValue> &InVals) const {
484 static void NegateCC(SDValue &LHS, SDValue &RHS, ISD::CondCode &CC) {
484 static void NegateCC(SDValue &LHS, SDValue &RHS, ISD::CondCode &CC) {
498 SDValue BPFTargetLowering::LowerBR_CC(SDValue Op, SelectionDAG &DAG) const {
498 SDValue BPFTargetLowering::LowerBR_CC(SDValue Op, SelectionDAG &DAG) const {
499 SDValue Chain = Op.getOperand(0);
501 SDValue LHS = Op.getOperand(2);
502 SDValue RHS = Op.getOperand(3);
503 SDValue Dest = Op.getOperand(4);
513 SDValue BPFTargetLowering::LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const {
513 SDValue BPFTargetLowering::LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const {
514 SDValue LHS = Op.getOperand(0);
515 SDValue RHS = Op.getOperand(1);
516 SDValue TrueV = Op.getOperand(2);
517 SDValue FalseV = Op.getOperand(3);
524 SDValue TargetCC = DAG.getConstant(CC, DL, LHS.getValueType());
526 SDValue Ops[] = {LHS, RHS, TargetCC, TrueV, FalseV};
551 SDValue BPFTargetLowering::LowerGlobalAddress(SDValue Op,
551 SDValue BPFTargetLowering::LowerGlobalAddress(SDValue Op,
558 SDValue GA = DAG.getTargetGlobalAddress(GV, DL, MVT::i64);
lib/Target/BPF/BPFISelLowering.h 40 SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
40 SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
72 SDValue LowerBR_CC(SDValue Op, SelectionDAG &DAG) const;
72 SDValue LowerBR_CC(SDValue Op, SelectionDAG &DAG) const;
73 SDValue LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const;
73 SDValue LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const;
74 SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const;
74 SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const;
77 SDValue LowerCallResult(SDValue Chain, SDValue InFlag,
77 SDValue LowerCallResult(SDValue Chain, SDValue InFlag,
77 SDValue LowerCallResult(SDValue Chain, SDValue InFlag,
81 SmallVectorImpl<SDValue> &InVals) const;
87 SDValue LowerCall(TargetLowering::CallLoweringInfo &CLI,
88 SmallVectorImpl<SDValue> &InVals) const override;
91 SDValue LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv,
91 SDValue LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv,
95 SmallVectorImpl<SDValue> &InVals) const override;
97 SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool IsVarArg,
97 SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool IsVarArg,
99 const SmallVectorImpl<SDValue> &OutVals, const SDLoc &DL,
lib/Target/BPF/BPFSelectionDAGInfo.cpp 20 SDValue BPFSelectionDAGInfo::EmitTargetCodeForMemcpy(
21 SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src,
21 SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src,
21 SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src,
22 SDValue Size, unsigned Align, bool isVolatile, bool AlwaysInline,
lib/Target/BPF/BPFSelectionDAGInfo.h 22 SDValue EmitTargetCodeForMemcpy(SelectionDAG &DAG, const SDLoc &dl,
23 SDValue Chain, SDValue Dst, SDValue Src,
23 SDValue Chain, SDValue Dst, SDValue Src,
23 SDValue Chain, SDValue Dst, SDValue Src,
24 SDValue Size, unsigned Align, bool isVolatile,
lib/Target/Hexagon/HexagonISelDAGToDAG.cpp 67 SDValue Chain = LD->getChain();
68 SDValue Base = LD->getBasePtr();
69 SDValue Offset = LD->getOffset();
128 SDValue IncV = CurDAG->getTargetConstant(Inc, dl, MVT::i32);
134 SDValue Zero = CurDAG->getTargetConstant(0, dl, MVT::i32);
145 SDValue From[3] = { SDValue(LD,0), SDValue(LD,1), SDValue(LD,2) };
146 SDValue To[3];
168 SDValue Zero = CurDAG->getTargetConstant(0, dl, MVT::i32);
206 SDValue I = CurDAG->getTargetConstant(Inc->getSExtValue(), dl, MVT::i32);
228 SDValue TS;
229 SDValue Loc = IntN->getOperand(3);
265 SDValue Ch = N->getOperand(0);
266 SDValue Loc = N->getOperand(1);
305 SDValue F[] = { SDValue(N,0), SDValue(N,1), SDValue(C,0), SDValue(C,1) };
306 SDValue T[] = { SDValue(L,0), SDValue(S,0), SDValue(L,1), SDValue(S,0) };
365 SmallVector<SDValue, 7> Ops;
391 SDValue I = CurDAG->getTargetConstant(Inc->getSExtValue(), DL, MVT::i32);
426 SDValue I = CurDAG->getTargetConstant(Inc->getSExtValue(), DL, MVT::i32);
464 SDValue Chain = ST->getChain();
465 SDValue Base = ST->getBasePtr();
466 SDValue Offset = ST->getOffset();
467 SDValue Value = ST->getValue();
524 SDValue IncV = CurDAG->getTargetConstant(Inc, dl, MVT::i32);
528 SDValue From[2] = { SDValue(ST,0), SDValue(ST,1) };
529 SDValue To[2];
533 SDValue Ops[] = { Base, IncV, Value, Chain };
540 SDValue Zero = CurDAG->getTargetConstant(0, dl, MVT::i32);
541 SDValue Ops[] = { Base, Zero, Value, Chain };
570 SDValue Shl_0 = N->getOperand(0);
571 SDValue Shl_1 = N->getOperand(1);
582 SDValue Mul_0 = Shl_0.getOperand(0); // Val
583 SDValue Mul_1 = Shl_0.getOperand(1); // Const
588 SDValue Val = CurDAG->getTargetConstant(ValConst, dl, MVT::i32);
599 SDValue Sub_0 = Shl_0.getOperand(0); // Const 0
600 SDValue Sub_1 = Shl_0.getOperand(1); // Val
604 SDValue Shl2_0 = Sub_1.getOperand(0); // Val
605 SDValue Shl2_1 = Sub_1.getOperand(1); // Const
609 SDValue Val = CurDAG->getTargetConstant(-ValConst, dl, MVT::i32);
683 SDValue V = N->getOperand(1);
684 SDValue U;
686 SDValue R = CurDAG->getNode(N->getOpcode(), SDLoc(N), N->getValueType(0),
703 SDValue V = CurDAG->getTargetConstant(A.getZExtValue(), dl, MVT::i32);
708 SDValue V = CurDAG->getTargetConstant(A.getZExtValue(), dl, MVT::i64);
738 SDValue FI = CurDAG->getTargetFrameIndex(FX, MVT::i32);
740 SDValue Zero = CurDAG->getTargetConstant(0, DL, MVT::i32);
753 SDValue CH = CurDAG->getEntryNode();
754 SDValue Ops[] = { CurDAG->getCopyFromReg(CH, DL, AR, MVT::i32), FI, Zero };
778 SDValue Ops[] = {
789 SDValue M0 = CurDAG->getTargetConstant(0x18, dl, MVT::i32);
790 SDValue M1 = CurDAG->getTargetConstant(0x03, dl, MVT::i32);
795 SDValue E = CurDAG->getTargetExtractSubreg(Hexagon::isub_lo, dl, ResTy,
811 SDValue A = N->getOperand(1);
815 SDValue M = CurDAG->getTargetConstant(Mask, dl, MVT::i32);
825 SDValue Op = N->getOperand(0);
842 SDValue Zero = CurDAG->getTargetConstant(0, dl, MVT::i32);
855 SDValue C = CurDAG->getTargetConstant(-1, dl, MVT::i32);
868 SDValue C = CurDAG->getTargetConstant(-1, dl, MVT::i32);
911 SelectInlineAsmMemoryOperand(const SDValue &Op, unsigned ConstraintID,
912 std::vector<SDValue> &OutOps) {
913 SDValue Inp = Op, Res;
952 SDValue S0 = U->getOperand(0);
953 SDValue S1 = U->getOperand(1);
954 SDValue SY = (S0.getNode() == I) ? S1 : S0;
966 SDValue LDBasePtr = cast<MemSDNode>(SYNode)->getBasePtr();
967 SDValue STBasePtr = cast<MemSDNode>(UUse)->getBasePtr();
995 SDValue N0 = I->getOperand(0), N1 = I->getOperand(1);
998 SDValue SOp = SelN0 ? N0 : N1;
999 SDValue VOp = SelN0 ? N1 : N0;
1002 SDValue SC = SOp.getOperand(0);
1003 SDValue SX = SOp.getOperand(1);
1004 SDValue SY = SOp.getOperand(2);
1007 SDValue NewOr = DAG.getNode(ISD::OR, DLS, VT, SX, VOp);
1008 SDValue NewSel = DAG.getNode(ISD::SELECT, DLS, VT, SC, NewOr, VOp);
1011 SDValue NewOr = DAG.getNode(ISD::OR, DLS, VT, SY, VOp);
1012 SDValue NewSel = DAG.getNode(ISD::SELECT, DLS, VT, SC, VOp, NewOr);
1033 SDValue Off = I->getOperand(2);
1038 SDValue T0 = Off.getOperand(1);
1043 SDValue T1 = T0.getOperand(0);
1044 SDValue T2 = T0.getOperand(1);
1048 SDValue C = T1.getOperand(1);
1067 SDValue D = DAG.getConstant(DV, DL, VT);
1069 SDValue NewAdd = DAG.getNode(ISD::ADD, DL, VT, T1.getOperand(0), D);
1071 SDValue NewShl = DAG.getNode(ISD::SHL, DL, VT, NewAdd, C);
1096 SDValue Addr = Opc == ISD::LOAD ? N->getOperand(1) : N->getOperand(2);
1100 SDValue T0 = Addr.getOperand(1);
1108 SDValue S = T0.getOperand(0);
1140 SDValue Y = S.getOperand(0);
1144 SDValue D = DAG.getConstant(TZ+CV, dl, VT);
1145 SDValue DC = DAG.getConstant(TZ, dl, VT);
1146 SDValue NewSrl = DAG.getNode(ISD::SRL, dl, VT, Y, D);
1147 SDValue NewShl = DAG.getNode(ISD::SHL, dl, VT, NewSrl, DC);
1161 SDValue OpI1 = N->getOperand(0);
1177 SmallVector<SDValue,2> Ops(U->getNumOperands());
1183 SDValue C0 = DAG.getConstant(0, dl, BVT);
1184 SDValue C1 = DAG.getConstant(1, dl, BVT);
1185 SDValue If0, If1;
1200 SDValue Sel = DAG.getNode(ISD::SELECT, dl, UVT, OpI1, If1, If0);
1279 bool HexagonDAGToDAGISel::SelectAddrFI(SDValue &N, SDValue &R) {
1279 bool HexagonDAGToDAGISel::SelectAddrFI(SDValue &N, SDValue &R) {
1291 inline bool HexagonDAGToDAGISel::SelectAddrGA(SDValue &N, SDValue &R) {
1291 inline bool HexagonDAGToDAGISel::SelectAddrGA(SDValue &N, SDValue &R) {
1295 inline bool HexagonDAGToDAGISel::SelectAddrGP(SDValue &N, SDValue &R) {
1295 inline bool HexagonDAGToDAGISel::SelectAddrGP(SDValue &N, SDValue &R) {
1299 inline bool HexagonDAGToDAGISel::SelectAnyImm(SDValue &N, SDValue &R) {
1299 inline bool HexagonDAGToDAGISel::SelectAnyImm(SDValue &N, SDValue &R) {
1303 inline bool HexagonDAGToDAGISel::SelectAnyImm0(SDValue &N, SDValue &R) {
1303 inline bool HexagonDAGToDAGISel::SelectAnyImm0(SDValue &N, SDValue &R) {
1306 inline bool HexagonDAGToDAGISel::SelectAnyImm1(SDValue &N, SDValue &R) {
1306 inline bool HexagonDAGToDAGISel::SelectAnyImm1(SDValue &N, SDValue &R) {
1309 inline bool HexagonDAGToDAGISel::SelectAnyImm2(SDValue &N, SDValue &R) {
1309 inline bool HexagonDAGToDAGISel::SelectAnyImm2(SDValue &N, SDValue &R) {
1312 inline bool HexagonDAGToDAGISel::SelectAnyImm3(SDValue &N, SDValue &R) {
1312 inline bool HexagonDAGToDAGISel::SelectAnyImm3(SDValue &N, SDValue &R) {
1316 inline bool HexagonDAGToDAGISel::SelectAnyInt(SDValue &N, SDValue &R) {
1316 inline bool HexagonDAGToDAGISel::SelectAnyInt(SDValue &N, SDValue &R) {
1324 bool HexagonDAGToDAGISel::SelectAnyImmediate(SDValue &N, SDValue &R,
1324 bool HexagonDAGToDAGISel::SelectAnyImmediate(SDValue &N, SDValue &R,
1368 bool HexagonDAGToDAGISel::SelectGlobalAddress(SDValue &N, SDValue &R,
1368 bool HexagonDAGToDAGISel::SelectGlobalAddress(SDValue &N, SDValue &R,
1376 SDValue N0 = N.getOperand(0);
1377 SDValue N1 = N.getOperand(1);
1384 SDValue Addr = N0.getOperand(0);
1418 bool HexagonDAGToDAGISel::DetectUseSxtw(SDValue &N, SDValue &R) {
1418 bool HexagonDAGToDAGISel::DetectUseSxtw(SDValue &N, SDValue &R) {
1484 SDValue Ops[] = {
1495 bool HexagonDAGToDAGISel::keepsLowBits(const SDValue &Val, unsigned NumBits,
1496 SDValue &Src) {
1502 const SDValue &Op0 = Val.getOperand(0);
1634 SDValue Value;
1640 WeightedLeaf(SDValue Value, int Weight, int InsertionOrder) :
1731 const SDValue &Val = L.Value;
1758 const SDValue &Val = L.Value;
1779 SDValue HexagonDAGToDAGISel::getMultiplierForSHL(SDNode *N) {
1786 static unsigned getPowerOf2Factor(SDValue Val) {
1809 static bool willShiftRightEliminate(SDValue V, unsigned Amount) {
1811 SDValue Ops[] = { V.getOperand(0), V.getOperand(1) };
1825 SDValue HexagonDAGToDAGISel::factorOutPowerOf2(SDValue V, unsigned Power) {
1825 SDValue HexagonDAGToDAGISel::factorOutPowerOf2(SDValue V, unsigned Power) {
1826 SDValue Ops[] = { V.getOperand(0), V.getOperand(1) };
1850 static bool isTargetConstant(const SDValue &V) {
1877 SDValue HexagonDAGToDAGISel::balanceSubTree(SDNode *N, bool TopLevel) {
1888 SDValue Op0 = N->getOperand(0);
1889 SDValue Op1 = N->getOperand(1);
1926 SmallVector<SDValue, 4> Worklist;
1951 SmallDenseMap<SDValue, int> NodeHeights;
1955 SDValue Child = Worklist.pop_back_val();
2017 SDValue Op1;
2051 SDValue Mul1Factored = factorOutPowerOf2(Mul1.Value, MaxPowerOf2);
2052 SDValue Mul2Factored = factorOutPowerOf2(Mul2.Value, MaxPowerOf2);
2053 SDValue Sum = CurDAG->getNode(ISD::ADD, SDLoc(N), Mul1.Value.getValueType(),
2055 SDValue Const = CurDAG->getConstant(MaxPowerOf2, SDLoc(N),
2057 SDValue New = CurDAG->getNode(ISD::SHL, SDLoc(N), Mul1.Value.getValueType(),
2086 SDValue NewTGA =
2147 SDValue V0 = L0.Value;
2149 SDValue V1 = L1.Value;
2162 SDValue NewNode;
2195 SDValue NewRoot = Leaves.top().Value;
2205 SDValue V0 = NewRoot.getOperand(0);
2238 SDValue BasePtr = cast<MemSDNode>(N)->getBasePtr();
2278 SDValue NewBasePtr = balanceSubTree(BasePtr.getNode(), /*TopLevel=*/ true);
lib/Target/Hexagon/HexagonISelDAGToDAG.h 58 inline bool SelectAddrGA(SDValue &N, SDValue &R);
58 inline bool SelectAddrGA(SDValue &N, SDValue &R);
59 inline bool SelectAddrGP(SDValue &N, SDValue &R);
59 inline bool SelectAddrGP(SDValue &N, SDValue &R);
60 inline bool SelectAnyImm(SDValue &N, SDValue &R);
60 inline bool SelectAnyImm(SDValue &N, SDValue &R);
61 inline bool SelectAnyInt(SDValue &N, SDValue &R);
61 inline bool SelectAnyInt(SDValue &N, SDValue &R);
62 bool SelectAnyImmediate(SDValue &N, SDValue &R, uint32_t LogAlign);
62 bool SelectAnyImmediate(SDValue &N, SDValue &R, uint32_t LogAlign);
63 bool SelectGlobalAddress(SDValue &N, SDValue &R, bool UseGP,
63 bool SelectGlobalAddress(SDValue &N, SDValue &R, bool UseGP,
65 bool SelectAddrFI(SDValue &N, SDValue &R);
65 bool SelectAddrFI(SDValue &N, SDValue &R);
66 bool DetectUseSxtw(SDValue &N, SDValue &R);
66 bool DetectUseSxtw(SDValue &N, SDValue &R);
68 inline bool SelectAnyImm0(SDValue &N, SDValue &R);
68 inline bool SelectAnyImm0(SDValue &N, SDValue &R);
69 inline bool SelectAnyImm1(SDValue &N, SDValue &R);
69 inline bool SelectAnyImm1(SDValue &N, SDValue &R);
70 inline bool SelectAnyImm2(SDValue &N, SDValue &R);
70 inline bool SelectAnyImm2(SDValue &N, SDValue &R);
71 inline bool SelectAnyImm3(SDValue &N, SDValue &R);
71 inline bool SelectAnyImm3(SDValue &N, SDValue &R);
88 bool SelectInlineAsmMemoryOperand(const SDValue &Op,
90 std::vector<SDValue> &OutOps) override;
126 SDValue selectUndef(const SDLoc &dl, MVT ResTy) {
135 bool keepsLowBits(const SDValue &Val, unsigned NumBits, SDValue &Src);
135 bool keepsLowBits(const SDValue &Val, unsigned NumBits, SDValue &Src);
152 SDValue getMultiplierForSHL(SDNode *N);
153 SDValue factorOutPowerOf2(SDValue V, unsigned Power);
153 SDValue factorOutPowerOf2(SDValue V, unsigned Power);
155 SDValue balanceSubTree(SDNode *N, bool Factorize = false);
lib/Target/Hexagon/HexagonISelDAGToDAGHVX.cpp 618 OpRef(SDValue V) : OpV(V) {}
635 SDValue OpV = SDValue();
832 SDValue getVectorConstant(ArrayRef<uint8_t> Data, const SDLoc &dl);
860 SDValue Va, SDValue Vb, SDNode *N);
860 SDValue Va, SDValue Vb, SDNode *N);
948 SDValue Addr = cast<LoadSDNode>(N)->getBasePtr();
985 std::vector<SDValue> Output;
989 std::vector<SDValue> Ops;
1007 SDValue Op = Output[Idx];
1101 SDValue S = DAG.getTargetConstant(IsRight ? MinSrc : HwLen-MinSrc,
1107 SDValue S = DAG.getTargetConstant(MinSrc, dl, MVT::i32);
1203 SDValue B = getVectorConstant(Bytes, dl);
1361 MVT ResTy, SDValue Va, SDValue Vb,
1361 MVT ResTy, SDValue Va, SDValue Vb,
1388 SmallVector<SDValue,128> Ops;
1396 SDValue Vec;
1412 SDValue Idx = DAG.getConstant(M, dl, MVT::i32);
1413 SDValue Ex = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, LegalTy, {Vec, Idx});
1414 SDValue L = Lower.LowerOperation(Ex, DAG);
1419 SDValue LV;
1421 SDValue B0 = DAG.getBuildVector(SingleTy, dl, {Ops.data(), HwLen});
1422 SDValue L0 = Lower.LowerOperation(B0, DAG);
1423 SDValue B1 = DAG.getBuildVector(SingleTy, dl, {Ops.data()+HwLen, HwLen});
1424 SDValue L1 = Lower.LowerOperation(B1, DAG);
1431 SDValue BV = DAG.getBuildVector(ResTy, dl, Ops);
1456 for (SDValue Op : S->ops()) {
1962 SDValue Ctl = getVectorConstant(FC, dl);
1970 SDValue Ctl = getVectorConstant(RC, dl);
1978 SDValue CtlF = getVectorConstant(FC, dl);
1979 SDValue CtlR = getVectorConstant(RC, dl);
1989 SDValue HvxSelector::getVectorConstant(ArrayRef<uint8_t> Data,
1991 SmallVector<SDValue, 128> Elems;
1995 SDValue BV = DAG.getBuildVector(VecTy, dl, Elems);
1996 SDValue LV = Lower.LowerOperation(BV, DAG);
2047 SDValue Vec0 = N->getOperand(0);
2048 SDValue Vec1 = N->getOperand(1);
2080 SDValue VecV = N->getOperand(0);
2081 SDValue RotV = N->getOperand(1);
2089 SDValue C = DAG.getTargetConstant(S, dl, MVT::i32);
2102 SDValue Vv = N->getOperand(0);
2103 SDValue Vu = N->getOperand(1);
2104 SDValue Rt = N->getOperand(2);
2125 SDValue Chain = N->getOperand(0);
2126 SDValue Address = N->getOperand(2);
2127 SDValue Predicate = N->getOperand(3);
2128 SDValue Base = N->getOperand(4);
2129 SDValue Modifier = N->getOperand(5);
2130 SDValue Offset = N->getOperand(6);
2152 SDValue Ops[] = { Address, Predicate, Base, Modifier, Offset, Chain };
2163 SDValue Chain = N->getOperand(0);
2164 SDValue Address = N->getOperand(2);
2165 SDValue Base = N->getOperand(3);
2166 SDValue Modifier = N->getOperand(4);
2167 SDValue Offset = N->getOperand(5);
2189 SDValue Ops[] = { Address, Base, Modifier, Offset, Chain };
2203 SmallVector<SDValue, 3> Ops = { N->getOperand(1), N->getOperand(2),
2210 SmallVector<SDValue, 3> Ops = { N->getOperand(1), N->getOperand(2),
2217 SmallVector<SDValue, 3> Ops = { N->getOperand(1), N->getOperand(2),
2224 SmallVector<SDValue, 3> Ops = { N->getOperand(1), N->getOperand(2),
lib/Target/Hexagon/HexagonISelLowering.cpp 154 SDValue
155 HexagonTargetLowering::LowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG)
165 static SDValue CreateCopyOfByValArgument(SDValue Src, SDValue Dst,
165 static SDValue CreateCopyOfByValArgument(SDValue Src, SDValue Dst,
165 static SDValue CreateCopyOfByValArgument(SDValue Src, SDValue Dst,
166 SDValue Chain, ISD::ArgFlagsTy Flags,
168 SDValue SizeNode = DAG.getConstant(Flags.getByValSize(), dl, MVT::i32);
191 SDValue
192 HexagonTargetLowering::LowerReturn(SDValue Chain, CallingConv::ID CallConv,
195 const SmallVectorImpl<SDValue> &OutVals,
210 SDValue Flag;
211 SmallVector<SDValue, 4> RetOps(1, Chain);
260 SDValue HexagonTargetLowering::LowerCallResult(
261 SDValue Chain, SDValue Glue, CallingConv::ID CallConv, bool IsVarArg,
261 SDValue Chain, SDValue Glue, CallingConv::ID CallConv, bool IsVarArg,
263 SelectionDAG &DAG, SmallVectorImpl<SDValue> &InVals,
264 const SmallVectorImpl<SDValue> &OutVals, SDValue Callee) const {
264 const SmallVectorImpl<SDValue> &OutVals, SDValue Callee) const {
278 SDValue RetVal;
286 SDValue FR0 = DAG.getCopyFromReg(Chain, dl, RVLocs[i].getLocReg(),
290 SDValue TPR = DAG.getCopyToReg(FR0.getValue(1), dl, PredR,
313 SDValue
315 SmallVectorImpl<SDValue> &InVals) const {
319 SmallVectorImpl<SDValue> &OutVals = CLI.OutVals;
321 SDValue Chain = CLI.Chain;
322 SDValue Callee = CLI.Callee;
370 SmallVector<std::pair<unsigned, SDValue>, 16> RegsToPass;
371 SmallVector<SDValue, 8> MemOpChains;
374 SDValue StackPtr =
382 SDValue Arg = OutVals[i];
411 SDValue MemAddr = DAG.getConstant(LocMemOffset, dl,
425 SDValue S = DAG.getStore(Chain, dl, Arg, MemAddr, LocPI);
448 SDValue Glue;
499 SmallVector<SDValue, 8> Ops;
546 SDValue &Base, SDValue &Offset, ISD::MemIndexedMode &AM,
546 SDValue &Base, SDValue &Offset, ISD::MemIndexedMode &AM,
574 SDValue
575 HexagonTargetLowering::LowerINLINEASM(SDValue Op, SelectionDAG &DAG) const {
623 SDValue HexagonTargetLowering::LowerPREFETCH(SDValue Op,
623 SDValue HexagonTargetLowering::LowerPREFETCH(SDValue Op,
625 SDValue Chain = Op.getOperand(0);
626 SDValue Addr = Op.getOperand(1);
630 SDValue Zero = DAG.getConstant(0, DL, MVT::i32);
638 SDValue HexagonTargetLowering::LowerREADCYCLECOUNTER(SDValue Op,
638 SDValue HexagonTargetLowering::LowerREADCYCLECOUNTER(SDValue Op,
640 SDValue Chain = Op.getOperand(0);
646 SDValue HexagonTargetLowering::LowerINTRINSIC_VOID(SDValue Op,
646 SDValue HexagonTargetLowering::LowerINTRINSIC_VOID(SDValue Op,
648 SDValue Chain = Op.getOperand(0);
652 SDValue Addr = Op.getOperand(2);
654 SDValue Zero = DAG.getConstant(0, DL, MVT::i32);
660 SDValue
661 HexagonTargetLowering::LowerDYNAMIC_STACKALLOC(SDValue Op,
663 SDValue Chain = Op.getOperand(0);
664 SDValue Size = Op.getOperand(1);
665 SDValue Align = Op.getOperand(2);
683 SDValue AC = DAG.getConstant(A, dl, MVT::i32);
685 SDValue AA = DAG.getNode(HexagonISD::ALLOCA, dl, VTs, Chain, Size, AC);
691 SDValue HexagonTargetLowering::LowerFormalArguments(
692 SDValue Chain, CallingConv::ID CallConv, bool IsVarArg,
694 SelectionDAG &DAG, SmallVectorImpl<SDValue> &InVals) const {
740 SDValue Copy = DAG.getCopyFromReg(Chain, dl, VReg, RegVT);
747 SDValue T = DAG.getNode(ISD::AND, dl, RegVT,
772 SDValue FIN = DAG.getFrameIndex(FI, MVT::i32);
780 SDValue L = DAG.getLoad(VA.getValVT(), dl, Chain, FIN,
798 SDValue
799 HexagonTargetLowering::LowerVASTART(SDValue Op, SelectionDAG &DAG) const {
804 SDValue Addr = DAG.getFrameIndex(QFI->getVarArgsFrameIndex(), MVT::i32);
810 SDValue HexagonTargetLowering::LowerSETCC(SDValue Op, SelectionDAG &DAG) const {
810 SDValue HexagonTargetLowering::LowerSETCC(SDValue Op, SelectionDAG &DAG) const {
812 SDValue LHS = Op.getOperand(0);
813 SDValue RHS = Op.getOperand(1);
839 SDValue Op = N.getOperand(0);
869 SDValue
870 HexagonTargetLowering::LowerVSELECT(SDValue Op, SelectionDAG &DAG) const {
871 SDValue PredOp = Op.getOperand(0);
872 SDValue Op1 = Op.getOperand(1), Op2 = Op.getOperand(2);
916 SDValue
917 HexagonTargetLowering::LowerConstantPool(SDValue Op, SelectionDAG &DAG) const {
935 SDValue T;
952 SDValue
953 HexagonTargetLowering::LowerJumpTable(SDValue Op, SelectionDAG &DAG) const {
957 SDValue T = DAG.getTargetJumpTable(Idx, VT, HexagonII::MO_PCREL);
961 SDValue T = DAG.getTargetJumpTable(Idx, VT);
965 SDValue
966 HexagonTargetLowering::LowerRETURNADDR(SDValue Op, SelectionDAG &DAG) const {
979 SDValue FrameAddr = LowerFRAMEADDR(Op, DAG);
980 SDValue Offset = DAG.getConstant(4, dl, MVT::i32);
991 SDValue
992 HexagonTargetLowering::LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const {
1000 SDValue FrameAddr = DAG.getCopyFromReg(DAG.getEntryNode(), dl,
1008 SDValue
1009 HexagonTargetLowering::LowerATOMIC_FENCE(SDValue Op, SelectionDAG& DAG) const {
1014 SDValue
1015 HexagonTargetLowering::LowerGLOBALADDRESS(SDValue Op, SelectionDAG &DAG) const {
1026 SDValue GA = DAG.getTargetGlobalAddress(GV, dl, PtrVT, Offset);
1035 SDValue GA = DAG.getTargetGlobalAddress(GV, dl, PtrVT, Offset,
1041 SDValue GOT = DAG.getGLOBAL_OFFSET_TABLE(PtrVT);
1042 SDValue GA = DAG.getTargetGlobalAddress(GV, dl, PtrVT, 0, HexagonII::MO_GOT);
1043 SDValue Off = DAG.getConstant(Offset, dl, MVT::i32);
1048 SDValue
1049 HexagonTargetLowering::LowerBlockAddress(SDValue Op, SelectionDAG &DAG) const {
1056 SDValue A = DAG.getTargetBlockAddress(BA, PtrVT);
1060 SDValue A = DAG.getTargetBlockAddress(BA, PtrVT, 0, HexagonII::MO_PCREL);
1064 SDValue
1065 HexagonTargetLowering::LowerGLOBAL_OFFSET_TABLE(SDValue Op, SelectionDAG &DAG)
1068 SDValue GOTSym = DAG.getTargetExternalSymbol(HEXAGON_GOT_SYM_NAME, PtrVT,
1073 SDValue
1074 HexagonTargetLowering::GetDynamicTLSAddr(SelectionDAG &DAG, SDValue Chain,
1075 GlobalAddressSDNode *GA, SDValue Glue, EVT PtrVT, unsigned ReturnReg,
1081 SDValue TGA = DAG.getTargetGlobalAddress(GA->getGlobal(), dl,
1096 SDValue Ops[] = { Chain, TGA, DAG.getRegister(Hexagon::R0, PtrVT),
1110 SDValue
1118 SDValue TP = DAG.getCopyFromReg(DAG.getEntryNode(), dl, Hexagon::UGP, PtrVT);
1125 SDValue TGA = DAG.getTargetGlobalAddress(GA->getGlobal(), dl, PtrVT,
1128 SDValue Sym = DAG.getNode(HexagonISD::CONST32, dl, PtrVT, TGA);
1132 SDValue GOT = LowerGLOBAL_OFFSET_TABLE(Sym, DAG);
1141 SDValue LoadOffset =
1152 SDValue
1160 SDValue TP = DAG.getCopyFromReg(DAG.getEntryNode(), dl, Hexagon::UGP, PtrVT);
1162 SDValue TGA = DAG.getTargetGlobalAddress(GA->getGlobal(), dl, PtrVT, Offset,
1164 SDValue Sym = DAG.getNode(HexagonISD::CONST32, dl, PtrVT, TGA);
1174 SDValue
1182 SDValue TGA = DAG.getTargetGlobalAddress(GA->getGlobal(), dl, PtrVT, Offset,
1186 SDValue GOT = LowerGLOBAL_OFFSET_TABLE(TGA, DAG);
1189 SDValue Sym = DAG.getNode(HexagonISD::CONST32, dl, PtrVT, TGA);
1190 SDValue Chain = DAG.getNode(ISD::ADD, dl, PtrVT, GOT, Sym);
1193 SDValue InFlag;
1211 SDValue
1212 HexagonTargetLowering::LowerGlobalTLSAddress(SDValue Op,
1678 HexagonTargetLowering::validateConstPtrAlignment(SDValue Ptr, const SDLoc &dl,
1836 bool HexagonTargetLowering::hasBitTest(SDValue X, SDValue Y) const {
1836 bool HexagonTargetLowering::hasBitTest(SDValue X, SDValue Y) const {
1897 std::pair<SDValue, int>
1898 HexagonTargetLowering::getBaseAndOffset(SDValue Addr) const {
1900 SDValue Op1 = Addr.getOperand(1);
1909 SDValue
1910 HexagonTargetLowering::LowerVECTOR_SHUFFLE(SDValue Op, SelectionDAG &DAG)
1922 SDValue Op0 = Op.getOperand(0);
1923 SDValue Op1 = Op.getOperand(1);
1979 SDValue T0 = DAG.getBitcast(MVT::i32, Op0);
1980 SDValue T1 = DAG.getNode(ISD::BSWAP, dl, MVT::i32, T0);
1985 SDValue Concat10 = DAG.getNode(HexagonISD::COMBINE, dl,
1992 SDValue Concat01 = DAG.getNode(HexagonISD::COMBINE, dl,
2006 SDValue T0 = DAG.getBitcast(MVT::i64, Op0);
2007 SDValue T1 = DAG.getNode(ISD::BSWAP, dl, MVT::i64, T0);
2036 SDValue
2037 HexagonTargetLowering::getVectorShiftByInt(SDValue Op, SelectionDAG &DAG)
2040 if (SDValue S = BVN->getSplatValue()) {
2062 SDValue
2063 HexagonTargetLowering::LowerVECTOR_SHIFT(SDValue Op, SelectionDAG &DAG) const {
2067 SDValue
2068 HexagonTargetLowering::LowerROTL(SDValue Op, SelectionDAG &DAG) const {
2074 SDValue
2075 HexagonTargetLowering::LowerBITCAST(SDValue Op, SelectionDAG &DAG) const {
2077 SDValue InpV = Op.getOperand(0);
2084 SDValue Sc = DAG.getBitcast(tyScalar(InpTy), InpV);
2085 SDValue Ext = DAG.getZExtOrTrunc(Sc, dl, MVT::i32);
2093 HexagonTargetLowering::getBuildVectorConstInts(ArrayRef<SDValue> Values,
2102 SDValue V = Values[i];
2122 SDValue
2123 HexagonTargetLowering::buildVector32(ArrayRef<SDValue> Elem, const SDLoc &dl,
2149 SDValue N = getInstr(Hexagon::A2_combine_ll, dl, MVT::i32,
2176 SDValue Ext = DAG.getZExtOrTrunc(Elem[First], dl, MVT::i32);
2184 SDValue Vs[4];
2189 SDValue S8 = DAG.getConstant(8, dl, MVT::i32);
2190 SDValue T0 = DAG.getNode(ISD::SHL, dl, MVT::i32, {Vs[1], S8});
2191 SDValue T1 = DAG.getNode(ISD::SHL, dl, MVT::i32, {Vs[3], S8});
2192 SDValue B0 = DAG.getNode(ISD::OR, dl, MVT::i32, {Vs[0], T0});
2193 SDValue B1 = DAG.getNode(ISD::OR, dl, MVT::i32, {Vs[2], T1});
2195 SDValue R = getInstr(Hexagon::A2_combine_ll, dl, MVT::i32, {B1, B0}, DAG);
2205 SDValue
2206 HexagonTargetLowering::buildVector64(ArrayRef<SDValue> Elem, const SDLoc &dl,
2238 SDValue Ext = DAG.getZExtOrTrunc(Elem[First], dl, MVT::i32);
2251 SDValue V0 = DAG.getConstant(Val, dl, MVT::i64);
2257 SDValue L = (ElemTy == MVT::i32)
2260 SDValue H = (ElemTy == MVT::i32)
2266 SDValue
2267 HexagonTargetLowering::extractVector(SDValue VecV, SDValue IdxV,
2267 HexagonTargetLowering::extractVector(SDValue VecV, SDValue IdxV,
2295 SDValue A0 = getInstr(Hexagon::C2_tfrpr, dl, MVT::i32, {VecV}, DAG);
2296 SDValue M0 = DAG.getConstant(8 / VecWidth, dl, MVT::i32);
2297 SDValue I0 = DAG.getNode(ISD::MUL, dl, MVT::i32, IdxV, M0);
2311 SDValue S0 = DAG.getNode(ISD::MUL, dl, MVT::i32, IdxV,
2313 SDValue T0 = DAG.getNode(HexagonISD::P2D, dl, MVT::i64, VecV);
2314 SDValue T1 = DAG.getNode(ISD::SRL, dl, MVT::i64, T0, S0);
2332 SDValue WidthV = DAG.getConstant(ValWidth, dl, MVT::i32);
2333 SDValue ExtV;
2344 SDValue OffV = DAG.getConstant(Off, dl, MVT::i32);
2353 SDValue OffV = DAG.getNode(ISD::MUL, dl, MVT::i32, IdxV,
2365 SDValue
2366 HexagonTargetLowering::insertVector(SDValue VecV, SDValue ValV, SDValue IdxV,
2366 HexagonTargetLowering::insertVector(SDValue VecV, SDValue ValV, SDValue IdxV,
2366 HexagonTargetLowering::insertVector(SDValue VecV, SDValue ValV, SDValue IdxV,
2373 SDValue ValR = DAG.getNode(HexagonISD::P2D, dl, MVT::i64, ValV);
2388 SDValue Width = DAG.getConstant(ValBytes*8, dl, MVT::i32);
2389 SDValue Idx = DAG.getNode(ISD::MUL, dl, MVT::i32, IdxV,
2391 SDValue VecR = DAG.getNode(HexagonISD::P2D, dl, MVT::i64, VecV);
2392 SDValue Ins = DAG.getNode(HexagonISD::INSERT, dl, MVT::i32,
2412 SDValue WidthV = DAG.getConstant(ValWidth, dl, MVT::i32);
2413 SDValue InsV;
2417 SDValue OffV = DAG.getConstant(W, dl, MVT::i32);
2423 SDValue OffV = DAG.getNode(ISD::MUL, dl, MVT::i32, IdxV, WidthV);
2431 SDValue
2432 HexagonTargetLowering::expandPredicate(SDValue Vec32, const SDLoc &dl,
2440 SDValue
2441 HexagonTargetLowering::contractPredicate(SDValue Vec64, const SDLoc &dl,
2449 SDValue
2467 SDValue
2468 HexagonTargetLowering::LowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG) const {
2472 SmallVector<SDValue,8> Ops;
2484 for (SDValue P : Ops) {
2502 SDValue Rs[8];
2503 SDValue Z = getZero(dl, MVT::i32, DAG);
2507 SDValue S = DAG.getConstant(1ull << i, dl, MVT::i32);
2510 for (ArrayRef<SDValue> A(Rs); A.size() != 1; A = A.drop_back(A.size()/2)) {
2521 SDValue
2522 HexagonTargetLowering::LowerCONCAT_VECTORS(SDValue Op,
2545 SmallVector<SDValue,4> Words[2];
2548 for (SDValue P : Op.getNode()->op_values()) {
2549 SDValue W = DAG.getNode(HexagonISD::P2D, dl, MVT::i64, P);
2560 SDValue WidthV = DAG.getConstant(64 / Scale, dl, MVT::i32);
2564 SDValue W0 = Words[IdxW][i], W1 = Words[IdxW][i+1];
2566 SDValue T = DAG.getNode(HexagonISD::INSERT, dl, MVT::i32,
2578 SDValue WW = DAG.getNode(HexagonISD::COMBINE, dl, MVT::i64,
2586 SDValue
2587 HexagonTargetLowering::LowerEXTRACT_VECTOR_ELT(SDValue Op,
2589 SDValue Vec = Op.getOperand(0);
2594 SDValue
2595 HexagonTargetLowering::LowerEXTRACT_SUBVECTOR(SDValue Op,
2601 SDValue
2602 HexagonTargetLowering::LowerINSERT_VECTOR_ELT(SDValue Op,
2608 SDValue
2609 HexagonTargetLowering::LowerINSERT_SUBVECTOR(SDValue Op,
2611 SDValue ValV = Op.getOperand(1);
2629 SDValue
2630 HexagonTargetLowering::LowerLoad(SDValue Op, SelectionDAG &DAG) const {
2639 SDValue
2640 HexagonTargetLowering::LowerStore(SDValue Op, SelectionDAG &DAG) const {
2643 SDValue Ptr = SN->getBasePtr();
2654 SDValue
2655 HexagonTargetLowering::LowerUnalignedLoad(SDValue Op, SelectionDAG &DAG)
2689 std::pair<SDValue, SDValue> P = expandUnalignedLoad(LN, DAG);
2689 std::pair<SDValue, SDValue> P = expandUnalignedLoad(LN, DAG);
2701 SDValue Base = LN->getBasePtr();
2702 SDValue Chain = LN->getChain();
2713 SDValue BaseNoOff = (BaseOpc != HexagonISD::VALIGNADDR)
2717 SDValue Base0 = DAG.getMemBasePlusOffset(BaseNoOff, BO.second, dl);
2718 SDValue Base1 = DAG.getMemBasePlusOffset(BaseNoOff, BO.second+LoadLen, dl);
2729 SDValue Load0 = DAG.getLoad(LoadTy, dl, Chain, Base0, WideMMO);
2730 SDValue Load1 = DAG.getLoad(LoadTy, dl, Chain, Base1, WideMMO);
2732 SDValue Aligned = DAG.getNode(HexagonISD::VALIGN, dl, LoadTy,
2734 SDValue NewChain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
2736 SDValue M = DAG.getMergeValues({Aligned, NewChain}, dl);
2740 SDValue
2741 HexagonTargetLowering::LowerUAddSubO(SDValue Op, SelectionDAG &DAG) const {
2742 SDValue X = Op.getOperand(0), Y = Op.getOperand(1);
2761 SDValue Op = DAG.getNode(ISD::ADD, dl, VTs.VTs[0], {X, Y});
2762 SDValue Ov = DAG.getSetCC(dl, MVT::i1, Op, getZero(dl, ty(Op), DAG),
2767 SDValue Op = DAG.getNode(ISD::SUB, dl, VTs.VTs[0], {X, Y});
2768 SDValue Ov = DAG.getSetCC(dl, MVT::i1, Op,
2777 SDValue
2778 HexagonTargetLowering::LowerAddSubCarry(SDValue Op, SelectionDAG &DAG) const {
2781 SDValue X = Op.getOperand(0), Y = Op.getOperand(1), C = Op.getOperand(2);
2788 SDValue SubC = DAG.getNode(HexagonISD::SUBC, dl, Op.getNode()->getVTList(),
2790 SDValue Out[] = { SubC.getValue(0),
2795 SDValue
2796 HexagonTargetLowering::LowerEH_RETURN(SDValue Op, SelectionDAG &DAG) const {
2797 SDValue Chain = Op.getOperand(0);
2798 SDValue Offset = Op.getOperand(1);
2799 SDValue Handler = Op.getOperand(2);
2810 SDValue StoreAddr =
2822 SDValue
2823 HexagonTargetLowering::LowerOperation(SDValue Op, SelectionDAG &DAG) const {
2832 if (SDValue V = LowerHvxOperation(Op, DAG))
2888 SmallVectorImpl<SDValue> &Results,
2901 SmallVectorImpl<SDValue> &Results,
2912 SDValue P = getInstr(Hexagon::C2_tfrpr, dl, MVT::i32,
2914 SDValue T = DAG.getAnyExtOrTrunc(P, dl, MVT::i8);
2921 SDValue
2924 SDValue Op(N, 0);
2926 if (SDValue V = PerformHvxDAGCombine(N, DCI))
2935 SDValue P = Op.getOperand(0);
2948 SDValue Cond = Op.getOperand(0);
2950 SDValue C0 = Cond.getOperand(0), C1 = Cond.getOperand(1);
2952 SDValue VSel = DCI.DAG.getNode(ISD::VSELECT, dl, ty(Op), C0,
2963 SDValue
2964 HexagonTargetLowering::getPICJumpTableRelocBase(SDValue Table,
2968 SDValue T = DAG.getTargetJumpTable(Idx, VT, HexagonII::MO_PCREL);
3115 SDValue Callee,
3121 const SmallVectorImpl<SDValue> &OutVals,
3227 std::pair<SDValue,int> BO = getBaseAndOffset(L->getBasePtr());
lib/Target/Hexagon/HexagonISelLowering.h 115 bool IsEligibleForTailCallOptimization(SDValue Callee,
118 const SmallVectorImpl<SDValue> &OutVals,
132 bool hasBitTest(SDValue X, SDValue Y) const override;
132 bool hasBitTest(SDValue X, SDValue Y) const override;
150 SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
150 SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
151 void LowerOperationWrapper(SDNode *N, SmallVectorImpl<SDValue> &Results,
153 void ReplaceNodeResults(SDNode *N, SmallVectorImpl<SDValue> &Results,
158 SDValue LowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG) const;
158 SDValue LowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG) const;
159 SDValue LowerCONCAT_VECTORS(SDValue Op, SelectionDAG &DAG) const;
159 SDValue LowerCONCAT_VECTORS(SDValue Op, SelectionDAG &DAG) const;
160 SDValue LowerEXTRACT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const;
160 SDValue LowerEXTRACT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const;
161 SDValue LowerEXTRACT_SUBVECTOR(SDValue Op, SelectionDAG &DAG) const;
161 SDValue LowerEXTRACT_SUBVECTOR(SDValue Op, SelectionDAG &DAG) const;
162 SDValue LowerINSERT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const;
162 SDValue LowerINSERT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const;
163 SDValue LowerINSERT_SUBVECTOR(SDValue Op, SelectionDAG &DAG) const;
163 SDValue LowerINSERT_SUBVECTOR(SDValue Op, SelectionDAG &DAG) const;
164 SDValue LowerVECTOR_SHUFFLE(SDValue Op, SelectionDAG &DAG) const;
164 SDValue LowerVECTOR_SHUFFLE(SDValue Op, SelectionDAG &DAG) const;
165 SDValue LowerVECTOR_SHIFT(SDValue Op, SelectionDAG &DAG) const;
165 SDValue LowerVECTOR_SHIFT(SDValue Op, SelectionDAG &DAG) const;
166 SDValue LowerROTL(SDValue Op, SelectionDAG &DAG) const;
166 SDValue LowerROTL(SDValue Op, SelectionDAG &DAG) const;
167 SDValue LowerBITCAST(SDValue Op, SelectionDAG &DAG) const;
167 SDValue LowerBITCAST(SDValue Op, SelectionDAG &DAG) const;
168 SDValue LowerANY_EXTEND(SDValue Op, SelectionDAG &DAG) const;
168 SDValue LowerANY_EXTEND(SDValue Op, SelectionDAG &DAG) const;
169 SDValue LowerSIGN_EXTEND(SDValue Op, SelectionDAG &DAG) const;
169 SDValue LowerSIGN_EXTEND(SDValue Op, SelectionDAG &DAG) const;
170 SDValue LowerZERO_EXTEND(SDValue Op, SelectionDAG &DAG) const;
170 SDValue LowerZERO_EXTEND(SDValue Op, SelectionDAG &DAG) const;
171 SDValue LowerLoad(SDValue Op, SelectionDAG &DAG) const;
171 SDValue LowerLoad(SDValue Op, SelectionDAG &DAG) const;
172 SDValue LowerStore(SDValue Op, SelectionDAG &DAG) const;
172 SDValue LowerStore(SDValue Op, SelectionDAG &DAG) const;
173 SDValue LowerUnalignedLoad(SDValue Op, SelectionDAG &DAG) const;
173 SDValue LowerUnalignedLoad(SDValue Op, SelectionDAG &DAG) const;
174 SDValue LowerUAddSubO(SDValue Op, SelectionDAG &DAG) const;
174 SDValue LowerUAddSubO(SDValue Op, SelectionDAG &DAG) const;
175 SDValue LowerAddSubCarry(SDValue Op, SelectionDAG &DAG) const;
175 SDValue LowerAddSubCarry(SDValue Op, SelectionDAG &DAG) const;
177 SDValue LowerDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG) const;
177 SDValue LowerDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG) const;
178 SDValue LowerINLINEASM(SDValue Op, SelectionDAG &DAG) const;
178 SDValue LowerINLINEASM(SDValue Op, SelectionDAG &DAG) const;
179 SDValue LowerPREFETCH(SDValue Op, SelectionDAG &DAG) const;
179 SDValue LowerPREFETCH(SDValue Op, SelectionDAG &DAG) const;
180 SDValue LowerREADCYCLECOUNTER(SDValue Op, SelectionDAG &DAG) const;
180 SDValue LowerREADCYCLECOUNTER(SDValue Op, SelectionDAG &DAG) const;
181 SDValue LowerEH_LABEL(SDValue Op, SelectionDAG &DAG) const;
181 SDValue LowerEH_LABEL(SDValue Op, SelectionDAG &DAG) const;
182 SDValue LowerEH_RETURN(SDValue Op, SelectionDAG &DAG) const;
182 SDValue LowerEH_RETURN(SDValue Op, SelectionDAG &DAG) const;
183 SDValue
184 LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
187 SmallVectorImpl<SDValue> &InVals) const override;
188 SDValue LowerGLOBALADDRESS(SDValue Op, SelectionDAG &DAG) const;
188 SDValue LowerGLOBALADDRESS(SDValue Op, SelectionDAG &DAG) const;
189 SDValue LowerBlockAddress(SDValue Op, SelectionDAG &DAG) const;
189 SDValue LowerBlockAddress(SDValue Op, SelectionDAG &DAG) const;
190 SDValue LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const;
190 SDValue LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const;
191 SDValue LowerToTLSGeneralDynamicModel(GlobalAddressSDNode *GA,
193 SDValue LowerToTLSInitialExecModel(GlobalAddressSDNode *GA,
195 SDValue LowerToTLSLocalExecModel(GlobalAddressSDNode *GA,
197 SDValue GetDynamicTLSAddr(SelectionDAG &DAG, SDValue Chain,
197 SDValue GetDynamicTLSAddr(SelectionDAG &DAG, SDValue Chain,
198 GlobalAddressSDNode *GA, SDValue InFlag, EVT PtrVT,
200 SDValue LowerGLOBAL_OFFSET_TABLE(SDValue Op, SelectionDAG &DAG) const;
200 SDValue LowerGLOBAL_OFFSET_TABLE(SDValue Op, SelectionDAG &DAG) const;
202 SDValue LowerCall(TargetLowering::CallLoweringInfo &CLI,
203 SmallVectorImpl<SDValue> &InVals) const override;
204 SDValue LowerCallResult(SDValue Chain, SDValue InFlag,
204 SDValue LowerCallResult(SDValue Chain, SDValue InFlag,
204 SDValue LowerCallResult(SDValue Chain, SDValue InFlag,
208 SmallVectorImpl<SDValue> &InVals,
209 const SmallVectorImpl<SDValue> &OutVals,
210 SDValue Callee) const;
212 SDValue LowerSETCC(SDValue Op, SelectionDAG &DAG) const;
212 SDValue LowerSETCC(SDValue Op, SelectionDAG &DAG) const;
213 SDValue LowerVSELECT(SDValue Op, SelectionDAG &DAG) const;
213 SDValue LowerVSELECT(SDValue Op, SelectionDAG &DAG) const;
214 SDValue LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const;
214 SDValue LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const;
215 SDValue LowerATOMIC_FENCE(SDValue Op, SelectionDAG& DAG) const;
215 SDValue LowerATOMIC_FENCE(SDValue Op, SelectionDAG& DAG) const;
216 SDValue LowerRETURNADDR(SDValue Op, SelectionDAG &DAG) const;
216 SDValue LowerRETURNADDR(SDValue Op, SelectionDAG &DAG) const;
223 SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
223 SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
225 const SmallVectorImpl<SDValue> &OutVals,
228 SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const override;
249 SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG) const;
249 SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG) const;
250 SDValue LowerConstantPool(SDValue Op, SelectionDAG &DAG) const;
250 SDValue LowerConstantPool(SDValue Op, SelectionDAG &DAG) const;
251 SDValue LowerJumpTable(SDValue Op, SelectionDAG &DAG) const;
251 SDValue LowerJumpTable(SDValue Op, SelectionDAG &DAG) const;
262 SDValue &Base, SDValue &Offset,
262 SDValue &Base, SDValue &Offset,
280 SDValue LowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG) const;
280 SDValue LowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG) const;
281 SDValue LowerINTRINSIC_VOID(SDValue Op, SelectionDAG &DAG) const;
281 SDValue LowerINTRINSIC_VOID(SDValue Op, SelectionDAG &DAG) const;
312 SDValue getPICJumpTableRelocBase(SDValue Table, SelectionDAG &DAG)
312 SDValue getPICJumpTableRelocBase(SDValue Table, SelectionDAG &DAG)
335 void validateConstPtrAlignment(SDValue Ptr, const SDLoc &dl,
338 std::pair<SDValue,int> getBaseAndOffset(SDValue Addr) const;
338 std::pair<SDValue,int> getBaseAndOffset(SDValue Addr) const;
340 bool getBuildVectorConstInts(ArrayRef<SDValue> Values, MVT VecTy,
343 SDValue buildVector32(ArrayRef<SDValue> Elem, const SDLoc &dl, MVT VecTy,
343 SDValue buildVector32(ArrayRef<SDValue> Elem, const SDLoc &dl, MVT VecTy,
345 SDValue buildVector64(ArrayRef<SDValue> Elem, const SDLoc &dl, MVT VecTy,
345 SDValue buildVector64(ArrayRef<SDValue> Elem, const SDLoc &dl, MVT VecTy,
347 SDValue extractVector(SDValue VecV, SDValue IdxV, const SDLoc &dl,
347 SDValue extractVector(SDValue VecV, SDValue IdxV, const SDLoc &dl,
347 SDValue extractVector(SDValue VecV, SDValue IdxV, const SDLoc &dl,
349 SDValue insertVector(SDValue VecV, SDValue ValV, SDValue IdxV,
349 SDValue insertVector(SDValue VecV, SDValue ValV, SDValue IdxV,
349 SDValue insertVector(SDValue VecV, SDValue ValV, SDValue IdxV,
349 SDValue insertVector(SDValue VecV, SDValue ValV, SDValue IdxV,
351 SDValue expandPredicate(SDValue Vec32, const SDLoc &dl,
351 SDValue expandPredicate(SDValue Vec32, const SDLoc &dl,
353 SDValue contractPredicate(SDValue Vec64, const SDLoc &dl,
353 SDValue contractPredicate(SDValue Vec64, const SDLoc &dl,
355 SDValue getVectorShiftByInt(SDValue Op, SelectionDAG &DAG) const;
355 SDValue getVectorShiftByInt(SDValue Op, SelectionDAG &DAG) const;
357 bool isUndef(SDValue Op) const {
362 SDValue getInstr(unsigned MachineOpc, const SDLoc &dl, MVT Ty,
363 ArrayRef<SDValue> Ops, SelectionDAG &DAG) const {
367 SDValue getZero(const SDLoc &dl, MVT Ty, SelectionDAG &DAG) const;
369 using VectorPair = std::pair<SDValue, SDValue>;
369 using VectorPair = std::pair<SDValue, SDValue>;
372 SDValue getInt(unsigned IntId, MVT ResTy, ArrayRef<SDValue> Ops,
372 SDValue getInt(unsigned IntId, MVT ResTy, ArrayRef<SDValue> Ops,
375 MVT ty(SDValue Op) const {
401 SDValue opJoin(const VectorPair &Ops, const SDLoc &dl,
403 VectorPair opSplit(SDValue Vec, const SDLoc &dl, SelectionDAG &DAG) const;
404 SDValue opCastElem(SDValue Vec, MVT ElemTy, SelectionDAG &DAG) const;
404 SDValue opCastElem(SDValue Vec, MVT ElemTy, SelectionDAG &DAG) const;
408 SDValue convertToByteIndex(SDValue ElemIdx, MVT ElemTy,
408 SDValue convertToByteIndex(SDValue ElemIdx, MVT ElemTy,
410 SDValue getIndexInWord32(SDValue Idx, MVT ElemTy, SelectionDAG &DAG) const;
410 SDValue getIndexInWord32(SDValue Idx, MVT ElemTy, SelectionDAG &DAG) const;
411 SDValue getByteShuffle(const SDLoc &dl, SDValue Op0, SDValue Op1,
411 SDValue getByteShuffle(const SDLoc &dl, SDValue Op0, SDValue Op1,
411 SDValue getByteShuffle(const SDLoc &dl, SDValue Op0, SDValue Op1,
414 SDValue buildHvxVectorReg(ArrayRef<SDValue> Values, const SDLoc &dl,
414 SDValue buildHvxVectorReg(ArrayRef<SDValue> Values, const SDLoc &dl,
416 SDValue buildHvxVectorPred(ArrayRef<SDValue> Values, const SDLoc &dl,
416 SDValue buildHvxVectorPred(ArrayRef<SDValue> Values, const SDLoc &dl,
418 SDValue createHvxPrefixPred(SDValue PredV, const SDLoc &dl,
418 SDValue createHvxPrefixPred(SDValue PredV, const SDLoc &dl,
421 SDValue extractHvxElementReg(SDValue VecV, SDValue IdxV, const SDLoc &dl,
421 SDValue extractHvxElementReg(SDValue VecV, SDValue IdxV, const SDLoc &dl,
421 SDValue extractHvxElementReg(SDValue VecV, SDValue IdxV, const SDLoc &dl,
423 SDValue extractHvxElementPred(SDValue VecV, SDValue IdxV, const SDLoc &dl,
423 SDValue extractHvxElementPred(SDValue VecV, SDValue IdxV, const SDLoc &dl,
423 SDValue extractHvxElementPred(SDValue VecV, SDValue IdxV, const SDLoc &dl,
425 SDValue insertHvxElementReg(SDValue VecV, SDValue IdxV, SDValue ValV,
425 SDValue insertHvxElementReg(SDValue VecV, SDValue IdxV, SDValue ValV,
425 SDValue insertHvxElementReg(SDValue VecV, SDValue IdxV, SDValue ValV,
425 SDValue insertHvxElementReg(SDValue VecV, SDValue IdxV, SDValue ValV,
427 SDValue insertHvxElementPred(SDValue VecV, SDValue IdxV, SDValue ValV,
427 SDValue insertHvxElementPred(SDValue VecV, SDValue IdxV, SDValue ValV,
427 SDValue insertHvxElementPred(SDValue VecV, SDValue IdxV, SDValue ValV,
427 SDValue insertHvxElementPred(SDValue VecV, SDValue IdxV, SDValue ValV,
429 SDValue extractHvxSubvectorReg(SDValue VecV, SDValue IdxV, const SDLoc &dl,
429 SDValue extractHvxSubvectorReg(SDValue VecV, SDValue IdxV, const SDLoc &dl,
429 SDValue extractHvxSubvectorReg(SDValue VecV, SDValue IdxV, const SDLoc &dl,
431 SDValue extractHvxSubvectorPred(SDValue VecV, SDValue IdxV, const SDLoc &dl,
431 SDValue extractHvxSubvectorPred(SDValue VecV, SDValue IdxV, const SDLoc &dl,
431 SDValue extractHvxSubvectorPred(SDValue VecV, SDValue IdxV, const SDLoc &dl,
433 SDValue insertHvxSubvectorReg(SDValue VecV, SDValue SubV, SDValue IdxV,
433 SDValue insertHvxSubvectorReg(SDValue VecV, SDValue SubV, SDValue IdxV,
433 SDValue insertHvxSubvectorReg(SDValue VecV, SDValue SubV, SDValue IdxV,
433 SDValue insertHvxSubvectorReg(SDValue VecV, SDValue SubV, SDValue IdxV,
435 SDValue insertHvxSubvectorPred(SDValue VecV, SDValue SubV, SDValue IdxV,
435 SDValue insertHvxSubvectorPred(SDValue VecV, SDValue SubV, SDValue IdxV,
435 SDValue insertHvxSubvectorPred(SDValue VecV, SDValue SubV, SDValue IdxV,
435 SDValue insertHvxSubvectorPred(SDValue VecV, SDValue SubV, SDValue IdxV,
437 SDValue extendHvxVectorPred(SDValue VecV, const SDLoc &dl, MVT ResTy,
437 SDValue extendHvxVectorPred(SDValue VecV, const SDLoc &dl, MVT ResTy,
440 SDValue LowerHvxBuildVector(SDValue Op, SelectionDAG &DAG) const;
440 SDValue LowerHvxBuildVector(SDValue Op, SelectionDAG &DAG) const;
441 SDValue LowerHvxConcatVectors(SDValue Op, SelectionDAG &DAG) const;
441 SDValue LowerHvxConcatVectors(SDValue Op, SelectionDAG &DAG) const;
442 SDValue LowerHvxExtractElement(SDValue Op, SelectionDAG &DAG) const;
442 SDValue LowerHvxExtractElement(SDValue Op, SelectionDAG &DAG) const;
443 SDValue LowerHvxInsertElement(SDValue Op, SelectionDAG &DAG) const;
443 SDValue LowerHvxInsertElement(SDValue Op, SelectionDAG &DAG) const;
444 SDValue LowerHvxExtractSubvector(SDValue Op, SelectionDAG &DAG) const;
444 SDValue LowerHvxExtractSubvector(SDValue Op, SelectionDAG &DAG) const;
445 SDValue LowerHvxInsertSubvector(SDValue Op, SelectionDAG &DAG) const;
445 SDValue LowerHvxInsertSubvector(SDValue Op, SelectionDAG &DAG) const;
447 SDValue LowerHvxAnyExt(SDValue Op, SelectionDAG &DAG) const;
447 SDValue LowerHvxAnyExt(SDValue Op, SelectionDAG &DAG) const;
448 SDValue LowerHvxSignExt(SDValue Op, SelectionDAG &DAG) const;
448 SDValue LowerHvxSignExt(SDValue Op, SelectionDAG &DAG) const;
449 SDValue LowerHvxZeroExt(SDValue Op, SelectionDAG &DAG) const;
449 SDValue LowerHvxZeroExt(SDValue Op, SelectionDAG &DAG) const;
450 SDValue LowerHvxCttz(SDValue Op, SelectionDAG &DAG) const;
450 SDValue LowerHvxCttz(SDValue Op, SelectionDAG &DAG) const;
451 SDValue LowerHvxMul(SDValue Op, SelectionDAG &DAG) const;
451 SDValue LowerHvxMul(SDValue Op, SelectionDAG &DAG) const;
452 SDValue LowerHvxMulh(SDValue Op, SelectionDAG &DAG) const;
452 SDValue LowerHvxMulh(SDValue Op, SelectionDAG &DAG) const;
453 SDValue LowerHvxSetCC(SDValue Op, SelectionDAG &DAG) const;
453 SDValue LowerHvxSetCC(SDValue Op, SelectionDAG &DAG) const;
454 SDValue LowerHvxExtend(SDValue Op, SelectionDAG &DAG) const;
454 SDValue LowerHvxExtend(SDValue Op, SelectionDAG &DAG) const;
455 SDValue LowerHvxShift(SDValue Op, SelectionDAG &DAG) const;
455 SDValue LowerHvxShift(SDValue Op, SelectionDAG &DAG) const;
457 SDValue SplitHvxPairOp(SDValue Op, SelectionDAG &DAG) const;
457 SDValue SplitHvxPairOp(SDValue Op, SelectionDAG &DAG) const;
458 SDValue SplitHvxMemOp(SDValue Op, SelectionDAG &DAG) const;
458 SDValue SplitHvxMemOp(SDValue Op, SelectionDAG &DAG) const;
464 bool isHvxOperation(SDValue Op) const;
465 SDValue LowerHvxOperation(SDValue Op, SelectionDAG &DAG) const;
465 SDValue LowerHvxOperation(SDValue Op, SelectionDAG &DAG) const;
467 SDValue PerformHvxDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const;
lib/Target/Hexagon/HexagonISelLoweringHVX.cpp 200 SDValue
201 HexagonTargetLowering::getInt(unsigned IntId, MVT ResTy, ArrayRef<SDValue> Ops,
203 SmallVector<SDValue,4> IntOps;
205 for (const SDValue &Op : Ops)
242 SDValue
243 HexagonTargetLowering::opCastElem(SDValue Vec, MVT ElemTy,
251 SDValue
259 HexagonTargetLowering::opSplit(SDValue Vec, const SDLoc &dl,
279 SDValue
280 HexagonTargetLowering::convertToByteIndex(SDValue ElemIdx, MVT ElemTy,
295 SDValue
296 HexagonTargetLowering::getIndexInWord32(SDValue Idx, MVT ElemTy,
306 SDValue Mask = DAG.getConstant(32/ElemWidth - 1, dl, MVT::i32);
307 SDValue SubIdx = DAG.getNode(ISD::AND, dl, MVT::i32, {Idx, Mask});
311 SDValue
312 HexagonTargetLowering::getByteShuffle(const SDLoc &dl, SDValue Op0,
313 SDValue Op1, ArrayRef<int> Mask,
342 SDValue
343 HexagonTargetLowering::buildHvxVectorReg(ArrayRef<SDValue> Values,
354 SmallVector<SDValue,32> Words;
361 SDValue W = buildVector32(Values.slice(i, OpsPerWord), dl, PartVT, DAG);
370 SDValue SplatV;
399 SDValue CP = LowerConstantPool(DAG.getConstantPool(CV, VecTy, Align), DAG);
413 SDValue Vec;
414 for (SDValue V : Values) {
422 SDValue T = V.getOperand(0);
438 SDValue ExtVec;
466 SDValue S = DAG.getVectorShuffle(ExtTy, dl, ExtVec,
476 SDValue HalfV0 = getInstr(Hexagon::V6_vd0, dl, VecTy, {}, DAG);
477 SDValue HalfV1 = getInstr(Hexagon::V6_vd0, dl, VecTy, {}, DAG);
478 SDValue S = DAG.getConstant(4, dl, MVT::i32);
480 SDValue N = DAG.getNode(HexagonISD::VINSERTW0, dl, VecTy,
482 SDValue M = DAG.getNode(HexagonISD::VINSERTW0, dl, VecTy,
490 SDValue DstV = DAG.getNode(ISD::OR, dl, VecTy, {HalfV0, HalfV1});
494 SDValue
495 HexagonTargetLowering::createHvxPrefixPred(SDValue PredV, const SDLoc &dl,
510 SDValue T = DAG.getNode(HexagonISD::Q2V, dl, ByteTy, PredV);
521 SDValue S = DAG.getVectorShuffle(ByteTy, dl, T, DAG.getUNDEF(ByteTy), Mask);
526 SDValue Q = getInstr(Hexagon::V6_pred_scalar2, dl, BoolTy,
528 SDValue M = DAG.getNode(HexagonISD::Q2V, dl, ByteTy, Q);
536 SmallVector<SDValue,4> Words[2];
546 SDValue W0 = isUndef(PredV)
557 for (const SDValue &W : Words[IdxW ^ 1]) {
558 SDValue T = expandPredicate(W, dl, DAG);
563 for (const SDValue &W : Words[IdxW ^ 1]) {
573 SDValue Vec = ZeroFill ? getZero(dl, ByteTy, DAG) : DAG.getUNDEF(ByteTy);
574 SDValue S4 = DAG.getConstant(HwLen-4, dl, MVT::i32);
575 for (const SDValue &W : Words[IdxW]) {
583 SDValue
584 HexagonTargetLowering::buildHvxVectorPred(ArrayRef<SDValue> Values,
592 SmallVector<SDValue,128> Bytes;
612 for (SDValue V : Values) {
616 SDValue Ext = !V.isUndef() ? DAG.getZExtOrTrunc(V, dl, MVT::i8)
632 SDValue F = Values[I+B];
636 SDValue Ext = (B < 8) ? DAG.getZExtOrTrunc(F, dl, MVT::i8)
652 SDValue ByteVec = buildHvxVectorReg(Bytes, dl, ByteTy, DAG);
656 SDValue
657 HexagonTargetLowering::extractHvxElementReg(SDValue VecV, SDValue IdxV,
657 HexagonTargetLowering::extractHvxElementReg(SDValue VecV, SDValue IdxV,
665 SDValue ByteIdx = convertToByteIndex(IdxV, ElemTy, DAG);
666 SDValue ExWord = DAG.getNode(HexagonISD::VEXTRACTW, dl, MVT::i32,
674 SDValue SubIdx = getIndexInWord32(IdxV, ElemTy, DAG);
676 SDValue ExVec = DAG.getBitcast(tyVector(ty(ExWord), ElemTy), ExWord);
680 SDValue
681 HexagonTargetLowering::extractHvxElementPred(SDValue VecV, SDValue IdxV,
681 HexagonTargetLowering::extractHvxElementPred(SDValue VecV, SDValue IdxV,
688 SDValue ByteVec = DAG.getNode(HexagonISD::Q2V, dl, ByteTy, VecV);
691 SDValue ScV = DAG.getConstant(Scale, dl, MVT::i32);
694 SDValue ExtB = extractHvxElementReg(ByteVec, IdxV, dl, MVT::i32, DAG);
695 SDValue Zero = DAG.getTargetConstant(0, dl, MVT::i32);
699 SDValue
700 HexagonTargetLowering::insertHvxElementReg(SDValue VecV, SDValue IdxV,
700 HexagonTargetLowering::insertHvxElementReg(SDValue VecV, SDValue IdxV,
701 SDValue ValV, const SDLoc &dl, SelectionDAG &DAG) const {
712 SDValue MaskV = DAG.getNode(ISD::AND, dl, MVT::i32,
714 SDValue RotV = DAG.getNode(HexagonISD::VROR, dl, VecTy, {VecV, MaskV});
715 SDValue InsV = DAG.getNode(HexagonISD::VINSERTW0, dl, VecTy, {RotV, ValV});
716 SDValue SubV = DAG.getNode(ISD::SUB, dl, MVT::i32,
718 SDValue TorV = DAG.getNode(HexagonISD::VROR, dl, VecTy, {InsV, SubV});
722 SDValue ByteIdx = convertToByteIndex(IdxV, ElemTy, DAG);
728 SDValue WordIdx = DAG.getNode(ISD::SRL, dl, MVT::i32,
730 SDValue Ext = extractHvxElementReg(opCastElem(VecV, MVT::i32, DAG), WordIdx,
735 SDValue SubIdx = getIndexInWord32(IdxV, ElemTy, DAG);
737 SDValue Ins = insertVector(DAG.getBitcast(SubVecTy, Ext),
744 SDValue
745 HexagonTargetLowering::insertHvxElementPred(SDValue VecV, SDValue IdxV,
745 HexagonTargetLowering::insertHvxElementPred(SDValue VecV, SDValue IdxV,
746 SDValue ValV, const SDLoc &dl, SelectionDAG &DAG) const {
749 SDValue ByteVec = DAG.getNode(HexagonISD::Q2V, dl, ByteTy, VecV);
752 SDValue ScV = DAG.getConstant(Scale, dl, MVT::i32);
756 SDValue InsV = insertHvxElementReg(ByteVec, IdxV, ValV, dl, DAG);
760 SDValue
761 HexagonTargetLowering::extractHvxSubvectorReg(SDValue VecV, SDValue IdxV,
761 HexagonTargetLowering::extractHvxSubvectorReg(SDValue VecV, SDValue IdxV,
791 SDValue WordVec = DAG.getBitcast(WordTy, VecV);
794 SDValue W0Idx = DAG.getConstant(WordIdx, dl, MVT::i32);
795 SDValue W0 = extractHvxElementReg(WordVec, W0Idx, dl, MVT::i32, DAG);
799 SDValue W1Idx = DAG.getConstant(WordIdx+1, dl, MVT::i32);
800 SDValue W1 = extractHvxElementReg(WordVec, W1Idx, dl, MVT::i32, DAG);
801 SDValue WW = DAG.getNode(HexagonISD::COMBINE, dl, MVT::i64, {W1, W0});
805 SDValue
806 HexagonTargetLowering::extractHvxSubvectorPred(SDValue VecV, SDValue IdxV,
806 HexagonTargetLowering::extractHvxSubvectorPred(SDValue VecV, SDValue IdxV,
811 SDValue ByteVec = DAG.getNode(HexagonISD::Q2V, dl, ByteTy, VecV);
818 SDValue Undef = DAG.getUNDEF(ByteTy);
832 SDValue ShuffV = DAG.getVectorShuffle(ByteTy, dl, ByteVec, Undef, Mask);
857 SDValue Zero = getZero(dl, MVT::i32, DAG);
858 SDValue ShuffV = DAG.getVectorShuffle(ByteTy, dl, ByteVec, Undef, Mask);
861 SDValue W0 = DAG.getNode(HexagonISD::VEXTRACTW, dl, MVT::i32, {ShuffV, Zero});
862 SDValue W1 = DAG.getNode(HexagonISD::VEXTRACTW, dl, MVT::i32,
864 SDValue Vec64 = DAG.getNode(HexagonISD::COMBINE, dl, MVT::v8i8, {W1, W0});
869 SDValue
870 HexagonTargetLowering::insertHvxSubvectorReg(SDValue VecV, SDValue SubV,
870 HexagonTargetLowering::insertHvxSubvectorReg(SDValue VecV, SDValue SubV,
871 SDValue IdxV, const SDLoc &dl, SelectionDAG &DAG) const {
881 SDValue V0, V1;
882 SDValue SingleV = VecV;
883 SDValue PickHi;
889 SDValue HalfV = DAG.getConstant(SingleTy.getVectorNumElements(),
902 SDValue InLo = DAG.getNode(ISD::CONCAT_VECTORS, dl, VecTy, {SubV, V1});
903 SDValue InHi = DAG.getNode(ISD::CONCAT_VECTORS, dl, VecTy, {V0, SubV});
909 SDValue S = DAG.getNode(ISD::SUB, dl, MVT::i32, IdxV, HalfV);
929 SDValue V = DAG.getBitcast(MVT::i32, SubV);
932 SDValue V = DAG.getBitcast(MVT::i64, SubV);
933 SDValue R0 = DAG.getTargetExtractSubreg(Hexagon::isub_lo, dl, MVT::i32, V);
934 SDValue R1 = DAG.getTargetExtractSubreg(Hexagon::isub_hi, dl, MVT::i32, V);
943 SDValue RolV = DAG.getNode(ISD::SUB, dl, MVT::i32,
949 SDValue InLo = DAG.getNode(ISD::CONCAT_VECTORS, dl, VecTy, {SingleV, V1});
950 SDValue InHi = DAG.getNode(ISD::CONCAT_VECTORS, dl, VecTy, {V0, SingleV});
956 SDValue
957 HexagonTargetLowering::insertHvxSubvectorPred(SDValue VecV, SDValue SubV,
957 HexagonTargetLowering::insertHvxSubvectorPred(SDValue VecV, SDValue SubV,
958 SDValue IdxV, const SDLoc &dl, SelectionDAG &DAG) const {
974 SDValue ByteVec = DAG.getNode(HexagonISD::Q2V, dl, ByteTy, VecV);
975 SDValue ByteSub = createHvxPrefixPred(SubV, dl, BitBytes, false, DAG);
976 SDValue ByteIdx;
989 SDValue Q = getInstr(Hexagon::V6_pred_scalar2, dl, BoolTy,
994 SDValue HwLenV = DAG.getConstant(HwLen, dl, MVT::i32);
995 SDValue ByteXdi = DAG.getNode(ISD::SUB, dl, MVT::i32, HwLenV, ByteIdx);
1001 SDValue
1002 HexagonTargetLowering::extendHvxVectorPred(SDValue VecV, const SDLoc &dl,
1012 SDValue True = DAG.getNode(HexagonISD::VSPLAT, dl, ResTy,
1014 SDValue False = getZero(dl, ResTy, DAG);
1018 SDValue
1019 HexagonTargetLowering::LowerHvxBuildVector(SDValue Op, SelectionDAG &DAG)
1025 SmallVector<SDValue,128> Ops;
1033 ArrayRef<SDValue> A(Ops);
1035 SDValue V0 = buildHvxVectorReg(A.take_front(Size/2), dl, SingleTy, DAG);
1036 SDValue V1 = buildHvxVectorReg(A.drop_front(Size/2), dl, SingleTy, DAG);
1043 SDValue
1044 HexagonTargetLowering::LowerHvxConcatVectors(SDValue Op, SelectionDAG &DAG)
1056 SmallVector<SDValue,8> Elems;
1057 for (SDValue V : Op.getNode()->ops())
1065 SDValue V = Elems[i];
1092 SDValue Op0 = Op.getOperand(0);
1101 SmallVector<SDValue,4> SV(U.begin(), U.end());
1102 ArrayRef<SDValue> Ops(SV);
1105 SDValue V0 = DAG.getNode(ISD::CONCAT_VECTORS, dl, HalfTy,
1107 SDValue V1 = DAG.getNode(ISD::CONCAT_VECTORS, dl, HalfTy,
1116 SmallVector<SDValue,8> Prefixes;
1117 for (SDValue V : Op.getNode()->op_values()) {
1118 SDValue P = createHvxPrefixPred(V, dl, BitBytes, true, DAG);
1124 SDValue S = DAG.getConstant(InpLen*BitBytes, dl, MVT::i32);
1125 SDValue Res = getZero(dl, ByteTy, DAG);
1133 SDValue
1134 HexagonTargetLowering::LowerHvxExtractElement(SDValue Op, SelectionDAG &DAG)
1137 SDValue VecV = Op.getOperand(0);
1140 SDValue IdxV = Op.getOperand(1);
1147 SDValue
1148 HexagonTargetLowering::LowerHvxInsertElement(SDValue Op, SelectionDAG &DAG)
1151 SDValue VecV = Op.getOperand(0);
1152 SDValue ValV = Op.getOperand(1);
1153 SDValue IdxV = Op.getOperand(2);
1161 SDValue
1162 HexagonTargetLowering::LowerHvxExtractSubvector(SDValue Op, SelectionDAG &DAG)
1164 SDValue SrcV = Op.getOperand(0);
1167 SDValue IdxV = Op.getOperand(1);
1180 SDValue
1181 HexagonTargetLowering::LowerHvxInsertSubvector(SDValue Op, SelectionDAG &DAG)
1184 SDValue VecV = Op.getOperand(0);
1185 SDValue ValV = Op.getOperand(1);
1186 SDValue IdxV = Op.getOperand(2);
1197 SDValue
1198 HexagonTargetLowering::LowerHvxAnyExt(SDValue Op, SelectionDAG &DAG) const {
1204 SDValue InpV = Op.getOperand(0);
1211 SDValue
1212 HexagonTargetLowering::LowerHvxSignExt(SDValue Op, SelectionDAG &DAG) const {
1214 SDValue InpV = Op.getOperand(0);
1221 SDValue
1222 HexagonTargetLowering::LowerHvxZeroExt(SDValue Op, SelectionDAG &DAG) const {
1224 SDValue InpV = Op.getOperand(0);
1231 SDValue
1232 HexagonTargetLowering::LowerHvxCttz(SDValue Op, SelectionDAG &DAG) const {
1237 SDValue InpV = Op.getOperand(0);
1250 SDValue Vec1 = DAG.getNode(HexagonISD::VSPLATW, dl, ResTy,
1252 SDValue VecW = DAG.getNode(HexagonISD::VSPLATW, dl, ResTy,
1254 SDValue VecN1 = DAG.getNode(HexagonISD::VSPLATW, dl, ResTy,
1259 SDValue A = DAG.getNode(ISD::AND, dl, ResTy,
1266 SDValue
1267 HexagonTargetLowering::LowerHvxMul(SDValue Op, SelectionDAG &DAG) const {
1275 SDValue Vs = Op.getOperand(0);
1276 SDValue Vt = Op.getOperand(1);
1286 SDValue M = getInstr(MpyOpc, dl, ExtTy, {Vs, Vt}, DAG);
1294 SDValue BS = getByteShuffle(dl, P.first, P.second, ShuffMask, DAG);
1307 SDValue S16 = DAG.getConstant(16, dl, MVT::i32);
1308 SDValue T0 = getInstr(Hexagon::V6_vmpyiowh, dl, ResTy, {Vs, Vt}, DAG);
1309 SDValue T1 = getInstr(Hexagon::V6_vaslw, dl, ResTy, {T0, S16}, DAG);
1310 SDValue T2 = getInstr(Hexagon::V6_vmpyiewuh_acc, dl, ResTy,
1320 SDValue
1321 HexagonTargetLowering::LowerHvxMulh(SDValue Op, SelectionDAG &DAG) const {
1329 SDValue Vs = Op.getOperand(0);
1330 SDValue Vt = Op.getOperand(1);
1344 SDValue M = getInstr(MpyOpc, dl, ExtTy, {Vs, Vt}, DAG);
1352 SDValue BS = getByteShuffle(dl, P.first, P.second, ShuffMask, DAG);
1357 SDValue S16 = DAG.getConstant(16, dl, MVT::i32);
1374 SDValue T0 = getInstr(Hexagon::V6_vmpyewuh, dl, ResTy, {Vt, Vs}, DAG);
1376 SDValue S0 = getInstr(Hexagon::V6_vasrw, dl, ResTy, {Vs, S16}, DAG);
1377 SDValue T1 = getInstr(Hexagon::V6_vmpyiewuh_acc, dl, ResTy,
1380 SDValue S2 = getInstr(Hexagon::V6_vasrw, dl, ResTy, {T1, S16}, DAG);
1382 SDValue T2 = getInstr(Hexagon::V6_vmpyiowh, dl, ResTy, {S0, Vt}, DAG);
1384 SDValue T3 = DAG.getNode(ISD::ADD, dl, ResTy, {S2, T2});
1398 SDValue P = getInstr(Hexagon::V6_lvsplatw, dl, ResTy,
1403 SDValue T0 = getInstr(Hexagon::V6_vmpyuhv, dl, PairTy, {Vs, Vt}, DAG);
1407 SDValue T1 = getInstr(Hexagon::V6_vlsrw, dl, ResTy, {LoVec(T0), S16}, DAG);
1410 SDValue D0 = getInstr(Hexagon::V6_vdelta, dl, ResTy, {Vt, P}, DAG);
1411 SDValue T2 = getInstr(Hexagon::V6_vmpyuhv, dl, PairTy, {Vs, D0}, DAG);
1416 SDValue T3 = getInstr(Hexagon::V6_vadduhw, dl, PairTy,
1419 SDValue T4 = DAG.getNode(ISD::ADD, dl, ResTy, {T1, LoVec(T3)});
1420 SDValue T5 = getInstr(Hexagon::V6_vlsrw, dl, ResTy, {T4, S16}, DAG);
1421 SDValue T6 = DAG.getNode(ISD::ADD, dl, ResTy, {HiVec(T0), HiVec(T3)});
1422 SDValue T7 = DAG.getNode(ISD::ADD, dl, ResTy, {T5, T6});
1426 SDValue
1427 HexagonTargetLowering::LowerHvxExtend(SDValue Op, SelectionDAG &DAG) const {
1434 SDValue
1435 HexagonTargetLowering::LowerHvxShift(SDValue Op, SelectionDAG &DAG) const {
1436 if (SDValue S = getVectorShiftByInt(Op, DAG))
1441 SDValue
1442 HexagonTargetLowering::SplitHvxPairOp(SDValue Op, SelectionDAG &DAG) const {
1444 SmallVector<SDValue,2> OpsL, OpsH;
1449 SDValue TV = DAG.getValueType(Ty);
1453 for (SDValue A : Op.getNode()->ops()) {
1468 SDValue L = DAG.getNode(Op.getOpcode(), dl, HalfTy, OpsL);
1469 SDValue H = DAG.getNode(Op.getOpcode(), dl, HalfTy, OpsH);
1470 SDValue S = DAG.getNode(ISD::CONCAT_VECTORS, dl, ResTy, L, H);
1474 SDValue
1475 HexagonTargetLowering::SplitHvxMemOp(SDValue Op, SelectionDAG &DAG) const {
1485 SDValue Chain = BN->getChain();
1486 SDValue Base0 = BN->getBasePtr();
1487 SDValue Base1 = DAG.getMemBasePlusOffset(Base0, HwLen, dl);
1497 SDValue NewOp;
1500 SDValue Load0 = DAG.getLoad(SingleTy, dl, Chain, Base0, MOp0);
1501 SDValue Load1 = DAG.getLoad(SingleTy, dl, Chain, Base1, MOp1);
1509 SDValue Store0 = DAG.getStore(Chain, dl, Vals.first, Base0, MOp0);
1510 SDValue Store1 = DAG.getStore(Chain, dl, Vals.second, Base1, MOp1);
1517 SDValue
1518 HexagonTargetLowering::LowerHvxOperation(SDValue Op, SelectionDAG &DAG) const {
1585 SDValue
1589 SDValue Op(N, 0);
1594 SDValue Cond = Op.getOperand(0);
1596 SDValue C0 = Cond.getOperand(0), C1 = Cond.getOperand(1);
1598 SDValue VSel = DCI.DAG.getNode(ISD::VSELECT, dl, ty(Op), C0,
1608 HexagonTargetLowering::isHvxOperation(SDValue Op) const {
lib/Target/Hexagon/HexagonSelectionDAGInfo.cpp 19 SDValue HexagonSelectionDAGInfo::EmitTargetCodeForMemcpy(
20 SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src,
20 SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src,
20 SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src,
21 SDValue Size, unsigned Align, bool isVolatile, bool AlwaysInline,
61 std::pair<SDValue, SDValue> CallResult = TLI.LowerCallTo(CLI);
61 std::pair<SDValue, SDValue> CallResult = TLI.LowerCallTo(CLI);
lib/Target/Hexagon/HexagonSelectionDAGInfo.h 24 SDValue EmitTargetCodeForMemcpy(SelectionDAG &DAG, const SDLoc &dl,
25 SDValue Chain, SDValue Dst, SDValue Src,
25 SDValue Chain, SDValue Dst, SDValue Src,
25 SDValue Chain, SDValue Dst, SDValue Src,
26 SDValue Size, unsigned Align, bool isVolatile,
lib/Target/Lanai/LanaiISelDAGToDAG.cpp 62 bool SelectInlineAsmMemoryOperand(const SDValue &Op, unsigned ConstraintCode,
63 std::vector<SDValue> &OutOps) override;
77 bool selectAddrRi(SDValue Addr, SDValue &Base, SDValue &Offset,
77 bool selectAddrRi(SDValue Addr, SDValue &Base, SDValue &Offset,
77 bool selectAddrRi(SDValue Addr, SDValue &Base, SDValue &Offset,
78 SDValue &AluOp);
79 bool selectAddrRr(SDValue Addr, SDValue &R1, SDValue &R2, SDValue &AluOp);
79 bool selectAddrRr(SDValue Addr, SDValue &R1, SDValue &R2, SDValue &AluOp);
79 bool selectAddrRr(SDValue Addr, SDValue &R1, SDValue &R2, SDValue &AluOp);
79 bool selectAddrRr(SDValue Addr, SDValue &R1, SDValue &R2, SDValue &AluOp);
80 bool selectAddrSls(SDValue Addr, SDValue &Offset);
80 bool selectAddrSls(SDValue Addr, SDValue &Offset);
81 bool selectAddrSpls(SDValue Addr, SDValue &Base, SDValue &Offset,
81 bool selectAddrSpls(SDValue Addr, SDValue &Base, SDValue &Offset,
81 bool selectAddrSpls(SDValue Addr, SDValue &Base, SDValue &Offset,
82 SDValue &AluOp);
85 inline SDValue getI32Imm(unsigned Imm, const SDLoc &DL) {
90 bool selectAddrRiSpls(SDValue Addr, SDValue &Base, SDValue &Offset,
90 bool selectAddrRiSpls(SDValue Addr, SDValue &Base, SDValue &Offset,
90 bool selectAddrRiSpls(SDValue Addr, SDValue &Base, SDValue &Offset,
91 SDValue &AluOp, bool RiMode);
103 bool LanaiDAGToDAGISel::selectAddrSls(SDValue Addr, SDValue &Offset) {
103 bool LanaiDAGToDAGISel::selectAddrSls(SDValue Addr, SDValue &Offset) {
121 bool LanaiDAGToDAGISel::selectAddrRiSpls(SDValue Addr, SDValue &Base,
121 bool LanaiDAGToDAGISel::selectAddrRiSpls(SDValue Addr, SDValue &Base,
122 SDValue &Offset, SDValue &AluOp,
122 SDValue &Offset, SDValue &AluOp,
201 bool LanaiDAGToDAGISel::selectAddrRi(SDValue Addr, SDValue &Base,
201 bool LanaiDAGToDAGISel::selectAddrRi(SDValue Addr, SDValue &Base,
202 SDValue &Offset, SDValue &AluOp) {
202 SDValue &Offset, SDValue &AluOp) {
206 bool LanaiDAGToDAGISel::selectAddrSpls(SDValue Addr, SDValue &Base,
206 bool LanaiDAGToDAGISel::selectAddrSpls(SDValue Addr, SDValue &Base,
207 SDValue &Offset, SDValue &AluOp) {
207 SDValue &Offset, SDValue &AluOp) {
211 bool LanaiDAGToDAGISel::selectAddrRr(SDValue Addr, SDValue &R1, SDValue &R2,
211 bool LanaiDAGToDAGISel::selectAddrRr(SDValue Addr, SDValue &R1, SDValue &R2,
211 bool LanaiDAGToDAGISel::selectAddrRr(SDValue Addr, SDValue &R1, SDValue &R2,
212 SDValue &AluOp) {
252 const SDValue &Op, unsigned ConstraintCode, std::vector<SDValue> &OutOps) {
252 const SDValue &Op, unsigned ConstraintCode, std::vector<SDValue> &OutOps) {
253 SDValue Op0, Op1, AluOp;
291 SDValue New = CurDAG->getCopyFromReg(CurDAG->getEntryNode(),
298 SDValue New = CurDAG->getCopyFromReg(CurDAG->getEntryNode(),
317 SDValue Imm = CurDAG->getTargetConstant(0, DL, MVT::i32);
320 SDValue TFI = CurDAG->getTargetFrameIndex(FI, VT);
lib/Target/Lanai/LanaiISelLowering.cpp 175 SDValue LanaiTargetLowering::LowerOperation(SDValue Op,
175 SDValue LanaiTargetLowering::LowerOperation(SDValue Op,
285 SDValue Op, std::string &Constraint, std::vector<SDValue> &Ops,
285 SDValue Op, std::string &Constraint, std::vector<SDValue> &Ops,
287 SDValue Result(nullptr, 0);
396 SDValue LanaiTargetLowering::LowerFormalArguments(
397 SDValue Chain, CallingConv::ID CallConv, bool IsVarArg,
399 SelectionDAG &DAG, SmallVectorImpl<SDValue> &InVals) const {
409 SDValue LanaiTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
410 SmallVectorImpl<SDValue> &InVals) const {
414 SmallVectorImpl<SDValue> &OutVals = CLI.OutVals;
416 SDValue Chain = CLI.Chain;
417 SDValue Callee = CLI.Callee;
437 SDValue LanaiTargetLowering::LowerCCCArguments(
438 SDValue Chain, CallingConv::ID CallConv, bool IsVarArg,
440 SelectionDAG &DAG, SmallVectorImpl<SDValue> &InVals) const {
465 SDValue ArgValue = DAG.getCopyFromReg(Chain, DL, VReg, RegVT);
503 SDValue FIN = DAG.getFrameIndex(FI, MVT::i32);
519 SDValue Copy = DAG.getCopyToReg(DAG.getEntryNode(), DL, Reg, InVals[0]);
533 SDValue
534 LanaiTargetLowering::LowerReturn(SDValue Chain, CallingConv::ID CallConv,
537 const SmallVectorImpl<SDValue> &OutVals,
549 SDValue Flag;
550 SmallVector<SDValue, 4> RetOps(1, Chain);
574 SDValue Val =
596 SDValue LanaiTargetLowering::LowerCCCCallTo(
597 SDValue Chain, SDValue Callee, CallingConv::ID CallConv, bool IsVarArg,
597 SDValue Chain, SDValue Callee, CallingConv::ID CallConv, bool IsVarArg,
599 const SmallVectorImpl<SDValue> &OutVals,
601 SelectionDAG &DAG, SmallVectorImpl<SDValue> &InVals) const {
628 SmallVector<SDValue, 8> ByValArgs;
634 SDValue Arg = OutVals[I];
639 SDValue FIPtr = DAG.getFrameIndex(FI, getPointerTy(DAG.getDataLayout()));
640 SDValue SizeNode = DAG.getConstant(Size, DL, MVT::i32);
652 SmallVector<std::pair<unsigned, SDValue>, 4> RegsToPass;
653 SmallVector<SDValue, 12> MemOpChains;
654 SDValue StackPtr;
659 SDValue Arg = OutVals[I];
694 SDValue PtrOff =
709 SDValue InFlag;
734 SmallVector<SDValue, 8> Ops;
774 SDValue LanaiTargetLowering::LowerCallResult(
775 SDValue Chain, SDValue InFlag, CallingConv::ID CallConv, bool IsVarArg,
775 SDValue Chain, SDValue InFlag, CallingConv::ID CallConv, bool IsVarArg,
777 SelectionDAG &DAG, SmallVectorImpl<SDValue> &InVals) const {
801 static LPCC::CondCode IntCondCCodeToICC(SDValue CC, const SDLoc &DL,
802 SDValue &RHS, SelectionDAG &DAG) {
866 SDValue LanaiTargetLowering::LowerBR_CC(SDValue Op, SelectionDAG &DAG) const {
866 SDValue LanaiTargetLowering::LowerBR_CC(SDValue Op, SelectionDAG &DAG) const {
867 SDValue Chain = Op.getOperand(0);
868 SDValue Cond = Op.getOperand(1);
869 SDValue LHS = Op.getOperand(2);
870 SDValue RHS = Op.getOperand(3);
871 SDValue Dest = Op.getOperand(4);
875 SDValue TargetCC = DAG.getConstant(CC, DL, MVT::i32);
876 SDValue Flag =
883 SDValue LanaiTargetLowering::LowerMUL(SDValue Op, SelectionDAG &DAG) const {
883 SDValue LanaiTargetLowering::LowerMUL(SDValue Op, SelectionDAG &DAG) const {
936 SDValue Res;
938 SDValue V = Op->getOperand(0);
959 SDValue Op =
969 SDValue LanaiTargetLowering::LowerSETCC(SDValue Op, SelectionDAG &DAG) const {
969 SDValue LanaiTargetLowering::LowerSETCC(SDValue Op, SelectionDAG &DAG) const {
970 SDValue LHS = Op.getOperand(0);
971 SDValue RHS = Op.getOperand(1);
972 SDValue Cond = Op.getOperand(2);
976 SDValue TargetCC = DAG.getConstant(CC, DL, MVT::i32);
977 SDValue Flag =
983 SDValue LanaiTargetLowering::LowerSELECT_CC(SDValue Op,
983 SDValue LanaiTargetLowering::LowerSELECT_CC(SDValue Op,
985 SDValue LHS = Op.getOperand(0);
986 SDValue RHS = Op.getOperand(1);
987 SDValue TrueV = Op.getOperand(2);
988 SDValue FalseV = Op.getOperand(3);
989 SDValue Cond = Op.getOperand(4);
993 SDValue TargetCC = DAG.getConstant(CC, DL, MVT::i32);
994 SDValue Flag =
1002 SDValue LanaiTargetLowering::LowerVASTART(SDValue Op, SelectionDAG &DAG) const {
1002 SDValue LanaiTargetLowering::LowerVASTART(SDValue Op, SelectionDAG &DAG) const {
1007 SDValue FI = DAG.getFrameIndex(FuncInfo->getVarArgsFrameIndex(),
1017 SDValue LanaiTargetLowering::LowerDYNAMIC_STACKALLOC(SDValue Op,
1017 SDValue LanaiTargetLowering::LowerDYNAMIC_STACKALLOC(SDValue Op,
1019 SDValue Chain = Op.getOperand(0);
1020 SDValue Size = Op.getOperand(1);
1026 SDValue StackPointer = DAG.getCopyFromReg(Chain, DL, SPReg, MVT::i32);
1030 SDValue Sub = DAG.getNode(ISD::SUB, DL, MVT::i32, StackPointer, Size);
1042 SDValue ArgAdjust = DAG.getNode(LanaiISD::ADJDYNALLOC, DL, MVT::i32, Sub);
1046 SDValue CopyChain = DAG.getCopyToReg(Chain, DL, SPReg, Sub);
1048 SDValue Ops[2] = {ArgAdjust, CopyChain};
1052 SDValue LanaiTargetLowering::LowerRETURNADDR(SDValue Op,
1052 SDValue LanaiTargetLowering::LowerRETURNADDR(SDValue Op,
1062 SDValue FrameAddr = LowerFRAMEADDR(Op, DAG);
1064 SDValue Ptr = DAG.getNode(ISD::ADD, DL, VT, FrameAddr,
1075 SDValue LanaiTargetLowering::LowerFRAMEADDR(SDValue Op,
1075 SDValue LanaiTargetLowering::LowerFRAMEADDR(SDValue Op,
1082 SDValue FrameAddr = DAG.getCopyFromReg(DAG.getEntryNode(), DL, Lanai::FP, VT);
1086 SDValue Ptr = DAG.getNode(ISD::ADD, DL, VT, FrameAddr,
1125 SDValue LanaiTargetLowering::LowerConstantPool(SDValue Op,
1125 SDValue LanaiTargetLowering::LowerConstantPool(SDValue Op,
1138 SDValue Small = DAG.getTargetConstantPool(
1147 SDValue Hi = DAG.getTargetConstantPool(C, MVT::i32, N->getAlignment(),
1149 SDValue Lo = DAG.getTargetConstantPool(C, MVT::i32, N->getAlignment(),
1153 SDValue Result = DAG.getNode(ISD::OR, DL, MVT::i32, Hi, Lo);
1158 SDValue LanaiTargetLowering::LowerGlobalAddress(SDValue Op,
1158 SDValue LanaiTargetLowering::LowerGlobalAddress(SDValue Op,
1172 SDValue Small = DAG.getTargetGlobalAddress(
1182 SDValue Hi = DAG.getTargetGlobalAddress(
1184 SDValue Lo = DAG.getTargetGlobalAddress(
1192 SDValue LanaiTargetLowering::LowerBlockAddress(SDValue Op,
1192 SDValue LanaiTargetLowering::LowerBlockAddress(SDValue Op,
1200 SDValue Hi = DAG.getBlockAddress(BA, MVT::i32, true, OpFlagHi);
1201 SDValue Lo = DAG.getBlockAddress(BA, MVT::i32, true, OpFlagLo);
1204 SDValue Result = DAG.getNode(ISD::OR, DL, MVT::i32, Hi, Lo);
1208 SDValue LanaiTargetLowering::LowerJumpTable(SDValue Op,
1208 SDValue LanaiTargetLowering::LowerJumpTable(SDValue Op,
1215 SDValue Small = DAG.getTargetJumpTable(
1224 SDValue Hi = DAG.getTargetJumpTable(
1226 SDValue Lo = DAG.getTargetJumpTable(
1230 SDValue Result = DAG.getNode(ISD::OR, DL, MVT::i32, Hi, Lo);
1235 SDValue LanaiTargetLowering::LowerSHL_PARTS(SDValue Op,
1235 SDValue LanaiTargetLowering::LowerSHL_PARTS(SDValue Op,
1241 SDValue ShOpLo = Op.getOperand(0);
1242 SDValue ShOpHi = Op.getOperand(1);
1243 SDValue ShAmt = Op.getOperand(2);
1252 SDValue RevShAmt = DAG.getNode(ISD::SUB, dl, MVT::i32,
1254 SDValue LoBitsForHi = DAG.getNode(ISD::SRL, dl, VT, ShOpLo, RevShAmt);
1258 SDValue Zero = DAG.getConstant(0, dl, MVT::i32);
1259 SDValue SetCC = DAG.getSetCC(dl, MVT::i32, ShAmt, Zero, ISD::SETEQ);
1262 SDValue ExtraShAmt = DAG.getNode(ISD::SUB, dl, MVT::i32, ShAmt,
1264 SDValue HiBitsForHi = DAG.getNode(ISD::SHL, dl, VT, ShOpHi, ShAmt);
1265 SDValue HiForNormalShift =
1268 SDValue HiForBigShift = DAG.getNode(ISD::SHL, dl, VT, ShOpLo, ExtraShAmt);
1271 SDValue Hi =
1276 SDValue LoForNormalShift = DAG.getNode(ISD::SHL, dl, VT, ShOpLo, ShAmt);
1277 SDValue Lo = DAG.getSelect(
1280 SDValue Ops[2] = {Lo, Hi};
1284 SDValue LanaiTargetLowering::LowerSRL_PARTS(SDValue Op,
1284 SDValue LanaiTargetLowering::LowerSRL_PARTS(SDValue Op,
1289 SDValue ShOpLo = Op.getOperand(0);
1290 SDValue ShOpHi = Op.getOperand(1);
1291 SDValue ShAmt = Op.getOperand(2);
1304 SDValue Zero = DAG.getConstant(0, dl, MVT::i32);
1305 SDValue NegatedPlus32 = DAG.getNode(
1307 SDValue SetCC = DAG.getSetCC(dl, MVT::i32, NegatedPlus32, Zero, ISD::SETLE);
1309 SDValue Hi = DAG.getNode(ISD::SRL, dl, MVT::i32, ShOpHi, ShAmt);
1312 SDValue Lo = DAG.getNode(ISD::SRL, dl, MVT::i32, ShOpLo, ShAmt);
1314 SDValue CarryBits =
1316 SDValue ShiftIsZero = DAG.getSetCC(dl, MVT::i32, ShAmt, Zero, ISD::SETEQ);
1320 SDValue Ops[2] = {Lo, Hi};
1325 static inline bool isZeroOrAllOnes(SDValue N, bool AllOnes) {
1347 static bool isConditionalZeroOrAllOnes(SDNode *N, bool AllOnes, SDValue &CC,
1348 bool &Invert, SDValue &OtherOp,
1355 SDValue N1 = N->getOperand(1);
1356 SDValue N2 = N->getOperand(2);
1418 static SDValue combineSelectAndUse(SDNode *N, SDValue Slct, SDValue OtherOp,
1418 static SDValue combineSelectAndUse(SDNode *N, SDValue Slct, SDValue OtherOp,
1418 static SDValue combineSelectAndUse(SDNode *N, SDValue Slct, SDValue OtherOp,
1423 SDValue NonConstantVal;
1424 SDValue CCOp;
1431 SDValue TrueVal = OtherOp;
1432 SDValue FalseVal =
1442 static SDValue
1445 SDValue N0 = N->getOperand(0);
1446 SDValue N1 = N->getOperand(1);
1448 if (SDValue Result = combineSelectAndUse(N, N0, N1, DCI, AllOnes))
1451 if (SDValue Result = combineSelectAndUse(N, N1, N0, DCI, AllOnes))
1457 static SDValue PerformSUBCombine(SDNode *N,
1459 SDValue N0 = N->getOperand(0);
1460 SDValue N1 = N->getOperand(1);
1464 if (SDValue Result = combineSelectAndUse(N, N1, N0, DCI, /*AllOnes=*/false))
1470 SDValue LanaiTargetLowering::PerformDAGCombine(SDNode *N,
1489 const SDValue Op, KnownBits &Known, const APInt &DemandedElts,
lib/Target/Lanai/LanaiISelLowering.h 72 SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
72 SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
78 SDValue LowerBlockAddress(SDValue Op, SelectionDAG &DAG) const;
78 SDValue LowerBlockAddress(SDValue Op, SelectionDAG &DAG) const;
79 SDValue LowerBR_CC(SDValue Op, SelectionDAG &DAG) const;
79 SDValue LowerBR_CC(SDValue Op, SelectionDAG &DAG) const;
80 SDValue LowerConstantPool(SDValue Op, SelectionDAG &DAG) const;
80 SDValue LowerConstantPool(SDValue Op, SelectionDAG &DAG) const;
81 SDValue LowerDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG) const;
81 SDValue LowerDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG) const;
82 SDValue LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const;
82 SDValue LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const;
83 SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const;
83 SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const;
84 SDValue LowerJumpTable(SDValue Op, SelectionDAG &DAG) const;
84 SDValue LowerJumpTable(SDValue Op, SelectionDAG &DAG) const;
85 SDValue LowerMUL(SDValue Op, SelectionDAG &DAG) const;
85 SDValue LowerMUL(SDValue Op, SelectionDAG &DAG) const;
86 SDValue LowerRETURNADDR(SDValue Op, SelectionDAG &DAG) const;
86 SDValue LowerRETURNADDR(SDValue Op, SelectionDAG &DAG) const;
87 SDValue LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const;
87 SDValue LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const;
88 SDValue LowerSETCC(SDValue Op, SelectionDAG &DAG) const;
88 SDValue LowerSETCC(SDValue Op, SelectionDAG &DAG) const;
89 SDValue LowerSHL_PARTS(SDValue Op, SelectionDAG &DAG) const;
89 SDValue LowerSHL_PARTS(SDValue Op, SelectionDAG &DAG) const;
90 SDValue LowerSRL_PARTS(SDValue Op, SelectionDAG &DAG) const;
90 SDValue LowerSRL_PARTS(SDValue Op, SelectionDAG &DAG) const;
91 SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG) const;
91 SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG) const;
101 void LowerAsmOperandForConstraint(SDValue Op, std::string &Constraint,
102 std::vector<SDValue> &Ops,
105 SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const override;
107 void computeKnownBitsForTargetNode(const SDValue Op, KnownBits &Known,
113 SDValue LowerCCCCallTo(SDValue Chain, SDValue Callee,
113 SDValue LowerCCCCallTo(SDValue Chain, SDValue Callee,
113 SDValue LowerCCCCallTo(SDValue Chain, SDValue Callee,
117 const SmallVectorImpl<SDValue> &OutVals,
120 SmallVectorImpl<SDValue> &InVals) const;
122 SDValue LowerCCCArguments(SDValue Chain, CallingConv::ID CallConv,
122 SDValue LowerCCCArguments(SDValue Chain, CallingConv::ID CallConv,
126 SmallVectorImpl<SDValue> &InVals) const;
128 SDValue LowerCallResult(SDValue Chain, SDValue InFlag,
128 SDValue LowerCallResult(SDValue Chain, SDValue InFlag,
128 SDValue LowerCallResult(SDValue Chain, SDValue InFlag,
132 SmallVectorImpl<SDValue> &InVals) const;
134 SDValue LowerCall(TargetLowering::CallLoweringInfo &CLI,
135 SmallVectorImpl<SDValue> &InVals) const override;
137 SDValue LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv,
137 SDValue LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv,
141 SmallVectorImpl<SDValue> &InVals) const override;
143 SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool IsVarArg,
143 SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool IsVarArg,
145 const SmallVectorImpl<SDValue> &OutVals, const SDLoc &DL,
lib/Target/Lanai/LanaiSelectionDAGInfo.cpp 21 SDValue LanaiSelectionDAGInfo::EmitTargetCodeForMemcpy(
22 SelectionDAG & /*DAG*/, const SDLoc & /*dl*/, SDValue /*Chain*/,
23 SDValue /*Dst*/, SDValue /*Src*/, SDValue Size, unsigned /*Align*/,
23 SDValue /*Dst*/, SDValue /*Src*/, SDValue Size, unsigned /*Align*/,
23 SDValue /*Dst*/, SDValue /*Src*/, SDValue Size, unsigned /*Align*/,
lib/Target/Lanai/LanaiSelectionDAGInfo.h 25 SDValue EmitTargetCodeForMemcpy(SelectionDAG &DAG, const SDLoc &dl,
26 SDValue Chain, SDValue Dst, SDValue Src,
26 SDValue Chain, SDValue Dst, SDValue Src,
26 SDValue Chain, SDValue Dst, SDValue Src,
27 SDValue Size, unsigned Align, bool isVolatile,
lib/Target/MSP430/MSP430ISelDAGToDAG.cpp 43 SDValue Reg;
105 bool MatchAddress(SDValue N, MSP430ISelAddressMode &AM);
106 bool MatchWrapper(SDValue N, MSP430ISelAddressMode &AM);
107 bool MatchAddressBase(SDValue N, MSP430ISelAddressMode &AM);
109 bool SelectInlineAsmMemoryOperand(const SDValue &Op, unsigned ConstraintID,
110 std::vector<SDValue> &OutOps) override;
119 bool tryIndexedBinOp(SDNode *Op, SDValue N1, SDValue N2, unsigned Opc8,
119 bool tryIndexedBinOp(SDNode *Op, SDValue N1, SDValue N2, unsigned Opc8,
122 bool SelectAddr(SDValue Addr, SDValue &Base, SDValue &Disp);
122 bool SelectAddr(SDValue Addr, SDValue &Base, SDValue &Disp);
122 bool SelectAddr(SDValue Addr, SDValue &Base, SDValue &Disp);
138 bool MSP430DAGToDAGISel::MatchWrapper(SDValue N, MSP430ISelAddressMode &AM) {
144 SDValue N0 = N.getOperand(0);
170 bool MSP430DAGToDAGISel::MatchAddressBase(SDValue N, MSP430ISelAddressMode &AM) {
183 bool MSP430DAGToDAGISel::MatchAddress(SDValue N, MSP430ISelAddressMode &AM) {
247 bool MSP430DAGToDAGISel::SelectAddr(SDValue N,
248 SDValue &Base, SDValue &Disp) {
248 SDValue &Base, SDValue &Disp) {
285 SelectInlineAsmMemoryOperand(const SDValue &Op, unsigned ConstraintID,
286 std::vector<SDValue> &OutOps) {
287 SDValue Op0, Op1;
353 bool MSP430DAGToDAGISel::tryIndexedBinOp(SDNode *Op, SDValue N1, SDValue N2,
353 bool MSP430DAGToDAGISel::tryIndexedBinOp(SDNode *Op, SDValue N1, SDValue N2,
365 SDValue Ops0[] = { N2, LD->getBasePtr(), LD->getChain() };
396 SDValue TFI = CurDAG->getTargetFrameIndex(FI, MVT::i16);
lib/Target/MSP430/MSP430ISelLowering.cpp 334 SDValue MSP430TargetLowering::LowerOperation(SDValue Op,
334 SDValue MSP430TargetLowering::LowerOperation(SDValue Op,
551 SDValue MSP430TargetLowering::LowerFormalArguments(
552 SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
554 SelectionDAG &DAG, SmallVectorImpl<SDValue> &InVals) const {
569 SDValue
571 SmallVectorImpl<SDValue> &InVals) const {
575 SmallVectorImpl<SDValue> &OutVals = CLI.OutVals;
577 SDValue Chain = CLI.Chain;
578 SDValue Callee = CLI.Callee;
602 SDValue MSP430TargetLowering::LowerCCCArguments(
603 SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
605 SelectionDAG &DAG, SmallVectorImpl<SDValue> &InVals) const {
640 SDValue ArgValue = DAG.getCopyFromReg(Chain, dl, VReg, RegVT);
661 SDValue InVal;
681 SDValue FIN = DAG.getFrameIndex(FI, MVT::i16);
699 SDValue Copy = DAG.getCopyToReg(DAG.getEntryNode(), dl, Reg, InVals[i]);
718 SDValue
719 MSP430TargetLowering::LowerReturn(SDValue Chain, CallingConv::ID CallConv,
722 const SmallVectorImpl<SDValue> &OutVals,
741 SDValue Flag;
742 SmallVector<SDValue, 4> RetOps(1, Chain);
765 SDValue Val =
788 SDValue MSP430TargetLowering::LowerCCCCallTo(
789 SDValue Chain, SDValue Callee, CallingConv::ID CallConv, bool isVarArg,
789 SDValue Chain, SDValue Callee, CallingConv::ID CallConv, bool isVarArg,
791 const SmallVectorImpl<SDValue> &OutVals,
793 SelectionDAG &DAG, SmallVectorImpl<SDValue> &InVals) const {
806 SmallVector<std::pair<unsigned, SDValue>, 4> RegsToPass;
807 SmallVector<SDValue, 12> MemOpChains;
808 SDValue StackPtr;
814 SDValue Arg = OutVals[i];
841 SDValue PtrOff =
845 SDValue MemOp;
849 SDValue SizeNode = DAG.getConstant(Flags.getByValSize(), dl, MVT::i16);
873 SDValue InFlag;
890 SmallVector<SDValue, 8> Ops;
920 SDValue MSP430TargetLowering::LowerCallResult(
921 SDValue Chain, SDValue InFlag, CallingConv::ID CallConv, bool isVarArg,
921 SDValue Chain, SDValue InFlag, CallingConv::ID CallConv, bool isVarArg,
923 SelectionDAG &DAG, SmallVectorImpl<SDValue> &InVals) const {
943 SDValue MSP430TargetLowering::LowerShifts(SDValue Op,
943 SDValue MSP430TargetLowering::LowerShifts(SDValue Op,
957 SDValue Victim = N->getOperand(0);
996 SDValue MSP430TargetLowering::LowerGlobalAddress(SDValue Op,
996 SDValue MSP430TargetLowering::LowerGlobalAddress(SDValue Op,
1003 SDValue Result = DAG.getTargetGlobalAddress(GV, SDLoc(Op), PtrVT, Offset);
1007 SDValue MSP430TargetLowering::LowerExternalSymbol(SDValue Op,
1007 SDValue MSP430TargetLowering::LowerExternalSymbol(SDValue Op,
1012 SDValue Result = DAG.getTargetExternalSymbol(Sym, PtrVT);
1017 SDValue MSP430TargetLowering::LowerBlockAddress(SDValue Op,
1017 SDValue MSP430TargetLowering::LowerBlockAddress(SDValue Op,
1022 SDValue Result = DAG.getTargetBlockAddress(BA, PtrVT);
1027 static SDValue EmitCMP(SDValue &LHS, SDValue &RHS, SDValue &TargetCC,
1027 static SDValue EmitCMP(SDValue &LHS, SDValue &RHS, SDValue &TargetCC,
1027 static SDValue EmitCMP(SDValue &LHS, SDValue &RHS, SDValue &TargetCC,
1027 static SDValue EmitCMP(SDValue &LHS, SDValue &RHS, SDValue &TargetCC,
1113 SDValue MSP430TargetLowering::LowerBR_CC(SDValue Op, SelectionDAG &DAG) const {
1113 SDValue MSP430TargetLowering::LowerBR_CC(SDValue Op, SelectionDAG &DAG) const {
1114 SDValue Chain = Op.getOperand(0);
1116 SDValue LHS = Op.getOperand(2);
1117 SDValue RHS = Op.getOperand(3);
1118 SDValue Dest = Op.getOperand(4);
1121 SDValue TargetCC;
1122 SDValue Flag = EmitCMP(LHS, RHS, TargetCC, CC, dl, DAG);
1128 SDValue MSP430TargetLowering::LowerSETCC(SDValue Op, SelectionDAG &DAG) const {
1128 SDValue MSP430TargetLowering::LowerSETCC(SDValue Op, SelectionDAG &DAG) const {
1129 SDValue LHS = Op.getOperand(0);
1130 SDValue RHS = Op.getOperand(1);
1148 SDValue TargetCC;
1149 SDValue Flag = EmitCMP(LHS, RHS, TargetCC, CC, dl, DAG);
1185 SDValue One = DAG.getConstant(1, dl, VT);
1187 SDValue SR = DAG.getCopyFromReg(DAG.getEntryNode(), dl, MSP430::SR,
1197 SDValue Zero = DAG.getConstant(0, dl, VT);
1199 SDValue Ops[] = {One, Zero, TargetCC, Flag};
1204 SDValue MSP430TargetLowering::LowerSELECT_CC(SDValue Op,
1204 SDValue MSP430TargetLowering::LowerSELECT_CC(SDValue Op,
1206 SDValue LHS = Op.getOperand(0);
1207 SDValue RHS = Op.getOperand(1);
1208 SDValue TrueV = Op.getOperand(2);
1209 SDValue FalseV = Op.getOperand(3);
1213 SDValue TargetCC;
1214 SDValue Flag = EmitCMP(LHS, RHS, TargetCC, CC, dl, DAG);
1217 SDValue Ops[] = {TrueV, FalseV, TargetCC, Flag};
1222 SDValue MSP430TargetLowering::LowerSIGN_EXTEND(SDValue Op,
1222 SDValue MSP430TargetLowering::LowerSIGN_EXTEND(SDValue Op,
1224 SDValue Val = Op.getOperand(0);
1235 SDValue
1253 SDValue MSP430TargetLowering::LowerRETURNADDR(SDValue Op,
1253 SDValue MSP430TargetLowering::LowerRETURNADDR(SDValue Op,
1266 SDValue FrameAddr = LowerFRAMEADDR(Op, DAG);
1267 SDValue Offset =
1275 SDValue RetAddrFI = getReturnAddressFrameIndex(DAG);
1280 SDValue MSP430TargetLowering::LowerFRAMEADDR(SDValue Op,
1280 SDValue MSP430TargetLowering::LowerFRAMEADDR(SDValue Op,
1288 SDValue FrameAddr = DAG.getCopyFromReg(DAG.getEntryNode(), dl,
1296 SDValue MSP430TargetLowering::LowerVASTART(SDValue Op,
1296 SDValue MSP430TargetLowering::LowerVASTART(SDValue Op,
1303 SDValue FrameIndex =
1312 SDValue MSP430TargetLowering::LowerJumpTable(SDValue Op,
1312 SDValue MSP430TargetLowering::LowerJumpTable(SDValue Op,
1316 SDValue Result = DAG.getTargetJumpTable(JT->getIndex(), PtrVT);
1324 SDValue &Base,
1325 SDValue &Offset,
1401 bool MSP430TargetLowering::isZExtFree(SDValue Val, EVT VT2) const {
lib/Target/MSP430/MSP430ISelLowering.h 83 SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
83 SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
89 SDValue LowerShifts(SDValue Op, SelectionDAG &DAG) const;
89 SDValue LowerShifts(SDValue Op, SelectionDAG &DAG) const;
90 SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const;
90 SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const;
91 SDValue LowerBlockAddress(SDValue Op, SelectionDAG &DAG) const;
91 SDValue LowerBlockAddress(SDValue Op, SelectionDAG &DAG) const;
92 SDValue LowerExternalSymbol(SDValue Op, SelectionDAG &DAG) const;
92 SDValue LowerExternalSymbol(SDValue Op, SelectionDAG &DAG) const;
93 SDValue LowerBR_CC(SDValue Op, SelectionDAG &DAG) const;
93 SDValue LowerBR_CC(SDValue Op, SelectionDAG &DAG) const;
94 SDValue LowerSETCC(SDValue Op, SelectionDAG &DAG) const;
94 SDValue LowerSETCC(SDValue Op, SelectionDAG &DAG) const;
95 SDValue LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const;
95 SDValue LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const;
96 SDValue LowerSIGN_EXTEND(SDValue Op, SelectionDAG &DAG) const;
96 SDValue LowerSIGN_EXTEND(SDValue Op, SelectionDAG &DAG) const;
97 SDValue LowerRETURNADDR(SDValue Op, SelectionDAG &DAG) const;
97 SDValue LowerRETURNADDR(SDValue Op, SelectionDAG &DAG) const;
98 SDValue LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const;
98 SDValue LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const;
99 SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG) const;
99 SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG) const;
100 SDValue LowerJumpTable(SDValue Op, SelectionDAG &DAG) const;
100 SDValue LowerJumpTable(SDValue Op, SelectionDAG &DAG) const;
101 SDValue getReturnAddressFrameIndex(SelectionDAG &DAG) const;
125 bool isZExtFree(SDValue Val, EVT VT2) const override;
136 SDValue LowerCCCCallTo(SDValue Chain, SDValue Callee,
136 SDValue LowerCCCCallTo(SDValue Chain, SDValue Callee,
136 SDValue LowerCCCCallTo(SDValue Chain, SDValue Callee,
140 const SmallVectorImpl<SDValue> &OutVals,
143 SmallVectorImpl<SDValue> &InVals) const;
145 SDValue LowerCCCArguments(SDValue Chain, CallingConv::ID CallConv,
145 SDValue LowerCCCArguments(SDValue Chain, CallingConv::ID CallConv,
149 SmallVectorImpl<SDValue> &InVals) const;
151 SDValue LowerCallResult(SDValue Chain, SDValue InFlag,
151 SDValue LowerCallResult(SDValue Chain, SDValue InFlag,
151 SDValue LowerCallResult(SDValue Chain, SDValue InFlag,
155 SmallVectorImpl<SDValue> &InVals) const;
157 SDValue
158 LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
161 SmallVectorImpl<SDValue> &InVals) const override;
162 SDValue
164 SmallVectorImpl<SDValue> &InVals) const override;
172 SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
172 SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
174 const SmallVectorImpl<SDValue> &OutVals,
178 SDValue &Base,
179 SDValue &Offset,
lib/Target/Mips/Mips16ISelDAGToDAG.cpp 50 SDValue InFlag = SDValue(Mul, 0);
98 bool Mips16DAGToDAGISel::selectAddr(bool SPAllowed, SDValue Addr, SDValue &Base,
98 bool Mips16DAGToDAGISel::selectAddr(bool SPAllowed, SDValue Addr, SDValue &Base,
99 SDValue &Offset) {
153 SDValue Opnd0 = Addr.getOperand(1).getOperand(0);
167 bool Mips16DAGToDAGISel::selectAddr16(SDValue Addr, SDValue &Base,
167 bool Mips16DAGToDAGISel::selectAddr16(SDValue Addr, SDValue &Base,
168 SDValue &Offset) {
172 bool Mips16DAGToDAGISel::selectAddr16SP(SDValue Addr, SDValue &Base,
172 bool Mips16DAGToDAGISel::selectAddr16SP(SDValue Addr, SDValue &Base,
173 SDValue &Offset) {
lib/Target/Mips/Mips16ISelDAGToDAG.h 32 bool selectAddr(bool SPAllowed, SDValue Addr, SDValue &Base,
32 bool selectAddr(bool SPAllowed, SDValue Addr, SDValue &Base,
33 SDValue &Offset);
34 bool selectAddr16(SDValue Addr, SDValue &Base,
34 bool selectAddr16(SDValue Addr, SDValue &Base,
35 SDValue &Offset) override;
36 bool selectAddr16SP(SDValue Addr, SDValue &Base,
36 bool selectAddr16SP(SDValue Addr, SDValue &Base,
37 SDValue &Offset) override;
lib/Target/Mips/Mips16ISelLowering.cpp 412 getOpndList(SmallVectorImpl<SDValue> &Ops,
413 std::deque< std::pair<unsigned, SDValue> > &RegsToPass,
415 bool IsCallReloc, CallLoweringInfo &CLI, SDValue Callee,
416 SDValue Chain) const {
485 SDValue JumpTarget = Callee;
lib/Target/Mips/Mips16ISelLowering.h 47 getOpndList(SmallVectorImpl<SDValue> &Ops,
48 std::deque< std::pair<unsigned, SDValue> > &RegsToPass,
50 bool IsCallReloc, CallLoweringInfo &CLI, SDValue Callee,
51 SDValue Chain) const override;
lib/Target/Mips/MipsISelDAGToDAG.cpp 76 bool MipsDAGToDAGISel::selectAddrRegImm(SDValue Addr, SDValue &Base,
76 bool MipsDAGToDAGISel::selectAddrRegImm(SDValue Addr, SDValue &Base,
77 SDValue &Offset) const {
82 bool MipsDAGToDAGISel::selectAddrDefault(SDValue Addr, SDValue &Base,
82 bool MipsDAGToDAGISel::selectAddrDefault(SDValue Addr, SDValue &Base,
83 SDValue &Offset) const {
88 bool MipsDAGToDAGISel::selectIntAddr(SDValue Addr, SDValue &Base,
88 bool MipsDAGToDAGISel::selectIntAddr(SDValue Addr, SDValue &Base,
89 SDValue &Offset) const {
94 bool MipsDAGToDAGISel::selectIntAddr11MM(SDValue Addr, SDValue &Base,
94 bool MipsDAGToDAGISel::selectIntAddr11MM(SDValue Addr, SDValue &Base,
95 SDValue &Offset) const {
100 bool MipsDAGToDAGISel::selectIntAddr12MM(SDValue Addr, SDValue &Base,
100 bool MipsDAGToDAGISel::selectIntAddr12MM(SDValue Addr, SDValue &Base,
101 SDValue &Offset) const {
106 bool MipsDAGToDAGISel::selectIntAddr16MM(SDValue Addr, SDValue &Base,
106 bool MipsDAGToDAGISel::selectIntAddr16MM(SDValue Addr, SDValue &Base,
107 SDValue &Offset) const {
112 bool MipsDAGToDAGISel::selectIntAddrLSL2MM(SDValue Addr, SDValue &Base,
112 bool MipsDAGToDAGISel::selectIntAddrLSL2MM(SDValue Addr, SDValue &Base,
113 SDValue &Offset) const {
118 bool MipsDAGToDAGISel::selectIntAddrSImm10(SDValue Addr, SDValue &Base,
118 bool MipsDAGToDAGISel::selectIntAddrSImm10(SDValue Addr, SDValue &Base,
119 SDValue &Offset) const {
124 bool MipsDAGToDAGISel::selectIntAddrSImm10Lsl1(SDValue Addr, SDValue &Base,
124 bool MipsDAGToDAGISel::selectIntAddrSImm10Lsl1(SDValue Addr, SDValue &Base,
125 SDValue &Offset) const {
130 bool MipsDAGToDAGISel::selectIntAddrSImm10Lsl2(SDValue Addr, SDValue &Base,
130 bool MipsDAGToDAGISel::selectIntAddrSImm10Lsl2(SDValue Addr, SDValue &Base,
131 SDValue &Offset) const {
136 bool MipsDAGToDAGISel::selectIntAddrSImm10Lsl3(SDValue Addr, SDValue &Base,
136 bool MipsDAGToDAGISel::selectIntAddrSImm10Lsl3(SDValue Addr, SDValue &Base,
137 SDValue &Offset) const {
142 bool MipsDAGToDAGISel::selectAddr16(SDValue Addr, SDValue &Base,
142 bool MipsDAGToDAGISel::selectAddr16(SDValue Addr, SDValue &Base,
143 SDValue &Offset) {
148 bool MipsDAGToDAGISel::selectAddr16SP(SDValue Addr, SDValue &Base,
148 bool MipsDAGToDAGISel::selectAddr16SP(SDValue Addr, SDValue &Base,
149 SDValue &Offset) {
160 bool MipsDAGToDAGISel::selectVSplatUimm1(SDValue N, SDValue &Imm) const {
160 bool MipsDAGToDAGISel::selectVSplatUimm1(SDValue N, SDValue &Imm) const {
165 bool MipsDAGToDAGISel::selectVSplatUimm2(SDValue N, SDValue &Imm) const {
165 bool MipsDAGToDAGISel::selectVSplatUimm2(SDValue N, SDValue &Imm) const {
170 bool MipsDAGToDAGISel::selectVSplatUimm3(SDValue N, SDValue &Imm) const {
170 bool MipsDAGToDAGISel::selectVSplatUimm3(SDValue N, SDValue &Imm) const {
175 bool MipsDAGToDAGISel::selectVSplatUimm4(SDValue N, SDValue &Imm) const {
175 bool MipsDAGToDAGISel::selectVSplatUimm4(SDValue N, SDValue &Imm) const {
180 bool MipsDAGToDAGISel::selectVSplatUimm5(SDValue N, SDValue &Imm) const {
180 bool MipsDAGToDAGISel::selectVSplatUimm5(SDValue N, SDValue &Imm) const {
185 bool MipsDAGToDAGISel::selectVSplatUimm6(SDValue N, SDValue &Imm) const {
185 bool MipsDAGToDAGISel::selectVSplatUimm6(SDValue N, SDValue &Imm) const {
190 bool MipsDAGToDAGISel::selectVSplatUimm8(SDValue N, SDValue &Imm) const {
190 bool MipsDAGToDAGISel::selectVSplatUimm8(SDValue N, SDValue &Imm) const {
195 bool MipsDAGToDAGISel::selectVSplatSimm5(SDValue N, SDValue &Imm) const {
195 bool MipsDAGToDAGISel::selectVSplatSimm5(SDValue N, SDValue &Imm) const {
200 bool MipsDAGToDAGISel::selectVSplatUimmPow2(SDValue N, SDValue &Imm) const {
200 bool MipsDAGToDAGISel::selectVSplatUimmPow2(SDValue N, SDValue &Imm) const {
205 bool MipsDAGToDAGISel::selectVSplatUimmInvPow2(SDValue N, SDValue &Imm) const {
205 bool MipsDAGToDAGISel::selectVSplatUimmInvPow2(SDValue N, SDValue &Imm) const {
210 bool MipsDAGToDAGISel::selectVSplatMaskL(SDValue N, SDValue &Imm) const {
210 bool MipsDAGToDAGISel::selectVSplatMaskL(SDValue N, SDValue &Imm) const {
215 bool MipsDAGToDAGISel::selectVSplatMaskR(SDValue N, SDValue &Imm) const {
215 bool MipsDAGToDAGISel::selectVSplatMaskR(SDValue N, SDValue &Imm) const {
229 SDValue X = Node->getOperand(0);
230 SDValue C = Node->getOperand(1);
255 SDValue NegC = CurDAG->FoldConstantArithmetic(
258 SDValue NewNode = CurDAG->getNode(ISD::SUB, DL, VT, X, NegC);
311 SelectInlineAsmMemoryOperand(const SDValue &Op, unsigned ConstraintID,
312 std::vector<SDValue> &OutOps) {
lib/Target/Mips/MipsISelDAGToDAG.h 58 virtual bool selectAddrRegImm(SDValue Addr, SDValue &Base,
58 virtual bool selectAddrRegImm(SDValue Addr, SDValue &Base,
59 SDValue &Offset) const;
62 virtual bool selectAddrDefault(SDValue Addr, SDValue &Base,
62 virtual bool selectAddrDefault(SDValue Addr, SDValue &Base,
63 SDValue &Offset) const;
66 virtual bool selectIntAddr(SDValue Addr, SDValue &Base,
66 virtual bool selectIntAddr(SDValue Addr, SDValue &Base,
67 SDValue &Offset) const;
69 virtual bool selectIntAddr11MM(SDValue Addr, SDValue &Base,
69 virtual bool selectIntAddr11MM(SDValue Addr, SDValue &Base,
70 SDValue &Offset) const;
72 virtual bool selectIntAddr12MM(SDValue Addr, SDValue &Base,
72 virtual bool selectIntAddr12MM(SDValue Addr, SDValue &Base,
73 SDValue &Offset) const;
75 virtual bool selectIntAddr16MM(SDValue Addr, SDValue &Base,
75 virtual bool selectIntAddr16MM(SDValue Addr, SDValue &Base,
76 SDValue &Offset) const;
78 virtual bool selectIntAddrLSL2MM(SDValue Addr, SDValue &Base,
78 virtual bool selectIntAddrLSL2MM(SDValue Addr, SDValue &Base,
79 SDValue &Offset) const;
82 virtual bool selectIntAddrSImm10(SDValue Addr, SDValue &Base,
82 virtual bool selectIntAddrSImm10(SDValue Addr, SDValue &Base,
83 SDValue &Offset) const;
85 virtual bool selectIntAddrSImm10Lsl1(SDValue Addr, SDValue &Base,
85 virtual bool selectIntAddrSImm10Lsl1(SDValue Addr, SDValue &Base,
86 SDValue &Offset) const;
88 virtual bool selectIntAddrSImm10Lsl2(SDValue Addr, SDValue &Base,
88 virtual bool selectIntAddrSImm10Lsl2(SDValue Addr, SDValue &Base,
89 SDValue &Offset) const;
91 virtual bool selectIntAddrSImm10Lsl3(SDValue Addr, SDValue &Base,
91 virtual bool selectIntAddrSImm10Lsl3(SDValue Addr, SDValue &Base,
92 SDValue &Offset) const;
94 virtual bool selectAddr16(SDValue Addr, SDValue &Base, SDValue &Offset);
94 virtual bool selectAddr16(SDValue Addr, SDValue &Base, SDValue &Offset);
94 virtual bool selectAddr16(SDValue Addr, SDValue &Base, SDValue &Offset);
95 virtual bool selectAddr16SP(SDValue Addr, SDValue &Base, SDValue &Offset);
95 virtual bool selectAddr16SP(SDValue Addr, SDValue &Base, SDValue &Offset);
95 virtual bool selectAddr16SP(SDValue Addr, SDValue &Base, SDValue &Offset);
101 virtual bool selectVSplatUimm1(SDValue N, SDValue &Imm) const;
101 virtual bool selectVSplatUimm1(SDValue N, SDValue &Imm) const;
103 virtual bool selectVSplatUimm2(SDValue N, SDValue &Imm) const;
103 virtual bool selectVSplatUimm2(SDValue N, SDValue &Imm) const;
105 virtual bool selectVSplatUimm3(SDValue N, SDValue &Imm) const;
105 virtual bool selectVSplatUimm3(SDValue N, SDValue &Imm) const;
107 virtual bool selectVSplatUimm4(SDValue N, SDValue &Imm) const;
107 virtual bool selectVSplatUimm4(SDValue N, SDValue &Imm) const;
109 virtual bool selectVSplatUimm5(SDValue N, SDValue &Imm) const;
109 virtual bool selectVSplatUimm5(SDValue N, SDValue &Imm) const;
111 virtual bool selectVSplatUimm6(SDValue N, SDValue &Imm) const;
111 virtual bool selectVSplatUimm6(SDValue N, SDValue &Imm) const;
113 virtual bool selectVSplatUimm8(SDValue N, SDValue &Imm) const;
113 virtual bool selectVSplatUimm8(SDValue N, SDValue &Imm) const;
115 virtual bool selectVSplatSimm5(SDValue N, SDValue &Imm) const;
115 virtual bool selectVSplatSimm5(SDValue N, SDValue &Imm) const;
117 virtual bool selectVSplatUimmPow2(SDValue N, SDValue &Imm) const;
117 virtual bool selectVSplatUimmPow2(SDValue N, SDValue &Imm) const;
120 virtual bool selectVSplatUimmInvPow2(SDValue N, SDValue &Imm) const;
120 virtual bool selectVSplatUimmInvPow2(SDValue N, SDValue &Imm) const;
123 virtual bool selectVSplatMaskL(SDValue N, SDValue &Imm) const;
123 virtual bool selectVSplatMaskL(SDValue N, SDValue &Imm) const;
126 virtual bool selectVSplatMaskR(SDValue N, SDValue &Imm) const;
126 virtual bool selectVSplatMaskR(SDValue N, SDValue &Imm) const;
138 inline SDValue getImm(const SDNode *Node, uint64_t Imm) {
144 bool SelectInlineAsmMemoryOperand(const SDValue &Op,
146 std::vector<SDValue> &OutOps) override;
lib/Target/Mips/MipsISelLowering.cpp 146 SDValue MipsTargetLowering::getGlobalReg(SelectionDAG &DAG, EVT Ty) const {
151 SDValue MipsTargetLowering::getTargetNode(GlobalAddressSDNode *N, EVT Ty,
157 SDValue MipsTargetLowering::getTargetNode(ExternalSymbolSDNode *N, EVT Ty,
163 SDValue MipsTargetLowering::getTargetNode(BlockAddressSDNode *N, EVT Ty,
169 SDValue MipsTargetLowering::getTargetNode(JumpTableSDNode *N, EVT Ty,
175 SDValue MipsTargetLowering::getTargetNode(ConstantPoolSDNode *N, EVT Ty,
567 static SDValue performDivRemCombine(SDNode *N, SelectionDAG &DAG,
580 SDValue DivRem = DAG.getNode(Opc, DL, MVT::Glue,
582 SDValue InChain = DAG.getEntryNode();
583 SDValue InGlue = DivRem;
587 SDValue CopyFromLo = DAG.getCopyFromReg(InChain, DL, LO, Ty,
596 SDValue CopyFromHi = DAG.getCopyFromReg(InChain, DL,
644 static SDValue createFPCmp(SelectionDAG &DAG, const SDValue &Op) {
644 static SDValue createFPCmp(SelectionDAG &DAG, const SDValue &Op) {
649 SDValue LHS = Op.getOperand(0);
654 SDValue RHS = Op.getOperand(1);
666 static SDValue createCMovFP(SelectionDAG &DAG, SDValue Cond, SDValue True,
666 static SDValue createCMovFP(SelectionDAG &DAG, SDValue Cond, SDValue True,
666 static SDValue createCMovFP(SelectionDAG &DAG, SDValue Cond, SDValue True,
667 SDValue False, const SDLoc &DL) {
670 SDValue FCC0 = DAG.getRegister(Mips::FCC0, MVT::i32);
676 static SDValue performSELECTCombine(SDNode *N, SelectionDAG &DAG,
682 SDValue SetCC = N->getOperand(0);
688 SDValue False = N->getOperand(2);
710 SDValue True = N->getOperand(1);
720 SDValue True = N->getOperand(1);
755 static SDValue performCMovFPCombine(SDNode *N, SelectionDAG &DAG,
761 SDValue ValueIfTrue = N->getOperand(0), ValueIfFalse = N->getOperand(2);
777 SDValue FCC = N->getOperand(1), Glue = N->getOperand(3);
782 static SDValue performANDCombine(SDNode *N, SelectionDAG &DAG,
788 SDValue FirstOperand = N->getOperand(0);
790 SDValue Mask = N->getOperand(1);
796 SDValue NewOperand;
864 static SDValue performORCombine(SDNode *N, SelectionDAG &DAG,
874 SDValue And0 = N->getOperand(0), And1 = N->getOperand(1);
898 SDValue Shl = And1.getOperand(0);
940 SDValue Const1;
941 SDValue SrlX;
962 static SDValue performMADD_MSUBCombine(SDNode *ROOTNode, SelectionDAG &CurDAG,
996 SDValue Mult = ROOTNode->getOperand(0).getOpcode() == ISD::MUL
1000 SDValue AddOperand = ROOTNode->getOperand(0).getOpcode() == ISD::MUL
1014 SDValue MultLHS = Mult->getOperand(0);
1015 SDValue MultRHS = Mult->getOperand(1);
1027 SDValue TopHalf;
1028 SDValue BottomHalf;
1034 SDValue ACCIn = CurDAG.getNode(MipsISD::MTLOHI, DL, MVT::Untyped,
1042 SDValue MAddOps[3] = {
1046 SDValue MAdd = CurDAG.getNode(Opcode, DL, VTs, MAddOps);
1048 SDValue ResLo = CurDAG.getNode(MipsISD::MFLO, DL, MVT::i32, MAdd);
1049 SDValue ResHi = CurDAG.getNode(MipsISD::MFHI, DL, MVT::i32, MAdd);
1050 SDValue Combined =
1055 static SDValue performSUBCombine(SDNode *N, SelectionDAG &DAG,
1070 static SDValue performADDCombine(SDNode *N, SelectionDAG &DAG,
1083 SDValue Add = N->getOperand(1);
1088 SDValue Lo = Add.getOperand(1);
1097 SDValue Add1 = DAG.getNode(ISD::ADD, DL, ValTy, N->getOperand(0),
1102 static SDValue performSHLCombine(SDNode *N, SelectionDAG &DAG,
1112 SDValue FirstOperand = N->getOperand(0);
1114 SDValue SecondOperand = N->getOperand(1);
1120 SDValue NewOperand;
1153 SDValue MipsTargetLowering::PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI)
1200 SmallVectorImpl<SDValue> &Results,
1202 SDValue Res = LowerOperation(SDValue(N, 0), DAG);
1211 SmallVectorImpl<SDValue> &Results,
1216 SDValue MipsTargetLowering::
1217 LowerOperation(SDValue Op, SelectionDAG &DAG) const
1901 SDValue MipsTargetLowering::lowerBRCOND(SDValue Op, SelectionDAG &DAG) const {
1901 SDValue MipsTargetLowering::lowerBRCOND(SDValue Op, SelectionDAG &DAG) const {
1904 SDValue Chain = Op.getOperand(0);
1905 SDValue Dest = Op.getOperand(2);
1909 SDValue CondRes = createFPCmp(DAG, Op.getOperand(1));
1915 SDValue CCNode = CondRes.getOperand(2);
1919 SDValue BrCode = DAG.getConstant(Opc, DL, MVT::i32);
1920 SDValue FCC0 = DAG.getRegister(Mips::FCC0, MVT::i32);
1925 SDValue MipsTargetLowering::
1926 lowerSELECT(SDValue Op, SelectionDAG &DAG) const
1929 SDValue Cond = createFPCmp(DAG, Op.getOperand(0));
1939 SDValue MipsTargetLowering::lowerSETCC(SDValue Op, SelectionDAG &DAG) const {
1939 SDValue MipsTargetLowering::lowerSETCC(SDValue Op, SelectionDAG &DAG) const {
1941 SDValue Cond = createFPCmp(DAG, Op);
1947 SDValue True = DAG.getConstant(1, DL, MVT::i32);
1948 SDValue False = DAG.getConstant(0, DL, MVT::i32);
1953 SDValue MipsTargetLowering::lowerGlobalAddress(SDValue Op,
1953 SDValue MipsTargetLowering::lowerGlobalAddress(SDValue Op,
2000 SDValue MipsTargetLowering::lowerBlockAddress(SDValue Op,
2000 SDValue MipsTargetLowering::lowerBlockAddress(SDValue Op,
2012 SDValue MipsTargetLowering::
2013 lowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const
2034 SDValue TGA = DAG.getTargetGlobalAddress(GV, DL, PtrVT, 0, Flag);
2035 SDValue Argument = DAG.getNode(MipsISD::Wrapper, DL, PtrVT,
2040 SDValue TlsGetAddr = DAG.getExternalSymbol("__tls_get_addr", PtrVT);
2052 std::pair<SDValue, SDValue> CallResult = LowerCallTo(CLI);
2052 std::pair<SDValue, SDValue> CallResult = LowerCallTo(CLI);
2054 SDValue Ret = CallResult.first;
2059 SDValue TGAHi = DAG.getTargetGlobalAddress(GV, DL, PtrVT, 0,
2061 SDValue Hi = DAG.getNode(MipsISD::TlsHi, DL, PtrVT, TGAHi);
2062 SDValue TGALo = DAG.getTargetGlobalAddress(GV, DL, PtrVT, 0,
2064 SDValue Lo = DAG.getNode(MipsISD::Lo, DL, PtrVT, TGALo);
2065 SDValue Add = DAG.getNode(ISD::ADD, DL, PtrVT, Hi, Ret);
2069 SDValue Offset;
2072 SDValue TGA = DAG.getTargetGlobalAddress(GV, DL, PtrVT, 0,
2081 SDValue TGAHi = DAG.getTargetGlobalAddress(GV, DL, PtrVT, 0,
2083 SDValue TGALo = DAG.getTargetGlobalAddress(GV, DL, PtrVT, 0,
2085 SDValue Hi = DAG.getNode(MipsISD::TlsHi, DL, PtrVT, TGAHi);
2086 SDValue Lo = DAG.getNode(MipsISD::Lo, DL, PtrVT, TGALo);
2090 SDValue ThreadPointer = DAG.getNode(MipsISD::ThreadPointer, DL, PtrVT);
2094 SDValue MipsTargetLowering::
2095 lowerJumpTable(SDValue Op, SelectionDAG &DAG) const
2107 SDValue MipsTargetLowering::
2108 lowerConstantPool(SDValue Op, SelectionDAG &DAG) const
2130 SDValue MipsTargetLowering::lowerVASTART(SDValue Op, SelectionDAG &DAG) const {
2130 SDValue MipsTargetLowering::lowerVASTART(SDValue Op, SelectionDAG &DAG) const {
2135 SDValue FI = DAG.getFrameIndex(FuncInfo->getVarArgsFrameIndex(),
2145 SDValue MipsTargetLowering::lowerVAARG(SDValue Op, SelectionDAG &DAG) const {
2145 SDValue MipsTargetLowering::lowerVAARG(SDValue Op, SelectionDAG &DAG) const {
2148 SDValue Chain = Node->getOperand(0);
2149 SDValue VAListPtr = Node->getOperand(1);
2156 SDValue VAListLoad = DAG.getLoad(getPointerTy(DAG.getDataLayout()), DL, Chain,
2158 SDValue VAList = VAListLoad;
2181 SDValue Tmp3 =
2203 static SDValue lowerFCOPYSIGN32(SDValue Op, SelectionDAG &DAG,
2203 static SDValue lowerFCOPYSIGN32(SDValue Op, SelectionDAG &DAG,
2208 SDValue Const1 = DAG.getConstant(1, DL, MVT::i32);
2209 SDValue Const31 = DAG.getConstant(31, DL, MVT::i32);
2210 SDValue Res;
2214 SDValue X = (TyX == MVT::f32) ?
2218 SDValue Y = (TyY == MVT::f32) ?
2226 SDValue E = DAG.getNode(MipsISD::Ext, DL, MVT::i32, Y, Const31, Const1);
2234 SDValue SllX = DAG.getNode(ISD::SHL, DL, MVT::i32, X, Const1);
2235 SDValue SrlX = DAG.getNode(ISD::SRL, DL, MVT::i32, SllX, Const1);
2236 SDValue SrlY = DAG.getNode(ISD::SRL, DL, MVT::i32, Y, Const31);
2237 SDValue SllY = DAG.getNode(ISD::SHL, DL, MVT::i32, SrlY, Const31);
2244 SDValue LowX = DAG.getNode(MipsISD::ExtractElementF64, DL, MVT::i32,
2250 static SDValue lowerFCOPYSIGN64(SDValue Op, SelectionDAG &DAG,
2250 static SDValue lowerFCOPYSIGN64(SDValue Op, SelectionDAG &DAG,
2256 SDValue Const1 = DAG.getConstant(1, DL, MVT::i32);
2259 SDValue X = DAG.getNode(ISD::BITCAST, DL, TyX, Op.getOperand(0));
2260 SDValue Y = DAG.getNode(ISD::BITCAST, DL, TyY, Op.getOperand(1));
2265 SDValue E = DAG.getNode(MipsISD::Ext, DL, TyY, Y,
2273 SDValue I = DAG.getNode(MipsISD::Ins, DL, TyX, E,
2284 SDValue SllX = DAG.getNode(ISD::SHL, DL, TyX, X, Const1);
2285 SDValue SrlX = DAG.getNode(ISD::SRL, DL, TyX, SllX, Const1);
2286 SDValue SrlY = DAG.getNode(ISD::SRL, DL, TyY, Y,
2294 SDValue SllY = DAG.getNode(ISD::SHL, DL, TyX, SrlY,
2296 SDValue Or = DAG.getNode(ISD::OR, DL, TyX, SrlX, SllY);
2300 SDValue
2301 MipsTargetLowering::lowerFCOPYSIGN(SDValue Op, SelectionDAG &DAG) const {
2308 static SDValue lowerFABS32(SDValue Op, SelectionDAG &DAG,
2308 static SDValue lowerFABS32(SDValue Op, SelectionDAG &DAG,
2311 SDValue Res, Const1 = DAG.getConstant(1, DL, MVT::i32);
2315 SDValue X = (Op.getValueType() == MVT::f32)
2328 SDValue SllX = DAG.getNode(ISD::SHL, DL, MVT::i32, X, Const1);
2339 SDValue LowX =
2345 static SDValue lowerFABS64(SDValue Op, SelectionDAG &DAG,
2345 static SDValue lowerFABS64(SDValue Op, SelectionDAG &DAG,
2348 SDValue Res, Const1 = DAG.getConstant(1, DL, MVT::i32);
2351 SDValue X = DAG.getNode(ISD::BITCAST, DL, MVT::i64, Op.getOperand(0));
2359 SDValue SllX = DAG.getNode(ISD::SHL, DL, MVT::i64, X, Const1);
2366 SDValue MipsTargetLowering::lowerFABS(SDValue Op, SelectionDAG &DAG) const {
2366 SDValue MipsTargetLowering::lowerFABS(SDValue Op, SelectionDAG &DAG) const {
2373 SDValue MipsTargetLowering::
2374 lowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const {
2386 SDValue FrameAddr = DAG.getCopyFromReg(
2391 SDValue MipsTargetLowering::lowerRETURNADDR(SDValue Op,
2391 SDValue MipsTargetLowering::lowerRETURNADDR(SDValue Op,
2418 SDValue MipsTargetLowering::lowerEH_RETURN(SDValue Op, SelectionDAG &DAG)
2418 SDValue MipsTargetLowering::lowerEH_RETURN(SDValue Op, SelectionDAG &DAG)
2424 SDValue Chain = Op.getOperand(0);
2425 SDValue Offset = Op.getOperand(1);
2426 SDValue Handler = Op.getOperand(2);
2442 SDValue MipsTargetLowering::lowerATOMIC_FENCE(SDValue Op,
2442 SDValue MipsTargetLowering::lowerATOMIC_FENCE(SDValue Op,
2452 SDValue MipsTargetLowering::lowerShiftLeftParts(SDValue Op,
2452 SDValue MipsTargetLowering::lowerShiftLeftParts(SDValue Op,
2457 SDValue Lo = Op.getOperand(0), Hi = Op.getOperand(1);
2458 SDValue Shamt = Op.getOperand(2);
2465 SDValue Not = DAG.getNode(ISD::XOR, DL, MVT::i32, Shamt,
2467 SDValue ShiftRight1Lo = DAG.getNode(ISD::SRL, DL, VT, Lo,
2469 SDValue ShiftRightLo = DAG.getNode(ISD::SRL, DL, VT, ShiftRight1Lo, Not);
2470 SDValue ShiftLeftHi = DAG.getNode(ISD::SHL, DL, VT, Hi, Shamt);
2471 SDValue Or = DAG.getNode(ISD::OR, DL, VT, ShiftLeftHi, ShiftRightLo);
2472 SDValue ShiftLeftLo = DAG.getNode(ISD::SHL, DL, VT, Lo, Shamt);
2473 SDValue Cond = DAG.getNode(ISD::AND, DL, MVT::i32, Shamt,
2479 SDValue Ops[2] = {Lo, Hi};
2483 SDValue MipsTargetLowering::lowerShiftRightParts(SDValue Op, SelectionDAG &DAG,
2483 SDValue MipsTargetLowering::lowerShiftRightParts(SDValue Op, SelectionDAG &DAG,
2486 SDValue Lo = Op.getOperand(0), Hi = Op.getOperand(1);
2487 SDValue Shamt = Op.getOperand(2);
2503 SDValue Not = DAG.getNode(ISD::XOR, DL, MVT::i32, Shamt,
2505 SDValue ShiftLeft1Hi = DAG.getNode(ISD::SHL, DL, VT, Hi,
2507 SDValue ShiftLeftHi = DAG.getNode(ISD::SHL, DL, VT, ShiftLeft1Hi, Not);
2508 SDValue ShiftRightLo = DAG.getNode(ISD::SRL, DL, VT, Lo, Shamt);
2509 SDValue Or = DAG.getNode(ISD::OR, DL, VT, ShiftLeftHi, ShiftRightLo);
2510 SDValue ShiftRightHi = DAG.getNode(IsSRA ? ISD::SRA : ISD::SRL,
2512 SDValue Cond = DAG.getNode(ISD::AND, DL, MVT::i32, Shamt,
2514 SDValue Ext = DAG.getNode(ISD::SRA, DL, VT, Hi,
2530 SDValue Ops[2] = {Lo, Hi};
2534 static SDValue createLoadLR(unsigned Opc, SelectionDAG &DAG, LoadSDNode *LD,
2535 SDValue Chain, SDValue Src, unsigned Offset) {
2535 SDValue Chain, SDValue Src, unsigned Offset) {
2536 SDValue Ptr = LD->getBasePtr();
2546 SDValue Ops[] = { Chain, Ptr, Src };
2552 SDValue MipsTargetLowering::lowerLOAD(SDValue Op, SelectionDAG &DAG) const {
2552 SDValue MipsTargetLowering::lowerLOAD(SDValue Op, SelectionDAG &DAG) const {
2567 SDValue Chain = LD->getChain(), Undef = DAG.getUNDEF(VT);
2577 SDValue LDL = createLoadLR(MipsISD::LDL, DAG, LD, Chain, Undef,
2583 SDValue LWL = createLoadLR(MipsISD::LWL, DAG, LD, Chain, Undef,
2585 SDValue LWR = createLoadLR(MipsISD::LWR, DAG, LD, LWL.getValue(1), LWL,
2609 SDValue Const32 = DAG.getConstant(32, DL, MVT::i32);
2610 SDValue SLL = DAG.getNode(ISD::SHL, DL, MVT::i64, LWR, Const32);
2611 SDValue SRL = DAG.getNode(ISD::SRL, DL, MVT::i64, SLL, Const32);
2612 SDValue Ops[] = { SRL, LWR.getValue(1) };
2616 static SDValue createStoreLR(unsigned Opc, SelectionDAG &DAG, StoreSDNode *SD,
2617 SDValue Chain, unsigned Offset) {
2618 SDValue Ptr = SD->getBasePtr(), Value = SD->getValue();
2627 SDValue Ops[] = { Chain, Value, Ptr };
2633 static SDValue lowerUnalignedIntStore(StoreSDNode *SD, SelectionDAG &DAG,
2635 SDValue Value = SD->getValue(), Chain = SD->getChain();
2645 SDValue SWL = createStoreLR(MipsISD::SWL, DAG, SD, Chain,
2657 SDValue SDL = createStoreLR(MipsISD::SDL, DAG, SD, Chain, IsLittle ? 7 : 0);
2662 static SDValue lowerFP_TO_SINT_STORE(StoreSDNode *SD, SelectionDAG &DAG,
2664 SDValue Val = SD->getValue();
2671 SDValue Tr = DAG.getNode(MipsISD::TruncIntFP, SDLoc(Val), FPTy,
2678 SDValue MipsTargetLowering::lowerSTORE(SDValue Op, SelectionDAG &DAG) const {
2678 SDValue MipsTargetLowering::lowerSTORE(SDValue Op, SelectionDAG &DAG) const {
2691 SDValue MipsTargetLowering::lowerEH_DWARF_CFA(SDValue Op,
2691 SDValue MipsTargetLowering::lowerEH_DWARF_CFA(SDValue Op,
2702 SDValue MipsTargetLowering::lowerFP_TO_SINT(SDValue Op,
2702 SDValue MipsTargetLowering::lowerFP_TO_SINT(SDValue Op,
2708 SDValue Trunc = DAG.getNode(MipsISD::TruncIntFP, SDLoc(Op), FPTy,
2887 SDValue MipsTargetLowering::passArgOnStack(SDValue StackPtr, unsigned Offset,
2887 SDValue MipsTargetLowering::passArgOnStack(SDValue StackPtr, unsigned Offset,
2888 SDValue Chain, SDValue Arg,
2888 SDValue Chain, SDValue Arg,
2892 SDValue PtrOff =
2900 SDValue FIN = DAG.getFrameIndex(FI, getPointerTy(DAG.getDataLayout()));
2906 getOpndList(SmallVectorImpl<SDValue> &Ops,
2907 std::deque<std::pair<unsigned, SDValue>> &RegsToPass,
2909 bool IsCallReloc, CallLoweringInfo &CLI, SDValue Callee,
2910 SDValue Chain) const {
2931 SDValue InFlag;
2992 const SDValue TargetAddr = Node->getOperand(0).getOperand(1);
3015 SDValue
3017 SmallVectorImpl<SDValue> &InVals) const {
3021 SmallVectorImpl<SDValue> &OutVals = CLI.OutVals;
3023 SDValue Chain = CLI.Chain;
3024 SDValue Callee = CLI.Callee;
3111 SDValue NextStackOffsetVal = DAG.getIntPtrConstant(NextStackOffset, DL, true);
3116 SDValue StackPtr =
3120 std::deque<std::pair<unsigned, SDValue>> RegsToPass;
3121 SmallVector<SDValue, 8> MemOpChains;
3127 SDValue Arg = OutVals[i];
3162 SDValue Lo = DAG.getNode(MipsISD::ExtractElementF64, DL, MVT::i32,
3164 SDValue Hi = DAG.getNode(MipsISD::ExtractElementF64, DL, MVT::i32,
3307 SmallVector<SDValue, 8> Ops(1, Chain);
3319 SDValue InFlag = Chain.getValue(1);
3337 SDValue MipsTargetLowering::LowerCallResult(
3338 SDValue Chain, SDValue InFlag, CallingConv::ID CallConv, bool IsVarArg,
3338 SDValue Chain, SDValue InFlag, CallingConv::ID CallConv, bool IsVarArg,
3340 SelectionDAG &DAG, SmallVectorImpl<SDValue> &InVals,
3357 SDValue Val = DAG.getCopyFromReg(Chain, DL, RVLocs[i].getLocReg(),
3404 static SDValue UnpackFromArgumentSlot(SDValue Val, const CCValAssign &VA,
3404 static SDValue UnpackFromArgumentSlot(SDValue Val, const CCValAssign &VA,
3464 SDValue MipsTargetLowering::LowerFormalArguments(
3465 SDValue Chain, CallingConv::ID CallConv, bool IsVarArg,
3467 SelectionDAG &DAG, SmallVectorImpl<SDValue> &InVals) const {
3475 std::vector<SDValue> OutChains;
3530 SDValue ArgValue = DAG.getCopyFromReg(Chain, DL, Reg, RegVT);
3544 SDValue ArgValue2 = DAG.getCopyFromReg(Chain, DL, Reg2, RegVT);
3572 SDValue FIN = DAG.getFrameIndex(FI, getPointerTy(DAG.getDataLayout()));
3573 SDValue ArgValue = DAG.getLoad(
3595 SDValue Copy = DAG.getCopyToReg(DAG.getEntryNode(), DL, Reg, InVals[i]);
3636 SDValue
3637 MipsTargetLowering::LowerInterruptReturn(SmallVectorImpl<SDValue> &RetOps,
3648 SDValue
3649 MipsTargetLowering::LowerReturn(SDValue Chain, CallingConv::ID CallConv,
3652 const SmallVectorImpl<SDValue> &OutVals,
3665 SDValue Flag;
3666 SmallVector<SDValue, 4> RetOps(1, Chain);
3670 SDValue Val = OutVals[i];
3728 SDValue Val =
4020 void MipsTargetLowering::LowerAsmOperandForConstraint(SDValue Op,
4022 std::vector<SDValue>&Ops,
4025 SDValue Result;
4174 SDValue Chain, const SDLoc &DL, std::vector<SDValue> &OutChains,
4174 SDValue Chain, const SDLoc &DL, std::vector<SDValue> &OutChains,
4176 SmallVectorImpl<SDValue> &InVals, const Argument *FuncArg,
4203 SDValue FIN = DAG.getFrameIndex(FI, PtrTy);
4217 SDValue StorePtr = DAG.getNode(ISD::ADD, DL, PtrTy, FIN,
4219 SDValue Store = DAG.getStore(Chain, DL, DAG.getRegister(VReg, RegTy),
4227 SDValue Chain, const SDLoc &DL,
4228 std::deque<std::pair<unsigned, SDValue>> &RegsToPass,
4229 SmallVectorImpl<SDValue> &MemOpChains, SDValue StackPtr,
4229 SmallVectorImpl<SDValue> &MemOpChains, SDValue StackPtr,
4230 MachineFrameInfo &MFI, SelectionDAG &DAG, SDValue Arg, unsigned FirstReg,
4248 SDValue LoadPtr = DAG.getNode(ISD::ADD, DL, PtrTy, Arg,
4250 SDValue LoadVal = DAG.getLoad(RegTy, DL, Chain, LoadPtr,
4263 SDValue Val;
4273 SDValue LoadPtr = DAG.getNode(ISD::ADD, DL, PtrTy, Arg,
4276 SDValue LoadVal = DAG.getExtLoad(
4289 SDValue Shift = DAG.getNode(ISD::SHL, DL, RegTy, LoadVal,
4310 SDValue Src = DAG.getNode(ISD::ADD, DL, PtrTy, Arg,
4312 SDValue Dst = DAG.getNode(ISD::ADD, DL, PtrTy, StackPtr,
4322 void MipsTargetLowering::writeVarArgRegs(std::vector<SDValue> &OutChains,
4323 SDValue Chain, const SDLoc &DL,
4358 SDValue ArgValue = DAG.getCopyFromReg(Chain, DL, Reg, RegTy);
4360 SDValue PtrOff = DAG.getFrameIndex(FI, getPointerTy(DAG.getDataLayout()));
4361 SDValue Store =
lib/Target/Mips/MipsISelLowering.h 320 SmallVectorImpl<SDValue> &Results,
324 SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
324 SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
329 void ReplaceNodeResults(SDNode *N, SmallVectorImpl<SDValue>&Results,
340 SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const override;
385 SDValue getGlobalReg(SelectionDAG &DAG, EVT Ty) const;
392 SDValue getAddrLocal(NodeTy *N, const SDLoc &DL, EVT Ty, SelectionDAG &DAG,
395 SDValue GOT = DAG.getNode(MipsISD::Wrapper, DL, Ty, getGlobalReg(DAG, Ty),
397 SDValue Load =
401 SDValue Lo = DAG.getNode(MipsISD::Lo, DL, Ty,
411 SDValue getAddrGlobal(NodeTy *N, const SDLoc &DL, EVT Ty, SelectionDAG &DAG,
412 unsigned Flag, SDValue Chain,
414 SDValue Tgt = DAG.getNode(MipsISD::Wrapper, DL, Ty, getGlobalReg(DAG, Ty),
424 SDValue getAddrGlobalLargeGOT(NodeTy *N, const SDLoc &DL, EVT Ty,
426 unsigned LoFlag, SDValue Chain,
428 SDValue Hi = DAG.getNode(MipsISD::GotHi, DL, Ty,
431 SDValue Wrapper = DAG.getNode(MipsISD::Wrapper, DL, Ty, Hi,
443 SDValue getAddrNonPIC(NodeTy *N, const SDLoc &DL, EVT Ty,
445 SDValue Hi = getTargetNode(N, Ty, DAG, MipsII::MO_ABS_HI);
446 SDValue Lo = getTargetNode(N, Ty, DAG, MipsII::MO_ABS_LO);
460 SDValue getAddrNonPICSym64(NodeTy *N, const SDLoc &DL, EVT Ty,
462 SDValue Hi = getTargetNode(N, Ty, DAG, MipsII::MO_ABS_HI);
463 SDValue Lo = getTargetNode(N, Ty, DAG, MipsII::MO_ABS_LO);
465 SDValue Highest =
468 SDValue Higher = getTargetNode(N, Ty, DAG, MipsII::MO_HIGHER);
469 SDValue HigherPart =
472 SDValue Cst = DAG.getConstant(16, DL, MVT::i32);
473 SDValue Shift = DAG.getNode(ISD::SHL, DL, Ty, HigherPart, Cst);
474 SDValue Add = DAG.getNode(ISD::ADD, DL, Ty, Shift,
476 SDValue Shift2 = DAG.getNode(ISD::SHL, DL, Ty, Add, Cst);
487 SDValue getAddrGPRel(NodeTy *N, const SDLoc &DL, EVT Ty,
489 SDValue GPRel = getTargetNode(N, Ty, DAG, MipsII::MO_GPREL);
500 getOpndList(SmallVectorImpl<SDValue> &Ops,
501 std::deque<std::pair<unsigned, SDValue>> &RegsToPass,
503 bool IsCallReloc, CallLoweringInfo &CLI, SDValue Callee,
504 SDValue Chain) const;
507 SDValue lowerLOAD(SDValue Op, SelectionDAG &DAG) const;
507 SDValue lowerLOAD(SDValue Op, SelectionDAG &DAG) const;
508 SDValue lowerSTORE(SDValue Op, SelectionDAG &DAG) const;
508 SDValue lowerSTORE(SDValue Op, SelectionDAG &DAG) const;
517 SDValue getTargetNode(GlobalAddressSDNode *N, EVT Ty, SelectionDAG &DAG,
521 SDValue getTargetNode(ExternalSymbolSDNode *N, EVT Ty, SelectionDAG &DAG,
525 SDValue getTargetNode(BlockAddressSDNode *N, EVT Ty, SelectionDAG &DAG,
529 SDValue getTargetNode(JumpTableSDNode *N, EVT Ty, SelectionDAG &DAG,
533 SDValue getTargetNode(ConstantPoolSDNode *N, EVT Ty, SelectionDAG &DAG,
537 SDValue LowerCallResult(SDValue Chain, SDValue InFlag,
537 SDValue LowerCallResult(SDValue Chain, SDValue InFlag,
537 SDValue LowerCallResult(SDValue Chain, SDValue InFlag,
541 SmallVectorImpl<SDValue> &InVals,
545 SDValue lowerBRCOND(SDValue Op, SelectionDAG &DAG) const;
545 SDValue lowerBRCOND(SDValue Op, SelectionDAG &DAG) const;
546 SDValue lowerConstantPool(SDValue Op, SelectionDAG &DAG) const;
546 SDValue lowerConstantPool(SDValue Op, SelectionDAG &DAG) const;
547 SDValue lowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const;
547 SDValue lowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const;
548 SDValue lowerBlockAddress(SDValue Op, SelectionDAG &DAG) const;
548 SDValue lowerBlockAddress(SDValue Op, SelectionDAG &DAG) const;
549 SDValue lowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const;
549 SDValue lowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const;
550 SDValue lowerJumpTable(SDValue Op, SelectionDAG &DAG) const;
550 SDValue lowerJumpTable(SDValue Op, SelectionDAG &DAG) const;
551 SDValue lowerSELECT(SDValue Op, SelectionDAG &DAG) const;
551 SDValue lowerSELECT(SDValue Op, SelectionDAG &DAG) const;
552 SDValue lowerSETCC(SDValue Op, SelectionDAG &DAG) const;
552 SDValue lowerSETCC(SDValue Op, SelectionDAG &DAG) const;
553 SDValue lowerVASTART(SDValue Op, SelectionDAG &DAG) const;
553 SDValue lowerVASTART(SDValue Op, SelectionDAG &DAG) const;
554 SDValue lowerVAARG(SDValue Op, SelectionDAG &DAG) const;
554 SDValue lowerVAARG(SDValue Op, SelectionDAG &DAG) const;
555 SDValue lowerFCOPYSIGN(SDValue Op, SelectionDAG &DAG) const;
555 SDValue lowerFCOPYSIGN(SDValue Op, SelectionDAG &DAG) const;
556 SDValue lowerFABS(SDValue Op, SelectionDAG &DAG) const;
556 SDValue lowerFABS(SDValue Op, SelectionDAG &DAG) const;
557 SDValue lowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const;
557 SDValue lowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const;
558 SDValue lowerRETURNADDR(SDValue Op, SelectionDAG &DAG) const;
558 SDValue lowerRETURNADDR(SDValue Op, SelectionDAG &DAG) const;
559 SDValue lowerEH_RETURN(SDValue Op, SelectionDAG &DAG) const;
559 SDValue lowerEH_RETURN(SDValue Op, SelectionDAG &DAG) const;
560 SDValue lowerATOMIC_FENCE(SDValue Op, SelectionDAG& DAG) const;
560 SDValue lowerATOMIC_FENCE(SDValue Op, SelectionDAG& DAG) const;
561 SDValue lowerShiftLeftParts(SDValue Op, SelectionDAG& DAG) const;
561 SDValue lowerShiftLeftParts(SDValue Op, SelectionDAG& DAG) const;
562 SDValue lowerShiftRightParts(SDValue Op, SelectionDAG& DAG,
562 SDValue lowerShiftRightParts(SDValue Op, SelectionDAG& DAG,
564 SDValue lowerEH_DWARF_CFA(SDValue Op, SelectionDAG &DAG) const;
564 SDValue lowerEH_DWARF_CFA(SDValue Op, SelectionDAG &DAG) const;
565 SDValue lowerFP_TO_SINT(SDValue Op, SelectionDAG &DAG) const;
565 SDValue lowerFP_TO_SINT(SDValue Op, SelectionDAG &DAG) const;
577 void copyByValRegs(SDValue Chain, const SDLoc &DL,
578 std::vector<SDValue> &OutChains, SelectionDAG &DAG,
580 SmallVectorImpl<SDValue> &InVals,
586 void passByValArg(SDValue Chain, const SDLoc &DL,
587 std::deque<std::pair<unsigned, SDValue>> &RegsToPass,
588 SmallVectorImpl<SDValue> &MemOpChains, SDValue StackPtr,
588 SmallVectorImpl<SDValue> &MemOpChains, SDValue StackPtr,
589 MachineFrameInfo &MFI, SelectionDAG &DAG, SDValue Arg,
597 void writeVarArgRegs(std::vector<SDValue> &OutChains, SDValue Chain,
597 void writeVarArgRegs(std::vector<SDValue> &OutChains, SDValue Chain,
601 SDValue
602 LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
605 SmallVectorImpl<SDValue> &InVals) const override;
607 SDValue passArgOnStack(SDValue StackPtr, unsigned Offset, SDValue Chain,
607 SDValue passArgOnStack(SDValue StackPtr, unsigned Offset, SDValue Chain,
607 SDValue passArgOnStack(SDValue StackPtr, unsigned Offset, SDValue Chain,
608 SDValue Arg, const SDLoc &DL, bool IsTailCall,
611 SDValue LowerCall(TargetLowering::CallLoweringInfo &CLI,
612 SmallVectorImpl<SDValue> &InVals) const override;
619 SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
619 SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
621 const SmallVectorImpl<SDValue> &OutVals,
624 SDValue LowerInterruptReturn(SmallVectorImpl<SDValue> &RetOps,
624 SDValue LowerInterruptReturn(SmallVectorImpl<SDValue> &RetOps,
650 void LowerAsmOperandForConstraint(SDValue Op,
652 std::vector<SDValue> &Ops,
lib/Target/Mips/MipsSEISelDAGToDAG.cpp 77 unsigned MipsSEDAGToDAGISel::getMSACtrlReg(const SDValue RegIdx) const {
206 SDValue InFlag = Node->getOperand(2);
208 SDValue LHS = Node->getOperand(0), RHS = Node->getOperand(1);
214 SDValue Ops[3] = {LHS, RHS, InFlag};
233 SDValue CstOne = CurDAG->getTargetConstant(1, DL, MVT::i32);
235 SDValue OuFlag = CurDAG->getTargetConstant(20, DL, MVT::i32);
243 SDValue Ops[4] = {SDValue(DSPCtrlField, 0),
253 SDValue Zero = CurDAG->getRegister(Mips::ZERO, MVT::i32);
255 SDValue InsOps[4] = {Zero, OuFlag, CstOne, SDValue(DSPCFWithCarry, 0)};
261 SDValue Operands[3] = {LHS, RHS, SDValue(WrDSP, 0)};
266 bool MipsSEDAGToDAGISel::selectAddrFrameIndex(SDValue Addr, SDValue &Base,
266 bool MipsSEDAGToDAGISel::selectAddrFrameIndex(SDValue Addr, SDValue &Base,
267 SDValue &Offset) const {
280 SDValue Addr, SDValue &Base, SDValue &Offset, unsigned OffsetBits,
280 SDValue Addr, SDValue &Base, SDValue &Offset, unsigned OffsetBits,
280 SDValue Addr, SDValue &Base, SDValue &Offset, unsigned OffsetBits,
310 bool MipsSEDAGToDAGISel::selectAddrRegImm(SDValue Addr, SDValue &Base,
310 bool MipsSEDAGToDAGISel::selectAddrRegImm(SDValue Addr, SDValue &Base,
311 SDValue &Offset) const {
345 SDValue Opnd0 = Addr.getOperand(1).getOperand(0);
360 bool MipsSEDAGToDAGISel::selectAddrDefault(SDValue Addr, SDValue &Base,
360 bool MipsSEDAGToDAGISel::selectAddrDefault(SDValue Addr, SDValue &Base,
361 SDValue &Offset) const {
367 bool MipsSEDAGToDAGISel::selectIntAddr(SDValue Addr, SDValue &Base,
367 bool MipsSEDAGToDAGISel::selectIntAddr(SDValue Addr, SDValue &Base,
368 SDValue &Offset) const {
373 bool MipsSEDAGToDAGISel::selectAddrRegImm9(SDValue Addr, SDValue &Base,
373 bool MipsSEDAGToDAGISel::selectAddrRegImm9(SDValue Addr, SDValue &Base,
374 SDValue &Offset) const {
385 bool MipsSEDAGToDAGISel::selectAddrRegImm11(SDValue Addr, SDValue &Base,
385 bool MipsSEDAGToDAGISel::selectAddrRegImm11(SDValue Addr, SDValue &Base,
386 SDValue &Offset) const {
397 bool MipsSEDAGToDAGISel::selectAddrRegImm12(SDValue Addr, SDValue &Base,
397 bool MipsSEDAGToDAGISel::selectAddrRegImm12(SDValue Addr, SDValue &Base,
398 SDValue &Offset) const {
408 bool MipsSEDAGToDAGISel::selectAddrRegImm16(SDValue Addr, SDValue &Base,
408 bool MipsSEDAGToDAGISel::selectAddrRegImm16(SDValue Addr, SDValue &Base,
409 SDValue &Offset) const {
419 bool MipsSEDAGToDAGISel::selectIntAddr11MM(SDValue Addr, SDValue &Base,
419 bool MipsSEDAGToDAGISel::selectIntAddr11MM(SDValue Addr, SDValue &Base,
420 SDValue &Offset) const {
425 bool MipsSEDAGToDAGISel::selectIntAddr12MM(SDValue Addr, SDValue &Base,
425 bool MipsSEDAGToDAGISel::selectIntAddr12MM(SDValue Addr, SDValue &Base,
426 SDValue &Offset) const {
431 bool MipsSEDAGToDAGISel::selectIntAddr16MM(SDValue Addr, SDValue &Base,
431 bool MipsSEDAGToDAGISel::selectIntAddr16MM(SDValue Addr, SDValue &Base,
432 SDValue &Offset) const {
437 bool MipsSEDAGToDAGISel::selectIntAddrLSL2MM(SDValue Addr, SDValue &Base,
437 bool MipsSEDAGToDAGISel::selectIntAddrLSL2MM(SDValue Addr, SDValue &Base,
438 SDValue &Offset) const {
459 bool MipsSEDAGToDAGISel::selectIntAddrSImm10(SDValue Addr, SDValue &Base,
459 bool MipsSEDAGToDAGISel::selectIntAddrSImm10(SDValue Addr, SDValue &Base,
460 SDValue &Offset) const {
471 bool MipsSEDAGToDAGISel::selectIntAddrSImm10Lsl1(SDValue Addr, SDValue &Base,
471 bool MipsSEDAGToDAGISel::selectIntAddrSImm10Lsl1(SDValue Addr, SDValue &Base,
472 SDValue &Offset) const {
482 bool MipsSEDAGToDAGISel::selectIntAddrSImm10Lsl2(SDValue Addr, SDValue &Base,
482 bool MipsSEDAGToDAGISel::selectIntAddrSImm10Lsl2(SDValue Addr, SDValue &Base,
483 SDValue &Offset) const {
493 bool MipsSEDAGToDAGISel::selectIntAddrSImm10Lsl3(SDValue Addr, SDValue &Base,
493 bool MipsSEDAGToDAGISel::selectIntAddrSImm10Lsl3(SDValue Addr, SDValue &Base,
494 SDValue &Offset) const {
549 selectVSplatCommon(SDValue N, SDValue &Imm, bool Signed,
549 selectVSplatCommon(SDValue N, SDValue &Imm, bool Signed,
572 selectVSplatUimm1(SDValue N, SDValue &Imm) const {
572 selectVSplatUimm1(SDValue N, SDValue &Imm) const {
577 selectVSplatUimm2(SDValue N, SDValue &Imm) const {
577 selectVSplatUimm2(SDValue N, SDValue &Imm) const {
582 selectVSplatUimm3(SDValue N, SDValue &Imm) const {
582 selectVSplatUimm3(SDValue N, SDValue &Imm) const {
588 selectVSplatUimm4(SDValue N, SDValue &Imm) const {
588 selectVSplatUimm4(SDValue N, SDValue &Imm) const {
594 selectVSplatUimm5(SDValue N, SDValue &Imm) const {
594 selectVSplatUimm5(SDValue N, SDValue &Imm) const {
600 selectVSplatUimm6(SDValue N, SDValue &Imm) const {
600 selectVSplatUimm6(SDValue N, SDValue &Imm) const {
606 selectVSplatUimm8(SDValue N, SDValue &Imm) const {
606 selectVSplatUimm8(SDValue N, SDValue &Imm) const {
612 selectVSplatSimm5(SDValue N, SDValue &Imm) const {
612 selectVSplatSimm5(SDValue N, SDValue &Imm) const {
626 bool MipsSEDAGToDAGISel::selectVSplatUimmPow2(SDValue N, SDValue &Imm) const {
626 bool MipsSEDAGToDAGISel::selectVSplatUimmPow2(SDValue N, SDValue &Imm) const {
657 bool MipsSEDAGToDAGISel::selectVSplatMaskL(SDValue N, SDValue &Imm) const {
657 bool MipsSEDAGToDAGISel::selectVSplatMaskL(SDValue N, SDValue &Imm) const {
691 bool MipsSEDAGToDAGISel::selectVSplatMaskR(SDValue N, SDValue &Imm) const {
691 bool MipsSEDAGToDAGISel::selectVSplatMaskR(SDValue N, SDValue &Imm) const {
712 bool MipsSEDAGToDAGISel::selectVSplatUimmInvPow2(SDValue N,
713 SDValue &Imm) const {
747 SDValue cond = Node->getOperand(0);
748 SDValue Hi1 = Node->getOperand(1);
749 SDValue Lo1 = Node->getOperand(2);
750 SDValue Hi2 = Node->getOperand(3);
751 SDValue Lo2 = Node->getOperand(4);
753 SDValue ops[] = {cond, Hi1, Lo1, Hi2, Lo2};
771 SDValue Zero = CurDAG->getCopyFromReg(CurDAG->getEntryNode(), DL,
776 SDValue Zero = CurDAG->getCopyFromReg(CurDAG->getEntryNode(), DL,
781 SDValue Zero = CurDAG->getCopyFromReg(CurDAG->getEntryNode(), DL,
807 SDValue ImmOpnd = CurDAG->getTargetConstant(SignExtend64<16>(Inst->ImmOpnd),
839 SDValue ChainIn = Node->getOperand(0);
840 SDValue RegIdx = Node->getOperand(2);
841 SDValue Reg = CurDAG->getCopyFromReg(ChainIn, DL,
872 SDValue ChainIn = Node->getOperand(0);
873 SDValue RegIdx = Node->getOperand(2);
874 SDValue Value = Node->getOperand(3);
875 SDValue ChainOut = CurDAG->getCopyToReg(ChainIn, DL,
931 SDValue Ops[4] = {
958 SDValue Chain = CurDAG->getCopyToReg(CurDAG->getEntryNode(), DL, DestReg,
960 SDValue ResNode = CurDAG->getCopyFromReg(Chain, DL, DestReg, PtrVT);
1025 SDValue Imm = CurDAG->getTargetConstant(SplatValue, DL,
1040 SDValue ZeroVal = CurDAG->getRegister(
1054 SDValue LoVal = CurDAG->getTargetConstant(Lo, DL, SplatMVT);
1064 SDValue ZeroVal = CurDAG->getRegister(Mips::ZERO, MVT::i32);
1066 SDValue LoVal = CurDAG->getTargetConstant(Lo, DL, MVT::i32);
1067 SDValue HiVal = CurDAG->getTargetConstant(Hi, DL, MVT::i32);
1086 SDValue ZeroVal = CurDAG->getRegister(Mips::ZERO, MVT::i32);
1088 SDValue LoVal = CurDAG->getTargetConstant(Lo, DL, MVT::i32);
1089 SDValue HiVal = CurDAG->getTargetConstant(Hi, DL, MVT::i32);
1138 SDValue LoVal = CurDAG->getTargetConstant(Lo, DL, MVT::i32);
1139 SDValue HiVal = CurDAG->getTargetConstant(Hi, DL, MVT::i32);
1140 SDValue HigherVal = CurDAG->getTargetConstant(Higher, DL, MVT::i32);
1141 SDValue HighestVal = CurDAG->getTargetConstant(Highest, DL, MVT::i32);
1142 SDValue ZeroVal = CurDAG->getRegister(Mips::ZERO, MVT::i32);
1199 SDValue Zero64Val = CurDAG->getRegister(Mips::ZERO_64, MVT::i64);
1228 SDValue Ops[4] = {HiResNonZero ? SDValue(HiRes, 0) : Zero64Val,
1273 SelectInlineAsmMemoryOperand(const SDValue &Op, unsigned ConstraintID,
1274 std::vector<SDValue> &OutOps) {
1275 SDValue Base, Offset;
lib/Target/Mips/MipsSEISelDAGToDAG.h 35 unsigned getMSACtrlReg(const SDValue RegIdx) const;
45 bool selectAddrFrameIndex(SDValue Addr, SDValue &Base, SDValue &Offset) const;
45 bool selectAddrFrameIndex(SDValue Addr, SDValue &Base, SDValue &Offset) const;
45 bool selectAddrFrameIndex(SDValue Addr, SDValue &Base, SDValue &Offset) const;
46 bool selectAddrFrameIndexOffset(SDValue Addr, SDValue &Base, SDValue &Offset,
46 bool selectAddrFrameIndexOffset(SDValue Addr, SDValue &Base, SDValue &Offset,
46 bool selectAddrFrameIndexOffset(SDValue Addr, SDValue &Base, SDValue &Offset,
50 bool selectAddrRegImm(SDValue Addr, SDValue &Base,
50 bool selectAddrRegImm(SDValue Addr, SDValue &Base,
51 SDValue &Offset) const override;
53 bool selectAddrDefault(SDValue Addr, SDValue &Base,
53 bool selectAddrDefault(SDValue Addr, SDValue &Base,
54 SDValue &Offset) const override;
56 bool selectIntAddr(SDValue Addr, SDValue &Base,
56 bool selectIntAddr(SDValue Addr, SDValue &Base,
57 SDValue &Offset) const override;
59 bool selectAddrRegImm9(SDValue Addr, SDValue &Base,
59 bool selectAddrRegImm9(SDValue Addr, SDValue &Base,
60 SDValue &Offset) const;
62 bool selectAddrRegImm11(SDValue Addr, SDValue &Base,
62 bool selectAddrRegImm11(SDValue Addr, SDValue &Base,
63 SDValue &Offset) const;
65 bool selectAddrRegImm12(SDValue Addr, SDValue &Base,
65 bool selectAddrRegImm12(SDValue Addr, SDValue &Base,
66 SDValue &Offset) const;
68 bool selectAddrRegImm16(SDValue Addr, SDValue &Base,
68 bool selectAddrRegImm16(SDValue Addr, SDValue &Base,
69 SDValue &Offset) const;
71 bool selectIntAddr11MM(SDValue Addr, SDValue &Base,
71 bool selectIntAddr11MM(SDValue Addr, SDValue &Base,
72 SDValue &Offset) const override;
74 bool selectIntAddr12MM(SDValue Addr, SDValue &Base,
74 bool selectIntAddr12MM(SDValue Addr, SDValue &Base,
75 SDValue &Offset) const override;
77 bool selectIntAddr16MM(SDValue Addr, SDValue &Base,
77 bool selectIntAddr16MM(SDValue Addr, SDValue &Base,
78 SDValue &Offset) const override;
80 bool selectIntAddrLSL2MM(SDValue Addr, SDValue &Base,
80 bool selectIntAddrLSL2MM(SDValue Addr, SDValue &Base,
81 SDValue &Offset) const override;
83 bool selectIntAddrSImm10(SDValue Addr, SDValue &Base,
83 bool selectIntAddrSImm10(SDValue Addr, SDValue &Base,
84 SDValue &Offset) const override;
86 bool selectIntAddrSImm10Lsl1(SDValue Addr, SDValue &Base,
86 bool selectIntAddrSImm10Lsl1(SDValue Addr, SDValue &Base,
87 SDValue &Offset) const override;
89 bool selectIntAddrSImm10Lsl2(SDValue Addr, SDValue &Base,
89 bool selectIntAddrSImm10Lsl2(SDValue Addr, SDValue &Base,
90 SDValue &Offset) const override;
92 bool selectIntAddrSImm10Lsl3(SDValue Addr, SDValue &Base,
92 bool selectIntAddrSImm10Lsl3(SDValue Addr, SDValue &Base,
93 SDValue &Offset) const override;
99 bool selectVSplatCommon(SDValue N, SDValue &Imm, bool Signed,
99 bool selectVSplatCommon(SDValue N, SDValue &Imm, bool Signed,
102 bool selectVSplatUimm1(SDValue N, SDValue &Imm) const override;
102 bool selectVSplatUimm1(SDValue N, SDValue &Imm) const override;
104 bool selectVSplatUimm2(SDValue N, SDValue &Imm) const override;
104 bool selectVSplatUimm2(SDValue N, SDValue &Imm) const override;
106 bool selectVSplatUimm3(SDValue N, SDValue &Imm) const override;
106 bool selectVSplatUimm3(SDValue N, SDValue &Imm) const override;
108 bool selectVSplatUimm4(SDValue N, SDValue &Imm) const override;
108 bool selectVSplatUimm4(SDValue N, SDValue &Imm) const override;
110 bool selectVSplatUimm5(SDValue N, SDValue &Imm) const override;
110 bool selectVSplatUimm5(SDValue N, SDValue &Imm) const override;
112 bool selectVSplatUimm6(SDValue N, SDValue &Imm) const override;
112 bool selectVSplatUimm6(SDValue N, SDValue &Imm) const override;
114 bool selectVSplatUimm8(SDValue N, SDValue &Imm) const override;
114 bool selectVSplatUimm8(SDValue N, SDValue &Imm) const override;
116 bool selectVSplatSimm5(SDValue N, SDValue &Imm) const override;
116 bool selectVSplatSimm5(SDValue N, SDValue &Imm) const override;
118 bool selectVSplatUimmPow2(SDValue N, SDValue &Imm) const override;
118 bool selectVSplatUimmPow2(SDValue N, SDValue &Imm) const override;
121 bool selectVSplatUimmInvPow2(SDValue N, SDValue &Imm) const override;
121 bool selectVSplatUimmInvPow2(SDValue N, SDValue &Imm) const override;
124 bool selectVSplatMaskL(SDValue N, SDValue &Imm) const override;
124 bool selectVSplatMaskL(SDValue N, SDValue &Imm) const override;
127 bool selectVSplatMaskR(SDValue N, SDValue &Imm) const override;
127 bool selectVSplatMaskR(SDValue N, SDValue &Imm) const override;
137 bool SelectInlineAsmMemoryOperand(const SDValue &Op,
139 std::vector<SDValue> &OutOps) override;
lib/Target/Mips/MipsSEISelLowering.cpp 408 SDValue MipsSETargetLowering::lowerSELECT(SDValue Op, SelectionDAG &DAG) const {
408 SDValue MipsSETargetLowering::lowerSELECT(SDValue Op, SelectionDAG &DAG) const {
418 SDValue Tmp = DAG.getNode(MipsISD::MTC1_D64, DL, MVT::f64, Op->getOperand(0));
448 SDValue MipsSETargetLowering::LowerOperation(SDValue Op,
448 SDValue MipsSETargetLowering::LowerOperation(SDValue Op,
481 static SDValue performANDCombine(SDNode *N, SelectionDAG &DAG,
487 SDValue Op0 = N->getOperand(0);
488 SDValue Op1 = N->getOperand(1);
507 SDValue Op0Op2 = Op0->getOperand(2);
514 SDValue Ops[] = { Op0->getOperand(0), Op0->getOperand(1), Op0Op2 };
533 static bool isVSplat(SDValue N, APInt &Imm, bool IsLittleEndian) {
553 static bool isVectorAllOnes(SDValue N) {
577 static bool isBitwiseInverse(SDValue N, SDValue OfNode) {
577 static bool isBitwiseInverse(SDValue N, SDValue OfNode) {
596 static SDValue performORCombine(SDNode *N, SelectionDAG &DAG,
607 SDValue Op0 = N->getOperand(0);
608 SDValue Op1 = N->getOperand(1);
611 SDValue Op0Op0 = Op0->getOperand(0);
612 SDValue Op0Op1 = Op0->getOperand(1);
613 SDValue Op1Op0 = Op1->getOperand(0);
614 SDValue Op1Op1 = Op1->getOperand(1);
617 SDValue IfSet, IfClr, Cond;
792 static SDValue genConstMult(SDValue X, APInt C, const SDLoc &DL, EVT VT,
792 static SDValue genConstMult(SDValue X, APInt C, const SDLoc &DL, EVT VT,
816 SDValue Op0 = genConstMult(X, Floor, DL, VT, ShiftTy, DAG);
817 SDValue Op1 = genConstMult(X, C - Floor, DL, VT, ShiftTy, DAG);
823 SDValue Op0 = genConstMult(X, Ceil, DL, VT, ShiftTy, DAG);
824 SDValue Op1 = genConstMult(X, Ceil - C, DL, VT, ShiftTy, DAG);
828 static SDValue performMULCombine(SDNode *N, SelectionDAG &DAG,
844 static SDValue performDSPShiftCombine(unsigned Opc, SDNode *N, EVT Ty,
869 static SDValue performSHLCombine(SDNode *N, SelectionDAG &DAG,
892 static SDValue performSRACombine(SDNode *N, SelectionDAG &DAG,
898 SDValue Op0 = N->getOperand(0);
899 SDValue Op1 = N->getOperand(1);
906 SDValue Op0Op0 = Op0->getOperand(0);
922 SDValue Ops[] = { Op0Op0->getOperand(0), Op0Op0->getOperand(1),
938 static SDValue performSRLCombine(SDNode *N, SelectionDAG &DAG,
967 static SDValue performSETCCCombine(SDNode *N, SelectionDAG &DAG) {
980 static SDValue performVSELECTCombine(SDNode *N, SelectionDAG &DAG) {
984 SDValue SetCC = N->getOperand(0);
997 static SDValue performXORCombine(SDNode *N, SelectionDAG &DAG,
1005 SDValue Op0 = N->getOperand(0);
1006 SDValue Op1 = N->getOperand(1);
1007 SDValue NotOp;
1024 SDValue
1027 SDValue Val;
1162 getOpndList(SmallVectorImpl<SDValue> &Ops,
1163 std::deque<std::pair<unsigned, SDValue>> &RegsToPass,
1165 bool IsCallReloc, CallLoweringInfo &CLI, SDValue Callee,
1166 SDValue Chain) const {
1173 SDValue MipsSETargetLowering::lowerLOAD(SDValue Op, SelectionDAG &DAG) const {
1173 SDValue MipsSETargetLowering::lowerLOAD(SDValue Op, SelectionDAG &DAG) const {
1181 SDValue Ptr = Nd.getBasePtr(), Chain = Nd.getChain();
1185 SDValue Lo = DAG.getLoad(MVT::i32, DL, Chain, Ptr, MachinePointerInfo(),
1190 SDValue Hi = DAG.getLoad(
1197 SDValue BP = DAG.getNode(MipsISD::BuildPairF64, DL, MVT::f64, Lo, Hi);
1198 SDValue Ops[2] = {BP, Hi.getValue(1)};
1202 SDValue MipsSETargetLowering::lowerSTORE(SDValue Op, SelectionDAG &DAG) const {
1202 SDValue MipsSETargetLowering::lowerSTORE(SDValue Op, SelectionDAG &DAG) const {
1210 SDValue Val = Nd.getValue(), Ptr = Nd.getBasePtr(), Chain = Nd.getChain();
1212 SDValue Lo = DAG.getNode(MipsISD::ExtractElementF64, DL, MVT::i32,
1214 SDValue Hi = DAG.getNode(MipsISD::ExtractElementF64, DL, MVT::i32,
1232 SDValue MipsSETargetLowering::lowerBITCAST(SDValue Op,
1232 SDValue MipsSETargetLowering::lowerBITCAST(SDValue Op,
1240 SDValue Lo = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i32,
1242 SDValue Hi = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i32,
1249 SDValue Lo =
1252 SDValue Hi =
1262 SDValue MipsSETargetLowering::lowerMulDiv(SDValue Op, unsigned NewOpc,
1262 SDValue MipsSETargetLowering::lowerMulDiv(SDValue Op, unsigned NewOpc,
1270 SDValue Mult = DAG.getNode(NewOpc, DL, MVT::Untyped,
1272 SDValue Lo, Hi;
1282 SDValue Vals[] = { Lo, Hi };
1286 static SDValue initAccumulator(SDValue In, const SDLoc &DL, SelectionDAG &DAG) {
1286 static SDValue initAccumulator(SDValue In, const SDLoc &DL, SelectionDAG &DAG) {
1287 SDValue InLo = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i32, In,
1289 SDValue InHi = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i32, In,
1294 static SDValue extractLOHI(SDValue Op, const SDLoc &DL, SelectionDAG &DAG) {
1294 static SDValue extractLOHI(SDValue Op, const SDLoc &DL, SelectionDAG &DAG) {
1295 SDValue Lo = DAG.getNode(MipsISD::MFLO, DL, MVT::i32, Op);
1296 SDValue Hi = DAG.getNode(MipsISD::MFHI, DL, MVT::i32, Op);
1312 static SDValue lowerDSPIntr(SDValue Op, SelectionDAG &DAG, unsigned Opc) {
1312 static SDValue lowerDSPIntr(SDValue Op, SelectionDAG &DAG, unsigned Opc) {
1315 SmallVector<SDValue, 3> Ops;
1326 SDValue Opnd = Op->getOperand(++OpNo), In64;
1349 SDValue Val = DAG.getNode(Opc, DL, ResTys, Ops);
1350 SDValue Out = (ResTys[0] == MVT::Untyped) ? extractLOHI(Val, DL, DAG) : Val;
1356 SDValue Vals[] = { Out, SDValue(Val.getNode(), 1) };
1361 static SDValue lowerMSACopyIntr(SDValue Op, SelectionDAG &DAG, unsigned Opc) {
1361 static SDValue lowerMSACopyIntr(SDValue Op, SelectionDAG &DAG, unsigned Opc) {
1363 SDValue Vec = Op->getOperand(1);
1364 SDValue Idx = Op->getOperand(2);
1368 SDValue Result = DAG.getNode(Opc, DL, ResTy, Vec, Idx,
1374 static SDValue lowerMSASplatZExt(SDValue Op, unsigned OpNr, SelectionDAG &DAG) {
1374 static SDValue lowerMSASplatZExt(SDValue Op, unsigned OpNr, SelectionDAG &DAG) {
1383 SDValue LaneA = Op->getOperand(OpNr);
1384 SDValue LaneB;
1403 SDValue Ops[16] = { LaneA, LaneB, LaneA, LaneB, LaneA, LaneB, LaneA, LaneB,
1406 SDValue Result = DAG.getBuildVector(
1410 SDValue One = DAG.getConstant(1, DL, ViaVecTy);
1418 static SDValue lowerMSASplatImm(SDValue Op, unsigned ImmOp, SelectionDAG &DAG,
1418 static SDValue lowerMSASplatImm(SDValue Op, unsigned ImmOp, SelectionDAG &DAG,
1427 static SDValue getBuildVectorSplat(EVT VecTy, SDValue SplatValue,
1427 static SDValue getBuildVectorSplat(EVT VecTy, SDValue SplatValue,
1430 SDValue SplatValueA = SplatValue;
1431 SDValue SplatValueB = SplatValue;
1449 SDValue Ops[16] = { SplatValueA, SplatValueB, SplatValueA, SplatValueB,
1454 SDValue Result = DAG.getBuildVector(
1463 static SDValue lowerMSABinaryBitImmIntr(SDValue Op, SelectionDAG &DAG,
1463 static SDValue lowerMSABinaryBitImmIntr(SDValue Op, SelectionDAG &DAG,
1464 unsigned Opc, SDValue Imm,
1467 SDValue Exp2Imm;
1476 SDValue BitImmHiOp = DAG.getConstant(BitImm.lshr(32).trunc(32), DL,
1478 SDValue BitImmLoOp = DAG.getConstant(BitImm.trunc(32), DL, MVT::i32);
1507 static SDValue truncateVecElts(SDValue Op, SelectionDAG &DAG) {
1507 static SDValue truncateVecElts(SDValue Op, SelectionDAG &DAG) {
1510 SDValue Vec = Op->getOperand(2);
1513 SDValue ConstValue = DAG.getConstant(Vec.getScalarValueSizeInBits() - 1,
1515 SDValue SplatVec = getBuildVectorSplat(ResTy, ConstValue, BigEndian, DAG);
1520 static SDValue lowerMSABitClear(SDValue Op, SelectionDAG &DAG) {
1520 static SDValue lowerMSABitClear(SDValue Op, SelectionDAG &DAG) {
1523 SDValue One = DAG.getConstant(1, DL, ResTy);
1524 SDValue Bit = DAG.getNode(ISD::SHL, DL, ResTy, One, truncateVecElts(Op, DAG));
1530 static SDValue lowerMSABitClearImm(SDValue Op, SelectionDAG &DAG) {
1530 static SDValue lowerMSABitClearImm(SDValue Op, SelectionDAG &DAG) {
1535 SDValue BitMask = DAG.getConstant(~BitImm, DL, ResTy);
1540 SDValue MipsSETargetLowering::lowerINTRINSIC_WO_CHAIN(SDValue Op,
1540 SDValue MipsSETargetLowering::lowerINTRINSIC_WO_CHAIN(SDValue Op,
1656 SDValue One = DAG.getConstant(1, DL, VecTy);
1692 SDValue One = DAG.getConstant(1, DL, VecTy);
1882 SmallVector<SDValue, 16> Ops(ResTy.getVectorNumElements(),
2086 SDValue Res = DAG.getNode(ISD::OR, DL, Op->getValueType(0),
2091 SDValue Res = DAG.getNode(ISD::OR, DL, Op->getValueType(0),
2293 static SDValue lowerMSALoadIntr(SDValue Op, SelectionDAG &DAG, unsigned Intr,
2293 static SDValue lowerMSALoadIntr(SDValue Op, SelectionDAG &DAG, unsigned Intr,
2296 SDValue ChainIn = Op->getOperand(0);
2297 SDValue Address = Op->getOperand(2);
2298 SDValue Offset = Op->getOperand(3);
2313 SDValue MipsSETargetLowering::lowerINTRINSIC_W_CHAIN(SDValue Op,
2313 SDValue MipsSETargetLowering::lowerINTRINSIC_W_CHAIN(SDValue Op,
2367 static SDValue lowerMSAStoreIntr(SDValue Op, SelectionDAG &DAG, unsigned Intr,
2367 static SDValue lowerMSAStoreIntr(SDValue Op, SelectionDAG &DAG, unsigned Intr,
2370 SDValue ChainIn = Op->getOperand(0);
2371 SDValue Value = Op->getOperand(2);
2372 SDValue Address = Op->getOperand(3);
2373 SDValue Offset = Op->getOperand(4);
2388 SDValue MipsSETargetLowering::lowerINTRINSIC_VOID(SDValue Op,
2388 SDValue MipsSETargetLowering::lowerINTRINSIC_VOID(SDValue Op,
2409 SDValue MipsSETargetLowering::
2410 lowerEXTRACT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const {
2413 SDValue Op0 = Op->getOperand(0);
2420 SDValue Op1 = Op->getOperand(1);
2429 static bool isConstantOrUndef(const SDValue Op) {
2459 SDValue MipsSETargetLowering::lowerBUILD_VECTOR(SDValue Op,
2459 SDValue MipsSETargetLowering::lowerBUILD_VECTOR(SDValue Op,
2505 SDValue Result = DAG.getConstant(SplatValue, DL, ViaVecTy);
2523 SDValue Vector = DAG.getUNDEF(ResTy);
2553 static SDValue lowerVECTOR_SHUFFLE_SHF(SDValue Op, EVT ResTy,
2553 static SDValue lowerVECTOR_SHUFFLE_SHF(SDValue Op, EVT ResTy,
2634 static bool isVECTOR_SHUFFLE_SPLATI(SDValue Op, EVT ResTy,
2666 static SDValue lowerVECTOR_SHUFFLE_ILVEV(SDValue Op, EVT ResTy,
2666 static SDValue lowerVECTOR_SHUFFLE_ILVEV(SDValue Op, EVT ResTy,
2671 SDValue Wt;
2672 SDValue Ws;
2712 static SDValue lowerVECTOR_SHUFFLE_ILVOD(SDValue Op, EVT ResTy,
2712 static SDValue lowerVECTOR_SHUFFLE_ILVOD(SDValue Op, EVT ResTy,
2717 SDValue Wt;
2718 SDValue Ws;
2759 static SDValue lowerVECTOR_SHUFFLE_ILVR(SDValue Op, EVT ResTy,
2759 static SDValue lowerVECTOR_SHUFFLE_ILVR(SDValue Op, EVT ResTy,
2764 SDValue Wt;
2765 SDValue Ws;
2806 static SDValue lowerVECTOR_SHUFFLE_ILVL(SDValue Op, EVT ResTy,
2806 static SDValue lowerVECTOR_SHUFFLE_ILVL(SDValue Op, EVT ResTy,
2812 SDValue Wt;
2813 SDValue Ws;
2854 static SDValue lowerVECTOR_SHUFFLE_PCKEV(SDValue Op, EVT ResTy,
2854 static SDValue lowerVECTOR_SHUFFLE_PCKEV(SDValue Op, EVT ResTy,
2859 SDValue Wt;
2860 SDValue Ws;
2897 static SDValue lowerVECTOR_SHUFFLE_PCKOD(SDValue Op, EVT ResTy,
2897 static SDValue lowerVECTOR_SHUFFLE_PCKOD(SDValue Op, EVT ResTy,
2902 SDValue Wt;
2903 SDValue Ws;
2933 static SDValue lowerVECTOR_SHUFFLE_VSHF(SDValue Op, EVT ResTy,
2933 static SDValue lowerVECTOR_SHUFFLE_VSHF(SDValue Op, EVT ResTy,
2936 SmallVector<SDValue, 16> Ops;
2937 SDValue Op0;
2938 SDValue Op1;
2960 SDValue MaskVec = DAG.getBuildVector(MaskVecTy, DL, Ops);
2984 SDValue MipsSETargetLowering::lowerVECTOR_SHUFFLE(SDValue Op,
2984 SDValue MipsSETargetLowering::lowerVECTOR_SHUFFLE(SDValue Op,
3002 SDValue Result;
lib/Target/Mips/MipsSEISelLowering.h 48 SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
48 SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
50 SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const override;
68 getOpndList(SmallVectorImpl<SDValue> &Ops,
69 std::deque<std::pair<unsigned, SDValue>> &RegsToPass,
71 bool IsCallReloc, CallLoweringInfo &CLI, SDValue Callee,
72 SDValue Chain) const override;
74 SDValue lowerLOAD(SDValue Op, SelectionDAG &DAG) const;
74 SDValue lowerLOAD(SDValue Op, SelectionDAG &DAG) const;
75 SDValue lowerSTORE(SDValue Op, SelectionDAG &DAG) const;
75 SDValue lowerSTORE(SDValue Op, SelectionDAG &DAG) const;
76 SDValue lowerBITCAST(SDValue Op, SelectionDAG &DAG) const;
76 SDValue lowerBITCAST(SDValue Op, SelectionDAG &DAG) const;
78 SDValue lowerMulDiv(SDValue Op, unsigned NewOpc, bool HasLo, bool HasHi,
78 SDValue lowerMulDiv(SDValue Op, unsigned NewOpc, bool HasLo, bool HasHi,
81 SDValue lowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG) const;
81 SDValue lowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG) const;
82 SDValue lowerINTRINSIC_W_CHAIN(SDValue Op, SelectionDAG &DAG) const;
82 SDValue lowerINTRINSIC_W_CHAIN(SDValue Op, SelectionDAG &DAG) const;
83 SDValue lowerINTRINSIC_VOID(SDValue Op, SelectionDAG &DAG) const;
83 SDValue lowerINTRINSIC_VOID(SDValue Op, SelectionDAG &DAG) const;
84 SDValue lowerEXTRACT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const;
84 SDValue lowerEXTRACT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const;
85 SDValue lowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG) const;
85 SDValue lowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG) const;
88 SDValue lowerVECTOR_SHUFFLE(SDValue Op, SelectionDAG &DAG) const;
88 SDValue lowerVECTOR_SHUFFLE(SDValue Op, SelectionDAG &DAG) const;
89 SDValue lowerSELECT(SDValue Op, SelectionDAG &DAG) const;
89 SDValue lowerSELECT(SDValue Op, SelectionDAG &DAG) const;
lib/Target/NVPTX/NVPTXISelDAGToDAG.cpp 526 SDValue Val = CurDAG->getTargetConstantFP(
605 SDValue Vector = N->getOperand(0);
638 SDValue Source = Vector;
731 SDValue Wrapper = N->getOperand(1);
732 SDValue GlobalVal = Wrapper.getOperand(0);
738 SDValue Src = N->getOperand(0);
909 SDValue Chain = N->getOperand(0);
910 SDValue N1 = N->getOperand(1);
911 SDValue Addr;
912 SDValue Offset, Base;
923 SDValue Ops[] = { getI32Imm(isVolatile, dl), getI32Imm(CodeAddrSpace, dl),
936 SDValue Ops[] = { getI32Imm(isVolatile, dl), getI32Imm(CodeAddrSpace, dl),
955 SDValue Ops[] = { getI32Imm(isVolatile, dl), getI32Imm(CodeAddrSpace, dl),
974 SDValue Ops[] = { getI32Imm(isVolatile, dl), getI32Imm(CodeAddrSpace, dl),
993 SDValue Chain = N->getOperand(0);
994 SDValue Op1 = N->getOperand(1);
995 SDValue Addr, Offset, Base;
1092 SDValue Ops[] = { getI32Imm(IsVolatile, DL), getI32Imm(CodeAddrSpace, DL),
1119 SDValue Ops[] = { getI32Imm(IsVolatile, DL), getI32Imm(CodeAddrSpace, DL),
1168 SDValue Ops[] = { getI32Imm(IsVolatile, DL), getI32Imm(CodeAddrSpace, DL),
1217 SDValue Ops[] = { getI32Imm(IsVolatile, DL), getI32Imm(CodeAddrSpace, DL),
1232 SDValue Chain = N->getOperand(0);
1233 SDValue Op1;
1265 SDValue Base, Offset, Addr;
1363 SDValue Ops[] = { Addr, Chain };
1510 SDValue Ops[] = {Base, Offset, Chain};
1656 SDValue Ops[] = { Op1, Chain };
1688 SDValue Res(LD, i);
1689 SDValue OrigVal(N, i);
1766 SDValue Chain = ST->getChain();
1767 SDValue Value = PlainStore ? PlainStore->getValue() : AtomicStore->getVal();
1768 SDValue BasePtr = ST->getBasePtr();
1769 SDValue Addr;
1770 SDValue Offset, Base;
1782 SDValue Ops[] = {Value,
1800 SDValue Ops[] = {Value,
1826 SDValue Ops[] = {Value,
1850 SDValue Ops[] = {Value,
1871 SDValue Chain = N->getOperand(0);
1872 SDValue Op1 = N->getOperand(1);
1873 SDValue Addr, Offset, Base;
1910 SmallVector<SDValue, 12> StOps;
1911 SDValue N2;
2095 SDValue Chain = Node->getOperand(0);
2096 SDValue Offset = Node->getOperand(2);
2097 SDValue Flag = Node->getOperand(3);
2162 SmallVector<SDValue, 2> Ops;
2173 SDValue Chain = N->getOperand(0);
2174 SDValue Offset = N->getOperand(1);
2195 SmallVector<SDValue, 6> Ops;
2243 SDValue Chain = N->getOperand(0);
2244 SDValue Param = N->getOperand(1);
2246 SDValue Offset = N->getOperand(2);
2249 SDValue Flag = N->getOperand(N->getNumOperands() - 1);
2270 SmallVector<SDValue, 8> Ops;
2317 SDValue CvtNone = CurDAG->getTargetConstant(NVPTX::PTXCvtMode::NONE, DL,
2326 SDValue CvtNone = CurDAG->getTargetConstant(NVPTX::PTXCvtMode::NONE, DL,
2857 SmallVector<SDValue, 8> Ops(N->op_begin() + 1, N->op_end());
3366 SmallVector<SDValue, 8> Ops(N->op_begin() + 1, N->op_end());
3378 SDValue LHS = N->getOperand(0);
3379 SDValue RHS = N->getOperand(1);
3380 SDValue Len;
3381 SDValue Start;
3382 SDValue Val;
3451 SDValue AndLHS = LHS->getOperand(0);
3452 SDValue AndRHS = LHS->getOperand(1);
3504 SDValue ShlRHS = LHS->getOperand(1);
3512 SDValue ShrRHS = RHS;
3572 SDValue Ops[] = {
3582 bool NVPTXDAGToDAGISel::SelectDirectAddr(SDValue N, SDValue &Address) {
3582 bool NVPTXDAGToDAGISel::SelectDirectAddr(SDValue N, SDValue &Address) {
3605 SDNode *OpNode, SDValue Addr, SDValue &Base, SDValue &Offset, MVT mvt) {
3605 SDNode *OpNode, SDValue Addr, SDValue &Base, SDValue &Offset, MVT mvt) {
3605 SDNode *OpNode, SDValue Addr, SDValue &Base, SDValue &Offset, MVT mvt) {
3608 SDValue base = Addr.getOperand(0);
3620 bool NVPTXDAGToDAGISel::SelectADDRsi(SDNode *OpNode, SDValue Addr,
3621 SDValue &Base, SDValue &Offset) {
3621 SDValue &Base, SDValue &Offset) {
3626 bool NVPTXDAGToDAGISel::SelectADDRsi64(SDNode *OpNode, SDValue Addr,
3627 SDValue &Base, SDValue &Offset) {
3627 SDValue &Base, SDValue &Offset) {
3633 SDNode *OpNode, SDValue Addr, SDValue &Base, SDValue &Offset, MVT mvt) {
3633 SDNode *OpNode, SDValue Addr, SDValue &Base, SDValue &Offset, MVT mvt) {
3633 SDNode *OpNode, SDValue Addr, SDValue &Base, SDValue &Offset, MVT mvt) {
3663 bool NVPTXDAGToDAGISel::SelectADDRri(SDNode *OpNode, SDValue Addr,
3664 SDValue &Base, SDValue &Offset) {
3664 SDValue &Base, SDValue &Offset) {
3669 bool NVPTXDAGToDAGISel::SelectADDRri64(SDNode *OpNode, SDValue Addr,
3670 SDValue &Base, SDValue &Offset) {
3670 SDValue &Base, SDValue &Offset) {
3692 const SDValue &Op, unsigned ConstraintID, std::vector<SDValue> &OutOps) {
3692 const SDValue &Op, unsigned ConstraintID, std::vector<SDValue> &OutOps) {
3693 SDValue Op0, Op1;
lib/Target/NVPTX/NVPTXISelDAGToDAG.h 51 bool SelectInlineAsmMemoryOperand(const SDValue &Op,
53 std::vector<SDValue> &OutOps) override;
78 inline SDValue getI32Imm(unsigned Imm, const SDLoc &DL) {
83 bool SelectDirectAddr(SDValue N, SDValue &Address);
83 bool SelectDirectAddr(SDValue N, SDValue &Address);
85 bool SelectADDRri_imp(SDNode *OpNode, SDValue Addr, SDValue &Base,
85 bool SelectADDRri_imp(SDNode *OpNode, SDValue Addr, SDValue &Base,
86 SDValue &Offset, MVT mvt);
87 bool SelectADDRri(SDNode *OpNode, SDValue Addr, SDValue &Base,
87 bool SelectADDRri(SDNode *OpNode, SDValue Addr, SDValue &Base,
88 SDValue &Offset);
89 bool SelectADDRri64(SDNode *OpNode, SDValue Addr, SDValue &Base,
89 bool SelectADDRri64(SDNode *OpNode, SDValue Addr, SDValue &Base,
90 SDValue &Offset);
91 bool SelectADDRsi_imp(SDNode *OpNode, SDValue Addr, SDValue &Base,
91 bool SelectADDRsi_imp(SDNode *OpNode, SDValue Addr, SDValue &Base,
92 SDValue &Offset, MVT mvt);
93 bool SelectADDRsi(SDNode *OpNode, SDValue Addr, SDValue &Base,
93 bool SelectADDRsi(SDNode *OpNode, SDValue Addr, SDValue &Base,
94 SDValue &Offset);
95 bool SelectADDRsi64(SDNode *OpNode, SDValue Addr, SDValue &Base,
95 bool SelectADDRsi64(SDNode *OpNode, SDValue Addr, SDValue &Base,
96 SDValue &Offset);
lib/Target/NVPTX/NVPTXISelLowering.cpp 1200 SDValue NVPTXTargetLowering::getSqrtEstimate(SDValue Operand, SelectionDAG &DAG,
1200 SDValue NVPTXTargetLowering::getSqrtEstimate(SDValue Operand, SelectionDAG &DAG,
1249 SDValue
1250 NVPTXTargetLowering::LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const {
1370 unsigned NVPTXTargetLowering::getArgumentAlignment(SDValue Callee,
1422 SDValue NVPTXTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
1423 SmallVectorImpl<SDValue> &InVals) const {
1427 SmallVectorImpl<SDValue> &OutVals = CLI.OutVals;
1429 SDValue Chain = CLI.Chain;
1430 SDValue Callee = CLI.Callee;
1442 SDValue tempChain = Chain;
1444 SDValue InFlag = Chain.getValue(1);
1474 SDValue DeclareParamOps[] = {
1489 SDValue DeclareScalarParamOps[] = {
1507 SmallVector<SDValue, 6> StoreOperands;
1518 SDValue StVal = OutVals[OIdx];
1597 SDValue DeclareParamOps[] = {Chain, DAG.getConstant(ArgAlign, dl, MVT::i32),
1608 SDValue srcAddr = DAG.getNode(ISD::ADD, dl, PtrVT, OutVals[OIdx],
1610 SDValue theVal = DAG.getLoad(elemtype, dl, tempChain, srcAddr,
1616 SDValue CopyParamOps[] = { Chain,
1652 SDValue DeclareRetOps[] = { Chain, DAG.getConstant(1, dl, MVT::i32),
1661 SDValue DeclareRetOps[] = { Chain,
1700 SDValue ProtoOps[] = {
1708 SDValue PrintCallOps[] = {
1721 SDValue CallVoidOps[] = { Chain, Callee, InFlag };
1727 SDValue CallArgBeginOps[] = { Chain, InFlag };
1739 SDValue CallArgOps[] = { Chain, DAG.getConstant(1, dl, MVT::i32),
1745 SDValue CallArgEndOps[] = { Chain,
1753 SDValue PrototypeOps[] = { Chain,
1760 SmallVector<SDValue, 16> ProxyRegOps;
1824 SDValue LoadOperands[] = {
1827 SDValue RetVal = DAG.getMemIntrinsicNode(
1863 SDValue Ret = DAG.getNode(
1888 SDValue
1889 NVPTXTargetLowering::LowerCONCAT_VECTORS(SDValue Op, SelectionDAG &DAG) const {
1892 SmallVector<SDValue, 8> Ops;
1895 SDValue SubOp = Node->getOperand(i);
1917 SDValue NVPTXTargetLowering::LowerBUILD_VECTOR(SDValue Op,
1917 SDValue NVPTXTargetLowering::LowerBUILD_VECTOR(SDValue Op,
1929 SDValue Const =
1934 SDValue NVPTXTargetLowering::LowerEXTRACT_VECTOR_ELT(SDValue Op,
1934 SDValue NVPTXTargetLowering::LowerEXTRACT_VECTOR_ELT(SDValue Op,
1936 SDValue Index = Op->getOperand(1);
1942 SDValue Vector = Op->getOperand(0);
1948 SDValue E0 = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, EltVT, Vector,
1950 SDValue E1 = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, EltVT, Vector,
1961 SDValue NVPTXTargetLowering::LowerShiftRightParts(SDValue Op,
1961 SDValue NVPTXTargetLowering::LowerShiftRightParts(SDValue Op,
1969 SDValue ShOpLo = Op.getOperand(0);
1970 SDValue ShOpHi = Op.getOperand(1);
1971 SDValue ShAmt = Op.getOperand(2);
1980 SDValue Hi = DAG.getNode(Opc, dl, VT, ShOpHi, ShAmt);
1981 SDValue Lo = DAG.getNode(NVPTXISD::FUN_SHFR_CLAMP, dl, VT, ShOpLo, ShOpHi,
1984 SDValue Ops[2] = { Lo, Hi };
1996 SDValue RevShAmt = DAG.getNode(ISD::SUB, dl, MVT::i32,
1999 SDValue Tmp1 = DAG.getNode(ISD::SRL, dl, VT, ShOpLo, ShAmt);
2000 SDValue ExtraShAmt = DAG.getNode(ISD::SUB, dl, MVT::i32, ShAmt,
2002 SDValue Tmp2 = DAG.getNode(ISD::SHL, dl, VT, ShOpHi, RevShAmt);
2003 SDValue FalseVal = DAG.getNode(ISD::OR, dl, VT, Tmp1, Tmp2);
2004 SDValue TrueVal = DAG.getNode(Opc, dl, VT, ShOpHi, ExtraShAmt);
2006 SDValue Cmp = DAG.getSetCC(dl, MVT::i1, ShAmt,
2009 SDValue Hi = DAG.getNode(Opc, dl, VT, ShOpHi, ShAmt);
2010 SDValue Lo = DAG.getNode(ISD::SELECT, dl, VT, Cmp, TrueVal, FalseVal);
2012 SDValue Ops[2] = { Lo, Hi };
2022 SDValue NVPTXTargetLowering::LowerShiftLeftParts(SDValue Op,
2022 SDValue NVPTXTargetLowering::LowerShiftLeftParts(SDValue Op,
2030 SDValue ShOpLo = Op.getOperand(0);
2031 SDValue ShOpHi = Op.getOperand(1);
2032 SDValue ShAmt = Op.getOperand(2);
2040 SDValue Hi = DAG.getNode(NVPTXISD::FUN_SHFL_CLAMP, dl, VT, ShOpLo, ShOpHi,
2042 SDValue Lo = DAG.getNode(ISD::SHL, dl, VT, ShOpLo, ShAmt);
2044 SDValue Ops[2] = { Lo, Hi };
2056 SDValue RevShAmt = DAG.getNode(ISD::SUB, dl, MVT::i32,
2059 SDValue Tmp1 = DAG.getNode(ISD::SHL, dl, VT, ShOpHi, ShAmt);
2060 SDValue ExtraShAmt = DAG.getNode(ISD::SUB, dl, MVT::i32, ShAmt,
2062 SDValue Tmp2 = DAG.getNode(ISD::SRL, dl, VT, ShOpLo, RevShAmt);
2063 SDValue FalseVal = DAG.getNode(ISD::OR, dl, VT, Tmp1, Tmp2);
2064 SDValue TrueVal = DAG.getNode(ISD::SHL, dl, VT, ShOpLo, ExtraShAmt);
2066 SDValue Cmp = DAG.getSetCC(dl, MVT::i1, ShAmt,
2069 SDValue Lo = DAG.getNode(ISD::SHL, dl, VT, ShOpLo, ShAmt);
2070 SDValue Hi = DAG.getNode(ISD::SELECT, dl, VT, Cmp, TrueVal, FalseVal);
2072 SDValue Ops[2] = { Lo, Hi };
2077 SDValue NVPTXTargetLowering::LowerFROUND(SDValue Op, SelectionDAG &DAG) const {
2077 SDValue NVPTXTargetLowering::LowerFROUND(SDValue Op, SelectionDAG &DAG) const {
2096 SDValue NVPTXTargetLowering::LowerFROUND32(SDValue Op,
2096 SDValue NVPTXTargetLowering::LowerFROUND32(SDValue Op,
2099 SDValue A = Op.getOperand(0);
2102 SDValue AbsA = DAG.getNode(ISD::FABS, SL, VT, A);
2105 SDValue Bitcast = DAG.getNode(ISD::BITCAST, SL, MVT::i32, A);
2107 SDValue Sign = DAG.getNode(ISD::AND, SL, MVT::i32, Bitcast,
2110 SDValue PointFiveWithSignRaw =
2113 SDValue PointFiveWithSign =
2115 SDValue AdjustedA = DAG.getNode(ISD::FADD, SL, VT, A, PointFiveWithSign);
2116 SDValue RoundedA = DAG.getNode(ISD::FTRUNC, SL, VT, AdjustedA);
2120 SDValue IsLarge =
2126 SDValue IsSmall =DAG.getSetCC(SL, SetCCVT, AbsA,
2128 SDValue RoundedAForSmallA = DAG.getNode(ISD::FTRUNC, SL, VT, A);
2137 SDValue NVPTXTargetLowering::LowerFROUND64(SDValue Op,
2137 SDValue NVPTXTargetLowering::LowerFROUND64(SDValue Op,
2140 SDValue A = Op.getOperand(0);
2143 SDValue AbsA = DAG.getNode(ISD::FABS, SL, VT, A);
2146 SDValue AdjustedA = DAG.getNode(ISD::FADD, SL, VT, AbsA,
2148 SDValue RoundedA = DAG.getNode(ISD::FTRUNC, SL, VT, AdjustedA);
2152 SDValue IsSmall =DAG.getSetCC(SL, SetCCVT, AbsA,
2163 SDValue IsLarge =
2171 SDValue
2172 NVPTXTargetLowering::LowerOperation(SDValue Op, SelectionDAG &DAG) const {
2208 SDValue NVPTXTargetLowering::LowerSelect(SDValue Op, SelectionDAG &DAG) const {
2208 SDValue NVPTXTargetLowering::LowerSelect(SDValue Op, SelectionDAG &DAG) const {
2209 SDValue Op0 = Op->getOperand(0);
2210 SDValue Op1 = Op->getOperand(1);
2211 SDValue Op2 = Op->getOperand(2);
2218 SDValue Select = DAG.getNode(ISD::SELECT, DL, MVT::i32, Op0, Op1, Op2);
2219 SDValue Trunc = DAG.getNode(ISD::TRUNCATE, DL, MVT::i1, Select);
2224 SDValue NVPTXTargetLowering::LowerLOAD(SDValue Op, SelectionDAG &DAG) const {
2224 SDValue NVPTXTargetLowering::LowerLOAD(SDValue Op, SelectionDAG &DAG) const {
2235 SDValue Ops[2];
2248 SDValue NVPTXTargetLowering::LowerLOADi1(SDValue Op, SelectionDAG &DAG) const {
2248 SDValue NVPTXTargetLowering::LowerLOADi1(SDValue Op, SelectionDAG &DAG) const {
2255 SDValue newLD = DAG.getLoad(MVT::i16, dl, LD->getChain(), LD->getBasePtr(),
2258 SDValue result = DAG.getNode(ISD::TRUNCATE, dl, MVT::i1, newLD);
2262 SDValue Ops[] = { result, LD->getChain() };
2266 SDValue NVPTXTargetLowering::LowerSTORE(SDValue Op, SelectionDAG &DAG) const {
2266 SDValue NVPTXTargetLowering::LowerSTORE(SDValue Op, SelectionDAG &DAG) const {
2286 SDValue
2287 NVPTXTargetLowering::LowerSTOREVector(SDValue Op, SelectionDAG &DAG) const {
2289 SDValue Val = N->getOperand(1);
2365 SmallVector<SDValue, 8> Ops;
2374 SDValue E0 = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, MVT::f16, Val,
2376 SDValue E1 = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, MVT::f16, Val,
2378 SDValue V2 = DAG.getNode(ISD::BUILD_VECTOR, DL, MVT::v2f16, E0, E1);
2384 SDValue ExtVal = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, EltVT, Val,
2395 SDValue NewSt =
2410 SDValue NVPTXTargetLowering::LowerSTOREi1(SDValue Op, SelectionDAG &DAG) const {
2410 SDValue NVPTXTargetLowering::LowerSTOREi1(SDValue Op, SelectionDAG &DAG) const {
2414 SDValue Tmp1 = ST->getChain();
2415 SDValue Tmp2 = ST->getBasePtr();
2416 SDValue Tmp3 = ST->getValue();
2419 SDValue Result =
2425 SDValue
2462 SDValue NVPTXTargetLowering::LowerFormalArguments(
2463 SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
2465 SelectionDAG &DAG, SmallVectorImpl<SDValue> &InVals) const {
2474 SDValue Root = DAG.getRoot();
2475 std::vector<SDValue> OutChains;
2563 SDValue Arg = getParamSymbol(DAG, idx, PtrVT);
2586 SDValue VecAddr =
2591 SDValue P =
2599 SDValue Elt = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, LoadVT, P,
2638 SDValue Arg = getParamSymbol(DAG, idx, PtrVT);
2639 SDValue p = DAG.getNode(NVPTXISD::MoveParam, dl, ObjectVT, Arg);
2659 SDValue
2660 NVPTXTargetLowering::LowerReturn(SDValue Chain, CallingConv::ID CallConv,
2663 const SmallVectorImpl<SDValue> &OutVals,
2688 SmallVector<SDValue, 6> StoreOperands;
2697 SDValue RetVal = OutVals[i];
2745 SDValue Op, std::string &Constraint, std::vector<SDValue> &Ops,
2745 SDValue Op, std::string &Constraint, std::vector<SDValue> &Ops,
4342 static SDValue PerformADDCombineWithOperands(SDNode *N, SDValue N0, SDValue N1,
4342 static SDValue PerformADDCombineWithOperands(SDNode *N, SDValue N0, SDValue N1,
4342 static SDValue PerformADDCombineWithOperands(SDNode *N, SDValue N0, SDValue N1,
4448 static SDValue PerformADDCombine(SDNode *N,
4452 SDValue N0 = N->getOperand(0);
4453 SDValue N1 = N->getOperand(1);
4456 if (SDValue Result =
4464 static SDValue PerformANDCombine(SDNode *N,
4471 SDValue Val = N->getOperand(0);
4472 SDValue Mask = N->getOperand(1);
4478 SDValue AExt;
4539 static SDValue PerformREMCombine(SDNode *N,
4554 const SDValue &Num = N->getOperand(0);
4555 const SDValue &Den = N->getOperand(1);
4579 static bool IsMulWideOperandDemotable(SDValue Op,
4606 static bool AreMulWideOperandsDemotable(SDValue LHS, SDValue RHS,
4606 static bool AreMulWideOperandsDemotable(SDValue LHS, SDValue RHS,
4642 static SDValue TryMULWIDECombine(SDNode *N,
4651 SDValue LHS = N->getOperand(0);
4652 SDValue RHS = N->getOperand(1);
4693 SDValue TruncLHS =
4695 SDValue TruncRHS =
4709 static SDValue PerformMULCombine(SDNode *N,
4714 if (SDValue Ret = TryMULWIDECombine(N, DCI))
4722 static SDValue PerformSHLCombine(SDNode *N,
4727 if (SDValue Ret = TryMULWIDECombine(N, DCI))
4734 static SDValue PerformSETCCCombine(SDNode *N,
4737 SDValue A = N->getOperand(0);
4738 SDValue B = N->getOperand(1);
4748 SDValue CCNode = DCI.DAG.getNode(NVPTXISD::SETP_F16X2, DL,
4755 SDValue NVPTXTargetLowering::PerformDAGCombine(SDNode *N,
4780 SmallVectorImpl<SDValue> &Results) {
4869 SmallVector<SDValue, 8> OtherOps(N->op_begin(), N->op_end());
4875 SDValue NewLD = DAG.getMemIntrinsicNode(Opcode, DL, LdResVTs, OtherOps,
4879 SmallVector<SDValue, 8> ScalarRes;
4884 SDValue SubVector = NewLD.getValue(i);
4885 SDValue E0 = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, EltVT, SubVector,
4887 SDValue E1 = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, EltVT, SubVector,
4894 SDValue Res = NewLD.getValue(i);
4901 SDValue LoadChain = NewLD.getValue(NumElts);
4903 SDValue BuildVec = DAG.getBuildVector(ResVT, DL, ScalarRes);
4910 SmallVectorImpl<SDValue> &Results) {
4911 SDValue Chain = N->getOperand(0);
4912 SDValue Intrin = N->getOperand(1);
4988 SmallVector<SDValue, 8> OtherOps;
4999 SDValue NewLD = DAG.getMemIntrinsicNode(Opcode, DL, LdResVTs, OtherOps,
5003 SmallVector<SDValue, 4> ScalarRes;
5006 SDValue Res = NewLD.getValue(i);
5013 SDValue LoadChain = NewLD.getValue(NumElts);
5015 SDValue BuildVec =
5026 SmallVector<SDValue, 4> Ops(N->op_begin(), N->op_end());
5035 SDValue NewLD =
5048 SDNode *N, SmallVectorImpl<SDValue> &Results, SelectionDAG &DAG) const {
lib/Target/NVPTX/NVPTXISelLowering.h 444 SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
444 SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
446 SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const;
446 SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const;
483 SDValue LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv,
483 SDValue LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv,
487 SmallVectorImpl<SDValue> &InVals) const override;
489 SDValue LowerCall(CallLoweringInfo &CLI,
490 SmallVectorImpl<SDValue> &InVals) const override;
497 SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
497 SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
499 const SmallVectorImpl<SDValue> &OutVals, const SDLoc &dl,
502 void LowerAsmOperandForConstraint(SDValue Op, std::string &Constraint,
503 std::vector<SDValue> &Ops,
532 SDValue getSqrtEstimate(SDValue Operand, SelectionDAG &DAG, int Enabled,
532 SDValue getSqrtEstimate(SDValue Operand, SelectionDAG &DAG, int Enabled,
553 SDValue getParamSymbol(SelectionDAG &DAG, int idx, EVT) const;
555 SDValue LowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG) const;
555 SDValue LowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG) const;
556 SDValue LowerCONCAT_VECTORS(SDValue Op, SelectionDAG &DAG) const;
556 SDValue LowerCONCAT_VECTORS(SDValue Op, SelectionDAG &DAG) const;
557 SDValue LowerEXTRACT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const;
557 SDValue LowerEXTRACT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const;
559 SDValue LowerFROUND(SDValue Op, SelectionDAG &DAG) const;
559 SDValue LowerFROUND(SDValue Op, SelectionDAG &DAG) const;
560 SDValue LowerFROUND32(SDValue Op, SelectionDAG &DAG) const;
560 SDValue LowerFROUND32(SDValue Op, SelectionDAG &DAG) const;
561 SDValue LowerFROUND64(SDValue Op, SelectionDAG &DAG) const;
561 SDValue LowerFROUND64(SDValue Op, SelectionDAG &DAG) const;
563 SDValue LowerLOAD(SDValue Op, SelectionDAG &DAG) const;
563 SDValue LowerLOAD(SDValue Op, SelectionDAG &DAG) const;
564 SDValue LowerLOADi1(SDValue Op, SelectionDAG &DAG) const;
564 SDValue LowerLOADi1(SDValue Op, SelectionDAG &DAG) const;
566 SDValue LowerSTORE(SDValue Op, SelectionDAG &DAG) const;
566 SDValue LowerSTORE(SDValue Op, SelectionDAG &DAG) const;
567 SDValue LowerSTOREi1(SDValue Op, SelectionDAG &DAG) const;
567 SDValue LowerSTOREi1(SDValue Op, SelectionDAG &DAG) const;
568 SDValue LowerSTOREVector(SDValue Op, SelectionDAG &DAG) const;
568 SDValue LowerSTOREVector(SDValue Op, SelectionDAG &DAG) const;
570 SDValue LowerShiftRightParts(SDValue Op, SelectionDAG &DAG) const;
570 SDValue LowerShiftRightParts(SDValue Op, SelectionDAG &DAG) const;
571 SDValue LowerShiftLeftParts(SDValue Op, SelectionDAG &DAG) const;
571 SDValue LowerShiftLeftParts(SDValue Op, SelectionDAG &DAG) const;
573 SDValue LowerSelect(SDValue Op, SelectionDAG &DAG) const;
573 SDValue LowerSelect(SDValue Op, SelectionDAG &DAG) const;
575 void ReplaceNodeResults(SDNode *N, SmallVectorImpl<SDValue> &Results,
577 SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const override;
579 unsigned getArgumentAlignment(SDValue Callee, ImmutableCallSite CS, Type *Ty,
lib/Target/PowerPC/PPCISelDAGToDAG.cpp 167 inline SDValue getI16Imm(unsigned Imm, const SDLoc &dl) {
173 inline SDValue getI32Imm(unsigned Imm, const SDLoc &dl) {
179 inline SDValue getI64Imm(uint64_t Imm, const SDLoc &dl) {
184 inline SDValue getSmallIPtrImm(unsigned Imm, const SDLoc &dl) {
218 SDValue SelectCC(SDValue LHS, SDValue RHS, ISD::CondCode CC,
218 SDValue SelectCC(SDValue LHS, SDValue RHS, ISD::CondCode CC,
218 SDValue SelectCC(SDValue LHS, SDValue RHS, ISD::CondCode CC,
224 bool SelectAddrImmOffs(SDValue N, SDValue &Out) const {
224 bool SelectAddrImmOffs(SDValue N, SDValue &Out) const {
240 bool SelectAddrIdx(SDValue N, SDValue &Base, SDValue &Index) {
240 bool SelectAddrIdx(SDValue N, SDValue &Base, SDValue &Index) {
240 bool SelectAddrIdx(SDValue N, SDValue &Base, SDValue &Index) {
250 bool SelectAddrIdxX4(SDValue N, SDValue &Base, SDValue &Index) {
250 bool SelectAddrIdxX4(SDValue N, SDValue &Base, SDValue &Index) {
250 bool SelectAddrIdxX4(SDValue N, SDValue &Base, SDValue &Index) {
260 bool SelectAddrIdxX16(SDValue N, SDValue &Base, SDValue &Index) {
260 bool SelectAddrIdxX16(SDValue N, SDValue &Base, SDValue &Index) {
260 bool SelectAddrIdxX16(SDValue N, SDValue &Base, SDValue &Index) {
266 bool SelectAddrIdxOnly(SDValue N, SDValue &Base, SDValue &Index) {
266 bool SelectAddrIdxOnly(SDValue N, SDValue &Base, SDValue &Index) {
266 bool SelectAddrIdxOnly(SDValue N, SDValue &Base, SDValue &Index) {
274 bool SelectAddrImm(SDValue N, SDValue &Disp,
274 bool SelectAddrImm(SDValue N, SDValue &Disp,
275 SDValue &Base) {
282 bool SelectAddrImmX4(SDValue N, SDValue &Disp, SDValue &Base) {
282 bool SelectAddrImmX4(SDValue N, SDValue &Disp, SDValue &Base) {
282 bool SelectAddrImmX4(SDValue N, SDValue &Disp, SDValue &Base) {
289 bool SelectAddrImmX16(SDValue N, SDValue &Disp, SDValue &Base) {
289 bool SelectAddrImmX16(SDValue N, SDValue &Disp, SDValue &Base) {
289 bool SelectAddrImmX16(SDValue N, SDValue &Disp, SDValue &Base) {
294 bool SelectAddr(SDValue N, SDValue &Base) {
294 bool SelectAddr(SDValue N, SDValue &Base) {
304 bool SelectInlineAsmMemoryOperand(const SDValue &Op,
306 std::vector<SDValue> &OutOps) override {
323 SDValue RC = CurDAG->getTargetConstant(TRC->getID(), dl, MVT::i32);
324 SDValue NewOp =
351 SDValue combineToCMPB(SDNode *N);
352 void foldBoolExts(SDValue &Res, SDNode *&N);
505 static bool isInt32Immediate(SDValue N, unsigned &Imm) {
511 static bool isInt64Immediate(SDValue N, uint64_t &Imm) {
516 const SDValue &DestMBB) {
576 SDValue TFI = CurDAG->getTargetFrameIndex(FI, N->getValueType(0));
629 SDValue Base = ST->getBasePtr();
632 SDValue Offset = ST->getOffset();
661 SDValue Chain = ST->getChain();
663 SDValue Ops[] = {ST->getValue(), Base.getOperand(0), Base.getOperand(1),
672 SDValue Base = LD->getBasePtr();
675 SDValue Offset = LD->getOffset();
703 SDValue Chain = LD->getChain();
705 SDValue Ops[] = {Base.getOperand(0), Base.getOperand(1), Chain};
715 SDValue Op0 = N->getOperand(0);
716 SDValue Op1 = N->getOperand(1);
778 SDValue Ops[] = { Op0, Op1, getI32Imm(SH, dl), getI32Imm(MB, dl),
925 SDValue SDImm = CurDAG->getTargetConstant(SextImm, dl, MVT::i64);
946 SDValue Ops[] =
1027 SDValue Val = SDValue(selectI64ImmDirect(CurDAG, dl, MatImm), 0);
1096 SDValue SDImm = CurDAG->getTargetConstant(SextImm, dl, MVT::i64);
1107 SDValue V;
1123 ValueBit(SDValue V, unsigned I, Kind K = Variable)
1136 SDValue getValue() const {
1149 SDValue V;
1163 BitGroup(SDValue V, unsigned R, unsigned S, unsigned E)
1174 SDValue V;
1208 DenseMap<SDValue, std::unique_ptr<ValueBitsMemoizedValue>>;
1300 SDValue LastVal = SDValue();
1463 SDValue LastValue = Bits[0].hasValue() ? Bits[0].getValue() : SDValue();
1468 SDValue ThisValue = Bits[i].hasValue() ? Bits[i].getValue() : SDValue();
1702 SDValue getI32Imm(unsigned Imm, const SDLoc &dl) {
1721 SDValue ExtendToInt64(SDValue V, const SDLoc &dl) {
1721 SDValue ExtendToInt64(SDValue V, const SDLoc &dl) {
1726 SDValue SubRegIdx = CurDAG->getTargetConstant(PPC::sub_32, dl, MVT::i32);
1727 SDValue ImDef = SDValue(CurDAG->getMachineNode(PPC::IMPLICIT_DEF, dl,
1729 SDValue ExtVal = SDValue(CurDAG->getMachineNode(PPC::INSERT_SUBREG, dl,
1735 SDValue TruncateToInt32(SDValue V, const SDLoc &dl) {
1735 SDValue TruncateToInt32(SDValue V, const SDLoc &dl) {
1740 SDValue SubRegIdx = CurDAG->getTargetConstant(PPC::sub_32, dl, MVT::i32);
1741 SDValue SubVal = SDValue(CurDAG->getMachineNode(PPC::EXTRACT_SUBREG, dl,
1749 void SelectAndParts32(const SDLoc &dl, SDValue &Res, unsigned *InstCnt) {
1801 SDValue VRot;
1803 SDValue Ops[] =
1812 SDValue ANDIVal, ANDISVal;
1820 SDValue TotalVal;
1846 SDValue Res;
1860 SDValue Ops[] =
1880 SDValue Ops[] =
1886 SDValue Ops[] =
1905 SDValue ANDIVal, ANDISVal;
1945 SDValue SelectRotMask64(SDValue V, const SDLoc &dl, unsigned RLAmt,
1945 SDValue SelectRotMask64(SDValue V, const SDLoc &dl, unsigned RLAmt,
1961 SDValue Ops[] =
1969 SDValue Ops[] =
1976 SDValue Ops[] =
1983 SDValue Ops[] =
2009 SDValue SelectRotMaskIns64(SDValue Base, SDValue V, const SDLoc &dl,
2009 SDValue SelectRotMaskIns64(SDValue Base, SDValue V, const SDLoc &dl,
2009 SDValue SelectRotMaskIns64(SDValue Base, SDValue V, const SDLoc &dl,
2025 SDValue Ops[] =
2033 SDValue Ops[] =
2057 void SelectAndParts64(const SDLoc &dl, SDValue &Res, unsigned *InstCnt) {
2166 SDValue VRot;
2177 SDValue TotalVal;
2182 SDValue ANDIVal, ANDISVal;
2225 SDValue Res;
2331 SDValue ANDIVal, ANDISVal;
2349 SDValue MaskVal = SDValue(selectI64Imm(CurDAG, dl, Mask), 0);
2393 DenseMap<std::pair<SDValue, unsigned>, ValueRotInfo> ValueRots;
2478 SDValue computeLogicOpInGPR(SDValue LogicOp);
2478 SDValue computeLogicOpInGPR(SDValue LogicOp);
2479 SDValue signExtendInputIfNeeded(SDValue Input);
2479 SDValue signExtendInputIfNeeded(SDValue Input);
2480 SDValue zeroExtendInputIfNeeded(SDValue Input);
2480 SDValue zeroExtendInputIfNeeded(SDValue Input);
2481 SDValue addExtOrTrunc(SDValue NatWidthRes, ExtOrTruncConversion Conv);
2481 SDValue addExtOrTrunc(SDValue NatWidthRes, ExtOrTruncConversion Conv);
2482 SDValue getCompoundZeroComparisonInGPR(SDValue LHS, SDLoc dl,
2482 SDValue getCompoundZeroComparisonInGPR(SDValue LHS, SDLoc dl,
2484 SDValue get32BitZExtCompare(SDValue LHS, SDValue RHS, ISD::CondCode CC,
2484 SDValue get32BitZExtCompare(SDValue LHS, SDValue RHS, ISD::CondCode CC,
2484 SDValue get32BitZExtCompare(SDValue LHS, SDValue RHS, ISD::CondCode CC,
2486 SDValue get32BitSExtCompare(SDValue LHS, SDValue RHS, ISD::CondCode CC,
2486 SDValue get32BitSExtCompare(SDValue LHS, SDValue RHS, ISD::CondCode CC,
2486 SDValue get32BitSExtCompare(SDValue LHS, SDValue RHS, ISD::CondCode CC,
2488 SDValue get64BitZExtCompare(SDValue LHS, SDValue RHS, ISD::CondCode CC,
2488 SDValue get64BitZExtCompare(SDValue LHS, SDValue RHS, ISD::CondCode CC,
2488 SDValue get64BitZExtCompare(SDValue LHS, SDValue RHS, ISD::CondCode CC,
2490 SDValue get64BitSExtCompare(SDValue LHS, SDValue RHS, ISD::CondCode CC,
2490 SDValue get64BitSExtCompare(SDValue LHS, SDValue RHS, ISD::CondCode CC,
2490 SDValue get64BitSExtCompare(SDValue LHS, SDValue RHS, ISD::CondCode CC,
2492 SDValue getSETCCInGPR(SDValue Compare, SetccInGPROpts ConvOpts);
2492 SDValue getSETCCInGPR(SDValue Compare, SetccInGPROpts ConvOpts);
2534 SDValue WideRes;
2559 SDValue ConvOp = WideRes;
2575 SDValue LoweredLogical = computeLogicOpInGPR(SDValue(N, 0));
2582 SDValue CR0Reg = CurDAG->getRegister(PPC::CR0, MVT::i32);
2583 SDValue LHS = LoweredLogical.getOperand(0);
2584 SDValue RHS = LoweredLogical.getOperand(1);
2585 SDValue WideOp;
2586 SDValue OpToConvToRecForm;
2614 std::vector<SDValue> Ops;
2634 SDValue SRIdxVal =
2636 SDValue CRBit =
2651 SDValue IntegerCompareEliminator::computeLogicOpInGPR(SDValue LogicOp) {
2651 SDValue IntegerCompareEliminator::computeLogicOpInGPR(SDValue LogicOp) {
2657 SDValue LHS, RHS;
2671 SDValue InputOp = Operand.getOperand(0);
2719 SDValue IntegerCompareEliminator::signExtendInputIfNeeded(SDValue Input) {
2719 SDValue IntegerCompareEliminator::signExtendInputIfNeeded(SDValue Input) {
2752 SDValue IntegerCompareEliminator::zeroExtendInputIfNeeded(SDValue Input) {
2752 SDValue IntegerCompareEliminator::zeroExtendInputIfNeeded(SDValue Input) {
2788 SDValue IntegerCompareEliminator::addExtOrTrunc(SDValue NatWidthRes,
2788 SDValue IntegerCompareEliminator::addExtOrTrunc(SDValue NatWidthRes,
2795 SDValue ImDef(CurDAG->getMachineNode(PPC::IMPLICIT_DEF, dl, MVT::i64), 0);
2796 SDValue SubRegIdx =
2806 SDValue SubRegIdx =
2814 SDValue
2815 IntegerCompareEliminator::getCompoundZeroComparisonInGPR(SDValue LHS, SDLoc dl,
2819 SDValue ToExtend;
2833 SDValue Neg =
2840 SDValue Addi =
2865 SDValue ShiftOps[] = { ToExtend, S->getI32Imm(1, dl), S->getI32Imm(31, dl),
2888 SDValue
2889 IntegerCompareEliminator::get32BitZExtCompare(SDValue LHS, SDValue RHS,
2889 IntegerCompareEliminator::get32BitZExtCompare(SDValue LHS, SDValue RHS,
2903 SDValue Xor = IsRHSZero ? LHS :
2905 SDValue Clz =
2907 SDValue ShiftOps[] = { Clz, S->getI32Imm(27, dl), S->getI32Imm(5, dl),
2915 SDValue Xor = IsRHSZero ? LHS :
2917 SDValue Clz =
2919 SDValue ShiftOps[] = { Clz, S->getI32Imm(27, dl), S->getI32Imm(5, dl),
2921 SDValue Shift =
2953 SDValue Sub =
2955 SDValue Shift =
2977 SDValue Neg =
3002 SDValue ShiftOps[] = { LHS, S->getI32Imm(1, dl), S->getI32Imm(31, dl),
3013 SDValue SUBFNode =
3030 SDValue Subtract =
3032 SDValue SrdiNode =
3050 SDValue Subtract =
3061 SDValue
3062 IntegerCompareEliminator::get32BitSExtCompare(SDValue LHS, SDValue RHS,
3062 IntegerCompareEliminator::get32BitSExtCompare(SDValue LHS, SDValue RHS,
3079 SDValue CountInput = IsRHSZero ? LHS :
3081 SDValue Cntlzw =
3083 SDValue SHLOps[] = { Cntlzw, S->getI32Imm(27, dl),
3085 SDValue Slwi =
3097 SDValue Xor = IsRHSZero ? LHS :
3099 SDValue Clz =
3101 SDValue ShiftOps[] =
3103 SDValue Shift =
3105 SDValue Xori =
3134 SDValue SUBFNode =
3137 SDValue Srdi =
3156 SDValue Neg =
3187 SDValue SUBFNode =
3203 SDValue Subtract =
3205 SDValue Shift =
3223 SDValue Subtract =
3233 SDValue
3234 IntegerCompareEliminator::get64BitZExtCompare(SDValue LHS, SDValue RHS,
3234 IntegerCompareEliminator::get64BitZExtCompare(SDValue LHS, SDValue RHS,
3248 SDValue Xor = IsRHSZero ? LHS :
3250 SDValue Clz =
3261 SDValue Xor = IsRHSZero ? LHS :
3263 SDValue AC =
3288 SDValue ShiftL =
3292 SDValue ShiftR =
3295 SDValue SubtractCarry =
3309 SDValue Addi =
3312 SDValue Nor =
3335 SDValue SRADINode =
3338 SDValue SRDINode =
3342 SDValue SUBFC8Carry =
3345 SDValue ADDE8Node =
3359 SDValue SUBFC8Carry =
3362 SDValue SUBFE8Node =
3376 SDValue SubtractCarry =
3379 SDValue ExtSub =
3390 SDValue
3391 IntegerCompareEliminator::get64BitSExtCompare(SDValue LHS, SDValue RHS,
3391 IntegerCompareEliminator::get64BitSExtCompare(SDValue LHS, SDValue RHS,
3407 SDValue AddInput = IsRHSZero ? LHS :
3409 SDValue Addic =
3420 SDValue Xor = IsRHSZero ? LHS :
3422 SDValue SC =
3447 SDValue ShiftR =
3450 SDValue ShiftL =
3454 SDValue SubtractCarry =
3457 SDValue Adde =
3470 SDValue Add =
3473 SDValue Nor =
3495 SDValue SRADINode =
3498 SDValue SRDINode =
3502 SDValue SUBFC8Carry =
3505 SDValue ADDE8Node =
3508 SDValue XORI8Node =
3522 SDValue SubtractCarry =
3525 SDValue ExtSub =
3539 SDValue SubCarry =
3552 static bool allUsesExtend(SDValue Compare, SelectionDAG *CurDAG) {
3576 SDValue IntegerCompareEliminator::getSETCCInGPR(SDValue Compare,
3576 SDValue IntegerCompareEliminator::getSETCCInGPR(SDValue Compare,
3587 SDValue LHS = Compare.getOperand(0);
3588 SDValue RHS = Compare.getOperand(1);
3678 SDValue PPCDAGToDAGISel::SelectCC(SDValue LHS, SDValue RHS, ISD::CondCode CC,
3678 SDValue PPCDAGToDAGISel::SelectCC(SDValue LHS, SDValue RHS, ISD::CondCode CC,
3678 SDValue PPCDAGToDAGISel::SelectCC(SDValue LHS, SDValue RHS, ISD::CondCode CC,
3707 SDValue Xor(CurDAG->getMachineNode(PPC::XORIS, dl, MVT::i32, LHS,
3752 SDValue Xor(CurDAG->getMachineNode(PPC::XORIS8, dl, MVT::i64, LHS,
4020 SDValue Op = N->getOperand(0);
4025 SDValue Ops[] = { Op, getI32Imm(27, dl), getI32Imm(5, dl),
4032 SDValue AD =
4039 SDValue Ops[] = { Op, getI32Imm(1, dl), getI32Imm(31, dl),
4045 SDValue T =
4048 SDValue Ops[] = { T, getI32Imm(1, dl), getI32Imm(31, dl),
4055 SDValue Op = N->getOperand(0);
4078 SDValue AD = SDValue(CurDAG->getMachineNode(PPC::ADDI, dl, MVT::i32, Op,
4080 SDValue AN = SDValue(CurDAG->getMachineNode(PPC::AND, dl, MVT::i32, AD,
4082 SDValue Ops[] = { AN, getI32Imm(1, dl), getI32Imm(31, dl),
4088 SDValue Ops[] = { Op, getI32Imm(1, dl), getI32Imm(31, dl),
4098 SDValue LHS = N->getOperand(0);
4099 SDValue RHS = N->getOperand(1);
4116 SDValue VCmp(CurDAG->getMachineNode(VCmpInst, dl, ResVT, LHS, RHS), 0);
4131 SDValue CCReg = SelectCC(LHS, RHS, CC, dl);
4132 SDValue IntCR;
4141 SDValue CR7Reg = CurDAG->getRegister(PPC::CR7, MVT::i32);
4143 SDValue InFlag(nullptr, 0); // Null incoming flag value.
4150 SDValue Ops[] = { IntCR, getI32Imm((32 - (3 - Idx)) & 31, dl),
4158 SDValue Tmp =
4169 SDValue AddrOp;
4212 SDValue LHS = N->getOperand(0);
4213 SDValue RHS = N->getOperand(1);
4214 SDValue TrueRes = N->getOperand(2);
4215 SDValue FalseRes = N->getOperand(3);
4238 SDValue SetOrSelCC = InnerIsSel ? FalseRes : FalseRes.getOperand(0);
4254 SDValue InnerLHS = SetOrSelCC.getOperand(0);
4255 SDValue InnerRHS = SetOrSelCC.getOperand(1);
4404 SDValue Op = N->getOperand(1);
4426 SDValue InFlag = N->getOperand(1);
4438 SDValue N0 = N->getOperand(0);
4439 SDValue ShiftAmt =
4485 SDValue Offset = LD->getOffset();
4516 SDValue Chain = LD->getChain();
4517 SDValue Base = LD->getBasePtr();
4518 SDValue Ops[] = { Offset, Base, Chain };
4556 SDValue Chain = LD->getChain();
4557 SDValue Base = LD->getBasePtr();
4558 SDValue Ops[] = { Base, Offset, Chain };
4576 SDValue Val = N->getOperand(0).getOperand(0);
4577 SDValue Ops[] = { Val, getI32Imm(SH, dl), getI32Imm(MB, dl),
4587 SDValue Val = N->getOperand(0);
4588 SDValue Ops[] = { Val, getI32Imm(0, dl), getI32Imm(MB, dl),
4596 SDValue Val = N->getOperand(0);
4601 auto Op0 = Val.getOperand(0);
4608 SDValue IDVal (ImDef, 0);
4629 SDValue Ops[] = { Val, getI32Imm(SH, dl), getI32Imm(MB, dl) };
4638 SDValue Val = N->getOperand(0);
4641 SDValue Ops[] = { Val, getI32Imm(SH, dl), getI32Imm(MB, dl) };
4671 SDValue Ops[] = { N->getOperand(0).getOperand(0),
4714 SDValue Ops1[] = { SDValue(Lo, 0), getI16Imm(ImmHi, dl)};
4737 SDValue Ops1[] = { SDValue(Lo, 0), getI16Imm(ImmHi, dl)};
4759 SDValue Ops[] = { N->getOperand(0).getOperand(0),
4773 SDValue Ops[] = { N->getOperand(0).getOperand(0),
4794 SDValue AndI(CurDAG->getMachineNode(Opcode, dl, InVT, MVT::Glue,
4798 SDValue CR0Reg = CurDAG->getRegister(PPC::CR0, MVT::i32);
4799 SDValue SRIdxVal =
4822 SDValue LHS = N->getOperand(0);
4823 SDValue RHS = N->getOperand(1);
4833 SDValue GenCC =
4860 SDValue CCReg = SelectCC(N->getOperand(0), N->getOperand(1), CC, dl);
4876 SDValue CCBit = CurDAG->getTargetExtractSubreg(SRI, dl, MVT::i1, CCReg);
4878 SDValue NotCCBit(CurDAG->getMachineNode(PPC::CRNOR, dl, MVT::i1,
4880 SDValue C = Inv ? NotCCBit : CCBit,
4883 SDValue CAndT(CurDAG->getMachineNode(PPC::CRAND, dl, MVT::i1,
4885 SDValue NotCAndF(CurDAG->getMachineNode(PPC::CRAND, dl, MVT::i1,
4929 SDValue Ops[] = { CCReg, N->getOperand(2), N->getOperand(3),
4939 SDValue Op1 = N->getOperand(SVN->getMaskElt(0) < 2 ? 0 : 1),
4953 SDValue Base, Offset;
4959 SDValue Chain = LD->getChain();
4960 SDValue Ops[] = { Base, Offset, Chain };
4978 SDValue DMV = CurDAG->getTargetConstant(DM[1] | (DM[0] << 1), dl,
4980 SDValue Ops[] = { Op1, Op2, DMV };
4989 SDValue Ops[] = { N->getOperand(1), N->getOperand(0) };
5007 SDValue Pred = getI32Imm(PCC, dl);
5008 SDValue Ops[] = { Pred, N->getOperand(2), N->getOperand(3),
5039 SDValue BitComp(CurDAG->getMachineNode(Opc, dl, MVT::i1,
5050 SDValue CondCode = SelectCC(N->getOperand(2), N->getOperand(3), CC, dl);
5051 SDValue Ops[] = { getI32Imm(PCC, dl), CondCode,
5058 SDValue Chain = N->getOperand(0);
5059 SDValue Target = N->getOperand(1);
5091 SDValue GA = TocEntry->getOperand(0);
5092 SDValue TocBase = TocEntry->getOperand(1);
5130 SDValue GA = N->getOperand(0);
5131 SDValue TOCbase = N->getOperand(1);
5199 SDValue EltVal = getI32Imm(Elt >> 1, dl);
5201 SDValue TmpVal = SDValue(Tmp, 0);
5211 SDValue EltVal = getI32Imm(Elt - 16, dl);
5225 SDValue EltVal = getI32Imm(Elt + 16, dl);
5245 SDValue PPCDAGToDAGISel::combineToCMPB(SDNode *N) {
5251 SDValue Res;
5261 SDValue RHS, LHS;
5291 SDValue Op0 = O.getOperand(0), Op1 = O.getOperand(1);
5345 SDValue Op = O.getOperand(0);
5352 SDValue XOR = Op.getOperand(0);
5370 SDValue XOR = Op.getOperand(0);
5384 SmallVector<SDValue, 8> Queue(1, SDValue(N, 0));
5386 SDValue V = Queue.pop_back_val();
5388 for (const SDValue &O : V.getNode()->ops()) {
5391 SDValue OLHS, ORHS;
5462 void PPCDAGToDAGISel::foldBoolExts(SDValue &Res, SDNode *&N) {
5479 SDValue Cond = N->getOperand(0);
5480 SDValue ConstTrue =
5482 SDValue ConstFalse = CurDAG->getConstant(0, dl, VT);
5490 SDValue UserO0 = User->getOperand(0), UserO1 = User->getOperand(1);
5491 SDValue O0 = UserO0.getNode() == N ? Val : UserO0;
5492 SDValue O1 = UserO1.getNode() == N ? Val : UserO1;
5501 SDValue TrueRes = TryFold(ConstTrue);
5504 SDValue FalseRes = TryFold(ConstFalse);
5533 SDValue Res;
5662 SDValue Op = MachineNode->getOperand(1);
5689 SDValue Op = MachineNode->getOperand(0);
6061 static bool PeepholePPC64ZExtGather(SDValue Op32,
6233 SDValue ISR = N->getOperand(0);
6244 SDValue IDef = ISR.getOperand(0);
6252 SDValue Op32 = ISR->getOperand(1);
6316 SmallVector<SDValue, 4> Ops;
6317 for (const SDValue &V : PN->ops()) {
6320 SDValue ReplOpOps[] = { ISR.getOperand(0), V, ISR.getOperand(2) };
6432 SDValue Base = N->getOperand(FirstOp + 1);
6477 SDValue ImmOpnd = Base.getOperand(1);
6490 SDValue HBase = Base.getOperand(0);
6508 SDValue HImmOpnd = HBase.getOperand(1);
lib/Target/PowerPC/PPCISelLowering.cpp 127 static SDValue widenVec(SelectionDAG &DAG, SDValue Vec, const SDLoc &dl);
127 static SDValue widenVec(SelectionDAG &DAG, SDValue Vec, const SDLoc &dl);
1444 static bool isFloatingPointZero(SDValue Op) {
2104 SDValue PPC::get_VSPLTI_elt(SDNode *N, unsigned ByteSize, SelectionDAG &DAG) {
2105 SDValue OpVal(nullptr, 0);
2114 SDValue UniquedVals[4];
2252 bool llvm::isIntS16Immediate(SDValue Op, int16_t &Imm) {
2259 bool PPCTargetLowering::SelectAddressEVXRegReg(SDValue N, SDValue &Base,
2259 bool PPCTargetLowering::SelectAddressEVXRegReg(SDValue N, SDValue &Base,
2260 SDValue &Index,
2281 bool PPCTargetLowering::SelectAddressRegReg(SDValue N, SDValue &Base,
2281 bool PPCTargetLowering::SelectAddressRegReg(SDValue N, SDValue &Base,
2282 SDValue &Index, SelectionDAG &DAG,
2368 bool PPCTargetLowering::SelectAddressRegImm(SDValue N, SDValue &Disp,
2368 bool PPCTargetLowering::SelectAddressRegImm(SDValue N, SDValue &Disp,
2369 SDValue &Base,
2467 bool PPCTargetLowering::SelectAddressRegRegOnly(SDValue N, SDValue &Base,
2467 bool PPCTargetLowering::SelectAddressRegRegOnly(SDValue N, SDValue &Base,
2468 SDValue &Index,
2527 SDValue LoadedVal(N, 0);
2543 bool PPCTargetLowering::getPreIndexedAddressParts(SDNode *N, SDValue &Base,
2544 SDValue &Offset,
2550 SDValue Ptr;
2593 SDValue Val = cast<StoreSDNode>(N)->getValue();
2662 static SDValue LowerLabelRef(SDValue HiPart, SDValue LoPart, bool isPIC,
2662 static SDValue LowerLabelRef(SDValue HiPart, SDValue LoPart, bool isPIC,
2662 static SDValue LowerLabelRef(SDValue HiPart, SDValue LoPart, bool isPIC,
2666 SDValue Zero = DAG.getConstant(0, DL, PtrVT);
2668 SDValue Hi = DAG.getNode(PPCISD::Hi, DL, PtrVT, HiPart, Zero);
2669 SDValue Lo = DAG.getNode(PPCISD::Lo, DL, PtrVT, LoPart, Zero);
2690 SDValue PPCTargetLowering::getTOCEntry(SelectionDAG &DAG, const SDLoc &dl,
2691 SDValue GA) const {
2694 SDValue Reg = Is64Bit ? DAG.getRegister(PPC::X2, VT)
2698 SDValue Ops[] = { GA, Reg };
2705 SDValue PPCTargetLowering::LowerConstantPool(SDValue Op,
2705 SDValue PPCTargetLowering::LowerConstantPool(SDValue Op,
2715 SDValue GA = DAG.getTargetConstantPool(C, PtrVT, CP->getAlignment(), 0);
2724 SDValue GA = DAG.getTargetConstantPool(C, PtrVT, CP->getAlignment(),
2729 SDValue CPIHi =
2731 SDValue CPILo =
2752 SDValue PPCTargetLowering::getPICJumpTableRelocBase(SDValue Table,
2752 SDValue PPCTargetLowering::getPICJumpTableRelocBase(SDValue Table,
2783 SDValue PPCTargetLowering::LowerJumpTable(SDValue Op, SelectionDAG &DAG) const {
2783 SDValue PPCTargetLowering::LowerJumpTable(SDValue Op, SelectionDAG &DAG) const {
2791 SDValue GA = DAG.getTargetJumpTable(JT->getIndex(), PtrVT);
2800 SDValue GA = DAG.getTargetJumpTable(JT->getIndex(), PtrVT,
2805 SDValue JTIHi = DAG.getTargetJumpTable(JT->getIndex(), PtrVT, MOHiFlag);
2806 SDValue JTILo = DAG.getTargetJumpTable(JT->getIndex(), PtrVT, MOLoFlag);
2810 SDValue PPCTargetLowering::LowerBlockAddress(SDValue Op,
2810 SDValue PPCTargetLowering::LowerBlockAddress(SDValue Op,
2820 SDValue GA = DAG.getTargetBlockAddress(BA, PtrVT, BASDN->getOffset());
2833 SDValue TgtBAHi = DAG.getTargetBlockAddress(BA, PtrVT, 0, MOHiFlag);
2834 SDValue TgtBALo = DAG.getTargetBlockAddress(BA, PtrVT, 0, MOLoFlag);
2838 SDValue PPCTargetLowering::LowerGlobalTLSAddress(SDValue Op,
2838 SDValue PPCTargetLowering::LowerGlobalTLSAddress(SDValue Op,
2859 SDValue TGAHi = DAG.getTargetGlobalAddress(GV, dl, PtrVT, 0,
2861 SDValue TGALo = DAG.getTargetGlobalAddress(GV, dl, PtrVT, 0,
2863 SDValue TLSReg = is64bit ? DAG.getRegister(PPC::X13, MVT::i64)
2866 SDValue Hi = DAG.getNode(PPCISD::Hi, dl, PtrVT, TGAHi, TLSReg);
2871 SDValue TGA = DAG.getTargetGlobalAddress(GV, dl, PtrVT, 0, 0);
2872 SDValue TGATLS = DAG.getTargetGlobalAddress(GV, dl, PtrVT, 0,
2874 SDValue GOTPtr;
2877 SDValue GOTReg = DAG.getRegister(PPC::X2, MVT::i64);
2888 SDValue TPOffset = DAG.getNode(PPCISD::LD_GOT_TPREL_L, dl,
2894 SDValue TGA = DAG.getTargetGlobalAddress(GV, dl, PtrVT, 0, 0);
2895 SDValue GOTPtr;
2898 SDValue GOTReg = DAG.getRegister(PPC::X2, MVT::i64);
2912 SDValue TGA = DAG.getTargetGlobalAddress(GV, dl, PtrVT, 0, 0);
2913 SDValue GOTPtr;
2916 SDValue GOTReg = DAG.getRegister(PPC::X2, MVT::i64);
2925 SDValue TLSAddr = DAG.getNode(PPCISD::ADDI_TLSLD_L_ADDR, dl,
2927 SDValue DtvOffsetHi = DAG.getNode(PPCISD::ADDIS_DTPREL_HA, dl,
2935 SDValue PPCTargetLowering::LowerGlobalAddress(SDValue Op,
2935 SDValue PPCTargetLowering::LowerGlobalAddress(SDValue Op,
2946 SDValue GA = DAG.getTargetGlobalAddress(GV, DL, PtrVT, GSDN->getOffset());
2955 SDValue GA = DAG.getTargetGlobalAddress(GV, DL, PtrVT,
2961 SDValue GAHi =
2963 SDValue GALo =
2966 SDValue Ptr = LowerLabelRef(GAHi, GALo, IsPIC, DAG);
2975 SDValue PPCTargetLowering::LowerSETCC(SDValue Op, SelectionDAG &DAG) const {
2975 SDValue PPCTargetLowering::LowerSETCC(SDValue Op, SelectionDAG &DAG) const {
3003 if (SDValue V = lowerCmpEqZeroToCtlzSrl(Op, DAG))
3022 SDValue Sub = DAG.getNode(ISD::XOR, dl, LHSVT, Op.getOperand(0),
3029 SDValue PPCTargetLowering::LowerVAARG(SDValue Op, SelectionDAG &DAG) const {
3029 SDValue PPCTargetLowering::LowerVAARG(SDValue Op, SelectionDAG &DAG) const {
3033 SDValue InChain = Node->getOperand(0);
3034 SDValue VAListPtr = Node->getOperand(1);
3041 SDValue GprIndex = DAG.getExtLoad(ISD::ZEXTLOAD, dl, MVT::i32, InChain,
3047 SDValue GprAnd = DAG.getNode(ISD::AND, dl, MVT::i32, GprIndex,
3049 SDValue CC64 = DAG.getSetCC(dl, MVT::i32, GprAnd,
3051 SDValue GprIndexPlusOne = DAG.getNode(ISD::ADD, dl, MVT::i32, GprIndex,
3059 SDValue FprPtr = DAG.getNode(ISD::ADD, dl, PtrVT, VAListPtr,
3063 SDValue FprIndex = DAG.getExtLoad(ISD::ZEXTLOAD, dl, MVT::i32, InChain,
3067 SDValue RegSaveAreaPtr = DAG.getNode(ISD::ADD, dl, PtrVT, VAListPtr,
3070 SDValue OverflowAreaPtr = DAG.getNode(ISD::ADD, dl, PtrVT, VAListPtr,
3074 SDValue OverflowArea =
3078 SDValue RegSaveArea =
3083 SDValue CC = DAG.getSetCC(dl, MVT::i32, VT.isInteger() ? GprIndex : FprIndex,
3087 SDValue RegConstant = DAG.getNode(ISD::MUL, dl, MVT::i32,
3093 SDValue OurReg = DAG.getNode(ISD::ADD, dl, PtrVT, RegSaveArea,
3102 SDValue IndexPlus1 = DAG.getNode(ISD::ADD, dl, MVT::i32,
3112 SDValue Result = DAG.getNode(ISD::SELECT, dl, PtrVT, CC, OurReg, OverflowArea);
3115 SDValue OverflowAreaPlusN = DAG.getNode(ISD::ADD, dl, PtrVT, OverflowArea,
3128 SDValue PPCTargetLowering::LowerVACOPY(SDValue Op, SelectionDAG &DAG) const {
3128 SDValue PPCTargetLowering::LowerVACOPY(SDValue Op, SelectionDAG &DAG) const {
3139 SDValue PPCTargetLowering::LowerADJUST_TRAMPOLINE(SDValue Op,
3139 SDValue PPCTargetLowering::LowerADJUST_TRAMPOLINE(SDValue Op,
3144 SDValue PPCTargetLowering::LowerINIT_TRAMPOLINE(SDValue Op,
3144 SDValue PPCTargetLowering::LowerINIT_TRAMPOLINE(SDValue Op,
3146 SDValue Chain = Op.getOperand(0);
3147 SDValue Trmp = Op.getOperand(1); // trampoline
3148 SDValue FPtr = Op.getOperand(2); // nested function
3149 SDValue Nest = Op.getOperand(3); // 'nest' parameter value
3176 std::pair<SDValue, SDValue> CallResult = LowerCallTo(CLI);
3176 std::pair<SDValue, SDValue> CallResult = LowerCallTo(CLI);
3180 SDValue PPCTargetLowering::LowerVASTART(SDValue Op, SelectionDAG &DAG) const {
3180 SDValue PPCTargetLowering::LowerVASTART(SDValue Op, SelectionDAG &DAG) const {
3190 SDValue FR = DAG.getFrameIndex(FuncInfo->getVarArgsFrameIndex(), PtrVT);
3220 SDValue ArgGPR = DAG.getConstant(FuncInfo->getVarArgsNumGPR(), dl, MVT::i32);
3221 SDValue ArgFPR = DAG.getConstant(FuncInfo->getVarArgsNumFPR(), dl, MVT::i32);
3222 SDValue StackOffsetFI = DAG.getFrameIndex(FuncInfo->getVarArgsStackOffset(),
3224 SDValue FR = DAG.getFrameIndex(FuncInfo->getVarArgsFrameIndex(),
3228 SDValue ConstFrameOffset = DAG.getConstant(FrameOffset, dl, PtrVT);
3231 SDValue ConstStackOffset = DAG.getConstant(StackOffset, dl, PtrVT);
3234 SDValue ConstFPROffset = DAG.getConstant(FPROffset, dl, PtrVT);
3239 SDValue firstStore =
3243 SDValue nextPtr = DAG.getNode(ISD::ADD, dl, PtrVT, Op.getOperand(1),
3247 SDValue secondStore =
3254 SDValue thirdStore = DAG.getStore(secondStore, dl, StackOffsetFI, nextPtr,
3402 SDValue PPCTargetLowering::LowerFormalArguments(
3403 SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
3405 SelectionDAG &DAG, SmallVectorImpl<SDValue> &InVals) const {
3419 SDValue PPCTargetLowering::LowerFormalArguments_32SVR4(
3420 SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
3422 SelectionDAG &DAG, SmallVectorImpl<SDValue> &InVals) const {
3529 SDValue ArgValue;
3536 SDValue ArgValueLo = DAG.getCopyFromReg(Chain, dl, RegLo, MVT::i32);
3537 SDValue ArgValueHi = DAG.getCopyFromReg(Chain, dl, RegHi, MVT::i32);
3565 SDValue FIN = DAG.getFrameIndex(FI, PtrVT);
3595 SmallVector<SDValue, 8> MemOps;
3627 SDValue FIN = DAG.getFrameIndex(FuncInfo->getVarArgsFrameIndex(), PtrVT);
3638 SDValue Val = DAG.getCopyFromReg(Chain, dl, VReg, PtrVT);
3639 SDValue Store =
3643 SDValue PtrOff = DAG.getConstant(PtrVT.getSizeInBits()/8, dl, PtrVT);
3657 SDValue Val = DAG.getCopyFromReg(Chain, dl, VReg, MVT::f64);
3658 SDValue Store =
3662 SDValue PtrOff = DAG.getConstant(MVT(MVT::f64).getSizeInBits()/8, dl,
3676 SDValue PPCTargetLowering::extendArgForPPC64(ISD::ArgFlagsTy Flags,
3678 SDValue ArgVal,
3690 SDValue PPCTargetLowering::LowerFormalArguments_64SVR4(
3691 SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
3693 SelectionDAG &DAG, SmallVectorImpl<SDValue> &InVals) const {
3755 SmallVector<SDValue, 8> MemOps;
3759 SDValue ArgVal;
3809 SDValue FIN = DAG.getFrameIndex(FI, PtrVT);
3826 SDValue FIN = DAG.getFrameIndex(FI, PtrVT);
3832 SDValue Arg = FIN;
3834 SDValue ArgOff = DAG.getConstant(PtrByteSize - ObjSize, dl, PtrVT);
3842 SDValue Val = DAG.getCopyFromReg(Chain, dl, VReg, PtrVT);
3843 SDValue Store;
3877 SDValue Val = DAG.getCopyFromReg(Chain, dl, VReg, PtrVT);
3878 SDValue Addr = FIN;
3880 SDValue Off = DAG.getConstant(j, dl, PtrVT);
3883 SDValue Store = DAG.getStore(Val.getValue(1), dl, Val, Addr,
4049 SDValue FIN = DAG.getFrameIndex(FI, PtrVT);
4078 SDValue FIN = DAG.getFrameIndex(FuncInfo->getVarArgsFrameIndex(), PtrVT);
4086 SDValue Val = DAG.getCopyFromReg(Chain, dl, VReg, PtrVT);
4087 SDValue Store =
4091 SDValue PtrOff = DAG.getConstant(PtrByteSize, dl, PtrVT);
4102 SDValue PPCTargetLowering::LowerFormalArguments_Darwin(
4103 SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
4105 SelectionDAG &DAG, SmallVectorImpl<SDValue> &InVals) const {
4198 SmallVector<SDValue, 8> MemOps;
4203 SDValue ArgVal;
4245 SDValue FIN = DAG.getFrameIndex(FI, PtrVT);
4254 SDValue Val = DAG.getCopyFromReg(Chain, dl, VReg, PtrVT);
4256 SDValue Store =
4278 SDValue FIN = DAG.getFrameIndex(FI, PtrVT);
4279 SDValue Val = DAG.getCopyFromReg(Chain, dl, VReg, PtrVT);
4280 SDValue Store = DAG.getStore(Val.getValue(1), dl, Val, FIN,
4401 SDValue FIN = DAG.getFrameIndex(FI, PtrVT);
4433 SDValue FIN = DAG.getFrameIndex(FuncInfo->getVarArgsFrameIndex(), PtrVT);
4446 SDValue Val = DAG.getCopyFromReg(Chain, dl, VReg, PtrVT);
4447 SDValue Store =
4451 SDValue PtrOff = DAG.getConstant(PtrVT.getSizeInBits()/8, dl, PtrVT);
4479 static bool isFunctionGlobalAddress(SDValue Callee);
4482 callsShareTOCBase(const Function *Caller, SDValue Callee,
4630 SDValue Callee,
4710 PPCTargetLowering::IsEligibleForTailCallOptimization(SDValue Callee,
4747 static SDNode *isBLACompatibleAddress(SDValue Op, SelectionDAG &DAG) {
4766 SDValue Arg;
4767 SDValue FrameIdxOp;
4777 SelectionDAG &DAG, SDValue Chain,
4779 SmallVectorImpl<SDValue> &MemOpChains, const SDLoc &dl) {
4781 SDValue Arg = TailCallArgs[i].Arg;
4782 SDValue FIN = TailCallArgs[i].FrameIdxOp;
4793 static SDValue EmitTailCallStoreFPAndRetAddr(SelectionDAG &DAG, SDValue Chain,
4793 static SDValue EmitTailCallStoreFPAndRetAddr(SelectionDAG &DAG, SDValue Chain,
4794 SDValue OldRetAddr, SDValue OldFP,
4794 SDValue OldRetAddr, SDValue OldFP,
4807 SDValue NewRetAddrFrIdx = DAG.getFrameIndex(NewRetAddr, VT);
4817 SDValue NewFramePtrIdx = DAG.getFrameIndex(NewFPIdx, VT);
4830 SDValue Arg, int SPDiff, unsigned ArgOffset,
4836 SDValue FIN = DAG.getFrameIndex(FI, VT);
4847 SDValue PPCTargetLowering::EmitTailCallLoadFPAndRetAddr(
4848 SelectionDAG &DAG, int SPDiff, SDValue Chain, SDValue &LROpOut,
4848 SelectionDAG &DAG, int SPDiff, SDValue Chain, SDValue &LROpOut,
4849 SDValue &FPOpOut, const SDLoc &dl) const {
4874 static SDValue CreateCopyOfByValArgument(SDValue Src, SDValue Dst,
4874 static SDValue CreateCopyOfByValArgument(SDValue Src, SDValue Dst,
4874 static SDValue CreateCopyOfByValArgument(SDValue Src, SDValue Dst,
4875 SDValue Chain, ISD::ArgFlagsTy Flags,
4877 SDValue SizeNode = DAG.getConstant(Flags.getByValSize(), dl, MVT::i32);
4886 SelectionDAG &DAG, MachineFunction &MF, SDValue Chain, SDValue Arg,
4886 SelectionDAG &DAG, MachineFunction &MF, SDValue Chain, SDValue Arg,
4887 SDValue PtrOff, int SPDiff, unsigned ArgOffset, bool isPPC64,
4888 bool isTailCall, bool isVector, SmallVectorImpl<SDValue> &MemOpChains,
4893 SDValue StackPtr;
4909 PrepareTailCall(SelectionDAG &DAG, SDValue &InFlag, SDValue &Chain,
4909 PrepareTailCall(SelectionDAG &DAG, SDValue &InFlag, SDValue &Chain,
4910 const SDLoc &dl, int SPDiff, unsigned NumBytes, SDValue LROp,
4911 SDValue FPOp,
4915 SmallVector<SDValue, 8> MemOpChains2;
4934 static bool isFunctionGlobalAddress(SDValue Callee) {
4947 PrepareCall(SelectionDAG &DAG, SDValue &Callee, SDValue &InFlag, SDValue &Chain,
4947 PrepareCall(SelectionDAG &DAG, SDValue &Callee, SDValue &InFlag, SDValue &Chain,
4947 PrepareCall(SelectionDAG &DAG, SDValue &Callee, SDValue &InFlag, SDValue &Chain,
4948 SDValue CallSeqStart, const SDLoc &dl, int SPDiff, bool isTailCall,
4950 SmallVectorImpl<std::pair<unsigned, SDValue>> &RegsToPass,
4951 SmallVectorImpl<SDValue> &Ops, std::vector<EVT> &NodeTys,
5024 SDValue MTCTROps[] = {Chain, Callee, InFlag};
5056 SDValue LDChain = CallSeqStart.getValue(CallSeqStart->getNumValues()-1);
5066 SDValue LoadFuncPtr = DAG.getLoad(MVT::i64, dl, LDChain, Callee, MPI,
5070 SDValue PtrOff = DAG.getIntPtrConstant(16, dl);
5071 SDValue AddPtr = DAG.getNode(ISD::ADD, dl, MVT::i64, Callee, PtrOff);
5072 SDValue LoadEnvPtr =
5076 SDValue TOCOff = DAG.getIntPtrConstant(8, dl);
5077 SDValue AddTOC = DAG.getNode(ISD::ADD, dl, MVT::i64, Callee, TOCOff);
5078 SDValue TOCPtr =
5083 SDValue TOCVal = DAG.getCopyToReg(Chain, dl, PPC::X2, TOCPtr,
5091 SDValue EnvVal = DAG.getCopyToReg(Chain, dl, PPC::X11, LoadEnvPtr,
5153 SDValue PPCTargetLowering::LowerCallResult(
5154 SDValue Chain, SDValue InFlag, CallingConv::ID CallConv, bool isVarArg,
5154 SDValue Chain, SDValue InFlag, CallingConv::ID CallConv, bool isVarArg,
5156 SelectionDAG &DAG, SmallVectorImpl<SDValue> &InVals) const {
5171 SDValue Val;
5174 SDValue Lo = DAG.getCopyFromReg(Chain, dl, VA.getLocReg(), MVT::i32,
5179 SDValue Hi = DAG.getCopyFromReg(Chain, dl, VA.getLocReg(), MVT::i32,
5217 SDValue PPCTargetLowering::FinishCall(
5220 SmallVector<std::pair<unsigned, SDValue>, 8> &RegsToPass, SDValue InFlag,
5220 SmallVector<std::pair<unsigned, SDValue>, 8> &RegsToPass, SDValue InFlag,
5221 SDValue Chain, SDValue CallSeqStart, SDValue &Callee, int SPDiff,
5221 SDValue Chain, SDValue CallSeqStart, SDValue &Callee, int SPDiff,
5221 SDValue Chain, SDValue CallSeqStart, SDValue &Callee, int SPDiff,
5223 SmallVectorImpl<SDValue> &InVals, ImmutableCallSite CS) const {
5225 SmallVector<SDValue, 8> Ops;
5294 SDValue StackPtr = DAG.getRegister(PPC::X1, PtrVT);
5296 SDValue TOCOff = DAG.getIntPtrConstant(TOCSaveOffset, dl);
5297 SDValue AddTOC = DAG.getNode(ISD::ADD, dl, MVT::i64, StackPtr, TOCOff);
5335 SDValue
5337 SmallVectorImpl<SDValue> &InVals) const {
5341 SmallVectorImpl<SDValue> &OutVals = CLI.OutVals;
5343 SDValue Chain = CLI.Chain;
5344 SDValue Callee = CLI.Callee;
5411 SDValue PPCTargetLowering::LowerCall_32SVR4(
5412 SDValue Chain, SDValue Callee, CallingConv::ID CallConv, bool isVarArg,
5412 SDValue Chain, SDValue Callee, CallingConv::ID CallConv, bool isVarArg,
5415 const SmallVectorImpl<SDValue> &OutVals,
5417 SelectionDAG &DAG, SmallVectorImpl<SDValue> &InVals,
5507 SDValue CallSeqStart = Chain;
5511 SDValue LROp, FPOp;
5517 SDValue StackPtr = DAG.getRegister(PPC::R1, MVT::i32);
5519 SmallVector<std::pair<unsigned, SDValue>, 8> RegsToPass;
5521 SmallVector<SDValue, 8> MemOpChains;
5532 SDValue Arg = OutVals[RealArgIdx];
5547 SDValue PtrOff = DAG.getIntPtrConstant(LocMemOffset, dl);
5553 SDValue MemcpyCall =
5559 SDValue NewCallSeqStart = DAG.getCALLSEQ_START(MemcpyCall, NumBytes, 0,
5584 SDValue SVal = DAG.getNode(PPCISD::EXTRACT_SPE, dl, MVT::i32, Arg,
5599 SDValue PtrOff = DAG.getIntPtrConstant(LocMemOffset, dl);
5618 SDValue InFlag;
5629 SDValue Ops[] = { Chain, InFlag };
5649 SDValue PPCTargetLowering::createMemcpyOutsideCallSeq(
5650 SDValue Arg, SDValue PtrOff, SDValue CallSeqStart, ISD::ArgFlagsTy Flags,
5650 SDValue Arg, SDValue PtrOff, SDValue CallSeqStart, ISD::ArgFlagsTy Flags,
5650 SDValue Arg, SDValue PtrOff, SDValue CallSeqStart, ISD::ArgFlagsTy Flags,
5652 SDValue MemcpyCall = CreateCopyOfByValArgument(Arg, PtrOff,
5657 SDValue NewCallSeqStart = DAG.getCALLSEQ_START(MemcpyCall, FrameSize, 0,
5664 SDValue PPCTargetLowering::LowerCall_64SVR4(
5665 SDValue Chain, SDValue Callee, CallingConv::ID CallConv, bool isVarArg,
5665 SDValue Chain, SDValue Callee, CallingConv::ID CallConv, bool isVarArg,
5668 const SmallVectorImpl<SDValue> &OutVals,
5670 SelectionDAG &DAG, SmallVectorImpl<SDValue> &InVals,
5852 SDValue CallSeqStart = Chain;
5856 SDValue LROp, FPOp;
5862 SDValue StackPtr = DAG.getRegister(PPC::X1, MVT::i64);
5870 SmallVector<std::pair<unsigned, SDValue>, 8> RegsToPass;
5873 SmallVector<SDValue, 8> MemOpChains;
5875 SDValue Arg = OutVals[i];
5882 SDValue PtrOff;
5936 SDValue Load = DAG.getExtLoad(ISD::EXTLOAD, dl, PtrVT, Chain, Arg,
5947 SDValue AddPtr = PtrOff;
5949 SDValue Const = DAG.getConstant(PtrByteSize - Size, dl,
5987 SDValue AddPtr = PtrOff;
5989 SDValue Const = DAG.getConstant(8 - Size, dl, PtrOff.getValueType());
5997 SDValue Load =
6010 SDValue Const = DAG.getConstant(j, dl, PtrOff.getValueType());
6011 SDValue AddArg = DAG.getNode(ISD::ADD, dl, PtrVT, Arg, Const);
6013 SDValue Load =
6086 SDValue ArgVal;
6100 SDValue Lo, Hi;
6130 SDValue ConstFour = DAG.getConstant(4, dl, PtrOff.getValueType());
6175 SDValue Store =
6179 SDValue Load =
6188 SDValue Ix = DAG.getNode(ISD::ADD, dl, PtrVT, PtrOff,
6190 SDValue Load =
6231 SDValue Store =
6235 SDValue Load = DAG.getLoad(IsF32 ? MVT::v4f32 : MVT::v4f64, dl, Store,
6244 SDValue Ix = DAG.getNode(ISD::ADD, dl, PtrVT, PtrOff,
6246 SDValue Load =
6292 SDValue Val = DAG.getCopyFromReg(Chain, dl, PPC::X2, MVT::i64);
6295 SDValue PtrOff = DAG.getIntPtrConstant(TOCSaveOffset, dl);
6296 SDValue AddPtr = DAG.getNode(ISD::ADD, dl, PtrVT, StackPtr, PtrOff);
6309 SDValue InFlag;
6325 SDValue PPCTargetLowering::LowerCall_Darwin(
6326 SDValue Chain, SDValue Callee, CallingConv::ID CallConv, bool isVarArg,
6326 SDValue Chain, SDValue Callee, CallingConv::ID CallConv, bool isVarArg,
6329 const SmallVectorImpl<SDValue> &OutVals,
6331 SelectionDAG &DAG, SmallVectorImpl<SDValue> &InVals,
6412 SDValue CallSeqStart = Chain;
6416 SDValue LROp, FPOp;
6422 SDValue StackPtr;
6453 SmallVector<std::pair<unsigned, SDValue>, 8> RegsToPass;
6456 SmallVector<SDValue, 8> MemOpChains;
6458 SDValue Arg = OutVals[i];
6463 SDValue PtrOff;
6486 SDValue Load = DAG.getExtLoad(ISD::EXTLOAD, dl, PtrVT, Chain, Arg,
6493 SDValue Const = DAG.getConstant(PtrByteSize - Size, dl,
6495 SDValue AddPtr = DAG.getNode(ISD::ADD, dl, PtrVT, PtrOff, Const);
6514 SDValue Const = DAG.getConstant(j, dl, PtrOff.getValueType());
6515 SDValue AddArg = DAG.getNode(ISD::ADD, dl, PtrVT, Arg, Const);
6517 SDValue Load =
6553 SDValue Store =
6559 SDValue Load =
6565 SDValue ConstFour = DAG.getConstant(4, dl, PtrOff.getValueType());
6567 SDValue Load =
6610 SDValue Store =
6614 SDValue Load =
6623 SDValue Ix = DAG.getNode(ISD::ADD, dl, PtrVT, PtrOff,
6625 SDValue Load =
6659 SDValue Arg = OutVals[i];
6664 SDValue PtrOff;
6690 SDValue InFlag;
6781 SDValue PPCTargetLowering::LowerCall_AIX(
6782 SDValue Chain, SDValue Callee, CallingConv::ID CallConv, bool isVarArg,
6782 SDValue Chain, SDValue Callee, CallingConv::ID CallConv, bool isVarArg,
6785 const SmallVectorImpl<SDValue> &OutVals,
6787 SelectionDAG &DAG, SmallVectorImpl<SDValue> &InVals,
6832 SDValue CallSeqStart = Chain;
6834 SmallVector<std::pair<unsigned, SDValue>, 8> RegsToPass;
6837 SDValue Arg = OutVals[VA.getValNo()];
6860 SDValue InFlag;
6886 SDValue
6887 PPCTargetLowering::LowerReturn(SDValue Chain, CallingConv::ID CallConv,
6890 const SmallVectorImpl<SDValue> &OutVals,
6900 SDValue Flag;
6901 SmallVector<SDValue, 4> RetOps(1, Chain);
6908 SDValue Arg = OutVals[RealResIdx];
6926 SDValue SVal =
6970 SDValue
6971 PPCTargetLowering::LowerGET_DYNAMIC_AREA_OFFSET(SDValue Op,
6979 SDValue Chain = Op.getOperand(0);
6980 SDValue FPSIdx = getFramePointerFrameIndex(DAG);
6982 SDValue Ops[2] = {Chain, FPSIdx};
6987 SDValue PPCTargetLowering::LowerSTACKRESTORE(SDValue Op,
6987 SDValue PPCTargetLowering::LowerSTACKRESTORE(SDValue Op,
6998 SDValue StackPtr = DAG.getRegister(SP, PtrVT);
7001 SDValue Chain = Op.getOperand(0);
7002 SDValue SaveSP = Op.getOperand(1);
7005 SDValue LoadLinkSP =
7015 SDValue PPCTargetLowering::getReturnAddrFrameIndex(SelectionDAG &DAG) const {
7037 SDValue
7060 SDValue PPCTargetLowering::LowerDYNAMIC_STACKALLOC(SDValue Op,
7060 SDValue PPCTargetLowering::LowerDYNAMIC_STACKALLOC(SDValue Op,
7063 SDValue Chain = Op.getOperand(0);
7064 SDValue Size = Op.getOperand(1);
7070 SDValue NegSize = DAG.getNode(ISD::SUB, dl, PtrVT,
7073 SDValue FPSIdx = getFramePointerFrameIndex(DAG);
7075 SDValue Ops[3] = { Chain, NegSize, FPSIdx };
7080 SDValue PPCTargetLowering::LowerEH_DWARF_CFA(SDValue Op,
7080 SDValue PPCTargetLowering::LowerEH_DWARF_CFA(SDValue Op,
7091 SDValue PPCTargetLowering::lowerEH_SJLJ_SETJMP(SDValue Op,
7091 SDValue PPCTargetLowering::lowerEH_SJLJ_SETJMP(SDValue Op,
7099 SDValue PPCTargetLowering::lowerEH_SJLJ_LONGJMP(SDValue Op,
7099 SDValue PPCTargetLowering::lowerEH_SJLJ_LONGJMP(SDValue Op,
7106 SDValue PPCTargetLowering::LowerLOAD(SDValue Op, SelectionDAG &DAG) const {
7106 SDValue PPCTargetLowering::LowerLOAD(SDValue Op, SelectionDAG &DAG) const {
7118 SDValue Chain = LD->getChain();
7119 SDValue BasePtr = LD->getBasePtr();
7122 SDValue NewLD =
7125 SDValue Result = DAG.getNode(ISD::TRUNCATE, dl, MVT::i1, NewLD);
7127 SDValue Ops[] = { Result, SDValue(NewLD.getNode(), 1) };
7131 SDValue PPCTargetLowering::LowerSTORE(SDValue Op, SelectionDAG &DAG) const {
7131 SDValue PPCTargetLowering::LowerSTORE(SDValue Op, SelectionDAG &DAG) const {
7143 SDValue Chain = ST->getChain();
7144 SDValue BasePtr = ST->getBasePtr();
7145 SDValue Value = ST->getValue();
7154 SDValue PPCTargetLowering::LowerTRUNCATE(SDValue Op, SelectionDAG &DAG) const {
7154 SDValue PPCTargetLowering::LowerTRUNCATE(SDValue Op, SelectionDAG &DAG) const {
7163 SDValue PPCTargetLowering::LowerTRUNCATEVector(SDValue Op,
7163 SDValue PPCTargetLowering::LowerTRUNCATEVector(SDValue Op,
7188 SDValue N1 = Op.getOperand(0);
7191 SDValue WideSrc = SrcSize == 128 ? N1 : widenVec(DAG, N1, DL);
7214 SDValue Conv = DAG.getNode(ISD::BITCAST, DL, WideVT, WideSrc);
7220 SDValue PPCTargetLowering::LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const {
7220 SDValue PPCTargetLowering::LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const {
7239 SDValue LHS = Op.getOperand(0), RHS = Op.getOperand(1);
7240 SDValue TV = Op.getOperand(2), FV = Op.getOperand(3);
7266 SDValue Sel1;
7302 SDValue Cmp;
7345 void PPCTargetLowering::LowerFP_TO_INTForReuse(SDValue Op, ReuseLoadInfo &RLI,
7349 SDValue Src = Op.getOperand(0);
7353 SDValue Tmp;
7375 SDValue FIPtr = DAG.CreateStackTemporary(i32Stack ? MVT::i32 : MVT::f64);
7381 SDValue Chain;
7386 SDValue Ops[] = { DAG.getEntryNode(), Tmp, FIPtr };
7408 SDValue PPCTargetLowering::LowerFP_TO_INTDirectMove(SDValue Op,
7408 SDValue PPCTargetLowering::LowerFP_TO_INTDirectMove(SDValue Op,
7412 SDValue Src = Op.getOperand(0);
7417 SDValue Tmp;
7440 SDValue PPCTargetLowering::LowerFP_TO_INT(SDValue Op, SelectionDAG &DAG,
7440 SDValue PPCTargetLowering::LowerFP_TO_INT(SDValue Op, SelectionDAG &DAG,
7452 SDValue Lo = DAG.getNode(ISD::EXTRACT_ELEMENT, dl,
7455 SDValue Hi = DAG.getNode(ISD::EXTRACT_ELEMENT, dl,
7460 SDValue Res = DAG.getNode(PPCISD::FADDRTZ, dl, MVT::f64, Lo, Hi);
7468 SDValue Tmp = DAG.getConstantFP(APF, dl, MVT::ppcf128);
7472 SDValue True = DAG.getNode(ISD::FSUB, dl, MVT::ppcf128,
7477 SDValue False = DAG.getNode(ISD::FP_TO_SINT, dl, MVT::i32,
7505 bool PPCTargetLowering::canReuseLoadAddress(SDValue Op, EVT MemVT,
7551 void PPCTargetLowering::spliceIntoChain(SDValue ResChain,
7552 SDValue NewResChain,
7559 SDValue TF = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
7571 bool PPCTargetLowering::directMoveIsProfitable(const SDValue &Op) const {
7601 SDValue PPCTargetLowering::LowerINT_TO_FPDirectMove(SDValue Op,
7601 SDValue PPCTargetLowering::LowerINT_TO_FPDirectMove(SDValue Op,
7609 SDValue FP;
7610 SDValue Src = Op.getOperand(0);
7630 static SDValue widenVec(SelectionDAG &DAG, SDValue Vec, const SDLoc &dl) {
7630 static SDValue widenVec(SelectionDAG &DAG, SDValue Vec, const SDLoc &dl) {
7641 SmallVector<SDValue, 16> Ops(NumConcat);
7643 SDValue UndefVec = DAG.getUNDEF(VecVT);
7650 SDValue PPCTargetLowering::LowerINT_TO_FPVector(SDValue Op, SelectionDAG &DAG,
7650 SDValue PPCTargetLowering::LowerINT_TO_FPVector(SDValue Op, SelectionDAG &DAG,
7662 SDValue Wide = widenVec(DAG, Op.getOperand(0), dl);
7680 SDValue ShuffleSrc2 =
7682 SDValue Arrange = DAG.getVectorShuffle(WideVT, dl, Wide, ShuffleSrc2, ShuffV);
7686 SDValue Extend;
7697 SDValue PPCTargetLowering::LowerINT_TO_FP(SDValue Op,
7697 SDValue PPCTargetLowering::LowerINT_TO_FP(SDValue Op,
7715 SDValue Value = Op.getOperand(0);
7721 SDValue FPHalfs = DAG.getConstantFP(0.5, dl, MVT::v4f64);
7762 SDValue SINT = Op.getOperand(0);
7783 SDValue Round = DAG.getNode(ISD::AND, dl, MVT::i64,
7799 SDValue Cond = DAG.getNode(ISD::SRA, dl, MVT::i64,
7810 SDValue Bits;
7822 SDValue Ops[] = { RLI.Chain, RLI.Ptr };
7832 SDValue Ops[] = { RLI.Chain, RLI.Ptr };
7846 SDValue FIdx = DAG.getFrameIndex(FrameIdx, PtrVT);
7848 SDValue Store =
7865 SDValue Ops[] = { RLI.Chain, RLI.Ptr };
7873 SDValue FP = DAG.getNode(FCFOp, dl, FCFTy, Bits);
7891 SDValue Ld;
7898 SDValue FIdx = DAG.getFrameIndex(FrameIdx, PtrVT);
7900 SDValue Store =
7918 SDValue Ops[] = { RLI.Chain, RLI.Ptr };
7930 SDValue FIdx = DAG.getFrameIndex(FrameIdx, PtrVT);
7932 SDValue Ext64 = DAG.getNode(ISD::SIGN_EXTEND, dl, MVT::i64,
7936 SDValue Store = DAG.getStore(
7947 SDValue FP = DAG.getNode(FCFOp, dl, FCFTy, Ld);
7954 SDValue PPCTargetLowering::LowerFLT_ROUNDS_(SDValue Op,
7954 SDValue PPCTargetLowering::LowerFLT_ROUNDS_(SDValue Op,
7985 SDValue Chain = DAG.getNode(PPCISD::MFFS, dl, NodeTys, None);
7989 SDValue StackSlot = DAG.getFrameIndex(SSFI, PtrVT);
7990 SDValue Store = DAG.getStore(DAG.getEntryNode(), dl, Chain, StackSlot,
7994 SDValue Four = DAG.getConstant(4, dl, PtrVT);
7995 SDValue Addr = DAG.getNode(ISD::ADD, dl, PtrVT, StackSlot, Four);
7996 SDValue CWD = DAG.getLoad(MVT::i32, dl, Store, Addr, MachinePointerInfo());
7999 SDValue CWD1 =
8002 SDValue CWD2 =
8010 SDValue RetVal =
8017 SDValue PPCTargetLowering::LowerSHL_PARTS(SDValue Op, SelectionDAG &DAG) const {
8017 SDValue PPCTargetLowering::LowerSHL_PARTS(SDValue Op, SelectionDAG &DAG) const {
8027 SDValue Lo = Op.getOperand(0);
8028 SDValue Hi = Op.getOperand(1);
8029 SDValue Amt = Op.getOperand(2);
8032 SDValue Tmp1 = DAG.getNode(ISD::SUB, dl, AmtVT,
8034 SDValue Tmp2 = DAG.getNode(PPCISD::SHL, dl, VT, Hi, Amt);
8035 SDValue Tmp3 = DAG.getNode(PPCISD::SRL, dl, VT, Lo, Tmp1);
8036 SDValue Tmp4 = DAG.getNode(ISD::OR , dl, VT, Tmp2, Tmp3);
8037 SDValue Tmp5 = DAG.getNode(ISD::ADD, dl, AmtVT, Amt,
8039 SDValue Tmp6 = DAG.getNode(PPCISD::SHL, dl, VT, Lo, Tmp5);
8040 SDValue OutHi = DAG.getNode(ISD::OR, dl, VT, Tmp4, Tmp6);
8041 SDValue OutLo = DAG.getNode(PPCISD::SHL, dl, VT, Lo, Amt);
8042 SDValue OutOps[] = { OutLo, OutHi };
8046 SDValue PPCTargetLowering::LowerSRL_PARTS(SDValue Op, SelectionDAG &DAG) const {
8046 SDValue PPCTargetLowering::LowerSRL_PARTS(SDValue Op, SelectionDAG &DAG) const {
8056 SDValue Lo = Op.getOperand(0);
8057 SDValue Hi = Op.getOperand(1);
8058 SDValue Amt = Op.getOperand(2);
8061 SDValue Tmp1 = DAG.getNode(ISD::SUB, dl, AmtVT,
8063 SDValue Tmp2 = DAG.getNode(PPCISD::SRL, dl, VT, Lo, Amt);
8064 SDValue Tmp3 = DAG.getNode(PPCISD::SHL, dl, VT, Hi, Tmp1);
8065 SDValue Tmp4 = DAG.getNode(ISD::OR, dl, VT, Tmp2, Tmp3);
8066 SDValue Tmp5 = DAG.getNode(ISD::ADD, dl, AmtVT, Amt,
8068 SDValue Tmp6 = DAG.getNode(PPCISD::SRL, dl, VT, Hi, Tmp5);
8069 SDValue OutLo = DAG.getNode(ISD::OR, dl, VT, Tmp4, Tmp6);
8070 SDValue OutHi = DAG.getNode(PPCISD::SRL, dl, VT, Hi, Amt);
8071 SDValue OutOps[] = { OutLo, OutHi };
8075 SDValue PPCTargetLowering::LowerSRA_PARTS(SDValue Op, SelectionDAG &DAG) const {
8075 SDValue PPCTargetLowering::LowerSRA_PARTS(SDValue Op, SelectionDAG &DAG) const {
8084 SDValue Lo = Op.getOperand(0);
8085 SDValue Hi = Op.getOperand(1);
8086 SDValue Amt = Op.getOperand(2);
8089 SDValue Tmp1 = DAG.getNode(ISD::SUB, dl, AmtVT,
8091 SDValue Tmp2 = DAG.getNode(PPCISD::SRL, dl, VT, Lo, Amt);
8092 SDValue Tmp3 = DAG.getNode(PPCISD::SHL, dl, VT, Hi, Tmp1);
8093 SDValue Tmp4 = DAG.getNode(ISD::OR, dl, VT, Tmp2, Tmp3);
8094 SDValue Tmp5 = DAG.getNode(ISD::ADD, dl, AmtVT, Amt,
8096 SDValue Tmp6 = DAG.getNode(PPCISD::SRA, dl, VT, Hi, Tmp5);
8097 SDValue OutHi = DAG.getNode(PPCISD::SRA, dl, VT, Hi, Amt);
8098 SDValue OutLo = DAG.getSelectCC(dl, Tmp5, DAG.getConstant(0, dl, AmtVT),
8100 SDValue OutOps[] = { OutLo, OutHi };
8110 static SDValue BuildSplatI(int Val, unsigned SplatSize, EVT VT,
8132 static SDValue BuildIntrinsicOp(unsigned IID, SDValue Op, SelectionDAG &DAG,
8132 static SDValue BuildIntrinsicOp(unsigned IID, SDValue Op, SelectionDAG &DAG,
8141 static SDValue BuildIntrinsicOp(unsigned IID, SDValue LHS, SDValue RHS,
8141 static SDValue BuildIntrinsicOp(unsigned IID, SDValue LHS, SDValue RHS,
8141 static SDValue BuildIntrinsicOp(unsigned IID, SDValue LHS, SDValue RHS,
8151 static SDValue BuildIntrinsicOp(unsigned IID, SDValue Op0, SDValue Op1,
8151 static SDValue BuildIntrinsicOp(unsigned IID, SDValue Op0, SDValue Op1,
8151 static SDValue BuildIntrinsicOp(unsigned IID, SDValue Op0, SDValue Op1,
8152 SDValue Op2, SelectionDAG &DAG, const SDLoc &dl,
8161 static SDValue BuildVSLDOI(SDValue LHS, SDValue RHS, unsigned Amt, EVT VT,
8161 static SDValue BuildVSLDOI(SDValue LHS, SDValue RHS, unsigned Amt, EVT VT,
8161 static SDValue BuildVSLDOI(SDValue LHS, SDValue RHS, unsigned Amt, EVT VT,
8170 SDValue T = DAG.getVectorShuffle(MVT::v16i8, dl, LHS, RHS, Ops);
8198 SDValue Op0 = V->getOperand(0);
8228 SDValue PPCTargetLowering::LowerBITCAST(SDValue Op, SelectionDAG &DAG) const {
8228 SDValue PPCTargetLowering::LowerBITCAST(SDValue Op, SelectionDAG &DAG) const {
8231 SDValue Op0 = Op->getOperand(0);
8244 static const SDValue *getNormalLoadInput(const SDValue &Op) {
8244 static const SDValue *getNormalLoadInput(const SDValue &Op) {
8245 const SDValue *InputLoad = &Op;
8261 SDValue PPCTargetLowering::LowerBUILD_VECTOR(SDValue Op,
8261 SDValue PPCTargetLowering::LowerBUILD_VECTOR(SDValue Op,
8276 SDValue FIdx = DAG.getFrameIndex(FrameIdx, PtrVT);
8307 SDValue CPIdx = DAG.getConstantPool(CP, getPointerTy(DAG.getDataLayout()),
8310 SDValue Ops[] = {DAG.getEntryNode(), CPIdx};
8317 SmallVector<SDValue, 4> Stores;
8322 SDValue Idx = DAG.getConstant(Offset, dl, FIdx.getValueType());
8331 SDValue StoreValue = BVN->getOperand(i);
8340 SDValue StoreChain;
8351 SDValue Ops[] = {StoreChain,
8356 SDValue LoadedVect = DAG.getMemIntrinsicNode(ISD::INTRINSIC_W_CHAIN,
8362 SDValue FPZeros = DAG.getConstantFP(0.0, dl, MVT::v4f64);
8379 const SDValue *InputLoad = getNormalLoadInput(Op.getOperand(0));
8394 SDValue Ops[] = {
8426 SDValue Z = DAG.getConstant(0, dl, MVT::v4i32);
8438 SmallVector<SDValue, 16> Ops(16, DAG.getConstant(SplatBits,
8440 SDValue NewBV = DAG.getBuildVector(MVT::v16i8, dl, Ops);
8476 SDValue Elt = DAG.getConstant(SextVal, dl, MVT::i32);
8479 SDValue EltSize = DAG.getConstant(SplatSize, dl, MVT::i32);
8480 SDValue RetVal = DAG.getNode(PPCISD::VADD_SPLAT, dl, VT, Elt, EltSize);
8492 SDValue OnesV = BuildSplatI(-1, 4, MVT::v4i32, DAG, dl);
8495 SDValue Res = BuildIntrinsicOp(Intrinsic::ppc_altivec_vslw, OnesV,
8520 SDValue Res = BuildSplatI(i, SplatSize, MVT::Other, DAG, dl);
8531 SDValue Res = BuildSplatI(i, SplatSize, MVT::Other, DAG, dl);
8542 SDValue Res = BuildSplatI(i, SplatSize, MVT::Other, DAG, dl);
8554 SDValue Res = BuildSplatI(i, SplatSize, MVT::Other, DAG, dl);
8565 SDValue T = BuildSplatI(i, SplatSize, MVT::v16i8, DAG, dl);
8571 SDValue T = BuildSplatI(i, SplatSize, MVT::v16i8, DAG, dl);
8577 SDValue T = BuildSplatI(i, SplatSize, MVT::v16i8, DAG, dl);
8588 static SDValue GeneratePerfectShuffle(unsigned PFEntry, SDValue LHS,
8588 static SDValue GeneratePerfectShuffle(unsigned PFEntry, SDValue LHS,
8589 SDValue RHS, SelectionDAG &DAG,
8614 SDValue OpLHS, OpRHS;
8659 SDValue T = DAG.getVectorShuffle(MVT::v16i8, dl, OpLHS, OpRHS, ShufIdxs);
8666 SDValue PPCTargetLowering::lowerToVINSERTB(ShuffleVectorSDNode *N,
8671 SDValue V1 = N->getOperand(0);
8672 SDValue V2 = N->getOperand(1);
8755 SDValue Shl = DAG.getNode(PPCISD::VECSHL, dl, MVT::v16i8, V2, V2,
8767 SDValue PPCTargetLowering::lowerToVINSERTH(ShuffleVectorSDNode *N,
8777 SDValue V1 = N->getOperand(0);
8778 SDValue V2 = N->getOperand(1);
8860 SDValue Conv1 = DAG.getNode(ISD::BITCAST, dl, MVT::v8i16, V1);
8863 SDValue Shl = DAG.getNode(PPCISD::VECSHL, dl, MVT::v16i8, V2, V2,
8865 SDValue Conv2 = DAG.getNode(ISD::BITCAST, dl, MVT::v8i16, Shl);
8866 SDValue Ins = DAG.getNode(PPCISD::VECINSERT, dl, MVT::v8i16, Conv1, Conv2,
8870 SDValue Conv2 = DAG.getNode(ISD::BITCAST, dl, MVT::v8i16, V2);
8871 SDValue Ins = DAG.getNode(PPCISD::VECINSERT, dl, MVT::v8i16, Conv1, Conv2,
8880 SDValue PPCTargetLowering::LowerVECTOR_SHUFFLE(SDValue Op,
8880 SDValue PPCTargetLowering::LowerVECTOR_SHUFFLE(SDValue Op,
8883 SDValue V1 = Op.getOperand(0);
8884 SDValue V2 = Op.getOperand(1);
8895 const SDValue *InputLoad = getNormalLoadInput(V1);
8911 SDValue BasePtr = LD->getBasePtr();
8915 SDValue Ops[] = {
8922 SDValue LdSplt =
8935 SDValue Conv1 = DAG.getNode(ISD::BITCAST, dl, MVT::v4i32, V1);
8936 SDValue Conv2 = DAG.getNode(ISD::BITCAST, dl, MVT::v4i32, V2);
8938 SDValue Shl = DAG.getNode(PPCISD::VECSHL, dl, MVT::v4i32, Conv2, Conv2,
8940 SDValue Ins = DAG.getNode(PPCISD::VECINSERT, dl, MVT::v4i32, Conv1, Shl,
8944 SDValue Ins = DAG.getNode(PPCISD::VECINSERT, dl, MVT::v4i32, Conv1, Conv2,
8950 SDValue NewISDNode;
8962 SDValue Conv1 = DAG.getNode(ISD::BITCAST, dl, MVT::v4i32, V1);
8963 SDValue Conv2 =
8966 SDValue Shl = DAG.getNode(PPCISD::VECSHL, dl, MVT::v4i32, Conv1, Conv2,
8975 SDValue Conv1 = DAG.getNode(ISD::BITCAST, dl, MVT::v2i64, V1);
8976 SDValue Conv2 =
8979 SDValue PermDI = DAG.getNode(PPCISD::XXPERMDI, dl, MVT::v2i64, Conv1, Conv2,
8986 SDValue Conv = DAG.getNode(ISD::BITCAST, dl, MVT::v8i16, V1);
8987 SDValue ReveHWord = DAG.getNode(PPCISD::XXREVERSE, dl, MVT::v8i16, Conv);
8990 SDValue Conv = DAG.getNode(ISD::BITCAST, dl, MVT::v4i32, V1);
8991 SDValue ReveWord = DAG.getNode(PPCISD::XXREVERSE, dl, MVT::v4i32, Conv);
8994 SDValue Conv = DAG.getNode(ISD::BITCAST, dl, MVT::v2i64, V1);
8995 SDValue ReveDWord = DAG.getNode(PPCISD::XXREVERSE, dl, MVT::v2i64, Conv);
8998 SDValue Conv = DAG.getNode(ISD::BITCAST, dl, MVT::v1i128, V1);
8999 SDValue ReveQWord = DAG.getNode(PPCISD::XXREVERSE, dl, MVT::v1i128, Conv);
9008 SDValue Conv = DAG.getNode(ISD::BITCAST, dl, MVT::v4i32, V1);
9009 SDValue Splat = DAG.getNode(PPCISD::XXSPLT, dl, MVT::v4i32, Conv,
9016 SDValue Conv = DAG.getNode(ISD::BITCAST, dl, MVT::v2f64, V1);
9017 SDValue Swap = DAG.getNode(PPCISD::SWAP_NO_CHAIN, dl, MVT::v2f64, Conv);
9053 SDValue V3 = DAG.getNode(PPCISD::QVGPCI, dl, MVT::v4f64,
9171 SmallVector<SDValue, 16> ResultMask;
9184 SDValue VPermMask = DAG.getBuildVector(MVT::v16i8, dl, ResultMask);
9196 static bool getVectorCompareInfo(SDValue Intrin, int &CompareOpc,
9442 SDValue PPCTargetLowering::LowerINTRINSIC_WO_CHAIN(SDValue Op,
9442 SDValue PPCTargetLowering::LowerINTRINSIC_WO_CHAIN(SDValue Op,
9465 SDValue Tmp = DAG.getNode(PPCISD::VCMP, dl, Op.getOperand(2).getValueType(),
9472 SDValue Ops[] = {
9478 SDValue CompNode = DAG.getNode(PPCISD::VCMPo, dl, VTs, Ops);
9482 SDValue Flags = DAG.getNode(PPCISD::MFOCRF, dl, MVT::i32,
9519 SDValue PPCTargetLowering::LowerINTRINSIC_VOID(SDValue Op,
9519 SDValue PPCTargetLowering::LowerINTRINSIC_VOID(SDValue Op,
9541 SDValue PPCTargetLowering::LowerREM(SDValue Op, SelectionDAG &DAG) const {
9541 SDValue PPCTargetLowering::LowerREM(SDValue Op, SelectionDAG &DAG) const {
9554 SDValue PPCTargetLowering::LowerBSWAP(SDValue Op, SelectionDAG &DAG) const {
9554 SDValue PPCTargetLowering::LowerBSWAP(SDValue Op, SelectionDAG &DAG) const {
9572 SDValue PPCTargetLowering::LowerATOMIC_CMP_SWAP(SDValue Op,
9572 SDValue PPCTargetLowering::LowerATOMIC_CMP_SWAP(SDValue Op,
9582 SDValue CmpOp = Op.getOperand(2);
9590 SDValue NewCmpOp =
9595 SmallVector<SDValue, 4> Ops;
9606 SDValue PPCTargetLowering::LowerSCALAR_TO_VECTOR(SDValue Op,
9606 SDValue PPCTargetLowering::LowerSCALAR_TO_VECTOR(SDValue Op,
9613 SDValue FIdx = DAG.getFrameIndex(FrameIdx, PtrVT);
9616 SDValue Store = DAG.getStore(DAG.getEntryNode(), dl, Op.getOperand(0), FIdx,
9622 SDValue PPCTargetLowering::LowerINSERT_VECTOR_ELT(SDValue Op,
9622 SDValue PPCTargetLowering::LowerINSERT_VECTOR_ELT(SDValue Op,
9634 SDValue V1 = Op.getOperand(0);
9635 SDValue V2 = Op.getOperand(1);
9638 SDValue Mtvsrz = DAG.getNode(PPCISD::MTVSRZ, dl, VT, V2);
9651 SDValue PPCTargetLowering::LowerEXTRACT_VECTOR_ELT(SDValue Op,
9651 SDValue PPCTargetLowering::LowerEXTRACT_VECTOR_ELT(SDValue Op,
9659 SDValue Value = N->getOperand(0);
9671 SDValue FPHalfs = DAG.getConstantFP(0.5, dl, MVT::v4f64);
9685 SDValue FIdx = DAG.getFrameIndex(FrameIdx, PtrVT);
9687 SDValue StoreChain = DAG.getEntryNode();
9688 SDValue Ops[] = {StoreChain,
9698 SDValue Idx = DAG.getConstant(Offset, dl, FIdx.getValueType());
9701 SDValue IntVal =
9711 SDValue PPCTargetLowering::LowerVectorLoad(SDValue Op,
9711 SDValue PPCTargetLowering::LowerVectorLoad(SDValue Op,
9715 SDValue LoadChain = LN->getChain();
9716 SDValue BasePtr = LN->getBasePtr();
9731 SDValue Vals[4], LoadChains[4];
9733 SDValue Load;
9761 SDValue TF = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, LoadChains);
9762 SDValue Value = DAG.getBuildVector(Op.getValueType(), dl, Vals);
9765 SDValue RetOps[] = { Value, Vals[0].getValue(1), TF };
9769 SDValue RetOps[] = { Value, TF };
9779 SDValue VectElmts[4], VectElmtChains[4];
9781 SDValue Idx = DAG.getConstant(i, dl, BasePtr.getValueType());
9792 SDValue Value = DAG.getBuildVector(MVT::v4i1, dl, VectElmts);
9794 SDValue RVals[] = { Value, LoadChain };
9799 SDValue PPCTargetLowering::LowerVectorStore(SDValue Op,
9799 SDValue PPCTargetLowering::LowerVectorStore(SDValue Op,
9803 SDValue StoreChain = SN->getChain();
9804 SDValue BasePtr = SN->getBasePtr();
9805 SDValue Value = SN->getValue();
9820 SDValue Stores[4];
9822 SDValue Ex = DAG.getNode(
9825 SDValue Store;
9851 SDValue TF = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Stores);
9854 SDValue RetOps[] = { TF, Stores[0].getValue(1) };
9871 SDValue FPHalfs = DAG.getConstantFP(0.5, dl, MVT::v4f64);
9885 SDValue FIdx = DAG.getFrameIndex(FrameIdx, PtrVT);
9887 SDValue Ops[] = {StoreChain,
9896 SDValue Loads[4], LoadChains[4];
9899 SDValue Idx = DAG.getConstant(Offset, dl, FIdx.getValueType());
9909 SDValue Stores[4];
9911 SDValue Idx = DAG.getConstant(i, dl, BasePtr.getValueType());
9925 SDValue PPCTargetLowering::LowerMUL(SDValue Op, SelectionDAG &DAG) const {
9925 SDValue PPCTargetLowering::LowerMUL(SDValue Op, SelectionDAG &DAG) const {
9928 SDValue LHS = Op.getOperand(0), RHS = Op.getOperand(1);
9930 SDValue Zero = BuildSplatI( 0, 1, MVT::v4i32, DAG, dl);
9931 SDValue Neg16 = BuildSplatI(-16, 4, MVT::v4i32, DAG, dl);//+16 as shift amt.
9933 SDValue RHSSwap = // = vrlw RHS, 16
9943 SDValue LoProd = BuildIntrinsicOp(Intrinsic::ppc_altivec_vmulouh,
9946 SDValue HiProd = BuildIntrinsicOp(Intrinsic::ppc_altivec_vmsumuhm,
9953 SDValue LHS = Op.getOperand(0), RHS = Op.getOperand(1);
9955 SDValue Zero = BuildSplatI(0, 1, MVT::v8i16, DAG, dl);
9960 SDValue LHS = Op.getOperand(0), RHS = Op.getOperand(1);
9964 SDValue EvenParts = BuildIntrinsicOp(Intrinsic::ppc_altivec_vmuleub,
9969 SDValue OddParts = BuildIntrinsicOp(Intrinsic::ppc_altivec_vmuloub,
9996 SDValue PPCTargetLowering::LowerABS(SDValue Op, SelectionDAG &DAG) const {
9996 SDValue PPCTargetLowering::LowerABS(SDValue Op, SelectionDAG &DAG) const {
10016 SDValue X = Op.getOperand(0);
10017 SDValue Zero = DAG.getConstant(0, dl, VT);
10018 SDValue Y = DAG.getNode(ISD::SUB, dl, VT, Zero, X);
10035 SDValue PPCTargetLowering::LowerFP_EXTEND(SDValue Op, SelectionDAG &DAG) const {
10035 SDValue PPCTargetLowering::LowerFP_EXTEND(SDValue Op, SelectionDAG &DAG) const {
10046 SDValue Op0 = Op.getOperand(0);
10078 SDValue NewLoad[2];
10081 SDValue LdOp = Op0.getOperand(i);
10086 SDValue LoadOps[] = {LD->getChain(), LD->getBasePtr()};
10091 SDValue NewOp =
10099 SDValue LoadOps[] = {LD->getChain(), LD->getBasePtr()};
10100 SDValue NewLd = DAG.getMemIntrinsicNode(
10112 SDValue PPCTargetLowering::LowerOperation(SDValue Op, SelectionDAG &DAG) const {
10112 SDValue PPCTargetLowering::LowerOperation(SDValue Op, SelectionDAG &DAG) const {
10187 SmallVectorImpl<SDValue>&Results,
10195 SDValue RTB = DAG.getNode(PPCISD::READ_TIME_BASE, dl, VTs, N->getOperand(0));
10212 SDValue NewInt = DAG.getNode(N->getOpcode(), dl, VTs, N->getOperand(0),
10226 SDValue NewNode = LowerVAARG(SDValue(N, 1), DAG);
11645 SDValue PPCTargetLowering::getSqrtEstimate(SDValue Operand, SelectionDAG &DAG,
11645 SDValue PPCTargetLowering::getSqrtEstimate(SDValue Operand, SelectionDAG &DAG,
11667 SDValue PPCTargetLowering::getRecipEstimate(SDValue Operand, SelectionDAG &DAG,
11667 SDValue PPCTargetLowering::getRecipEstimate(SDValue Operand, SelectionDAG &DAG,
11709 static void getBaseWithConstantOffset(SDValue Loc, SDValue &Base,
11709 static void getBaseWithConstantOffset(SDValue Loc, SDValue &Base,
11721 static bool isConsecutiveLSLoc(SDValue Loc, EVT VT, LSBaseSDNode *Base,
11727 SDValue BaseLoc = Base->getBasePtr();
11740 SDValue Base1 = Loc, Base2 = BaseLoc;
11766 SDValue Loc = LS->getBasePtr();
11875 SDValue Chain = LD->getChain();
11941 static SDValue generateEquivalentSub(SDNode *N, int Size, bool Complement,
11947 auto Op0 = DAG.getNode(ISD::ZERO_EXTEND, DL, MVT::i64, N->getOperand(0),
11949 auto Op1 = DAG.getNode(ISD::ZERO_EXTEND, DL, MVT::i64, N->getOperand(1),
11957 auto SubNode = DAG.getNode(ISD::SUB, DL, MVT::i64, Op0, Op1);
11961 auto Shifted = DAG.getNode(ISD::SRL, DL, MVT::i64, SubNode,
11963 auto Final = Shifted;
11973 SDValue PPCTargetLowering::ConvertSETCCToSubtract(SDNode *N,
12015 SDValue PPCTargetLowering::DAGCombineTruncBoolExt(SDNode *N,
12100 SmallVector<SDValue, 4> Inputs;
12101 SmallVector<SDValue, 8> BinOps, PromOps;
12121 SDValue BinOp = BinOps.back();
12225 for (auto &PromOp : PromOps)
12234 SDValue PromOp = PromOpHandles.back().getValue();
12248 SDValue RepValue = PromOp.getOperand(0);
12275 SmallVector<SDValue, 3> Ops(PromOp.getNode()->op_begin(),
12296 SDValue PPCTargetLowering::DAGCombineExtBoolTrunc(SDNode *N,
12330 SmallVector<SDValue, 4> Inputs;
12331 SmallVector<SDValue, 8> BinOps(1, N->getOperand(0)), PromOps;
12337 SDValue BinOp = BinOps.back();
12464 SDValue InSrc = Inputs[i].getOperand(0);
12479 for (auto &PromOp : PromOps)
12487 SDValue PromOp = PromOpHandles.back().getValue();
12522 SmallVector<SDValue, 3> Ops(PromOp.getNode()->op_begin(),
12571 SDValue ShiftCst =
12579 SDValue PPCTargetLowering::combineSetCC(SDNode *N,
12586 SDValue LHS = N->getOperand(0);
12587 SDValue RHS = N->getOperand(1);
12602 SDValue Add = DAG.getNode(ISD::ADD, DL, OpVT, LHS, RHS.getOperand(1));
12611 static bool isFPExtLoad(SDValue Op) {
12625 SDValue PPCTargetLowering::
12634 SDValue FirstInput = N->getOperand(0);
12649 SmallVector<SDValue, 4> Ops;
12652 SDValue NextOp = N->getOperand(i);
12676 SDValue In = N->getOperand(i).getOperand(0);
12683 SDValue Trunc = DAG.getNode(ISD::FP_ROUND, dl,
12700 SDValue BV = DAG.getBuildVector(NewVT, dl, Ops);
12712 static SDValue combineBVOfConsecutiveLoads(SDNode *N, SelectionDAG &DAG) {
12725 SDValue FirstInput = N->getOperand(0);
12743 SDValue NextInput = IsRoundOfExtLoad ? N->getOperand(i).getOperand(0) :
12748 SDValue PreviousInput =
12770 SDValue FirstLoadOp =
12772 SDValue LastLoadOp =
12786 SDValue Load = DAG.getLoad(N->getValueType(0), dl, LDL->getChain(),
12802 static SDValue addShuffleForVecExtend(SDNode *N, SelectionDAG &DAG,
12803 SDValue Input, uint64_t Elems,
12822 SDValue Shuffle =
12827 SDValue BV = DAG.getNode(PPCISD::SExtVElems, dl, Ty, Shuffle);
12836 static SDValue combineBVOfVecSExt(SDNode *N, SelectionDAG &DAG) {
12857 SDValue Input;
12868 SDValue Extract = Op.getOperand(0);
12930 SDValue PPCTargetLowering::DAGCombineBuildVector(SDNode *N,
12944 SDValue FirstInput = N->getOperand(0);
12946 SDValue Reduced = combineElementTruncationToVectorTruncation(N, DCI);
12953 SDValue Reduced = combineBVOfConsecutiveLoads(N, DAG);
12982 SDValue Ext1 = FirstInput.getOperand(0);
12983 SDValue Ext2 = N->getOperand(1).getOperand(0);
13006 SDValue SrcVec = Ext1.getOperand(0);
13013 SDValue PPCTargetLowering::combineFPToIntToFP(SDNode *N,
13024 SDValue Op(N, 0);
13034 SDValue FirstOperand(Op.getOperand(0));
13044 SDValue WidthConst =
13048 SDValue Ops[] = { LDN->getChain(), LDN->getBasePtr(), WidthConst };
13049 SDValue Ld = DAG.getMemIntrinsicNode(PPCISD::LXSIZX, dl,
13055 SDValue ExtOps[] = { Ld, WidthConst };
13056 SDValue Ext = DAG.getNode(PPCISD::VEXTS, dl, MVT::f64, ExtOps);
13089 SDValue Src = Op.getOperand(0).getOperand(0);
13102 SDValue Tmp = DAG.getNode(FCTOp, dl, MVT::f64, Src);
13103 SDValue FP = DAG.getNode(FCFOp, dl, FCFTy, Tmp);
13119 SDValue PPCTargetLowering::expandVSXLoadForLE(SDNode *N,
13123 SDValue Chain;
13124 SDValue Base;
13162 SDValue LoadOps[] = { Chain, Base };
13163 SDValue Load = DAG.getMemIntrinsicNode(PPCISD::LXVD2X, dl,
13169 SDValue Swap = DAG.getNode(
13175 SDValue N = DAG.getNode(ISD::BITCAST, dl, VecTy, Swap);
13187 SDValue PPCTargetLowering::expandVSXStoreForLE(SDNode *N,
13191 SDValue Chain;
13192 SDValue Base;
13223 SDValue Src = N->getOperand(SrcOpnd);
13239 SDValue Swap = DAG.getNode(PPCISD::XXSWAPD, dl,
13243 SDValue StoreOps[] = { Chain, Swap, Base };
13244 SDValue Store = DAG.getMemIntrinsicNode(PPCISD::STXVD2X, dl,
13252 SDValue PPCTargetLowering::combineStoreFPToInt(SDNode *N,
13262 SDValue Val = N->getOperand(1).getOperand(0);
13296 SDValue Ops[] = { N->getOperand(0), Val, N->getOperand(2),
13309 SDValue PPCTargetLowering::combineVReverseMemOP(ShuffleVectorSDNode *SVN,
13346 SDValue LoadOps[] = {LSBase->getChain(), LSBase->getBasePtr()};
13354 SDValue StoreOps[] = {LSBase->getChain(), SVN->getOperand(0),
13364 SDValue PPCTargetLowering::PerformDAGCombine(SDNode *N,
13402 if (SDValue CSCC = combineSetCC(N, DCI))
13422 SDValue Val= combineStoreFPToInt(N, DCI);
13429 SDValue Val= combineVReverseMemOP(SVN, cast<LSBaseSDNode>(N), DCI);
13446 SDValue BSwapOp = N->getOperand(1).getOperand(0);
13462 SDValue Ops[] = {
13479 SDValue Const64 = DAG.getConstant(Val64, dl, MVT::i64);
13581 SDValue BasePtr = LD->getBasePtr();
13592 SDValue FloatLoad = DAG.getLoad(MVT::f32, dl, LD->getChain(), BasePtr,
13595 SDValue AddPtr =
13598 SDValue FloatLoad2 = DAG.getLoad(
13634 SDValue Chain = LD->getChain();
13635 SDValue Ptr = LD->getBasePtr();
13683 SDValue PermCntl = BuildIntrinsicOp(Intr, Ptr, DAG, dl, PermCntlTy);
13697 SDValue LDXIntID =
13699 SDValue BaseLoadOps[] = { Chain, LDXIntID, Ptr };
13700 SDValue BaseLoad =
13722 SDValue Increment =
13729 SDValue ExtraLoadOps[] = { Chain, LDXIntID, Ptr };
13730 SDValue ExtraLoad =
13735 SDValue TF = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
13743 SDValue Perm;
13775 SDValue Add = N->getOperand(1);
13826 SDValue V1 = N->getOperand(1);
13827 SDValue V2 = N->getOperand(2);
13888 SDValue Load = N->getOperand(0);
13891 SDValue Ops[] = {
13896 SDValue BSLoad =
13903 SDValue ResVal = BSLoad;
13970 SDValue Cond = N->getOperand(1);
13971 SDValue Target = N->getOperand(2);
13994 SDValue LHS = N->getOperand(2), RHS = N->getOperand(3);
14049 SDValue Ops[] = {
14055 SDValue CompNode = DAG.getNode(PPCISD::VCMPo, dl, VTs, Ops);
14093 SDValue
14106 SDValue N0 = N->getOperand(0);
14110 SDValue ShiftAmt = DAG.getConstant(Lg2, DL, VT);
14112 SDValue Op = DAG.getNode(PPCISD::SRA_ADDZE, DL, VT, N0, ShiftAmt);
14127 void PPCTargetLowering::computeKnownBitsForTargetNode(const SDValue Op,
14392 void PPCTargetLowering::LowerAsmOperandForConstraint(SDValue Op,
14394 std::vector<SDValue>&Ops,
14396 SDValue Result;
14505 SDValue PPCTargetLowering::LowerRETURNADDR(SDValue Op,
14505 SDValue PPCTargetLowering::LowerRETURNADDR(SDValue Op,
14525 SDValue FrameAddr = LowerFRAMEADDR(Op, DAG);
14526 SDValue Offset =
14535 SDValue RetAddrFI = getReturnAddrFrameIndex(DAG);
14540 SDValue PPCTargetLowering::LowerFRAMEADDR(SDValue Op,
14540 SDValue PPCTargetLowering::LowerFRAMEADDR(SDValue Op,
14560 SDValue FrameAddr = DAG.getCopyFromReg(DAG.getEntryNode(), dl, FrameReg,
14592 bool PPCTargetLowering::isAccessedAsGotIndirect(SDValue GA) const {
14873 bool PPCTargetLowering::isZExtFree(SDValue Val, EVT VT2) const {
15100 static SDValue stripModuloOnShift(const TargetLowering &TLI, SDNode *N,
15102 SDValue N0 = N->getOperand(0);
15103 SDValue N1 = N->getOperand(1);
15132 SDValue PPCTargetLowering::combineSHL(SDNode *N, DAGCombinerInfo &DCI) const {
15133 if (auto Value = stripModuloOnShift(*this, N, DCI.DAG))
15136 SDValue N0 = N->getOperand(0);
15146 SDValue ExtsSrc = N0.getOperand(0);
15152 SDValue ShiftBy = SDValue(CN1, 0);
15162 SDValue PPCTargetLowering::combineSRA(SDNode *N, DAGCombinerInfo &DCI) const {
15163 if (auto Value = stripModuloOnShift(*this, N, DCI.DAG))
15169 SDValue PPCTargetLowering::combineSRL(SDNode *N, DAGCombinerInfo &DCI) const {
15170 if (auto Value = stripModuloOnShift(*this, N, DCI.DAG))
15180 static SDValue combineADDToADDZE(SDNode *N, SelectionDAG &DAG,
15185 SDValue LHS = N->getOperand(0);
15186 SDValue RHS = N->getOperand(1);
15193 SDValue Cmp = Op.getOperand(0);
15219 SDValue Cmp = RHS.getOperand(0);
15220 SDValue Z = Cmp.getOperand(0);
15235 SDValue Add = DAG.getNode(ISD::ADD, DL, MVT::i64, Z,
15237 SDValue AddOrZ = NegConstant != 0 ? Add : Z;
15238 SDValue Addc = DAG.getNode(ISD::ADDC, DL, DAG.getVTList(MVT::i64, MVT::Glue),
15250 SDValue Add = DAG.getNode(ISD::ADD, DL, MVT::i64, Z,
15252 SDValue AddOrZ = NegConstant != 0 ? Add : Z;
15253 SDValue Subc = DAG.getNode(ISD::SUBC, DL, DAG.getVTList(MVT::i64, MVT::Glue),
15263 SDValue PPCTargetLowering::combineADD(SDNode *N, DAGCombinerInfo &DCI) const {
15264 if (auto Value = combineADDToADDZE(N, DCI.DAG, Subtarget))
15279 SDValue PPCTargetLowering::combineTRUNCATE(SDNode *N,
15284 if (SDValue CRTruncValue = DAGCombineTruncBoolExt(N, DCI))
15289 SDValue Op0 = N->getOperand(0);
15314 SDValue Bitcast = DCI.DAG.getBitcast(MVT::v2i64, Op0.getOperand(0));
15322 SDValue PPCTargetLowering::combineMUL(SDNode *N, DAGCombinerInfo &DCI) const {
15373 SDValue Op0 = N->getOperand(0);
15374 SDValue Op1 =
15377 SDValue Res = DAG.getNode(ISD::ADD, DL, VT, Op0, Op1);
15390 SDValue Op0 = N->getOperand(0);
15391 SDValue Op1 =
15471 SDValue PPCTargetLowering::combineABS(SDNode *N, DAGCombinerInfo &DCI) const {
15514 SDValue PPCTargetLowering::combineVSelect(SDNode *N,
15522 SDValue Cond = N->getOperand(0);
15523 SDValue TrueOpnd = N->getOperand(1);
15524 SDValue FalseOpnd = N->getOperand(2);
15554 SDValue CmpOpnd1 = Cond.getOperand(0);
15555 SDValue CmpOpnd2 = Cond.getOperand(1);
lib/Target/PowerPC/PPCISelLowering.h 594 SDValue get_VSPLTI_elt(SDNode *N, unsigned ByteSize, SelectionDAG &DAG);
653 bool hasAndNotCompare(SDValue) const override {
687 bool getPreIndexedAddressParts(SDNode *N, SDValue &Base,
688 SDValue &Offset,
694 bool SelectAddressEVXRegReg(SDValue N, SDValue &Base, SDValue &Index,
694 bool SelectAddressEVXRegReg(SDValue N, SDValue &Base, SDValue &Index,
694 bool SelectAddressEVXRegReg(SDValue N, SDValue &Base, SDValue &Index,
701 bool SelectAddressRegReg(SDValue N, SDValue &Base, SDValue &Index,
701 bool SelectAddressRegReg(SDValue N, SDValue &Base, SDValue &Index,
701 bool SelectAddressRegReg(SDValue N, SDValue &Base, SDValue &Index,
710 bool SelectAddressRegImm(SDValue N, SDValue &Disp, SDValue &Base,
710 bool SelectAddressRegImm(SDValue N, SDValue &Disp, SDValue &Base,
710 bool SelectAddressRegImm(SDValue N, SDValue &Disp, SDValue &Base,
716 bool SelectAddressRegRegOnly(SDValue N, SDValue &Base, SDValue &Index,
716 bool SelectAddressRegRegOnly(SDValue N, SDValue &Base, SDValue &Index,
716 bool SelectAddressRegRegOnly(SDValue N, SDValue &Base, SDValue &Index,
723 SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
723 SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
728 void ReplaceNodeResults(SDNode *N, SmallVectorImpl<SDValue>&Results,
731 SDValue expandVSXLoadForLE(SDNode *N, DAGCombinerInfo &DCI) const;
732 SDValue expandVSXStoreForLE(SDNode *N, DAGCombinerInfo &DCI) const;
734 SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const override;
736 SDValue BuildSDIVPow2(SDNode *N, const APInt &Divisor, SelectionDAG &DAG,
742 void computeKnownBitsForTargetNode(const SDValue Op,
800 void LowerAsmOperandForConstraint(SDValue Op,
802 std::vector<SDValue> &Ops,
844 bool isZExtFree(SDValue Val, EVT VT2) const override;
870 bool isAccessedAsGotIndirect(SDValue N) const;
953 SDValue getPICJumpTableRelocBase(SDValue Table,
953 SDValue getPICJumpTableRelocBase(SDValue Table,
961 SDValue Ptr;
962 SDValue Chain;
963 SDValue ResChain;
988 bool canReuseLoadAddress(SDValue Op, EVT MemVT, ReuseLoadInfo &RLI,
991 void spliceIntoChain(SDValue ResChain, SDValue NewResChain,
991 void spliceIntoChain(SDValue ResChain, SDValue NewResChain,
994 void LowerFP_TO_INTForReuse(SDValue Op, ReuseLoadInfo &RLI,
996 SDValue LowerFP_TO_INTDirectMove(SDValue Op, SelectionDAG &DAG,
996 SDValue LowerFP_TO_INTDirectMove(SDValue Op, SelectionDAG &DAG,
999 bool directMoveIsProfitable(const SDValue &Op) const;
1000 SDValue LowerINT_TO_FPDirectMove(SDValue Op, SelectionDAG &DAG,
1000 SDValue LowerINT_TO_FPDirectMove(SDValue Op, SelectionDAG &DAG,
1003 SDValue LowerINT_TO_FPVector(SDValue Op, SelectionDAG &DAG,
1003 SDValue LowerINT_TO_FPVector(SDValue Op, SelectionDAG &DAG,
1006 SDValue LowerTRUNCATEVector(SDValue Op, SelectionDAG &DAG) const;
1006 SDValue LowerTRUNCATEVector(SDValue Op, SelectionDAG &DAG) const;
1008 SDValue getFramePointerFrameIndex(SelectionDAG & DAG) const;
1009 SDValue getReturnAddrFrameIndex(SelectionDAG & DAG) const;
1012 IsEligibleForTailCallOptimization(SDValue Callee,
1020 SDValue Callee,
1028 SDValue EmitTailCallLoadFPAndRetAddr(SelectionDAG &DAG, int SPDiff,
1029 SDValue Chain, SDValue &LROpOut,
1029 SDValue Chain, SDValue &LROpOut,
1030 SDValue &FPOpOut,
1033 SDValue getTOCEntry(SelectionDAG &DAG, const SDLoc &dl, SDValue GA) const;
1033 SDValue getTOCEntry(SelectionDAG &DAG, const SDLoc &dl, SDValue GA) const;
1035 SDValue LowerRETURNADDR(SDValue Op, SelectionDAG &DAG) const;
1035 SDValue LowerRETURNADDR(SDValue Op, SelectionDAG &DAG) const;
1036 SDValue LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const;
1036 SDValue LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const;
1037 SDValue LowerConstantPool(SDValue Op, SelectionDAG &DAG) const;
1037 SDValue LowerConstantPool(SDValue Op, SelectionDAG &DAG) const;
1038 SDValue LowerBlockAddress(SDValue Op, SelectionDAG &DAG) const;
1038 SDValue LowerBlockAddress(SDValue Op, SelectionDAG &DAG) const;
1039 SDValue LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const;
1039 SDValue LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const;
1040 SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const;
1040 SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const;
1041 SDValue LowerJumpTable(SDValue Op, SelectionDAG &DAG) const;
1041 SDValue LowerJumpTable(SDValue Op, SelectionDAG &DAG) const;
1042 SDValue LowerSETCC(SDValue Op, SelectionDAG &DAG) const;
1042 SDValue LowerSETCC(SDValue Op, SelectionDAG &DAG) const;
1043 SDValue LowerINIT_TRAMPOLINE(SDValue Op, SelectionDAG &DAG) const;
1043 SDValue LowerINIT_TRAMPOLINE(SDValue Op, SelectionDAG &DAG) const;
1044 SDValue LowerADJUST_TRAMPOLINE(SDValue Op, SelectionDAG &DAG) const;
1044 SDValue LowerADJUST_TRAMPOLINE(SDValue Op, SelectionDAG &DAG) const;
1045 SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG) const;
1045 SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG) const;
1046 SDValue LowerVAARG(SDValue Op, SelectionDAG &DAG) const;
1046 SDValue LowerVAARG(SDValue Op, SelectionDAG &DAG) const;
1047 SDValue LowerVACOPY(SDValue Op, SelectionDAG &DAG) const;
1047 SDValue LowerVACOPY(SDValue Op, SelectionDAG &DAG) const;
1048 SDValue LowerSTACKRESTORE(SDValue Op, SelectionDAG &DAG) const;
1048 SDValue LowerSTACKRESTORE(SDValue Op, SelectionDAG &DAG) const;
1049 SDValue LowerGET_DYNAMIC_AREA_OFFSET(SDValue Op, SelectionDAG &DAG) const;
1049 SDValue LowerGET_DYNAMIC_AREA_OFFSET(SDValue Op, SelectionDAG &DAG) const;
1050 SDValue LowerDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG) const;
1050 SDValue LowerDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG) const;
1051 SDValue LowerEH_DWARF_CFA(SDValue Op, SelectionDAG &DAG) const;
1051 SDValue LowerEH_DWARF_CFA(SDValue Op, SelectionDAG &DAG) const;
1052 SDValue LowerLOAD(SDValue Op, SelectionDAG &DAG) const;
1052 SDValue LowerLOAD(SDValue Op, SelectionDAG &DAG) const;
1053 SDValue LowerSTORE(SDValue Op, SelectionDAG &DAG) const;
1053 SDValue LowerSTORE(SDValue Op, SelectionDAG &DAG) const;
1054 SDValue LowerTRUNCATE(SDValue Op, SelectionDAG &DAG) const;
1054 SDValue LowerTRUNCATE(SDValue Op, SelectionDAG &DAG) const;
1055 SDValue LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const;
1055 SDValue LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const;
1056 SDValue LowerFP_TO_INT(SDValue Op, SelectionDAG &DAG,
1056 SDValue LowerFP_TO_INT(SDValue Op, SelectionDAG &DAG,
1058 SDValue LowerINT_TO_FP(SDValue Op, SelectionDAG &DAG) const;
1058 SDValue LowerINT_TO_FP(SDValue Op, SelectionDAG &DAG) const;
1059 SDValue LowerFLT_ROUNDS_(SDValue Op, SelectionDAG &DAG) const;
1059 SDValue LowerFLT_ROUNDS_(SDValue Op, SelectionDAG &DAG) const;
1060 SDValue LowerSHL_PARTS(SDValue Op, SelectionDAG &DAG) const;
1060 SDValue LowerSHL_PARTS(SDValue Op, SelectionDAG &DAG) const;
1061 SDValue LowerSRL_PARTS(SDValue Op, SelectionDAG &DAG) const;
1061 SDValue LowerSRL_PARTS(SDValue Op, SelectionDAG &DAG) const;
1062 SDValue LowerSRA_PARTS(SDValue Op, SelectionDAG &DAG) const;
1062 SDValue LowerSRA_PARTS(SDValue Op, SelectionDAG &DAG) const;
1063 SDValue LowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG) const;
1063 SDValue LowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG) const;
1064 SDValue LowerVECTOR_SHUFFLE(SDValue Op, SelectionDAG &DAG) const;
1064 SDValue LowerVECTOR_SHUFFLE(SDValue Op, SelectionDAG &DAG) const;
1065 SDValue LowerINSERT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const;
1065 SDValue LowerINSERT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const;
1066 SDValue LowerEXTRACT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const;
1066 SDValue LowerEXTRACT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const;
1067 SDValue LowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG) const;
1067 SDValue LowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG) const;
1068 SDValue LowerINTRINSIC_VOID(SDValue Op, SelectionDAG &DAG) const;
1068 SDValue LowerINTRINSIC_VOID(SDValue Op, SelectionDAG &DAG) const;
1069 SDValue LowerREM(SDValue Op, SelectionDAG &DAG) const;
1069 SDValue LowerREM(SDValue Op, SelectionDAG &DAG) const;
1070 SDValue LowerBSWAP(SDValue Op, SelectionDAG &DAG) const;
1070 SDValue LowerBSWAP(SDValue Op, SelectionDAG &DAG) const;
1071 SDValue LowerATOMIC_CMP_SWAP(SDValue Op, SelectionDAG &DAG) const;
1071 SDValue LowerATOMIC_CMP_SWAP(SDValue Op, SelectionDAG &DAG) const;
1072 SDValue LowerSCALAR_TO_VECTOR(SDValue Op, SelectionDAG &DAG) const;
1072 SDValue LowerSCALAR_TO_VECTOR(SDValue Op, SelectionDAG &DAG) const;
1073 SDValue LowerSIGN_EXTEND_INREG(SDValue Op, SelectionDAG &DAG) const;
1073 SDValue LowerSIGN_EXTEND_INREG(SDValue Op, SelectionDAG &DAG) const;
1074 SDValue LowerMUL(SDValue Op, SelectionDAG &DAG) const;
1074 SDValue LowerMUL(SDValue Op, SelectionDAG &DAG) const;
1075 SDValue LowerABS(SDValue Op, SelectionDAG &DAG) const;
1075 SDValue LowerABS(SDValue Op, SelectionDAG &DAG) const;
1076 SDValue LowerFP_EXTEND(SDValue Op, SelectionDAG &DAG) const;
1076 SDValue LowerFP_EXTEND(SDValue Op, SelectionDAG &DAG) const;
1078 SDValue LowerVectorLoad(SDValue Op, SelectionDAG &DAG) const;
1078 SDValue LowerVectorLoad(SDValue Op, SelectionDAG &DAG) const;
1079 SDValue LowerVectorStore(SDValue Op, SelectionDAG &DAG) const;
1079 SDValue LowerVectorStore(SDValue Op, SelectionDAG &DAG) const;
1081 SDValue LowerCallResult(SDValue Chain, SDValue InFlag,
1081 SDValue LowerCallResult(SDValue Chain, SDValue InFlag,
1081 SDValue LowerCallResult(SDValue Chain, SDValue InFlag,
1085 SmallVectorImpl<SDValue> &InVals) const;
1086 SDValue FinishCall(CallingConv::ID CallConv, const SDLoc &dl,
1089 SmallVector<std::pair<unsigned, SDValue>, 8> &RegsToPass,
1090 SDValue InFlag, SDValue Chain, SDValue CallSeqStart,
1090 SDValue InFlag, SDValue Chain, SDValue CallSeqStart,
1090 SDValue InFlag, SDValue Chain, SDValue CallSeqStart,
1091 SDValue &Callee, int SPDiff, unsigned NumBytes,
1093 SmallVectorImpl<SDValue> &InVals,
1096 SDValue
1097 LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
1100 SmallVectorImpl<SDValue> &InVals) const override;
1102 SDValue LowerCall(TargetLowering::CallLoweringInfo &CLI,
1103 SmallVectorImpl<SDValue> &InVals) const override;
1110 SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
1110 SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
1112 const SmallVectorImpl<SDValue> &OutVals,
1115 SDValue extendArgForPPC64(ISD::ArgFlagsTy Flags, EVT ObjectVT,
1116 SelectionDAG &DAG, SDValue ArgVal,
1119 SDValue LowerFormalArguments_Darwin(
1120 SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
1122 SelectionDAG &DAG, SmallVectorImpl<SDValue> &InVals) const;
1123 SDValue LowerFormalArguments_64SVR4(
1124 SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
1126 SelectionDAG &DAG, SmallVectorImpl<SDValue> &InVals) const;
1127 SDValue LowerFormalArguments_32SVR4(
1128 SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
1130 SelectionDAG &DAG, SmallVectorImpl<SDValue> &InVals) const;
1132 SDValue createMemcpyOutsideCallSeq(SDValue Arg, SDValue PtrOff,
1132 SDValue createMemcpyOutsideCallSeq(SDValue Arg, SDValue PtrOff,
1132 SDValue createMemcpyOutsideCallSeq(SDValue Arg, SDValue PtrOff,
1133 SDValue CallSeqStart,
1137 SDValue LowerCall_Darwin(SDValue Chain, SDValue Callee,
1137 SDValue LowerCall_Darwin(SDValue Chain, SDValue Callee,
1137 SDValue LowerCall_Darwin(SDValue Chain, SDValue Callee,
1141 const SmallVectorImpl<SDValue> &OutVals,
1144 SmallVectorImpl<SDValue> &InVals,
1146 SDValue LowerCall_64SVR4(SDValue Chain, SDValue Callee,
1146 SDValue LowerCall_64SVR4(SDValue Chain, SDValue Callee,
1146 SDValue LowerCall_64SVR4(SDValue Chain, SDValue Callee,
1150 const SmallVectorImpl<SDValue> &OutVals,
1153 SmallVectorImpl<SDValue> &InVals,
1155 SDValue LowerCall_32SVR4(SDValue Chain, SDValue Callee,
1155 SDValue LowerCall_32SVR4(SDValue Chain, SDValue Callee,
1155 SDValue LowerCall_32SVR4(SDValue Chain, SDValue Callee,
1159 const SmallVectorImpl<SDValue> &OutVals,
1162 SmallVectorImpl<SDValue> &InVals,
1164 SDValue LowerCall_AIX(SDValue Chain, SDValue Callee,
1164 SDValue LowerCall_AIX(SDValue Chain, SDValue Callee,
1164 SDValue LowerCall_AIX(SDValue Chain, SDValue Callee,
1168 const SmallVectorImpl<SDValue> &OutVals,
1171 SmallVectorImpl<SDValue> &InVals,
1174 SDValue lowerEH_SJLJ_SETJMP(SDValue Op, SelectionDAG &DAG) const;
1174 SDValue lowerEH_SJLJ_SETJMP(SDValue Op, SelectionDAG &DAG) const;
1175 SDValue lowerEH_SJLJ_LONGJMP(SDValue Op, SelectionDAG &DAG) const;
1175 SDValue lowerEH_SJLJ_LONGJMP(SDValue Op, SelectionDAG &DAG) const;
1176 SDValue LowerBITCAST(SDValue Op, SelectionDAG &DAG) const;
1176 SDValue LowerBITCAST(SDValue Op, SelectionDAG &DAG) const;
1178 SDValue DAGCombineExtBoolTrunc(SDNode *N, DAGCombinerInfo &DCI) const;
1179 SDValue DAGCombineBuildVector(SDNode *N, DAGCombinerInfo &DCI) const;
1180 SDValue DAGCombineTruncBoolExt(SDNode *N, DAGCombinerInfo &DCI) const;
1181 SDValue combineStoreFPToInt(SDNode *N, DAGCombinerInfo &DCI) const;
1182 SDValue combineFPToIntToFP(SDNode *N, DAGCombinerInfo &DCI) const;
1183 SDValue combineSHL(SDNode *N, DAGCombinerInfo &DCI) const;
1184 SDValue combineSRA(SDNode *N, DAGCombinerInfo &DCI) const;
1185 SDValue combineSRL(SDNode *N, DAGCombinerInfo &DCI) const;
1186 SDValue combineMUL(SDNode *N, DAGCombinerInfo &DCI) const;
1187 SDValue combineADD(SDNode *N, DAGCombinerInfo &DCI) const;
1188 SDValue combineTRUNCATE(SDNode *N, DAGCombinerInfo &DCI) const;
1189 SDValue combineSetCC(SDNode *N, DAGCombinerInfo &DCI) const;
1190 SDValue combineABS(SDNode *N, DAGCombinerInfo &DCI) const;
1191 SDValue combineVSelect(SDNode *N, DAGCombinerInfo &DCI) const;
1192 SDValue combineVReverseMemOP(ShuffleVectorSDNode *SVN, LSBaseSDNode *LSBase,
1198 SDValue ConvertSETCCToSubtract(SDNode *N, DAGCombinerInfo &DCI) const;
1200 SDValue getSqrtEstimate(SDValue Operand, SelectionDAG &DAG, int Enabled,
1200 SDValue getSqrtEstimate(SDValue Operand, SelectionDAG &DAG, int Enabled,
1203 SDValue getRecipEstimate(SDValue Operand, SelectionDAG &DAG, int Enabled,
1203 SDValue getRecipEstimate(SDValue Operand, SelectionDAG &DAG, int Enabled,
1207 SDValue
1215 SDValue lowerToVINSERTH(ShuffleVectorSDNode *N, SelectionDAG &DAG) const;
1220 SDValue lowerToVINSERTB(ShuffleVectorSDNode *N, SelectionDAG &DAG) const;
1238 bool isIntS16Immediate(SDValue Op, int16_t &Imm);
lib/Target/RISCV/RISCVISelDAGToDAG.cpp 49 bool SelectInlineAsmMemoryOperand(const SDValue &Op, unsigned ConstraintID,
50 std::vector<SDValue> &OutOps) override;
52 bool SelectAddrFI(SDValue Addr, SDValue &Base);
52 bool SelectAddrFI(SDValue Addr, SDValue &Base);
72 SDValue SrcReg = CurDAG->getRegister(RISCV::X0, XLenVT);
74 SDValue SDImm = CurDAG->getTargetConstant(Inst.Imm, DL, XLenVT);
117 SDValue New = CurDAG->getCopyFromReg(CurDAG->getEntryNode(), SDLoc(Node),
130 SDValue Imm = CurDAG->getTargetConstant(0, DL, XLenVT);
132 SDValue TFI = CurDAG->getTargetFrameIndex(FI, VT);
139 SDValue Op0 = Node->getOperand(0);
140 SDValue Op1 = Node->getOperand(1);
151 SDValue ShAmtVal =
174 const SDValue &Op, unsigned ConstraintID, std::vector<SDValue> &OutOps) {
174 const SDValue &Op, unsigned ConstraintID, std::vector<SDValue> &OutOps) {
192 bool RISCVDAGToDAGISel::SelectAddrFI(SDValue Addr, SDValue &Base) {
192 bool RISCVDAGToDAGISel::SelectAddrFI(SDValue Addr, SDValue &Base) {
249 SDValue Base = N->getOperand(BaseOpIdx);
255 SDValue ImmOperand = Base.getOperand(1);
lib/Target/RISCV/RISCVISelLowering.cpp 306 bool RISCVTargetLowering::isZExtFree(SDValue Val, EVT VT2) const {
332 static void normaliseSetCC(SDValue &LHS, SDValue &RHS, ISD::CondCode &CC) {
332 static void normaliseSetCC(SDValue &LHS, SDValue &RHS, ISD::CondCode &CC) {
368 SDValue RISCVTargetLowering::LowerOperation(SDValue Op,
368 SDValue RISCVTargetLowering::LowerOperation(SDValue Op,
399 SDValue Op0 = Op.getOperand(0);
402 SDValue NewOp0 = DAG.getNode(ISD::ANY_EXTEND, DL, MVT::i64, Op0);
403 SDValue FPConv = DAG.getNode(RISCVISD::FMV_W_X_RV64, DL, MVT::f32, NewOp0);
409 static SDValue getTargetNode(GlobalAddressSDNode *N, SDLoc DL, EVT Ty,
414 static SDValue getTargetNode(BlockAddressSDNode *N, SDLoc DL, EVT Ty,
420 static SDValue getTargetNode(ConstantPoolSDNode *N, SDLoc DL, EVT Ty,
427 SDValue RISCVTargetLowering::getAddr(NodeTy *N, SelectionDAG &DAG,
433 SDValue Addr = getTargetNode(N, DL, Ty, DAG, 0);
452 SDValue AddrHi = getTargetNode(N, DL, Ty, DAG, RISCVII::MO_HI);
453 SDValue AddrLo = getTargetNode(N, DL, Ty, DAG, RISCVII::MO_LO);
454 SDValue MNHi = SDValue(DAG.getMachineNode(RISCV::LUI, DL, Ty, AddrHi), 0);
461 SDValue Addr = getTargetNode(N, DL, Ty, DAG, 0);
467 SDValue RISCVTargetLowering::lowerGlobalAddress(SDValue Op,
467 SDValue RISCVTargetLowering::lowerGlobalAddress(SDValue Op,
477 SDValue Addr = getAddr(N, DAG, IsLocal);
489 SDValue RISCVTargetLowering::lowerBlockAddress(SDValue Op,
489 SDValue RISCVTargetLowering::lowerBlockAddress(SDValue Op,
496 SDValue RISCVTargetLowering::lowerConstantPool(SDValue Op,
496 SDValue RISCVTargetLowering::lowerConstantPool(SDValue Op,
503 SDValue RISCVTargetLowering::getStaticTLSAddr(GlobalAddressSDNode *N,
516 SDValue Addr = DAG.getTargetGlobalAddress(GV, DL, Ty, 0, 0);
517 SDValue Load =
521 SDValue TPReg = DAG.getRegister(RISCV::X4, XLenVT);
529 SDValue AddrHi =
531 SDValue AddrAdd =
533 SDValue AddrLo =
536 SDValue MNHi = SDValue(DAG.getMachineNode(RISCV::LUI, DL, Ty, AddrHi), 0);
537 SDValue TPReg = DAG.getRegister(RISCV::X4, XLenVT);
538 SDValue MNAdd = SDValue(
544 SDValue RISCVTargetLowering::getDynamicTLSAddr(GlobalAddressSDNode *N,
554 SDValue Addr = DAG.getTargetGlobalAddress(GV, DL, Ty, 0, 0);
555 SDValue Load =
576 SDValue RISCVTargetLowering::lowerGlobalTLSAddress(SDValue Op,
576 SDValue RISCVTargetLowering::lowerGlobalTLSAddress(SDValue Op,
589 SDValue Addr;
613 SDValue RISCVTargetLowering::lowerSELECT(SDValue Op, SelectionDAG &DAG) const {
613 SDValue RISCVTargetLowering::lowerSELECT(SDValue Op, SelectionDAG &DAG) const {
614 SDValue CondV = Op.getOperand(0);
615 SDValue TrueV = Op.getOperand(1);
616 SDValue FalseV = Op.getOperand(2);
628 SDValue LHS = CondV.getOperand(0);
629 SDValue RHS = CondV.getOperand(1);
635 SDValue TargetCC = DAG.getConstant(CCVal, DL, XLenVT);
637 SDValue Ops[] = {LHS, RHS, TargetCC, TrueV, FalseV};
644 SDValue Zero = DAG.getConstant(0, DL, XLenVT);
645 SDValue SetNE = DAG.getConstant(ISD::SETNE, DL, XLenVT);
648 SDValue Ops[] = {CondV, Zero, SetNE, TrueV, FalseV};
653 SDValue RISCVTargetLowering::lowerVASTART(SDValue Op, SelectionDAG &DAG) const {
653 SDValue RISCVTargetLowering::lowerVASTART(SDValue Op, SelectionDAG &DAG) const {
658 SDValue FI = DAG.getFrameIndex(FuncInfo->getVarArgsFrameIndex(),
668 SDValue RISCVTargetLowering::lowerFRAMEADDR(SDValue Op,
668 SDValue RISCVTargetLowering::lowerFRAMEADDR(SDValue Op,
679 SDValue FrameAddr = DAG.getCopyFromReg(DAG.getEntryNode(), DL, FrameReg, VT);
683 SDValue Ptr = DAG.getNode(ISD::ADD, DL, VT, FrameAddr,
691 SDValue RISCVTargetLowering::lowerRETURNADDR(SDValue Op,
691 SDValue RISCVTargetLowering::lowerRETURNADDR(SDValue Op,
708 SDValue FrameAddr = lowerFRAMEADDR(Op, DAG);
709 SDValue Offset = DAG.getConstant(Off, DL, VT);
721 SDValue RISCVTargetLowering::lowerShiftLeftParts(SDValue Op,
721 SDValue RISCVTargetLowering::lowerShiftLeftParts(SDValue Op,
724 SDValue Lo = Op.getOperand(0);
725 SDValue Hi = Op.getOperand(1);
726 SDValue Shamt = Op.getOperand(2);
736 SDValue Zero = DAG.getConstant(0, DL, VT);
737 SDValue One = DAG.getConstant(1, DL, VT);
738 SDValue MinusXLen = DAG.getConstant(-(int)Subtarget.getXLen(), DL, VT);
739 SDValue XLenMinus1 = DAG.getConstant(Subtarget.getXLen() - 1, DL, VT);
740 SDValue ShamtMinusXLen = DAG.getNode(ISD::ADD, DL, VT, Shamt, MinusXLen);
741 SDValue XLenMinus1Shamt = DAG.getNode(ISD::SUB, DL, VT, XLenMinus1, Shamt);
743 SDValue LoTrue = DAG.getNode(ISD::SHL, DL, VT, Lo, Shamt);
744 SDValue ShiftRight1Lo = DAG.getNode(ISD::SRL, DL, VT, Lo, One);
745 SDValue ShiftRightLo =
747 SDValue ShiftLeftHi = DAG.getNode(ISD::SHL, DL, VT, Hi, Shamt);
748 SDValue HiTrue = DAG.getNode(ISD::OR, DL, VT, ShiftLeftHi, ShiftRightLo);
749 SDValue HiFalse = DAG.getNode(ISD::SHL, DL, VT, Lo, ShamtMinusXLen);
751 SDValue CC = DAG.getSetCC(DL, VT, ShamtMinusXLen, Zero, ISD::SETLT);
756 SDValue Parts[2] = {Lo, Hi};
760 SDValue RISCVTargetLowering::lowerShiftRightParts(SDValue Op, SelectionDAG &DAG,
760 SDValue RISCVTargetLowering::lowerShiftRightParts(SDValue Op, SelectionDAG &DAG,
763 SDValue Lo = Op.getOperand(0);
764 SDValue Hi = Op.getOperand(1);
765 SDValue Shamt = Op.getOperand(2);
786 SDValue Zero = DAG.getConstant(0, DL, VT);
787 SDValue One = DAG.getConstant(1, DL, VT);
788 SDValue MinusXLen = DAG.getConstant(-(int)Subtarget.getXLen(), DL, VT);
789 SDValue XLenMinus1 = DAG.getConstant(Subtarget.getXLen() - 1, DL, VT);
790 SDValue ShamtMinusXLen = DAG.getNode(ISD::ADD, DL, VT, Shamt, MinusXLen);
791 SDValue XLenMinus1Shamt = DAG.getNode(ISD::SUB, DL, VT, XLenMinus1, Shamt);
793 SDValue ShiftRightLo = DAG.getNode(ISD::SRL, DL, VT, Lo, Shamt);
794 SDValue ShiftLeftHi1 = DAG.getNode(ISD::SHL, DL, VT, Hi, One);
795 SDValue ShiftLeftHi =
797 SDValue LoTrue = DAG.getNode(ISD::OR, DL, VT, ShiftRightLo, ShiftLeftHi);
798 SDValue HiTrue = DAG.getNode(ShiftRightOp, DL, VT, Hi, Shamt);
799 SDValue LoFalse = DAG.getNode(ShiftRightOp, DL, VT, Hi, ShamtMinusXLen);
800 SDValue HiFalse =
803 SDValue CC = DAG.getSetCC(DL, VT, ShamtMinusXLen, Zero, ISD::SETLT);
808 SDValue Parts[2] = {Lo, Hi};
838 static SDValue customLegalizeToWOp(SDNode *N, SelectionDAG &DAG) {
841 SDValue NewOp0 = DAG.getNode(ISD::ANY_EXTEND, DL, MVT::i64, N->getOperand(0));
842 SDValue NewOp1 = DAG.getNode(ISD::ANY_EXTEND, DL, MVT::i64, N->getOperand(1));
843 SDValue NewRes = DAG.getNode(WOpcode, DL, MVT::i64, NewOp0, NewOp1);
850 static SDValue customLegalizeToWOpWithSExt(SDNode *N, SelectionDAG &DAG) {
852 SDValue NewOp0 = DAG.getNode(ISD::ANY_EXTEND, DL, MVT::i64, N->getOperand(0));
853 SDValue NewOp1 = DAG.getNode(ISD::ANY_EXTEND, DL, MVT::i64, N->getOperand(1));
854 SDValue NewWOp = DAG.getNode(N->getOpcode(), DL, MVT::i64, NewOp0, NewOp1);
855 SDValue NewRes = DAG.getNode(ISD::SIGN_EXTEND_INREG, DL, MVT::i64, NewWOp,
861 SmallVectorImpl<SDValue> &Results,
872 SDValue RCW =
912 SDValue Op0 = N->getOperand(0);
915 SDValue FPConv =
923 SDValue RISCVTargetLowering::PerformDAGCombine(SDNode *N,
931 SDValue Op0 = N->getOperand(0);
944 SDValue Lo = DAG.getConstant(V.trunc(32), DL, MVT::i32);
945 SDValue Hi = DAG.getConstant(V.lshr(32).trunc(32), DL, MVT::i32);
956 SDValue NewSplitF64 =
959 SDValue Lo = NewSplitF64.getValue(0);
960 SDValue Hi = NewSplitF64.getValue(1);
963 SDValue NewHi = DAG.getNode(ISD::XOR, DL, MVT::i32, Hi,
968 SDValue NewHi = DAG.getNode(ISD::AND, DL, MVT::i32, Hi,
976 SDValue LHS = N->getOperand(0);
977 SDValue RHS = N->getOperand(1);
987 SDValue Op0 = N->getOperand(0);
992 SDValue AExtOp =
1004 SDValue NewFMV = DAG.getNode(RISCVISD::FMV_X_ANYEXTW_RV64, DL, MVT::i64,
1029 SDValue N0 = N->getOperand(0);
1069 SDValue Op, const APInt &DemandedElts, const SelectionDAG &DAG,
1667 static SDValue convertLocVTToValVT(SelectionDAG &DAG, SDValue Val,
1667 static SDValue convertLocVTToValVT(SelectionDAG &DAG, SDValue Val,
1687 static SDValue unpackFromRegLoc(SelectionDAG &DAG, SDValue Chain,
1687 static SDValue unpackFromRegLoc(SelectionDAG &DAG, SDValue Chain,
1692 SDValue Val;
1720 static SDValue convertValVTToLocVT(SelectionDAG &DAG, SDValue Val,
1720 static SDValue convertValVTToLocVT(SelectionDAG &DAG, SDValue Val,
1742 static SDValue unpackFromMemLoc(SelectionDAG &DAG, SDValue Chain,
1742 static SDValue unpackFromMemLoc(SelectionDAG &DAG, SDValue Chain,
1751 SDValue FIN = DAG.getFrameIndex(FI, PtrVT);
1752 SDValue Val;
1770 static SDValue unpackF64OnRV32DSoftABI(SelectionDAG &DAG, SDValue Chain,
1770 static SDValue unpackF64OnRV32DSoftABI(SelectionDAG &DAG, SDValue Chain,
1781 SDValue FIN = DAG.getFrameIndex(FI, MVT::i32);
1790 SDValue Lo = DAG.getCopyFromReg(Chain, DL, LoVReg, MVT::i32);
1791 SDValue Hi;
1795 SDValue FIN = DAG.getFrameIndex(FI, MVT::i32);
1865 SDValue RISCVTargetLowering::LowerFormalArguments(
1866 SDValue Chain, CallingConv::ID CallConv, bool IsVarArg,
1868 SelectionDAG &DAG, SmallVectorImpl<SDValue> &InVals) const {
1898 std::vector<SDValue> OutChains;
1911 SDValue ArgValue;
1932 SDValue Address = DAG.getNode(ISD::ADD, DL, PtrVT, ArgValue,
1985 SDValue ArgValue = DAG.getCopyFromReg(Chain, DL, Reg, XLenVT);
1987 SDValue PtrOff = DAG.getFrameIndex(FI, getPointerTy(DAG.getDataLayout()));
1988 SDValue Store = DAG.getStore(Chain, DL, ArgValue, PtrOff,
2015 auto &Callee = CLI.Callee;
2087 SDValue RISCVTargetLowering::LowerCall(CallLoweringInfo &CLI,
2088 SmallVectorImpl<SDValue> &InVals) const {
2092 SmallVectorImpl<SDValue> &OutVals = CLI.OutVals;
2094 SDValue Chain = CLI.Chain;
2095 SDValue Callee = CLI.Callee;
2127 SmallVector<SDValue, 8> ByValArgs;
2133 SDValue Arg = OutVals[i];
2138 SDValue FIPtr = DAG.getFrameIndex(FI, getPointerTy(DAG.getDataLayout()));
2139 SDValue SizeNode = DAG.getConstant(Size, DL, XLenVT);
2153 SmallVector<std::pair<Register, SDValue>, 8> RegsToPass;
2154 SmallVector<SDValue, 8> MemOpChains;
2155 SDValue StackPtr;
2158 SDValue ArgValue = OutVals[i];
2165 SDValue SplitF64 = DAG.getNode(
2167 SDValue Lo = SplitF64.getValue(0);
2168 SDValue Hi = SplitF64.getValue(1);
2197 SDValue SpillSlot = DAG.CreateStackTemporary(Outs[i].ArgVT);
2207 SDValue PartValue = OutVals[i + 1];
2209 SDValue Address = DAG.getNode(ISD::ADD, DL, PtrVT, SpillSlot,
2236 SDValue Address =
2250 SDValue Glue;
2290 SmallVector<SDValue, 8> Ops;
2337 SDValue RetValue =
2345 SDValue RetValue2 =
2377 SDValue
2378 RISCVTargetLowering::LowerReturn(SDValue Chain, CallingConv::ID CallConv,
2381 const SmallVectorImpl<SDValue> &OutVals,
2396 SDValue Glue;
2397 SmallVector<SDValue, 4> RetOps(1, Chain);
2401 SDValue Val = OutVals[i];
2408 SDValue SplitF64 = DAG.getNode(RISCVISD::SplitF64, DL,
2410 SDValue Lo = SplitF64.getValue(0);
2411 SDValue Hi = SplitF64.getValue(1);
2477 const SmallVectorImpl<std::pair<llvm::Register, llvm::SDValue>> &Regs,
2684 SDValue Op, std::string &Constraint, std::vector<SDValue> &Ops,
2684 SDValue Op, std::string &Constraint, std::vector<SDValue> &Ops,
lib/Target/RISCV/RISCVISelLowering.h 75 bool isZExtFree(SDValue Val, EVT VT2) const override;
81 SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
81 SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
82 void ReplaceNodeResults(SDNode *N, SmallVectorImpl<SDValue> &Results,
85 SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const override;
87 unsigned ComputeNumSignBitsForTargetNode(SDValue Op,
103 void LowerAsmOperandForConstraint(SDValue Op, std::string &Constraint,
104 std::vector<SDValue> &Ops,
158 SDValue LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv,
158 SDValue LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv,
162 SmallVectorImpl<SDValue> &InVals) const override;
167 SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool IsVarArg,
167 SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool IsVarArg,
169 const SmallVectorImpl<SDValue> &OutVals, const SDLoc &DL,
171 SDValue LowerCall(TargetLowering::CallLoweringInfo &CLI,
172 SmallVectorImpl<SDValue> &InVals) const override;
179 SDValue getAddr(NodeTy *N, SelectionDAG &DAG, bool IsLocal = true) const;
181 SDValue getStaticTLSAddr(GlobalAddressSDNode *N, SelectionDAG &DAG,
183 SDValue getDynamicTLSAddr(GlobalAddressSDNode *N, SelectionDAG &DAG) const;
186 SDValue lowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const;
186 SDValue lowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const;
187 SDValue lowerBlockAddress(SDValue Op, SelectionDAG &DAG) const;
187 SDValue lowerBlockAddress(SDValue Op, SelectionDAG &DAG) const;
188 SDValue lowerConstantPool(SDValue Op, SelectionDAG &DAG) const;
188 SDValue lowerConstantPool(SDValue Op, SelectionDAG &DAG) const;
189 SDValue lowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const;
189 SDValue lowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const;
190 SDValue lowerSELECT(SDValue Op, SelectionDAG &DAG) const;
190 SDValue lowerSELECT(SDValue Op, SelectionDAG &DAG) const;
191 SDValue lowerVASTART(SDValue Op, SelectionDAG &DAG) const;
191 SDValue lowerVASTART(SDValue Op, SelectionDAG &DAG) const;
192 SDValue lowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const;
192 SDValue lowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const;
193 SDValue lowerRETURNADDR(SDValue Op, SelectionDAG &DAG) const;
193 SDValue lowerRETURNADDR(SDValue Op, SelectionDAG &DAG) const;
194 SDValue lowerShiftLeftParts(SDValue Op, SelectionDAG &DAG) const;
194 SDValue lowerShiftLeftParts(SDValue Op, SelectionDAG &DAG) const;
195 SDValue lowerShiftRightParts(SDValue Op, SelectionDAG &DAG, bool IsSRA) const;
195 SDValue lowerShiftRightParts(SDValue Op, SelectionDAG &DAG, bool IsSRA) const;
217 const SmallVectorImpl<std::pair<llvm::Register, llvm::SDValue>> &Regs,
lib/Target/Sparc/SparcISelDAGToDAG.cpp 46 bool SelectADDRrr(SDValue N, SDValue &R1, SDValue &R2);
46 bool SelectADDRrr(SDValue N, SDValue &R1, SDValue &R2);
46 bool SelectADDRrr(SDValue N, SDValue &R1, SDValue &R2);
47 bool SelectADDRri(SDValue N, SDValue &Base, SDValue &Offset);
47 bool SelectADDRri(SDValue N, SDValue &Base, SDValue &Offset);
47 bool SelectADDRri(SDValue N, SDValue &Base, SDValue &Offset);
51 bool SelectInlineAsmMemoryOperand(const SDValue &Op,
53 std::vector<SDValue> &OutOps) override;
75 bool SparcDAGToDAGISel::SelectADDRri(SDValue Addr,
76 SDValue &Base, SDValue &Offset) {
76 SDValue &Base, SDValue &Offset) {
120 bool SparcDAGToDAGISel::SelectADDRrr(SDValue Addr, SDValue &R1, SDValue &R2) {
120 bool SparcDAGToDAGISel::SelectADDRrr(SDValue Addr, SDValue &R1, SDValue &R2) {
120 bool SparcDAGToDAGISel::SelectADDRrr(SDValue Addr, SDValue &R1, SDValue &R2) {
157 std::vector<SDValue> AsmNodeOperands;
171 SDValue Glue = N->getGluedNode() ? N->getOperand(NumOps-1)
177 SDValue op = N->getOperand(i);
195 SDValue op = N->getOperand(++i);
222 SDValue V0 = N->getOperand(i+1);
223 SDValue V1 = N->getOperand(i+2);
226 SDValue PairedReg;
236 SDValue Chain = SDValue(N,0);
239 SDValue RegCopy = CurDAG->getCopyFromReg(Chain, dl, GPVR, MVT::v2i32,
243 SDValue Sub0 = CurDAG->getTargetExtractSubreg(SP::sub_even, dl, MVT::i32,
245 SDValue Sub1 = CurDAG->getTargetExtractSubreg(SP::sub_odd, dl, MVT::i32,
247 SDValue T0 = CurDAG->getCopyToReg(Sub0, dl, Reg0, Sub0,
249 SDValue T1 = CurDAG->getCopyToReg(Sub1, dl, Reg1, Sub1, T0.getValue(1));
252 std::vector<SDValue> Ops(GU->op_begin(), GU->op_end()-1);
259 SDValue Chain = AsmNodeOperands[InlineAsm::Op_InputChain];
262 SDValue T0 = CurDAG->getCopyFromReg(Chain, dl, Reg0, MVT::i32,
264 SDValue T1 = CurDAG->getCopyFromReg(Chain, dl, Reg1, MVT::i32,
266 SDValue Pair = SDValue(
315 SDValue New = CurDAG->getNode(N->getOpcode(), SDLoc(N),
347 SDValue DivLHS = N->getOperand(0);
348 SDValue DivRHS = N->getOperand(1);
351 SDValue TopPart;
377 SparcDAGToDAGISel::SelectInlineAsmMemoryOperand(const SDValue &Op,
379 std::vector<SDValue> &OutOps) {
380 SDValue Op0, Op1;
lib/Target/Sparc/SparcISelLowering.cpp 196 SDValue
197 SparcTargetLowering::LowerReturn(SDValue Chain, CallingConv::ID CallConv,
200 const SmallVectorImpl<SDValue> &OutVals,
207 SDValue
208 SparcTargetLowering::LowerReturn_32(SDValue Chain, CallingConv::ID CallConv,
211 const SmallVectorImpl<SDValue> &OutVals,
225 SDValue Flag;
226 SmallVector<SDValue, 4> RetOps(1, Chain);
237 SDValue Arg = OutVals[realRVLocIdx];
244 SDValue Part0 = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, MVT::i32,
247 SDValue Part1 = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, MVT::i32,
273 SDValue Val = DAG.getCopyFromReg(Chain, DL, Reg, PtrVT);
292 SDValue
293 SparcTargetLowering::LowerReturn_64(SDValue Chain, CallingConv::ID CallConv,
296 const SmallVectorImpl<SDValue> &OutVals,
308 SDValue Flag;
309 SmallVector<SDValue, 4> RetOps(1, Chain);
319 SDValue OutVal = OutVals[i];
346 SDValue NV = DAG.getNode(ISD::ZERO_EXTEND, DL, MVT::i64, OutVals[i+1]);
369 SDValue SparcTargetLowering::LowerFormalArguments(
370 SDValue Chain, CallingConv::ID CallConv, bool IsVarArg,
372 SelectionDAG &DAG, SmallVectorImpl<SDValue> &InVals) const {
383 SDValue SparcTargetLowering::LowerFormalArguments_32(
384 SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
386 SelectionDAG &DAG, SmallVectorImpl<SDValue> &InVals) const {
409 SDValue FIPtr = DAG.getFrameIndex(FrameIdx, MVT::i32);
410 SDValue Arg =
422 SDValue HiVal = DAG.getCopyFromReg(Chain, dl, VRegHi, MVT::i32);
427 SDValue LoVal;
431 SDValue FIPtr = DAG.getFrameIndex(FrameIdx, MVT::i32);
442 SDValue WholeValue =
450 SDValue Arg = DAG.getCopyFromReg(Chain, dl, VReg, MVT::i32);
474 SDValue FIPtr = DAG.getFrameIndex(FI, PtrVT);
475 SDValue Load =
484 SDValue FIPtr = DAG.getFrameIndex(FI, PtrVT);
485 SDValue HiVal =
490 SDValue FIPtr2 = DAG.getFrameIndex(FI2, PtrVT);
492 SDValue LoVal =
498 SDValue WholeValue =
508 SDValue FIPtr = DAG.getFrameIndex(FI, PtrVT);
509 SDValue Load ;
530 SDValue Copy = DAG.getCopyToReg(DAG.getEntryNode(), dl, Reg, InVals[0]);
552 std::vector<SDValue> OutChains;
557 SDValue Arg = DAG.getCopyFromReg(DAG.getRoot(), dl, VReg, MVT::i32);
561 SDValue FIPtr = DAG.getFrameIndex(FrameIdx, MVT::i32);
578 SDValue SparcTargetLowering::LowerFormalArguments_64(
579 SDValue Chain, CallingConv::ID CallConv, bool IsVarArg,
581 SelectionDAG &DAG, SmallVectorImpl<SDValue> &InVals) const {
602 SDValue Arg = DAG.getCopyFromReg(Chain, DL, VReg, VA.getLocVT());
669 SmallVector<SDValue, 8> OutChains;
672 SDValue VArg = DAG.getCopyFromReg(Chain, DL, VReg, MVT::i64);
686 SDValue
688 SmallVectorImpl<SDValue> &InVals) const {
694 static bool hasReturnsTwiceAttr(SelectionDAG &DAG, SDValue Callee,
716 SDValue
718 SmallVectorImpl<SDValue> &InVals) const {
722 SmallVectorImpl<SDValue> &OutVals = CLI.OutVals;
724 SDValue Chain = CLI.Chain;
725 SDValue Callee = CLI.Callee;
748 SmallVector<SDValue, 8> ByValArgs;
754 SDValue Arg = OutVals[i];
760 SDValue FIPtr = DAG.getFrameIndex(FI, getPointerTy(DAG.getDataLayout()));
761 SDValue SizeNode = DAG.getConstant(Size, dl, MVT::i32);
771 SDValue nullVal;
778 SmallVector<std::pair<unsigned, SDValue>, 8> RegsToPass;
779 SmallVector<SDValue, 8> MemOpChains;
789 SDValue Arg = OutVals[realArgIdx];
822 SDValue StackPtr = DAG.getRegister(SP::O6, MVT::i32);
823 SDValue PtrOff = DAG.getIntPtrConstant(64, dl);
843 SDValue StackPtr = DAG.getRegister(SP::O6, MVT::i32);
844 SDValue PtrOff = DAG.getIntPtrConstant(Offset, dl);
861 SDValue Part0 = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, MVT::i32,
864 SDValue Part1 = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, MVT::i32,
877 SDValue StackPtr = DAG.getRegister(SP::O6, MVT::i32);
878 SDValue PtrOff = DAG.getIntPtrConstant(Offset, dl);
886 SDValue StackPtr = DAG.getRegister(SP::O6, MVT::i32);
887 SDValue PtrOff = DAG.getIntPtrConstant(Offset, dl);
915 SDValue StackPtr = DAG.getRegister(SP::O6, MVT::i32);
916 SDValue PtrOff = DAG.getIntPtrConstant(VA.getLocMemOffset() + StackOffset,
932 SDValue InFlag;
952 SmallVector<SDValue, 8> Ops;
990 SDValue Vec = DAG.getNode(ISD::UNDEF, dl, MVT::v2i32);
991 SDValue Lo = DAG.getCopyFromReg(
997 SDValue Hi = DAG.getCopyFromReg(
1092 SDValue
1094 SmallVectorImpl<SDValue> &InVals) const {
1097 SDValue Chain = CLI.Chain;
1130 SmallVector<std::pair<unsigned, SDValue>, 8> RegsToPass;
1135 SmallVector<SDValue, 8> MemOpChains;
1139 SDValue Arg = CLI.OutVals[i];
1171 SDValue StackPtr = DAG.getRegister(SP::O6, PtrVT);
1172 SDValue HiPtrOff = DAG.getIntPtrConstant(StackOffset, DL);
1174 SDValue LoPtrOff = DAG.getIntPtrConstant(StackOffset + 8, DL);
1178 SDValue Store =
1181 SDValue Hi64 =
1183 SDValue Lo64 =
1202 SDValue NV = DAG.getNode(ISD::ZERO_EXTEND, DL, MVT::i64,
1216 SDValue StackPtr = DAG.getRegister(SP::O6, PtrVT);
1219 SDValue PtrOff = DAG.getIntPtrConstant(VA.getLocMemOffset() +
1235 SDValue InGlue;
1245 SDValue Callee = CLI.Callee;
1254 SmallVector<SDValue, 8> Ops;
1308 SDValue RV;
1856 (const SDValue Op,
1881 static void LookThroughSetCC(SDValue &LHS, SDValue &RHS,
1881 static void LookThroughSetCC(SDValue &LHS, SDValue &RHS,
1892 SDValue CMPCC = LHS.getOperand(3);
1900 SDValue SparcTargetLowering::withTargetFlags(SDValue Op, unsigned TF,
1900 SDValue SparcTargetLowering::withTargetFlags(SDValue Op, unsigned TF,
1929 SDValue SparcTargetLowering::makeHiLoPair(SDValue Op,
1929 SDValue SparcTargetLowering::makeHiLoPair(SDValue Op,
1934 SDValue Hi = DAG.getNode(SPISD::Hi, DL, VT, withTargetFlags(Op, HiTF, DAG));
1935 SDValue Lo = DAG.getNode(SPISD::Lo, DL, VT, withTargetFlags(Op, LoTF, DAG));
1941 SDValue SparcTargetLowering::makeAddress(SDValue Op, SelectionDAG &DAG) const {
1941 SDValue SparcTargetLowering::makeAddress(SDValue Op, SelectionDAG &DAG) const {
1949 SDValue Idx;
1961 SDValue GlobalBase = DAG.getNode(SPISD::GLOBAL_BASE_REG, DL, VT);
1962 SDValue AbsAddr = DAG.getNode(ISD::ADD, DL, VT, GlobalBase, Idx);
1981 SDValue H44 = makeHiLoPair(Op, SparcMCExpr::VK_Sparc_H44,
1984 SDValue L44 = withTargetFlags(Op, SparcMCExpr::VK_Sparc_L44, DAG);
1990 SDValue Hi = makeHiLoPair(Op, SparcMCExpr::VK_Sparc_HH,
1993 SDValue Lo = makeHiLoPair(Op, SparcMCExpr::VK_Sparc_HI,
2000 SDValue SparcTargetLowering::LowerGlobalAddress(SDValue Op,
2000 SDValue SparcTargetLowering::LowerGlobalAddress(SDValue Op,
2005 SDValue SparcTargetLowering::LowerConstantPool(SDValue Op,
2005 SDValue SparcTargetLowering::LowerConstantPool(SDValue Op,
2010 SDValue SparcTargetLowering::LowerBlockAddress(SDValue Op,
2010 SDValue SparcTargetLowering::LowerBlockAddress(SDValue Op,
2015 SDValue SparcTargetLowering::LowerGlobalTLSAddress(SDValue Op,
2015 SDValue SparcTargetLowering::LowerGlobalTLSAddress(SDValue Op,
2042 SDValue HiLo = makeHiLoPair(Op, HiTF, LoTF, DAG);
2043 SDValue Base = DAG.getNode(SPISD::GLOBAL_BASE_REG, DL, PtrVT);
2044 SDValue Argument = DAG.getNode(SPISD::TLS_ADD, DL, PtrVT, Base, HiLo,
2047 SDValue Chain = DAG.getEntryNode();
2048 SDValue InFlag;
2053 SDValue Callee = DAG.getTargetExternalSymbol("__tls_get_addr", PtrVT);
2054 SDValue Symbol = withTargetFlags(Op, callTF, DAG);
2060 SDValue Ops[] = {Chain,
2071 SDValue Ret = DAG.getCopyFromReg(Chain, DL, SP::O0, PtrVT, InFlag);
2076 SDValue Hi = DAG.getNode(SPISD::Hi, DL, PtrVT,
2078 SDValue Lo = DAG.getNode(SPISD::Lo, DL, PtrVT,
2089 SDValue Base = DAG.getNode(SPISD::GLOBAL_BASE_REG, DL, PtrVT);
2096 SDValue TGA = makeHiLoPair(Op,
2099 SDValue Ptr = DAG.getNode(ISD::ADD, DL, PtrVT, Base, TGA);
2100 SDValue Offset = DAG.getNode(SPISD::TLS_LD,
2110 SDValue Hi = DAG.getNode(SPISD::Hi, DL, PtrVT,
2112 SDValue Lo = DAG.getNode(SPISD::Lo, DL, PtrVT,
2114 SDValue Offset = DAG.getNode(ISD::XOR, DL, PtrVT, Hi, Lo);
2120 SDValue SparcTargetLowering::LowerF128_LibCallArg(SDValue Chain,
2120 SDValue SparcTargetLowering::LowerF128_LibCallArg(SDValue Chain,
2121 ArgListTy &Args, SDValue Arg,
2135 SDValue FIPtr = DAG.getFrameIndex(FI, getPointerTy(DAG.getDataLayout()));
2146 SDValue
2147 SparcTargetLowering::LowerF128Op(SDValue Op, SelectionDAG &DAG,
2156 SDValue Callee = DAG.getExternalSymbol(LibFuncName, PtrVT);
2159 SDValue Chain = DAG.getEntryNode();
2160 SDValue RetPtr;
2184 std::pair<SDValue, SDValue> CallInfo = LowerCallTo(CLI);
2184 std::pair<SDValue, SDValue> CallInfo = LowerCallTo(CLI);
2199 SDValue SparcTargetLowering::LowerF128Compare(SDValue LHS, SDValue RHS,
2199 SDValue SparcTargetLowering::LowerF128Compare(SDValue LHS, SDValue RHS,
2199 SDValue SparcTargetLowering::LowerF128Compare(SDValue LHS, SDValue RHS,
2224 SDValue Callee = DAG.getExternalSymbol(LibCall, PtrVT);
2227 SDValue Chain = DAG.getEntryNode();
2235 std::pair<SDValue, SDValue> CallInfo = LowerCallTo(CLI);
2235 std::pair<SDValue, SDValue> CallInfo = LowerCallTo(CLI);
2238 SDValue Result = CallInfo.first;
2242 SDValue RHS = DAG.getTargetConstant(0, DL, Result.getValueType());
2247 SDValue Mask = DAG.getConstant(1, DL, Result.getValueType());
2249 SDValue RHS = DAG.getTargetConstant(0, DL, Result.getValueType());
2254 SDValue RHS = DAG.getTargetConstant(2, DL, Result.getValueType());
2259 SDValue RHS = DAG.getTargetConstant(1, DL, Result.getValueType());
2264 SDValue RHS = DAG.getTargetConstant(1, DL, Result.getValueType());
2270 SDValue RHS = DAG.getTargetConstant(3, DL, Result.getValueType());
2275 SDValue RHS = DAG.getTargetConstant(3, DL, Result.getValueType());
2280 SDValue Mask = DAG.getConstant(3, DL, Result.getValueType());
2282 SDValue RHS = DAG.getTargetConstant(0, DL, Result.getValueType());
2287 SDValue Mask = DAG.getConstant(3, DL, Result.getValueType());
2289 SDValue RHS = DAG.getTargetConstant(0, DL, Result.getValueType());
2296 static SDValue
2297 LowerF128_FPEXTEND(SDValue Op, SelectionDAG &DAG,
2312 static SDValue
2313 LowerF128_FPROUND(SDValue Op, SelectionDAG &DAG,
2330 static SDValue LowerFP_TO_SINT(SDValue Op, SelectionDAG &DAG,
2330 static SDValue LowerFP_TO_SINT(SDValue Op, SelectionDAG &DAG,
2359 static SDValue LowerSINT_TO_FP(SDValue Op, SelectionDAG &DAG,
2359 static SDValue LowerSINT_TO_FP(SDValue Op, SelectionDAG &DAG,
2382 SDValue Tmp = DAG.getNode(ISD::BITCAST, dl, floatVT, Op.getOperand(0));
2387 static SDValue LowerFP_TO_UINT(SDValue Op, SelectionDAG &DAG,
2387 static SDValue LowerFP_TO_UINT(SDValue Op, SelectionDAG &DAG,
2408 static SDValue LowerUINT_TO_FP(SDValue Op, SelectionDAG &DAG,
2408 static SDValue LowerUINT_TO_FP(SDValue Op, SelectionDAG &DAG,
2427 static SDValue LowerBR_CC(SDValue Op, SelectionDAG &DAG,
2427 static SDValue LowerBR_CC(SDValue Op, SelectionDAG &DAG,
2430 SDValue Chain = Op.getOperand(0);
2432 SDValue LHS = Op.getOperand(2);
2433 SDValue RHS = Op.getOperand(3);
2434 SDValue Dest = Op.getOperand(4);
2443 SDValue CompareFlag;
2464 static SDValue LowerSELECT_CC(SDValue Op, SelectionDAG &DAG,
2464 static SDValue LowerSELECT_CC(SDValue Op, SelectionDAG &DAG,
2467 SDValue LHS = Op.getOperand(0);
2468 SDValue RHS = Op.getOperand(1);
2470 SDValue TrueVal = Op.getOperand(2);
2471 SDValue FalseVal = Op.getOperand(3);
2479 SDValue CompareFlag;
2500 static SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG,
2500 static SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG,
2512 SDValue Offset =
2520 static SDValue LowerVAARG(SDValue Op, SelectionDAG &DAG) {
2520 static SDValue LowerVAARG(SDValue Op, SelectionDAG &DAG) {
2523 SDValue InChain = Node->getOperand(0);
2524 SDValue VAListPtr = Node->getOperand(1);
2528 SDValue VAList =
2531 SDValue NextPtr = DAG.getNode(ISD::ADD, DL, PtrVT, VAList,
2543 static SDValue LowerDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG,
2543 static SDValue LowerDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG,
2545 SDValue Chain = Op.getOperand(0); // Legalize the chain.
2546 SDValue Size = Op.getOperand(1); // Legalize the size.
2594 SDValue SP = DAG.getCopyFromReg(Chain, dl, SPReg, VT);
2595 SDValue NewSP = DAG.getNode(ISD::SUB, dl, VT, SP, Size); // Value
2600 SDValue NewVal = DAG.getNode(ISD::ADD, dl, VT, NewSP,
2602 SDValue Ops[2] = { NewVal, Chain };
2607 static SDValue getFLUSHW(SDValue Op, SelectionDAG &DAG) {
2607 static SDValue getFLUSHW(SDValue Op, SelectionDAG &DAG) {
2609 SDValue Chain = DAG.getNode(SPISD::FLUSHW,
2614 static SDValue getFRAMEADDR(uint64_t depth, SDValue Op, SelectionDAG &DAG,
2614 static SDValue getFRAMEADDR(uint64_t depth, SDValue Op, SelectionDAG &DAG,
2625 SDValue FrameAddr;
2626 SDValue Chain;
2636 SDValue Ptr = DAG.getNode(ISD::ADD, dl, VT, FrameAddr,
2647 static SDValue LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG,
2647 static SDValue LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG,
2656 static SDValue LowerRETURNADDR(SDValue Op, SelectionDAG &DAG,
2656 static SDValue LowerRETURNADDR(SDValue Op, SelectionDAG &DAG,
2670 SDValue RetAddr;
2679 SDValue FrameAddr = getFRAMEADDR(depth - 1, Op, DAG, Subtarget, true);
2682 SDValue Ptr = DAG.getNode(ISD::ADD,
2691 static SDValue LowerF64Op(SDValue SrcReg64, const SDLoc &dl, SelectionDAG &DAG,
2691 static SDValue LowerF64Op(SDValue SrcReg64, const SDLoc &dl, SelectionDAG &DAG,
2705 SDValue Hi32 = DAG.getTargetExtractSubreg(SP::sub_even, dl, MVT::f32,
2707 SDValue Lo32 = DAG.getTargetExtractSubreg(SP::sub_odd, dl, MVT::f32,
2715 SDValue DstReg64 = SDValue(DAG.getMachineNode(TargetOpcode::IMPLICIT_DEF,
2725 static SDValue LowerF128Load(SDValue Op, SelectionDAG &DAG)
2725 static SDValue LowerF128Load(SDValue Op, SelectionDAG &DAG)
2736 SDValue Hi64 =
2740 SDValue LoPtr = DAG.getNode(ISD::ADD, dl, addrVT,
2743 SDValue Lo64 = DAG.getLoad(MVT::f64, dl, LdNode->getChain(), LoPtr,
2746 SDValue SubRegEven = DAG.getTargetConstant(SP::sub_even64, dl, MVT::i32);
2747 SDValue SubRegOdd = DAG.getTargetConstant(SP::sub_odd64, dl, MVT::i32);
2761 SDValue OutChains[2] = { SDValue(Hi64.getNode(), 1),
2763 SDValue OutChain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, OutChains);
2764 SDValue Ops[2] = {SDValue(InFP128,0), OutChain};
2768 static SDValue LowerLOAD(SDValue Op, SelectionDAG &DAG)
2768 static SDValue LowerLOAD(SDValue Op, SelectionDAG &DAG)
2780 static SDValue LowerF128Store(SDValue Op, SelectionDAG &DAG) {
2780 static SDValue LowerF128Store(SDValue Op, SelectionDAG &DAG) {
2785 SDValue SubRegEven = DAG.getTargetConstant(SP::sub_even64, dl, MVT::i32);
2786 SDValue SubRegOdd = DAG.getTargetConstant(SP::sub_odd64, dl, MVT::i32);
2803 SDValue OutChains[2];
2808 SDValue LoPtr = DAG.getNode(ISD::ADD, dl, addrVT,
2816 static SDValue LowerSTORE(SDValue Op, SelectionDAG &DAG)
2816 static SDValue LowerSTORE(SDValue Op, SelectionDAG &DAG)
2828 SDValue Val = DAG.getNode(ISD::BITCAST, dl, MVT::v2i32, St->getValue());
2829 SDValue Chain = DAG.getStore(
2838 static SDValue LowerFNEGorFABS(SDValue Op, SelectionDAG &DAG, bool isV9) {
2838 static SDValue LowerFNEGorFABS(SDValue Op, SelectionDAG &DAG, bool isV9) {
2854 SDValue SrcReg128 = Op.getOperand(0);
2855 SDValue Hi64 = DAG.getTargetExtractSubreg(SP::sub_even64, dl, MVT::f64,
2857 SDValue Lo64 = DAG.getTargetExtractSubreg(SP::sub_odd64, dl, MVT::f64,
2872 SDValue DstReg128 = SDValue(DAG.getMachineNode(TargetOpcode::IMPLICIT_DEF,
2881 static SDValue LowerADDC_ADDE_SUBC_SUBE(SDValue Op, SelectionDAG &DAG) {
2881 static SDValue LowerADDC_ADDE_SUBC_SUBE(SDValue Op, SelectionDAG &DAG) {
2887 SDValue Src1 = Op.getOperand(0);
2888 SDValue Src1Lo = DAG.getNode(ISD::TRUNCATE, dl, MVT::i32, Src1);
2889 SDValue Src1Hi = DAG.getNode(ISD::SRL, dl, MVT::i64, Src1,
2893 SDValue Src2 = Op.getOperand(1);
2894 SDValue Src2Lo = DAG.getNode(ISD::TRUNCATE, dl, MVT::i32, Src2);
2895 SDValue Src2Hi = DAG.getNode(ISD::SRL, dl, MVT::i64, Src2,
2909 SDValue Lo;
2917 SDValue Hi = DAG.getNode(hiOpc, dl, VTs, Src1Hi, Src2Hi, Lo.getValue(1));
2918 SDValue Carry = Hi.getValue(1);
2925 SDValue Dst = DAG.getNode(ISD::OR, dl, MVT::i64, Hi, Lo);
2926 SDValue Ops[2] = { Dst, Carry };
2932 static SDValue LowerUMULO_SMULO(SDValue Op, SelectionDAG &DAG,
2932 static SDValue LowerUMULO_SMULO(SDValue Op, SelectionDAG &DAG,
2942 SDValue LHS = Op.getOperand(0);
2947 SDValue ShiftAmt = DAG.getConstant(63, dl, VT);
2949 SDValue RHS = Op.getOperand(1);
2950 SDValue HiLHS = DAG.getNode(ISD::SRA, dl, VT, LHS, ShiftAmt);
2951 SDValue HiRHS = DAG.getNode(ISD::SRA, dl, MVT::i64, RHS, ShiftAmt);
2952 SDValue Args[] = { HiLHS, LHS, HiRHS, RHS };
2956 SDValue MulResult = TLI.makeLibCall(DAG,
2959 SDValue BottomHalf = DAG.getNode(ISD::EXTRACT_ELEMENT, dl, VT,
2961 SDValue TopHalf = DAG.getNode(ISD::EXTRACT_ELEMENT, dl, VT,
2964 SDValue Tmp1 = DAG.getNode(ISD::SRA, dl, VT, BottomHalf, ShiftAmt);
2976 SDValue Ops[2] = { BottomHalf, TopHalf } ;
2980 static SDValue LowerATOMIC_LOAD_STORE(SDValue Op, SelectionDAG &DAG) {
2980 static SDValue LowerATOMIC_LOAD_STORE(SDValue Op, SelectionDAG &DAG) {
2989 SDValue SparcTargetLowering::LowerINTRINSIC_WO_CHAIN(SDValue Op,
2989 SDValue SparcTargetLowering::LowerINTRINSIC_WO_CHAIN(SDValue Op,
3002 SDValue SparcTargetLowering::
3003 LowerOperation(SDValue Op, SelectionDAG &DAG) const {
3064 SDValue SparcTargetLowering::bitcastConstantFPToInt(ConstantFPSDNode *C,
3068 SDValue Lo = DAG.getConstant(V.zextOrTrunc(32), DL, MVT::i32);
3069 SDValue Hi = DAG.getConstant(V.lshr(32).zextOrTrunc(32), DL, MVT::i32);
3075 SDValue SparcTargetLowering::PerformBITCASTCombine(SDNode *N,
3078 SDValue Src = N->getOperand(0);
3087 SDValue SparcTargetLowering::PerformDAGCombine(SDNode *N,
3223 LowerAsmOperandForConstraint(SDValue Op,
3225 std::vector<SDValue> &Ops,
3227 SDValue Result(nullptr, 0);
3335 SmallVectorImpl<SDValue>& Results,
3363 SDValue Lo = DAG.getCopyFromReg(N->getOperand(0), dl, SP::ASR23, MVT::i32);
3364 SDValue Hi = DAG.getCopyFromReg(Lo, dl, SP::G0, MVT::i32);
3365 SDValue Ops[] = { Lo, Hi };
3366 SDValue Pair = DAG.getNode(ISD::BUILD_PAIR, dl, MVT::i64, Ops);
3395 SDValue LoadRes = DAG.getExtLoad(
3400 SDValue Res = DAG.getNode(ISD::BITCAST, dl, MVT::i64, LoadRes);
lib/Target/Sparc/SparcISelLowering.h 57 SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
57 SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
64 void computeKnownBitsForTargetNode(const SDValue Op,
80 void LowerAsmOperandForConstraint(SDValue Op,
82 std::vector<SDValue> &Ops,
126 SDValue
127 LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
130 SmallVectorImpl<SDValue> &InVals) const override;
131 SDValue LowerFormalArguments_32(SDValue Chain, CallingConv::ID CallConv,
131 SDValue LowerFormalArguments_32(SDValue Chain, CallingConv::ID CallConv,
135 SmallVectorImpl<SDValue> &InVals) const;
136 SDValue LowerFormalArguments_64(SDValue Chain, CallingConv::ID CallConv,
136 SDValue LowerFormalArguments_64(SDValue Chain, CallingConv::ID CallConv,
140 SmallVectorImpl<SDValue> &InVals) const;
142 SDValue
144 SmallVectorImpl<SDValue> &InVals) const override;
145 SDValue LowerCall_32(TargetLowering::CallLoweringInfo &CLI,
146 SmallVectorImpl<SDValue> &InVals) const;
147 SDValue LowerCall_64(TargetLowering::CallLoweringInfo &CLI,
148 SmallVectorImpl<SDValue> &InVals) const;
150 SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
150 SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
152 const SmallVectorImpl<SDValue> &OutVals,
154 SDValue LowerReturn_32(SDValue Chain, CallingConv::ID CallConv,
154 SDValue LowerReturn_32(SDValue Chain, CallingConv::ID CallConv,
157 const SmallVectorImpl<SDValue> &OutVals,
159 SDValue LowerReturn_64(SDValue Chain, CallingConv::ID CallConv,
159 SDValue LowerReturn_64(SDValue Chain, CallingConv::ID CallConv,
162 const SmallVectorImpl<SDValue> &OutVals,
165 SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const;
165 SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const;
166 SDValue LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const;
166 SDValue LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const;
167 SDValue LowerConstantPool(SDValue Op, SelectionDAG &DAG) const;
167 SDValue LowerConstantPool(SDValue Op, SelectionDAG &DAG) const;
168 SDValue LowerBlockAddress(SDValue Op, SelectionDAG &DAG) const;
168 SDValue LowerBlockAddress(SDValue Op, SelectionDAG &DAG) const;
170 SDValue withTargetFlags(SDValue Op, unsigned TF, SelectionDAG &DAG) const;
170 SDValue withTargetFlags(SDValue Op, unsigned TF, SelectionDAG &DAG) const;
171 SDValue makeHiLoPair(SDValue Op, unsigned HiTF, unsigned LoTF,
171 SDValue makeHiLoPair(SDValue Op, unsigned HiTF, unsigned LoTF,
173 SDValue makeAddress(SDValue Op, SelectionDAG &DAG) const;
173 SDValue makeAddress(SDValue Op, SelectionDAG &DAG) const;
175 SDValue LowerF128_LibCallArg(SDValue Chain, ArgListTy &Args, SDValue Arg,
175 SDValue LowerF128_LibCallArg(SDValue Chain, ArgListTy &Args, SDValue Arg,
175 SDValue LowerF128_LibCallArg(SDValue Chain, ArgListTy &Args, SDValue Arg,
177 SDValue LowerF128Op(SDValue Op, SelectionDAG &DAG,
177 SDValue LowerF128Op(SDValue Op, SelectionDAG &DAG,
180 SDValue LowerF128Compare(SDValue LHS, SDValue RHS, unsigned &SPCC,
180 SDValue LowerF128Compare(SDValue LHS, SDValue RHS, unsigned &SPCC,
180 SDValue LowerF128Compare(SDValue LHS, SDValue RHS, unsigned &SPCC,
183 SDValue LowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG) const;
183 SDValue LowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG) const;
185 SDValue PerformBITCASTCombine(SDNode *N, DAGCombinerInfo &DCI) const;
187 SDValue bitcastConstantFPToInt(ConstantFPSDNode *C, const SDLoc &DL,
190 SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const override;
208 SmallVectorImpl<SDValue>& Results,
lib/Target/SystemZ/SystemZISelDAGToDAG.cpp 59 SDValue Base;
61 SDValue Index;
120 RxSBGOperands(unsigned Op, SDValue N)
128 SDValue Input;
138 inline SDValue getImm(const SDNode *Node, uint64_t Imm) const {
155 bool selectAddress(SDValue N, SystemZAddressingMode &AM) const;
159 SDValue &Base, SDValue &Disp) const;
159 SDValue &Base, SDValue &Disp) const;
161 SDValue &Base, SDValue &Disp, SDValue &Index) const;
161 SDValue &Base, SDValue &Disp, SDValue &Index) const;
161 SDValue &Base, SDValue &Disp, SDValue &Index) const;
166 bool selectBDAddr(SystemZAddressingMode::DispRange DR, SDValue Addr,
167 SDValue &Base, SDValue &Disp) const;
167 SDValue &Base, SDValue &Disp) const;
172 bool selectMVIAddr(SystemZAddressingMode::DispRange DR, SDValue Addr,
173 SDValue &Base, SDValue &Disp) const;
173 SDValue &Base, SDValue &Disp) const;
179 SystemZAddressingMode::DispRange DR, SDValue Addr,
180 SDValue &Base, SDValue &Disp, SDValue &Index) const;
180 SDValue &Base, SDValue &Disp, SDValue &Index) const;
180 SDValue &Base, SDValue &Disp, SDValue &Index) const;
183 bool selectPCRelAddress(SDValue Addr, SDValue &Target) const {
183 bool selectPCRelAddress(SDValue Addr, SDValue &Target) const {
192 bool selectBDAddr12Only(SDValue Addr, SDValue &Base, SDValue &Disp) const {
192 bool selectBDAddr12Only(SDValue Addr, SDValue &Base, SDValue &Disp) const {
192 bool selectBDAddr12Only(SDValue Addr, SDValue &Base, SDValue &Disp) const {
195 bool selectBDAddr12Pair(SDValue Addr, SDValue &Base, SDValue &Disp) const {
195 bool selectBDAddr12Pair(SDValue Addr, SDValue &Base, SDValue &Disp) const {
195 bool selectBDAddr12Pair(SDValue Addr, SDValue &Base, SDValue &Disp) const {
198 bool selectBDAddr20Only(SDValue Addr, SDValue &Base, SDValue &Disp) const {
198 bool selectBDAddr20Only(SDValue Addr, SDValue &Base, SDValue &Disp) const {
198 bool selectBDAddr20Only(SDValue Addr, SDValue &Base, SDValue &Disp) const {
201 bool selectBDAddr20Pair(SDValue Addr, SDValue &Base, SDValue &Disp) const {
201 bool selectBDAddr20Pair(SDValue Addr, SDValue &Base, SDValue &Disp) const {
201 bool selectBDAddr20Pair(SDValue Addr, SDValue &Base, SDValue &Disp) const {
206 bool selectMVIAddr12Pair(SDValue Addr, SDValue &Base, SDValue &Disp) const {
206 bool selectMVIAddr12Pair(SDValue Addr, SDValue &Base, SDValue &Disp) const {
206 bool selectMVIAddr12Pair(SDValue Addr, SDValue &Base, SDValue &Disp) const {
209 bool selectMVIAddr20Pair(SDValue Addr, SDValue &Base, SDValue &Disp) const {
209 bool selectMVIAddr20Pair(SDValue Addr, SDValue &Base, SDValue &Disp) const {
209 bool selectMVIAddr20Pair(SDValue Addr, SDValue &Base, SDValue &Disp) const {
214 bool selectBDXAddr12Only(SDValue Addr, SDValue &Base, SDValue &Disp,
214 bool selectBDXAddr12Only(SDValue Addr, SDValue &Base, SDValue &Disp,
214 bool selectBDXAddr12Only(SDValue Addr, SDValue &Base, SDValue &Disp,
215 SDValue &Index) const {
220 bool selectBDXAddr12Pair(SDValue Addr, SDValue &Base, SDValue &Disp,
220 bool selectBDXAddr12Pair(SDValue Addr, SDValue &Base, SDValue &Disp,
220 bool selectBDXAddr12Pair(SDValue Addr, SDValue &Base, SDValue &Disp,
221 SDValue &Index) const {
226 bool selectDynAlloc12Only(SDValue Addr, SDValue &Base, SDValue &Disp,
226 bool selectDynAlloc12Only(SDValue Addr, SDValue &Base, SDValue &Disp,
226 bool selectDynAlloc12Only(SDValue Addr, SDValue &Base, SDValue &Disp,
227 SDValue &Index) const {
232 bool selectBDXAddr20Only(SDValue Addr, SDValue &Base, SDValue &Disp,
232 bool selectBDXAddr20Only(SDValue Addr, SDValue &Base, SDValue &Disp,
232 bool selectBDXAddr20Only(SDValue Addr, SDValue &Base, SDValue &Disp,
233 SDValue &Index) const {
238 bool selectBDXAddr20Only128(SDValue Addr, SDValue &Base, SDValue &Disp,
238 bool selectBDXAddr20Only128(SDValue Addr, SDValue &Base, SDValue &Disp,
238 bool selectBDXAddr20Only128(SDValue Addr, SDValue &Base, SDValue &Disp,
239 SDValue &Index) const {
244 bool selectBDXAddr20Pair(SDValue Addr, SDValue &Base, SDValue &Disp,
244 bool selectBDXAddr20Pair(SDValue Addr, SDValue &Base, SDValue &Disp,
244 bool selectBDXAddr20Pair(SDValue Addr, SDValue &Base, SDValue &Disp,
245 SDValue &Index) const {
250 bool selectLAAddr12Pair(SDValue Addr, SDValue &Base, SDValue &Disp,
250 bool selectLAAddr12Pair(SDValue Addr, SDValue &Base, SDValue &Disp,
250 bool selectLAAddr12Pair(SDValue Addr, SDValue &Base, SDValue &Disp,
251 SDValue &Index) const {
256 bool selectLAAddr20Pair(SDValue Addr, SDValue &Base, SDValue &Disp,
256 bool selectLAAddr20Pair(SDValue Addr, SDValue &Base, SDValue &Disp,
256 bool selectLAAddr20Pair(SDValue Addr, SDValue &Base, SDValue &Disp,
257 SDValue &Index) const {
267 bool selectBDVAddr12Only(SDValue Addr, SDValue Elem, SDValue &Base,
267 bool selectBDVAddr12Only(SDValue Addr, SDValue Elem, SDValue &Base,
267 bool selectBDVAddr12Only(SDValue Addr, SDValue Elem, SDValue &Base,
268 SDValue &Disp, SDValue &Index) const;
268 SDValue &Disp, SDValue &Index) const;
273 bool detectOrAndInsertion(SDValue &Op, uint64_t InsertMask) const;
284 SDValue getUNDEF(const SDLoc &DL, EVT VT) const;
287 SDValue convertTo(const SDLoc &DL, EVT VT, SDValue N) const;
287 SDValue convertTo(const SDLoc &DL, EVT VT, SDValue N) const;
304 void splitLargeImmediate(unsigned Opcode, SDNode *Node, SDValue Op0,
342 SDValue expandSelectBoolean(SDNode *Node);
365 bool SelectInlineAsmMemoryOperand(const SDValue &Op, unsigned ConstraintID,
366 std::vector<SDValue> &OutOps) override;
367 bool IsProfitableToFold(SDValue N, SDNode *U, SDNode *Root) const override;
402 SDValue Value) {
413 SDValue Value) {
424 static bool expandIndex(SystemZAddressingMode &AM, SDValue Base,
425 SDValue Index) {
437 SDValue Op0, uint64_t Op1) {
453 SDValue N = IsBase ? AM.Base : AM.Index;
460 SDValue Op0 = N.getOperand(0);
461 SDValue Op1 = N.getOperand(1);
482 SDValue Full = N.getOperand(0);
483 SDValue Base = N.getOperand(1);
484 SDValue Anchor = Base.getOperand(0);
566 bool SystemZDAGToDAGISel::selectAddress(SDValue Addr,
609 static void insertDAGNode(SelectionDAG *DAG, SDNode *Pos, SDValue N) {
624 EVT VT, SDValue &Base,
625 SDValue &Disp) const {
639 SDValue Trunc = CurDAG->getNode(ISD::TRUNCATE, DL, VT, Base);
649 EVT VT, SDValue &Base,
650 SDValue &Disp,
651 SDValue &Index) const {
661 SDValue Addr, SDValue &Base,
661 SDValue Addr, SDValue &Base,
662 SDValue &Disp) const {
672 SDValue Addr, SDValue &Base,
672 SDValue Addr, SDValue &Base,
673 SDValue &Disp) const {
684 SDValue Addr, SDValue &Base,
684 SDValue Addr, SDValue &Base,
685 SDValue &Disp, SDValue &Index) const {
685 SDValue &Disp, SDValue &Index) const {
694 bool SystemZDAGToDAGISel::selectBDVAddr12Only(SDValue Addr, SDValue Elem,
694 bool SystemZDAGToDAGISel::selectBDVAddr12Only(SDValue Addr, SDValue Elem,
695 SDValue &Base,
696 SDValue &Disp,
697 SDValue &Index) const {
698 SDValue Regs[2];
718 bool SystemZDAGToDAGISel::detectOrAndInsertion(SDValue &Op,
770 SDValue N = RxSBG.Input;
791 SDValue Input = N.getOperand(0);
814 SDValue Input = N.getOperand(0);
935 SDValue SystemZDAGToDAGISel::getUNDEF(const SDLoc &DL, EVT VT) const {
940 SDValue SystemZDAGToDAGISel::convertTo(const SDLoc &DL, EVT VT,
941 SDValue N) const {
1003 SDValue In = convertTo(DL, VT, RISBG.Input);
1004 SDValue Mask = CurDAG->getConstant(RISBG.Mask, DL, VT);
1005 SDValue New = CurDAG->getNode(ISD::AND, DL, VT, In, Mask);
1038 SDValue Ops[5] = {
1045 SDValue New = convertTo(
1078 SDValue Op0 = N->getOperand(I ^ 1);
1095 SDValue Ops[5] = {
1102 SDValue New = convertTo(
1109 SDValue Op0, uint64_t UpperVal,
1113 SDValue Upper = CurDAG->getConstant(UpperVal, DL, VT);
1135 SDValue Lower = CurDAG->getConstant(LowerVal, DL, VT);
1136 SDValue Or = CurDAG->getNode(Opcode, DL, VT, Upper, Lower);
1152 SmallVector<SDValue, 2> Ops;
1155 SDValue Op = CurDAG->getNode(VCI.Opcode, DL, VCI.VecVT, Ops);
1160 SDValue BitCast = CurDAG->getNode(ISD::BITCAST, DL, VT, Op);
1173 SDValue ElemV = N->getOperand(2);
1190 SDValue Base, Disp, Index;
1196 SDValue Ops[] = {
1207 SDValue Value = Store->getValue();
1213 SDValue ElemV = Value.getOperand(1);
1218 SDValue Vec = Value.getOperand(0);
1224 SDValue Base, Disp, Index;
1230 SDValue Ops[] = {
1241 SDValue StoredVal, SelectionDAG *CurDAG,
1243 SDValue &InputChain) {
1256 SDValue Load = StoredVal->getOperand(0);
1275 SDValue Chain = StoreNode->getChain();
1282 SmallVector<SDValue, 4> ChainOps;
1287 SDValue Op = Chain.getOperand(i);
1300 for (SDValue Op : StoredVal->ops())
1331 SDValue StoredVal = StoreNode->getOperand(1);
1369 SDValue InputChain;
1374 SDValue Operand = StoredVal.getOperand(1);
1385 SDValue Base, Disp;
1389 SDValue Ops[] = { Base, Disp, Operand, InputChain };
1499 auto Op0 = Node->getOperand(0);
1540 SDValue Op0 = Node->getOperand(0);
1541 SDValue Op1 = Node->getOperand(1);
1551 SDValue CCValid = Node->getOperand(2);
1552 SDValue CCMask = Node->getOperand(3);
1560 SDValue Op4 = Node->getOperand(4);
1626 SelectInlineAsmMemoryOperand(const SDValue &Op,
1628 std::vector<SDValue> &OutOps) {
1631 SDValue Base, Disp, Index;
1668 SDValue RC = CurDAG->getTargetConstant(TRC->getID(), DL, MVT::i32);
1700 SystemZDAGToDAGISel::IsProfitableToFold(SDValue N, SDNode *U,
1823 SDValue SystemZDAGToDAGISel::expandSelectBoolean(SDNode *Node) {
1841 SDValue CCReg = Node->getOperand(4);
1843 SDValue Result = CurDAG->getNode(SystemZISD::IPM, DL, MVT::i32, CCReg);
1897 SDValue Res;
lib/Target/SystemZ/SystemZISelLowering.cpp 35 Comparison(SDValue Op0In, SDValue Op1In)
35 Comparison(SDValue Op0In, SDValue Op1In)
39 SDValue Op0, Op1;
1152 LowerAsmOperandForConstraint(SDValue Op, std::string &Constraint,
1153 std::vector<SDValue> &Ops,
1240 static SDValue convertLocVTToValVT(SelectionDAG &DAG, const SDLoc &DL,
1241 CCValAssign &VA, SDValue Chain,
1242 SDValue Value) {
1269 static SDValue convertValVTToLocVT(SelectionDAG &DAG, const SDLoc &DL,
1270 CCValAssign &VA, SDValue Value) {
1293 SDValue SystemZTargetLowering::LowerFormalArguments(
1294 SDValue Chain, CallingConv::ID CallConv, bool IsVarArg,
1296 SelectionDAG &DAG, SmallVectorImpl<SDValue> &InVals) const {
1318 SDValue ArgValue;
1367 SDValue FIN = DAG.getFrameIndex(FI, PtrVT);
1387 SDValue Address = DAG.getNode(ISD::ADD, DL, PtrVT, ArgValue,
1416 SDValue MemOps[SystemZ::NumArgFPRs];
1420 SDValue FIN = DAG.getFrameIndex(FI, getPointerTy(DAG.getDataLayout()));
1423 SDValue ArgValue = DAG.getCopyFromReg(Chain, DL, VReg, MVT::f64);
1458 SDValue
1460 SmallVectorImpl<SDValue> &InVals) const {
1464 SmallVectorImpl<SDValue> &OutVals = CLI.OutVals;
1466 SDValue Chain = CLI.Chain;
1467 SDValue Callee = CLI.Callee;
1498 SmallVector<std::pair<unsigned, SDValue>, 9> RegsToPass;
1499 SmallVector<SDValue, 8> MemOpChains;
1500 SDValue StackPtr;
1503 SDValue ArgValue = OutVals[I];
1507 SDValue SpillSlot = DAG.CreateStackTemporary(Outs[I].ArgVT);
1517 SDValue PartValue = OutVals[I + 1];
1519 SDValue Address = DAG.getNode(ISD::ADD, DL, PtrVT, SpillSlot,
1543 SDValue Address = DAG.getNode(ISD::ADD, DL, PtrVT, StackPtr,
1559 SDValue Glue;
1580 SmallVector<SDValue, 8> Ops;
1624 SDValue RetValue = DAG.getCopyFromReg(Chain, DL, VA.getLocReg(),
1657 SDValue
1658 SystemZTargetLowering::LowerReturn(SDValue Chain, CallingConv::ID CallConv,
1661 const SmallVectorImpl<SDValue> &OutVals,
1679 SDValue Glue;
1680 SmallVector<SDValue, 4> RetOps;
1684 SDValue RetValue = OutVals[I];
1710 static bool isIntrinsicWithCCAndChain(SDValue Op, unsigned &Opcode,
1737 static bool isIntrinsicWithCC(SDValue Op, unsigned &Opcode, unsigned &CCValid) {
1895 static SDNode *emitIntrinsicWithCCAndChain(SelectionDAG &DAG, SDValue Op,
1899 SmallVector<SDValue, 6> Ops;
1907 SDValue Intr = DAG.getNode(Opcode, SDLoc(Op), RawVTs, Ops);
1908 SDValue OldChain = SDValue(Op.getNode(), 1);
1909 SDValue NewChain = SDValue(Intr.getNode(), 1);
1915 static SDNode *emitIntrinsicWithCC(SelectionDAG &DAG, SDValue Op,
1919 SmallVector<SDValue, 6> Ops;
1924 SDValue Intr = DAG.getNode(Opcode, SDLoc(Op), Op->getVTList(), Ops);
2051 static bool isNaturalMemoryOperand(SDValue Op, unsigned ICmpType) {
2191 SDValue ShlOp0 = C.Op0.getOperand(0);
2228 static bool isSimpleShift(SDValue N, unsigned &ShiftVal) {
2449 SDValue Call, unsigned CCValid, uint64_t CC,
2481 static Comparison getCmp(SelectionDAG &DAG, SDValue CmpOp0, SDValue CmpOp1,
2481 static Comparison getCmp(SelectionDAG &DAG, SDValue CmpOp0, SDValue CmpOp1,
2536 static SDValue emitCmp(SelectionDAG &DAG, const SDLoc &DL, Comparison &C) {
2566 SDValue Op0, SDValue Op1, SDValue &Hi,
2566 SDValue Op0, SDValue Op1, SDValue &Hi,
2566 SDValue Op0, SDValue Op1, SDValue &Hi,
2567 SDValue &Lo) {
2570 SDValue Mul = DAG.getNode(ISD::MUL, DL, MVT::i64, Op0, Op1);
2582 unsigned Opcode, SDValue Op0, SDValue Op1,
2582 unsigned Opcode, SDValue Op0, SDValue Op1,
2583 SDValue &Even, SDValue &Odd) {
2583 SDValue &Even, SDValue &Odd) {
2584 SDValue Result = DAG.getNode(Opcode, DL, MVT::Untyped, Op0, Op1);
2593 static SDValue emitSETCC(SelectionDAG &DAG, const SDLoc &DL, SDValue CCReg,
2593 static SDValue emitSETCC(SelectionDAG &DAG, const SDLoc &DL, SDValue CCReg,
2595 SDValue Ops[] = {DAG.getConstant(1, DL, MVT::i32),
2649 static SDValue expandV4F32ToV2F64(SelectionDAG &DAG, int Start, const SDLoc &DL,
2650 SDValue Op) {
2658 SDValue SystemZTargetLowering::getVectorCmp(SelectionDAG &DAG, unsigned Opcode,
2660 SDValue CmpOp0,
2661 SDValue CmpOp1) const {
2667 SDValue H0 = expandV4F32ToV2F64(DAG, 0, DL, CmpOp0);
2668 SDValue L0 = expandV4F32ToV2F64(DAG, 2, DL, CmpOp0);
2669 SDValue H1 = expandV4F32ToV2F64(DAG, 0, DL, CmpOp1);
2670 SDValue L1 = expandV4F32ToV2F64(DAG, 2, DL, CmpOp1);
2671 SDValue HRes = DAG.getNode(Opcode, DL, MVT::v2i64, H0, H1);
2672 SDValue LRes = DAG.getNode(Opcode, DL, MVT::v2i64, L0, L1);
2680 SDValue SystemZTargetLowering::lowerVectorSETCC(SelectionDAG &DAG,
2683 SDValue CmpOp0,
2684 SDValue CmpOp1) const {
2687 SDValue Cmp;
2695 SDValue LT = getVectorCmp(DAG, SystemZISD::VFCMPH, DL, VT, CmpOp1, CmpOp0);
2696 SDValue GE = getVectorCmp(DAG, SystemZISD::VFCMPHE, DL, VT, CmpOp0, CmpOp1);
2707 SDValue LT = getVectorCmp(DAG, SystemZISD::VFCMPH, DL, VT, CmpOp1, CmpOp0);
2708 SDValue GT = getVectorCmp(DAG, SystemZISD::VFCMPH, DL, VT, CmpOp0, CmpOp1);
2729 SDValue Mask =
2736 SDValue SystemZTargetLowering::lowerSETCC(SDValue Op,
2736 SDValue SystemZTargetLowering::lowerSETCC(SDValue Op,
2738 SDValue CmpOp0 = Op.getOperand(0);
2739 SDValue CmpOp1 = Op.getOperand(1);
2747 SDValue CCReg = emitCmp(DAG, DL, C);
2751 SDValue SystemZTargetLowering::lowerBR_CC(SDValue Op, SelectionDAG &DAG) const {
2751 SDValue SystemZTargetLowering::lowerBR_CC(SDValue Op, SelectionDAG &DAG) const {
2753 SDValue CmpOp0 = Op.getOperand(2);
2754 SDValue CmpOp1 = Op.getOperand(3);
2755 SDValue Dest = Op.getOperand(4);
2759 SDValue CCReg = emitCmp(DAG, DL, C);
2768 static bool isAbsolute(SDValue CmpOp, SDValue Pos, SDValue Neg) {
2768 static bool isAbsolute(SDValue CmpOp, SDValue Pos, SDValue Neg) {
2768 static bool isAbsolute(SDValue CmpOp, SDValue Pos, SDValue Neg) {
2779 static SDValue getAbsolute(SelectionDAG &DAG, const SDLoc &DL, SDValue Op,
2779 static SDValue getAbsolute(SelectionDAG &DAG, const SDLoc &DL, SDValue Op,
2788 SDValue SystemZTargetLowering::lowerSELECT_CC(SDValue Op,
2788 SDValue SystemZTargetLowering::lowerSELECT_CC(SDValue Op,
2790 SDValue CmpOp0 = Op.getOperand(0);
2791 SDValue CmpOp1 = Op.getOperand(1);
2792 SDValue TrueOp = Op.getOperand(2);
2793 SDValue FalseOp = Op.getOperand(3);
2813 SDValue CCReg = emitCmp(DAG, DL, C);
2814 SDValue Ops[] = {TrueOp, FalseOp,
2821 SDValue SystemZTargetLowering::lowerGlobalAddress(GlobalAddressSDNode *Node,
2829 SDValue Result;
2839 SDValue Full = DAG.getTargetGlobalAddress(GV, DL, PtrVT, Anchor + Offset);
2859 SDValue SystemZTargetLowering::lowerTLSGetOffset(GlobalAddressSDNode *Node,
2862 SDValue GOTOffset) const {
2865 SDValue Chain = DAG.getEntryNode();
2866 SDValue Glue;
2869 SDValue GOT = DAG.getGLOBAL_OFFSET_TABLE(PtrVT);
2876 SmallVector<SDValue, 8> Ops;
2906 SDValue SystemZTargetLowering::lowerThreadPointer(const SDLoc &DL,
2908 SDValue Chain = DAG.getEntryNode();
2912 SDValue TPHi = DAG.getCopyFromReg(Chain, DL, SystemZ::A0, MVT::i32);
2916 SDValue TPLo = DAG.getCopyFromReg(Chain, DL, SystemZ::A1, MVT::i32);
2920 SDValue TPHiShifted = DAG.getNode(ISD::SHL, DL, PtrVT, TPHi,
2925 SDValue SystemZTargetLowering::lowerGlobalTLSAddress(GlobalAddressSDNode *Node,
2934 SDValue TP = lowerThreadPointer(DL, DAG);
2937 SDValue Offset;
2977 SDValue DTPOffset = DAG.getConstantPool(CPV, PtrVT, 8);
3014 SDValue SystemZTargetLowering::lowerBlockAddress(BlockAddressSDNode *Node,
3021 SDValue Result = DAG.getTargetBlockAddress(BA, PtrVT, Offset);
3026 SDValue SystemZTargetLowering::lowerJumpTable(JumpTableSDNode *JT,
3030 SDValue Result = DAG.getTargetJumpTable(JT->getIndex(), PtrVT);
3036 SDValue SystemZTargetLowering::lowerConstantPool(ConstantPoolSDNode *CP,
3041 SDValue Result;
3053 SDValue SystemZTargetLowering::lowerFRAMEADDR(SDValue Op,
3053 SDValue SystemZTargetLowering::lowerFRAMEADDR(SDValue Op,
3071 SDValue BackChain = DAG.getFrameIndex(BackChainIdx, PtrVT);
3081 SDValue SystemZTargetLowering::lowerRETURNADDR(SDValue Op,
3081 SDValue SystemZTargetLowering::lowerRETURNADDR(SDValue Op,
3104 SDValue SystemZTargetLowering::lowerBITCAST(SDValue Op,
3104 SDValue SystemZTargetLowering::lowerBITCAST(SDValue Op,
3107 SDValue In = Op.getOperand(0);
3116 SDValue NewLoad = DAG.getLoad(ResVT, DL, LoadN->getChain(),
3124 SDValue In64;
3135 SDValue Out64 = DAG.getNode(ISD::BITCAST, DL, MVT::f64, In64);
3141 SDValue In64 = DAG.getTargetInsertSubreg(SystemZ::subreg_h32, DL,
3143 SDValue Out64 = DAG.getNode(ISD::BITCAST, DL, MVT::i64, In64);
3147 SDValue Shift = DAG.getNode(ISD::SRL, DL, MVT::i64, Out64,
3154 SDValue SystemZTargetLowering::lowerVASTART(SDValue Op,
3154 SDValue SystemZTargetLowering::lowerVASTART(SDValue Op,
3161 SDValue Chain = Op.getOperand(0);
3162 SDValue Addr = Op.getOperand(1);
3168 SDValue Fields[NumFields] = {
3176 SDValue MemOps[NumFields];
3179 SDValue FieldAddr = Addr;
3190 SDValue SystemZTargetLowering::lowerVACOPY(SDValue Op,
3190 SDValue SystemZTargetLowering::lowerVACOPY(SDValue Op,
3192 SDValue Chain = Op.getOperand(0);
3193 SDValue DstPtr = Op.getOperand(1);
3194 SDValue SrcPtr = Op.getOperand(2);
3205 SDValue SystemZTargetLowering::
3206 lowerDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG) const {
3212 SDValue Chain = Op.getOperand(0);
3213 SDValue Size = Op.getOperand(1);
3214 SDValue Align = Op.getOperand(2);
3227 SDValue NeededSpace = Size;
3230 SDValue OldSP = DAG.getCopyFromReg(Chain, DL, SPReg, MVT::i64);
3233 SDValue Backchain;
3243 SDValue NewSP = DAG.getNode(ISD::SUB, DL, MVT::i64, OldSP, NeededSpace);
3251 SDValue ArgAdjust = DAG.getNode(SystemZISD::ADJDYNALLOC, DL, MVT::i64);
3252 SDValue Result = DAG.getNode(ISD::ADD, DL, MVT::i64, NewSP, ArgAdjust);
3267 SDValue Ops[2] = { Result, Chain };
3271 SDValue SystemZTargetLowering::lowerGET_DYNAMIC_AREA_OFFSET(
3272 SDValue Op, SelectionDAG &DAG) const {
3278 SDValue SystemZTargetLowering::lowerSMUL_LOHI(SDValue Op,
3278 SDValue SystemZTargetLowering::lowerSMUL_LOHI(SDValue Op,
3282 SDValue Ops[2];
3308 SDValue C63 = DAG.getConstant(63, DL, MVT::i64);
3309 SDValue LL = Op.getOperand(0);
3310 SDValue RL = Op.getOperand(1);
3311 SDValue LH = DAG.getNode(ISD::SRA, DL, VT, LL, C63);
3312 SDValue RH = DAG.getNode(ISD::SRA, DL, VT, RL, C63);
3318 SDValue NegLLTimesRH = DAG.getNode(ISD::AND, DL, VT, LL, RH);
3319 SDValue NegLHTimesRL = DAG.getNode(ISD::AND, DL, VT, LH, RL);
3320 SDValue NegSum = DAG.getNode(ISD::ADD, DL, VT, NegLLTimesRH, NegLHTimesRL);
3326 SDValue SystemZTargetLowering::lowerUMUL_LOHI(SDValue Op,
3326 SDValue SystemZTargetLowering::lowerUMUL_LOHI(SDValue Op,
3330 SDValue Ops[2];
3345 SDValue SystemZTargetLowering::lowerSDIVREM(SDValue Op,
3345 SDValue SystemZTargetLowering::lowerSDIVREM(SDValue Op,
3347 SDValue Op0 = Op.getOperand(0);
3348 SDValue Op1 = Op.getOperand(1);
3362 SDValue Ops[2];
3367 SDValue SystemZTargetLowering::lowerUDIVREM(SDValue Op,
3367 SDValue SystemZTargetLowering::lowerUDIVREM(SDValue Op,
3374 SDValue Ops[2];
3380 SDValue SystemZTargetLowering::lowerOR(SDValue Op, SelectionDAG &DAG) const {
3380 SDValue SystemZTargetLowering::lowerOR(SDValue Op, SelectionDAG &DAG) const {
3384 SDValue Ops[] = {Op.getOperand(0), Op.getOperand(1)};
3400 SDValue LowOp = Ops[Low];
3401 SDValue HighOp = Ops[High];
3419 SDValue HighOp0 = HighOp.getOperand(0);
3430 SDValue Low32 = DAG.getNode(ISD::TRUNCATE, DL, MVT::i32, LowOp);
3436 SDValue SystemZTargetLowering::lowerXALUO(SDValue Op,
3436 SDValue SystemZTargetLowering::lowerXALUO(SDValue Op,
3439 SDValue LHS = N->getOperand(0);
3440 SDValue RHS = N->getOperand(1);
3471 SDValue Result = DAG.getNode(BaseOp, DL, VTs, LHS, RHS);
3473 SDValue SetCC = emitSETCC(DAG, DL, Result.getValue(1), CCValid, CCMask);
3480 static bool isAddCarryChain(SDValue Carry) {
3486 static bool isSubBorrowChain(SDValue Carry) {
3493 SDValue SystemZTargetLowering::lowerADDSUBCARRY(SDValue Op,
3493 SDValue SystemZTargetLowering::lowerADDSUBCARRY(SDValue Op,
3503 SDValue LHS = N->getOperand(0);
3504 SDValue RHS = N->getOperand(1);
3505 SDValue Carry = Op.getOperand(2);
3537 SDValue Result = DAG.getNode(BaseOp, DL, VTs, LHS, RHS, Carry);
3539 SDValue SetCC = emitSETCC(DAG, DL, Result.getValue(1), CCValid, CCMask);
3546 SDValue SystemZTargetLowering::lowerCTPOP(SDValue Op,
3546 SDValue SystemZTargetLowering::lowerCTPOP(SDValue Op,
3561 SDValue Shift = DAG.getConstant(8, DL, MVT::i32);
3562 SDValue Tmp = DAG.getNode(SystemZISD::VSHL_BY_SCALAR, DL, VT, Op, Shift);
3568 SDValue Tmp = DAG.getSplatBuildVector(MVT::v16i8, DL,
3574 SDValue Tmp = DAG.getSplatBuildVector(MVT::v16i8, DL,
3605 SDValue Tmp = DAG.getNode(ISD::SHL, DL, VT, Op, DAG.getConstant(I, DL, VT));
3620 SDValue SystemZTargetLowering::lowerATOMIC_FENCE(SDValue Op,
3620 SDValue SystemZTargetLowering::lowerATOMIC_FENCE(SDValue Op,
3642 SDValue SystemZTargetLowering::lowerATOMIC_LOAD(SDValue Op,
3642 SDValue SystemZTargetLowering::lowerATOMIC_LOAD(SDValue Op,
3651 SDValue SystemZTargetLowering::lowerATOMIC_STORE(SDValue Op,
3651 SDValue SystemZTargetLowering::lowerATOMIC_STORE(SDValue Op,
3654 SDValue Chain = DAG.getTruncStore(Node->getChain(), SDLoc(Op), Node->getVal(),
3667 SDValue SystemZTargetLowering::lowerATOMIC_LOAD_OP(SDValue Op,
3667 SDValue SystemZTargetLowering::lowerATOMIC_LOAD_OP(SDValue Op,
3679 SDValue ChainIn = Node->getChain();
3680 SDValue Addr = Node->getBasePtr();
3681 SDValue Src2 = Node->getVal();
3694 SDValue AlignedAddr = DAG.getNode(ISD::AND, DL, PtrVT, Addr,
3699 SDValue BitShift = DAG.getNode(ISD::SHL, DL, PtrVT, Addr,
3705 SDValue NegBitShift = DAG.getNode(ISD::SUB, DL, WideVT,
3723 SDValue Ops[] = { ChainIn, AlignedAddr, Src2, BitShift, NegBitShift,
3725 SDValue AtomicOp = DAG.getMemIntrinsicNode(Opcode, DL, VTList, Ops,
3730 SDValue ResultShift = DAG.getNode(ISD::ADD, DL, WideVT, BitShift,
3732 SDValue Result = DAG.getNode(ISD::ROTL, DL, WideVT, AtomicOp, ResultShift);
3734 SDValue RetOps[2] = { Result, AtomicOp.getValue(1) };
3741 SDValue SystemZTargetLowering::lowerATOMIC_LOAD_SUB(SDValue Op,
3741 SDValue SystemZTargetLowering::lowerATOMIC_LOAD_SUB(SDValue Op,
3748 SDValue Src2 = Node->getVal();
3749 SDValue NegSrc2;
3776 SDValue SystemZTargetLowering::lowerATOMIC_CMP_SWAP(SDValue Op,
3776 SDValue SystemZTargetLowering::lowerATOMIC_CMP_SWAP(SDValue Op,
3779 SDValue ChainIn = Node->getOperand(0);
3780 SDValue Addr = Node->getOperand(1);
3781 SDValue CmpVal = Node->getOperand(2);
3782 SDValue SwapVal = Node->getOperand(3);
3792 SDValue Ops[] = { ChainIn, Addr, CmpVal, SwapVal };
3793 SDValue AtomicOp = DAG.getMemIntrinsicNode(SystemZISD::ATOMIC_CMP_SWAP,
3795 SDValue Success = emitSETCC(DAG, DL, AtomicOp.getValue(1),
3810 SDValue AlignedAddr = DAG.getNode(ISD::AND, DL, PtrVT, Addr,
3815 SDValue BitShift = DAG.getNode(ISD::SHL, DL, PtrVT, Addr,
3821 SDValue NegBitShift = DAG.getNode(ISD::SUB, DL, WideVT,
3826 SDValue Ops[] = { ChainIn, AlignedAddr, CmpVal, SwapVal, BitShift,
3828 SDValue AtomicOp = DAG.getMemIntrinsicNode(SystemZISD::ATOMIC_CMP_SWAPW, DL,
3830 SDValue Success = emitSETCC(DAG, DL, AtomicOp.getValue(1),
3860 SDValue SystemZTargetLowering::lowerSTACKSAVE(SDValue Op,
3860 SDValue SystemZTargetLowering::lowerSTACKSAVE(SDValue Op,
3868 SDValue SystemZTargetLowering::lowerSTACKRESTORE(SDValue Op,
3868 SDValue SystemZTargetLowering::lowerSTACKRESTORE(SDValue Op,
3874 SDValue Chain = Op.getOperand(0);
3875 SDValue NewSP = Op.getOperand(1);
3876 SDValue Backchain;
3880 SDValue OldSP = DAG.getCopyFromReg(Chain, DL, SystemZ::R15D, MVT::i64);
3892 SDValue SystemZTargetLowering::lowerPREFETCH(SDValue Op,
3892 SDValue SystemZTargetLowering::lowerPREFETCH(SDValue Op,
3903 SDValue Ops[] = {Op.getOperand(0), DAG.getTargetConstant(Code, DL, MVT::i32),
3911 static SDValue getCCResult(SelectionDAG &DAG, SDValue CCReg) {
3911 static SDValue getCCResult(SelectionDAG &DAG, SDValue CCReg) {
3913 SDValue IPM = DAG.getNode(SystemZISD::IPM, DL, MVT::i32, CCReg);
3918 SDValue
3919 SystemZTargetLowering::lowerINTRINSIC_W_CHAIN(SDValue Op,
3925 SDValue CC = getCCResult(DAG, SDValue(Node, 0));
3933 SDValue
3934 SystemZTargetLowering::lowerINTRINSIC_WO_CHAIN(SDValue Op,
4149 static bool getVPermMask(SDValue ShuffleOp,
4232 static SDValue getPermuteNode(SelectionDAG &DAG, const SDLoc &DL,
4233 const Permute &P, SDValue Op0, SDValue Op1) {
4233 const Permute &P, SDValue Op0, SDValue Op1) {
4244 SDValue Op;
4246 SDValue Op2 = DAG.getTargetConstant(P.Operand, DL, MVT::i32);
4261 static SDValue getGeneralPermuteNode(SelectionDAG &DAG, const SDLoc &DL,
4262 SDValue *Ops,
4275 SDValue IndexNodes[SystemZ::VectorBytes];
4281 SDValue Op2 = DAG.getBuildVector(MVT::v16i8, DL, IndexNodes);
4290 bool add(SDValue, unsigned);
4291 SDValue getNode(SelectionDAG &, const SDLoc &);
4294 SmallVector<SDValue, SystemZ::VectorBytes> Ops;
4319 bool GeneralShuffle::add(SDValue Op, unsigned Elem) {
4379 SDValue GeneralShuffle::getNode(SelectionDAG &DAG, const SDLoc &DL) {
4401 SDValue SubOps[] = { Ops[I], Ops[I + Stride] };
4449 SDValue Op;
4458 static bool isScalarToVector(SDValue Op) {
4467 static SDValue buildScalarToVector(SelectionDAG &DAG, const SDLoc &DL, EVT VT,
4468 SDValue Value) {
4473 SmallVector<SDValue, 16> Ops(VT.getVectorNumElements(), Value);
4483 static SDValue buildMergeScalars(SelectionDAG &DAG, const SDLoc &DL, EVT VT,
4484 SDValue Op0, SDValue Op1) {
4484 SDValue Op0, SDValue Op1) {
4499 static SDValue joinDwords(SelectionDAG &DAG, const SDLoc &DL, SDValue Op0,
4499 static SDValue joinDwords(SelectionDAG &DAG, const SDLoc &DL, SDValue Op0,
4500 SDValue Op1) {
4520 static SDValue tryBuildVectorShuffle(SelectionDAG &DAG,
4530 SmallVector<SDValue, SystemZ::VectorBytes> ResidueOps;
4533 SDValue Op = BVN->getOperand(I);
4559 for (auto &Op : GS.Ops) {
4569 bool SystemZTargetLowering::isVectorElementLoad(SDValue Op) const {
4578 SDValue
4580 SmallVectorImpl<SDValue> &Elems) const {
4582 SDValue Single;
4585 for (auto Elem : Elems) {
4614 for (auto Elem : Elems)
4636 SDValue Op01 = buildMergeScalars(DAG, DL, VT, Elems[0], Elems[1]);
4637 SDValue Op23 = buildMergeScalars(DAG, DL, VT, Elems[2], Elems[3]);
4648 SDValue Op = DAG.getNode(SystemZISD::MERGE_HIGH,
4654 SmallVector<SDValue, SystemZ::VectorBytes> Constants(NumElements, SDValue());
4659 SDValue Elem = Elems[I];
4670 SDValue Result;
4671 SDValue ReplicatedVal;
4703 SDValue Elem1 = Elems[Def1 ? I1 : I2];
4704 SDValue Elem2 = Elems[Def2 ? I2 : I1];
4722 SDValue SystemZTargetLowering::lowerBUILD_VECTOR(SDValue Op,
4722 SDValue SystemZTargetLowering::lowerBUILD_VECTOR(SDValue Op,
4737 if (SDValue Res = tryBuildVectorShuffle(DAG, BVN))
4746 SmallVector<SDValue, SystemZ::VectorBytes> Ops(NumElements);
4752 SDValue SystemZTargetLowering::lowerVECTOR_SHUFFLE(SDValue Op,
4752 SDValue SystemZTargetLowering::lowerVECTOR_SHUFFLE(SDValue Op,
4760 SDValue Op0 = Op.getOperand(0);
4785 SDValue SystemZTargetLowering::lowerSCALAR_TO_VECTOR(SDValue Op,
4785 SDValue SystemZTargetLowering::lowerSCALAR_TO_VECTOR(SDValue Op,
4794 SDValue SystemZTargetLowering::lowerINSERT_VECTOR_ELT(SDValue Op,
4794 SDValue SystemZTargetLowering::lowerINSERT_VECTOR_ELT(SDValue Op,
4798 SDValue Op0 = Op.getOperand(0);
4799 SDValue Op1 = Op.getOperand(1);
4800 SDValue Op2 = Op.getOperand(2);
4819 SDValue Res = DAG.getNode(ISD::INSERT_VECTOR_ELT, DL, IntVecVT,
4825 SDValue
4826 SystemZTargetLowering::lowerEXTRACT_VECTOR_ELT(SDValue Op,
4830 SDValue Op0 = Op.getOperand(0);
4831 SDValue Op1 = Op.getOperand(1);
4846 SDValue Res = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, IntVT,
4851 SDValue
4852 SystemZTargetLowering::lowerExtendVectorInreg(SDValue Op, SelectionDAG &DAG,
4854 SDValue PackedOp = Op.getOperand(0);
4868 SDValue SystemZTargetLowering::lowerShift(SDValue Op, SelectionDAG &DAG,
4868 SDValue SystemZTargetLowering::lowerShift(SDValue Op, SelectionDAG &DAG,
4871 SDValue Op0 = Op.getOperand(0);
4872 SDValue Op1 = Op.getOperand(1);
4887 SDValue Shift = DAG.getConstant(SplatBits.getZExtValue() & 0xfff,
4893 SDValue Splat = BVN->getSplatValue(&UndefElements);
4897 SDValue Shift = DAG.getNode(ISD::TRUNCATE, DL, MVT::i32, Splat);
4906 SDValue VSNOp0 = VSN->getOperand(0);
4914 SDValue Shift = DAG.getNode(ISD::TRUNCATE, DL, MVT::i32,
4925 SDValue SystemZTargetLowering::LowerOperation(SDValue Op,
4925 SDValue SystemZTargetLowering::LowerOperation(SDValue Op,
5046 static SDValue lowerI128ToGR128(SelectionDAG &DAG, SDValue In) {
5046 static SDValue lowerI128ToGR128(SelectionDAG &DAG, SDValue In) {
5048 SDValue Lo = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i64, In,
5050 SDValue Hi = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i64, In,
5057 static SDValue lowerGR128ToI128(SelectionDAG &DAG, SDValue In) {
5057 static SDValue lowerGR128ToI128(SelectionDAG &DAG, SDValue In) {
5059 SDValue Hi = DAG.getTargetExtractSubreg(SystemZ::subreg_h64,
5061 SDValue Lo = DAG.getTargetExtractSubreg(SystemZ::subreg_l64,
5068 SmallVectorImpl<SDValue> &Results,
5074 SDValue Ops[] = { N->getOperand(0), N->getOperand(1) };
5076 SDValue Res = DAG.getMemIntrinsicNode(SystemZISD::ATOMIC_LOAD_128,
5085 SDValue Ops[] = { N->getOperand(0),
5089 SDValue Res = DAG.getMemIntrinsicNode(SystemZISD::ATOMIC_STORE_128,
5103 SDValue Ops[] = { N->getOperand(0), N->getOperand(1),
5107 SDValue Res = DAG.getMemIntrinsicNode(SystemZISD::ATOMIC_CMP_SWAP_128,
5109 SDValue Success = emitSETCC(DAG, DL, Res.getValue(1),
5124 SmallVectorImpl<SDValue> &Results,
5266 SDValue SystemZTargetLowering::combineExtract(const SDLoc &DL, EVT ResVT,
5267 EVT VecVT, SDValue Op,
5372 SDValue SystemZTargetLowering::combineTruncateExtract(
5373 const SDLoc &DL, EVT TruncVT, SDValue Op, DAGCombinerInfo &DCI) const {
5379 SDValue Vec = Op.getOperand(0);
5407 SDValue SystemZTargetLowering::combineZERO_EXTEND(
5411 SDValue N0 = N->getOperand(0);
5418 SDValue Ops[] = { DAG.getConstant(TrueOp->getZExtValue(), DL, VT),
5421 SDValue NewSelect = DAG.getNode(SystemZISD::SELECT_CCMASK, DL, VT, Ops);
5424 SDValue TruncSelect =
5434 SDValue SystemZTargetLowering::combineSIGN_EXTEND_INREG(
5440 SDValue N0 = N->getOperand(0);
5447 SDValue Ops[] = { N0.getOperand(0), N0.getOperand(1),
5455 SDValue SystemZTargetLowering::combineSIGN_EXTEND(
5461 SDValue N0 = N->getOperand(0);
5465 SDValue Inner = N0.getOperand(0);
5472 SDValue Ext = DAG.getNode(ISD::ANY_EXTEND, SDLoc(Inner), VT,
5474 SDValue Shl = DAG.getNode(ISD::SHL, SDLoc(Inner), VT, Ext,
5485 SDValue SystemZTargetLowering::combineMERGE(
5489 SDValue Op0 = N->getOperand(0);
5490 SDValue Op1 = N->getOperand(1);
5511 SDValue Op = DAG.getNode(Opcode, SDLoc(N), OutVT, Op1);
5519 SDValue SystemZTargetLowering::combineLOAD(
5531 SDValue Replicate;
5547 SDValue Extract0 = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, LdVT,
5551 SmallVector<SDValue, 8> Ops;
5552 for (SDValue Op : U->ops())
5584 SDValue SystemZTargetLowering::combineSTORE(
5595 if (SDValue Value =
5611 SDValue BSwapOp = Op1.getOperand(0);
5616 SDValue Ops[] = {
5632 SDValue Ops[] = {
5645 SDValue SystemZTargetLowering::combineVECTOR_SHUFFLE(
5655 SDValue Load = N->getOperand(0);
5659 SDValue Ops[] = {
5663 SDValue ESLoad =
5684 SDValue SystemZTargetLowering::combineEXTRACT_VECTOR_ELT(
5692 SDValue Op = N->getOperand(0);
5717 SDValue Op0 = N->getOperand(0);
5725 SDValue SystemZTargetLowering::combineJOIN_DWORDS(
5735 SDValue SystemZTargetLowering::combineFP_ROUND(
5748 SDValue Op0 = N->getOperand(0);
5755 SDValue Vec = Op0.getOperand(0);
5763 SDValue OtherRound = SDValue(*U->use_begin(), 0);
5767 SDValue VRound = DAG.getNode(SystemZISD::VROUND, SDLoc(N),
5770 SDValue Extract1 =
5775 SDValue Extract0 =
5786 SDValue SystemZTargetLowering::combineFP_EXTEND(
5799 SDValue Op0 = N->getOperand(0);
5806 SDValue Vec = Op0.getOperand(0);
5814 SDValue OtherExtend = SDValue(*U->use_begin(), 0);
5818 SDValue VExtend = DAG.getNode(SystemZISD::VEXTEND, SDLoc(N),
5821 SDValue Extract1 =
5826 SDValue Extract0 =
5837 SDValue SystemZTargetLowering::combineBSWAP(
5844 SDValue Load = N->getOperand(0);
5848 SDValue Ops[] = {
5855 SDValue BSLoad =
5861 SDValue ResVal = BSLoad;
5878 SDValue Op = N->getOperand(0);
5888 SDValue Vec = Op.getOperand(0);
5889 SDValue Elt = Op.getOperand(1);
5890 SDValue Idx = Op.getOperand(2);
5920 SDValue Op0 = Op.getOperand(0);
5921 SDValue Op1 = Op.getOperand(1);
5947 static bool combineCCMask(SDValue &CCReg, int &CCValid, int &CCMask) {
6042 SDValue SystemZTargetLowering::combineBR_CCMASK(
6054 SDValue Chain = N->getOperand(0);
6055 SDValue CCReg = N->getOperand(4);
6066 SDValue SystemZTargetLowering::combineSELECT_CCMASK(
6078 SDValue CCReg = N->getOperand(4);
6090 SDValue SystemZTargetLowering::combineGET_CCMASK(
6101 SDValue Select = N->getOperand(0);
6131 SDValue SystemZTargetLowering::combineIntDIVREM(
6148 SDValue SystemZTargetLowering::unwrapAddress(SDValue N) const {
6148 SDValue SystemZTargetLowering::unwrapAddress(SDValue N) const {
6154 SDValue SystemZTargetLowering::PerformDAGCombine(SDNode *N,
6185 static APInt getDemandedSrcElements(SDValue Op, const APInt &DemandedElts,
6282 static void computeKnownBitsBinOp(const SDValue Op, KnownBits &Known,
6297 SystemZTargetLowering::computeKnownBitsForTargetNode(const SDValue Op,
6355 SDValue SrcOp = Op.getOperand(1);
6374 SDValue SrcOp = Op.getOperand(0);
6391 static unsigned computeNumSignBitsBinOp(SDValue Op, const APInt &DemandedElts,
6416 SDValue Op, const APInt &DemandedElts, const SelectionDAG &DAG,
6446 SDValue PackedOp = Op.getOperand(1);
lib/Target/SystemZ/SystemZISelLowering.h 430 void LowerAsmOperandForConstraint(SDValue Op,
432 std::vector<SDValue> &Ops,
479 SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
479 SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
480 void LowerOperationWrapper(SDNode *N, SmallVectorImpl<SDValue> &Results,
482 void ReplaceNodeResults(SDNode *N, SmallVectorImpl<SDValue>&Results,
487 SDValue LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv,
487 SDValue LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv,
491 SmallVectorImpl<SDValue> &InVals) const override;
492 SDValue LowerCall(CallLoweringInfo &CLI,
493 SmallVectorImpl<SDValue> &InVals) const override;
499 SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool IsVarArg,
499 SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool IsVarArg,
501 const SmallVectorImpl<SDValue> &OutVals, const SDLoc &DL,
503 SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const override;
507 void computeKnownBitsForTargetNode(const SDValue Op,
514 unsigned ComputeNumSignBitsForTargetNode(SDValue Op,
531 SDValue getVectorCmp(SelectionDAG &DAG, unsigned Opcode,
533 SDValue CmpOp0, SDValue CmpOp1) const;
533 SDValue CmpOp0, SDValue CmpOp1) const;
534 SDValue lowerVectorSETCC(SelectionDAG &DAG, const SDLoc &DL,
536 SDValue CmpOp0, SDValue CmpOp1) const;
536 SDValue CmpOp0, SDValue CmpOp1) const;
537 SDValue lowerSETCC(SDValue Op, SelectionDAG &DAG) const;
537 SDValue lowerSETCC(SDValue Op, SelectionDAG &DAG) const;
538 SDValue lowerBR_CC(SDValue Op, SelectionDAG &DAG) const;
538 SDValue lowerBR_CC(SDValue Op, SelectionDAG &DAG) const;
539 SDValue lowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const;
539 SDValue lowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const;
540 SDValue lowerGlobalAddress(GlobalAddressSDNode *Node,
542 SDValue lowerTLSGetOffset(GlobalAddressSDNode *Node,
544 SDValue GOTOffset) const;
545 SDValue lowerThreadPointer(const SDLoc &DL, SelectionDAG &DAG) const;
546 SDValue lowerGlobalTLSAddress(GlobalAddressSDNode *Node,
548 SDValue lowerBlockAddress(BlockAddressSDNode *Node,
550 SDValue lowerJumpTable(JumpTableSDNode *JT, SelectionDAG &DAG) const;
551 SDValue lowerConstantPool(ConstantPoolSDNode *CP, SelectionDAG &DAG) const;
552 SDValue lowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const;
552 SDValue lowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const;
553 SDValue lowerRETURNADDR(SDValue Op, SelectionDAG &DAG) const;
553 SDValue lowerRETURNADDR(SDValue Op, SelectionDAG &DAG) const;
554 SDValue lowerVASTART(SDValue Op, SelectionDAG &DAG) const;
554 SDValue lowerVASTART(SDValue Op, SelectionDAG &DAG) const;
555 SDValue lowerVACOPY(SDValue Op, SelectionDAG &DAG) const;
555 SDValue lowerVACOPY(SDValue Op, SelectionDAG &DAG) const;
556 SDValue lowerDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG) const;
556 SDValue lowerDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG) const;
557 SDValue lowerGET_DYNAMIC_AREA_OFFSET(SDValue Op, SelectionDAG &DAG) const;
557 SDValue lowerGET_DYNAMIC_AREA_OFFSET(SDValue Op, SelectionDAG &DAG) const;
558 SDValue lowerSMUL_LOHI(SDValue Op, SelectionDAG &DAG) const;
558 SDValue lowerSMUL_LOHI(SDValue Op, SelectionDAG &DAG) const;
559 SDValue lowerUMUL_LOHI(SDValue Op, SelectionDAG &DAG) const;
559 SDValue lowerUMUL_LOHI(SDValue Op, SelectionDAG &DAG) const;
560 SDValue lowerSDIVREM(SDValue Op, SelectionDAG &DAG) const;
560 SDValue lowerSDIVREM(SDValue Op, SelectionDAG &DAG) const;
561 SDValue lowerUDIVREM(SDValue Op, SelectionDAG &DAG) const;
561 SDValue lowerUDIVREM(SDValue Op, SelectionDAG &DAG) const;
562 SDValue lowerXALUO(SDValue Op, SelectionDAG &DAG) const;
562 SDValue lowerXALUO(SDValue Op, SelectionDAG &DAG) const;
563 SDValue lowerADDSUBCARRY(SDValue Op, SelectionDAG &DAG) const;
563 SDValue lowerADDSUBCARRY(SDValue Op, SelectionDAG &DAG) const;
564 SDValue lowerBITCAST(SDValue Op, SelectionDAG &DAG) const;
564 SDValue lowerBITCAST(SDValue Op, SelectionDAG &DAG) const;
565 SDValue lowerOR(SDValue Op, SelectionDAG &DAG) const;
565 SDValue lowerOR(SDValue Op, SelectionDAG &DAG) const;
566 SDValue lowerCTPOP(SDValue Op, SelectionDAG &DAG) const;
566 SDValue lowerCTPOP(SDValue Op, SelectionDAG &DAG) const;
567 SDValue lowerATOMIC_FENCE(SDValue Op, SelectionDAG &DAG) const;
567 SDValue lowerATOMIC_FENCE(SDValue Op, SelectionDAG &DAG) const;
568 SDValue lowerATOMIC_LOAD(SDValue Op, SelectionDAG &DAG) const;
568 SDValue lowerATOMIC_LOAD(SDValue Op, SelectionDAG &DAG) const;
569 SDValue lowerATOMIC_STORE(SDValue Op, SelectionDAG &DAG) const;
569 SDValue lowerATOMIC_STORE(SDValue Op, SelectionDAG &DAG) const;
570 SDValue lowerATOMIC_LOAD_OP(SDValue Op, SelectionDAG &DAG,
570 SDValue lowerATOMIC_LOAD_OP(SDValue Op, SelectionDAG &DAG,
572 SDValue lowerATOMIC_LOAD_SUB(SDValue Op, SelectionDAG &DAG) const;
572 SDValue lowerATOMIC_LOAD_SUB(SDValue Op, SelectionDAG &DAG) const;
573 SDValue lowerATOMIC_CMP_SWAP(SDValue Op, SelectionDAG &DAG) const;
573 SDValue lowerATOMIC_CMP_SWAP(SDValue Op, SelectionDAG &DAG) const;
574 SDValue lowerSTACKSAVE(SDValue Op, SelectionDAG &DAG) const;
574 SDValue lowerSTACKSAVE(SDValue Op, SelectionDAG &DAG) const;
575 SDValue lowerSTACKRESTORE(SDValue Op, SelectionDAG &DAG) const;
575 SDValue lowerSTACKRESTORE(SDValue Op, SelectionDAG &DAG) const;
576 SDValue lowerPREFETCH(SDValue Op, SelectionDAG &DAG) const;
576 SDValue lowerPREFETCH(SDValue Op, SelectionDAG &DAG) const;
577 SDValue lowerINTRINSIC_W_CHAIN(SDValue Op, SelectionDAG &DAG) const;
577 SDValue lowerINTRINSIC_W_CHAIN(SDValue Op, SelectionDAG &DAG) const;
578 SDValue lowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG) const;
578 SDValue lowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG) const;
579 bool isVectorElementLoad(SDValue Op) const;
580 SDValue buildVector(SelectionDAG &DAG, const SDLoc &DL, EVT VT,
581 SmallVectorImpl<SDValue> &Elems) const;
582 SDValue lowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG) const;
582 SDValue lowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG) const;
583 SDValue lowerVECTOR_SHUFFLE(SDValue Op, SelectionDAG &DAG) const;
583 SDValue lowerVECTOR_SHUFFLE(SDValue Op, SelectionDAG &DAG) const;
584 SDValue lowerSCALAR_TO_VECTOR(SDValue Op, SelectionDAG &DAG) const;
584 SDValue lowerSCALAR_TO_VECTOR(SDValue Op, SelectionDAG &DAG) const;
585 SDValue lowerINSERT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const;
585 SDValue lowerINSERT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const;
586 SDValue lowerEXTRACT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const;
586 SDValue lowerEXTRACT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const;
587 SDValue lowerExtendVectorInreg(SDValue Op, SelectionDAG &DAG,
587 SDValue lowerExtendVectorInreg(SDValue Op, SelectionDAG &DAG,
589 SDValue lowerShift(SDValue Op, SelectionDAG &DAG, unsigned ByScalar) const;
589 SDValue lowerShift(SDValue Op, SelectionDAG &DAG, unsigned ByScalar) const;
592 SDValue combineExtract(const SDLoc &DL, EVT ElemVT, EVT VecVT, SDValue OrigOp,
592 SDValue combineExtract(const SDLoc &DL, EVT ElemVT, EVT VecVT, SDValue OrigOp,
595 SDValue combineTruncateExtract(const SDLoc &DL, EVT TruncVT, SDValue Op,
595 SDValue combineTruncateExtract(const SDLoc &DL, EVT TruncVT, SDValue Op,
597 SDValue combineZERO_EXTEND(SDNode *N, DAGCombinerInfo &DCI) const;
598 SDValue combineSIGN_EXTEND(SDNode *N, DAGCombinerInfo &DCI) const;
599 SDValue combineSIGN_EXTEND_INREG(SDNode *N, DAGCombinerInfo &DCI) const;
600 SDValue combineMERGE(SDNode *N, DAGCombinerInfo &DCI) const;
602 SDValue combineLOAD(SDNode *N, DAGCombinerInfo &DCI) const;
603 SDValue combineSTORE(SDNode *N, DAGCombinerInfo &DCI) const;
604 SDValue combineVECTOR_SHUFFLE(SDNode *N, DAGCombinerInfo &DCI) const;
605 SDValue combineEXTRACT_VECTOR_ELT(SDNode *N, DAGCombinerInfo &DCI) const;
606 SDValue combineJOIN_DWORDS(SDNode *N, DAGCombinerInfo &DCI) const;
607 SDValue combineFP_ROUND(SDNode *N, DAGCombinerInfo &DCI) const;
608 SDValue combineFP_EXTEND(SDNode *N, DAGCombinerInfo &DCI) const;
609 SDValue combineBSWAP(SDNode *N, DAGCombinerInfo &DCI) const;
610 SDValue combineBR_CCMASK(SDNode *N, DAGCombinerInfo &DCI) const;
611 SDValue combineSELECT_CCMASK(SDNode *N, DAGCombinerInfo &DCI) const;
612 SDValue combineGET_CCMASK(SDNode *N, DAGCombinerInfo &DCI) const;
613 SDValue combineIntDIVREM(SDNode *N, DAGCombinerInfo &DCI) const;
615 SDValue unwrapAddress(SDValue N) const override;
615 SDValue unwrapAddress(SDValue N) const override;
lib/Target/SystemZ/SystemZSelectionDAGInfo.cpp 25 static SDValue emitMemMem(SelectionDAG &DAG, const SDLoc &DL, unsigned Sequence,
26 unsigned Loop, SDValue Chain, SDValue Dst,
26 unsigned Loop, SDValue Chain, SDValue Dst,
27 SDValue Src, uint64_t Size) {
48 SDValue SystemZSelectionDAGInfo::EmitTargetCodeForMemcpy(
49 SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, SDValue Dst, SDValue Src,
49 SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, SDValue Dst, SDValue Src,
49 SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, SDValue Dst, SDValue Src,
50 SDValue Size, unsigned Align, bool IsVolatile, bool AlwaysInline,
64 static SDValue memsetStore(SelectionDAG &DAG, const SDLoc &DL, SDValue Chain,
64 static SDValue memsetStore(SelectionDAG &DAG, const SDLoc &DL, SDValue Chain,
65 SDValue Dst, uint64_t ByteVal, uint64_t Size,
75 SDValue SystemZSelectionDAGInfo::EmitTargetCodeForMemset(
76 SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, SDValue Dst,
76 SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, SDValue Dst,
77 SDValue Byte, SDValue Size, unsigned Align, bool IsVolatile,
77 SDValue Byte, SDValue Size, unsigned Align, bool IsVolatile,
99 SDValue Chain1 = memsetStore(DAG, DL, Chain, Dst, ByteVal, Size1,
106 SDValue Chain2 = memsetStore(DAG, DL, Chain, Dst, ByteVal, Size2,
113 SDValue Chain1 = DAG.getStore(Chain, DL, Byte, Dst, DstPtrInfo, Align);
116 SDValue Dst2 = DAG.getNode(ISD::ADD, DL, PtrVT, Dst,
118 SDValue Chain2 =
135 SDValue DstPlus1 = DAG.getNode(ISD::ADD, DL, PtrVT, Dst,
145 static SDValue emitCLC(SelectionDAG &DAG, const SDLoc &DL, SDValue Chain,
145 static SDValue emitCLC(SelectionDAG &DAG, const SDLoc &DL, SDValue Chain,
146 SDValue Src1, SDValue Src2, uint64_t Size) {
146 SDValue Src1, SDValue Src2, uint64_t Size) {
169 static SDValue addIPMSequence(const SDLoc &DL, SDValue CCReg,
169 static SDValue addIPMSequence(const SDLoc &DL, SDValue CCReg,
171 SDValue IPM = DAG.getNode(SystemZISD::IPM, DL, MVT::i32, CCReg);
172 SDValue SHL = DAG.getNode(ISD::SHL, DL, MVT::i32, IPM,
174 SDValue SRA = DAG.getNode(ISD::SRA, DL, MVT::i32, SHL,
179 std::pair<SDValue, SDValue> SystemZSelectionDAGInfo::EmitTargetCodeForMemcmp(
179 std::pair<SDValue, SDValue> SystemZSelectionDAGInfo::EmitTargetCodeForMemcmp(
180 SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, SDValue Src1,
180 SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, SDValue Src1,
181 SDValue Src2, SDValue Size, MachinePointerInfo Op1PtrInfo,
181 SDValue Src2, SDValue Size, MachinePointerInfo Op1PtrInfo,
187 SDValue CCReg = emitCLC(DAG, DL, Chain, Src2, Src1, Bytes);
194 std::pair<SDValue, SDValue> SystemZSelectionDAGInfo::EmitTargetCodeForMemchr(
194 std::pair<SDValue, SDValue> SystemZSelectionDAGInfo::EmitTargetCodeForMemchr(
195 SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, SDValue Src,
195 SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, SDValue Src,
196 SDValue Char, SDValue Length, MachinePointerInfo SrcPtrInfo) const {
196 SDValue Char, SDValue Length, MachinePointerInfo SrcPtrInfo) const {
204 SDValue Limit = DAG.getNode(ISD::ADD, DL, PtrVT, Src, Length);
205 SDValue End = DAG.getNode(SystemZISD::SEARCH_STRING, DL, VTs, Chain,
207 SDValue CCReg = End.getValue(1);
212 SDValue Ops[] = {
220 std::pair<SDValue, SDValue> SystemZSelectionDAGInfo::EmitTargetCodeForStrcpy(
220 std::pair<SDValue, SDValue> SystemZSelectionDAGInfo::EmitTargetCodeForStrcpy(
221 SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, SDValue Dest,
221 SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, SDValue Dest,
222 SDValue Src, MachinePointerInfo DestPtrInfo, MachinePointerInfo SrcPtrInfo,
225 SDValue EndDest = DAG.getNode(SystemZISD::STPCPY, DL, VTs, Chain, Dest, Src,
230 std::pair<SDValue, SDValue> SystemZSelectionDAGInfo::EmitTargetCodeForStrcmp(
230 std::pair<SDValue, SDValue> SystemZSelectionDAGInfo::EmitTargetCodeForStrcmp(
231 SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, SDValue Src1,
231 SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, SDValue Src1,
232 SDValue Src2, MachinePointerInfo Op1PtrInfo,
236 SDValue Unused = DAG.getNode(SystemZISD::STRCMP, DL, VTs, Chain, Src2, Src1,
238 SDValue CCReg = Unused.getValue(1);
248 static std::pair<SDValue, SDValue> getBoundedStrlen(SelectionDAG &DAG,
248 static std::pair<SDValue, SDValue> getBoundedStrlen(SelectionDAG &DAG,
250 SDValue Chain, SDValue Src,
250 SDValue Chain, SDValue Src,
251 SDValue Limit) {
254 SDValue End = DAG.getNode(SystemZISD::SEARCH_STRING, DL, VTs, Chain,
257 SDValue Len = DAG.getNode(ISD::SUB, DL, PtrVT, End, Src);
261 std::pair<SDValue, SDValue> SystemZSelectionDAGInfo::EmitTargetCodeForStrlen(
261 std::pair<SDValue, SDValue> SystemZSelectionDAGInfo::EmitTargetCodeForStrlen(
262 SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, SDValue Src,
262 SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, SDValue Src,
268 std::pair<SDValue, SDValue> SystemZSelectionDAGInfo::EmitTargetCodeForStrnlen(
268 std::pair<SDValue, SDValue> SystemZSelectionDAGInfo::EmitTargetCodeForStrnlen(
269 SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, SDValue Src,
269 SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, SDValue Src,
270 SDValue MaxLength, MachinePointerInfo SrcPtrInfo) const {
273 SDValue Limit = DAG.getNode(ISD::ADD, DL, PtrVT, Src, MaxLength);
lib/Target/SystemZ/SystemZSelectionDAGInfo.h 26 SDValue EmitTargetCodeForMemcpy(SelectionDAG &DAG, const SDLoc &DL,
27 SDValue Chain, SDValue Dst, SDValue Src,
27 SDValue Chain, SDValue Dst, SDValue Src,
27 SDValue Chain, SDValue Dst, SDValue Src,
28 SDValue Size, unsigned Align, bool IsVolatile,
33 SDValue EmitTargetCodeForMemset(SelectionDAG &DAG, const SDLoc &DL,
34 SDValue Chain, SDValue Dst, SDValue Byte,
34 SDValue Chain, SDValue Dst, SDValue Byte,
34 SDValue Chain, SDValue Dst, SDValue Byte,
35 SDValue Size, unsigned Align, bool IsVolatile,
38 std::pair<SDValue, SDValue>
38 std::pair<SDValue, SDValue>
39 EmitTargetCodeForMemcmp(SelectionDAG &DAG, const SDLoc &DL, SDValue Chain,
40 SDValue Src1, SDValue Src2, SDValue Size,
40 SDValue Src1, SDValue Src2, SDValue Size,
40 SDValue Src1, SDValue Src2, SDValue Size,
44 std::pair<SDValue, SDValue>
44 std::pair<SDValue, SDValue>
45 EmitTargetCodeForMemchr(SelectionDAG &DAG, const SDLoc &DL, SDValue Chain,
46 SDValue Src, SDValue Char, SDValue Length,
46 SDValue Src, SDValue Char, SDValue Length,
46 SDValue Src, SDValue Char, SDValue Length,
49 std::pair<SDValue, SDValue> EmitTargetCodeForStrcpy(
49 std::pair<SDValue, SDValue> EmitTargetCodeForStrcpy(
50 SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, SDValue Dest,
50 SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, SDValue Dest,
51 SDValue Src, MachinePointerInfo DestPtrInfo,
54 std::pair<SDValue, SDValue>
54 std::pair<SDValue, SDValue>
55 EmitTargetCodeForStrcmp(SelectionDAG &DAG, const SDLoc &DL, SDValue Chain,
56 SDValue Src1, SDValue Src2,
56 SDValue Src1, SDValue Src2,
60 std::pair<SDValue, SDValue>
60 std::pair<SDValue, SDValue>
61 EmitTargetCodeForStrlen(SelectionDAG &DAG, const SDLoc &DL, SDValue Chain,
62 SDValue Src,
65 std::pair<SDValue, SDValue>
65 std::pair<SDValue, SDValue>
66 EmitTargetCodeForStrnlen(SelectionDAG &DAG, const SDLoc &DL, SDValue Chain,
67 SDValue Src, SDValue MaxLength,
67 SDValue Src, SDValue MaxLength,
lib/Target/WebAssembly/WebAssemblyISelDAGToDAG.cpp 68 bool SelectInlineAsmMemoryOperand(const SDValue &Op, unsigned ConstraintID,
69 std::vector<SDValue> &OutOps) override;
153 SDValue TLSBaseSym = CurDAG->getTargetExternalSymbol("__tls_base", PtrVT);
154 SDValue TLSOffsetSym = CurDAG->getTargetGlobalAddress(
221 const SDValue &Op, unsigned ConstraintID, std::vector<SDValue> &OutOps) {
221 const SDValue &Op, unsigned ConstraintID, std::vector<SDValue> &OutOps) {
lib/Target/WebAssembly/WebAssemblyISelLowering.cpp 551 bool WebAssemblyTargetLowering::isVectorLoadExtDesirable(SDValue ExtVal) const {
638 SDValue
640 SmallVectorImpl<SDValue> &InVals) const {
643 SDValue Chain = CLI.Chain;
644 SDValue Callee = CLI.Callee;
693 SmallVectorImpl<SDValue> &OutVals = CLI.OutVals;
707 SDValue &OutVal = OutVals[I];
721 SDValue SizeNode =
723 SDValue FINode = DAG.getFrameIndex(FI, getPointerTy(Layout));
746 SDValue &Arg = OutVals[I];
762 SDValue FINode;
770 SmallVector<SDValue, 8> Chains;
771 for (SDValue Arg :
777 SDValue Add = DAG.getNode(ISD::ADD, DL, PtrVT, FINode,
802 SmallVector<SDValue, 16> Ops;
838 SDValue Res =
859 SDValue WebAssemblyTargetLowering::LowerReturn(
860 SDValue Chain, CallingConv::ID CallConv, bool /*IsVarArg*/,
862 const SmallVectorImpl<SDValue> &OutVals, const SDLoc &DL,
869 SmallVector<SDValue, 4> RetOps(1, Chain);
889 SDValue WebAssemblyTargetLowering::LowerFormalArguments(
890 SDValue Chain, CallingConv::ID CallConv, bool IsVarArg,
892 SelectionDAG &DAG, SmallVectorImpl<SDValue> &InVals) const {
954 SDNode *N, SmallVectorImpl<SDValue> &Results, SelectionDAG &DAG) const {
972 SDValue WebAssemblyTargetLowering::LowerOperation(SDValue Op,
972 SDValue WebAssemblyTargetLowering::LowerOperation(SDValue Op,
1021 SDValue WebAssemblyTargetLowering::LowerCopyToReg(SDValue Op,
1021 SDValue WebAssemblyTargetLowering::LowerCopyToReg(SDValue Op,
1023 SDValue Src = Op.getOperand(2);
1030 SDValue Chain = Op.getOperand(0);
1034 SDValue Copy(DAG.getMachineNode(VT == MVT::i32 ? WebAssembly::COPY_I32
1047 SDValue WebAssemblyTargetLowering::LowerFrameIndex(SDValue Op,
1047 SDValue WebAssemblyTargetLowering::LowerFrameIndex(SDValue Op,
1053 SDValue WebAssemblyTargetLowering::LowerRETURNADDR(SDValue Op,
1053 SDValue WebAssemblyTargetLowering::LowerRETURNADDR(SDValue Op,
1074 SDValue WebAssemblyTargetLowering::LowerFRAMEADDR(SDValue Op,
1074 SDValue WebAssemblyTargetLowering::LowerFRAMEADDR(SDValue Op,
1089 SDValue WebAssemblyTargetLowering::LowerGlobalAddress(SDValue Op,
1089 SDValue WebAssemblyTargetLowering::LowerGlobalAddress(SDValue Op,
1114 SDValue BaseAddr =
1118 SDValue SymAddr = DAG.getNode(
1134 SDValue
1135 WebAssemblyTargetLowering::LowerExternalSymbol(SDValue Op,
1146 SDValue WebAssemblyTargetLowering::LowerJumpTable(SDValue Op,
1146 SDValue WebAssemblyTargetLowering::LowerJumpTable(SDValue Op,
1156 SDValue WebAssemblyTargetLowering::LowerBR_JT(SDValue Op,
1156 SDValue WebAssemblyTargetLowering::LowerBR_JT(SDValue Op,
1159 SDValue Chain = Op.getOperand(0);
1161 SDValue Index = Op.getOperand(2);
1164 SmallVector<SDValue, 8> Ops;
1183 SDValue WebAssemblyTargetLowering::LowerVASTART(SDValue Op,
1183 SDValue WebAssemblyTargetLowering::LowerVASTART(SDValue Op,
1191 SDValue ArgN = DAG.getCopyFromReg(DAG.getEntryNode(), DL,
1197 SDValue WebAssemblyTargetLowering::LowerIntrinsic(SDValue Op,
1197 SDValue WebAssemblyTargetLowering::LowerIntrinsic(SDValue Op,
1237 SDValue SymNode = DAG.getNode(WebAssemblyISD::Wrapper, DL, PtrVT,
1250 SDValue
1251 WebAssemblyTargetLowering::LowerSIGN_EXTEND_INREG(SDValue Op,
1262 const SDValue &Extract = Op.getOperand(0);
1272 const SDValue &Index = Extract.getOperand(1);
1278 SDValue NewIndex =
1280 SDValue NewExtract = DAG.getNode(
1290 SDValue WebAssemblyTargetLowering::LowerBUILD_VECTOR(SDValue Op,
1290 SDValue WebAssemblyTargetLowering::LowerBUILD_VECTOR(SDValue Op,
1321 const SDValue &SwizzleSrc = Lane->getOperand(0);
1322 const SDValue &IndexExt = Lane->getOperand(1);
1325 const SDValue &Index = IndexExt->getOperand(0);
1328 const SDValue &SwizzleIndices = Index->getOperand(0);
1337 using ValueEntry = std::pair<SDValue, size_t>;
1340 using SwizzleEntry = std::pair<std::pair<SDValue, SDValue>, size_t>;
1340 using SwizzleEntry = std::pair<std::pair<SDValue, SDValue>, size_t>;
1365 const SDValue &Lane = Op->getOperand(I);
1380 SDValue SplatValue;
1384 SDValue SwizzleSrc;
1385 SDValue SwizzleIndices;
1393 std::function<bool(size_t, const SDValue &)> IsLaneConstructed;
1394 SDValue Result;
1406 SmallVector<SDValue, 16> ConstLanes;
1407 for (const SDValue &Lane : Op->op_values()) {
1439 const SDValue &Lane = Op->getOperand(I);
1448 SDValue
1449 WebAssemblyTargetLowering::LowerVECTOR_SHUFFLE(SDValue Op,
1458 SDValue Ops[18];
1475 SDValue
1476 WebAssemblyTargetLowering::LowerAccessVectorElement(SDValue Op,
1487 static SDValue unrollVectorShift(SDValue Op, SelectionDAG &DAG) {
1487 static SDValue unrollVectorShift(SDValue Op, SelectionDAG &DAG) {
1494 SDValue ShiftVal = Op.getOperand(1);
1496 SDValue MaskedShiftVal = DAG.getNode(
1512 SDValue WebAssemblyTargetLowering::LowerShift(SDValue Op,
1512 SDValue WebAssemblyTargetLowering::LowerShift(SDValue Op,
1521 SDValue SplatVal;
lib/Target/WebAssembly/WebAssemblyISelLowering.h 66 bool isVectorLoadExtDesirable(SDValue ExtVal) const override;
73 SDValue LowerCall(CallLoweringInfo &CLI,
74 SmallVectorImpl<SDValue> &InVals) const override;
79 SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
79 SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
81 const SmallVectorImpl<SDValue> &OutVals, const SDLoc &dl,
83 SDValue LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv,
83 SDValue LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv,
87 SmallVectorImpl<SDValue> &InVals) const override;
89 void ReplaceNodeResults(SDNode *N, SmallVectorImpl<SDValue> &Results,
97 SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
97 SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
98 SDValue LowerFrameIndex(SDValue Op, SelectionDAG &DAG) const;
98 SDValue LowerFrameIndex(SDValue Op, SelectionDAG &DAG) const;
99 SDValue LowerRETURNADDR(SDValue Op, SelectionDAG &DAG) const;
99 SDValue LowerRETURNADDR(SDValue Op, SelectionDAG &DAG) const;
100 SDValue LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const;
100 SDValue LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const;
101 SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const;
101 SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const;
102 SDValue LowerExternalSymbol(SDValue Op, SelectionDAG &DAG) const;
102 SDValue LowerExternalSymbol(SDValue Op, SelectionDAG &DAG) const;
103 SDValue LowerBR_JT(SDValue Op, SelectionDAG &DAG) const;
103 SDValue LowerBR_JT(SDValue Op, SelectionDAG &DAG) const;
104 SDValue LowerJumpTable(SDValue Op, SelectionDAG &DAG) const;
104 SDValue LowerJumpTable(SDValue Op, SelectionDAG &DAG) const;
105 SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG) const;
105 SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG) const;
106 SDValue LowerCopyToReg(SDValue Op, SelectionDAG &DAG) const;
106 SDValue LowerCopyToReg(SDValue Op, SelectionDAG &DAG) const;
107 SDValue LowerIntrinsic(SDValue Op, SelectionDAG &DAG) const;
107 SDValue LowerIntrinsic(SDValue Op, SelectionDAG &DAG) const;
108 SDValue LowerSIGN_EXTEND_INREG(SDValue Op, SelectionDAG &DAG) const;
108 SDValue LowerSIGN_EXTEND_INREG(SDValue Op, SelectionDAG &DAG) const;
109 SDValue LowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG) const;
109 SDValue LowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG) const;
110 SDValue LowerVECTOR_SHUFFLE(SDValue Op, SelectionDAG &DAG) const;
110 SDValue LowerVECTOR_SHUFFLE(SDValue Op, SelectionDAG &DAG) const;
111 SDValue LowerAccessVectorElement(SDValue Op, SelectionDAG &DAG) const;
111 SDValue LowerAccessVectorElement(SDValue Op, SelectionDAG &DAG) const;
112 SDValue LowerShift(SDValue Op, SelectionDAG &DAG) const;
112 SDValue LowerShift(SDValue Op, SelectionDAG &DAG) const;
lib/Target/WebAssembly/WebAssemblySelectionDAGInfo.cpp 21 SDValue WebAssemblySelectionDAGInfo::EmitTargetCodeForMemcpy(
22 SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, SDValue Dst, SDValue Src,
22 SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, SDValue Dst, SDValue Src,
22 SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, SDValue Dst, SDValue Src,
23 SDValue Size, unsigned Align, bool IsVolatile, bool AlwaysInline,
30 SDValue MemIdx = DAG.getConstant(0, DL, MVT::i32);
36 SDValue WebAssemblySelectionDAGInfo::EmitTargetCodeForMemmove(
37 SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, SDValue Op1, SDValue Op2,
37 SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, SDValue Op1, SDValue Op2,
37 SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, SDValue Op1, SDValue Op2,
38 SDValue Op3, unsigned Align, bool IsVolatile,
45 SDValue WebAssemblySelectionDAGInfo::EmitTargetCodeForMemset(
46 SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, SDValue Dst, SDValue Val,
46 SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, SDValue Dst, SDValue Val,
46 SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, SDValue Dst, SDValue Val,
47 SDValue Size, unsigned Align, bool IsVolatile,
54 SDValue MemIdx = DAG.getConstant(0, DL, MVT::i32);
lib/Target/WebAssembly/WebAssemblySelectionDAGInfo.h 25 SDValue EmitTargetCodeForMemcpy(SelectionDAG &DAG, const SDLoc &dl,
26 SDValue Chain, SDValue Op1, SDValue Op2,
26 SDValue Chain, SDValue Op1, SDValue Op2,
26 SDValue Chain, SDValue Op1, SDValue Op2,
27 SDValue Op3, unsigned Align, bool isVolatile,
31 SDValue EmitTargetCodeForMemmove(SelectionDAG &DAG, const SDLoc &dl,
32 SDValue Chain, SDValue Op1, SDValue Op2,
32 SDValue Chain, SDValue Op1, SDValue Op2,
32 SDValue Chain, SDValue Op1, SDValue Op2,
33 SDValue Op3, unsigned Align, bool isVolatile,
36 SDValue EmitTargetCodeForMemset(SelectionDAG &DAG, const SDLoc &DL,
37 SDValue Chain, SDValue Op1, SDValue Op2,
37 SDValue Chain, SDValue Op1, SDValue Op2,
37 SDValue Chain, SDValue Op1, SDValue Op2,
38 SDValue Op3, unsigned Align, bool IsVolatile,
lib/Target/X86/X86ISelDAGToDAG.cpp 61 SDValue Base_Reg;
65 SDValue IndexReg;
67 SDValue Segment;
102 void setBaseReg(SDValue Reg) {
200 bool IsProfitableToFold(SDValue N, SDNode *U, SDNode *Root) const override;
213 bool matchWrapper(SDValue N, X86ISelAddressMode &AM);
214 bool matchAddress(SDValue N, X86ISelAddressMode &AM);
215 bool matchVectorAddress(SDValue N, X86ISelAddressMode &AM);
216 bool matchAdd(SDValue &N, X86ISelAddressMode &AM, unsigned Depth);
217 bool matchAddressRecursively(SDValue N, X86ISelAddressMode &AM,
219 bool matchAddressBase(SDValue N, X86ISelAddressMode &AM);
220 bool selectAddr(SDNode *Parent, SDValue N, SDValue &Base,
220 bool selectAddr(SDNode *Parent, SDValue N, SDValue &Base,
221 SDValue &Scale, SDValue &Index, SDValue &Disp,
221 SDValue &Scale, SDValue &Index, SDValue &Disp,
221 SDValue &Scale, SDValue &Index, SDValue &Disp,
222 SDValue &Segment);
223 bool selectVectorAddr(SDNode *Parent, SDValue N, SDValue &Base,
223 bool selectVectorAddr(SDNode *Parent, SDValue N, SDValue &Base,
224 SDValue &Scale, SDValue &Index, SDValue &Disp,
224 SDValue &Scale, SDValue &Index, SDValue &Disp,
224 SDValue &Scale, SDValue &Index, SDValue &Disp,
225 SDValue &Segment);
226 bool selectMOV64Imm32(SDValue N, SDValue &Imm);
226 bool selectMOV64Imm32(SDValue N, SDValue &Imm);
227 bool selectLEAAddr(SDValue N, SDValue &Base,
227 bool selectLEAAddr(SDValue N, SDValue &Base,
228 SDValue &Scale, SDValue &Index, SDValue &Disp,
228 SDValue &Scale, SDValue &Index, SDValue &Disp,
228 SDValue &Scale, SDValue &Index, SDValue &Disp,
229 SDValue &Segment);
230 bool selectLEA64_32Addr(SDValue N, SDValue &Base,
230 bool selectLEA64_32Addr(SDValue N, SDValue &Base,
231 SDValue &Scale, SDValue &Index, SDValue &Disp,
231 SDValue &Scale, SDValue &Index, SDValue &Disp,
231 SDValue &Scale, SDValue &Index, SDValue &Disp,
232 SDValue &Segment);
233 bool selectTLSADDRAddr(SDValue N, SDValue &Base,
233 bool selectTLSADDRAddr(SDValue N, SDValue &Base,
234 SDValue &Scale, SDValue &Index, SDValue &Disp,
234 SDValue &Scale, SDValue &Index, SDValue &Disp,
234 SDValue &Scale, SDValue &Index, SDValue &Disp,
235 SDValue &Segment);
236 bool selectScalarSSELoad(SDNode *Root, SDNode *Parent, SDValue N,
237 SDValue &Base, SDValue &Scale,
237 SDValue &Base, SDValue &Scale,
238 SDValue &Index, SDValue &Disp,
238 SDValue &Index, SDValue &Disp,
239 SDValue &Segment,
240 SDValue &NodeWithChain);
241 bool selectRelocImm(SDValue N, SDValue &Op);
241 bool selectRelocImm(SDValue N, SDValue &Op);
243 bool tryFoldLoad(SDNode *Root, SDNode *P, SDValue N,
244 SDValue &Base, SDValue &Scale,
244 SDValue &Base, SDValue &Scale,
245 SDValue &Index, SDValue &Disp,
245 SDValue &Index, SDValue &Disp,
246 SDValue &Segment);
249 bool tryFoldLoad(SDNode *P, SDValue N,
250 SDValue &Base, SDValue &Scale,
250 SDValue &Base, SDValue &Scale,
251 SDValue &Index, SDValue &Disp,
251 SDValue &Index, SDValue &Disp,
252 SDValue &Segment) {
256 bool tryFoldBroadcast(SDNode *Root, SDNode *P, SDValue N,
257 SDValue &Base, SDValue &Scale,
257 SDValue &Base, SDValue &Scale,
258 SDValue &Index, SDValue &Disp,
258 SDValue &Index, SDValue &Disp,
259 SDValue &Segment);
262 bool SelectInlineAsmMemoryOperand(const SDValue &Op,
264 std::vector<SDValue> &OutOps) override;
269 MVT VT, SDValue &Base, SDValue &Scale,
269 MVT VT, SDValue &Base, SDValue &Scale,
270 SDValue &Index, SDValue &Disp,
270 SDValue &Index, SDValue &Disp,
271 SDValue &Segment) {
285 SDValue Neg = SDValue(CurDAG->getMachineNode(NegOpc, DL, VT, MVT::i32,
385 SDValue OtherOp = User->getOperand(0);
408 inline SDValue getI8Imm(unsigned Imm, const SDLoc &DL) {
413 inline SDValue getI32Imm(unsigned Imm, const SDLoc &DL) {
418 inline SDValue getI64Imm(uint64_t Imm, const SDLoc &DL) {
422 SDValue getExtractVEXTRACTImmediate(SDNode *N, unsigned VecWidth,
430 SDValue getInsertVINSERTImmediate(SDNode *N, unsigned VecWidth,
517 bool tryVPTESTM(SDNode *Root, SDValue Setcc, SDValue Mask);
517 bool tryVPTESTM(SDNode *Root, SDValue Setcc, SDValue Mask);
524 SDValue &InFlag);
528 bool onlyUsesZeroFlag(SDValue Flags) const;
529 bool hasNoSignFlagUses(SDValue Flags) const;
530 bool hasNoCarryFlagUses(SDValue Flags) const;
572 X86DAGToDAGISel::IsProfitableToFold(SDValue N, SDNode *U, SDNode *Root) const {
601 SDValue Op1 = U->getOperand(1);
654 SDValue Val = Op1.getOperand(0);
673 SDValue U0 = U->getOperand(0);
674 SDValue U1 = U->getOperand(1);
717 static void moveBelowOrigChain(SelectionDAG *CurDAG, SDValue Load,
718 SDValue Call, SDValue OrigChain) {
718 SDValue Call, SDValue OrigChain) {
719 SmallVector<SDValue, 8> Ops;
720 SDValue Chain = OrigChain.getOperand(0);
731 SDValue NewChain =
752 static bool isCalleeLoad(SDValue Callee, SDValue &Chain, bool HasCallSeq) {
752 static bool isCalleeLoad(SDValue Callee, SDValue &Chain, bool HasCallSeq) {
797 SDValue Res = CurDAG->getNode(ISD::AND, SDLoc(N), N->getValueType(0),
820 SDValue Res = CurDAG->getNode(NewOpc, SDLoc(N), N->getValueType(0),
843 SDValue Res = CurDAG->getNode(NewOpc, SDLoc(N), N->getValueType(0),
863 SDValue Res = CurDAG->getNode(NewOpc, SDLoc(N), N->getValueType(0),
888 SDValue Res = CurDAG->getNode(
909 SDValue Op0 = CurDAG->getNode(ISD::SCALAR_TO_VECTOR, dl, VecVT,
911 SDValue Op1 = CurDAG->getNode(ISD::SCALAR_TO_VECTOR, dl, VecVT,
914 SDValue Res;
970 SDValue Chain = N->getOperand(0);
971 SDValue Load = N->getOperand(1);
1026 SDValue MemTmp = CurDAG->CreateStackTemporary(MemVT);
1031 SDValue Store = CurDAG->getTruncStore(CurDAG->getEntryNode(), dl, N->getOperand(0),
1033 SDValue Result = CurDAG->getExtLoad(ISD::EXTLOAD, dl, DstVT, Store, MemTmp,
1084 SDValue MemTmp = CurDAG->CreateStackTemporary(MemVT);
1090 SDValue Store = CurDAG->getTruncStore(N->getOperand(0), dl, N->getOperand(1),
1092 SDValue Result = CurDAG->getExtLoad(ISD::EXTLOAD, dl, DstVT, Store, MemTmp,
1125 SDValue N0 = N->getOperand(0);
1136 SDValue N00 = N0.getOperand(0);
1181 SDValue And = N->getOperand(0);
1204 SDValue Ops[] = { And.getOperand(1),
1229 SDValue And = N->getOperand(0);
1262 SDValue Move = N->getOperand(1);
1287 SDValue In = Move.getOperand(0);
1323 std::pair<SDValue, SDValue> Result = TLI.LowerCallTo(CLI);
1323 std::pair<SDValue, SDValue> Result = TLI.LowerCallTo(CLI);
1373 SDValue Address = N->getOperand(1);
1403 bool X86DAGToDAGISel::matchWrapper(SDValue N, X86ISelAddressMode &AM) {
1412 SDValue Val = N.getOperand(0);
1436 SDValue N0 = N.getOperand(0);
1475 bool X86DAGToDAGISel::matchAddress(SDValue N, X86ISelAddressMode &AM) {
1509 bool X86DAGToDAGISel::matchAdd(SDValue &N, X86ISelAddressMode &AM,
1548 static void insertDAGNode(SelectionDAG &DAG, SDValue Pos, SDValue N) {
1548 static void insertDAGNode(SelectionDAG &DAG, SDValue Pos, SDValue N) {
1566 static bool foldMaskAndShiftToExtract(SelectionDAG &DAG, SDValue N,
1568 SDValue Shift, SDValue X,
1568 SDValue Shift, SDValue X,
1582 SDValue Eight = DAG.getConstant(8, DL, MVT::i8);
1583 SDValue NewMask = DAG.getConstant(0xff, DL, VT);
1584 SDValue Srl = DAG.getNode(ISD::SRL, DL, VT, X, Eight);
1585 SDValue And = DAG.getNode(ISD::AND, DL, VT, Srl, NewMask);
1586 SDValue ShlCount = DAG.getConstant(ScaleLog, DL, MVT::i8);
1587 SDValue Shl = DAG.getNode(ISD::SHL, DL, VT, And, ShlCount);
1610 static bool foldMaskedShiftToScaledMask(SelectionDAG &DAG, SDValue N,
1612 SDValue Shift = N.getOperand(0);
1634 SDValue X = Shift.getOperand(0);
1650 SDValue NewX = DAG.getNode(ISD::ANY_EXTEND, DL, VT, X);
1655 SDValue NewMask = DAG.getConstant(Mask >> ShiftAmt, DL, VT);
1656 SDValue NewAnd = DAG.getNode(ISD::AND, DL, VT, X, NewMask);
1657 SDValue NewShift = DAG.getNode(ISD::SHL, DL, VT, NewAnd, Shift.getOperand(1));
1702 static bool foldMaskAndShiftToScale(SelectionDAG &DAG, SDValue N,
1704 SDValue Shift, SDValue X,
1704 SDValue Shift, SDValue X,
1759 SDValue NewX = DAG.getNode(ISD::ZERO_EXTEND, SDLoc(X), VT, X);
1764 SDValue NewSRLAmt = DAG.getConstant(ShiftAmt + AMShiftAmt, DL, MVT::i8);
1765 SDValue NewSRL = DAG.getNode(ISD::SRL, DL, VT, X, NewSRLAmt);
1766 SDValue NewSHLAmt = DAG.getConstant(AMShiftAmt, DL, MVT::i8);
1767 SDValue NewSHL = DAG.getNode(ISD::SHL, DL, VT, NewSRL, NewSHLAmt);
1789 static bool foldMaskedShiftToBEXTR(SelectionDAG &DAG, SDValue N,
1791 SDValue Shift, SDValue X,
1791 SDValue Shift, SDValue X,
1819 SDValue NewSRLAmt = DAG.getConstant(ShiftAmt + AMShiftAmt, DL, MVT::i8);
1820 SDValue NewSRL = DAG.getNode(ISD::SRL, DL, VT, X, NewSRLAmt);
1821 SDValue NewMask = DAG.getConstant(Mask >> AMShiftAmt, DL, VT);
1822 SDValue NewAnd = DAG.getNode(ISD::AND, DL, VT, NewSRL, NewMask);
1823 SDValue NewSHLAmt = DAG.getConstant(AMShiftAmt, DL, MVT::i8);
1824 SDValue NewSHL = DAG.getNode(ISD::SHL, DL, VT, NewAnd, NewSHLAmt);
1845 bool X86DAGToDAGISel::matchAddressRecursively(SDValue N, X86ISelAddressMode &AM,
1923 SDValue ShVal = N.getOperand(0);
1951 SDValue And = N.getOperand(0);
1953 SDValue X = And.getOperand(0);
1986 SDValue MulVal = N.getOperand(0);
1987 SDValue Reg;
2037 SDValue RHS = N.getOperand(1);
2108 SDValue Shift = N.getOperand(0);
2109 SDValue X = Shift.getOperand(0);
2142 SDValue Shl = N.getOperand(0);
2157 SDValue Zext = CurDAG->getNode(ISD::ZERO_EXTEND, DL, VT, Shl.getOperand(0));
2158 SDValue NewShl = CurDAG->getNode(ISD::SHL, DL, VT, Zext, Shl.getOperand(1));
2177 bool X86DAGToDAGISel::matchAddressBase(SDValue N, X86ISelAddressMode &AM) {
2200 bool X86DAGToDAGISel::matchVectorAddress(SDValue N, X86ISelAddressMode &AM) {
2218 bool X86DAGToDAGISel::selectVectorAddr(SDNode *Parent, SDValue N, SDValue &Base,
2218 bool X86DAGToDAGISel::selectVectorAddr(SDNode *Parent, SDValue N, SDValue &Base,
2219 SDValue &Scale, SDValue &Index,
2219 SDValue &Scale, SDValue &Index,
2220 SDValue &Disp, SDValue &Segment) {
2220 SDValue &Disp, SDValue &Segment) {
2253 bool X86DAGToDAGISel::selectAddr(SDNode *Parent, SDValue N, SDValue &Base,
2253 bool X86DAGToDAGISel::selectAddr(SDNode *Parent, SDValue N, SDValue &Base,
2254 SDValue &Scale, SDValue &Index,
2254 SDValue &Scale, SDValue &Index,
2255 SDValue &Disp, SDValue &Segment) {
2255 SDValue &Disp, SDValue &Segment) {
2311 SDValue N, SDValue &Base,
2311 SDValue N, SDValue &Base,
2312 SDValue &Scale, SDValue &Index,
2312 SDValue &Scale, SDValue &Index,
2313 SDValue &Disp, SDValue &Segment,
2313 SDValue &Disp, SDValue &Segment,
2314 SDValue &PatternNodeWithChain) {
2360 bool X86DAGToDAGISel::selectMOV64Imm32(SDValue N, SDValue &Imm) {
2360 bool X86DAGToDAGISel::selectMOV64Imm32(SDValue N, SDValue &Imm) {
2394 bool X86DAGToDAGISel::selectLEA64_32Addr(SDValue N, SDValue &Base,
2394 bool X86DAGToDAGISel::selectLEA64_32Addr(SDValue N, SDValue &Base,
2395 SDValue &Scale, SDValue &Index,
2395 SDValue &Scale, SDValue &Index,
2396 SDValue &Disp, SDValue &Segment) {
2396 SDValue &Disp, SDValue &Segment) {
2408 SDValue ImplDef = SDValue(CurDAG->getMachineNode(X86::IMPLICIT_DEF, DL,
2420 SDValue ImplDef = SDValue(CurDAG->getMachineNode(X86::IMPLICIT_DEF, DL,
2431 bool X86DAGToDAGISel::selectLEAAddr(SDValue N,
2432 SDValue &Base, SDValue &Scale,
2432 SDValue &Base, SDValue &Scale,
2433 SDValue &Index, SDValue &Disp,
2433 SDValue &Index, SDValue &Disp,
2434 SDValue &Segment) {
2443 SDValue Copy = AM.Segment;
2444 SDValue T = CurDAG->getRegister(0, MVT::i32);
2521 bool X86DAGToDAGISel::selectTLSADDRAddr(SDValue N, SDValue &Base,
2521 bool X86DAGToDAGISel::selectTLSADDRAddr(SDValue N, SDValue &Base,
2522 SDValue &Scale, SDValue &Index,
2522 SDValue &Scale, SDValue &Index,
2523 SDValue &Disp, SDValue &Segment) {
2523 SDValue &Disp, SDValue &Segment) {
2542 bool X86DAGToDAGISel::selectRelocImm(SDValue N, SDValue &Op) {
2542 bool X86DAGToDAGISel::selectRelocImm(SDValue N, SDValue &Op) {
2585 bool X86DAGToDAGISel::tryFoldLoad(SDNode *Root, SDNode *P, SDValue N,
2586 SDValue &Base, SDValue &Scale,
2586 SDValue &Base, SDValue &Scale,
2587 SDValue &Index, SDValue &Disp,
2587 SDValue &Index, SDValue &Disp,
2588 SDValue &Segment) {
2599 bool X86DAGToDAGISel::tryFoldBroadcast(SDNode *Root, SDNode *P, SDValue N,
2600 SDValue &Base, SDValue &Scale,
2600 SDValue &Base, SDValue &Scale,
2601 SDValue &Index, SDValue &Disp,
2601 SDValue &Index, SDValue &Disp,
2602 SDValue &Segment) {
2659 bool X86DAGToDAGISel::onlyUsesZeroFlag(SDValue Flags) const {
2695 bool X86DAGToDAGISel::hasNoSignFlagUses(SDValue Flags) const {
2751 bool X86DAGToDAGISel::hasNoCarryFlagUses(SDValue Flags) const {
2808 SDValue StoredVal, SelectionDAG *CurDAG,
2811 SDValue &InputChain) {
2822 SDValue Load = StoredVal->getOperand(LoadOpNo);
2839 SmallVector<SDValue, 4> ChainOps;
2881 SDValue Chain = StoreNode->getChain();
2889 SDValue Op = Chain.getOperand(i);
2905 for (SDValue Op : StoredVal->ops())
2941 SDValue StoredVal = StoreNode->getOperand(1);
2973 SDValue InputChain;
2986 SDValue Base, Scale, Index, Disp, Segment;
3014 const SDValue Ops[] = {Base, Scale, Index, Disp, Segment, InputChain};
3031 const SDValue Ops[] = {Base, Scale, Index, Disp, Segment, InputChain};
3118 SDValue Operand = StoredVal->getOperand(1-LoadOpNo);
3149 SDValue CopyTo =
3153 const SDValue Ops[] = {Base, Scale, Index, Disp,
3158 const SDValue Ops[] = {Base, Scale, Index, Disp,
3202 SDValue NBits;
3234 SDValue M0 = peekThroughOneUseTruncation(Mask->getOperand(0));
3260 SDValue M0 = peekThroughOneUseTruncation(Mask->getOperand(0));
3302 SDValue M1 = Mask.getOperand(1);
3309 SDValue X;
3316 SDValue N0 = Node->getOperand(0);
3320 SDValue N1 = Node->getOperand(1);
3321 SDValue N01 = N0->getOperand(1);
3339 SDValue Mask = Node->getOperand(1);
3359 SDValue ImplDef = SDValue(
3363 SDValue SRIdxVal = CurDAG->getTargetConstant(X86::sub_8bit, DL, MVT::i32);
3378 SDValue Extract = CurDAG->getNode(X86ISD::BZHI, DL, NVT, X, NBits);
3389 SDValue RealX = peekThroughOneUseTruncation(X);
3405 SDValue C8 = CurDAG->getConstant(8, DL, MVT::i8);
3406 SDValue Control = CurDAG->getNode(ISD::SHL, DL, MVT::i32, NBits, C8);
3412 SDValue ShiftAmt = X.getOperand(1);
3420 SDValue OrigShiftAmt = ShiftAmt;
3436 SDValue Extract = CurDAG->getNode(X86ISD::BEXTR, DL, XVT, X, Control);
3455 SDValue N0 = Node->getOperand(0);
3456 SDValue N1 = Node->getOperand(1);
3511 SDValue Control;
3544 SDValue Input = N0->getOperand(0);
3545 SDValue Tmp0, Tmp1, Tmp2, Tmp3, Tmp4;
3547 SDValue Ops[] = {
3561 SDValue ShAmt = CurDAG->getTargetConstant(Shift, dl, NVT);
3574 SDValue N0 = Node->getOperand(0);
3575 SDValue N1 = Node->getOperand(1);
3576 SDValue Imm = Node->getOperand(2);
3581 SDValue Tmp0, Tmp1, Tmp2, Tmp3, Tmp4;
3583 SDValue Ops[] = { N0, Tmp0, Tmp1, Tmp2, Tmp3, Tmp4, Imm,
3594 SDValue Ops[] = { N0, N1, Imm };
3606 SDValue &InFlag) {
3607 SDValue N0 = Node->getOperand(0);
3608 SDValue N2 = Node->getOperand(2);
3609 SDValue Imm = Node->getOperand(4);
3614 SDValue Tmp0, Tmp1, Tmp2, Tmp3, Tmp4;
3616 SDValue Ops[] = { N0, Tmp0, Tmp1, Tmp2, Tmp3, Tmp4, Imm,
3628 SDValue Ops[] = { N0, N2, Imm, InFlag };
3645 SDValue OrigShiftAmt = N->getOperand(1);
3646 SDValue ShiftAmt = OrigShiftAmt;
3656 SDValue NewShiftAmt;
3658 SDValue Add0 = ShiftAmt->getOperand(0);
3659 SDValue Add1 = ShiftAmt->getOperand(1);
3675 SDValue Zero = CurDAG->getConstant(0, DL, SubVT);
3676 SDValue Neg = CurDAG->getNode(ISD::SUB, DL, SubVT, Zero, Add1);
3729 SDValue Shift = N->getOperand(0);
3730 SDValue N1 = N->getOperand(1);
3817 SDValue X = Shift.getOperand(0);
3819 SDValue NewX = CurDAG->getNode(ISD::ANY_EXTEND, dl, NVT, X);
3824 SDValue NewCst = CurDAG->getConstant(ShiftedVal, dl, NVT);
3826 SDValue NewBinOp = CurDAG->getNode(Opcode, dl, NVT, X, NewCst);
3828 SDValue NewSHL = CurDAG->getNode(ISD::SHL, dl, NVT, NewBinOp,
3848 SDValue X = Node->getOperand(0);
3849 SDValue OneVec = Node->getOperand(1);
3856 SDValue OneConstant, AllOnesVec;
3874 SDValue NewNode = CurDAG->getNode(NewOpcode, DL, VT, X, AllOnesVec);
3915 SDValue And0 = And->getOperand(0);
3944 SDValue NewMask = CurDAG->getConstant(NegMaskVal, SDLoc(And), VT);
3945 SDValue NewAnd = CurDAG->getNode(ISD::AND, SDLoc(And), VT, And0, NewMask);
4110 bool X86DAGToDAGISel::tryVPTESTM(SDNode *Root, SDValue Setcc,
4111 SDValue InMask) {
4121 SDValue SetccOp0 = Setcc.getOperand(0);
4122 SDValue SetccOp1 = Setcc.getOperand(1);
4132 SDValue N0 = SetccOp0;
4138 SDValue Src0 = N0;
4139 SDValue Src1 = N0;
4143 SDValue N0Temp = N0;
4162 SDValue Tmp0, Tmp1, Tmp2, Tmp3, Tmp4, Load;
4241 SDValue ImplDef = SDValue(CurDAG->getMachineNode(X86::IMPLICIT_DEF, dl,
4252 SDValue RC = CurDAG->getTargetConstant(RegClass, dl, MVT::i32);
4267 SDValue Ops[] = { InMask, Src0, Tmp0, Tmp1, Tmp2, Tmp3, Tmp4,
4271 SDValue Ops[] = { Src0, Tmp0, Tmp1, Tmp2, Tmp3, Tmp4,
4290 SDValue RC = CurDAG->getTargetConstant(RegClass, dl, MVT::i32);
4315 SDValue N0 = N->getOperand(0);
4316 SDValue N1 = N->getOperand(1);
4328 SDValue A = N1.getOperand(0);
4329 SDValue C = N1.getOperand(1);
4333 SDValue B;
4342 SDValue Imm = CurDAG->getTargetConstant(0xCA, dl, MVT::i8);
4343 SDValue Ternlog = CurDAG->getNode(X86ISD::VPTERNLOG, dl, NVT, A, B, C, Imm);
4393 SDValue Chain = CurDAG->getCopyToReg(Node->getOperand(0), dl, PtrReg,
4395 SDValue InFlag = Chain.getValue(1);
4427 const SDValue &Target = Node->getOperand(1);
4429 SDValue ZextTarget = CurDAG->getZExtOrTrunc(Target, dl, EVT(MVT::i64));
4430 SDValue Brind = CurDAG->getNode(ISD::BRIND, dl, MVT::Other,
4459 SDValue Blendv = CurDAG->getNode(
4481 SDValue N0 = Node->getOperand(0);
4482 SDValue N1 = Node->getOperand(1);
4530 SDValue N0 = Node->getOperand(0);
4531 SDValue N1 = Node->getOperand(1);
4602 SDValue Tmp0, Tmp1, Tmp2, Tmp3, Tmp4;
4604 SDValue Ops[] = { N1, Tmp0, Tmp1, Tmp2, Tmp3, Tmp4, N0.getOperand(0) };
4627 SDValue N0 = Node->getOperand(0);
4628 SDValue N1 = Node->getOperand(1);
4655 SDValue Tmp0, Tmp1, Tmp2, Tmp3, Tmp4;
4664 SDValue InFlag = CurDAG->getCopyToReg(CurDAG->getEntryNode(), dl, LoReg,
4677 SDValue Ops[] = { Tmp0, Tmp1, Tmp2, Tmp3, Tmp4, N1.getOperand(0),
4705 SDValue N0 = Node->getOperand(0);
4706 SDValue N1 = Node->getOperand(1);
4737 SDValue Tmp0, Tmp1, Tmp2, Tmp3, Tmp4;
4746 SDValue InFlag = CurDAG->getCopyToReg(CurDAG->getEntryNode(), dl, SrcReg,
4749 SDValue Chain;
4751 SDValue Ops[] = { Tmp0, Tmp1, Tmp2, Tmp3, Tmp4, N1.getOperand(0),
4763 SDValue Ops[] = { N1, InFlag };
4772 SDValue ResLo = CurDAG->getCopyFromReg(CurDAG->getEntryNode(), dl, LoReg,
4782 SDValue ResHi = CurDAG->getCopyFromReg(CurDAG->getEntryNode(), dl, HiReg,
4796 SDValue N0 = Node->getOperand(0);
4797 SDValue N1 = Node->getOperand(1);
4842 SDValue Tmp0, Tmp1, Tmp2, Tmp3, Tmp4;
4846 SDValue InFlag;
4850 SDValue Tmp0, Tmp1, Tmp2, Tmp3, Tmp4, Chain;
4853 SDValue Ops[] = { Tmp0, Tmp1, Tmp2, Tmp3, Tmp4, N0.getOperand(0) };
4880 SDValue ClrNode = SDValue(CurDAG->getMachineNode(X86::MOV32r0, dl, NVT), 0);
4911 SDValue Ops[] = { Tmp0, Tmp1, Tmp2, Tmp3, Tmp4, N1.getOperand(0),
4933 SDValue AHCopy = CurDAG->getRegister(X86::AH, MVT::i8);
4939 SDValue Result(RNode, 0);
4951 SDValue Result = CurDAG->getCopyFromReg(CurDAG->getEntryNode(), dl,
4960 SDValue Result = CurDAG->getCopyFromReg(CurDAG->getEntryNode(), dl,
4972 SDValue N0 = Node->getOperand(0);
4973 SDValue N1 = Node->getOperand(1);
4990 SDValue BEXTR = SDValue(NewNode, 0);
5019 SDValue Imm = CurDAG->getTargetConstant(TrailingZeros, dl, MVT::i64);
5020 SDValue Shift =
5030 SDValue Imm = CurDAG->getTargetConstant(LeadingZeros, dl, MVT::i64);
5031 SDValue Shift =
5090 SDValue Imm = CurDAG->getTargetConstant(Mask, dl, VT);
5091 SDValue Reg = N0.getOperand(0);
5095 SDValue Tmp0, Tmp1, Tmp2, Tmp3, Tmp4;
5097 SDValue Ops[] = { Tmp0, Tmp1, Tmp2, Tmp3, Tmp4, Imm,
5151 SDValue InFlag = CurDAG->getCopyToReg(CurDAG->getEntryNode(), dl, X86::EAX,
5214 SDValue Res = CurDAG->getNode(X86ISD::VRNDSCALE, dl, Node->getValueType(0),
5227 SelectInlineAsmMemoryOperand(const SDValue &Op, unsigned ConstraintID,
5228 std::vector<SDValue> &OutOps) {
5229 SDValue Op0, Op1, Op2, Op3, Op4;
lib/Target/X86/X86ISelLowering.cpp 1916 SDValue X86TargetLowering::emitStackGuardXorFP(SelectionDAG &DAG, SDValue Val,
1916 SDValue X86TargetLowering::emitStackGuardXorFP(SelectionDAG &DAG, SDValue Val,
2230 SDValue X86TargetLowering::getPICJumpTableRelocBase(SDValue Table,
2230 SDValue X86TargetLowering::getPICJumpTableRelocBase(SDValue Table,
2408 static SDValue lowerMasksToReg(const SDValue &ValArg, const EVT &ValLoc,
2408 static SDValue lowerMasksToReg(const SDValue &ValArg, const EVT &ValLoc,
2422 SDValue ValToCopy = DAG.getBitcast(TempValLoc, ValArg);
2440 const SDLoc &Dl, SelectionDAG &DAG, SDValue &Arg,
2441 SmallVectorImpl<std::pair<unsigned, SDValue>> &RegsToPass, CCValAssign &VA,
2453 SDValue Lo, Hi;
2464 SDValue
2465 X86TargetLowering::LowerReturn(SDValue Chain, CallingConv::ID CallConv,
2468 const SmallVectorImpl<SDValue> &OutVals,
2486 SDValue Flag;
2487 SmallVector<SDValue, 6> RetOps;
2503 SDValue ValToCopy = OutVals[OutsIndex];
2568 SmallVector<std::pair<unsigned, SDValue>, 8> RegsToPass;
2627 SDValue Val = DAG.getCopyFromReg(RetOps[0], dl, SRetReg,
2669 bool X86TargetLowering::isUsedByReturnOnly(SDNode *N, SDValue &Chain) const {
2673 SDValue TCChain = Chain;
2733 static SDValue getv64i1Argument(CCValAssign &VA, CCValAssign &NextVA,
2734 SDValue &Root, SelectionDAG &DAG,
2736 SDValue *InFlag = nullptr) {
2746 SDValue Lo, Hi;
2747 SDValue ArgValueLo, ArgValueHi;
2784 static SDValue lowerRegToMasks(const SDValue &ValArg, const EVT &ValVT,
2784 static SDValue lowerRegToMasks(const SDValue &ValArg, const EVT &ValVT,
2787 SDValue ValReturned = ValArg;
2820 SDValue X86TargetLowering::LowerCallResult(
2821 SDValue Chain, SDValue InFlag, CallingConv::ID CallConv, bool isVarArg,
2821 SDValue Chain, SDValue InFlag, CallingConv::ID CallConv, bool isVarArg,
2823 SelectionDAG &DAG, SmallVectorImpl<SDValue> &InVals,
2870 SDValue Val;
2951 static SDValue CreateCopyOfByValArgument(SDValue Src, SDValue Dst,
2951 static SDValue CreateCopyOfByValArgument(SDValue Src, SDValue Dst,
2951 static SDValue CreateCopyOfByValArgument(SDValue Src, SDValue Dst,
2952 SDValue Chain, ISD::ArgFlagsTy Flags,
2954 SDValue SizeNode = DAG.getConstant(Flags.getByValSize(), dl, MVT::i32);
3009 SDValue
3010 X86TargetLowering::LowerMemArgument(SDValue Chain, CallingConv::ID CallConv,
3057 SDValue PartAddr;
3084 SDValue Addr =
3105 SDValue FIN = DAG.getFrameIndex(FI, PtrVT);
3106 SDValue Val = DAG.getLoad(
3173 SDValue X86TargetLowering::LowerFormalArguments(
3174 SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
3176 SelectionDAG &DAG, SmallVectorImpl<SDValue> &InVals) const {
3215 SDValue ArgValue;
3331 SDValue Copy = DAG.getCopyToReg(DAG.getEntryNode(), dl, Reg, InVals[I]);
3369 SmallVector<SDValue, 6> LiveGPRs;
3370 SmallVector<SDValue, 8> LiveXMMRegs;
3371 SDValue ALVal;
3407 SmallVector<SDValue, 8> MemOps;
3408 SDValue RSFIN = DAG.getFrameIndex(FuncInfo->getRegSaveFrameIndex(),
3411 for (SDValue Val : LiveGPRs) {
3412 SDValue FIN = DAG.getNode(ISD::ADD, dl, getPointerTy(DAG.getDataLayout()),
3414 SDValue Store =
3425 SmallVector<SDValue, 12> SaveXMMOps;
3476 SDValue RegVal = DAG.getCopyFromReg(Chain, dl, FR.VReg, FR.VT);
3537 SDValue X86TargetLowering::LowerMemOpCallTo(SDValue Chain, SDValue StackPtr,
3537 SDValue X86TargetLowering::LowerMemOpCallTo(SDValue Chain, SDValue StackPtr,
3537 SDValue X86TargetLowering::LowerMemOpCallTo(SDValue Chain, SDValue StackPtr,
3538 SDValue Arg, const SDLoc &dl,
3543 SDValue PtrOff = DAG.getIntPtrConstant(LocMemOffset, dl);
3556 SDValue X86TargetLowering::EmitTailCallLoadRetAddr(
3557 SelectionDAG &DAG, SDValue &OutRetAddr, SDValue Chain, bool IsTailCall,
3557 SelectionDAG &DAG, SDValue &OutRetAddr, SDValue Chain, bool IsTailCall,
3570 static SDValue EmitTailCallStoreRetAddr(SelectionDAG &DAG, MachineFunction &MF,
3571 SDValue Chain, SDValue RetAddrFrIdx,
3571 SDValue Chain, SDValue RetAddrFrIdx,
3580 SDValue NewRetAddrFrIdx = DAG.getFrameIndex(NewReturnAddrFI, PtrVT);
3589 static SDValue getMOVL(SelectionDAG &DAG, const SDLoc &dl, MVT VT, SDValue V1,
3589 static SDValue getMOVL(SelectionDAG &DAG, const SDLoc &dl, MVT VT, SDValue V1,
3590 SDValue V2) {
3599 SDValue
3601 SmallVectorImpl<SDValue> &InVals) const {
3605 SmallVectorImpl<SDValue> &OutVals = CLI.OutVals;
3607 SDValue Chain = CLI.Chain;
3608 SDValue Callee = CLI.Callee;
3735 SDValue RetAddrFrIdx;
3741 SmallVector<std::pair<unsigned, SDValue>, 8> RegsToPass;
3742 SmallVector<SDValue, 8> MemOpChains;
3743 SDValue StackPtr;
3763 SDValue Arg = OutVals[OutIndex];
3799 SDValue StackSlot =
3808 SDValue SpillSlot = DAG.CreateStackTemporary(VA.getValVT());
3907 SDValue Val = DAG.getCopyFromReg(Chain, dl, F.VReg, F.VT);
3922 SDValue ArgChain = DAG.getStackArgumentTokenFactor(Chain);
3924 SmallVector<SDValue, 8> MemOpChains2;
3925 SDValue FIN;
3944 SDValue Arg = OutVals[OutsIndex];
3957 SDValue Source = DAG.getIntPtrConstant(VA.getLocMemOffset(), dl);
3986 SDValue InFlag;
4014 SmallVector<SDValue, 8> Ops;
4096 SDValue Ret = DAG.getNode(X86ISD::TC_RETURN, dl, NodeTys, Ops);
4208 bool MatchingStackOffset(SDValue Arg, unsigned Offset, ISD::ArgFlagsTy Flags,
4221 const SDValue &TruncInput = Arg.getOperand(0);
4261 SDValue Ptr = Ld->getBasePtr();
4302 SDValue Callee, CallingConv::ID CalleeCC, bool isVarArg,
4305 const SmallVectorImpl<SDValue> &OutVals,
4430 SDValue Arg = OutVals[i];
4504 static bool MayFoldLoad(SDValue Op) {
4508 static bool MayFoldIntoStore(SDValue Op) {
4512 static bool MayFoldIntoZeroExtend(SDValue Op) {
4578 SDValue X86TargetLowering::getReturnAddressFrameIndex(SelectionDAG &DAG) const {
4686 bool isFP, SDValue &LHS, SDValue &RHS,
4686 bool isFP, SDValue &LHS, SDValue &RHS,
4866 SDValue BasePtr = cast<LoadSDNode>(Load)->getBasePtr();
4924 SDValue C) const {
4972 bool X86TargetLowering::shouldScalarizeBinop(SDValue VecOp) const {
5053 bool X86TargetLowering::hasAndNotCompare(SDValue Y) const {
5069 bool X86TargetLowering::hasAndNot(SDValue Y) const {
5086 bool X86TargetLowering::hasBitTest(SDValue X, SDValue Y) const {
5086 bool X86TargetLowering::hasBitTest(SDValue X, SDValue Y) const {
5092 SDValue X, ConstantSDNode *XC, ConstantSDNode *CC, SDValue Y,
5092 SDValue X, ConstantSDNode *XC, ConstantSDNode *CC, SDValue Y,
5131 bool X86TargetLowering::shouldFoldMaskToVariableShiftPair(SDValue Y) const {
5354 bool X86::isZeroNode(SDValue Elt) {
5361 static SDValue getConstVector(ArrayRef<int> Values, MVT VT, SelectionDAG &DAG,
5364 SmallVector<SDValue, 32> Ops;
5378 SDValue OpNode = IsUndef ? DAG.getUNDEF(EltVT) :
5385 SDValue ConstsNode = DAG.getBuildVector(ConstVecVT, dl, Ops);
5391 static SDValue getConstVector(ArrayRef<APInt> Bits, APInt &Undefs,
5395 SmallVector<SDValue, 32> Ops;
5428 SDValue ConstsNode = DAG.getBuildVector(ConstVecVT, dl, Ops);
5433 static SDValue getZeroVector(MVT VT, const X86Subtarget &Subtarget,
5442 SDValue Vec;
5458 static SDValue extractSubVector(SDValue Vec, unsigned IdxVal, SelectionDAG &DAG,
5458 static SDValue extractSubVector(SDValue Vec, unsigned IdxVal, SelectionDAG &DAG,
5479 SDValue VecIdx = DAG.getIntPtrConstant(IdxVal, dl);
5489 static SDValue extract128BitVector(SDValue Vec, unsigned IdxVal,
5489 static SDValue extract128BitVector(SDValue Vec, unsigned IdxVal,
5497 static SDValue extract256BitVector(SDValue Vec, unsigned IdxVal,
5497 static SDValue extract256BitVector(SDValue Vec, unsigned IdxVal,
5503 static SDValue insertSubVector(SDValue Result, SDValue Vec, unsigned IdxVal,
5503 static SDValue insertSubVector(SDValue Result, SDValue Vec, unsigned IdxVal,
5503 static SDValue insertSubVector(SDValue Result, SDValue Vec, unsigned IdxVal,
5523 SDValue VecIdx = DAG.getIntPtrConstant(IdxVal, dl);
5533 static SDValue insert128BitVector(SDValue Result, SDValue Vec, unsigned IdxVal,
5533 static SDValue insert128BitVector(SDValue Result, SDValue Vec, unsigned IdxVal,
5533 static SDValue insert128BitVector(SDValue Result, SDValue Vec, unsigned IdxVal,
5541 static SDValue widenSubVector(MVT VT, SDValue Vec, bool ZeroNewElements,
5541 static SDValue widenSubVector(MVT VT, SDValue Vec, bool ZeroNewElements,
5547 SDValue Res = ZeroNewElements ? getZeroVector(VT, Subtarget, DAG, dl)
5555 static SDValue widenSubVector(SDValue Vec, bool ZeroNewElements,
5555 static SDValue widenSubVector(SDValue Vec, bool ZeroNewElements,
5570 static bool collectConcatOps(SDNode *N, SmallVectorImpl<SDValue> &Ops) {
5580 SDValue Src = N->getOperand(0);
5581 SDValue Sub = N->getOperand(1);
5609 SDValue SplitOpsAndApply(SelectionDAG &DAG, const X86Subtarget &Subtarget,
5610 const SDLoc &DL, EVT VT, ArrayRef<SDValue> Ops,
5635 SmallVector<SDValue, 4> Subs;
5637 SmallVector<SDValue, 2> SubOps;
5638 for (SDValue Op : Ops) {
5650 static SDValue insert1BitVector(SDValue Op, SelectionDAG &DAG,
5650 static SDValue insert1BitVector(SDValue Op, SelectionDAG &DAG,
5654 SDValue Vec = Op.getOperand(0);
5655 SDValue SubVec = Op.getOperand(1);
5656 SDValue Idx = Op.getOperand(2);
5672 SDValue ZeroIdx = DAG.getIntPtrConstant(0, dl);
5696 SDValue Undef = DAG.getUNDEF(WideOpVT);
5700 SDValue ShiftBits = DAG.getTargetConstant(SubVecNumElems, dl, MVT::i8);
5752 SDValue ShiftBits = DAG.getTargetConstant(NumElems - IdxVal, dl, MVT::i8);
5777 SDValue Low = DAG.getNode(X86ISD::KSHIFTL, dl, WideOpVT, Vec,
5784 SDValue High = DAG.getNode(X86ISD::KSHIFTR, dl, WideOpVT, Vec,
5797 static SDValue concatSubVectors(SDValue V1, SDValue V2, SelectionDAG &DAG,
5797 static SDValue concatSubVectors(SDValue V1, SDValue V2, SelectionDAG &DAG,
5797 static SDValue concatSubVectors(SDValue V1, SDValue V2, SelectionDAG &DAG,
5805 SDValue V = insertSubVector(DAG.getUNDEF(VT), V1, 0, DAG, dl, SubVectorWidth);
5812 static SDValue getOnesVector(EVT VT, SelectionDAG &DAG, const SDLoc &dl) {
5818 SDValue Vec = DAG.getConstant(Ones, dl, MVT::getVectorVT(MVT::i32, NumElts));
5838 static SDValue getExtendInVec(unsigned Opcode, const SDLoc &DL, EVT VT,
5839 SDValue In, SelectionDAG &DAG) {
5866 static SDValue IsNOT(SDValue V, SelectionDAG &DAG) {
5866 static SDValue IsNOT(SDValue V, SelectionDAG &DAG) {
5873 if (SDValue Not = IsNOT(V.getOperand(0), DAG)) {
5879 SmallVector<SDValue, 2> CatOps;
5881 for (SDValue &CatOp : CatOps) {
5882 SDValue NotCat = IsNOT(CatOp, DAG);
5892 static SDValue getUnpackl(SelectionDAG &DAG, const SDLoc &dl, MVT VT,
5893 SDValue V1, SDValue V2) {
5893 SDValue V1, SDValue V2) {
5900 static SDValue getUnpackh(SelectionDAG &DAG, const SDLoc &dl, MVT VT,
5901 SDValue V1, SDValue V2) {
5901 SDValue V1, SDValue V2) {
5911 static SDValue getShuffleVectorZeroOrUndef(SDValue V2, int Idx,
5911 static SDValue getShuffleVectorZeroOrUndef(SDValue V2, int Idx,
5916 SDValue V1 = IsZero
5930 SDValue Ptr = Load->getBasePtr();
5942 static const Constant *getTargetConstantFromNode(SDValue Op) {
5954 static bool getTargetConstantBitsFromNode(SDValue Op, unsigned EltSizeInBits,
6072 const SDValue &Src = Op.getOperand(i);
6089 const SDValue &Src = Op.getOperand(i);
6145 SDValue Ptr = MemIntr->getBasePtr();
6292 bool isConstantSplat(SDValue Op, APInt &SplatVal) {
6318 static bool getTargetShuffleMaskIndices(SDValue MaskNode,
6415 SmallVectorImpl<SDValue> &Ops,
6421 SDValue ImmN;
6551 SDValue N0 = N->getOperand(0);
6572 SDValue MaskNode = N->getOperand(1);
6585 SDValue MaskNode = N->getOperand(1);
6639 SDValue MaskNode = N->getOperand(2);
6640 SDValue CtrlNode = N->getOperand(3);
6656 SDValue MaskNode = N->getOperand(2);
6668 SDValue MaskNode = N->getOperand(0);
6683 SDValue MaskNode = N->getOperand(1);
6725 static bool getTargetShuffleAndZeroables(SDValue N, SmallVectorImpl<int> &Mask,
6726 SmallVectorImpl<SDValue> &Ops,
6737 SDValue V1 = Ops[0];
6738 SDValue V2 = IsUnary ? V1 : Ops[1];
6772 SDValue V = M < Size ? V1 : V2;
6844 static bool getTargetShuffleInputs(SDValue Op, SmallVectorImpl<SDValue> &Inputs,
6844 static bool getTargetShuffleInputs(SDValue Op, SmallVectorImpl<SDValue> &Inputs,
6852 static bool getFauxShuffleMask(SDValue N, const APInt &DemandedElts,
6854 SmallVectorImpl<SDValue> &Ops,
6886 SDValue N0 = N.getOperand(0);
6887 SDValue N1 = N.getOperand(1);
6944 SDValue N0 = peekThroughOneUseBitcasts(N.getOperand(0));
6945 SDValue N1 = peekThroughOneUseBitcasts(N.getOperand(1));
6949 SmallVector<SDValue, 2> SrcInputs0, SrcInputs1;
6976 SDValue Src = N.getOperand(0);
6977 SDValue Sub = N.getOperand(1);
6999 SmallVector<SDValue, 2> SubInputs;
7019 for (SDValue &SubInput : SubInputs) {
7042 SDValue N0 = N.getOperand(0);
7043 SDValue SrcExtract;
7057 SDValue SrcVec = SrcExtract.getOperand(0);
7074 SDValue InVec = N.getOperand(0);
7075 SDValue InScl = N.getOperand(1);
7076 SDValue InIndex = N.getOperand(2);
7097 SDValue ExVec = InScl.getOperand(0);
7098 SDValue ExIndex = InScl.getOperand(1);
7112 SDValue N0 = N.getOperand(0);
7113 SDValue N1 = N.getOperand(1);
7180 SDValue Src = N.getOperand(0);
7203 SDValue Src = N.getOperand(0);
7236 static void resolveTargetShuffleInputsAndMask(SmallVectorImpl<SDValue> &Inputs,
7239 SmallVector<SDValue, 16> UsedInputs;
7280 static bool getTargetShuffleInputs(SDValue Op, const APInt &DemandedElts,
7281 SmallVectorImpl<SDValue> &Inputs,
7303 static bool getTargetShuffleInputs(SDValue Op, SmallVectorImpl<SDValue> &Inputs,
7303 static bool getTargetShuffleInputs(SDValue Op, SmallVectorImpl<SDValue> &Inputs,
7320 static SDValue getShuffleScalarElt(SDNode *N, unsigned Index, SelectionDAG &DAG,
7325 SDValue V = SDValue(N, 0);
7337 SDValue NewV = (Elt < (int)NumElems) ? SV->getOperand(0)
7348 SmallVector<SDValue, 16> ShuffleOps;
7362 SDValue NewV = (Elt < NumElems) ? ShuffleOps[0] : ShuffleOps[1];
7370 SDValue Vec = N->getOperand(0);
7371 SDValue Sub = N->getOperand(1);
7384 SDValue Src = N->getOperand(0);
7410 static SDValue LowerBuildVectorAsInsert(SDValue Op, unsigned NonZeros,
7410 static SDValue LowerBuildVectorAsInsert(SDValue Op, unsigned NonZeros,
7421 SDValue V;
7452 static SDValue LowerBuildVectorv16i8(SDValue Op, unsigned NonZeros,
7452 static SDValue LowerBuildVectorv16i8(SDValue Op, unsigned NonZeros,
7465 SDValue V;
7475 SDValue Elt;
7484 SDValue NextElt = Op.getOperand(i + 1);
7517 static SDValue LowerBuildVectorv8i16(SDValue Op, unsigned NonZeros,
7517 static SDValue LowerBuildVectorv8i16(SDValue Op, unsigned NonZeros,
7530 static SDValue LowerBuildVectorv4x32(SDValue Op, SelectionDAG &DAG,
7530 static SDValue LowerBuildVectorv4x32(SDValue Op, SelectionDAG &DAG,
7545 SDValue Ops[4] = { Op.getOperand(0), Op.getOperand(1),
7547 SDValue NewBV = DAG.getBitcast(MVT::v2f64, DAG.getBuildVector(VT, DL, Ops));
7548 SDValue Dup = DAG.getNode(X86ISD::MOVDDUP, DL, MVT::v2f64, NewBV);
7555 SDValue Elt = Op.getOperand(i);
7564 SDValue FirstNonZero;
7569 SDValue Elt = Op.getOperand(i);
7584 SDValue V1 = FirstNonZero.getOperand(0);
7588 SDValue Elt;
7608 SDValue VZeroOrUndef = (Zeroable == Undefs)
7620 SDValue V2 = Elt.getOperand(0);
7629 SDValue Current = Op->getOperand(i);
7630 SDValue SrcVector = Current->getOperand(0);
7651 SDValue Result = DAG.getNode(X86ISD::INSERTPS, DL, MVT::v4f32, V1, V2,
7657 static SDValue getVShift(bool isLeft, EVT VT, SDValue SrcOp, unsigned NumBits,
7657 static SDValue getVShift(bool isLeft, EVT VT, SDValue SrcOp, unsigned NumBits,
7665 SDValue ShiftVal = DAG.getTargetConstant(NumBits / 8, dl, MVT::i8);
7669 static SDValue LowerAsSplatVectorLoad(SDValue SrcOp, MVT VT, const SDLoc &dl,
7669 static SDValue LowerAsSplatVectorLoad(SDValue SrcOp, MVT VT, const SDLoc &dl,
7676 SDValue Ptr = LD->getBasePtr();
7700 SDValue Chain = LD->getChain();
7731 SDValue V1 = DAG.getLoad(NVT, dl, Chain, Ptr,
7743 static bool findEltLoadSrc(SDValue Elt, LoadSDNode *&Ld, int64_t &ByteOffset) {
7769 SDValue Src = Elt.getOperand(0);
7790 static SDValue EltsFromConsecutiveLoads(EVT VT, ArrayRef<SDValue> Elts,
7790 static SDValue EltsFromConsecutiveLoads(EVT VT, ArrayRef<SDValue> Elts,
7810 SDValue Elt = peekThroughBitcasts(Elts[i]);
7852 SDValue EltBase = peekThroughBitcasts(Elts[FirstLoadedElt]);
7902 SDValue NewLd =
7952 SDValue V = CreateLoad(VT, LDBase);
7953 SDValue Z = VT.isInteger() ? DAG.getConstant(0, DL, VT)
7966 SDValue HalfLD =
7984 SDValue Ops[] = { LDBase->getChain(), LDBase->getBasePtr() };
7985 SDValue ResNode =
8008 SmallVector<SDValue, 8> RepeatedLoads(SubElems, DAG.getUNDEF(EltBaseVT));
8012 SDValue Elt = peekThroughBitcasts(Elts[i]);
8036 if (SDValue RepeatLoad = EltsFromConsecutiveLoads(
8040 SDValue Broadcast = DAG.getNode(Opcode, DL, BroadcastVT, RepeatLoad);
8053 static SDValue combineToConsecutiveLoads(EVT VT, SDNode *N, const SDLoc &DL,
8057 SmallVector<SDValue, 64> Elts;
8059 if (SDValue Elt = getShuffleScalarElt(N, i, DAG, 0)) {
8116 static SDValue isSplatZeroExtended(const BuildVectorSDNode *Op,
8118 SDValue ExtValue = Op->getOperand(0);
8155 static SDValue lowerBuildVectorAsBroadcast(BuildVectorSDNode *BVOp,
8171 SDValue Ld = BVOp->getSplatValue(&UndefElements);
8182 SDValue BOperand;
8183 SDValue ZeroExtended = isSplatZeroExtended(BVOp, NumElts, EltType);
8194 SDValue Brdcst =
8228 SDValue CP = DAG.getConstantPool(C, PVT);
8236 SDValue Brdcst = DAG.getNode(X86ISD::VBROADCAST, dl,
8252 SDValue CP = DAG.getConstantPool(C, PVT);
8260 SDValue Brdcst = DAG.getNode(X86ISD::VBROADCAST, dl,
8268 SDValue VCP = DAG.getConstantPool(VecC, PVT);
8275 SDValue Brdcst = DAG.getNode(X86ISD::SUBV_BROADCAST, dl, VT, Ld);
8336 SDValue CP =
8379 static int getUnderlyingExtractedFromVec(SDValue &ExtractedFromVec,
8380 SDValue ExtIdx) {
8396 SDValue ShuffleVec = SVOp->getOperand(0);
8409 static SDValue buildFromShuffleMostly(SDValue Op, SelectionDAG &DAG) {
8409 static SDValue buildFromShuffleMostly(SDValue Op, SelectionDAG &DAG) {
8420 SDValue VecIn1;
8421 SDValue VecIn2;
8440 SDValue ExtractedFromVec = Op.getOperand(i).getOperand(0);
8441 SDValue ExtIdx = Op.getOperand(i).getOperand(1);
8472 SDValue NV = DAG.getVectorShuffle(VT, DL, VecIn1, VecIn2, Mask);
8481 static SDValue ConvertI1VectorToInteger(SDValue Op, SelectionDAG &DAG) {
8481 static SDValue ConvertI1VectorToInteger(SDValue Op, SelectionDAG &DAG) {
8487 SDValue In = Op.getOperand(idx);
8496 static SDValue LowerBUILD_VECTORvXi1(SDValue Op, SelectionDAG &DAG,
8496 static SDValue LowerBUILD_VECTORvXi1(SDValue Op, SelectionDAG &DAG,
8514 SDValue In = Op.getOperand(idx);
8535 SDValue Cond = Op.getOperand(SplatIdx);
8546 SDValue DstVec;
8549 SDValue ImmL = DAG.getConstant(Lo_32(Immediate), dl, MVT::i32);
8550 SDValue ImmH = DAG.getConstant(Hi_32(Immediate), dl, MVT::i32);
8556 SDValue Imm = DAG.getConstant(Immediate, dl, ImmVT);
8597 SDValue &V0, SDValue &V1) {
8597 SDValue &V0, SDValue &V1) {
8613 SDValue Op = N->getOperand(i + BaseIdx);
8629 SDValue Op0 = Op.getOperand(0);
8630 SDValue Op1 = Op.getOperand(1);
8661 SDValue Expected = (i * 2 < NumElts) ? V0 : V1;
8708 static SDValue ExpandHorizontalBinOp(const SDValue &V0, const SDValue &V1,
8708 static SDValue ExpandHorizontalBinOp(const SDValue &V0, const SDValue &V1,
8708 static SDValue ExpandHorizontalBinOp(const SDValue &V0, const SDValue &V1,
8717 SDValue V0_LO = extract128BitVector(V0, 0, DAG, DL);
8718 SDValue V0_HI = extract128BitVector(V0, NumElts/2, DAG, DL);
8719 SDValue V1_LO = extract128BitVector(V1, 0, DAG, DL);
8720 SDValue V1_HI = extract128BitVector(V1, NumElts/2, DAG, DL);
8723 SDValue LO = DAG.getUNDEF(NewVT);
8724 SDValue HI = DAG.getUNDEF(NewVT);
8751 SDValue &Opnd0, SDValue &Opnd1,
8751 SDValue &Opnd0, SDValue &Opnd1,
8760 SDValue InVec0 = DAG.getUNDEF(VT);
8761 SDValue InVec1 = DAG.getUNDEF(VT);
8771 SDValue Op = BV->getOperand(i);
8782 SDValue Op0 = Op.getOperand(0);
8783 SDValue Op1 = Op.getOperand(1);
8879 SDValue &Opnd0, SDValue &Opnd1, SDValue &Opnd2,
8879 SDValue &Opnd0, SDValue &Opnd1, SDValue &Opnd2,
8879 SDValue &Opnd0, SDValue &Opnd1, SDValue &Opnd2,
8905 static SDValue lowerToAddSubOrFMAddSub(const BuildVectorSDNode *BV,
8908 SDValue Opnd0, Opnd1;
8919 SDValue Opnd2;
8941 unsigned &HOpcode, SDValue &V0, SDValue &V1) {
8941 unsigned &HOpcode, SDValue &V0, SDValue &V1) {
8959 SDValue Op = BV->getOperand(i * NumEltsIn128Bits + j);
8979 SDValue Op0 = Op.getOperand(0);
8980 SDValue Op1 = Op.getOperand(1);
8998 SDValue SourceVec = (j < NumEltsIn64Bits) ? V0 : V1;
9027 static SDValue getHopForBuildVector(const BuildVectorSDNode *BV,
9029 SDValue V0, SDValue V1) {
9029 SDValue V0, SDValue V1) {
9057 SDValue Half = DAG.getNode(HOpcode, SDLoc(BV), HalfVT, V0, V1);
9065 static SDValue LowerToHorizontalOp(const BuildVectorSDNode *BV,
9083 SDValue V0, V1;
9106 SDValue InVec0, InVec1;
9108 SDValue InVec2, InVec3;
9137 SDValue V0 = InVec0.isUndef() ? InVec2 : InVec0;
9138 SDValue V1 = InVec1.isUndef() ? InVec3 : InVec1;
9186 static SDValue lowerBuildVectorToBitOp(BuildVectorSDNode *Op,
9222 SmallVector<SDValue, 4> LHSElts, RHSElts;
9223 for (SDValue Elt : Op->ops()) {
9224 SDValue LHS = Elt.getOperand(0);
9225 SDValue RHS = Elt.getOperand(1);
9248 SDValue LHS = DAG.getBuildVector(VT, DL, LHSElts);
9249 SDValue RHS = DAG.getBuildVector(VT, DL, RHSElts);
9256 static SDValue materializeVectorConstant(SDValue Op, SelectionDAG &DAG,
9256 static SDValue materializeVectorConstant(SDValue Op, SelectionDAG &DAG,
9281 static SDValue createVariablePermute(MVT VT, SDValue SrcVec, SDValue IndicesVec,
9281 static SDValue createVariablePermute(MVT VT, SDValue SrcVec, SDValue IndicesVec,
9281 static SDValue createVariablePermute(MVT VT, SDValue SrcVec, SDValue IndicesVec,
9387 SDValue LoSrc = extract128BitVector(SrcVec, 0, DAG, DL);
9388 SDValue HiSrc = extract128BitVector(SrcVec, 16, DAG, DL);
9389 SDValue LoIdx = extract128BitVector(IndicesVec, 0, DAG, DL);
9390 SDValue HiIdx = extract128BitVector(IndicesVec, 16, DAG, DL);
9396 SDValue Lo = extract128BitVector(SrcVec, 0, DAG, DL);
9397 SDValue Hi = extract128BitVector(SrcVec, 16, DAG, DL);
9398 SDValue LoLo = DAG.getNode(ISD::CONCAT_VECTORS, DL, VT, Lo, Lo);
9399 SDValue HiHi = DAG.getNode(ISD::CONCAT_VECTORS, DL, VT, Hi, Hi);
9405 SDValue Idx = Ops[2];
9412 SDValue Ops[] = {LoLo, HiHi, IndicesVec};
9435 SDValue LoLo = DAG.getVectorShuffle(MVT::v8f32, DL, SrcVec, SrcVec,
9437 SDValue HiHi = DAG.getVectorShuffle(MVT::v8f32, DL, SrcVec, SrcVec,
9445 SDValue Res = DAG.getSelectCC(
9462 SDValue Res = createVariablePermute(WidenSrcVT, SrcVec, IndicesVec, DL,
9469 SDValue LoLo =
9471 SDValue HiHi =
9481 SDValue Res = DAG.getSelectCC(
9520 SDValue Res = Opcode == X86ISD::VPERMV
9537 static SDValue
9538 LowerBUILD_VECTORAsVariablePermute(SDValue V, SelectionDAG &DAG,
9540 SDValue SrcVec, IndicesVec;
9545 SDValue Op = V.getOperand(Idx);
9556 SDValue ExtractedIndex = Op->getOperand(1);
9582 SDValue
9583 X86TargetLowering::LowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG) const {
9594 if (SDValue VectorConstant = materializeVectorConstant(Op, DAG, Subtarget))
9598 if (SDValue AddSub = lowerToAddSubOrFMAddSub(BV, Subtarget, DAG))
9600 if (SDValue HorizontalOp = LowerToHorizontalOp(BV, Subtarget, DAG))
9602 if (SDValue Broadcast = lowerBuildVectorAsBroadcast(BV, Subtarget, DAG))
9604 if (SDValue BitOp = lowerBuildVectorToBitOp(BV, DAG))
9613 SmallSet<SDValue, 8> Values;
9616 SDValue Elt = Op.getOperand(i);
9652 SDValue VarElt;
9653 SDValue InsIndex;
9655 SDValue Elt = Op.getOperand(i);
9668 SDValue DAGConstVec = DAG.getConstantPool(CV, VT);
9676 SDValue LegalDAGConstVec = LowerConstantPool(DAGConstVec, DAG);
9679 SDValue Ld = DAG.getLoad(VT, dl, DAG.getEntryNode(), LegalDAGConstVec, MPI);
9693 SDValue S2V = DAG.getNode(ISD::SCALAR_TO_VECTOR, dl, VT, VarElt);
9700 SDValue Item = Op.getOperand(Idx);
9764 SDValue Item = Op.getOperand(Idx);
9776 if (SDValue V = LowerBUILD_VECTORAsVariablePermute(Op, DAG, Subtarget))
9781 SmallVector<SDValue, 64> Ops(Op->op_begin(), Op->op_begin() + NumElems);
9782 if (SDValue LD =
9791 SDValue Ops[4] = { Op.getOperand(0), Op.getOperand(1),
9804 SDValue NewBV = DAG.getBitcast(MVT::getVectorVT(WideEltVT, 2),
9819 SDValue Lower =
9821 SDValue Upper = DAG.getBuildVector(
9833 SDValue V2 = DAG.getNode(ISD::SCALAR_TO_VECTOR, dl, VT,
9842 if (SDValue V = LowerBuildVectorv16i8(Op, NonZeros, NumNonZero, NumZero,
9847 if (SDValue V = LowerBuildVectorv8i16(Op, NonZeros, NumNonZero, NumZero,
9853 if (SDValue V = LowerBuildVectorv4x32(Op, DAG, Subtarget))
9858 SmallVector<SDValue, 8> Ops(NumElems);
9899 if (SDValue Sh = buildFromShuffleMostly(Op, DAG))
9904 SDValue Result;
9921 SmallVector<SDValue, 8> Ops(NumElems);
9951 static SDValue LowerAVXCONCAT_VECTORS(SDValue Op, SelectionDAG &DAG,
9951 static SDValue LowerAVXCONCAT_VECTORS(SDValue Op, SelectionDAG &DAG,
9964 SDValue SubVec = Op.getOperand(i);
9980 SDValue Lo = DAG.getNode(ISD::CONCAT_VECTORS, dl, HalfVT,
9982 SDValue Hi = DAG.getNode(ISD::CONCAT_VECTORS, dl, HalfVT,
9988 SDValue Vec = NumZero ? getZeroVector(ResVT, Subtarget, DAG, dl)
10009 static SDValue LowerCONCAT_VECTORSvXi1(SDValue Op,
10009 static SDValue LowerCONCAT_VECTORSvXi1(SDValue Op,
10022 SDValue SubVec = Op.getOperand(i);
10043 SDValue SubVec = Op.getOperand(Idx);
10056 SDValue Vec = Zeros ? DAG.getConstant(0, dl, ResVT) : DAG.getUNDEF(ResVT);
10060 SDValue SubVec = Op.getOperand(Idx);
10069 SDValue Lo = DAG.getNode(ISD::CONCAT_VECTORS, dl, HalfVT,
10071 SDValue Hi = DAG.getNode(ISD::CONCAT_VECTORS, dl, HalfVT,
10081 SDValue Vec = DAG.getNode(ISD::INSERT_SUBVECTOR, dl, ResVT,
10088 static SDValue LowerCONCAT_VECTORS(SDValue Op,
10088 static SDValue LowerCONCAT_VECTORS(SDValue Op,
10252 static bool isShuffleEquivalent(SDValue V1, SDValue V2, ArrayRef<int> Mask,
10252 static bool isShuffleEquivalent(SDValue V1, SDValue V2, ArrayRef<int> Mask,
10290 SDValue V1 = SDValue(),
10291 SDValue V2 = SDValue()) {
10328 SDValue Cond) {
10336 SDValue CondElt = Cond.getOperand(i);
10422 static SDValue getV4X86ShuffleImm8ForMask(ArrayRef<int> Mask, const SDLoc &DL,
10436 SDValue V1, SDValue V2) {
10436 SDValue V1, SDValue V2) {
10457 SDValue V = M < Size ? V1 : V2;
10468 SDValue Op = V.getOperand(M / Scale);
10493 SDValue Op = V.getOperand((M * Scale) + j);
10538 static SDValue lowerShuffleWithPSHUFB(const SDLoc &DL, MVT VT,
10539 ArrayRef<int> Mask, SDValue V1,
10540 SDValue V2, const APInt &Zeroable,
10552 SmallVector<SDValue, 64> PSHUFBMask(NumBytes);
10554 SDValue ZeroMask = DAG.getConstant(0x80, DL, MVT::i8);
10556 SDValue V;
10569 SDValue SrcV = (M >= Size ? V2 : V1);
10591 static SDValue getMaskNode(SDValue Mask, MVT MaskVT,
10591 static SDValue getMaskNode(SDValue Mask, MVT MaskVT,
10596 static SDValue lowerShuffleToEXPAND(const SDLoc &DL, MVT VT,
10598 ArrayRef<int> Mask, SDValue &V1,
10599 SDValue &V2, SelectionDAG &DAG,
10608 SDValue MaskNode = DAG.getConstant(VEXPANDMask, DL, IntegerType);
10612 SDValue VMask = getMaskNode(MaskNode, MVT::getVectorVT(MVT::i1, NumElts),
10614 SDValue ZeroVector = getZeroVector(VT, Subtarget, DAG, DL);
10615 SDValue ExpandedVector = IsLeftZeroSide ? V2 : V1;
10619 static bool matchVectorShuffleWithUNPCK(MVT VT, SDValue &V1, SDValue &V2,
10619 static bool matchVectorShuffleWithUNPCK(MVT VT, SDValue &V1, SDValue &V2,
10706 static SDValue lowerShuffleWithUNPCK(const SDLoc &DL, MVT VT,
10707 ArrayRef<int> Mask, SDValue V1, SDValue V2,
10707 ArrayRef<int> Mask, SDValue V1, SDValue V2,
10770 static SDValue lowerShuffleWithVPMOV(const SDLoc &DL, ArrayRef<int> Mask,
10771 MVT VT, SDValue V1, SDValue V2,
10771 MVT VT, SDValue V1, SDValue V2,
10801 SDValue Src = V1.getOperand(0).getOperand(0);
10826 static bool matchVectorShuffleWithPACK(MVT VT, MVT &SrcVT, SDValue &V1,
10827 SDValue &V2, unsigned &PackOpcode,
10837 SDValue VV1 = DAG.getBitcast(PackVT, N1);
10838 SDValue VV2 = DAG.getBitcast(PackVT, N2);
10878 static SDValue lowerShuffleWithPACK(const SDLoc &DL, MVT VT, ArrayRef<int> Mask,
10879 SDValue V1, SDValue V2, SelectionDAG &DAG,
10879 SDValue V1, SDValue V2, SelectionDAG &DAG,
10895 static SDValue lowerShuffleAsBitMask(const SDLoc &DL, MVT VT, SDValue V1,
10895 static SDValue lowerShuffleAsBitMask(const SDLoc &DL, MVT VT, SDValue V1,
10896 SDValue V2, ArrayRef<int> Mask,
10902 SDValue Zero, AllOnes;
10921 SmallVector<SDValue, 16> VMaskOps(Mask.size(), Zero);
10922 SDValue V;
10938 SDValue VMask = DAG.getBuildVector(MaskVT, DL, VMaskOps);
10941 SDValue And = DAG.getNode(ISD::AND, DL, LogicVT, V, VMask);
10950 static SDValue lowerShuffleAsBitBlend(const SDLoc &DL, MVT VT, SDValue V1,
10950 static SDValue lowerShuffleAsBitBlend(const SDLoc &DL, MVT VT, SDValue V1,
10951 SDValue V2, ArrayRef<int> Mask,
10955 SDValue Zero = DAG.getConstant(0, DL, EltVT);
10956 SDValue AllOnes = DAG.getAllOnesConstant(DL, EltVT);
10957 SmallVector<SDValue, 16> MaskOps;
10964 SDValue V1Mask = DAG.getBuildVector(VT, DL, MaskOps);
10970 static SDValue getVectorMaskingNode(SDValue Op, SDValue Mask,
10970 static SDValue getVectorMaskingNode(SDValue Op, SDValue Mask,
10970 static SDValue getVectorMaskingNode(SDValue Op, SDValue Mask,
10971 SDValue PreservedSrc,
10975 static bool matchVectorShuffleAsBlend(SDValue V1, SDValue V2,
10975 static bool matchVectorShuffleAsBlend(SDValue V1, SDValue V2,
11033 static SDValue lowerShuffleAsBlend(const SDLoc &DL, MVT VT, SDValue V1,
11033 static SDValue lowerShuffleAsBlend(const SDLoc &DL, MVT VT, SDValue V1,
11034 SDValue V2, ArrayRef<int> Original,
11087 SDValue Lo = DAG.getNode(X86ISD::BLENDI, DL, MVT::v16i16, V1, V2,
11089 SDValue Hi = DAG.getNode(X86ISD::BLENDI, DL, MVT::v16i16, V1, V2,
11104 if (SDValue Masked = lowerShuffleAsBitMask(DL, VT, V1, V2, Mask, Zeroable,
11111 SDValue MaskNode = DAG.getConstant(BlendMask, DL, IntegerType);
11142 SmallVector<SDValue, 32> VSELECTMask;
11166 if (SDValue Masked = lowerShuffleAsBitMask(DL, VT, V1, V2, Mask, Zeroable,
11175 SDValue MaskNode = DAG.getConstant(BlendMask, DL, IntegerType);
11188 static SDValue lowerShuffleAsBlendAndPermute(const SDLoc &DL, MVT VT,
11189 SDValue V1, SDValue V2,
11189 SDValue V1, SDValue V2,
11218 SDValue V = DAG.getVectorShuffle(VT, DL, V1, V2, BlendMask);
11227 static SDValue lowerShuffleAsUNPCKAndPermute(const SDLoc &DL, MVT VT,
11228 SDValue V1, SDValue V2,
11228 SDValue V1, SDValue V2,
11237 SDValue Ops[2] = {DAG.getUNDEF(VT), DAG.getUNDEF(VT)};
11246 SDValue &Op = Ops[Elt & 1];
11284 SDValue Unpck = DAG.getNode(UnpckOp, DL, VT, Ops);
11290 static SDValue lowerShuffleAsByteRotateAndPermute(
11291 const SDLoc &DL, MVT VT, SDValue V1, SDValue V2, ArrayRef<int> Mask,
11291 const SDLoc &DL, MVT VT, SDValue V1, SDValue V2, ArrayRef<int> Mask,
11347 SDValue Rotate = DAG.getBitcast(
11381 static SDValue lowerShuffleAsDecomposedShuffleBlend(
11382 const SDLoc &DL, MVT VT, SDValue V1, SDValue V2, ArrayRef<int> Mask,
11382 const SDLoc &DL, MVT VT, SDValue V1, SDValue V2, ArrayRef<int> Mask,
11405 if (SDValue BlendPerm = lowerShuffleAsBlendAndPermute(DL, VT, V1, V2, Mask,
11408 if (SDValue UnpackPerm = lowerShuffleAsUNPCKAndPermute(DL, VT, V1, V2, Mask,
11411 if (SDValue RotatePerm = lowerShuffleAsByteRotateAndPermute(
11415 if (SDValue BlendPerm = lowerShuffleAsBlendAndPermute(DL, VT, V1, V2, Mask,
11428 static int matchShuffleAsRotate(SDValue &V1, SDValue &V2, ArrayRef<int> Mask) {
11428 static int matchShuffleAsRotate(SDValue &V1, SDValue &V2, ArrayRef<int> Mask) {
11439 SDValue Lo, Hi;
11465 SDValue MaskV = M < NumElts ? V1 : V2;
11470 SDValue &TargetV = StartIdx < 0 ? Hi : Lo;
11512 static int matchShuffleAsByteRotate(MVT VT, SDValue &V1, SDValue &V2,
11512 static int matchShuffleAsByteRotate(MVT VT, SDValue &V1, SDValue &V2,
11534 static SDValue lowerShuffleAsByteRotate(const SDLoc &DL, MVT VT, SDValue V1,
11534 static SDValue lowerShuffleAsByteRotate(const SDLoc &DL, MVT VT, SDValue V1,
11535 SDValue V2, ArrayRef<int> Mask,
11540 SDValue Lo = V1, Hi = V2;
11571 SDValue LoShift =
11574 SDValue HiShift =
11591 static SDValue lowerShuffleAsRotate(const SDLoc &DL, MVT VT, SDValue V1,
11591 static SDValue lowerShuffleAsRotate(const SDLoc &DL, MVT VT, SDValue V1,
11592 SDValue V2, ArrayRef<int> Mask,
11602 SDValue Lo = V1, Hi = V2;
11612 static SDValue lowerVectorShuffleAsByteShiftMask(
11613 const SDLoc &DL, MVT VT, SDValue V1, SDValue V2, ArrayRef<int> Mask,
11613 const SDLoc &DL, MVT VT, SDValue V1, SDValue V2, ArrayRef<int> Mask,
11636 SDValue Res = Mask[ZeroLo] < (int)NumElts ? V1 : V2;
11759 static SDValue lowerShuffleAsShift(const SDLoc &DL, MVT VT, SDValue V1,
11759 static SDValue lowerShuffleAsShift(const SDLoc &DL, MVT VT, SDValue V1,
11760 SDValue V2, ArrayRef<int> Mask,
11768 SDValue V = V1;
11795 static bool matchShuffleAsEXTRQ(MVT VT, SDValue &V1, SDValue &V2,
11795 static bool matchShuffleAsEXTRQ(MVT VT, SDValue &V1, SDValue &V2,
11816 SDValue Src;
11822 SDValue &V = (M < Size ? V1 : V2);
11851 static bool matchShuffleAsINSERTQ(MVT VT, SDValue &V1, SDValue &V2,
11851 static bool matchShuffleAsINSERTQ(MVT VT, SDValue &V1, SDValue &V2,
11863 SDValue Base;
11879 SDValue Insert;
11917 static SDValue lowerShuffleWithSSE4A(const SDLoc &DL, MVT VT, SDValue V1,
11917 static SDValue lowerShuffleWithSSE4A(const SDLoc &DL, MVT VT, SDValue V1,
11918 SDValue V2, ArrayRef<int> Mask,
11944 static SDValue lowerShuffleAsSpecificZeroOrAnyExtend(
11945 const SDLoc &DL, MVT VT, int Scale, int Offset, bool AnyExt, SDValue InputV,
12025 SDValue Lo = DAG.getBitcast(
12034 SDValue Hi = DAG.getBitcast(
12047 SDValue PSHUFBMask[16];
12083 SDValue Ext = AnyExt ? DAG.getUNDEF(InputVT)
12106 static SDValue lowerShuffleAsZeroOrAnyExtend(
12107 const SDLoc &DL, MVT VT, SDValue V1, SDValue V2, ArrayRef<int> Mask,
12107 const SDLoc &DL, MVT VT, SDValue V1, SDValue V2, ArrayRef<int> Mask,
12121 SDValue InputV;
12141 SDValue V = M < NumElements ? V1 : V2;
12191 if (SDValue V = Lower(NumElements / NumExtElements))
12212 if (SDValue V = CanZExtLowHalf()) {
12225 static SDValue getScalarValueForVectorElement(SDValue V, int Idx,
12225 static SDValue getScalarValueForVectorElement(SDValue V, int Idx,
12241 SDValue S = V.getOperand(Idx);
12253 static bool isShuffleFoldableLoad(SDValue V) {
12262 static SDValue lowerShuffleAsElementInsertion(
12263 const SDLoc &DL, MVT VT, SDValue V1, SDValue V2, ArrayRef<int> Mask,
12263 const SDLoc &DL, MVT VT, SDValue V1, SDValue V2, ArrayRef<int> Mask,
12284 SDValue V2S = getScalarValueForVectorElement(V2, Mask[V2Index] - Mask.size(),
12360 static SDValue lowerShuffleAsTruncBroadcast(const SDLoc &DL, MVT VT, SDValue V0,
12360 static SDValue lowerShuffleAsTruncBroadcast(const SDLoc &DL, MVT VT, SDValue V0,
12395 SDValue Scalar = V0.getOperand(V0BroadcastIdx);
12434 static SDValue lowerShuffleOfExtractsAsVperm(const SDLoc &DL, SDValue N0,
12434 static SDValue lowerShuffleOfExtractsAsVperm(const SDLoc &DL, SDValue N0,
12435 SDValue N1, ArrayRef<int> Mask,
12449 SDValue WideVec = N0.getOperand(0);
12477 SDValue Shuf = DAG.getVectorShuffle(WideVT, DL, WideVec, DAG.getUNDEF(WideVT),
12489 static SDValue lowerShuffleAsBroadcast(const SDLoc &DL, MVT VT, SDValue V1,
12489 static SDValue lowerShuffleAsBroadcast(const SDLoc &DL, MVT VT, SDValue V1,
12490 SDValue V2, ArrayRef<int> Mask,
12526 SDValue V = V1;
12541 SDValue VOuter = V.getOperand(0), VInner = V.getOperand(1);
12574 if (SDValue TruncBroadcast = lowerShuffleAsTruncBroadcast(
12601 SDValue BaseAddr = Ld->getOperand(1);
12605 SDValue NewAddr = DAG.getMemBasePlusOffset(BaseAddr, Offset, DL);
12680 static bool matchShuffleAsInsertPS(SDValue &V1, SDValue &V2,
12680 static bool matchShuffleAsInsertPS(SDValue &V1, SDValue &V2,
12768 static SDValue lowerShuffleAsInsertPS(const SDLoc &DL, SDValue V1, SDValue V2,
12768 static SDValue lowerShuffleAsInsertPS(const SDLoc &DL, SDValue V1, SDValue V2,
12768 static SDValue lowerShuffleAsInsertPS(const SDLoc &DL, SDValue V1, SDValue V2,
12793 static SDValue lowerShuffleAsPermuteAndUnpack(
12794 const SDLoc &DL, MVT VT, SDValue V1, SDValue V2, ArrayRef<int> Mask,
12794 const SDLoc &DL, MVT VT, SDValue V1, SDValue V2, ArrayRef<int> Mask,
12861 if (SDValue Unpack = TryUnpack(ScalarSize, ScalarSize / OrigScalarSize))
12908 static SDValue lowerV2F64Shuffle(const SDLoc &DL, ArrayRef<int> Mask,
12909 const APInt &Zeroable, SDValue V1, SDValue V2,
12909 const APInt &Zeroable, SDValue V1, SDValue V2,
12918 if (SDValue Broadcast = lowerShuffleAsBroadcast(DL, MVT::v2f64, V1, V2,
12945 if (SDValue Extract = lowerShuffleOfExtractsAsVperm(DL, V1, V2, Mask, DAG))
12950 if (SDValue Insertion = lowerShuffleAsElementInsertion(
12957 if (SDValue Insertion = lowerShuffleAsElementInsertion(
12965 if (SDValue V1S = getScalarValueForVectorElement(V1, Mask[0], DAG))
12973 if (SDValue Blend = lowerShuffleAsBlend(DL, MVT::v2f64, V1, V2, Mask,
12978 if (SDValue V = lowerShuffleWithUNPCK(DL, MVT::v2f64, Mask, V1, V2, DAG))
12992 static SDValue lowerV2I64Shuffle(const SDLoc &DL, ArrayRef<int> Mask,
12993 const APInt &Zeroable, SDValue V1, SDValue V2,
12993 const APInt &Zeroable, SDValue V1, SDValue V2,
13002 if (SDValue Broadcast = lowerShuffleAsBroadcast(DL, MVT::v2i64, V1, V2,
13024 if (SDValue Extract = lowerShuffleOfExtractsAsVperm(DL, V1, V2, Mask, DAG))
13028 if (SDValue Shift = lowerShuffleAsShift(DL, MVT::v2i64, V1, V2, Mask,
13034 if (SDValue Insertion = lowerShuffleAsElementInsertion(
13040 if (SDValue Insertion = lowerShuffleAsElementInsertion(
13048 if (SDValue Blend = lowerShuffleAsBlend(DL, MVT::v2i64, V1, V2, Mask,
13053 if (SDValue V = lowerShuffleWithUNPCK(DL, MVT::v2i64, Mask, V1, V2, DAG))
13060 if (SDValue Rotate = lowerShuffleAsRotate(DL, MVT::v2i64, V1, V2, Mask,
13064 if (SDValue Rotate = lowerShuffleAsByteRotate(DL, MVT::v2i64, V1, V2, Mask,
13090 static SDValue lowerShuffleWithSHUFPS(const SDLoc &DL, MVT VT,
13091 ArrayRef<int> Mask, SDValue V1,
13092 SDValue V2, SelectionDAG &DAG) {
13093 SDValue LowV = V1, HighV = V2;
13177 static SDValue lowerV4F32Shuffle(const SDLoc &DL, ArrayRef<int> Mask,
13178 const APInt &Zeroable, SDValue V1, SDValue V2,
13178 const APInt &Zeroable, SDValue V1, SDValue V2,
13189 if (SDValue Broadcast = lowerShuffleAsBroadcast(DL, MVT::v4f32, V1, V2,
13224 if (SDValue Extract = lowerShuffleOfExtractsAsVperm(DL, V1, V2, Mask, DAG))
13233 if (SDValue V = lowerShuffleAsElementInsertion(
13238 if (SDValue Blend = lowerShuffleAsBlend(DL, MVT::v4f32, V1, V2, Mask,
13243 if (SDValue V = lowerShuffleAsInsertPS(DL, V1, V2, Mask, Zeroable, DAG))
13247 if (SDValue BlendPerm = lowerShuffleAsBlendAndPermute(DL, MVT::v4f32, V1,
13262 if (SDValue V = lowerShuffleWithUNPCK(DL, MVT::v4f32, Mask, V1, V2, DAG))
13273 static SDValue lowerV4I32Shuffle(const SDLoc &DL, ArrayRef<int> Mask,
13274 const APInt &Zeroable, SDValue V1, SDValue V2,
13274 const APInt &Zeroable, SDValue V1, SDValue V2,
13284 if (SDValue ZExt = lowerShuffleAsZeroOrAnyExtend(DL, MVT::v4i32, V1, V2, Mask,
13293 if (SDValue Broadcast = lowerShuffleAsBroadcast(DL, MVT::v4i32, V1, V2,
13315 if (SDValue Extract = lowerShuffleOfExtractsAsVperm(DL, V1, V2, Mask, DAG))
13319 if (SDValue Shift = lowerShuffleAsShift(DL, MVT::v4i32, V1, V2, Mask,
13325 if (SDValue V = lowerShuffleAsElementInsertion(
13333 if (SDValue Blend = lowerShuffleAsBlend(DL, MVT::v4i32, V1, V2, Mask,
13337 if (SDValue Masked = lowerShuffleAsBitMask(DL, MVT::v4i32, V1, V2, Mask,
13342 if (SDValue V = lowerShuffleWithUNPCK(DL, MVT::v4i32, Mask, V1, V2, DAG))
13349 if (SDValue Rotate = lowerShuffleAsRotate(DL, MVT::v4i32, V1, V2, Mask,
13353 if (SDValue Rotate = lowerShuffleAsByteRotate(DL, MVT::v4i32, V1, V2, Mask,
13369 if (SDValue Unpack = lowerShuffleAsPermuteAndUnpack(DL, MVT::v4i32, V1, V2,
13379 SDValue CastV1 = DAG.getBitcast(MVT::v4f32, V1);
13380 SDValue CastV2 = DAG.getBitcast(MVT::v4f32, V2);
13381 SDValue ShufPS = DAG.getVectorShuffle(MVT::v4f32, DL, CastV1, CastV2, Mask);
13401 static SDValue lowerV8I16GeneralSingleInputShuffle(
13402 const SDLoc &DL, MVT VT, SDValue V, MutableArrayRef<int> Mask,
13897 static SDValue lowerShuffleAsBlendOfPSHUFBs(
13898 const SDLoc &DL, MVT VT, SDValue V1, SDValue V2, ArrayRef<int> Mask,
13898 const SDLoc &DL, MVT VT, SDValue V1, SDValue V2, ArrayRef<int> Mask,
13907 SmallVector<SDValue, 64> V1Mask(NumBytes, DAG.getUNDEF(MVT::i8));
13908 SmallVector<SDValue, 64> V2Mask(NumBytes, DAG.getUNDEF(MVT::i8));
13938 SDValue V;
13960 static SDValue lowerV8I16Shuffle(const SDLoc &DL, ArrayRef<int> Mask,
13961 const APInt &Zeroable, SDValue V1, SDValue V2,
13961 const APInt &Zeroable, SDValue V1, SDValue V2,
13970 if (SDValue ZExt = lowerShuffleAsZeroOrAnyExtend(DL, MVT::v8i16, V1, V2, Mask,
13978 if (SDValue Shift = lowerShuffleAsShift(DL, MVT::v8i16, V1, V1, Mask,
13983 if (SDValue Broadcast = lowerShuffleAsBroadcast(DL, MVT::v8i16, V1, V2,
13988 if (SDValue V = lowerShuffleWithUNPCK(DL, MVT::v8i16, Mask, V1, V2, DAG))
13992 if (SDValue V = lowerShuffleWithPACK(DL, MVT::v8i16, Mask, V1, V2, DAG,
13997 if (SDValue Rotate = lowerShuffleAsByteRotate(DL, MVT::v8i16, V1, V1, Mask,
14012 if (SDValue Shift = lowerShuffleAsShift(DL, MVT::v8i16, V1, V2, Mask,
14018 if (SDValue V = lowerShuffleWithSSE4A(DL, MVT::v8i16, V1, V2, Mask,
14024 if (SDValue V = lowerShuffleAsElementInsertion(
14032 if (SDValue Blend = lowerShuffleAsBlend(DL, MVT::v8i16, V1, V2, Mask,
14036 if (SDValue Masked = lowerShuffleAsBitMask(DL, MVT::v8i16, V1, V2, Mask,
14041 if (SDValue V = lowerShuffleWithUNPCK(DL, MVT::v8i16, Mask, V1, V2, DAG))
14045 if (SDValue V = lowerShuffleWithPACK(DL, MVT::v8i16, Mask, V1, V2, DAG,
14050 if (SDValue Rotate = lowerShuffleAsByteRotate(DL, MVT::v8i16, V1, V2, Mask,
14054 if (SDValue BitBlend =
14059 if (SDValue V = lowerVectorShuffleAsByteShiftMask(
14064 if (SDValue Unpack = lowerShuffleAsPermuteAndUnpack(DL, MVT::v8i16, V1, V2,
14148 static SDValue lowerShuffleWithPERMV(const SDLoc &DL, MVT VT,
14149 ArrayRef<int> Mask, SDValue V1,
14150 SDValue V2, SelectionDAG &DAG) {
14154 SDValue MaskNode = getConstVector(Mask, MaskVecVT, DAG, DL, true);
14168 static SDValue lowerV16I8Shuffle(const SDLoc &DL, ArrayRef<int> Mask,
14169 const APInt &Zeroable, SDValue V1, SDValue V2,
14169 const APInt &Zeroable, SDValue V1, SDValue V2,
14177 if (SDValue Shift = lowerShuffleAsShift(DL, MVT::v16i8, V1, V2, Mask,
14182 if (SDValue Rotate = lowerShuffleAsByteRotate(DL, MVT::v16i8, V1, V2, Mask,
14187 if (SDValue V = lowerShuffleWithPACK(DL, MVT::v16i8, Mask, V1, V2, DAG,
14192 if (SDValue ZExt = lowerShuffleAsZeroOrAnyExtend(DL, MVT::v16i8, V1, V2, Mask,
14198 if (SDValue V = lowerShuffleWithSSE4A(DL, MVT::v16i8, V1, V2, Mask,
14207 if (SDValue Broadcast = lowerShuffleAsBroadcast(DL, MVT::v16i8, V1, V2,
14211 if (SDValue V = lowerShuffleWithUNPCK(DL, MVT::v16i8, Mask, V1, V2, DAG))
14308 if (SDValue V = tryToWidenViaDuplication())
14312 if (SDValue Masked = lowerShuffleAsBitMask(DL, MVT::v16i8, V1, V2, Mask,
14317 if (SDValue V = lowerShuffleWithUNPCK(DL, MVT::v16i8, Mask, V1, V2, DAG))
14321 if (SDValue V = lowerVectorShuffleAsByteShiftMask(
14342 SDValue PSHUFB = lowerShuffleAsBlendOfPSHUFBs(
14350 if (SDValue Blend = lowerShuffleAsBlend(DL, MVT::v16i8, V1, V2, Mask,
14362 if (SDValue Unpack = lowerShuffleAsPermuteAndUnpack(
14372 if (SDValue V = lowerShuffleAsByteRotateAndPermute(
14382 if (SDValue V = lowerShuffleAsElementInsertion(
14386 if (SDValue Blend = lowerShuffleAsBitBlend(DL, MVT::v16i8, V1, V2, Mask, DAG))
14405 SmallVector<SDValue, 16> ByteClearOps(16, DAG.getConstant(0, DL, MVT::i8));
14408 SDValue ByteClearMask = DAG.getBuildVector(MVT::v16i8, DL, ByteClearOps);
14416 SDValue Result = DAG.getNode(X86ISD::PACKUS, DL, MVT::v16i8, V1, V2);
14433 SDValue V = V1;
14441 SDValue VLoHalf, VHiHalf;
14465 SDValue Zero = getZeroVector(MVT::v16i8, Subtarget, DAG, DL);
14473 SDValue LoV = DAG.getVectorShuffle(MVT::v8i16, DL, VLoHalf, VHiHalf, LoBlendMask);
14474 SDValue HiV = DAG.getVectorShuffle(MVT::v8i16, DL, VLoHalf, VHiHalf, HiBlendMask);
14483 static SDValue lower128BitShuffle(const SDLoc &DL, ArrayRef<int> Mask,
14484 MVT VT, SDValue V1, SDValue V2,
14484 MVT VT, SDValue V1, SDValue V2,
14512 static SDValue splitAndLowerShuffle(const SDLoc &DL, MVT VT, SDValue V1,
14512 static SDValue splitAndLowerShuffle(const SDLoc &DL, MVT VT, SDValue V1,
14513 SDValue V2, ArrayRef<int> Mask,
14539 SDValue LoV, HiV;
14549 SmallVector<SDValue, 16> LoOps, HiOps;
14561 SDValue LoV1, HiV1, LoV2, HiV2;
14602 SDValue V1Blend, V2Blend;
14625 SDValue Lo = HalfBlend(LoMask);
14626 SDValue Hi = HalfBlend(HiMask);
14638 static SDValue lowerShuffleAsSplitOrBlend(const SDLoc &DL, MVT VT, SDValue V1,
14638 static SDValue lowerShuffleAsSplitOrBlend(const SDLoc &DL, MVT VT, SDValue V1,
14639 SDValue V2, ArrayRef<int> Mask,
14697 static SDValue lowerShuffleAsLanePermuteAndPermute(
14698 const SDLoc &DL, MVT VT, SDValue V1, SDValue V2, ArrayRef<int> Mask,
14698 const SDLoc &DL, MVT VT, SDValue V1, SDValue V2, ArrayRef<int> Mask,
14748 SDValue LanePermute = DAG.getVectorShuffle(VT, DL, V1, V2, LaneMask);
14759 static SDValue lowerShuffleAsLanePermuteAndShuffle(
14760 const SDLoc &DL, MVT VT, SDValue V1, SDValue V2, ArrayRef<int> Mask,
14760 const SDLoc &DL, MVT VT, SDValue V1, SDValue V2, ArrayRef<int> Mask,
14803 SDValue Flipped = DAG.getBitcast(PVT, V1);
14811 static SDValue lowerV2X128Shuffle(const SDLoc &DL, MVT VT, SDValue V1,
14811 static SDValue lowerV2X128Shuffle(const SDLoc &DL, MVT VT, SDValue V1,
14812 SDValue V2, ArrayRef<int> Mask,
14830 SDValue LoV = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, SubVT, V1,
14842 if (SDValue Blend = lowerShuffleAsBlend(DL, VT, V1, V2, Mask, Zeroable,
14858 SDValue SubVec = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, SubVT,
14914 static SDValue lowerShuffleAsLanePermuteAndRepeatedMask(
14915 const SDLoc &DL, MVT VT, SDValue V1, SDValue V2, ArrayRef<int> Mask,
14915 const SDLoc &DL, MVT VT, SDValue V1, SDValue V2, ArrayRef<int> Mask,
15041 SDValue NewV1 = DAG.getVectorShuffle(VT, DL, V1, V2, NewMask);
15058 SDValue NewV2 = DAG.getVectorShuffle(VT, DL, V1, V2, NewMask);
15134 static SDValue getShuffleHalfVectors(const SDLoc &DL, SDValue V1, SDValue V2,
15134 static SDValue getShuffleHalfVectors(const SDLoc &DL, SDValue V1, SDValue V2,
15134 static SDValue getShuffleHalfVectors(const SDLoc &DL, SDValue V1, SDValue V2,
15148 SDValue V = (HalfIdx < 2 ? V1 : V2);
15155 SDValue Half1 = getHalfVector(HalfIdx1);
15156 SDValue Half2 = getHalfVector(HalfIdx2);
15157 SDValue V = DAG.getVectorShuffle(HalfVT, DL, Half1, Half2, HalfMask);
15159 SDValue Op0 = V;
15160 SDValue Op1 = DAG.getUNDEF(HalfVT);
15174 static SDValue lowerShuffleWithUndefHalf(const SDLoc &DL, MVT VT, SDValue V1,
15174 static SDValue lowerShuffleWithUndefHalf(const SDLoc &DL, MVT VT, SDValue V1,
15175 SDValue V2, ArrayRef<int> Mask,
15194 SDValue Hi = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, HalfVT, V1,
15204 SDValue Hi = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, HalfVT, V1,
15300 static SDValue lowerShuffleAsRepeatedMaskAndLanePermute(
15301 const SDLoc &DL, MVT VT, SDValue V1, SDValue V2, ArrayRef<int> Mask,
15301 const SDLoc &DL, MVT VT, SDValue V1, SDValue V2, ArrayRef<int> Mask,
15339 SDValue RepeatShuf = DAG.getVectorShuffle(VT, DL, V1, V2, RepeatMask);
15450 SDValue RepeatedShuffle = DAG.getVectorShuffle(VT, DL, V1, V2, RepeatedMask);
15466 static bool matchShuffleWithSHUFPD(MVT VT, SDValue &V1, SDValue &V2,
15466 static bool matchShuffleWithSHUFPD(MVT VT, SDValue &V1, SDValue &V2,
15511 static SDValue lowerShuffleWithSHUFPD(const SDLoc &DL, MVT VT, SDValue V1,
15511 static SDValue lowerShuffleWithSHUFPD(const SDLoc &DL, MVT VT, SDValue V1,
15512 SDValue V2, ArrayRef<int> Mask,
15538 static SDValue lowerShuffleAsVTRUNCAndUnpack(const SDLoc &DL, MVT VT,
15539 SDValue V1, SDValue V2,
15539 SDValue V1, SDValue V2,
15561 SDValue Unpack = DAG.getVectorShuffle(MVT::v16i8, DL, V1, V2,
15575 static SDValue lowerV4F64Shuffle(const SDLoc &DL, ArrayRef<int> Mask,
15576 const APInt &Zeroable, SDValue V1, SDValue V2,
15576 const APInt &Zeroable, SDValue V1, SDValue V2,
15583 if (SDValue V = lowerV2X128Shuffle(DL, MVT::v4f64, V1, V2, Mask, Zeroable,
15589 if (SDValue Broadcast = lowerShuffleAsBroadcast(DL, MVT::v4f64, V1, V2,
15613 if (SDValue V = lowerShuffleAsRepeatedMaskAndLanePermute(
15618 if (SDValue V = lowerShuffleAsLanePermuteAndPermute(DL, MVT::v4f64, V1, V2,
15628 if (SDValue V = lowerShuffleWithUNPCK(DL, MVT::v4f64, Mask, V1, V2, DAG))
15631 if (SDValue Blend = lowerShuffleAsBlend(DL, MVT::v4f64, V1, V2, Mask,
15636 if (SDValue Op = lowerShuffleWithSHUFPD(DL, MVT::v4f64, V1, V2, Mask,
15648 if (SDValue V = lowerShuffleAsRepeatedMaskAndLanePermute(
15658 if (SDValue V = lowerShuffleAsLanePermuteAndRepeatedMask(
15664 if (SDValue V = lowerShuffleToEXPAND(DL, MVT::v4f64, Zeroable, Mask, V1, V2,
15683 static SDValue lowerV4I64Shuffle(const SDLoc &DL, ArrayRef<int> Mask,
15684 const APInt &Zeroable, SDValue V1, SDValue V2,
15684 const APInt &Zeroable, SDValue V1, SDValue V2,
15692 if (SDValue V = lowerV2X128Shuffle(DL, MVT::v4i64, V1, V2, Mask, Zeroable,
15696 if (SDValue Blend = lowerShuffleAsBlend(DL, MVT::v4i64, V1, V2, Mask,
15701 if (SDValue Broadcast = lowerShuffleAsBroadcast(DL, MVT::v4i64, V1, V2, Mask,
15726 if (SDValue Shift = lowerShuffleAsShift(DL, MVT::v4i64, V1, V2, Mask,
15732 if (SDValue Rotate = lowerShuffleAsRotate(DL, MVT::v4i64, V1, V2, Mask,
15736 if (SDValue V = lowerShuffleToEXPAND(DL, MVT::v4i64, Zeroable, Mask, V1, V2,
15742 if (SDValue Rotate = lowerShuffleAsByteRotate(DL, MVT::v4i64, V1, V2, Mask,
15747 if (SDValue V = lowerShuffleWithUNPCK(DL, MVT::v4i64, Mask, V1, V2, DAG))
15758 if (SDValue V = lowerShuffleAsRepeatedMaskAndLanePermute(
15768 if (SDValue Result = lowerShuffleAsLanePermuteAndRepeatedMask(
15781 static SDValue lowerV8F32Shuffle(const SDLoc &DL, ArrayRef<int> Mask,
15782 const APInt &Zeroable, SDValue V1, SDValue V2,
15782 const APInt &Zeroable, SDValue V1, SDValue V2,
15789 if (SDValue Blend = lowerShuffleAsBlend(DL, MVT::v8f32, V1, V2, Mask,
15794 if (SDValue Broadcast = lowerShuffleAsBroadcast(DL, MVT::v8f32, V1, V2, Mask,
15816 if (SDValue V = lowerShuffleWithUNPCK(DL, MVT::v8f32, Mask, V1, V2, DAG))
15826 if (SDValue V = lowerShuffleAsRepeatedMaskAndLanePermute(
15833 SDValue VPermMask = getConstVector(Mask, MVT::v8i32, DAG, DL, true);
15847 if (SDValue Result = lowerShuffleAsLanePermuteAndRepeatedMask(
15853 if (SDValue V = lowerShuffleToEXPAND(DL, MVT::v8f32, Zeroable, Mask, V1, V2,
15861 if (SDValue V = lowerShuffleAsSplitOrBlend(DL, MVT::v8f32, V1, V2, Mask,
15880 static SDValue lowerV8I32Shuffle(const SDLoc &DL, ArrayRef<int> Mask,
15881 const APInt &Zeroable, SDValue V1, SDValue V2,
15881 const APInt &Zeroable, SDValue V1, SDValue V2,
15892 if (SDValue ZExt = lowerShuffleAsZeroOrAnyExtend(DL, MVT::v8i32, V1, V2, Mask,
15901 if (SDValue V = lowerShuffleAsSplitOrBlend(DL, MVT::v8i32, V1, V2, Mask,
15905 if (SDValue Blend = lowerShuffleAsBlend(DL, MVT::v8i32, V1, V2, Mask,
15910 if (SDValue Broadcast = lowerShuffleAsBroadcast(DL, MVT::v8i32, V1, V2, Mask,
15927 if (SDValue V = lowerShuffleWithUNPCK(DL, MVT::v8i32, Mask, V1, V2, DAG))
15932 if (SDValue Shift = lowerShuffleAsShift(DL, MVT::v8i32, V1, V2, Mask,
15938 if (SDValue Rotate = lowerShuffleAsRotate(DL, MVT::v8i32, V1, V2, Mask,
15942 if (SDValue V = lowerShuffleToEXPAND(DL, MVT::v8i32, Zeroable, Mask, V1, V2,
15948 if (SDValue Rotate = lowerShuffleAsByteRotate(DL, MVT::v8i32, V1, V2, Mask,
15954 if (SDValue V = lowerShuffleAsRepeatedMaskAndLanePermute(
15961 SDValue VPermMask = getConstVector(Mask, MVT::v8i32, DAG, DL, true);
15969 SDValue CastV1 = DAG.getBitcast(MVT::v8f32, V1);
15970 SDValue CastV2 = DAG.getBitcast(MVT::v8f32, V2);
15971 SDValue ShufPS = lowerShuffleWithSHUFPS(DL, MVT::v8f32, RepeatedMask,
15978 if (SDValue Result = lowerShuffleAsLanePermuteAndRepeatedMask(
15991 static SDValue lowerV16I16Shuffle(const SDLoc &DL, ArrayRef<int> Mask,
15992 const APInt &Zeroable, SDValue V1, SDValue V2,
15992 const APInt &Zeroable, SDValue V1, SDValue V2,
16003 if (SDValue ZExt = lowerShuffleAsZeroOrAnyExtend(
16008 if (SDValue Broadcast = lowerShuffleAsBroadcast(DL, MVT::v16i16, V1, V2, Mask,
16012 if (SDValue Blend = lowerShuffleAsBlend(DL, MVT::v16i16, V1, V2, Mask,
16017 if (SDValue V = lowerShuffleWithUNPCK(DL, MVT::v16i16, Mask, V1, V2, DAG))
16021 if (SDValue V = lowerShuffleWithPACK(DL, MVT::v16i16, Mask, V1, V2, DAG,
16026 if (SDValue Shift = lowerShuffleAsShift(DL, MVT::v16i16, V1, V2, Mask,
16031 if (SDValue Rotate = lowerShuffleAsByteRotate(DL, MVT::v16i16, V1, V2, Mask,
16037 if (SDValue V = lowerShuffleAsRepeatedMaskAndLanePermute(
16045 if (SDValue V = lowerShuffleAsLanePermuteAndPermute(
16063 if (SDValue PSHUFB = lowerShuffleWithPSHUFB(DL, MVT::v16i16, Mask, V1, V2,
16073 if (SDValue Result = lowerShuffleAsLanePermuteAndRepeatedMask(
16078 if (SDValue V = lowerShuffleAsLanePermuteAndPermute(
16091 static SDValue lowerV32I8Shuffle(const SDLoc &DL, ArrayRef<int> Mask,
16092 const APInt &Zeroable, SDValue V1, SDValue V2,
16092 const APInt &Zeroable, SDValue V1, SDValue V2,
16103 if (SDValue ZExt = lowerShuffleAsZeroOrAnyExtend(DL, MVT::v32i8, V1, V2, Mask,
16108 if (SDValue Broadcast = lowerShuffleAsBroadcast(DL, MVT::v32i8, V1, V2, Mask,
16112 if (SDValue Blend = lowerShuffleAsBlend(DL, MVT::v32i8, V1, V2, Mask,
16117 if (SDValue V = lowerShuffleWithUNPCK(DL, MVT::v32i8, Mask, V1, V2, DAG))
16121 if (SDValue V = lowerShuffleWithPACK(DL, MVT::v32i8, Mask, V1, V2, DAG,
16126 if (SDValue Shift = lowerShuffleAsShift(DL, MVT::v32i8, V1, V2, Mask,
16131 if (SDValue Rotate = lowerShuffleAsByteRotate(DL, MVT::v32i8, V1, V2, Mask,
16137 if (SDValue V = lowerShuffleAsRepeatedMaskAndLanePermute(
16144 if (SDValue V = lowerShuffleAsLanePermuteAndPermute(
16152 if (SDValue PSHUFB = lowerShuffleWithPSHUFB(DL, MVT::v32i8, Mask, V1, V2,
16162 if (SDValue Result = lowerShuffleAsLanePermuteAndRepeatedMask(
16167 if (SDValue V = lowerShuffleAsLanePermuteAndPermute(
16175 if (SDValue V = lowerShuffleAsVTRUNCAndUnpack(DL, MVT::v32i8, V1, V2,
16189 static SDValue lower256BitShuffle(const SDLoc &DL, ArrayRef<int> Mask, MVT VT,
16190 SDValue V1, SDValue V2, const APInt &Zeroable,
16190 SDValue V1, SDValue V2, const APInt &Zeroable,
16199 if (SDValue Insertion = lowerShuffleAsElementInsertion(
16204 if (SDValue V =
16219 if (SDValue V = lowerShuffleAsBitMask(DL, VT, V1, V2, Mask, Zeroable,
16222 if (SDValue V = lowerShuffleAsBitBlend(DL, VT, V1, V2, Mask, DAG))
16254 static SDValue lowerV4X128Shuffle(const SDLoc &DL, MVT VT, ArrayRef<int> Mask,
16255 const APInt &Zeroable, SDValue V1, SDValue V2,
16255 const APInt &Zeroable, SDValue V1, SDValue V2,
16275 SDValue LoV = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, SubVT, V1,
16289 SDValue SubVec = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, SubVT,
16323 SDValue Subvec = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, SubVT, V2,
16329 SDValue Ops[2] = {DAG.getUNDEF(VT), DAG.getUNDEF(VT)};
16337 SDValue Op = WidenedMask[i] >= 4 ? V2 : V1;
16354 static SDValue lowerV8F64Shuffle(const SDLoc &DL, ArrayRef<int> Mask,
16355 const APInt &Zeroable, SDValue V1, SDValue V2,
16355 const APInt &Zeroable, SDValue V1, SDValue V2,
16384 if (SDValue Shuf128 = lowerV4X128Shuffle(DL, MVT::v8f64, Mask, Zeroable, V1,
16388 if (SDValue Unpck = lowerShuffleWithUNPCK(DL, MVT::v8f64, Mask, V1, V2, DAG))
16392 if (SDValue Op = lowerShuffleWithSHUFPD(DL, MVT::v8f64, V1, V2, Mask,
16396 if (SDValue V = lowerShuffleToEXPAND(DL, MVT::v8f64, Zeroable, Mask, V1, V2,
16400 if (SDValue Blend = lowerShuffleAsBlend(DL, MVT::v8f64, V1, V2, Mask,
16408 static SDValue lowerV16F32Shuffle(const SDLoc &DL, ArrayRef<int> Mask,
16409 const APInt &Zeroable, SDValue V1, SDValue V2,
16409 const APInt &Zeroable, SDValue V1, SDValue V2,
16433 if (SDValue V = lowerShuffleWithUNPCK(DL, MVT::v16f32, Mask, V1, V2, DAG))
16436 if (SDValue Blend = lowerShuffleAsBlend(DL, MVT::v16f32, V1, V2, Mask,
16448 SDValue VPermMask = getConstVector(Mask, MVT::v16i32, DAG, DL, true);
16453 if (SDValue V = lowerShuffleToEXPAND(DL, MVT::v16f32, Zeroable, Mask,
16461 static SDValue lowerV8I64Shuffle(const SDLoc &DL, ArrayRef<int> Mask,
16462 const APInt &Zeroable, SDValue V1, SDValue V2,
16462 const APInt &Zeroable, SDValue V1, SDValue V2,
16490 if (SDValue Shuf128 = lowerV4X128Shuffle(DL, MVT::v8i64, Mask, Zeroable, V1,
16495 if (SDValue Shift = lowerShuffleAsShift(DL, MVT::v8i64, V1, V2, Mask,
16500 if (SDValue Rotate = lowerShuffleAsRotate(DL, MVT::v8i64, V1, V2, Mask,
16505 if (SDValue Rotate = lowerShuffleAsByteRotate(DL, MVT::v8i64, V1, V2, Mask,
16509 if (SDValue Unpck = lowerShuffleWithUNPCK(DL, MVT::v8i64, Mask, V1, V2, DAG))
16512 if (SDValue V = lowerShuffleToEXPAND(DL, MVT::v8i64, Zeroable, Mask, V1, V2,
16516 if (SDValue Blend = lowerShuffleAsBlend(DL, MVT::v8i64, V1, V2, Mask,
16524 static SDValue lowerV16I32Shuffle(const SDLoc &DL, ArrayRef<int> Mask,
16525 const APInt &Zeroable, SDValue V1, SDValue V2,
16525 const APInt &Zeroable, SDValue V1, SDValue V2,
16535 if (SDValue ZExt = lowerShuffleAsZeroOrAnyExtend(
16552 if (SDValue V = lowerShuffleWithUNPCK(DL, MVT::v16i32, Mask, V1, V2, DAG))
16557 if (SDValue Shift = lowerShuffleAsShift(DL, MVT::v16i32, V1, V2, Mask,
16562 if (SDValue Rotate = lowerShuffleAsRotate(DL, MVT::v16i32, V1, V2, Mask,
16568 if (SDValue Rotate = lowerShuffleAsByteRotate(DL, MVT::v16i32, V1, V2, Mask,
16575 SDValue CastV1 = DAG.getBitcast(MVT::v16f32, V1);
16576 SDValue CastV2 = DAG.getBitcast(MVT::v16f32, V2);
16577 SDValue ShufPS = lowerShuffleWithSHUFPS(DL, MVT::v16f32, RepeatedMask,
16582 if (SDValue V = lowerShuffleToEXPAND(DL, MVT::v16i32, Zeroable, Mask, V1, V2,
16586 if (SDValue Blend = lowerShuffleAsBlend(DL, MVT::v16i32, V1, V2, Mask,
16593 static SDValue lowerV32I16Shuffle(const SDLoc &DL, ArrayRef<int> Mask,
16594 const APInt &Zeroable, SDValue V1, SDValue V2,
16594 const APInt &Zeroable, SDValue V1, SDValue V2,
16605 if (SDValue ZExt = lowerShuffleAsZeroOrAnyExtend(
16610 if (SDValue V = lowerShuffleWithUNPCK(DL, MVT::v32i16, Mask, V1, V2, DAG))
16614 if (SDValue Shift = lowerShuffleAsShift(DL, MVT::v32i16, V1, V2, Mask,
16619 if (SDValue Rotate = lowerShuffleAsByteRotate(DL, MVT::v32i16, V1, V2, Mask,
16634 if (SDValue Blend = lowerShuffleAsBlend(DL, MVT::v32i16, V1, V2, Mask,
16638 if (SDValue PSHUFB = lowerShuffleWithPSHUFB(DL, MVT::v32i16, Mask, V1, V2,
16646 static SDValue lowerV64I8Shuffle(const SDLoc &DL, ArrayRef<int> Mask,
16647 const APInt &Zeroable, SDValue V1, SDValue V2,
16647 const APInt &Zeroable, SDValue V1, SDValue V2,
16658 if (SDValue ZExt = lowerShuffleAsZeroOrAnyExtend(
16663 if (SDValue V = lowerShuffleWithUNPCK(DL, MVT::v64i8, Mask, V1, V2, DAG))
16667 if (SDValue V = lowerShuffleWithPACK(DL, MVT::v64i8, Mask, V1, V2, DAG,
16672 if (SDValue Shift = lowerShuffleAsShift(DL, MVT::v64i8, V1, V2, Mask,
16677 if (SDValue Rotate = lowerShuffleAsByteRotate(DL, MVT::v64i8, V1, V2, Mask,
16681 if (SDValue PSHUFB = lowerShuffleWithPSHUFB(DL, MVT::v64i8, Mask, V1, V2,
16691 if (SDValue V = lowerShuffleAsRepeatedMaskAndLanePermute(
16695 if (SDValue Blend = lowerShuffleAsBlend(DL, MVT::v64i8, V1, V2, Mask,
16702 if (SDValue Result = lowerShuffleAsLanePermuteAndRepeatedMask(
16715 static SDValue lower512BitShuffle(const SDLoc &DL, ArrayRef<int> Mask,
16716 MVT VT, SDValue V1, SDValue V2,
16716 MVT VT, SDValue V1, SDValue V2,
16729 if (SDValue Insertion = lowerShuffleAsElementInsertion(
16734 if (SDValue V =
16739 if (SDValue Broadcast = lowerShuffleAsBroadcast(DL, VT, V1, V2, Mask,
16766 static SDValue lower1BitShuffleAsKSHIFTR(const SDLoc &DL, ArrayRef<int> Mask,
16767 MVT VT, SDValue V1, SDValue V2,
16767 MVT VT, SDValue V1, SDValue V2,
16800 SDValue Res = DAG.getNode(ISD::INSERT_SUBVECTOR, DL, WideVT,
16846 static SDValue lower1BitShuffle(const SDLoc &DL, ArrayRef<int> Mask,
16847 MVT VT, SDValue V1, SDValue V2,
16847 MVT VT, SDValue V1, SDValue V2,
16881 SDValue Extract = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, ExtractVT,
16890 if (SDValue Shift = lower1BitShuffleAsKSHIFTR(DL, Mask, VT, V1, V2, Subtarget,
16896 for (SDValue V : { V1, V2 }) {
16903 SDValue Res = DAG.getNode(ISD::INSERT_SUBVECTOR, DL, WideVT,
16960 SDValue Shuffle = DAG.getVectorShuffle(ExtVT, DL, V1, V2, Mask);
17042 static SDValue lowerVectorShuffle(SDValue Op, const X86Subtarget &Subtarget,
17042 static SDValue lowerVectorShuffle(SDValue Op, const X86Subtarget &Subtarget,
17046 SDValue V1 = Op.getOperand(0);
17047 SDValue V2 = Op.getOperand(1);
17116 if (SDValue Broadcast = lowerShuffleAsBroadcast(DL, VT, V1, V2, OrigMask,
17158 if (SDValue V = lowerShuffleWithVPMOV(DL, Mask, VT, V1, V2, DAG, Subtarget))
17178 static SDValue lowerVSELECTtoVectorShuffle(SDValue Op,
17178 static SDValue lowerVSELECTtoVectorShuffle(SDValue Op,
17181 SDValue Cond = Op.getOperand(0);
17182 SDValue LHS = Op.getOperand(1);
17183 SDValue RHS = Op.getOperand(2);
17195 SDValue X86TargetLowering::LowerVSELECT(SDValue Op, SelectionDAG &DAG) const {
17195 SDValue X86TargetLowering::LowerVSELECT(SDValue Op, SelectionDAG &DAG) const {
17196 SDValue Cond = Op.getOperand(0);
17197 SDValue LHS = Op.getOperand(1);
17198 SDValue RHS = Op.getOperand(2);
17209 if (SDValue BlendOp = lowerVSELECTtoVectorShuffle(Op, Subtarget, DAG))
17234 SDValue Mask = DAG.getSetCC(dl, MaskVT, Cond,
17275 SDValue Select = DAG.getNode(ISD::VSELECT, dl, CastVT, Cond, LHS, RHS);
17281 static SDValue LowerEXTRACT_VECTOR_ELT_SSE4(SDValue Op, SelectionDAG &DAG) {
17281 static SDValue LowerEXTRACT_VECTOR_ELT_SSE4(SDValue Op, SelectionDAG &DAG) {
17289 SDValue Extract = DAG.getNode(X86ISD::PEXTRB, dl, MVT::i32,
17308 SDValue Extract = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, MVT::i32,
17325 static SDValue ExtractBitFromMaskVector(SDValue Op, SelectionDAG &DAG,
17325 static SDValue ExtractBitFromMaskVector(SDValue Op, SelectionDAG &DAG,
17327 SDValue Vec = Op.getOperand(0);
17330 SDValue Idx = Op.getOperand(1);
17344 SDValue Ext = DAG.getNode(ISD::SIGN_EXTEND, dl, ExtVecVT, Vec);
17345 SDValue Elt = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, ExtEltVT, Ext, Idx);
17371 SDValue
17372 X86TargetLowering::LowerEXTRACT_VECTOR_ELT(SDValue Op,
17375 SDValue Vec = Op.getOperand(0);
17377 SDValue Idx = Op.getOperand(1);
17449 SDValue Extract = DAG.getNode(X86ISD::PEXTRW, dl, MVT::i32,
17455 if (SDValue Res = LowerEXTRACT_VECTOR_ELT_SSE4(Op, DAG))
17465 SDValue Res = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, MVT::i32,
17476 SDValue Res = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, MVT::i16,
17518 static SDValue InsertBitToMaskVector(SDValue Op, SelectionDAG &DAG,
17518 static SDValue InsertBitToMaskVector(SDValue Op, SelectionDAG &DAG,
17521 SDValue Vec = Op.getOperand(0);
17522 SDValue Elt = Op.getOperand(1);
17523 SDValue Idx = Op.getOperand(2);
17532 SDValue ExtOp = DAG.getNode(ISD::INSERT_VECTOR_ELT, dl, ExtVecVT,
17539 SDValue EltInVec = DAG.getNode(ISD::SCALAR_TO_VECTOR, dl, MVT::v1i1, Elt);
17545 SDValue X86TargetLowering::LowerINSERT_VECTOR_ELT(SDValue Op,
17545 SDValue X86TargetLowering::LowerINSERT_VECTOR_ELT(SDValue Op,
17555 SDValue N0 = Op.getOperand(0);
17556 SDValue N1 = Op.getOperand(1);
17557 SDValue N2 = Op.getOperand(2);
17575 SDValue CstVector = IsZeroElt ? getZeroVector(VT, Subtarget, DAG, dl)
17591 SDValue N1Vec = DAG.getNode(ISD::SCALAR_TO_VECTOR, dl, VT, N1);
17598 SDValue V = extract128BitVector(N0, IdxVal, DAG, dl);
17680 static SDValue LowerSCALAR_TO_VECTOR(SDValue Op, const X86Subtarget &Subtarget,
17680 static SDValue LowerSCALAR_TO_VECTOR(SDValue Op, const X86Subtarget &Subtarget,
17710 SDValue AnyExt = DAG.getNode(ISD::ANY_EXTEND, dl, MVT::i32, Op.getOperand(0));
17718 static SDValue LowerINSERT_SUBVECTOR(SDValue Op, const X86Subtarget &Subtarget,
17718 static SDValue LowerINSERT_SUBVECTOR(SDValue Op, const X86Subtarget &Subtarget,
17725 static SDValue LowerEXTRACT_SUBVECTOR(SDValue Op, const X86Subtarget &Subtarget,
17725 static SDValue LowerEXTRACT_SUBVECTOR(SDValue Op, const X86Subtarget &Subtarget,
17731 SDValue Vec = Op.getOperand(0);
17732 SDValue Idx = Op.getOperand(1);
17786 SDValue
17787 X86TargetLowering::LowerConstantPool(SDValue Op, SelectionDAG &DAG) const {
17795 SDValue Result = DAG.getTargetConstantPool(
17809 SDValue X86TargetLowering::LowerJumpTable(SDValue Op, SelectionDAG &DAG) const {
17809 SDValue X86TargetLowering::LowerJumpTable(SDValue Op, SelectionDAG &DAG) const {
17817 SDValue Result = DAG.getTargetJumpTable(JT->getIndex(), PtrVT, OpFlag);
17830 SDValue X86TargetLowering::LowerExternalSymbol(SDValue Op,
17830 SDValue X86TargetLowering::LowerExternalSymbol(SDValue Op,
17835 SDValue
17836 X86TargetLowering::LowerBlockAddress(SDValue Op, SelectionDAG &DAG) const {
17844 SDValue Result = DAG.getTargetBlockAddress(BA, PtrVT, Offset, OpFlags);
17858 SDValue X86TargetLowering::LowerGlobalOrExternal(SDValue Op, SelectionDAG &DAG,
17858 SDValue X86TargetLowering::LowerGlobalOrExternal(SDValue Op, SelectionDAG &DAG,
17885 SDValue Result;
17929 SDValue
17930 X86TargetLowering::LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const {
17934 static SDValue
17935 GetTLSADDR(SelectionDAG &DAG, SDValue Chain, GlobalAddressSDNode *GA,
17936 SDValue *InFlag, const EVT PtrVT, unsigned ReturnReg,
17941 SDValue TGA = DAG.getTargetGlobalAddress(GA->getGlobal(), dl,
17950 SDValue Ops[] = { Chain, TGA, *InFlag };
17953 SDValue Ops[] = { Chain, TGA };
17961 SDValue Flag = Chain.getValue(1);
17966 static SDValue
17969 SDValue InFlag;
17971 SDValue Chain = DAG.getCopyToReg(DAG.getEntryNode(), dl, X86::EBX,
17980 static SDValue
17987 static SDValue LowerToTLSLocalDynamicModel(GlobalAddressSDNode *GA,
17998 SDValue Base;
18003 SDValue InFlag;
18004 SDValue Chain = DAG.getCopyToReg(DAG.getEntryNode(), dl, X86::EBX,
18017 SDValue TGA = DAG.getTargetGlobalAddress(GA->getGlobal(), dl,
18020 SDValue Offset = DAG.getNode(WrapperKind, dl, PtrVT, TGA);
18027 static SDValue LowerToTLSExecModel(GlobalAddressSDNode *GA, SelectionDAG &DAG,
18036 SDValue ThreadPointer =
18060 SDValue TGA =
18063 SDValue Offset = DAG.getNode(WrapperKind, dl, PtrVT, TGA);
18081 SDValue
18082 X86TargetLowering::LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const {
18125 SDValue Result = DAG.getTargetGlobalAddress(GA->getGlobal(), DL,
18128 SDValue Offset = DAG.getNode(WrapperKind, DL, PtrVT, Result);
18138 SDValue Chain = DAG.getEntryNode();
18141 SDValue Args[] = { Chain, Offset };
18170 SDValue Chain = DAG.getEntryNode();
18181 SDValue TlsArray = Subtarget.is64Bit()
18187 SDValue ThreadPointer =
18190 SDValue res;
18195 SDValue IDX = DAG.getExternalSymbol("_tls_index", PtrVT);
18203 SDValue Scale =
18213 SDValue TGA = DAG.getTargetGlobalAddress(GA->getGlobal(), dl,
18216 SDValue Offset = DAG.getNode(X86ISD::Wrapper, dl, PtrVT, TGA);
18229 static SDValue LowerShiftParts(SDValue Op, SelectionDAG &DAG) {
18229 static SDValue LowerShiftParts(SDValue Op, SelectionDAG &DAG) {
18235 SDValue ShOpLo = Op.getOperand(0);
18236 SDValue ShOpHi = Op.getOperand(1);
18237 SDValue ShAmt = Op.getOperand(2);
18241 SDValue SafeShAmt = DAG.getNode(ISD::AND, dl, MVT::i8, ShAmt,
18243 SDValue Tmp1 = isSRA ? DAG.getNode(ISD::SRA, dl, VT, ShOpHi,
18247 SDValue Tmp2, Tmp3;
18259 SDValue AndNode = DAG.getNode(ISD::AND, dl, MVT::i8, ShAmt,
18261 SDValue Cond = DAG.getSetCC(dl, MVT::i8, AndNode,
18264 SDValue Hi, Lo;
18276 static SDValue LowerFunnelShift(SDValue Op, const X86Subtarget &Subtarget,
18276 static SDValue LowerFunnelShift(SDValue Op, const X86Subtarget &Subtarget,
18283 SDValue Op0 = Op.getOperand(0);
18284 SDValue Op1 = Op.getOperand(1);
18285 SDValue Amt = Op.getOperand(2);
18328 static SDValue LowerI64IntToFP_AVX512DQ(SDValue Op, SelectionDAG &DAG,
18328 static SDValue LowerI64IntToFP_AVX512DQ(SDValue Op, SelectionDAG &DAG,
18332 SDValue Src = Op.getOperand(0);
18348 SDValue InVec = DAG.getNode(ISD::SCALAR_TO_VECTOR, dl, VecInVT, Src);
18349 SDValue CvtVec = DAG.getNode(Op.getOpcode(), dl, VecVT, InVec);
18379 static SDValue vectorizeExtractedCast(SDValue Cast, SelectionDAG &DAG,
18379 static SDValue vectorizeExtractedCast(SDValue Cast, SelectionDAG &DAG,
18383 SDValue Extract = Cast.getOperand(0);
18390 SDValue VecOp = Extract.getOperand(0);
18413 SDValue VCast = DAG.getNode(Cast.getOpcode(), DL, ToVT, VecOp);
18418 SDValue X86TargetLowering::LowerSINT_TO_FP(SDValue Op,
18418 SDValue X86TargetLowering::LowerSINT_TO_FP(SDValue Op,
18420 SDValue Src = Op.getOperand(0);
18428 if (SDValue Extract = vectorizeExtractedCast(Op, DAG, Subtarget))
18450 if (SDValue V = LowerI64IntToFP_AVX512DQ(Op, DAG, Subtarget))
18453 SDValue ValueToStore = Op.getOperand(0);
18465 SDValue StackSlot = DAG.getFrameIndex(SSFI, PtrVT);
18466 SDValue Chain = DAG.getStore(
18472 SDValue X86TargetLowering::BuildFILD(SDValue Op, EVT SrcVT, SDValue Chain,
18472 SDValue X86TargetLowering::BuildFILD(SDValue Op, EVT SrcVT, SDValue Chain,
18472 SDValue X86TargetLowering::BuildFILD(SDValue Op, EVT SrcVT, SDValue Chain,
18473 SDValue StackSlot,
18497 SDValue FILDOps[] = {Chain, StackSlot};
18498 SDValue Result =
18504 SDValue InFlag = Result.getValue(2);
18513 SDValue StackSlot = DAG.getFrameIndex(SSFI, PtrVT);
18515 SDValue FSTOps[] = {Chain, Result, StackSlot, InFlag};
18541 static SDValue LowerUINT_TO_FP_i64(SDValue Op, SelectionDAG &DAG,
18541 static SDValue LowerUINT_TO_FP_i64(SDValue Op, SelectionDAG &DAG,
18563 SDValue CPIdx0 = DAG.getConstantPool(C0, PtrVT, 16);
18573 SDValue CPIdx1 = DAG.getConstantPool(C1, PtrVT, 16);
18576 SDValue XR1 = DAG.getNode(ISD::SCALAR_TO_VECTOR, dl, MVT::v2i64,
18578 SDValue CLod0 =
18582 SDValue Unpck1 =
18585 SDValue CLod1 =
18589 SDValue XR2F = DAG.getBitcast(MVT::v2f64, Unpck1);
18591 SDValue Sub = DAG.getNode(ISD::FSUB, dl, MVT::v2f64, XR2F, CLod1);
18592 SDValue Result;
18597 SDValue Shuffle = DAG.getVectorShuffle(MVT::v2f64, dl, Sub, Sub, {1,-1});
18606 static SDValue LowerUINT_TO_FP_i32(SDValue Op, SelectionDAG &DAG,
18606 static SDValue LowerUINT_TO_FP_i32(SDValue Op, SelectionDAG &DAG,
18610 SDValue Bias = DAG.getConstantFP(BitsToDouble(0x4330000000000000ULL), dl,
18614 SDValue Load = DAG.getNode(ISD::SCALAR_TO_VECTOR, dl, MVT::v4i32,
18625 SDValue Or = DAG.getNode(
18637 SDValue Sub = DAG.getNode(ISD::FSUB, dl, MVT::f64, Or, Bias);
18643 static SDValue lowerUINT_TO_FP_v2i32(SDValue Op, SelectionDAG &DAG,
18643 static SDValue lowerUINT_TO_FP_v2i32(SDValue Op, SelectionDAG &DAG,
18649 SDValue N0 = Op.getOperand(0);
18661 SDValue HalfWord = DAG.getConstant(16, DL, MVT::v4i32);
18662 SDValue HalfWordMask = DAG.getConstant(0x0000FFFF, DL, MVT::v4i32);
18665 SDValue TWOHW = DAG.getConstantFP((double)(1 << 16), DL, MVT::v2f64);
18668 SDValue HI = DAG.getNode(ISD::SRL, DL, MVT::v4i32, N0, HalfWord);
18669 SDValue LO = DAG.getNode(ISD::AND, DL, MVT::v4i32, N0, HalfWordMask);
18671 SDValue fHI = DAG.getNode(X86ISD::CVTSI2P, DL, MVT::v2f64, HI);
18673 SDValue fLO = DAG.getNode(X86ISD::CVTSI2P, DL, MVT::v2f64, LO);
18679 static SDValue lowerUINT_TO_FP_vXi32(SDValue Op, SelectionDAG &DAG,
18679 static SDValue lowerUINT_TO_FP_vXi32(SDValue Op, SelectionDAG &DAG,
18703 SDValue V = Op->getOperand(0);
18723 SDValue VecCstLow = DAG.getConstant(0x4b000000, DL, VecIntVT);
18725 SDValue VecCstHigh = DAG.getConstant(0x53000000, DL, VecIntVT);
18728 SDValue VecCstShift = DAG.getConstant(16, DL, VecIntVT);
18729 SDValue HighShift = DAG.getNode(ISD::SRL, DL, VecIntVT, V, VecCstShift);
18731 SDValue Low, High;
18735 SDValue VecCstLowBitcast = DAG.getBitcast(VecI16VT, VecCstLow);
18736 SDValue VecBitcast = DAG.getBitcast(VecI16VT, V);
18743 SDValue VecCstHighBitcast = DAG.getBitcast(VecI16VT, VecCstHigh);
18744 SDValue VecShiftBitcast = DAG.getBitcast(VecI16VT, HighShift);
18750 SDValue VecCstMask = DAG.getConstant(0xffff, DL, VecIntVT);
18752 SDValue LowAnd = DAG.getNode(ISD::AND, DL, VecIntVT, V, VecCstMask);
18760 SDValue VecCstFAdd = DAG.getConstantFP(
18764 SDValue HighBitcast = DAG.getBitcast(VecFloatVT, High);
18766 SDValue FHigh =
18769 SDValue LowBitcast = DAG.getBitcast(VecFloatVT, Low);
18773 static SDValue lowerUINT_TO_FP_vec(SDValue Op, SelectionDAG &DAG,
18773 static SDValue lowerUINT_TO_FP_vec(SDValue Op, SelectionDAG &DAG,
18775 SDValue N0 = Op.getOperand(0);
18791 SDValue X86TargetLowering::LowerUINT_TO_FP(SDValue Op,
18791 SDValue X86TargetLowering::LowerUINT_TO_FP(SDValue Op,
18793 SDValue N0 = Op.getOperand(0);
18805 if (SDValue Extract = vectorizeExtractedCast(Op, DAG, Subtarget))
18821 if (SDValue V = LowerI64IntToFP_AVX512DQ(Op, DAG, Subtarget))
18832 SDValue StackSlot = DAG.CreateStackTemporary(MVT::i64);
18834 SDValue OffsetSlot = DAG.getMemBasePlusOffset(StackSlot, 4, dl);
18835 SDValue Store1 = DAG.getStore(DAG.getEntryNode(), dl, Op.getOperand(0),
18837 SDValue Store2 = DAG.getStore(Store1, dl, DAG.getConstant(0, dl, MVT::i32),
18839 SDValue Fild = BuildFILD(Op, MVT::i64, Store2, StackSlot, DAG);
18844 SDValue ValueToStore = Op.getOperand(0);
18850 SDValue Store = DAG.getStore(DAG.getEntryNode(), dl, ValueToStore, StackSlot,
18863 SDValue Ops[] = { Store, StackSlot };
18864 SDValue Fild = DAG.getMemIntrinsicNode(X86ISD::FILD, dl, Tys, Ops,
18870 SDValue SignSet = DAG.getSetCC(
18875 SDValue FudgePtr = DAG.getConstantPool(
18879 SDValue Zero = DAG.getIntPtrConstant(0, dl);
18880 SDValue Four = DAG.getIntPtrConstant(4, dl);
18881 SDValue Offset = DAG.getSelect(dl, Zero.getValueType(), SignSet, Zero, Four);
18886 SDValue Fudge = DAG.getExtLoad(
18892 SDValue Add = DAG.getNode(ISD::FADD, dl, MVT::f80, Fild, Fudge);
18903 SDValue
18904 X86TargetLowering::FP_TO_INTHelper(SDValue Op, SelectionDAG &DAG,
18939 SDValue StackSlot = DAG.getFrameIndex(SSFI, PtrVT);
18941 SDValue Chain = DAG.getEntryNode();
18942 SDValue Value = Op.getOperand(0);
18943 SDValue Adjust; // 0x0 or 0x80000000, for result sign bit adjustment.
18976 SDValue ThreshVal = DAG.getConstantFP(Thresh, DL, TheVT);
18978 SDValue Cmp = DAG.getSetCC(DL,
18986 SDValue Sub = DAG.getNode(ISD::FSUB, DL, TheVT, Value, ThreshVal);
19001 SDValue Ops[] = { Chain, StackSlot };
19014 SDValue Ops[] = { Chain, Value, StackSlot };
19015 SDValue FIST = DAG.getMemIntrinsicNode(X86ISD::FP_TO_INT_IN_MEM, DL,
19019 SDValue Res = DAG.getLoad(Op.getValueType(), SDLoc(Op), FIST, StackSlot, MPI);
19028 static SDValue LowerAVXExtend(SDValue Op, SelectionDAG &DAG,
19028 static SDValue LowerAVXExtend(SDValue Op, SelectionDAG &DAG,
19031 SDValue In = Op.getOperand(0);
19078 SDValue OpLo = DAG.getNode(ExtendInVecOpc, dl, HalfVT, In);
19086 SDValue ZeroVec = DAG.getConstant(0, dl, InVT);
19087 SDValue Undef = DAG.getUNDEF(InVT);
19089 SDValue OpHi = getUnpackh(DAG, dl, InVT, In, NeedZero ? ZeroVec : Undef);
19096 static SDValue SplitAndExtendv16i1(unsigned ExtOpc, MVT VT, SDValue In,
19096 static SDValue SplitAndExtendv16i1(unsigned ExtOpc, MVT VT, SDValue In,
19099 SDValue Lo = DAG.getNode(ISD::EXTRACT_SUBVECTOR, dl, MVT::v8i1, In,
19101 SDValue Hi = DAG.getNode(ISD::EXTRACT_SUBVECTOR, dl, MVT::v8i1, In,
19105 SDValue Res = DAG.getNode(ISD::CONCAT_VECTORS, dl, MVT::v16i16, Lo, Hi);
19109 static SDValue LowerZERO_EXTEND_Mask(SDValue Op,
19109 static SDValue LowerZERO_EXTEND_Mask(SDValue Op,
19113 SDValue In = Op->getOperand(0);
19122 SDValue Extend = DAG.getNode(ISD::SIGN_EXTEND, DL, VT, In);
19148 SDValue One = DAG.getConstant(1, DL, WideVT);
19149 SDValue Zero = DAG.getConstant(0, DL, WideVT);
19151 SDValue SelectedVal = DAG.getSelect(DL, WideVT, In, One, Zero);
19167 static SDValue LowerZERO_EXTEND(SDValue Op, const X86Subtarget &Subtarget,
19167 static SDValue LowerZERO_EXTEND(SDValue Op, const X86Subtarget &Subtarget,
19169 SDValue In = Op.getOperand(0);
19184 static SDValue truncateVectorWithPACK(unsigned Opcode, EVT DstVT, SDValue In,
19184 static SDValue truncateVectorWithPACK(unsigned Opcode, EVT DstVT, SDValue In,
19232 SDValue Res = DAG.getNode(Opcode, DL, OutVT, In, In);
19239 SDValue Lo = extractSubVector(In, 0 * NumSubElts, DAG, DL, SrcSizeInBits / 2);
19240 SDValue Hi = extractSubVector(In, 1 * NumSubElts, DAG, DL, SrcSizeInBits / 2);
19250 SDValue Res = DAG.getNode(Opcode, DL, OutVT, Lo, Hi);
19259 SDValue Res = DAG.getNode(Opcode, DL, OutVT, Lo, Hi);
19285 SDValue Res = DAG.getNode(ISD::CONCAT_VECTORS, DL, PackedVT, Lo, Hi);
19289 static SDValue LowerTruncateVecI1(SDValue Op, SelectionDAG &DAG,
19289 static SDValue LowerTruncateVecI1(SDValue Op, SelectionDAG &DAG,
19294 SDValue In = Op.getOperand(0);
19336 SDValue Lo = extract128BitVector(In, 0, DAG, DL);
19337 SDValue Hi = extract128BitVector(In, 8, DAG, DL);
19365 SDValue X86TargetLowering::LowerTRUNCATE(SDValue Op, SelectionDAG &DAG) const {
19365 SDValue X86TargetLowering::LowerTRUNCATE(SDValue Op, SelectionDAG &DAG) const {
19368 SDValue In = Op.getOperand(0);
19384 SDValue Lo, Hi;
19421 if (SDValue V =
19428 if (SDValue V =
19445 SDValue OpLo = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, MVT::v2i64, In,
19447 SDValue OpHi = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, MVT::v2i64, In,
19475 SDValue OpLo = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, MVT::v4i32, In,
19478 SDValue OpHi = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, MVT::v4i32, In,
19496 SDValue res = DAG.getVectorShuffle(MVT::v4i32, DL, OpLo, OpHi, ShufMask2);
19504 SDValue InLo = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, MVT::v8i16, In,
19506 SDValue InHi = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, MVT::v8i16, In,
19514 SDValue X86TargetLowering::LowerFP_TO_INT(SDValue Op, SelectionDAG &DAG) const {
19514 SDValue X86TargetLowering::LowerFP_TO_INT(SDValue Op, SelectionDAG &DAG) const {
19517 SDValue Src = Op.getOperand(0);
19546 SDValue Res = DAG.getNode(Opc, dl, ResVT, Src);
19579 SDValue Res = DAG.getNode(ISD::FP_TO_SINT, dl, MVT::i64, Src);
19592 SDValue Res = DAG.getNode(ISD::FP_TO_SINT, dl, MVT::i32, Src);
19601 if (SDValue V = FP_TO_INTHelper(Op, DAG, IsSigned))
19607 SDValue X86TargetLowering::LowerFP_EXTEND(SDValue Op, SelectionDAG &DAG) const {
19607 SDValue X86TargetLowering::LowerFP_EXTEND(SDValue Op, SelectionDAG &DAG) const {
19610 SDValue In = Op.getOperand(0);
19625 SDValue X86TargetLowering::LowerFP_ROUND(SDValue Op, SelectionDAG &DAG) const {
19625 SDValue X86TargetLowering::LowerFP_ROUND(SDValue Op, SelectionDAG &DAG) const {
19627 SDValue In = Op.getOperand(0);
19645 static SDValue LowerSTRICT_FP_ROUND(SDValue Op, SelectionDAG &DAG) {
19645 static SDValue LowerSTRICT_FP_ROUND(SDValue Op, SelectionDAG &DAG) {
19654 static SDValue lowerAddSubToHorizontalOp(SDValue Op, SelectionDAG &DAG,
19654 static SDValue lowerAddSubToHorizontalOp(SDValue Op, SelectionDAG &DAG,
19657 SDValue LHS = Op.getOperand(0);
19658 SDValue RHS = Op.getOperand(1);
19698 SDValue X = LHS.getOperand(0);
19719 SDValue HOp = DAG.getNode(HOpcode, DL, X.getValueType(), X, X);
19726 SDValue X86TargetLowering::lowerFaddFsub(SDValue Op, SelectionDAG &DAG) const {
19726 SDValue X86TargetLowering::lowerFaddFsub(SDValue Op, SelectionDAG &DAG) const {
19740 static SDValue LowerFABSorFNEG(SDValue Op, SelectionDAG &DAG) {
19740 static SDValue LowerFABSorFNEG(SDValue Op, SelectionDAG &DAG) {
19780 SDValue Mask = DAG.getConstantFP(APFloat(Sem, MaskElt), dl, LogicVT);
19782 SDValue Op0 = Op.getOperand(0);
19787 SDValue Operand = IsFNABS ? Op0.getOperand(0) : Op0;
19795 SDValue LogicNode = DAG.getNode(LogicOp, dl, LogicVT, Operand, Mask);
19800 static SDValue LowerFCOPYSIGN(SDValue Op, SelectionDAG &DAG) {
19800 static SDValue LowerFCOPYSIGN(SDValue Op, SelectionDAG &DAG) {
19801 SDValue Mag = Op.getOperand(0);
19802 SDValue Sign = Op.getOperand(1);
19836 SDValue SignMask = DAG.getConstantFP(
19838 SDValue MagMask = DAG.getConstantFP(
19844 SDValue SignBit = DAG.getNode(X86ISD::FAND, dl, LogicVT, Sign, SignMask);
19849 SDValue MagBits;
19862 SDValue Or = DAG.getNode(X86ISD::FOR, dl, LogicVT, MagBits, SignBit);
19867 static SDValue LowerFGETSIGN(SDValue Op, SelectionDAG &DAG) {
19867 static SDValue LowerFGETSIGN(SDValue Op, SelectionDAG &DAG) {
19868 SDValue N0 = Op.getOperand(0);
19878 SDValue Res = DAG.getNode(ISD::SCALAR_TO_VECTOR, dl, VecVT, N0);
19886 static SDValue getSETCC(X86::CondCode Cond, SDValue EFLAGS, const SDLoc &dl,
19886 static SDValue getSETCC(X86::CondCode Cond, SDValue EFLAGS, const SDLoc &dl,
19894 static bool matchScalarReduction(SDValue Op, ISD::NodeType BinOp,
19895 SmallVectorImpl<SDValue> &SrcOps) {
19896 SmallVector<SDValue, 8> Opnds;
19897 DenseMap<SDValue, APInt> SrcOpMap;
19908 SmallVectorImpl<SDValue>::const_iterator I = Opnds.begin() + Slot;
19923 SDValue Idx = I->getOperand(1);
19927 SDValue Src = I->getOperand(0);
19928 DenseMap<SDValue, APInt>::iterator M = SrcOpMap.find(Src);
19948 for (DenseMap<SDValue, APInt>::const_iterator I = SrcOpMap.begin(),
19959 static SDValue LowerVectorAllZeroTest(SDValue Op, ISD::CondCode CC,
19959 static SDValue LowerVectorAllZeroTest(SDValue Op, ISD::CondCode CC,
19961 SelectionDAG &DAG, SDValue &X86CC) {
19967 SmallVector<SDValue, 8> VecIns;
19987 SDValue LHS = VecIns[Slot];
19988 SDValue RHS = VecIns[Slot + 1];
19998 static bool hasNonFlagsUse(SDValue Op) {
20018 static SDValue EmitTest(SDValue Op, unsigned X86CC, const SDLoc &dl,
20018 static SDValue EmitTest(SDValue Op, unsigned X86CC, const SDLoc &dl,
20062 SDValue ArithOp = Op;
20125 SmallVector<SDValue, 4> Ops(Op->op_begin(), Op->op_begin() + NumOperands);
20127 SDValue New = DAG.getNode(Opcode, dl, VTs, Ops);
20134 SDValue X86TargetLowering::EmitCmp(SDValue Op0, SDValue Op1, unsigned X86CC,
20134 SDValue X86TargetLowering::EmitCmp(SDValue Op0, SDValue Op1, unsigned X86CC,
20134 SDValue X86TargetLowering::EmitCmp(SDValue Op0, SDValue Op1, unsigned X86CC,
20162 SDValue In = Op0.getOperand(0);
20168 SDValue In = Op1.getOperand(0);
20183 SDValue Sub = DAG.getNode(X86ISD::SUB, dl, VTs, Op0, Op1);
20188 SDValue X86TargetLowering::ConvertCmpIfNecessary(SDValue Cmp,
20188 SDValue X86TargetLowering::ConvertCmpIfNecessary(SDValue Cmp,
20203 SDValue TruncFPSW = DAG.getNode(ISD::TRUNCATE, dl, MVT::i16, Cmp);
20204 SDValue FNStSW = DAG.getNode(X86ISD::FNSTSW16r, dl, MVT::i16, TruncFPSW);
20205 SDValue Srl = DAG.getNode(ISD::SRL, dl, MVT::i16, FNStSW,
20207 SDValue TruncSrl = DAG.getNode(ISD::TRUNCATE, dl, MVT::i8, Srl);
20215 bool X86TargetLowering::isFsqrtCheap(SDValue Op, SelectionDAG &DAG) const {
20229 SDValue X86TargetLowering::getSqrtEstimate(SDValue Op,
20229 SDValue X86TargetLowering::getSqrtEstimate(SDValue Op,
20262 SDValue X86TargetLowering::getRecipEstimate(SDValue Op, SelectionDAG &DAG,
20262 SDValue X86TargetLowering::getRecipEstimate(SDValue Op, SelectionDAG &DAG,
20304 SDValue
20334 SDValue N0 = N->getOperand(0);
20335 SDValue Zero = DAG.getConstant(0, DL, VT);
20337 SDValue Pow2MinusOne = DAG.getConstant(Lg2Mask, DL, VT);
20340 SDValue Cmp = DAG.getSetCC(DL, MVT::i8, N0, Zero, ISD::SETLT);
20341 SDValue Add = DAG.getNode(ISD::ADD, DL, VT, N0, Pow2MinusOne);
20342 SDValue CMov = DAG.getNode(ISD::SELECT, DL, VT, Cmp, Add, N0);
20349 SDValue SRA =
20363 static SDValue LowerAndToBT(SDValue And, ISD::CondCode CC,
20363 static SDValue LowerAndToBT(SDValue And, ISD::CondCode CC,
20365 SDValue &X86CC) {
20367 SDValue Op0 = And.getOperand(0);
20368 SDValue Op1 = And.getOperand(1);
20374 SDValue Src, BitNo;
20394 SDValue AndLHS = Op0;
20444 static unsigned translateX86FSETCC(ISD::CondCode SetCCOpcode, SDValue &Op0,
20445 SDValue &Op1) {
20489 static SDValue Lower256IntVSETCC(SDValue Op, SelectionDAG &DAG) {
20489 static SDValue Lower256IntVSETCC(SDValue Op, SelectionDAG &DAG) {
20497 SDValue CC = Op.getOperand(2);
20500 SDValue LHS = Op.getOperand(0);
20501 SDValue LHS1 = extract128BitVector(LHS, 0, DAG, dl);
20502 SDValue LHS2 = extract128BitVector(LHS, NumElems / 2, DAG, dl);
20505 SDValue RHS = Op.getOperand(1);
20506 SDValue RHS1 = extract128BitVector(RHS, 0, DAG, dl);
20507 SDValue RHS2 = extract128BitVector(RHS, NumElems / 2, DAG, dl);
20517 static SDValue LowerIntVSETCC_AVX512(SDValue Op, SelectionDAG &DAG) {
20517 static SDValue LowerIntVSETCC_AVX512(SDValue Op, SelectionDAG &DAG) {
20519 SDValue Op0 = Op.getOperand(0);
20520 SDValue Op1 = Op.getOperand(1);
20521 SDValue CC = Op.getOperand(2);
20543 static SDValue incDecVectorConstant(SDValue V, SelectionDAG &DAG, bool IsInc) {
20543 static SDValue incDecVectorConstant(SDValue V, SelectionDAG &DAG, bool IsInc) {
20551 SmallVector<SDValue, 8> NewVecC;
20573 static SDValue LowerVSETCCWithSUBUS(SDValue Op0, SDValue Op1, MVT VT,
20573 static SDValue LowerVSETCCWithSUBUS(SDValue Op0, SDValue Op1, MVT VT,
20573 static SDValue LowerVSETCCWithSUBUS(SDValue Op0, SDValue Op1, MVT VT,
20595 SDValue ULEOp1 = incDecVectorConstant(Op1, DAG, /*IsInc*/false);
20606 SDValue UGEOp1 = incDecVectorConstant(Op1, DAG, /*IsInc*/true);
20621 SDValue Result = DAG.getNode(ISD::USUBSAT, dl, VT, Op0, Op1);
20626 static SDValue LowerVSETCC(SDValue Op, const X86Subtarget &Subtarget,
20626 static SDValue LowerVSETCC(SDValue Op, const X86Subtarget &Subtarget,
20628 SDValue Op0 = Op.getOperand(0);
20629 SDValue Op1 = Op.getOperand(1);
20630 SDValue CC = Op.getOperand(2);
20656 SDValue Cmp;
20673 SDValue Cmp0 = DAG.getNode(Opc, dl, VT, Op0, Op1,
20675 SDValue Cmp1 = DAG.getNode(Opc, dl, VT, Op0, Op1,
20743 SDValue BC0 = peekThroughBitcasts(Op0);
20766 SDValue Result = Op0.getOperand(0);
20808 if (SDValue UGTOp1 = incDecVectorConstant(Op1, DAG, /*IsInc*/true)) {
20815 if (SDValue ULTOp1 = incDecVectorConstant(Op1, DAG, /*IsInc*/false)) {
20830 SDValue Result = DAG.getNode(Opc, dl, VT, Op0, Op1);
20841 if (SDValue V = LowerVSETCCWithSUBUS(Op0, Op1, VT, Cond, dl, Subtarget, DAG))
20866 SDValue SB;
20880 SDValue GT = DAG.getNode(X86ISD::PCMPGT, dl, MVT::v4i32, Op0, Op1);
20881 SDValue EQ = DAG.getNode(X86ISD::PCMPEQ, dl, MVT::v4i32, Op0, Op1);
20886 SDValue EQHi = DAG.getVectorShuffle(MVT::v4i32, dl, EQ, EQ, MaskHi);
20887 SDValue GTLo = DAG.getVectorShuffle(MVT::v4i32, dl, GT, GT, MaskLo);
20888 SDValue GTHi = DAG.getVectorShuffle(MVT::v4i32, dl, GT, GT, MaskHi);
20890 SDValue Result = DAG.getNode(ISD::AND, dl, MVT::v4i32, EQHi, GTLo);
20909 SDValue Result = DAG.getNode(Opc, dl, MVT::v4i32, Op0, Op1);
20913 SDValue Shuf = DAG.getVectorShuffle(MVT::v4i32, dl, Result, Result, Mask);
20927 SDValue SM = DAG.getConstant(APInt::getSignMask(EltVT.getSizeInBits()), dl,
20933 SDValue Result = DAG.getNode(Opc, dl, VT, Op0, Op1);
20943 static SDValue EmitAVX512Test(SDValue Op0, SDValue Op1, ISD::CondCode CC,
20943 static SDValue EmitAVX512Test(SDValue Op0, SDValue Op1, ISD::CondCode CC,
20943 static SDValue EmitAVX512Test(SDValue Op0, SDValue Op1, ISD::CondCode CC,
20946 SDValue &X86CC) {
20980 SDValue LHS = Op0.getOperand(0);
20981 SDValue RHS = Op0.getOperand(1);
20987 SDValue LHS = Op0;
20988 SDValue RHS = Op0;
21000 SDValue X86TargetLowering::emitFlagsForSetcc(SDValue Op0, SDValue Op1,
21000 SDValue X86TargetLowering::emitFlagsForSetcc(SDValue Op0, SDValue Op1,
21000 SDValue X86TargetLowering::emitFlagsForSetcc(SDValue Op0, SDValue Op1,
21003 SDValue &X86CC) const {
21010 if (SDValue BT = LowerAndToBT(Op0, CC, dl, DAG, X86CC))
21018 if (SDValue PTEST = LowerVectorAllZeroTest(Op0, CC, Subtarget, DAG, X86CC))
21023 if (SDValue Test = EmitAVX512Test(Op0, Op1, CC, dl, DAG, Subtarget, X86CC))
21051 SDValue EFLAGS = EmitCmp(Op0, Op1, CondCode, dl, DAG);
21057 SDValue X86TargetLowering::LowerSETCC(SDValue Op, SelectionDAG &DAG) const {
21057 SDValue X86TargetLowering::LowerSETCC(SDValue Op, SelectionDAG &DAG) const {
21064 SDValue Op0 = Op.getOperand(0);
21065 SDValue Op1 = Op.getOperand(1);
21082 SDValue X86CC;
21083 SDValue EFLAGS = emitFlagsForSetcc(Op0, Op1, CC, dl, DAG, X86CC);
21090 SDValue X86TargetLowering::LowerSETCCCARRY(SDValue Op, SelectionDAG &DAG) const {
21090 SDValue X86TargetLowering::LowerSETCCCARRY(SDValue Op, SelectionDAG &DAG) const {
21091 SDValue LHS = Op.getOperand(0);
21092 SDValue RHS = Op.getOperand(1);
21093 SDValue Carry = Op.getOperand(2);
21094 SDValue Cond = Op.getOperand(3);
21107 SDValue Cmp = DAG.getNode(X86ISD::SBB, DL, VTs, LHS, RHS, Carry.getValue(1));
21115 static std::pair<SDValue, SDValue>
21115 static std::pair<SDValue, SDValue>
21116 getX86XALUOOp(X86::CondCode &Cond, SDValue Op, SelectionDAG &DAG) {
21118 SDValue Value, Overflow;
21119 SDValue LHS = Op.getOperand(0);
21120 SDValue RHS = Op.getOperand(1);
21161 static SDValue LowerXALUO(SDValue Op, SelectionDAG &DAG) {
21161 static SDValue LowerXALUO(SDValue Op, SelectionDAG &DAG) {
21168 SDValue Value, Overflow;
21171 SDValue SetCC = getSETCC(Cond, Overflow, DL, DAG);
21177 static bool isX86LogicalCmp(SDValue Op) {
21191 static bool isTruncWithZeroHighBitsInput(SDValue V, SelectionDAG &DAG) {
21195 SDValue VOp0 = V.getOperand(0);
21201 SDValue X86TargetLowering::LowerSELECT(SDValue Op, SelectionDAG &DAG) const {
21201 SDValue X86TargetLowering::LowerSELECT(SDValue Op, SelectionDAG &DAG) const {
21203 SDValue Cond = Op.getOperand(0);
21204 SDValue Op1 = Op.getOperand(1);
21205 SDValue Op2 = Op.getOperand(2);
21208 SDValue CC;
21217 SDValue CondOp0 = Cond.getOperand(0), CondOp1 = Cond.getOperand(1);
21222 SDValue Cmp =
21230 SDValue Cmp = DAG.getNode(X86ISD::FSETCC, DL, VT, CondOp0, CondOp1,
21250 SDValue VOp1 = DAG.getNode(ISD::SCALAR_TO_VECTOR, DL, VecVT, Op1);
21251 SDValue VOp2 = DAG.getNode(ISD::SCALAR_TO_VECTOR, DL, VecVT, Op2);
21252 SDValue VCmp = DAG.getNode(ISD::SCALAR_TO_VECTOR, DL, VecVT, Cmp);
21257 SDValue VSel = DAG.getSelect(DL, VecVT, VCmp, VOp1, VOp2);
21262 SDValue AndN = DAG.getNode(X86ISD::FANDN, DL, VT, Cmp, Op2);
21263 SDValue And = DAG.getNode(X86ISD::FAND, DL, VT, Cmp, Op1);
21270 SDValue Cmp = DAG.getNode(ISD::SCALAR_TO_VECTOR, DL, MVT::v1i1, Cond);
21277 SDValue Op1Lo = extractSubVector(Op1, 0, DAG, DL, 32);
21278 SDValue Op2Lo = extractSubVector(Op2, 0, DAG, DL, 32);
21279 SDValue Op1Hi = extractSubVector(Op1, 32, DAG, DL, 32);
21280 SDValue Op2Hi = extractSubVector(Op2, 32, DAG, DL, 32);
21281 SDValue Lo = DAG.getSelect(DL, MVT::v32i1, Cond, Op1Lo, Op2Lo);
21282 SDValue Hi = DAG.getSelect(DL, MVT::v32i1, Cond, Op1Hi, Op2Hi);
21287 SDValue Op1Scalar;
21292 SDValue Op2Scalar;
21298 SDValue newSelect = DAG.getSelect(DL, Op1Scalar.getValueType(), Cond,
21302 SDValue ExtVec = DAG.getBitcast(MVT::v8i1, newSelect);
21309 if (SDValue NewCond = LowerSETCC(Cond, DAG)) {
21328 SDValue Cmp = Cond.getOperand(1);
21333 SDValue Y = isAllOnesConstant(Op2) ? Op1 : Op2;
21334 SDValue CmpOp0 = Cmp.getOperand(0);
21341 SDValue Zero = DAG.getConstant(0, DL, CmpOp0.getValueType());
21342 SDValue CmpZero = DAG.getNode(X86ISD::CMP, DL, MVT::i32, Zero, CmpOp0);
21353 SDValue Zero = DAG.getConstant(0, DL, Op.getValueType());
21354 SDValue Res = // Res = 0 or -1.
21366 SDValue CmpOp0 = Cmp.getOperand(0);
21367 SDValue Src1, Src2;
21383 SDValue Neg;
21395 SDValue Mask = DAG.getNode(ISD::SUB, DL, VT, DAG.getConstant(0, DL, VT),
21397 SDValue And = DAG.getNode(ISD::AND, DL, VT, Mask, Src1); // Mask & z
21416 SDValue Cmp = Cond.getOperand(1);
21430 SDValue Value;
21446 SDValue BTCC;
21447 if (SDValue BT = LowerAndToBT(Cond, ISD::SETNE, DL, DAG, BTCC)) {
21472 SDValue Res =
21486 SDValue T1 = Op1.getOperand(0), T2 = Op2.getOperand(0);
21490 SDValue Cmov = DAG.getNode(X86ISD::CMOV, DL, T1.getValueType(), T2, T1,
21507 SDValue Ops[] = { Op2, Op1, CC, Cond };
21508 SDValue Cmov = DAG.getNode(X86ISD::CMOV, DL, MVT::i32, Ops);
21514 SDValue Ops[] = { Op2, Op1, CC, Cond };
21518 static SDValue LowerSIGN_EXTEND_Mask(SDValue Op,
21518 static SDValue LowerSIGN_EXTEND_Mask(SDValue Op,
21522 SDValue In = Op->getOperand(0);
21550 SDValue V;
21556 SDValue NegOne = DAG.getConstant(-1, dl, WideVT);
21557 SDValue Zero = DAG.getConstant(0, dl, WideVT);
21575 static SDValue LowerANY_EXTEND(SDValue Op, const X86Subtarget &Subtarget,
21575 static SDValue LowerANY_EXTEND(SDValue Op, const X86Subtarget &Subtarget,
21577 SDValue In = Op->getOperand(0);
21591 static SDValue LowerEXTEND_VECTOR_INREG(SDValue Op,
21591 static SDValue LowerEXTEND_VECTOR_INREG(SDValue Op,
21594 SDValue In = Op->getOperand(0);
21653 SDValue Lo = DAG.getNode(Opc, dl, HalfVT, In);
21654 SDValue Hi = DAG.getVectorShuffle(InVT, dl, In, DAG.getUNDEF(InVT), HiMask);
21664 SDValue Curr = In;
21665 SDValue SignExt = Curr;
21694 SDValue Zero = DAG.getConstant(0, dl, MVT::v4i32);
21695 SDValue Sign = DAG.getSetCC(dl, MVT::v4i32, Zero, Curr, ISD::SETGT);
21703 static SDValue LowerSIGN_EXTEND(SDValue Op, const X86Subtarget &Subtarget,
21703 static SDValue LowerSIGN_EXTEND(SDValue Op, const X86Subtarget &Subtarget,
21706 SDValue In = Op->getOperand(0);
21747 SDValue OpLo = DAG.getNode(ISD::SIGN_EXTEND_VECTOR_INREG, dl, HalfVT, In);
21754 SDValue OpHi = DAG.getVectorShuffle(InVT, dl, In, In, ShufMask);
21761 static SDValue splitVectorStore(StoreSDNode *Store, SelectionDAG &DAG) {
21762 SDValue StoredVal = Store->getValue();
21779 SDValue Value0 = extractSubVector(StoredVal, 0, DAG, DL, HalfSize);
21780 SDValue Value1 = extractSubVector(StoredVal, NumElems / 2, DAG, DL, HalfSize);
21781 SDValue Ptr0 = Store->getBasePtr();
21782 SDValue Ptr1 = DAG.getMemBasePlusOffset(Ptr0, HalfAlign, DL);
21784 SDValue Ch0 =
21787 SDValue Ch1 = DAG.getStore(Store->getChain(), DL, Value1, Ptr1,
21796 static SDValue scalarizeVectorStore(StoreSDNode *Store, MVT StoreVT,
21798 SDValue StoredVal = Store->getValue();
21815 SmallVector<SDValue, 4> Stores;
21818 SDValue Ptr = DAG.getMemBasePlusOffset(Store->getBasePtr(), Offset, DL);
21819 SDValue Scl = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, StoreSVT, StoredVal,
21821 SDValue Ch = DAG.getStore(Store->getChain(), DL, Scl, Ptr,
21830 static SDValue LowerStore(SDValue Op, const X86Subtarget &Subtarget,
21830 static SDValue LowerStore(SDValue Op, const X86Subtarget &Subtarget,
21834 SDValue StoredVal = St->getValue();
21865 SmallVector<SDValue, 4> CatOps;
21896 SDValue Ops[] = {St->getChain(), StoredVal, St->getBasePtr()};
21908 static SDValue LowerLoad(SDValue Op, const X86Subtarget &Subtarget,
21908 static SDValue LowerLoad(SDValue Op, const X86Subtarget &Subtarget,
21925 SDValue NewLd = DAG.getLoad(MVT::i8, dl, Ld->getChain(), Ld->getBasePtr(),
21932 SDValue Val = DAG.getNode(ISD::ANY_EXTEND, dl, MVT::i16, NewLd);
21944 static bool isAndOrOfSetCCs(SDValue Op, unsigned &Opc) {
21956 static bool isXor1OfSetCC(SDValue Op) {
21965 SDValue X86TargetLowering::LowerBRCOND(SDValue Op, SelectionDAG &DAG) const {
21965 SDValue X86TargetLowering::LowerBRCOND(SDValue Op, SelectionDAG &DAG) const {
21967 SDValue Chain = Op.getOperand(0);
21968 SDValue Cond = Op.getOperand(1);
21969 SDValue Dest = Op.getOperand(2);
21971 SDValue CC;
21988 if (SDValue NewCond = LowerSETCC(Cond, DAG))
22014 SDValue Cmp = Cond.getOperand(1);
22037 SDValue Value;
22049 SDValue Cmp = Cond.getOperand(0).getOperand(1);
22081 SDValue FalseBB = User->getOperand(1);
22122 SDValue FalseBB = User->getOperand(1);
22129 SDValue Cmp = DAG.getNode(X86ISD::CMP, dl, MVT::i32,
22145 SDValue Cmp = DAG.getNode(X86ISD::CMP, dl, MVT::i32,
22165 SDValue BTCC;
22166 if (SDValue BT = LowerAndToBT(Cond, ISD::SETNE, dl, DAG, BTCC)) {
22190 SDValue
22191 X86TargetLowering::LowerDYNAMIC_STACKALLOC(SDValue Op,
22202 SDValue Chain = Op.getOperand(0);
22203 SDValue Size = Op.getOperand(1);
22214 SDValue Result;
22221 SDValue SP = DAG.getCopyFromReg(Chain, dl, SPReg, VT);
22256 SDValue SP = DAG.getCopyFromReg(Chain, dl, SPReg, SPTy);
22271 SDValue Ops[2] = {Result, Chain};
22275 SDValue X86TargetLowering::LowerVASTART(SDValue Op, SelectionDAG &DAG) const {
22275 SDValue X86TargetLowering::LowerVASTART(SDValue Op, SelectionDAG &DAG) const {
22287 SDValue FR = DAG.getFrameIndex(FuncInfo->getVarArgsFrameIndex(), PtrVT);
22297 SmallVector<SDValue, 8> MemOps;
22298 SDValue FIN = Op.getOperand(1);
22300 SDValue Store = DAG.getStore(
22316 SDValue OVFIN = DAG.getFrameIndex(FuncInfo->getVarArgsFrameIndex(), PtrVT);
22324 SDValue RSFIN = DAG.getFrameIndex(FuncInfo->getRegSaveFrameIndex(), PtrVT);
22332 SDValue X86TargetLowering::LowerVAARG(SDValue Op, SelectionDAG &DAG) const {
22332 SDValue X86TargetLowering::LowerVAARG(SDValue Op, SelectionDAG &DAG) const {
22342 SDValue Chain = Op.getOperand(0);
22343 SDValue SrcPtr = Op.getOperand(1);
22375 SDValue InstOps[] = {Chain, SrcPtr, DAG.getConstant(ArgSize, dl, MVT::i32),
22379 SDValue VAARG = DAG.getMemIntrinsicNode(
22391 static SDValue LowerVACOPY(SDValue Op, const X86Subtarget &Subtarget,
22391 static SDValue LowerVACOPY(SDValue Op, const X86Subtarget &Subtarget,
22401 SDValue Chain = Op.getOperand(0);
22402 SDValue DstPtr = Op.getOperand(1);
22403 SDValue SrcPtr = Op.getOperand(2);
22435 static SDValue getTargetVShiftByConstNode(unsigned Opc, const SDLoc &dl, MVT VT,
22436 SDValue SrcOp, uint64_t ShiftAmt,
22463 SmallVector<SDValue, 8> Elts;
22470 SDValue CurrentOp = SrcOp->getOperand(i);
22482 SDValue CurrentOp = SrcOp->getOperand(i);
22494 SDValue CurrentOp = SrcOp->getOperand(i);
22515 static SDValue getTargetVShiftNode(unsigned Opc, const SDLoc &dl, MVT VT,
22516 SDValue SrcOp, SDValue ShAmt,
22516 SDValue SrcOp, SDValue ShAmt,
22555 SDValue ByteShift = DAG.getTargetConstant(
22569 SDValue ShOps[4] = {ShAmt, DAG.getConstant(0, dl, SVT), DAG.getUNDEF(SVT),
22585 static SDValue getMaskNode(SDValue Mask, MVT MaskVT,
22585 static SDValue getMaskNode(SDValue Mask, MVT MaskVT,
22600 SDValue Lo, Hi;
22624 static SDValue getVectorMaskingNode(SDValue Op, SDValue Mask,
22624 static SDValue getVectorMaskingNode(SDValue Op, SDValue Mask,
22624 static SDValue getVectorMaskingNode(SDValue Op, SDValue Mask,
22625 SDValue PreservedSrc,
22636 SDValue VMask = getMaskNode(Mask, MaskVT, Subtarget, DAG, dl);
22650 static SDValue getScalarMaskingNode(SDValue Op, SDValue Mask,
22650 static SDValue getScalarMaskingNode(SDValue Op, SDValue Mask,
22650 static SDValue getScalarMaskingNode(SDValue Op, SDValue Mask,
22651 SDValue PreservedSrc,
22663 SDValue IMask = DAG.getNode(ISD::EXTRACT_SUBVECTOR, dl, MVT::v1i1,
22699 static SDValue recoverFramePointer(SelectionDAG &DAG, const Function *Fn,
22700 SDValue EntryEBP) {
22718 SDValue OffsetSymVal = DAG.getMCSymbol(OffsetSym, PtrVT);
22719 SDValue ParentFrameOffset =
22732 SDValue RegNodeBase = DAG.getNode(ISD::SUB, dl, PtrVT, EntryEBP,
22737 SDValue X86TargetLowering::LowerINTRINSIC_WO_CHAIN(SDValue Op,
22737 SDValue X86TargetLowering::LowerINTRINSIC_WO_CHAIN(SDValue Op,
22788 SDValue Rnd = Op.getOperand(2);
22800 SDValue Sae = Op.getOperand(2);
22813 SDValue Src2 = Op.getOperand(2);
22820 SDValue Rnd = Op.getOperand(3);
22834 SDValue Sae = Op.getOperand(3);
22849 SDValue Src1 = Op.getOperand(1);
22850 SDValue Src2 = Op.getOperand(2);
22851 SDValue Src3 = Op.getOperand(3);
22858 SDValue Rnd = Op.getOperand(4);
22875 SDValue Src = Op.getOperand(1);
22876 SDValue PassThru = Op.getOperand(2);
22877 SDValue Mask = Op.getOperand(3);
22883 SDValue Rnd = Op.getOperand(4);
22897 SDValue Src = Op.getOperand(1);
22898 SDValue PassThru = Op.getOperand(2);
22899 SDValue Mask = Op.getOperand(3);
22900 SDValue Rnd = Op.getOperand(4);
22914 SDValue Src1 = Op.getOperand(1);
22915 SDValue Src2 = Op.getOperand(2);
22916 SDValue passThru = Op.getOperand(3);
22917 SDValue Mask = Op.getOperand(4);
22925 SDValue Rnd = Op.getOperand(5);
22942 SDValue RoundingMode = Op.getOperand(5);
22945 SDValue Sae = Op.getOperand(6);
22956 SDValue Src1 = Op.getOperand(1);
22957 SDValue Src2 = Op.getOperand(2);
22958 SDValue passThru = Op.getOperand(3);
22959 SDValue Mask = Op.getOperand(4);
22960 SDValue Rnd = Op.getOperand(5);
22962 SDValue NewOp;
22975 SDValue Src1 = Op.getOperand(1);
22976 SDValue Src2 = Op.getOperand(2);
22977 SDValue passThru = Op.getOperand(3);
22978 SDValue Mask = Op.getOperand(4);
22979 SDValue Sae = Op.getOperand(5);
22992 SDValue Src1 = Op.getOperand(1);
22993 SDValue Src2 = Op.getOperand(2);
22994 SDValue PassThru = Op.getOperand(3);
22995 SDValue Mask = Op.getOperand(4);
22996 SDValue NewOp;
22998 SDValue Rnd = Op.getOperand(5);
23011 SDValue Src1 = Op.getOperand(1);
23012 SDValue Src2 = Op.getOperand(2);
23013 SDValue PassThru = Op.getOperand(3);
23014 SDValue Mask = Op.getOperand(4);
23018 SDValue Sae = Op.getOperand(5);
23029 SDValue Src1 = Op.getOperand(1);
23030 SDValue Src2 = Op.getOperand(2);
23031 SDValue Src3 = Op.getOperand(3);
23032 SDValue PassThru = Op.getOperand(4);
23033 SDValue Mask = Op.getOperand(5);
23034 SDValue Sae = Op.getOperand(6);
23047 SDValue Src1 = Op.getOperand(1);
23048 SDValue Src2 = Op.getOperand(2);
23049 SDValue Src3 = Op.getOperand(3);
23050 SDValue PassThru = Op.getOperand(4);
23051 SDValue Mask = Op.getOperand(5);
23055 SDValue Sae = Op.getOperand(6);
23065 SDValue Src1 = Op.getOperand(1);
23066 SDValue Src2 = Op.getOperand(2);
23067 SDValue Src3 = Op.getOperand(3);
23076 SDValue Src1 = Op.getOperand(1);
23077 SDValue Src2 = Op.getOperand(2);
23088 SDValue Src1 = Op.getOperand(1);
23089 SDValue Imm = Op.getOperand(2);
23090 SDValue Mask = Op.getOperand(3);
23091 SDValue FPclass = DAG.getNode(IntrData->Opc0, dl, MVT::v1i1, Src1, Imm);
23092 SDValue FPclassMask = getScalarMaskingNode(FPclass, Mask, SDValue(),
23096 SDValue Ins = DAG.getNode(ISD::INSERT_SUBVECTOR, dl, MVT::v8i1,
23104 SDValue CC = Op.getOperand(3);
23109 SDValue Sae = Op.getOperand(4);
23121 SDValue Src1 = Op.getOperand(1);
23122 SDValue Src2 = Op.getOperand(2);
23123 SDValue CC = Op.getOperand(3);
23124 SDValue Mask = Op.getOperand(4);
23126 SDValue Cmp;
23128 SDValue Sae = Op.getOperand(5);
23138 SDValue CmpMask = getScalarMaskingNode(Cmp, Mask, SDValue(),
23142 SDValue Ins = DAG.getNode(ISD::INSERT_SUBVECTOR, dl, MVT::v8i1,
23149 SDValue LHS = Op.getOperand(1);
23150 SDValue RHS = Op.getOperand(2);
23151 SDValue Comi = DAG.getNode(IntrData->Opc0, dl, MVT::i32, LHS, RHS);
23152 SDValue InvComi = DAG.getNode(IntrData->Opc0, dl, MVT::i32, RHS, LHS);
23153 SDValue SetCC;
23157 SDValue SetNP = getSETCC(X86::COND_NP, Comi, dl, DAG);
23163 SDValue SetP = getSETCC(X86::COND_P, Comi, dl, DAG);
23186 SDValue LHS = Op.getOperand(1);
23187 SDValue RHS = Op.getOperand(2);
23189 SDValue Sae = Op.getOperand(4);
23191 SDValue FCmp;
23202 SDValue Ins = DAG.getNode(ISD::INSERT_SUBVECTOR, dl, MVT::v16i1,
23213 SDValue Mask = Op.getOperand(3);
23214 SDValue DataToCompress = Op.getOperand(1);
23215 SDValue PassThru = Op.getOperand(2);
23228 SDValue Src1 = Op.getOperand(1);
23229 SDValue Src2 = Op.getOperand(2);
23230 SDValue Src3 = Op.getOperand(3);
23231 SDValue Imm = Op.getOperand(4);
23232 SDValue Mask = Op.getOperand(5);
23233 SDValue Passthru = (IntrData->Type == FIXUPIMM)
23239 SDValue Sae = Op.getOperand(6);
23246 SDValue FixupImm = DAG.getNode(Opc, dl, VT, Src1, Src2, Src3, Imm);
23258 SDValue RoundingMode =
23268 SDValue RoundingMode =
23279 SDValue Control = DAG.getConstant(Imm, dl, Op.getValueType());
23288 SDValue Res;
23295 SDValue GenCF = DAG.getNode(X86ISD::ADD, dl, CFVTs, Op.getOperand(1),
23300 SDValue SetCC = getSETCC(X86::COND_B, Res.getValue(1), dl, DAG);
23301 SDValue Results[] = { SetCC, Res };
23308 SDValue Src = Op.getOperand(1);
23309 SDValue PassThru = Op.getOperand(2);
23310 SDValue Mask = Op.getOperand(3);
23322 SDValue Src = Op.getOperand(1);
23323 SDValue Rnd = Op.getOperand(2);
23324 SDValue PassThru = Op.getOperand(3);
23325 SDValue Mask = Op.getOperand(4);
23338 SDValue Src = Op.getOperand(1);
23339 SDValue PassThru = Op.getOperand(2);
23340 SDValue Mask = Op.getOperand(3);
23443 SDValue LHS = Op.getOperand(1);
23444 SDValue RHS = Op.getOperand(2);
23445 SDValue Test = DAG.getNode(TestOpc, dl, MVT::i32, LHS, RHS);
23446 SDValue SetCC = getSETCC(X86CC, Test, dl, DAG);
23505 SmallVector<SDValue, 5> NewOps(Op->op_begin()+1, Op->op_end());
23507 SDValue PCMP = DAG.getNode(Opcode, dl, VTs, NewOps).getValue(2);
23508 SDValue SetCC = getSETCC(X86CC, PCMP, dl, DAG);
23520 SmallVector<SDValue, 5> NewOps(Op->op_begin()+1, Op->op_end());
23533 SmallVector<SDValue, 5> NewOps(Op->op_begin()+1, Op->op_end());
23552 SDValue Op1 = Op.getOperand(1);
23559 SDValue Result = DAG.getMCSymbol(LSDASym, VT);
23564 SDValue FnOp = Op.getOperand(1);
23565 SDValue IncomingFPOp = Op.getOperand(2);
23603 SDValue Operation =
23607 SDValue Result0 = DAG.getTargetExtractSubreg(X86::sub_mask_0, DL,
23609 SDValue Result1 = DAG.getTargetExtractSubreg(X86::sub_mask_1, DL,
23622 SDValue ShAmt = Op.getOperand(2);
23671 static SDValue getAVX2GatherNode(unsigned Opc, SDValue Op, SelectionDAG &DAG,
23671 static SDValue getAVX2GatherNode(unsigned Opc, SDValue Op, SelectionDAG &DAG,
23672 SDValue Src, SDValue Mask, SDValue Base,
23672 SDValue Src, SDValue Mask, SDValue Base,
23672 SDValue Src, SDValue Mask, SDValue Base,
23673 SDValue Index, SDValue ScaleOp, SDValue Chain,
23673 SDValue Index, SDValue ScaleOp, SDValue Chain,
23673 SDValue Index, SDValue ScaleOp, SDValue Chain,
23681 SDValue Scale = DAG.getTargetConstant(C->getZExtValue(), dl,
23693 SDValue Ops[] = {Chain, Src, Mask, Base, Index, Scale };
23694 SDValue Res = DAG.getTargetMemSDNode<X86MaskedGatherSDNode>(
23699 static SDValue getGatherNode(SDValue Op, SelectionDAG &DAG,
23699 static SDValue getGatherNode(SDValue Op, SelectionDAG &DAG,
23700 SDValue Src, SDValue Mask, SDValue Base,
23700 SDValue Src, SDValue Mask, SDValue Base,
23700 SDValue Src, SDValue Mask, SDValue Base,
23701 SDValue Index, SDValue ScaleOp, SDValue Chain,
23701 SDValue Index, SDValue ScaleOp, SDValue Chain,
23701 SDValue Index, SDValue ScaleOp, SDValue Chain,
23710 SDValue Scale = DAG.getTargetConstant(C->getZExtValue(), dl,
23730 SDValue Ops[] = {Chain, Src, Mask, Base, Index, Scale };
23731 SDValue Res = DAG.getTargetMemSDNode<X86MaskedGatherSDNode>(
23736 static SDValue getScatterNode(unsigned Opc, SDValue Op, SelectionDAG &DAG,
23736 static SDValue getScatterNode(unsigned Opc, SDValue Op, SelectionDAG &DAG,
23737 SDValue Src, SDValue Mask, SDValue Base,
23737 SDValue Src, SDValue Mask, SDValue Base,
23737 SDValue Src, SDValue Mask, SDValue Base,
23738 SDValue Index, SDValue ScaleOp, SDValue Chain,
23738 SDValue Index, SDValue ScaleOp, SDValue Chain,
23738 SDValue Index, SDValue ScaleOp, SDValue Chain,
23746 SDValue Scale = DAG.getTargetConstant(C->getZExtValue(), dl,
23760 SDValue Ops[] = {Chain, Src, Mask, Base, Index, Scale};
23761 SDValue Res = DAG.getTargetMemSDNode<X86MaskedScatterSDNode>(
23766 static SDValue getPrefetchNode(unsigned Opc, SDValue Op, SelectionDAG &DAG,
23766 static SDValue getPrefetchNode(unsigned Opc, SDValue Op, SelectionDAG &DAG,
23767 SDValue Mask, SDValue Base, SDValue Index,
23767 SDValue Mask, SDValue Base, SDValue Index,
23767 SDValue Mask, SDValue Base, SDValue Index,
23768 SDValue ScaleOp, SDValue Chain,
23768 SDValue ScaleOp, SDValue Chain,
23776 SDValue Scale = DAG.getTargetConstant(C->getZExtValue(), dl,
23778 SDValue Disp = DAG.getTargetConstant(0, dl, MVT::i32);
23779 SDValue Segment = DAG.getRegister(0, MVT::i32);
23782 SDValue VMask = getMaskNode(Mask, MaskVT, Subtarget, DAG, dl);
23783 SDValue Ops[] = {VMask, Base, Scale, Index, Disp, Segment, Chain};
23796 static SDValue expandIntrinsicWChainHelper(SDNode *N, const SDLoc &DL,
23801 SmallVectorImpl<SDValue> &Results) {
23802 SDValue Chain = N->getOperand(0);
23803 SDValue Glue;
23812 SDValue N1Ops[] = {Chain, Glue};
23818 SDValue LO, HI;
23833 SDValue Tmp = DAG.getNode(ISD::SHL, DL, MVT::i64, HI,
23841 SDValue Ops[] = { LO, HI };
23842 SDValue Pair = DAG.getNode(ISD::BUILD_PAIR, DL, MVT::i64, Ops);
23854 SmallVectorImpl<SDValue> &Results) {
23858 SDValue Glue = expandIntrinsicWChainHelper(N, DL, DAG, Opcode,
23864 SDValue Chain = Results[1];
23867 SDValue ecx = DAG.getCopyFromReg(Chain, DL, X86::ECX, MVT::i32, Glue);
23872 static SDValue LowerREADCYCLECOUNTER(SDValue Op, const X86Subtarget &Subtarget,
23872 static SDValue LowerREADCYCLECOUNTER(SDValue Op, const X86Subtarget &Subtarget,
23874 SmallVector<SDValue, 3> Results;
23881 static SDValue MarkEHRegistrationNode(SDValue Op, SelectionDAG &DAG) {
23881 static SDValue MarkEHRegistrationNode(SDValue Op, SelectionDAG &DAG) {
23883 SDValue Chain = Op.getOperand(0);
23884 SDValue RegNode = Op.getOperand(2);
23899 static SDValue MarkEHGuard(SDValue Op, SelectionDAG &DAG) {
23899 static SDValue MarkEHGuard(SDValue Op, SelectionDAG &DAG) {
23901 SDValue Chain = Op.getOperand(0);
23902 SDValue EHGuard = Op.getOperand(2);
23918 static SDValue
23919 EmitTruncSStore(bool SignedSat, SDValue Chain, const SDLoc &Dl, SDValue Val,
23919 EmitTruncSStore(bool SignedSat, SDValue Chain, const SDLoc &Dl, SDValue Val,
23920 SDValue Ptr, EVT MemVT, MachineMemOperand *MMO,
23924 SDValue Undef = DAG.getUNDEF(Ptr.getValueType());
23925 SDValue Ops[] = { Chain, Val, Ptr, Undef };
23932 static SDValue
23933 EmitMaskedTruncSStore(bool SignedSat, SDValue Chain, const SDLoc &Dl,
23934 SDValue Val, SDValue Ptr, SDValue Mask, EVT MemVT,
23934 SDValue Val, SDValue Ptr, SDValue Mask, EVT MemVT,
23934 SDValue Val, SDValue Ptr, SDValue Mask, EVT MemVT,
23938 SDValue Ops[] = { Chain, Val, Ptr, Mask };
23944 static SDValue LowerINTRINSIC_W_CHAIN(SDValue Op, const X86Subtarget &Subtarget,
23944 static SDValue LowerINTRINSIC_W_CHAIN(SDValue Op, const X86Subtarget &Subtarget,
23987 SDValue Chain = Op->getOperand(0);
24005 SDValue Operation =
24008 SDValue SetCC = getSETCC(X86::COND_B, Operation.getValue(0), dl, DAG);
24015 SDValue Chain = Op.getOperand(0);
24027 SDValue Operation = DAG.getNode(Opcode, dl, VTs, Chain, Op.getOperand(2),
24029 SDValue SetCC = getSETCC(X86::COND_E, Operation.getValue(0), dl, DAG);
24044 SDValue Result = DAG.getNode(IntrData->Opc0, dl, VTs, Op.getOperand(0));
24048 SDValue Ops[] = {DAG.getZExtOrTrunc(Result, dl, Op->getValueType(1)),
24052 SDValue isValid = DAG.getNode(X86ISD::CMOV, dl, Op->getValueType(1), Ops);
24059 SDValue Chain = Op.getOperand(0);
24060 SDValue Src = Op.getOperand(2);
24061 SDValue Base = Op.getOperand(3);
24062 SDValue Index = Op.getOperand(4);
24063 SDValue Mask = Op.getOperand(5);
24064 SDValue Scale = Op.getOperand(6);
24070 SDValue Chain = Op.getOperand(0);
24071 SDValue Src = Op.getOperand(2);
24072 SDValue Base = Op.getOperand(3);
24073 SDValue Index = Op.getOperand(4);
24074 SDValue Mask = Op.getOperand(5);
24075 SDValue Scale = Op.getOperand(6);
24081 SDValue Chain = Op.getOperand(0);
24082 SDValue Base = Op.getOperand(2);
24083 SDValue Mask = Op.getOperand(3);
24084 SDValue Index = Op.getOperand(4);
24085 SDValue Src = Op.getOperand(5);
24086 SDValue Scale = Op.getOperand(6);
24095 SDValue Chain = Op.getOperand(0);
24096 SDValue Mask = Op.getOperand(2);
24097 SDValue Index = Op.getOperand(3);
24098 SDValue Base = Op.getOperand(4);
24099 SDValue Scale = Op.getOperand(5);
24105 SmallVector<SDValue, 2> Results;
24114 SmallVector<SDValue, 2> Results;
24126 SDValue InTrans = DAG.getNode(IntrData->Opc0, dl, VTs, Op.getOperand(0));
24128 SDValue SetCC = getSETCC(X86::COND_NE, InTrans, dl, DAG);
24129 SDValue Ret = DAG.getNode(ISD::ZERO_EXTEND, dl, Op->getValueType(0), SetCC);
24136 SDValue Mask = Op.getOperand(4);
24137 SDValue DataToTruncate = Op.getOperand(3);
24138 SDValue Addr = Op.getOperand(2);
24139 SDValue Chain = Op.getOperand(0);
24154 SDValue VMask = getMaskNode(Mask, MaskVT, Subtarget, DAG, dl);
24167 SDValue VMask = getMaskNode(Mask, MaskVT, Subtarget, DAG, dl);
24179 SDValue X86TargetLowering::LowerRETURNADDR(SDValue Op,
24179 SDValue X86TargetLowering::LowerRETURNADDR(SDValue Op,
24192 SDValue FrameAddr = LowerFRAMEADDR(Op, DAG);
24194 SDValue Offset = DAG.getConstant(RegInfo->getSlotSize(), dl, PtrVT);
24201 SDValue RetAddrFI = getReturnAddressFrameIndex(DAG);
24206 SDValue X86TargetLowering::LowerADDROFRETURNADDR(SDValue Op,
24206 SDValue X86TargetLowering::LowerADDROFRETURNADDR(SDValue Op,
24212 SDValue X86TargetLowering::LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const {
24212 SDValue X86TargetLowering::LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const {
24243 SDValue FrameAddr = DAG.getCopyFromReg(DAG.getEntryNode(), dl, FrameReg, VT);
24283 SDValue X86TargetLowering::LowerFRAME_TO_ARGS_OFFSET(SDValue Op,
24283 SDValue X86TargetLowering::LowerFRAME_TO_ARGS_OFFSET(SDValue Op,
24308 SDValue X86TargetLowering::LowerEH_RETURN(SDValue Op, SelectionDAG &DAG) const {
24308 SDValue X86TargetLowering::LowerEH_RETURN(SDValue Op, SelectionDAG &DAG) const {
24309 SDValue Chain = Op.getOperand(0);
24310 SDValue Offset = Op.getOperand(1);
24311 SDValue Handler = Op.getOperand(2);
24320 SDValue Frame = DAG.getCopyFromReg(DAG.getEntryNode(), dl, FrameReg, PtrVT);
24323 SDValue StoreAddr = DAG.getNode(ISD::ADD, dl, PtrVT, Frame,
24334 SDValue X86TargetLowering::lowerEH_SJLJ_SETJMP(SDValue Op,
24334 SDValue X86TargetLowering::lowerEH_SJLJ_SETJMP(SDValue Op,
24352 SDValue X86TargetLowering::lowerEH_SJLJ_LONGJMP(SDValue Op,
24352 SDValue X86TargetLowering::lowerEH_SJLJ_LONGJMP(SDValue Op,
24359 SDValue X86TargetLowering::lowerEH_SJLJ_SETUP_DISPATCH(SDValue Op,
24359 SDValue X86TargetLowering::lowerEH_SJLJ_SETUP_DISPATCH(SDValue Op,
24366 static SDValue LowerADJUST_TRAMPOLINE(SDValue Op, SelectionDAG &DAG) {
24366 static SDValue LowerADJUST_TRAMPOLINE(SDValue Op, SelectionDAG &DAG) {
24370 SDValue X86TargetLowering::LowerINIT_TRAMPOLINE(SDValue Op,
24370 SDValue X86TargetLowering::LowerINIT_TRAMPOLINE(SDValue Op,
24372 SDValue Root = Op.getOperand(0);
24373 SDValue Trmp = Op.getOperand(1); // trampoline
24374 SDValue FPtr = Op.getOperand(2); // nested function
24375 SDValue Nest = Op.getOperand(3); // 'nest' parameter value
24382 SDValue OutChains[6];
24395 SDValue Addr = Trmp;
24481 SDValue OutChains[4];
24482 SDValue Addr, Disp;
24518 SDValue X86TargetLowering::LowerFLT_ROUNDS_(SDValue Op,
24518 SDValue X86TargetLowering::LowerFLT_ROUNDS_(SDValue Op,
24547 SDValue StackSlot =
24554 SDValue Ops[] = { DAG.getEntryNode(), StackSlot };
24555 SDValue Chain = DAG.getMemIntrinsicNode(X86ISD::FNSTCW16m, DL,
24560 SDValue CWD =
24564 SDValue CWD1 =
24569 SDValue CWD2 =
24575 SDValue RetVal =
24587 static SDValue LowerVectorIntUnary(SDValue Op, SelectionDAG &DAG) {
24587 static SDValue LowerVectorIntUnary(SDValue Op, SelectionDAG &DAG) {
24592 SDValue Src = Op.getOperand(0);
24598 SDValue Lo = extractSubVector(Src, 0, DAG, dl, SizeInBits / 2);
24599 SDValue Hi = extractSubVector(Src, NumElems / 2, DAG, dl, SizeInBits / 2);
24608 static SDValue Lower256IntUnary(SDValue Op, SelectionDAG &DAG) {
24608 static SDValue Lower256IntUnary(SDValue Op, SelectionDAG &DAG) {
24616 static SDValue Lower512IntUnary(SDValue Op, SelectionDAG &DAG) {
24616 static SDValue Lower512IntUnary(SDValue Op, SelectionDAG &DAG) {
24629 static SDValue LowerVectorCTLZ_AVX512CDI(SDValue Op, SelectionDAG &DAG,
24629 static SDValue LowerVectorCTLZ_AVX512CDI(SDValue Op, SelectionDAG &DAG,
24651 SDValue CtlzNode = DAG.getNode(ISD::CTLZ, dl, NewVT, Op);
24652 SDValue TruncNode = DAG.getNode(ISD::TRUNCATE, dl, VT, CtlzNode);
24653 SDValue Delta = DAG.getConstant(32 - EltVT.getSizeInBits(), dl, VT);
24659 static SDValue LowerVectorCTLZInRegLUT(SDValue Op, const SDLoc &DL,
24659 static SDValue LowerVectorCTLZInRegLUT(SDValue Op, const SDLoc &DL,
24673 SmallVector<SDValue, 64> LUTVec;
24676 SDValue InRegLUT = DAG.getBuildVector(CurrVT, DL, LUTVec);
24683 SDValue Op0 = DAG.getBitcast(CurrVT, Op.getOperand(0));
24684 SDValue Zero = DAG.getConstant(0, DL, CurrVT);
24686 SDValue NibbleShift = DAG.getConstant(0x4, DL, CurrVT);
24687 SDValue Lo = Op0;
24688 SDValue Hi = DAG.getNode(ISD::SRL, DL, CurrVT, Op0, NibbleShift);
24689 SDValue HiZ;
24701 SDValue Res = DAG.getNode(ISD::ADD, DL, CurrVT, Lo, Hi);
24713 SDValue Shift = DAG.getConstant(CurrScalarSizeInBits, DL, NextVT);
24730 SDValue ResNext = Res = DAG.getBitcast(NextVT, Res);
24731 SDValue R0 = DAG.getNode(ISD::SRL, DL, NextVT, ResNext, Shift);
24732 SDValue R1 = DAG.getNode(ISD::SRL, DL, NextVT, HiZ, Shift);
24741 static SDValue LowerVectorCTLZ(SDValue Op, const SDLoc &DL,
24741 static SDValue LowerVectorCTLZ(SDValue Op, const SDLoc &DL,
24763 static SDValue LowerCTLZ(SDValue Op, const X86Subtarget &Subtarget,
24763 static SDValue LowerCTLZ(SDValue Op, const X86Subtarget &Subtarget,
24787 SDValue Ops[] = {Op, DAG.getConstant(NumBits + NumBits - 1, dl, OpVT),
24802 static SDValue LowerCTTZ(SDValue Op, const X86Subtarget &Subtarget,
24802 static SDValue LowerCTTZ(SDValue Op, const X86Subtarget &Subtarget,
24806 SDValue N0 = Op.getOperand(0);
24817 SDValue Ops[] = {Op, DAG.getConstant(NumBits, dl, VT),
24825 static SDValue split256IntArith(SDValue Op, SelectionDAG &DAG) {
24825 static SDValue split256IntArith(SDValue Op, SelectionDAG &DAG) {
24835 SDValue LHS = Op.getOperand(0);
24836 SDValue LHS1 = extract128BitVector(LHS, 0, DAG, dl);
24837 SDValue LHS2 = extract128BitVector(LHS, NumElems / 2, DAG, dl);
24840 SDValue RHS = Op.getOperand(1);
24841 SDValue RHS1 = extract128BitVector(RHS, 0, DAG, dl);
24842 SDValue RHS2 = extract128BitVector(RHS, NumElems / 2, DAG, dl);
24854 static SDValue split512IntArith(SDValue Op, SelectionDAG &DAG) {
24854 static SDValue split512IntArith(SDValue Op, SelectionDAG &DAG) {
24864 SDValue LHS = Op.getOperand(0);
24865 SDValue LHS1 = extract256BitVector(LHS, 0, DAG, dl);
24866 SDValue LHS2 = extract256BitVector(LHS, NumElems / 2, DAG, dl);
24869 SDValue RHS = Op.getOperand(1);
24870 SDValue RHS1 = extract256BitVector(RHS, 0, DAG, dl);
24871 SDValue RHS2 = extract256BitVector(RHS, NumElems / 2, DAG, dl);
24881 static SDValue lowerAddSub(SDValue Op, SelectionDAG &DAG,
24881 static SDValue lowerAddSub(SDValue Op, SelectionDAG &DAG,
24897 static SDValue LowerADDSAT_SUBSAT(SDValue Op, SelectionDAG &DAG,
24897 static SDValue LowerADDSAT_SUBSAT(SDValue Op, SelectionDAG &DAG,
24900 SDValue X = Op.getOperand(0), Y = Op.getOperand(1);
24925 SDValue Add = DAG.getNode(ISD::ADD, DL, VT, X, Y);
24926 SDValue Cmp = DAG.getSetCC(DL, SetCCResultType, X, Add, ISD::SETUGT);
24931 SDValue Sub = DAG.getNode(ISD::SUB, DL, VT, X, Y);
24932 SDValue Cmp = DAG.getSetCC(DL, SetCCResultType, X, Y, ISD::SETUGT);
24945 static SDValue LowerABS(SDValue Op, const X86Subtarget &Subtarget,
24945 static SDValue LowerABS(SDValue Op, const X86Subtarget &Subtarget,
24952 SDValue N0 = Op.getOperand(0);
24953 SDValue Neg = DAG.getNode(X86ISD::SUB, DL, DAG.getVTList(VT, MVT::i32),
24955 SDValue Ops[] = {N0, Neg, DAG.getTargetConstant(X86::COND_GE, DL, MVT::i8),
24963 SDValue Src = Op.getOperand(0);
24964 SDValue Sub =
24979 static SDValue LowerMINMAX(SDValue Op, SelectionDAG &DAG) {
24979 static SDValue LowerMINMAX(SDValue Op, SelectionDAG &DAG) {
24988 SDValue N0 = Op.getOperand(0);
24989 SDValue N1 = Op.getOperand(1);
24996 SDValue Sign = DAG.getConstant(APInt::getSignedMinValue(16), DL, VT);
25000 SDValue Result = DAG.getNode(Opcode, DL, VT, N0, N1);
25014 SDValue Cond = DAG.getSetCC(DL, VT, N0, N1, CC);
25018 static SDValue LowerMUL(SDValue Op, const X86Subtarget &Subtarget,
25018 static SDValue LowerMUL(SDValue Op, const X86Subtarget &Subtarget,
25030 SDValue A = Op.getOperand(0);
25031 SDValue B = Op.getOperand(1);
25054 SDValue Undef = DAG.getUNDEF(VT);
25055 SDValue ALo = DAG.getBitcast(ExVT, getUnpackl(DAG, dl, VT, A, Undef));
25056 SDValue AHi = DAG.getBitcast(ExVT, getUnpackh(DAG, dl, VT, A, Undef));
25058 SDValue BLo, BHi;
25061 SmallVector<SDValue, 16> LoOps, HiOps;
25079 SDValue RLo = DAG.getNode(ISD::MUL, dl, ExVT, ALo, BLo);
25080 SDValue RHi = DAG.getNode(ISD::MUL, dl, ExVT, AHi, BHi);
25093 SDValue Aodds = DAG.getVectorShuffle(VT, dl, A, A, UnpackMask);
25094 SDValue Bodds = DAG.getVectorShuffle(VT, dl, B, B, UnpackMask);
25097 SDValue Evens = DAG.getNode(X86ISD::PMULUDQ, dl, MVT::v2i64,
25101 SDValue Odds = DAG.getNode(X86ISD::PMULUDQ, dl, MVT::v2i64,
25138 SDValue Zero = DAG.getConstant(0, dl, VT);
25141 SDValue AloBlo = Zero;
25145 SDValue AloBhi = Zero;
25147 SDValue Bhi = getTargetVShiftByConstNode(X86ISD::VSRLI, dl, VT, B, 32, DAG);
25151 SDValue AhiBlo = Zero;
25153 SDValue Ahi = getTargetVShiftByConstNode(X86ISD::VSRLI, dl, VT, A, 32, DAG);
25157 SDValue Hi = DAG.getNode(ISD::ADD, dl, VT, AloBhi, AhiBlo);
25163 static SDValue LowerMULH(SDValue Op, const X86Subtarget &Subtarget,
25163 static SDValue LowerMULH(SDValue Op, const X86Subtarget &Subtarget,
25169 SDValue A = Op.getOperand(0);
25170 SDValue B = Op.getOperand(1);
25196 SDValue Odd0 = DAG.getVectorShuffle(VT, dl, A, A,
25199 SDValue Odd1 = DAG.getVectorShuffle(VT, dl, B, B,
25209 SDValue Mul1 = DAG.getBitcast(VT, DAG.getNode(Opcode, dl, MulVT,
25214 SDValue Mul2 = DAG.getBitcast(VT, DAG.getNode(Opcode, dl, MulVT,
25223 SDValue Res = DAG.getVectorShuffle(VT, dl, Mul1, Mul2, ShufMask);
25228 SDValue Zero = DAG.getConstant(0, dl, VT);
25229 SDValue T1 = DAG.getNode(ISD::AND, dl, VT,
25231 SDValue T2 = DAG.getNode(ISD::AND, dl, VT,
25234 SDValue Fixup = DAG.getNode(ISD::ADD, dl, VT, T1, T2);
25256 SDValue ExA = DAG.getNode(ExAVX, dl, ExVT, A);
25257 SDValue ExB = DAG.getNode(ExAVX, dl, ExVT, B);
25258 SDValue Mul = DAG.getNode(ISD::MUL, dl, ExVT, ExA, ExB);
25271 SDValue ALo = extract128BitVector(A, 0, DAG, dl);
25272 SDValue BLo = extract128BitVector(B, 0, DAG, dl);
25273 SDValue AHi = extract128BitVector(A, NumElts / 2, DAG, dl);
25274 SDValue BHi = extract128BitVector(B, NumElts / 2, DAG, dl);
25279 SDValue Lo = DAG.getNode(ISD::MUL, dl, ExVT, ALo, BLo);
25280 SDValue Hi = DAG.getNode(ISD::MUL, dl, ExVT, AHi, BHi);
25311 SDValue ALo, AHi;
25330 SDValue BLo, BHi;
25333 SmallVector<SDValue, 16> LoOps, HiOps;
25336 SDValue LoOp = B.getOperand(i + j);
25337 SDValue HiOp = B.getOperand(i + j + 8);
25374 SDValue RLo = DAG.getNode(ISD::MUL, dl, ExVT, ALo, BLo);
25375 SDValue RHi = DAG.getNode(ISD::MUL, dl, ExVT, AHi, BHi);
25383 SDValue X86TargetLowering::LowerWin64_i128OP(SDValue Op, SelectionDAG &DAG) const {
25383 SDValue X86TargetLowering::LowerWin64_i128OP(SDValue Op, SelectionDAG &DAG) const {
25402 SDValue InChain = DAG.getEntryNode();
25410 SDValue StackPtr = DAG.CreateStackTemporary(ArgVT, 16);
25421 SDValue Callee = DAG.getExternalSymbol(getLibcallName(LC),
25435 std::pair<SDValue, SDValue> CallInfo = LowerCallTo(CLI);
25435 std::pair<SDValue, SDValue> CallInfo = LowerCallTo(CLI);
25486 static SDValue LowerScalarImmediateShift(SDValue Op, SelectionDAG &DAG,
25486 static SDValue LowerScalarImmediateShift(SDValue Op, SelectionDAG &DAG,
25490 SDValue R = Op.getOperand(0);
25491 SDValue Amt = Op.getOperand(1);
25497 SDValue Ex = DAG.getBitcast(ExVT, R);
25508 SDValue Upper =
25510 SDValue Lower = getTargetVShiftByConstNode(X86ISD::VSRAI, dl, ExVT, Ex,
25519 SDValue Upper = getTargetVShiftByConstNode(X86ISD::VSRAI, dl, ExVT, Ex,
25521 SDValue Lower =
25564 SDValue Zeros = DAG.getConstant(0, dl, VT);
25567 SDValue CMP = DAG.getSetCC(dl, MVT::v64i1, Zeros, R, ISD::SETGT);
25579 SDValue SHL = getTargetVShiftByConstNode(X86ISD::VSHLI, dl, ShiftVT, R,
25588 SDValue SRL = getTargetVShiftByConstNode(X86ISD::VSRLI, dl, ShiftVT, R,
25597 SDValue Res = DAG.getNode(ISD::SRL, dl, VT, R, Amt);
25599 SDValue Mask = DAG.getConstant(128 >> ShiftAmt, dl, VT);
25610 static SDValue LowerScalarVariableShift(SDValue Op, SelectionDAG &DAG,
25610 static SDValue LowerScalarVariableShift(SDValue Op, SelectionDAG &DAG,
25614 SDValue R = Op.getOperand(0);
25615 SDValue Amt = Op.getOperand(1);
25620 if (SDValue BaseShAmt = DAG.getSplatValue(Amt)) {
25646 SDValue BitMask = DAG.getConstant(-1, dl, ExtVT);
25656 SDValue Res = getTargetVShiftNode(LogicalX86Op, dl, ExtVT,
25665 SDValue SignMask = DAG.getConstant(0x8080, dl, ExtVT);
25682 std::vector<SDValue> Vals(Ratio);
25698 static SDValue convertShiftLeftToScale(SDValue Amt, const SDLoc &dl,
25698 static SDValue convertShiftLeftToScale(SDValue Amt, const SDLoc &dl,
25708 SmallVector<SDValue, 8> Elts;
25715 SDValue Op = Amt->getOperand(i);
25745 SDValue Z = DAG.getConstant(0, dl, VT);
25746 SDValue Lo = DAG.getBitcast(MVT::v4i32, getUnpackl(DAG, dl, VT, Amt, Z));
25747 SDValue Hi = DAG.getBitcast(MVT::v4i32, getUnpackh(DAG, dl, VT, Amt, Z));
25761 static SDValue LowerShift(SDValue Op, const X86Subtarget &Subtarget,
25761 static SDValue LowerShift(SDValue Op, const X86Subtarget &Subtarget,
25765 SDValue R = Op.getOperand(0);
25766 SDValue Amt = Op.getOperand(1);
25777 if (SDValue V = LowerScalarImmediateShift(Op, DAG, Subtarget))
25780 if (SDValue V = LowerScalarVariableShift(Op, DAG, Subtarget))
25791 SDValue Zero = DAG.getConstant(0, dl, VT);
25804 SDValue Amt0 = DAG.getVectorShuffle(VT, dl, Amt, Amt, {0, 0});
25805 SDValue Amt1 = DAG.getVectorShuffle(VT, dl, Amt, Amt, {1, 1});
25806 SDValue R0 = DAG.getNode(Opc, dl, VT, R, Amt0);
25807 SDValue R1 = DAG.getNode(Opc, dl, VT, R, Amt1);
25816 SDValue S = DAG.getConstant(APInt::getSignMask(64), dl, VT);
25817 SDValue M = DAG.getNode(ISD::SRL, dl, VT, S, Amt);
25836 SDValue Amt1, Amt2;
25840 SDValue A = Amt->getOperand(i);
25868 SDValue Shift1 = getTargetVShiftByConstNode(X86OpcI, dl, VT, R,
25870 SDValue Shift2 = getTargetVShiftByConstNode(X86OpcI, dl, VT, R,
25880 if (SDValue Scale = convertShiftLeftToScale(Amt, dl, Subtarget, DAG))
25887 SDValue EltBits = DAG.getConstant(EltSizeInBits, dl, VT);
25888 SDValue RAmt = DAG.getNode(ISD::SUB, dl, VT, EltBits, Amt);
25889 if (SDValue Scale = convertShiftLeftToScale(RAmt, dl, Subtarget, DAG)) {
25890 SDValue Zero = DAG.getConstant(0, dl, VT);
25891 SDValue ZAmt = DAG.getSetCC(dl, VT, Amt, Zero, ISD::SETEQ);
25892 SDValue Res = DAG.getNode(ISD::MULHU, dl, VT, R, Scale);
25906 SDValue EltBits = DAG.getConstant(EltSizeInBits, dl, VT);
25907 SDValue RAmt = DAG.getNode(ISD::SUB, dl, VT, EltBits, Amt);
25908 if (SDValue Scale = convertShiftLeftToScale(RAmt, dl, Subtarget, DAG)) {
25909 SDValue Amt0 =
25911 SDValue Amt1 =
25913 SDValue Sra1 =
25915 SDValue Res = DAG.getNode(ISD::MULHS, dl, VT, R, Scale);
25927 SDValue Amt0, Amt1, Amt2, Amt3;
25939 SDValue Z = DAG.getConstant(0, dl, VT);
25945 SDValue Amt01 = DAG.getBitcast(MVT::v8i16, Amt);
25946 SDValue Amt23 = DAG.getVectorShuffle(MVT::v8i16, dl, Amt01, Amt01,
25960 SDValue R0 = DAG.getNode(ShOpc, dl, VT, R, DAG.getBitcast(VT, Amt0));
25961 SDValue R1 = DAG.getNode(ShOpc, dl, VT, R, DAG.getBitcast(VT, Amt1));
25962 SDValue R2 = DAG.getNode(ShOpc, dl, VT, R, DAG.getBitcast(VT, Amt2));
25963 SDValue R3 = DAG.getNode(ShOpc, dl, VT, R, DAG.getBitcast(VT, Amt3));
25968 SDValue R02 = DAG.getVectorShuffle(VT, dl, R0, R2, {0, -1, 6, -1});
25969 SDValue R13 = DAG.getVectorShuffle(VT, dl, R1, R3, {-1, 1, -1, 7});
25972 SDValue R01 = DAG.getVectorShuffle(VT, dl, R0, R1, {0, -1, -1, 5});
25973 SDValue R23 = DAG.getVectorShuffle(VT, dl, R2, R3, {2, -1, -1, 7});
26004 SDValue Cst8 = DAG.getTargetConstant(8, dl, MVT::i8);
26023 SmallVector<SDValue, 16> LoAmt, HiAmt;
26032 SDValue LoA = DAG.getBuildVector(VT16, dl, LoAmt);
26033 SDValue HiA = DAG.getBuildVector(VT16, dl, HiAmt);
26035 SDValue LoR = DAG.getBitcast(VT16, getUnpackl(DAG, dl, VT, R, R));
26036 SDValue HiR = DAG.getBitcast(VT16, getUnpackh(DAG, dl, VT, R, R));
26074 SDValue Z = DAG.getConstant(0, dl, SelVT);
26075 SDValue C = DAG.getNode(X86ISD::PCMPGT, dl, SelVT, Z, Sel);
26088 SDValue M = DAG.getNode(Opc, dl, VT, R, DAG.getConstant(4, dl, VT));
26111 SDValue ALo = getUnpackl(DAG, dl, VT, DAG.getUNDEF(VT), Amt);
26112 SDValue AHi = getUnpackh(DAG, dl, VT, DAG.getUNDEF(VT), Amt);
26113 SDValue RLo = getUnpackl(DAG, dl, VT, DAG.getUNDEF(VT), R);
26114 SDValue RHi = getUnpackh(DAG, dl, VT, DAG.getUNDEF(VT), R);
26121 SDValue MLo = getTargetVShiftByConstNode(X86OpcI, dl, ExtVT, RLo, 4, DAG);
26122 SDValue MHi = getTargetVShiftByConstNode(X86OpcI, dl, ExtVT, RHi, 4, DAG);
26156 SDValue Z = DAG.getConstant(0, dl, VT);
26157 SDValue ALo = getUnpackl(DAG, dl, VT, Amt, Z);
26158 SDValue AHi = getUnpackh(DAG, dl, VT, Amt, Z);
26159 SDValue RLo = getUnpackl(DAG, dl, VT, Z, R);
26160 SDValue RHi = getUnpackh(DAG, dl, VT, Z, R);
26165 SDValue Lo = DAG.getNode(Opc, dl, ExtVT, RLo, ALo);
26166 SDValue Hi = DAG.getNode(Opc, dl, ExtVT, RHi, AHi);
26191 SDValue C =
26209 SDValue M = getTargetVShiftByConstNode(X86OpcI, dl, VT, R, 8, DAG);
26242 static SDValue LowerRotate(SDValue Op, const X86Subtarget &Subtarget,
26242 static SDValue LowerRotate(SDValue Op, const X86Subtarget &Subtarget,
26248 SDValue R = Op.getOperand(0);
26249 SDValue Amt = Op.getOperand(1);
26340 SDValue Z = DAG.getConstant(0, DL, SelVT);
26341 SDValue C = DAG.getNode(X86ISD::PCMPGT, DL, SelVT, Z, Sel);
26353 SDValue M;
26392 SDValue AmtR = DAG.getConstant(EltSizeInBits, DL, VT);
26394 SDValue SHL = DAG.getNode(ISD::SHL, DL, VT, R, Amt);
26395 SDValue SRL = DAG.getNode(ISD::SRL, DL, VT, R, AmtR);
26400 SDValue Scale = convertShiftLeftToScale(Amt, DL, Subtarget, DAG);
26405 SDValue Lo = DAG.getNode(ISD::MUL, DL, VT, R, Scale);
26406 SDValue Hi = DAG.getNode(ISD::MULHU, DL, VT, R, Scale);
26415 SDValue R13 = DAG.getVectorShuffle(VT, DL, R, R, OddMask);
26416 SDValue Scale13 = DAG.getVectorShuffle(VT, DL, Scale, Scale, OddMask);
26418 SDValue Res02 = DAG.getNode(X86ISD::PMULUDQ, DL, MVT::v2i64,
26421 SDValue Res13 = DAG.getNode(X86ISD::PMULUDQ, DL, MVT::v2i64,
26605 static SDValue emitLockedStackOp(SelectionDAG &DAG,
26607 SDValue Chain, SDLoc DL) {
26637 SDValue Zero = DAG.getTargetConstant(0, DL, MVT::i32);
26638 SDValue Ops[] = {
26651 SDValue Zero = DAG.getTargetConstant(0, DL, MVT::i32);
26652 SDValue Ops[] = {
26666 static SDValue LowerATOMIC_FENCE(SDValue Op, const X86Subtarget &Subtarget,
26666 static SDValue LowerATOMIC_FENCE(SDValue Op, const X86Subtarget &Subtarget,
26681 SDValue Chain = Op.getOperand(0);
26689 static SDValue LowerCMP_SWAP(SDValue Op, const X86Subtarget &Subtarget,
26689 static SDValue LowerCMP_SWAP(SDValue Op, const X86Subtarget &Subtarget,
26705 SDValue cpIn = DAG.getCopyToReg(Op.getOperand(0), DL, Reg,
26707 SDValue Ops[] = { cpIn.getValue(0),
26714 SDValue Result = DAG.getMemIntrinsicNode(X86ISD::LCMPXCHG_DAG, DL, Tys,
26717 SDValue cpOut =
26719 SDValue EFLAGS = DAG.getCopyFromReg(cpOut.getValue(1), DL, X86::EFLAGS,
26721 SDValue Success = getSETCC(X86::COND_E, EFLAGS, DL, DAG);
26728 static SDValue getPMOVMSKB(const SDLoc &DL, SDValue V, SelectionDAG &DAG,
26728 static SDValue getPMOVMSKB(const SDLoc &DL, SDValue V, SelectionDAG &DAG,
26733 SDValue Lo, Hi;
26744 SDValue Lo, Hi;
26756 static SDValue LowerBITCAST(SDValue Op, const X86Subtarget &Subtarget,
26756 static SDValue LowerBITCAST(SDValue Op, const X86Subtarget &Subtarget,
26758 SDValue Src = Op.getOperand(0);
26768 SDValue Lo = DAG.getNode(ISD::EXTRACT_ELEMENT, dl, MVT::i32, Src,
26771 SDValue Hi = DAG.getNode(ISD::EXTRACT_ELEMENT, dl, MVT::i32, Src,
26781 SDValue Lo, Hi;
26794 SDValue V = DAG.getSExtOrTrunc(Src, DL, SExtVT);
26838 static SDValue LowerHorizontalByteSum(SDValue V, MVT VT,
26838 static SDValue LowerHorizontalByteSum(SDValue V, MVT VT,
26854 SDValue Zeros = DAG.getConstant(0, DL, ByteVecVT);
26866 SDValue Zeros = DAG.getConstant(0, DL, VT);
26867 SDValue V32 = DAG.getBitcast(VT, V);
26868 SDValue Low = getUnpackl(DAG, DL, VT, V32, Zeros);
26869 SDValue High = getUnpackh(DAG, DL, VT, V32, Zeros);
26895 SDValue ShifterV = DAG.getConstant(8, DL, VT);
26896 SDValue Shl = DAG.getNode(ISD::SHL, DL, VT, DAG.getBitcast(VT, V), ShifterV);
26902 static SDValue LowerVectorCTPOPInRegLUT(SDValue Op, const SDLoc &DL,
26902 static SDValue LowerVectorCTPOPInRegLUT(SDValue Op, const SDLoc &DL,
26926 SmallVector<SDValue, 64> LUTVec;
26929 SDValue InRegLUT = DAG.getBuildVector(VT, DL, LUTVec);
26930 SDValue M0F = DAG.getConstant(0x0F, DL, VT);
26933 SDValue FourV = DAG.getConstant(4, DL, VT);
26934 SDValue HiNibbles = DAG.getNode(ISD::SRL, DL, VT, Op, FourV);
26937 SDValue LoNibbles = DAG.getNode(ISD::AND, DL, VT, Op, M0F);
26942 SDValue HiPopCnt = DAG.getNode(X86ISD::PSHUFB, DL, VT, InRegLUT, HiNibbles);
26943 SDValue LoPopCnt = DAG.getNode(X86ISD::PSHUFB, DL, VT, InRegLUT, LoNibbles);
26949 static SDValue LowerVectorCTPOP(SDValue Op, const X86Subtarget &Subtarget,
26949 static SDValue LowerVectorCTPOP(SDValue Op, const X86Subtarget &Subtarget,
26955 SDValue Op0 = Op.getOperand(0);
26981 SDValue ByteOp = DAG.getBitcast(ByteVT, Op0);
26982 SDValue PopCnt8 = DAG.getNode(ISD::CTPOP, DL, ByteVT, ByteOp);
26993 static SDValue LowerCTPOP(SDValue Op, const X86Subtarget &Subtarget,
26993 static SDValue LowerCTPOP(SDValue Op, const X86Subtarget &Subtarget,
27000 static SDValue LowerBITREVERSE_XOP(SDValue Op, SelectionDAG &DAG) {
27000 static SDValue LowerBITREVERSE_XOP(SDValue Op, SelectionDAG &DAG) {
27002 SDValue In = Op.getOperand(0);
27009 SDValue Res = DAG.getNode(ISD::SCALAR_TO_VECTOR, DL, VecVT, In);
27029 SmallVector<SDValue, 16> MaskElts;
27038 SDValue Mask = DAG.getBuildVector(MVT::v16i8, DL, MaskElts);
27039 SDValue Res = DAG.getBitcast(MVT::v16i8, In);
27045 static SDValue LowerBITREVERSE(SDValue Op, const X86Subtarget &Subtarget,
27045 static SDValue LowerBITREVERSE(SDValue Op, const X86Subtarget &Subtarget,
27054 SDValue In = Op.getOperand(0);
27075 SDValue NibbleMask = DAG.getConstant(0xF, DL, VT);
27076 SDValue Lo = DAG.getNode(ISD::AND, DL, VT, In, NibbleMask);
27077 SDValue Hi = DAG.getNode(ISD::SRL, DL, VT, In, DAG.getConstant(4, DL, VT));
27090 SmallVector<SDValue, 16> LoMaskElts, HiMaskElts;
27096 SDValue LoMask = DAG.getBuildVector(VT, DL, LoMaskElts);
27097 SDValue HiMask = DAG.getBuildVector(VT, DL, HiMaskElts);
27103 static SDValue lowerAtomicArithWithLOCK(SDValue N, SelectionDAG &DAG,
27103 static SDValue lowerAtomicArithWithLOCK(SDValue N, SelectionDAG &DAG,
27135 static SDValue lowerAtomicArith(SDValue N, SelectionDAG &DAG,
27135 static SDValue lowerAtomicArith(SDValue N, SelectionDAG &DAG,
27138 SDValue Chain = N->getOperand(0);
27139 SDValue LHS = N->getOperand(1);
27140 SDValue RHS = N->getOperand(2);
27177 SDValue NewChain = emitLockedStackOp(DAG, Subtarget, Chain, DL);
27184 SDValue NewChain = DAG.getNode(X86ISD::MEMBARRIER, DL, MVT::Other, Chain);
27191 SDValue LockOp = lowerAtomicArithWithLOCK(N, DAG, Subtarget);
27199 static SDValue LowerATOMIC_STORE(SDValue Op, SelectionDAG &DAG,
27199 static SDValue LowerATOMIC_STORE(SDValue Op, SelectionDAG &DAG,
27222 SDValue SclToVec = DAG.getNode(ISD::SCALAR_TO_VECTOR, dl, MVT::v2i64,
27225 SDValue Ops[] = { Node->getChain(), SclToVec, Node->getBasePtr() };
27226 SDValue Chain = DAG.getMemIntrinsicNode(X86ISD::VEXTRACT_STORE, dl, Tys,
27242 SDValue Swap = DAG.getAtomic(ISD::ATOMIC_SWAP, dl,
27250 static SDValue LowerADDSUBCARRY(SDValue Op, SelectionDAG &DAG) {
27250 static SDValue LowerADDSUBCARRY(SDValue Op, SelectionDAG &DAG) {
27262 SDValue Carry = Op.getOperand(2);
27269 SDValue Sum = DAG.getNode(Opc, DL, VTs, Op.getOperand(0),
27272 SDValue SetCC = getSETCC(X86::COND_B, Sum.getValue(1), DL, DAG);
27279 static SDValue LowerFSINCOS(SDValue Op, const X86Subtarget &Subtarget,
27279 static SDValue LowerFSINCOS(SDValue Op, const X86Subtarget &Subtarget,
27287 SDValue Arg = Op.getOperand(0);
27307 SDValue Callee =
27318 std::pair<SDValue, SDValue> CallResult = TLI.LowerCallTo(CLI);
27318 std::pair<SDValue, SDValue> CallResult = TLI.LowerCallTo(CLI);
27325 SDValue SinVal = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, ArgVT,
27327 SDValue CosVal = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, ArgVT,
27335 static SDValue ExtendToType(SDValue InOp, MVT NVT, SelectionDAG &DAG,
27335 static SDValue ExtendToType(SDValue InOp, MVT NVT, SelectionDAG &DAG,
27356 SDValue N1 = InOp.getOperand(1);
27366 SmallVector<SDValue, 16> Ops;
27372 SDValue FillVal = FillWithZeroes ? DAG.getConstant(0, dl, EltVT) :
27378 SDValue FillVal = FillWithZeroes ? DAG.getConstant(0, dl, NVT) :
27384 static SDValue LowerMSCATTER(SDValue Op, const X86Subtarget &Subtarget,
27384 static SDValue LowerMSCATTER(SDValue Op, const X86Subtarget &Subtarget,
27390 SDValue Src = N->getValue();
27395 SDValue Scale = N->getScale();
27396 SDValue Index = N->getIndex();
27397 SDValue Mask = N->getMask();
27398 SDValue Chain = N->getChain();
27399 SDValue BasePtr = N->getBasePtr();
27409 SDValue Ops[] = {Chain, Src, Mask, BasePtr, Index, Scale};
27410 SDValue NewScatter = DAG.getTargetMemSDNode<X86MaskedScatterSDNode>(
27444 SDValue Ops[] = {Chain, Src, Mask, BasePtr, Index, Scale};
27445 SDValue NewScatter = DAG.getTargetMemSDNode<X86MaskedScatterSDNode>(
27450 static SDValue LowerMLOAD(SDValue Op, const X86Subtarget &Subtarget,
27450 static SDValue LowerMLOAD(SDValue Op, const X86Subtarget &Subtarget,
27456 SDValue Mask = N->getMask();
27458 SDValue PassThru = N->getPassThru();
27467 SDValue NewLoad = DAG.getMaskedLoad(VT, dl, N->getChain(),
27474 SDValue Select = DAG.getNode(ISD::VSELECT, dl, MaskVT, Mask, NewLoad,
27506 SDValue NewLoad = DAG.getMaskedLoad(WideDataVT, dl, N->getChain(),
27512 SDValue Exract = DAG.getNode(ISD::EXTRACT_SUBVECTOR, dl, VT,
27515 SDValue RetOps[] = {Exract, NewLoad.getValue(1)};
27519 static SDValue LowerMSTORE(SDValue Op, const X86Subtarget &Subtarget,
27519 static SDValue LowerMSTORE(SDValue Op, const X86Subtarget &Subtarget,
27522 SDValue DataToStore = N->getValue();
27525 SDValue Mask = N->getMask();
27560 static SDValue LowerMGATHER(SDValue Op, const X86Subtarget &Subtarget,
27560 static SDValue LowerMGATHER(SDValue Op, const X86Subtarget &Subtarget,
27568 SDValue Index = N->getIndex();
27569 SDValue Mask = N->getMask();
27570 SDValue PassThru = N->getPassThru();
27600 SDValue Ops[] = { N->getChain(), PassThru, Mask, N->getBasePtr(), Index,
27602 SDValue NewGather = DAG.getTargetMemSDNode<X86MaskedGatherSDNode>(
27605 SDValue Extract = DAG.getNode(ISD::EXTRACT_SUBVECTOR, dl, OrigVT,
27610 SDValue X86TargetLowering::LowerGC_TRANSITION_START(SDValue Op,
27610 SDValue X86TargetLowering::LowerGC_TRANSITION_START(SDValue Op,
27618 SmallVector<SDValue, 2> Ops;
27626 SDValue NOOP(DAG.getMachineNode(X86::NOOP, SDLoc(Op), VTs, Ops), 0);
27631 SDValue X86TargetLowering::LowerGC_TRANSITION_END(SDValue Op,
27631 SDValue X86TargetLowering::LowerGC_TRANSITION_END(SDValue Op,
27639 SmallVector<SDValue, 2> Ops;
27647 SDValue NOOP(DAG.getMachineNode(X86::NOOP, SDLoc(Op), VTs, Ops), 0);
27652 SDValue X86TargetLowering::LowerF128Call(SDValue Op, SelectionDAG &DAG,
27652 SDValue X86TargetLowering::LowerF128Call(SDValue Op, SelectionDAG &DAG,
27654 SmallVector<SDValue, 2> Ops(Op->op_begin(), Op->op_end());
27660 SDValue X86TargetLowering::LowerOperation(SDValue Op, SelectionDAG &DAG) const {
27660 SDValue X86TargetLowering::LowerOperation(SDValue Op, SelectionDAG &DAG) const {
27791 SmallVectorImpl<SDValue> &Results,
27793 SDValue Res = LowerOperation(SDValue(N, 0), DAG);
27818 SmallVectorImpl<SDValue>&Results,
27835 SDValue Wide =
27855 SDValue Op0 = DAG.getNode(ISD::ANY_EXTEND, dl, MulVT, N->getOperand(0));
27856 SDValue Op1 = DAG.getNode(ISD::ANY_EXTEND, dl, MulVT, N->getOperand(1));
27857 SDValue Res = DAG.getNode(ISD::MUL, dl, MulVT, Op0, Op1);
27860 SmallVector<SDValue, 8> ConcatOps(NumConcats, DAG.getUNDEF(VT));
27887 SmallVector<SDValue, 16> Ops(NumConcat, DAG.getUNDEF(InVT));
27889 SDValue InVec0 = DAG.getNode(ISD::CONCAT_VECTORS, dl, InWideVT, Ops);
27891 SDValue InVec1 = DAG.getNode(ISD::CONCAT_VECTORS, dl, InWideVT, Ops);
27893 SDValue Res = DAG.getNode(N->getOpcode(), dl, WideVT, InVec0, InVec1);
27902 SDValue Lo, Hi, Tmp;
27929 SDValue UNDEF = DAG.getUNDEF(VT);
27930 SDValue LHS = DAG.getNode(ISD::CONCAT_VECTORS, dl, MVT::v4f32,
27932 SDValue RHS = DAG.getNode(ISD::CONCAT_VECTORS, dl, MVT::v4f32,
27951 SmallVector<SDValue, 8> Ops0(NumConcats, DAG.getUNDEF(VT));
27954 SDValue N0 = DAG.getNode(ISD::CONCAT_VECTORS, dl, ResVT, Ops0);
27955 SDValue N1 = DAG.getConstant(SplatVal, dl, ResVT);
27956 SDValue Res = DAG.getNode(N->getOpcode(), dl, ResVT, N0, N1);
27966 SDValue V = LowerWin64_i128OP(SDValue(N,0), DAG);
27979 SDValue In = N->getOperand(0);
27990 SmallVector<SDValue, 16> Ops(WidenNumElts, DAG.getUNDEF(EltVT));
27995 SDValue Val = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, InEltVT, In,
28024 SDValue Lo, Hi;
28029 SDValue Res = DAG.getVectorShuffle(MVT::v16i8, dl, Lo, Hi,
28047 SDValue In = N->getOperand(0);
28061 SDValue Zero = DAG.getConstant(0, dl, MVT::v4i32);
28062 SDValue SignBits = DAG.getSetCC(dl, MVT::v4i32, Zero, In, ISD::SETGT);
28066 SDValue Lo = DAG.getVectorShuffle(MVT::v4i32, dl, In, SignBits,
28069 SDValue Hi = DAG.getVectorShuffle(MVT::v4i32, dl, In, SignBits,
28073 SDValue Res = DAG.getNode(ISD::CONCAT_VECTORS, dl, VT, Lo, Hi);
28099 SDValue Lo = getExtendInVec(N->getOpcode(), dl, LoVT, In, DAG);
28108 SDValue Hi = DAG.getVectorShuffle(InVT, dl, In, In, ShufMask);
28111 SDValue Res = DAG.getNode(ISD::CONCAT_VECTORS, dl, VT, Lo, Hi);
28120 SDValue Src = N->getOperand(0);
28131 SDValue Res = DAG.getNode(ISD::FP_TO_SINT, dl, PromoteVT, Src);
28148 SmallVector<SDValue, 8> ConcatOps(NumConcats, DAG.getUNDEF(VT));
28171 SDValue Res = DAG.getNode(Opc, dl, MVT::v4i32, Src);
28193 SDValue ZeroIdx = DAG.getIntPtrConstant(0, dl);
28194 SDValue Res = DAG.getNode(ISD::INSERT_VECTOR_ELT, dl, VecInVT,
28203 if (SDValue V = FP_TO_INTHelper(SDValue(N, 0), DAG, IsSigned))
28209 SDValue Src = N->getOperand(0);
28220 SDValue Src = N->getOperand(0);
28228 SDValue ZExtIn = DAG.getNode(ISD::ZERO_EXTEND, dl, MVT::v2i64, Src);
28229 SDValue VBias =
28231 SDValue Or = DAG.getNode(ISD::OR, dl, MVT::v2i64, ZExtIn,
28235 SDValue Sub = DAG.getNode(ISD::FSUB, dl, MVT::v2f64, Or, VBias);
28242 SDValue V = DAG.getNode(X86ISD::VFPROUND, dl, MVT::v4f32, N->getOperand(0));
28284 SDValue cpInL, cpInH;
28295 SDValue swapInL, swapInH;
28310 SDValue Result;
28326 SDValue RBXSave = DAG.getCopyFromReg(swapInH.getValue(0), dl,
28329 SDValue Ops[] = {/*Chain*/ RBXSave.getValue(1), N->getOperand(1), swapInL,
28339 SDValue Ops[] = {swapInL.getValue(0), N->getOperand(1),
28343 SDValue cpOutL = DAG.getCopyFromReg(Result.getValue(0), dl,
28346 SDValue cpOutH = DAG.getCopyFromReg(cpOutL.getValue(1), dl,
28349 SDValue OpsF[] = { cpOutL.getValue(0), cpOutH.getValue(0)};
28351 SDValue EFLAGS = DAG.getCopyFromReg(cpOutH.getValue(1), dl, X86::EFLAGS,
28353 SDValue Success = getSETCC(X86::COND_E, EFLAGS, dl, DAG);
28372 SDValue Ops[] = { Node->getChain(), Node->getBasePtr() };
28373 SDValue Ld = DAG.getMemIntrinsicNode(X86ISD::VZEXT_LOAD, dl, Tys, Ops,
28375 SDValue Res = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, MVT::i64, Ld,
28386 SDValue Ops[] = { Node->getChain(), Node->getBasePtr() };
28387 SDValue Result = DAG.getMemIntrinsicNode(X86ISD::FILD_FLAG,
28390 SDValue Chain = Result.getValue(1);
28391 SDValue InFlag = Result.getValue(2);
28397 SDValue StackPtr = DAG.CreateStackTemporary(MVT::i64);
28401 SDValue StoreOps[] = { Chain, Result, StackPtr, InFlag };
28445 SDValue Lo, Hi;
28449 SDValue Res = DAG.getNode(ISD::BUILD_PAIR, dl, MVT::i64, Lo, Hi);
28457 SDValue Lo, Hi;
28462 SDValue Res = DAG.getNode(ISD::CONCAT_VECTORS, dl, DstVT, Lo, Hi);
28471 SDValue Res = DAG.getNode(X86ISD::MOVQ2DQ, dl, WideVT, N->getOperand(0));
28483 SDValue Index = Gather->getIndex();
28489 SDValue Mask = Gather->getMask();
28491 SDValue PassThru = DAG.getNode(ISD::CONCAT_VECTORS, dl, WideVT,
28501 SDValue Ops[] = { Gather->getChain(), PassThru, Mask,
28503 SDValue Res = DAG.getTargetMemSDNode<X86MaskedGatherSDNode>(
28525 SDValue Res = DAG.getLoad(LdVT, dl, Ld->getChain(), Ld->getBasePtr(),
28528 SDValue Chain = Res.getValue(1);
28539 SDValue Ops[] = {Ld->getChain(), Ld->getBasePtr()};
28540 SDValue Res = DAG.getMemIntrinsicNode(X86ISD::VZEXT_LOAD, dl, Tys, Ops,
29065 bool X86TargetLowering::isZExtFree(SDValue Val, EVT VT2) const {
29089 bool X86TargetLowering::isVectorLoadExtDesirable(SDValue ExtVal) const {
31423 X86TargetLowering::targetShrinkDemandedConstant(SDValue Op,
31476 SDValue NewC = TLO.DAG.getConstant(ZeroExtendMask, DL, VT);
31477 SDValue NewOp = TLO.DAG.getNode(ISD::AND, DL, VT, Op.getOperand(0), NewC);
31481 void X86TargetLowering::computeKnownBitsForTargetNode(const SDValue Op,
31509 SDValue Src = Op.getOperand(0);
31620 SmallVector<SDValue, 2> Ops;
31668 SDValue Op, const APInt &DemandedElts, const SelectionDAG &DAG,
31680 SDValue Src = Op.getOperand(0);
31708 SDValue Src = Op.getOperand(0);
31719 SDValue Src = Op.getOperand(0);
31758 SmallVector<SDValue, 2> Ops;
31805 SDValue X86TargetLowering::unwrapAddress(SDValue N) const {
31805 SDValue X86TargetLowering::unwrapAddress(SDValue N) const {
31816 SDValue &V1, const SDLoc &DL, SelectionDAG &DAG,
32067 SDValue &V1, SDValue &V2, const SDLoc &DL,
32067 SDValue &V1, SDValue &V2, const SDLoc &DL,
32133 bool AllowFloatDomain, bool AllowIntDomain, SDValue &V1, SDValue &V2,
32133 bool AllowFloatDomain, bool AllowIntDomain, SDValue &V1, SDValue &V2,
32248 SDValue Lo = MatchHalf(0, ShufMask[0], ShufMask[1]);
32249 SDValue Hi = MatchHalf(2, ShufMask[2], ShufMask[3]);
32274 static SDValue combineX86ShuffleChainWithExtract(
32275 ArrayRef<SDValue> Inputs, SDValue Root, ArrayRef<int> BaseMask, int Depth,
32275 ArrayRef<SDValue> Inputs, SDValue Root, ArrayRef<int> BaseMask, int Depth,
32288 static SDValue combineX86ShuffleChain(ArrayRef<SDValue> Inputs, SDValue Root,
32288 static SDValue combineX86ShuffleChain(ArrayRef<SDValue> Inputs, SDValue Root,
32288 static SDValue combineX86ShuffleChain(ArrayRef<SDValue> Inputs, SDValue Root,
32300 SDValue V1 = peekThroughBitcasts(Inputs[0]);
32301 SDValue V2 = (UnaryShuffle ? DAG.getUNDEF(V1.getValueType())
32312 SDValue Res;
32342 SDValue Src = Inputs[0];
32460 SDValue NewV1 = V1; // Save operand in case early exit happens.
32485 SDValue NewV1 = V1; // Save operands in case early exit happens.
32486 SDValue NewV2 = V2;
32568 SDValue VPermMask = getConstVector(Mask, IntMaskVT, DAG, DL, true);
32592 SDValue VPermMask = getConstVector(Mask, IntMaskVT, DAG, DL, true);
32594 SDValue Zero = getZeroVector(MaskVT, Subtarget, DAG, DL);
32601 if (SDValue WideShuffle = combineX86ShuffleChainWithExtract(
32618 SDValue VPermMask = getConstVector(Mask, IntMaskVT, DAG, DL, true);
32646 SDValue BitMask = getConstVector(EltBits, UndefElts, MaskVT, DAG, DL);
32660 SmallVector<SDValue, 16> VPermIdx;
32662 SDValue Idx =
32666 SDValue VPermMask = DAG.getBuildVector(IntMaskVT, DL, VPermIdx);
32701 SDValue VPerm2MaskOp = getConstVector(VPerm2Idx, IntMaskVT, DAG, DL, true);
32716 SmallVector<SDValue, 16> PSHUFBMask;
32735 SDValue PSHUFBMaskOp = DAG.getBuildVector(ByteVT, DL, PSHUFBMask);
32747 SmallVector<SDValue, 16> VPPERMMask;
32766 SDValue VPPERMMaskOp = DAG.getBuildVector(ByteVT, DL, VPPERMMask);
32773 if (SDValue WideShuffle = combineX86ShuffleChainWithExtract(
32793 SDValue VPermMask = getConstVector(Mask, IntMaskVT, DAG, DL, true);
32812 static SDValue combineX86ShuffleChainWithExtract(
32813 ArrayRef<SDValue> Inputs, SDValue Root, ArrayRef<int> BaseMask, int Depth,
32813 ArrayRef<SDValue> Inputs, SDValue Root, ArrayRef<int> BaseMask, int Depth,
32821 SmallVector<SDValue, 4> WideInputs(Inputs.begin(), Inputs.end());
32828 SDValue &Src = WideInputs[i];
32865 for (SDValue &NewInput : WideInputs) {
32899 SDValue WideRoot = WideInputs[0];
32900 if (SDValue WideShuffle = combineX86ShuffleChain(
32913 static SDValue combineX86ShufflesConstants(ArrayRef<SDValue> Ops,
32913 static SDValue combineX86ShufflesConstants(ArrayRef<SDValue> Ops,
32914 ArrayRef<int> Mask, SDValue Root,
32930 SDValue SrcOp = Ops[i];
32991 SDValue CstOp = getConstVector(ConstantBitData, UndefElts, MaskVT, DAG, DL);
33024 static SDValue combineX86ShufflesRecursively(
33025 ArrayRef<SDValue> SrcOps, int SrcOpIndex, SDValue Root,
33025 ArrayRef<SDValue> SrcOps, int SrcOpIndex, SDValue Root,
33039 SDValue Op = SrcOps[SrcOpIndex];
33054 SmallVector<SDValue, 2> OpInputs;
33065 SmallVector<SDValue, 16> Ops(SrcOps.begin(), SrcOps.end());
33069 SDValue InputBC = peekThroughBitcasts(Input);
33084 for (SDValue OpInput : OpInputs)
33199 if (SDValue Res = combineX86ShufflesRecursively(
33207 if (SDValue Cst = combineX86ShufflesConstants(
33243 static SDValue combineX86ShufflesRecursively(SDValue Op, SelectionDAG &DAG,
33243 static SDValue combineX86ShufflesRecursively(SDValue Op, SelectionDAG &DAG,
33257 SmallVector<SDValue, 2> Ops;
33298 static SDValue
33299 combineRedundantDWordShuffle(SDValue N, MutableArrayRef<int> Mask,
33308 SmallVector<SDValue, 8> Chain;
33309 SDValue V = N.getOperand(0);
33398 SDValue W = Chain.pop_back_val();
33427 static SDValue combineTargetShuffle(SDValue N, SelectionDAG &DAG,
33427 static SDValue combineTargetShuffle(SDValue N, SelectionDAG &DAG,
33440 auto BC0 = peekThroughBitcasts(N.getOperand(0));
33441 auto BC1 = peekThroughBitcasts(N.getOperand(1));
33450 SDValue Lo, Hi;
33458 SDValue Horiz = DAG.getNode(Opcode0, DL, VT0, Lo, Hi);
33465 SDValue Src = N.getOperand(0);
33466 SDValue BC = peekThroughBitcasts(Src);
33479 if (SDValue Res = combineX86ShufflesRecursively(
33518 SDValue Ops[] = { LN->getChain(), LN->getBasePtr() };
33519 SDValue BcastLd =
33529 SDValue Scl = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, SrcVT, BcastLd,
33539 SDValue N0 = N.getOperand(0);
33540 SDValue N1 = N.getOperand(1);
33564 SDValue N0 = N.getOperand(0);
33565 SDValue N1 = N.getOperand(1);
33569 SDValue Src = N0.getOperand(0);
33571 SDValue Res = DAG.getNode(X86ISD::VPERMI, DL, SrcVT, Src, N1);
33584 SDValue N0 = N.getOperand(0);
33585 SDValue N1 = N.getOperand(1);
33593 SDValue N10 = N1.getOperand(0);
33594 SDValue N11 = N1.getOperand(1);
33600 SDValue ZeroIdx = DAG.getIntPtrConstant(0, DL);
33603 SDValue Scl = DAG.getNode(Opcode1, DL, SVT, N10, N11);
33604 SDValue SclVec = DAG.getNode(ISD::SCALAR_TO_VECTOR, DL, VT, Scl);
33613 SDValue Op0 = N.getOperand(0);
33614 SDValue Op1 = N.getOperand(1);
33615 SDValue Op2 = N.getOperand(2);
33633 SmallVector<SDValue, 2> Ops1;
33654 SmallVector<SDValue, 2> Ops0;
33703 SDValue Load = DAG.getLoad(MVT::f32, DL, MemIntr->getChain(),
33706 SDValue Insert = DAG.getNode(X86ISD::INSERTPS, DL, VT, Op0,
33726 SDValue V = N.getOperand(0);
33757 SDValue D = peekThroughOneUseBitcasts(V.getOperand(0));
33786 if (SDValue NewN = combineRedundantDWordShuffle(N, Mask, DAG))
33836 SelectionDAG &DAG, SDValue &Opnd0, SDValue &Opnd1,
33836 SelectionDAG &DAG, SDValue &Opnd0, SDValue &Opnd1,
33851 SDValue V1 = N->getOperand(0);
33852 SDValue V2 = N->getOperand(1);
33866 SDValue LHS, RHS;
33895 static SDValue combineShuffleToFMAddSub(SDNode *N,
33910 SDValue Op0 = N->getOperand(0);
33911 SDValue Op1 = N->getOperand(1);
33912 SDValue FMAdd = Op0, FMSub = Op1;
33938 static SDValue combineShuffleToAddSubOrFMAddSub(SDNode *N,
33941 if (SDValue V = combineShuffleToFMAddSub(N, Subtarget, DAG))
33944 SDValue Opnd0, Opnd1;
33953 SDValue Opnd2;
33974 static SDValue combineShuffleOfConcatUndef(SDNode *N, SelectionDAG &DAG,
33991 SDValue N0 = N->getOperand(0);
33992 SDValue N1 = N->getOperand(1);
34011 SDValue Concat = DAG.getNode(ISD::CONCAT_VECTORS, DL, VT, N0.getOperand(0),
34017 static SDValue foldShuffleOfHorizOp(SDNode *N, SelectionDAG &DAG) {
34027 SDValue SrcOp = N->getOperand(0);
34035 SDValue HOp = N->getOperand(0);
34053 SDValue X;
34106 static SDValue narrowShuffle(ShuffleVectorSDNode *Shuf, SelectionDAG &DAG) {
34136 static SDValue combineShuffle(SDNode *N, SelectionDAG &DAG,
34140 if (SDValue V = narrowShuffle(Shuf, DAG))
34149 if (SDValue AddSub = combineShuffleToAddSubOrFMAddSub(N, Subtarget, DAG))
34152 if (SDValue HAddSub = foldShuffleOfHorizOp(N, DAG))
34157 if (SDValue LD = combineToConsecutiveLoads(VT, N, dl, DAG, Subtarget, true))
34166 if (SDValue ShufConcat = combineShuffleOfConcatUndef(N, DAG, Subtarget))
34170 SDValue Op(N, 0);
34171 if (SDValue Shuffle = combineTargetShuffle(Op, DAG, DCI, Subtarget))
34179 if (SDValue Res = combineX86ShufflesRecursively(Op, DAG, Subtarget))
34198 SDValue In = N->getOperand(0).getOperand(0);
34225 SDValue In = N->getOperand(0).getOperand(1);
34226 SDValue Movl = DAG.getNode(X86ISD::VZEXT_MOVL, dl, In.getValueType(), In);
34239 SDValue Ops[] = { LN->getChain(), LN->getBasePtr() };
34240 SDValue VZLoad =
34255 SDValue Op, const APInt &DemandedElts, APInt &KnownUndef, APInt &KnownZero,
34267 SDValue LHS = Op.getOperand(0);
34268 SDValue RHS = Op.getOperand(1);
34283 SDValue Amt = Op.getOperand(1);
34307 SDValue Src = Op.getOperand(0);
34316 SDValue Src = Op.getOperand(0);
34338 SDValue NewSA = TLO.DAG.getTargetConstant(Diff, dl, MVT::i8);
34355 SDValue Src = Op.getOperand(0);
34377 SDValue NewSA = TLO.DAG.getTargetConstant(Diff, dl, MVT::i8);
34395 SDValue Src = Op.getOperand(0);
34406 SDValue N0 = Op.getOperand(0);
34407 SDValue N1 = Op.getOperand(1);
34425 SDValue NewN0 = SimplifyMultipleUseDemandedBits(
34427 SDValue NewN1 = SimplifyMultipleUseDemandedBits(
34458 SDValue Src = Op.getOperand(0);
34491 SDValue Src = Op.getOperand(0);
34510 SDValue Mask = Op.getOperand(0);
34520 SDValue Mask = Op.getOperand(1);
34529 SDValue Mask = Op.getOperand(2);
34554 SDValue Ext0 =
34556 SDValue ExtOp =
34558 SDValue UndefVec = TLO.DAG.getUNDEF(VT);
34559 SDValue Insert =
34566 SDValue Src = Op.getOperand(0);
34590 SDValue Ext0 =
34592 SDValue ExtOp =
34594 SDValue UndefVec = TLO.DAG.getUNDEF(VT);
34595 SDValue Insert =
34607 SDValue Ext = extractSubVector(Op.getOperand(0), 2, TLO.DAG, DL, 128);
34608 SDValue UndefVec = TLO.DAG.getUNDEF(VT);
34609 SDValue Insert = insertSubVector(UndefVec, Ext, 0, TLO.DAG, DL, 128);
34631 SDValue Ext0 =
34633 SDValue Ext1 =
34635 SDValue ExtOp = TLO.DAG.getNode(Opc, DL, ExtVT, Ext0, Ext1);
34636 SDValue UndefVec = TLO.DAG.getUNDEF(VT);
34637 SDValue Insert =
34647 SmallVector<SDValue, 2> OpInputs;
34708 SDValue Op, const APInt &OriginalDemandedBits,
34719 SDValue LHS = Op.getOperand(0);
34720 SDValue RHS = Op.getOperand(1);
34731 SDValue DemandedLHS = SimplifyMultipleUseDemandedBits(
34733 SDValue DemandedRHS = SimplifyMultipleUseDemandedBits(
34744 SDValue Op0 = Op.getOperand(0);
34745 SDValue Op1 = Op.getOperand(1);
34766 SDValue NewShift = TLO.DAG.getNode(
34809 SDValue Op0 = Op.getOperand(0);
34810 SDValue Op1 = Op.getOperand(1);
34825 SDValue Op00 = Op0.getOperand(0);
34860 SDValue Vec = Op.getOperand(0);
34886 if (SDValue V = SimplifyMultipleUseDemandedBits(
34898 SDValue Vec = Op.getOperand(0);
34899 SDValue Scl = Op.getOperand(1);
34955 SDValue Src = Op.getOperand(0);
34992 SDValue X86TargetLowering::SimplifyMultipleUseDemandedBitsForTargetNode(
34993 SDValue Op, const APInt &DemandedBits, const APInt &DemandedElts,
35003 SDValue Vec = Op.getOperand(0);
35015 SmallVector<SDValue, 2> ShuffleOps;
35063 static SDValue
35069 SDValue InVec = N->getOperand(0);
35070 SDValue EltNo = N->getOperand(1);
35098 SmallVector<SDValue, 2> ShuffleOps;
35129 SDValue LdNode = (Idx < (int)NumOriginalElts) ? ShuffleOps[0] : ShuffleOps[1];
35167 SDValue Shuffle = UnaryShuffle ? DAG.getUNDEF(OriginalVT)
35178 static bool checkBitcastSrcVectorSize(SDValue Src, unsigned Size) {
35192 static SDValue signExtendBitcastSrcVector(SelectionDAG &DAG, EVT SExtVT,
35193 SDValue Src, const SDLoc &DL) {
35214 static SDValue combineBitcastvxi1(SelectionDAG &DAG, EVT VT, SDValue Src,
35214 static SDValue combineBitcastvxi1(SelectionDAG &DAG, EVT VT, SDValue Src,
35295 SDValue V = PropagateSExt ? signExtendBitcastSrcVector(DAG, SExtVT, Src, DL)
35314 static SDValue combinevXi1ConstantToInteger(SDValue Op, SelectionDAG &DAG) {
35314 static SDValue combinevXi1ConstantToInteger(SDValue Op, SelectionDAG &DAG) {
35323 SDValue In = Op.getOperand(Idx);
35331 static SDValue combineCastedMaskArithmetic(SDNode *N, SelectionDAG &DAG,
35344 SDValue Op = N->getOperand(0);
35363 SDValue LHS = Op.getOperand(0);
35364 SDValue RHS = Op.getOperand(1);
35387 static SDValue createMMXBuildVector(BuildVectorSDNode *BV, SelectionDAG &DAG,
35391 SDValue Splat = BV->getSplatValue();
35411 SmallVector<SDValue, 8> Ops;
35448 SDValue Intrin = DAG.getConstant(IntrinOp, DL, MVT::i32);
35458 static SDValue combineBitcast(SDNode *N, SelectionDAG &DAG,
35461 SDValue N0 = N->getOperand(0);
35473 if (SDValue V = combineBitcastvxi1(DAG, VT, N0, dl, Subtarget))
35483 SDValue N00 = N0.getOperand(0);
35488 SDValue V = DAG.getNode(X86ISD::MOVMSK, dl, MVT::i32,
35516 SDValue LastOp = N0.getOperand(N0.getNumOperands() - 1);
35520 SmallVector<SDValue, 4> Ops(N0->op_begin(), N0->op_end());
35529 SmallVector<SDValue, 4> Ops(NumConcats, DAG.getUNDEF(SrcVT));
35555 SDValue Ops[] = { BCast->getChain(), BCast->getBasePtr() };
35556 SDValue ResNode =
35589 SDValue Op = N0.getOperand(i);
35594 SDValue N00 = N0.getOperand(0);
35614 SDValue N00 = N0.getOperand(0);
35623 SDValue Res = DAG.getNode(ISD::CONCAT_VECTORS, DL, MVT::v4i32, N0,
35650 if (SDValue V = combineCastedMaskArithmetic(N, DAG, DCI, Subtarget))
35670 SDValue LogicOp0 = N0.getOperand(0);
35671 SDValue LogicOp1 = N0.getOperand(1);
35678 SDValue CastedOp1 = DAG.getBitcast(VT, LogicOp1);
35685 SDValue CastedOp0 = DAG.getBitcast(VT, LogicOp0);
35695 static bool detectZextAbsDiff(const SDValue &Abs, SDValue &Op0, SDValue &Op1) {
35695 static bool detectZextAbsDiff(const SDValue &Abs, SDValue &Op0, SDValue &Op1) {
35695 static bool detectZextAbsDiff(const SDValue &Abs, SDValue &Op0, SDValue &Op1) {
35696 SDValue AbsOp1 = Abs->getOperand(0);
35715 static SDValue createPSADBW(SelectionDAG &DAG, const SDValue &Zext0,
35715 static SDValue createPSADBW(SelectionDAG &DAG, const SDValue &Zext0,
35716 const SDValue &Zext1, const SDLoc &DL,
35725 SmallVector<SDValue, 16> Ops(NumConcat, DAG.getConstant(0, DL, InVT));
35728 SDValue SadOp0 = DAG.getNode(ISD::CONCAT_VECTORS, DL, ExtendedVT, Ops);
35730 SDValue SadOp1 = DAG.getNode(ISD::CONCAT_VECTORS, DL, ExtendedVT, Ops);
35745 static SDValue combineHorizontalMinMaxResult(SDNode *Extract, SelectionDAG &DAG,
35757 SDValue Src = DAG.matchBinOpReduction(
35768 SDValue MinPos = Src;
35776 SDValue Lo = extractSubVector(MinPos, 0, DAG, DL, SubSizeInBits);
35777 SDValue Hi = extractSubVector(MinPos, NumSubElts, DAG, DL, SubSizeInBits);
35786 SDValue Mask;
35803 SDValue Upper = DAG.getVectorShuffle(
35822 static SDValue combineHorizontalPredicateResult(SDNode *Extract,
35837 SDValue Match = DAG.matchBinOpReduction(Extract, BinOp, {ISD::OR, ISD::AND});
35848 SDValue Movmsk;
35866 SDValue Lo, Hi;
35899 SDValue Lo, Hi;
35913 SDValue BitcastLogicOp = DAG.getBitcast(MaskSrcVT, Match);
35923 SDValue Mask = DAG.getConstant(1, DL, CmpVT);
35924 SDValue Result = DAG.getNode(ISD::CTPOP, DL, CmpVT, Movmsk);
35929 SDValue CmpC;
35946 SDValue Setcc = DAG.getSetCC(DL, SetccVT, Movmsk, CmpC, CondCode);
35947 SDValue Zext = DAG.getZExtOrTrunc(Setcc, DL, ExtractVT);
35948 SDValue Zero = DAG.getConstant(0, DL, ExtractVT);
35952 static SDValue combineBasicSADPattern(SDNode *Extract, SelectionDAG &DAG,
35977 SDValue Root = DAG.matchBinOpReduction(Extract, BinOp, {ISD::ADD});
35998 SDValue Zext0, Zext1;
36004 SDValue SAD = createPSADBW(DAG, Zext0, Zext1, DL, Subtarget);
36018 SDValue Shuffle =
36035 static SDValue combineExtractWithShuffle(SDNode *N, SelectionDAG &DAG,
36042 SDValue Src = N->getOperand(0);
36043 SDValue Idx = N->getOperand(1);
36054 SDValue SrcBC = peekThroughBitcasts(Src);
36058 SDValue SrcOp = SrcBC.getOperand(0);
36070 SDValue Load = DAG.getLoad(VT, dl, MemIntr->getChain(),
36092 SmallVector<SDValue, 2> Ops;
36136 SDValue SrcOp = Ops[SrcIdx / Mask.size()];
36157 SDValue ExtOp = DAG.getNode(OpCode, dl, MVT::i32, SrcOp,
36167 static SDValue scalarizeExtEltFP(SDNode *ExtElt, SelectionDAG &DAG) {
36169 SDValue Vec = ExtElt->getOperand(0);
36170 SDValue Index = ExtElt->getOperand(1);
36188 SDValue Ext0 = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, OpVT,
36190 SDValue Ext1 = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, OpVT,
36210 SDValue Ext0 = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL,
36213 SDValue Ext1 = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, VT,
36215 SDValue Ext2 = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, VT,
36252 SmallVector<SDValue, 4> ExtOps;
36253 for (SDValue Op : Vec->ops())
36265 static SDValue combineReductionToHorizontal(SDNode *ExtElt, SelectionDAG &DAG,
36274 SDValue Rdx =
36279 SDValue Index = ExtElt->getOperand(1);
36326 SDValue Lo = extractSubVector(Rdx, 0, DAG, DL, HalfSize);
36327 SDValue Hi = extractSubVector(Rdx, HalfElts, DAG, DL, HalfSize);
36333 SDValue Hi = DAG.getVectorShuffle(
36357 SDValue Hi = extract128BitVector(Rdx, NumElts / 2, DAG, DL);
36358 SDValue Lo = extract128BitVector(Rdx, 0, DAG, DL);
36378 static SDValue combineExtractVectorElt(SDNode *N, SelectionDAG &DAG,
36381 if (SDValue NewOp = combineExtractWithShuffle(N, DAG, DCI, Subtarget))
36384 SDValue InputVector = N->getOperand(0);
36385 SDValue EltIdx = N->getOperand(1);
36423 SDValue Scl = InputVector.getOperand(1);
36434 if (SDValue NewOp = XFormVExtractWithShuffleIntoLoad(N, DAG, DCI))
36440 SDValue MMXSrc = InputVector.getOperand(0);
36450 SDValue MMXSrc = InputVector.getOperand(0);
36460 if (SDValue SAD = combineBasicSADPattern(N, DAG, Subtarget))
36464 if (SDValue Cmp = combineHorizontalPredicateResult(N, DAG, Subtarget))
36468 if (SDValue MinMax = combineHorizontalMinMaxResult(N, DAG, Subtarget))
36471 if (SDValue V = combineReductionToHorizontal(N, DAG, Subtarget))
36474 if (SDValue V = scalarizeExtEltFP(N, DAG))
36494 if (SDValue BC =
36500 SDValue Mask = DAG.getConstant(MaskBit, dl, BCVT);
36501 SDValue Res = DAG.getNode(ISD::AND, dl, BCVT, BC, Mask);
36516 static SDValue
36520 SDValue Cond = N->getOperand(0);
36521 SDValue LHS = N->getOperand(1);
36522 SDValue RHS = N->getOperand(2);
36552 SDValue CondNew = DAG.getNOT(DL, Cond, CondVT);
36577 SDValue CC = Cond.getOperand(2);
36602 SDValue CastRHS = DAG.getBitcast(CondVT, RHS);
36603 SDValue Or = DAG.getNode(ISD::OR, DL, CondVT, Cond, CastRHS);
36609 SDValue CastLHS = DAG.getBitcast(CondVT, LHS);
36610 SDValue And = DAG.getNode(ISD::AND, DL, CondVT, Cond, CastLHS);
36617 SDValue CastCond = DAG.getBitcast(AndNVT, Cond);
36618 SDValue CastRHS = DAG.getBitcast(AndNVT, RHS);
36619 SDValue AndN = DAG.getNode(X86ISD::ANDNP, DL, AndNVT, CastCond, CastRHS);
36630 static SDValue narrowVectorSelect(SDNode *N, SelectionDAG &DAG,
36642 SDValue Cond = N->getOperand(0);
36643 SDValue TVal = N->getOperand(1);
36644 SDValue FVal = N->getOperand(2);
36645 SmallVector<SDValue, 4> CatOpsT, CatOpsF;
36659 static SDValue combineSelectOfTwoConstants(SDNode *N, SelectionDAG &DAG) {
36660 SDValue Cond = N->getOperand(0);
36661 SDValue LHS = N->getOperand(1);
36662 SDValue RHS = N->getOperand(2);
36706 SDValue R = DAG.getNode(ISD::ZERO_EXTEND, DL, VT, Cond);
36727 static SDValue combineVSelectToBLENDV(SDNode *N, SelectionDAG &DAG,
36730 SDValue Cond = N->getOperand(0);
36795 SDValue SB = DAG.getNode(X86ISD::BLENDV, SDLoc(U), U->getValueType(0),
36805 static SDValue combineSelect(SDNode *N, SelectionDAG &DAG,
36809 SDValue Cond = N->getOperand(0);
36810 SDValue LHS = N->getOperand(1);
36811 SDValue RHS = N->getOperand(2);
36815 if (SDValue V = DAG.simplifySelect(Cond, LHS, RHS))
36992 SDValue AndNode = Cond.getOperand(0);
37049 SDValue Res = DAG.getSelect(DL, SrcVT, Cond, LHS, RHS);
37054 if (SDValue V = combineSelectOfTwoConstants(N, DAG))
37100 SDValue Other;
37110 SDValue OpLHS = Other->getOperand(0), OpRHS = Other->getOperand(1);
37111 SDValue CondRHS = Cond->getOperand(1);
37167 SDValue CondLHS = Cond->getOperand(0);
37168 SDValue CondRHS = Cond->getOperand(1);
37172 SDValue Other;
37181 SDValue OpLHS = Other.getOperand(0), OpRHS = Other.getOperand(1);
37215 if (SDValue V = combineVSelectWithAllOnesOrZeros(N, DAG, DCI, Subtarget))
37218 if (SDValue V = combineVSelectToBLENDV(N, DAG, DCI, Subtarget))
37221 if (SDValue V = narrowVectorSelect(N, DAG, Subtarget))
37226 if (SDValue CondNot = IsNOT(Cond, DAG))
37234 SDValue newSelect = DAG.getNode(ISD::SELECT, DL, MVT::i64, Cond, LHS, RHS);
37247 static SDValue combineSetCCAtomicArith(SDValue Cmp, X86::CondCode &CC,
37247 static SDValue combineSetCCAtomicArith(SDValue Cmp, X86::CondCode &CC,
37273 SDValue CmpLHS = Cmp.getOperand(0);
37274 SDValue CmpRHS = Cmp.getOperand(1);
37283 SDValue OpRHS = CmpLHS.getOperand(2);
37304 auto AtomicSub = DAG.getAtomic(
37309 auto LockOp = lowerAtomicArithWithLOCK(AtomicSub, DAG, Subtarget);
37332 SDValue LockOp = lowerAtomicArithWithLOCK(CmpLHS, DAG, Subtarget);
37354 static SDValue checkBoolTestSetCCCombine(SDValue Cmp, X86::CondCode &CC) {
37354 static SDValue checkBoolTestSetCCCombine(SDValue Cmp, X86::CondCode &CC) {
37366 SDValue Op1 = Cmp.getOperand(0);
37367 SDValue Op2 = Cmp.getOperand(1);
37369 SDValue SetCC;
37433 SDValue Op = SetCC.getOperand(0);
37472 static bool checkBoolTestAndOrSetCCCombine(SDValue Cond, X86::CondCode &CC0,
37473 X86::CondCode &CC1, SDValue &Flags,
37484 SDValue SetCC0, SetCC1;
37513 static SDValue combineCarryThroughADD(SDValue EFLAGS, SelectionDAG &DAG) {
37513 static SDValue combineCarryThroughADD(SDValue EFLAGS, SelectionDAG &DAG) {
37516 SDValue Carry = EFLAGS.getOperand(0);
37528 SDValue CarryOp1 = Carry.getOperand(1);
37542 SDValue SubCommute =
37564 static SDValue combineSetCCEFLAGS(SDValue EFLAGS, X86::CondCode &CC,
37564 static SDValue combineSetCCEFLAGS(SDValue EFLAGS, X86::CondCode &CC,
37568 if (SDValue Flags = combineCarryThroughADD(EFLAGS, DAG))
37571 if (SDValue R = checkBoolTestSetCCCombine(EFLAGS, CC))
37577 static SDValue combineCMov(SDNode *N, SelectionDAG &DAG,
37582 SDValue FalseOp = N->getOperand(0);
37583 SDValue TrueOp = N->getOperand(1);
37585 SDValue Cond = N->getOperand(3);
37593 if (SDValue Flags = combineSetCCEFLAGS(Cond, CC, DAG, Subtarget)) {
37595 SDValue Ops[] = {FalseOp, TrueOp, DAG.getTargetConstant(CC, DL, MVT::i8),
37716 SDValue Ops[] = {FalseOp, Cond.getOperand(0),
37741 SDValue Flags;
37751 SDValue LOps[] = {FalseOp, TrueOp,
37753 SDValue LCMOV = DAG.getNode(X86ISD::CMOV, DL, N->getValueType(0), LOps);
37754 SDValue Ops[] = {LCMOV, TrueOp, DAG.getTargetConstant(CC1, DL, MVT::i8),
37756 SDValue CMOV = DAG.getNode(X86ISD::CMOV, DL, N->getValueType(0), Ops);
37767 SDValue Add = TrueOp;
37768 SDValue Const = FalseOp;
37786 SDValue Diff = DAG.getNode(ISD::SUB, DL, VT, Const, Add.getOperand(1));
37787 SDValue CMov =
37809 SDValue Opd = N->getOperand(i);
37862 static SDValue reduceVMULWidth(SDNode *N, SelectionDAG &DAG,
37882 SDValue N0 = N->getOperand(0);
37883 SDValue N1 = N->getOperand(1);
37892 SDValue NewN0 = DAG.getNode(ISD::TRUNCATE, DL, ReducedVT, N0);
37893 SDValue NewN1 = DAG.getNode(ISD::TRUNCATE, DL, ReducedVT, N1);
37897 SDValue MulLo = DAG.getNode(ISD::MUL, DL, ReducedVT, NewN0, NewN1);
37905 SDValue MulHi = DAG.getNode(Mode == MULS16 ? ISD::MULHS : ISD::MULHU, DL,
37916 SDValue ResLo =
37924 SDValue ResHi =
37930 static SDValue combineMulSpecial(uint64_t MulAmt, SDNode *N, SelectionDAG &DAG,
37934 SDValue Result = DAG.getNode(X86ISD::MUL_IMM, DL, VT, N->getOperand(0),
37944 SDValue Result = DAG.getNode(X86ISD::MUL_IMM, DL, VT, N->getOperand(0),
38005 SDValue Shift1 = DAG.getNode(ISD::SHL, DL, VT, N->getOperand(0),
38007 SDValue Shift2 = DAG.getNode(ISD::SHL, DL, VT, N->getOperand(0),
38018 static SDValue combineMulToPMADDWD(SDNode *N, SelectionDAG &DAG,
38038 SDValue N0 = N->getOperand(0);
38039 SDValue N1 = N->getOperand(1);
38066 static SDValue combineMulToPMULDQ(SDNode *N, SelectionDAG &DAG,
38079 SDValue N0 = N->getOperand(0);
38080 SDValue N1 = N->getOperand(1);
38110 static SDValue combineMul(SDNode *N, SelectionDAG &DAG,
38115 if (SDValue V = combineMulToPMADDWD(N, DAG, Subtarget))
38118 if (SDValue V = combineMulToPMULDQ(N, DAG, Subtarget))
38148 SDValue NewMul = DAG.getNode(X86ISD::MUL_IMM, DL, VT, N->getOperand(0),
38170 SDValue NewMul;
38252 static SDValue combineShiftLeft(SDNode *N, SelectionDAG &DAG) {
38253 SDValue N0 = N->getOperand(0);
38254 SDValue N1 = N->getOperand(1);
38263 SDValue N00 = N0.getOperand(0);
38311 static SDValue combineShiftRightArithmetic(SDNode *N, SelectionDAG &DAG) {
38312 SDValue N0 = N->getOperand(0);
38313 SDValue N1 = N->getOperand(1);
38333 SDValue N00 = N0.getOperand(0);
38334 SDValue N01 = N0.getOperand(1);
38349 SDValue NN =
38364 static SDValue combineShiftRightLogical(SDNode *N, SelectionDAG &DAG,
38366 SDValue N0 = N->getOperand(0);
38367 SDValue N1 = N->getOperand(1);
38406 SDValue NewMask = DAG.getConstant(NewMaskVal, DL, VT);
38407 SDValue NewShift = DAG.getNode(ISD::SRL, DL, VT, N0.getOperand(0), N1);
38413 static SDValue combineVectorPack(SDNode *N, SelectionDAG &DAG,
38421 SDValue N0 = N->getOperand(0);
38422 SDValue N1 = N->getOperand(1);
38499 SDValue Concat = DAG.getNode(ISD::CONCAT_VECTORS, dl, MVT::v16i32,
38506 SDValue Op(N, 0);
38507 if (SDValue Res = combineX86ShufflesRecursively(Op, DAG, Subtarget))
38513 static SDValue combineVectorShiftVar(SDNode *N, SelectionDAG &DAG,
38520 SDValue N0 = N->getOperand(0);
38521 SDValue N1 = N->getOperand(1);
38546 static SDValue combineVectorShiftImm(SDNode *N, SelectionDAG &DAG,
38555 SDValue N0 = N->getOperand(0);
38556 SDValue N1 = N->getOperand(1);
38593 SDValue Op(N, 0);
38594 if (SDValue Res = combineX86ShufflesRecursively(Op, DAG, Subtarget))
38624 static SDValue combineVectorInsert(SDNode *N, SelectionDAG &DAG,
38639 SDValue Op(N, 0);
38640 if (SDValue Res = combineX86ShufflesRecursively(Op, DAG, Subtarget))
38649 static SDValue combineCompareEqual(SDNode *N, SelectionDAG &DAG,
38657 SDValue N0 = N->getOperand(0);
38658 SDValue N1 = N->getOperand(1);
38659 SDValue CMP0 = N0.getOperand(1);
38660 SDValue CMP1 = N1.getOperand(1);
38667 SDValue CMP00 = CMP0->getOperand(0);
38668 SDValue CMP01 = CMP0->getOperand(1);
38706 SDValue FSetCC =
38711 SDValue Ins = DAG.getNode(ISD::INSERT_SUBVECTOR, DL, MVT::v16i1,
38717 SDValue OnesOrZeroesF =
38730 SDValue Vector64 = DAG.getNode(ISD::SCALAR_TO_VECTOR, DL, MVT::v2f64,
38732 SDValue Vector32 = DAG.getBitcast(MVT::v4f32, Vector64);
38738 SDValue OnesOrZeroesI = DAG.getBitcast(IntVT, OnesOrZeroesF);
38739 SDValue ANDed = DAG.getNode(ISD::AND, DL, IntVT, OnesOrZeroesI,
38741 SDValue OneBitOfTruth = DAG.getNode(ISD::TRUNCATE, DL, MVT::i8,
38752 static SDValue combineANDXORWithAllOnesIntoANDNP(SDNode *N, SelectionDAG &DAG) {
38759 SDValue X, Y;
38760 SDValue N0 = N->getOperand(0);
38761 SDValue N1 = N->getOperand(1);
38763 if (SDValue Not = IsNOT(N0, DAG)) {
38766 } else if (SDValue Not = IsNOT(N1, DAG)) {
38783 static SDValue PromoteMaskArithmetic(SDNode *N, SelectionDAG &DAG,
38792 SDValue Narrow = N->getOperand(0);
38800 SDValue N0 = Narrow->getOperand(0);
38801 SDValue N1 = Narrow->getOperand(1);
38832 SDValue Op = DAG.getNode(Narrow->getOpcode(), DL, VT, N0, N1);
38849 static SDValue convertIntLogicToFPLogic(SDNode *N, SelectionDAG &DAG,
38852 SDValue N0 = N->getOperand(0);
38853 SDValue N1 = N->getOperand(1);
38859 SDValue N00 = N0.getOperand(0);
38860 SDValue N10 = N1.getOperand(0);
38878 SDValue FPLogic = DAG.getNode(FPOpcode, DL, N00Type, N00, N10);
38885 static SDValue combineAndMaskToShift(SDNode *N, SelectionDAG &DAG,
38887 SDValue Op0 = peekThroughBitcasts(N->getOperand(0));
38888 SDValue Op1 = peekThroughBitcasts(N->getOperand(1));
38913 SDValue ShAmt = DAG.getTargetConstant(EltBitWidth - ShiftVal, DL, MVT::i8);
38914 SDValue Shift = DAG.getNode(X86ISD::VSRLI, DL, VT0, Op0, ShAmt);
38920 static SDValue getIndexFromUnindexedLoad(LoadSDNode *Ld) {
38924 SDValue Base = Ld->getBasePtr();
38929 SDValue ShiftedIndex = Base.getOperand(0);
38959 static SDValue combineAndLoadToBZHI(SDNode *Node, SelectionDAG &DAG,
38970 SDValue N = Node->getOperand(i);
39014 SDValue Inp = (i == 0) ? Node->getOperand(1) : Node->getOperand(0);
39015 SDValue SizeC = DAG.getConstant(VT.getSizeInBits(), dl, MVT::i32);
39018 SDValue Index = getIndexFromUnindexedLoad(Ld);
39023 SDValue Sub = DAG.getNode(ISD::SUB, dl, MVT::i32, SizeC, Index);
39026 SDValue AllOnes = DAG.getAllOnesConstant(dl, VT);
39027 SDValue LShr = DAG.getNode(ISD::SRL, dl, VT, AllOnes, Sub);
39039 static SDValue combineParity(SDNode *N, SelectionDAG &DAG,
39052 SDValue N0 = N->getOperand(0);
39053 SDValue N1 = N->getOperand(1);
39064 SDValue X = N0.getOperand(0);
39069 SDValue Hi = DAG.getNode(ISD::TRUNCATE, DL, MVT::i32,
39072 SDValue Lo = DAG.getNode(ISD::TRUNCATE, DL, MVT::i32, X);
39076 SDValue Parity = DAG.getNode(ISD::AND, DL, MVT::i32,
39084 SDValue Hi16 = DAG.getNode(ISD::SRL, DL, VT, X,
39091 SDValue Hi = DAG.getNode(ISD::TRUNCATE, DL, MVT::i8,
39094 SDValue Lo = DAG.getNode(ISD::TRUNCATE, DL, MVT::i8, X);
39096 SDValue Flags = DAG.getNode(X86ISD::XOR, DL, VTs, Lo, Hi).getValue(1);
39099 SDValue Setnp = getSETCC(X86::COND_NP, Flags, DL, DAG);
39110 static SDValue combineScalarAndWithMaskSetcc(SDNode *N, SelectionDAG &DAG,
39130 SDValue Src = N->getOperand(0).getOperand(0);
39141 SDValue SubVec = Src.getOperand(0);
39161 SmallVector<SDValue, 4> Ops(Src.getNumOperands(),
39164 SDValue Concat = DAG.getNode(ISD::CONCAT_VECTORS, dl, SrcVT,
39169 static SDValue combineAnd(SDNode *N, SelectionDAG &DAG,
39189 SDValue LHS = DAG.getNode(ISD::TRUNCATE, dl, MVT::i32, N->getOperand(0));
39190 SDValue RHS = DAG.getNode(ISD::TRUNCATE, dl, MVT::i32, N->getOperand(1));
39197 if (SDValue V = combineParity(N, DAG, Subtarget))
39203 SmallVector<SDValue, 2> SrcOps;
39209 SDValue Mask = combineBitcastvxi1(DAG, MaskVT, SrcOps[0], dl, Subtarget);
39218 if (SDValue V = combineScalarAndWithMaskSetcc(N, DAG, Subtarget))
39224 if (SDValue R = combineCompareEqual(N, DAG, DCI, Subtarget))
39227 if (SDValue FPLogic = convertIntLogicToFPLogic(N, DAG, Subtarget))
39230 if (SDValue R = combineANDXORWithAllOnesIntoANDNP(N, DAG))
39233 if (SDValue ShiftRight = combineAndMaskToShift(N, DAG, Subtarget))
39236 if (SDValue R = combineAndLoadToBZHI(N, DAG, Subtarget))
39241 SDValue Op(N, 0);
39242 if (SDValue Res = combineX86ShufflesRecursively(Op, DAG, Subtarget))
39250 SDValue BitMask = N->getOperand(1);
39251 SDValue SrcVec = N->getOperand(0).getOperand(0);
39277 if (SDValue Shuffle = combineX86ShufflesRecursively(
39289 static SDValue canonicalizeBitSelect(SDNode *N, SelectionDAG &DAG,
39297 SDValue N0 = peekThroughBitcasts(N->getOperand(0));
39298 SDValue N1 = peekThroughBitcasts(N->getOperand(1));
39329 SDValue X = N->getOperand(0);
39330 SDValue Y =
39337 static bool matchLogicBlend(SDNode *N, SDValue &X, SDValue &Y, SDValue &Mask) {
39337 static bool matchLogicBlend(SDNode *N, SDValue &X, SDValue &Y, SDValue &Mask) {
39337 static bool matchLogicBlend(SDNode *N, SDValue &X, SDValue &Y, SDValue &Mask) {
39341 SDValue N0 = N->getOperand(0);
39342 SDValue N1 = N->getOperand(1);
39384 static SDValue combineLogicBlendIntoConditionalNegate(
39385 EVT VT, SDValue Mask, SDValue X, SDValue Y, const SDLoc &DL,
39385 EVT VT, SDValue Mask, SDValue X, SDValue Y, const SDLoc &DL,
39385 EVT VT, SDValue Mask, SDValue X, SDValue Y, const SDLoc &DL,
39402 SDValue V;
39410 SDValue SubOp1 = DAG.getNode(ISD::XOR, DL, MaskVT, V, Mask);
39411 SDValue SubOp2 = Mask;
39426 SDValue Res = DAG.getNode(ISD::SUB, DL, MaskVT, SubOp1, SubOp2);
39438 static SDValue combineLogicBlendIntoPBLENDV(SDNode *N, SelectionDAG &DAG,
39447 SDValue X, Y, Mask;
39466 if (SDValue Res = combineLogicBlendIntoConditionalNegate(VT, Mask, X, Y, DL,
39489 static SDValue lowerX86CmpEqZeroToCtlzSrl(SDValue Op, EVT ExtTy,
39489 static SDValue lowerX86CmpEqZeroToCtlzSrl(SDValue Op, EVT ExtTy,
39491 SDValue Cmp = Op.getOperand(1);
39495 SDValue Clz = DAG.getNode(ISD::CTLZ, dl, VT, Cmp->getOperand(0));
39498 SDValue Trunc = DAG.getZExtOrTrunc(Clz, dl, MVT::i32);
39499 SDValue Scc = DAG.getNode(ISD::SRL, dl, MVT::i32, Trunc,
39511 static SDValue combineOrCmpEqZeroToCtlzSrl(SDNode *N, SelectionDAG &DAG,
39538 SDValue LHS = OR->getOperand(0);
39539 SDValue RHS = OR->getOperand(1);
39562 SDValue NewLHS = lowerX86CmpEqZeroToCtlzSrl(LHS, VT, DAG);
39563 SDValue Ret, NewRHS;
39590 static SDValue combineOr(SDNode *N, SelectionDAG &DAG,
39593 SDValue N0 = N->getOperand(0);
39594 SDValue N1 = N->getOperand(1);
39608 SmallVector<SDValue, 2> SrcOps;
39614 SDValue Mask = combineBitcastvxi1(DAG, MaskVT, SrcOps[0], dl, Subtarget);
39626 if (SDValue R = combineCompareEqual(N, DAG, DCI, Subtarget))
39629 if (SDValue FPLogic = convertIntLogicToFPLogic(N, DAG, Subtarget))
39632 if (SDValue R = canonicalizeBitSelect(N, DAG, Subtarget))
39635 if (SDValue R = combineLogicBlendIntoPBLENDV(N, DAG, Subtarget))
39640 SDValue Op(N, 0);
39641 if (SDValue Res = combineX86ShufflesRecursively(Op, DAG, Subtarget))
39667 SDValue ShAmt0 = N0.getOperand(1);
39670 SDValue ShAmt1 = N1.getOperand(1);
39675 SDValue ShMsk0;
39682 SDValue ShMsk1;
39697 SDValue Op0 = N0.getOperand(0);
39698 SDValue Op1 = N1.getOperand(0);
39721 SDValue Sum = ShAmt1.getOperand(0);
39723 SDValue ShAmt1Op1 = ShAmt1.getOperand(1);
39742 SDValue Mask = ShAmt1.getOperand(1);
39745 SDValue ShAmt1Op0 = ShAmt1.getOperand(0);
39771 static SDValue foldXorTruncShiftIntoCmp(SDNode *N, SelectionDAG &DAG) {
39777 SDValue N0 = N->getOperand(0);
39778 SDValue N1 = N->getOperand(1);
39789 SDValue Shift = N0.getOperand(0);
39807 SDValue ShiftOp = Shift.getOperand(0);
39812 SDValue Cond = DAG.getSetCC(DL, SetCCResultType, ShiftOp,
39826 static SDValue foldVectorXorShiftIntoCmp(SDNode *N, SelectionDAG &DAG,
39846 SDValue Shift = N->getOperand(0);
39847 SDValue Ones = N->getOperand(1);
39880 static SDValue detectUSatPattern(SDValue In, EVT VT, SelectionDAG &DAG,
39880 static SDValue detectUSatPattern(SDValue In, EVT VT, SelectionDAG &DAG,
39897 if (SDValue UMin = MatchMinMax(In, ISD::UMIN, C2))
39903 if (SDValue SMin = MatchMinMax(In, ISD::SMIN, C2))
39908 if (SDValue SMax = MatchMinMax(In, ISD::SMAX, C1))
39909 if (SDValue SMin = MatchMinMax(SMax, ISD::SMIN, C2))
39927 static SDValue detectSSatPattern(SDValue In, EVT VT, bool MatchPackUS = false) {
39927 static SDValue detectSSatPattern(SDValue In, EVT VT, bool MatchPackUS = false) {
39950 if (SDValue SMin = MatchMinMax(In, ISD::SMIN, SignedMax))
39951 if (SDValue SMax = MatchMinMax(SMin, ISD::SMAX, SignedMin))
39954 if (SDValue SMax = MatchMinMax(In, ISD::SMAX, SignedMin))
39955 if (SDValue SMin = MatchMinMax(SMax, ISD::SMIN, SignedMax))
39961 static SDValue combineTruncateWithSat(SDValue In, EVT VT, const SDLoc &DL,
39961 static SDValue combineTruncateWithSat(SDValue In, EVT VT, const SDLoc &DL,
39977 if (auto USatVal = detectSSatPattern(In, VT, true)) {
39979 SDValue Mid = truncateVectorWithPACK(X86ISD::PACKUS, MVT::v16i16, USatVal,
40002 if (auto USatVal = detectSSatPattern(In, VT, true)) {
40009 SDValue Mid = truncateVectorWithPACK(X86ISD::PACKSS, MidVT, USatVal, DL,
40012 SDValue V = truncateVectorWithPACK(X86ISD::PACKUS, VT, Mid, DL, DAG,
40020 if (auto SSatVal = detectSSatPattern(In, VT))
40029 SDValue SatVal;
40030 if (auto SSatVal = detectSSatPattern(In, VT)) {
40033 } else if (auto USatVal = detectUSatPattern(In, VT, DAG, DL)) {
40044 SmallVector<SDValue, 4> ConcatOps(NumConcats, DAG.getUNDEF(InVT));
40054 SDValue Res = DAG.getNode(TruncOpc, DL, TruncVT, SatVal);
40066 static SDValue detectAVGPattern(SDValue In, EVT VT, SelectionDAG &DAG,
40066 static SDValue detectAVGPattern(SDValue In, EVT VT, SelectionDAG &DAG,
40107 for (SDValue Op : V->ops()) {
40119 auto LHS = In.getOperand(0);
40120 auto RHS = In.getOperand(1);
40127 SDValue Operands[3];
40143 SDValue VecOnes = DAG.getConstant(1, DL, InVT);
40170 SDValue Op0, Op1;
40202 static SDValue combineLoad(SDNode *N, SelectionDAG &DAG,
40228 SDValue Ptr1 = Ld->getBasePtr();
40229 SDValue Ptr2 = DAG.getMemBasePlusOffset(Ptr1, HalfAlign, dl);
40232 SDValue Load1 =
40235 SDValue Load2 = DAG.getLoad(HalfVT, dl, Ld->getChain(), Ptr2,
40239 SDValue TF = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
40242 SDValue NewVec = DAG.getNode(ISD::CONCAT_VECTORS, dl, RegVT, Load1, Load2);
40253 SDValue IntLoad = DAG.getLoad(IntVT, dl, Ld->getChain(), Ld->getBasePtr(),
40256 SDValue BoolVec = DAG.getBitcast(RegVT, IntLoad);
40267 static int getOneTrueElt(SDValue V) {
40282 const SDValue &Op = BV->getOperand(i);
40303 SelectionDAG &DAG, SDValue &Addr,
40304 SDValue &Index, unsigned &Alignment) {
40327 static SDValue
40334 SDValue Addr, VecIndex;
40344 SDValue Load =
40349 SDValue Insert = DAG.getNode(ISD::INSERT_VECTOR_ELT, DL, VT,
40354 static SDValue
40371 SDValue VecLd = DAG.getLoad(VT, DL, ML->getChain(), ML->getBasePtr(),
40373 SDValue Blend = DAG.getSelect(DL, VT, ML->getMask(), VecLd,
40392 SDValue NewML = DAG.getMaskedLoad(VT, DL, ML->getChain(), ML->getBasePtr(),
40396 SDValue Blend = DAG.getSelect(DL, VT, ML->getMask(), NewML,
40402 static SDValue combineMaskedLoad(SDNode *N, SelectionDAG &DAG,
40412 if (SDValue ScalarLoad = reduceMaskedLoadToScalarLoad(Mld, DAG, DCI))
40416 if (SDValue Blend = combineMaskedLoadConstantMask(Mld, DAG, DCI))
40427 static SDValue reduceMaskedStoreToScalarStore(MaskedStoreSDNode *MS,
40433 SDValue Addr, VecIndex;
40442 SDValue Extract = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, EltVT,
40450 static SDValue combineMaskedStore(SDNode *N, SelectionDAG &DAG,
40464 if (SDValue ScalarStore = reduceMaskedStoreToScalarStore(Mst, DAG))
40469 SDValue Mask = Mst->getMask();
40476 SDValue Value = Mst->getValue();
40488 static SDValue combineStore(SDNode *N, SelectionDAG &DAG,
40495 SDValue StoredVal = St->getValue();
40525 SmallVector<SDValue, 4> Ops(NumConcats, DAG.getUNDEF(VT));
40539 SDValue Lo = DAG.getBuildVector(MVT::v32i1, dl,
40542 SDValue Hi = DAG.getBuildVector(MVT::v32i1, dl,
40546 SDValue Ptr0 = St->getBasePtr();
40547 SDValue Ptr1 = DAG.getMemBasePlusOffset(Ptr0, 4, dl);
40549 SDValue Ch0 =
40552 SDValue Ch1 =
40608 SDValue Ext = DAG.getNode(ISD::ANY_EXTEND, dl, MVT::v16i32, St->getValue());
40632 if (SDValue Avg = detectAVGPattern(St->getValue(), St->getMemoryVT(), DAG,
40639 if (SDValue Val = detectSSatPattern(St->getValue(), St->getMemoryVT()))
40643 if (SDValue Val = detectUSatPattern(St->getValue(), St->getMemoryVT(),
40671 SmallVector<SDValue, 8> Ops;
40689 SDValue NewLd = DAG.getLoad(LdVT, LdDL, Ld->getChain(), Ld->getBasePtr(),
40699 SDValue LoAddr = Ld->getBasePtr();
40700 SDValue HiAddr = DAG.getMemBasePlusOffset(LoAddr, 4, LdDL);
40702 SDValue LoLd = DAG.getLoad(MVT::i32, LdDL, Ld->getChain(), LoAddr,
40705 SDValue HiLd = DAG.getLoad(MVT::i32, LdDL, Ld->getChain(), HiAddr,
40716 SDValue LoSt =
40719 SDValue HiSt = DAG.getStore(St->getChain(), StDL, HiLd, HiAddr,
40734 SDValue OldExtract = St->getOperand(1);
40735 SDValue ExtOp0 = OldExtract.getOperand(0);
40738 SDValue BitCast = DAG.getBitcast(VecVT, ExtOp0);
40739 SDValue NewExtract = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, MVT::f64,
40762 static bool isHorizontalBinOp(SDValue &LHS, SDValue &RHS, SelectionDAG &DAG,
40762 static bool isHorizontalBinOp(SDValue &LHS, SDValue &RHS, SelectionDAG &DAG,
40803 SmallVector<SDValue, 2> SrcOps;
40805 SDValue BC = peekThroughBitcasts(Op);
40830 SDValue A, B;
40836 SDValue C, D;
40913 static SDValue combineFaddFsub(SDNode *N, SelectionDAG &DAG,
40916 SDValue LHS = N->getOperand(0);
40917 SDValue RHS = N->getOperand(1);
40936 static SDValue combineTruncatedArithmetic(SDNode *N, SelectionDAG &DAG,
40940 SDValue Src = N->getOperand(0);
40967 SDValue Trunc0 = DAG.getNode(ISD::TRUNCATE, DL, VT, N0);
40968 SDValue Trunc1 = DAG.getNode(ISD::TRUNCATE, DL, VT, N1);
40988 SDValue Op0 = Src.getOperand(0);
40989 SDValue Op1 = Src.getOperand(1);
41005 SDValue Op0 = Src.getOperand(0);
41006 SDValue Op1 = Src.getOperand(1);
41015 SDValue Op0 = Src.getOperand(0);
41016 SDValue Op1 = Src.getOperand(1);
41031 static SDValue combineVectorTruncationWithPACKUS(SDNode *N, const SDLoc &DL,
41034 SDValue In = N->getOperand(0);
41045 static SDValue combineVectorTruncationWithPACKSS(SDNode *N, const SDLoc &DL,
41048 SDValue In = N->getOperand(0);
41061 static SDValue combineVectorTruncation(SDNode *N, SelectionDAG &DAG,
41067 SDValue In = N->getOperand(0);
41108 static SDValue combineVectorSignBitsTruncation(SDNode *N, const SDLoc &DL,
41118 SDValue In = N->getOperand(0);
41169 static SDValue combinePMULH(SDValue Src, EVT VT, const SDLoc &DL,
41169 static SDValue combinePMULH(SDValue Src, EVT VT, const SDLoc &DL,
41195 SDValue LHS = Src.getOperand(0).getOperand(0);
41196 SDValue RHS = Src.getOperand(0).getOperand(1);
41223 static SDValue detectPMADDUBSW(SDValue In, EVT VT, SelectionDAG &DAG,
41223 static SDValue detectPMADDUBSW(SDValue In, EVT VT, SelectionDAG &DAG,
41234 SDValue SSatVal = detectSSatPattern(In, VT);
41240 SDValue N0 = SSatVal.getOperand(0);
41241 SDValue N1 = SSatVal.getOperand(1);
41246 SDValue N00 = N0.getOperand(0);
41247 SDValue N01 = N0.getOperand(1);
41248 SDValue N10 = N1.getOperand(0);
41249 SDValue N11 = N1.getOperand(1);
41293 SDValue ZExtIn, SExtIn;
41295 SDValue N00Elt = N00.getOperand(i);
41296 SDValue N01Elt = N01.getOperand(i);
41297 SDValue N10Elt = N10.getOperand(i);
41298 SDValue N11Elt = N11.getOperand(i);
41324 SDValue N00In = N00Elt.getOperand(0);
41325 SDValue N01In = N01Elt.getOperand(0);
41326 SDValue N10In = N10Elt.getOperand(0);
41327 SDValue N11In = N11Elt.getOperand(0);
41354 static SDValue combineTruncate(SDNode *N, SelectionDAG &DAG,
41357 SDValue Src = N->getOperand(0);
41361 if (SDValue V = combineTruncatedArithmetic(N, DAG, Subtarget, DL))
41365 if (SDValue Avg = detectAVGPattern(Src, VT, DAG, Subtarget, DL))
41369 if (SDValue PMAdd = detectPMADDUBSW(Src, VT, DAG, Subtarget, DL))
41373 if (SDValue Val = combineTruncateWithSat(Src, VT, DL, DAG, Subtarget))
41377 if (SDValue V = combinePMULH(Src, VT, DL, DAG, Subtarget))
41383 SDValue BCSrc = Src.getOperand(0);
41389 if (SDValue V = combineVectorSignBitsTruncation(N, DL, DAG, Subtarget))
41395 static SDValue combineVTRUNC(SDNode *N, SelectionDAG &DAG) {
41397 SDValue In = N->getOperand(0);
41400 if (auto SSatVal = detectSSatPattern(In, VT))
41402 if (auto USatVal = detectUSatPattern(In, VT, DAG, DL))
41417 static SDValue isFNEG(SelectionDAG &DAG, SDNode *N, unsigned Depth = 0) {
41427 SDValue Op = peekThroughBitcasts(SDValue(N, 0));
41438 if (SDValue NegOp0 = isFNEG(DAG, SVOp->getOperand(0).getNode(), Depth + 1))
41448 SDValue InsVector = Op.getOperand(0);
41449 SDValue InsVal = Op.getOperand(1);
41452 if (SDValue NegInsVal = isFNEG(DAG, InsVal.getNode(), Depth + 1))
41462 SDValue Op1 = Op.getOperand(1);
41463 SDValue Op0 = Op.getOperand(0);
41541 static SDValue combineFneg(SDNode *N, SelectionDAG &DAG,
41544 SDValue Arg = isFNEG(DAG, N);
41561 SDValue Zero = DAG.getConstantFP(0.0, DL, VT);
41562 SDValue NewNode = DAG.getNode(X86ISD::FNMSUB, DL, VT, Arg.getOperand(0),
41591 char X86TargetLowering::isNegatibleForFree(SDValue Op, SelectionDAG &DAG,
41634 SDValue X86TargetLowering::getNegatedExpression(SDValue Op, SelectionDAG &DAG,
41634 SDValue X86TargetLowering::getNegatedExpression(SDValue Op, SelectionDAG &DAG,
41639 if (SDValue Arg = isFNEG(DAG, Op.getNode(), Depth))
41660 SmallVector<SDValue, 4> NewOps(Op.getNumOperands(), SDValue());
41686 static SDValue lowerX86FPLogicOp(SDNode *N, SelectionDAG &DAG,
41699 SDValue Op0 = DAG.getBitcast(IntVT, N->getOperand(0));
41700 SDValue Op1 = DAG.getBitcast(IntVT, N->getOperand(1));
41709 SDValue IntOp = DAG.getNode(IntOpcode, dl, IntVT, Op0, Op1);
41715 static SDValue foldXor1SetCC(SDNode *N, SelectionDAG &DAG) {
41719 SDValue LHS = N->getOperand(0);
41730 static SDValue combineXor(SDNode *N, SelectionDAG &DAG,
41742 if (SDValue Cmp = foldVectorXorShiftIntoCmp(N, DAG, Subtarget))
41748 if (SDValue SetCC = foldXor1SetCC(N, DAG))
41751 if (SDValue RV = foldXorTruncShiftIntoCmp(N, DAG))
41754 if (SDValue FPLogic = convertIntLogicToFPLogic(N, DAG, Subtarget))
41760 static SDValue combineBEXTR(SDNode *N, SelectionDAG &DAG,
41763 SDValue Op0 = N->getOperand(0);
41764 SDValue Op1 = N->getOperand(1);
41789 static bool isNullFPScalarOrVectorConst(SDValue V) {
41799 static SDValue getNullFPConstForNullVal(SDValue V, SelectionDAG &DAG,
41799 static SDValue getNullFPConstForNullVal(SDValue V, SelectionDAG &DAG,
41810 static SDValue combineFAndFNotToFAndn(SDNode *N, SelectionDAG &DAG,
41812 SDValue N0 = N->getOperand(0);
41813 SDValue N1 = N->getOperand(1);
41842 static SDValue combineFAnd(SDNode *N, SelectionDAG &DAG,
41845 if (SDValue V = getNullFPConstForNullVal(N->getOperand(0), DAG, Subtarget))
41849 if (SDValue V = getNullFPConstForNullVal(N->getOperand(1), DAG, Subtarget))
41852 if (SDValue V = combineFAndFNotToFAndn(N, DAG, Subtarget))
41859 static SDValue combineFAndn(SDNode *N, SelectionDAG &DAG,
41866 if (SDValue V = getNullFPConstForNullVal(N->getOperand(1), DAG, Subtarget))
41873 static SDValue combineFOr(SDNode *N, SelectionDAG &DAG,
41885 if (SDValue NewVal = combineFneg(N, DAG, Subtarget))
41892 static SDValue combineFMinFMax(SDNode *N, SelectionDAG &DAG) {
41912 static SDValue combineFMinNumFMaxNum(SDNode *N, SelectionDAG &DAG,
41925 SDValue Op0 = N->getOperand(0);
41926 SDValue Op1 = N->getOperand(1);
41969 SDValue MinOrMax = DAG.getNode(MinMaxOp, DL, VT, Op1, Op0);
41970 SDValue IsOp0Nan = DAG.getSetCC(DL, SetCCType, Op0, Op0, ISD::SETUO);
41977 static SDValue combineX86INT_TO_FP(SDNode *N, SelectionDAG &DAG,
41989 SDValue In = N->getOperand(0);
42002 SDValue Ops[] = { LN->getChain(), LN->getBasePtr() };
42003 SDValue VZLoad =
42008 SDValue Convert = DAG.getNode(N->getOpcode(), dl, VT,
42019 static SDValue combineCVTP2I_CVTTP2I(SDNode *N, SelectionDAG &DAG,
42024 SDValue In = N->getOperand(0);
42037 SDValue Ops[] = { LN->getChain(), LN->getBasePtr() };
42038 SDValue VZLoad =
42043 SDValue Convert = DAG.getNode(N->getOpcode(), dl, VT,
42055 static SDValue combineAndnp(SDNode *N, SelectionDAG &DAG,
42069 if (SDValue Not = IsNOT(N->getOperand(0), DAG))
42075 SDValue Op(N, 0);
42076 if (SDValue Res = combineX86ShufflesRecursively(Op, DAG, Subtarget))
42083 static SDValue combineBT(SDNode *N, SelectionDAG &DAG,
42085 SDValue N0 = N->getOperand(0);
42086 SDValue N1 = N->getOperand(1);
42091 if (SDValue DemandedN1 = DAG.GetDemandedBits(N1, DemandedMask))
42098 static SDValue combineSextInRegCmov(SDNode *N, SelectionDAG &DAG) {
42103 SDValue N0 = N->getOperand(0);
42104 SDValue N1 = N->getOperand(1);
42111 SDValue IntermediateBitwidthOp;
42122 SDValue CMovOp0 = N0.getOperand(0);
42123 SDValue CMovOp1 = N0.getOperand(1);
42150 SDValue CMov = DAG.getNode(X86ISD::CMOV, DL, CMovVT, CMovOp0, CMovOp1,
42159 static SDValue combineSignExtendInReg(SDNode *N, SelectionDAG &DAG,
42163 if (SDValue V = combineSextInRegCmov(N, DAG))
42167 SDValue N0 = N->getOperand(0);
42168 SDValue N1 = N->getOperand(1);
42179 SDValue N00 = N0.getOperand(0);
42188 SDValue Tmp = DAG.getNode(ISD::SIGN_EXTEND_INREG, dl, MVT::v4i32,
42201 static SDValue promoteExtBeforeAdd(SDNode *Ext, SelectionDAG &DAG,
42212 SDValue Add = Ext->getOperand(0);
42249 SDValue AddOp0 = Add.getOperand(0);
42250 SDValue NewExt = DAG.getNode(Ext->getOpcode(), SDLoc(Ext), VT, AddOp0);
42251 SDValue NewConstant = DAG.getConstant(AddConstant, SDLoc(Add), VT);
42273 static SDValue combineToExtendCMOV(SDNode *Extend, SelectionDAG &DAG) {
42274 SDValue CMovN = Extend->getOperand(0);
42283 SDValue CMovOp0 = CMovN.getOperand(0);
42284 SDValue CMovOp1 = CMovN.getOperand(1);
42308 SDValue Res = DAG.getNode(X86ISD::CMOV, DL, ExtendVT, CMovOp0, CMovOp1,
42320 static SDValue
42333 SDValue N0 = N->getOperand(0);
42348 SDValue N00 = N0.getOperand(0);
42354 SDValue Vec;
42378 SDValue Scl = DAG.getAnyExtOrTrunc(N00, DL, SVT);
42385 SmallVector<SDValue, 32> Bits;
42391 SDValue BitMask = DAG.getBuildVector(VT, DL, Bits);
42409 static SDValue combineExtSetcc(SDNode *N, SelectionDAG &DAG,
42411 SDValue N0 = N->getOperand(0);
42442 SDValue Res = DAG.getSetCC(dl, VT, N0.getOperand(0), N0.getOperand(1), CC);
42450 static SDValue combineSext(SDNode *N, SelectionDAG &DAG,
42453 SDValue N0 = N->getOperand(0);
42458 if (SDValue NewCMov = combineToExtendCMOV(N, DAG))
42464 if (SDValue V = combineExtSetcc(N, DAG, Subtarget))
42473 SDValue Zext = DAG.getNode(ISD::ZERO_EXTEND, DL, VT, N0.getOperand(0));
42477 if (SDValue V = combineToExtendBoolVectorInReg(N, DAG, DCI, Subtarget))
42481 if (SDValue R = PromoteMaskArithmetic(N, DAG, Subtarget))
42484 if (SDValue NewAdd = promoteExtBeforeAdd(N, DAG, Subtarget))
42490 static SDValue combineFMA(SDNode *N, SelectionDAG &DAG,
42505 SDValue A = N->getOperand(0);
42506 SDValue B = N->getOperand(1);
42507 SDValue C = N->getOperand(2);
42520 SDValue Vec = V.getOperand(0);
42522 SDValue NegVal =
42552 static SDValue combineFMADDSUB(SDNode *N, SelectionDAG &DAG,
42560 SDValue N2 = N->getOperand(2);
42564 SDValue NegN2 = TLI.getNegatedExpression(N2, DAG, LegalOperations, CodeSize);
42574 static SDValue combineZext(SDNode *N, SelectionDAG &DAG,
42582 SDValue N0 = N->getOperand(0);
42588 SDValue N00 = N0.getOperand(0);
42602 SDValue N00 = N0.getOperand(0);
42611 if (SDValue NewCMov = combineToExtendCMOV(N, DAG))
42615 if (SDValue V = combineExtSetcc(N, DAG, Subtarget))
42618 if (SDValue V = combineToExtendBoolVectorInReg(N, DAG, DCI, Subtarget))
42622 if (SDValue R = PromoteMaskArithmetic(N, DAG, Subtarget))
42625 if (SDValue NewAdd = promoteExtBeforeAdd(N, DAG, Subtarget))
42628 if (SDValue R = combineOrCmpEqZeroToCtlzSrl(N, DAG, DCI, Subtarget))
42634 SDValue N00 = N0.getOperand(0);
42635 SDValue N01 = N0.getOperand(1);
42649 static SDValue combineVectorSizedSetCCEquality(SDNode *SetCC, SelectionDAG &DAG,
42655 SDValue X = SetCC->getOperand(0);
42656 SDValue Y = SetCC->getOperand(1);
42728 SDValue OrigX = X.getOperand(0);
42752 SDValue Cmp;
42758 SDValue A = ScalarToVector(X.getOperand(0).getOperand(0));
42759 SDValue B = ScalarToVector(X.getOperand(0).getOperand(1));
42760 SDValue C = ScalarToVector(X.getOperand(1).getOperand(0));
42761 SDValue D = ScalarToVector(X.getOperand(1).getOperand(1));
42763 SDValue Cmp1 = DAG.getSetCC(DL, CmpVT, A, B, ISD::SETNE);
42764 SDValue Cmp2 = DAG.getSetCC(DL, CmpVT, C, D, ISD::SETNE);
42767 SDValue Cmp1 = DAG.getNode(ISD::XOR, DL, VecVT, A, B);
42768 SDValue Cmp2 = DAG.getNode(ISD::XOR, DL, VecVT, C, D);
42771 SDValue Cmp1 = DAG.getSetCC(DL, CmpVT, A, B, ISD::SETEQ);
42772 SDValue Cmp2 = DAG.getSetCC(DL, CmpVT, C, D, ISD::SETEQ);
42776 SDValue VecX = ScalarToVector(X);
42777 SDValue VecY = ScalarToVector(Y);
42794 SDValue BCCmp = DAG.getBitcast(OpSize == 256 ? MVT::v4i64 : MVT::v2i64,
42796 SDValue PT = DAG.getNode(X86ISD::PTEST, DL, MVT::i32, BCCmp, BCCmp);
42798 SDValue SetCC = getSETCC(X86CC, PT, DL, DAG);
42806 SDValue MovMsk = DAG.getNode(X86ISD::MOVMSK, DL, MVT::i32, Cmp);
42807 SDValue FFFFs = DAG.getConstant(OpSize == 128 ? 0xFFFF : 0xFFFFFFFF, DL,
42815 static SDValue combineSetCC(SDNode *N, SelectionDAG &DAG,
42818 SDValue LHS = N->getOperand(0);
42819 SDValue RHS = N->getOperand(1);
42829 SDValue Add = DAG.getNode(ISD::ADD, DL, OpVT, RHS, LHS.getOperand(1));
42836 SDValue Add = DAG.getNode(ISD::ADD, DL, OpVT, LHS, RHS.getOperand(1));
42840 if (SDValue V = combineVectorSizedSetCCEquality(N, DAG, Subtarget))
42882 SDValue Setcc = DAG.getNode(ISD::SETCC, DL, OpVT, LHS, RHS,
42896 static SDValue combineMOVMSK(SDNode *N, SelectionDAG &DAG,
42899 SDValue Src = N->getOperand(0);
42925 if (SDValue NotSrc = IsNOT(Src, DAG)) {
42943 static SDValue combineX86GatherScatter(SDNode *N, SelectionDAG &DAG,
42946 SDValue Mask = cast<X86MaskedGatherScatterSDNode>(N)->getMask();
42957 static SDValue combineGatherScatter(SDNode *N, SelectionDAG &DAG,
42961 SDValue Chain = GorS->getChain();
42962 SDValue Index = GorS->getIndex();
42963 SDValue Mask = GorS->getMask();
42964 SDValue Base = GorS->getBasePtr();
42965 SDValue Scale = GorS->getScale();
42984 SDValue Ops[] = { Chain, Gather->getPassThru(),
42992 SDValue Ops[] = { Chain, Scatter->getValue(),
43013 SDValue Ops[] = { Chain, Gather->getPassThru(),
43021 SDValue Ops[] = { Chain, Scatter->getValue(),
43040 SDValue Ops[] = { Chain, Gather->getPassThru(),
43048 SDValue Ops[] = { Chain, Scatter->getValue(),
43069 static SDValue combineX86SetCC(SDNode *N, SelectionDAG &DAG,
43073 SDValue EFLAGS = N->getOperand(1);
43076 if (SDValue Flags = combineSetCCEFLAGS(EFLAGS, CC, DAG, Subtarget))
43083 static SDValue combineBrCond(SDNode *N, SelectionDAG &DAG,
43086 SDValue EFLAGS = N->getOperand(3);
43092 if (SDValue Flags = combineSetCCEFLAGS(EFLAGS, CC, DAG, Subtarget)) {
43093 SDValue Cond = DAG.getTargetConstant(CC, DL, MVT::i8);
43101 static SDValue combineVectorCompareAndMaskUnaryOp(SDNode *N,
43134 SDValue SourceConst = DAG.getNode(N->getOpcode(), DL, VT, SDValue(BV, 0));
43136 SDValue MaskConst = DAG.getBitcast(IntVT, SourceConst);
43137 SDValue NewAnd = DAG.getNode(ISD::AND, DL, IntVT,
43139 SDValue Res = DAG.getBitcast(VT, NewAnd);
43149 static SDValue combineToFPTruncExtElt(SDNode *N, SelectionDAG &DAG) {
43153 SDValue Trunc = N->getOperand(0);
43157 SDValue ExtElt = Trunc.getOperand(0);
43174 SDValue BitcastVec = DAG.getBitcast(BitcastVT, ExtElt.getOperand(0));
43176 SDValue NewExtElt = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, TruncVT,
43181 static SDValue combineUIntToFP(SDNode *N, SelectionDAG &DAG,
43183 SDValue Op0 = N->getOperand(0);
43194 SDValue P = DAG.getNode(ISD::ZERO_EXTEND, dl, DstVT, Op0);
43209 static SDValue combineSIntToFP(SDNode *N, SelectionDAG &DAG,
43214 if (SDValue Res = combineVectorCompareAndMaskUnaryOp(N, DAG))
43218 SDValue Op0 = N->getOperand(0);
43229 SDValue P = DAG.getNode(ISD::SIGN_EXTEND, dl, DstVT, Op0);
43246 SDValue Trunc = DAG.getNode(ISD::TRUNCATE, dl, TruncVT, Op0);
43252 SDValue Cast = DAG.getBitcast(MVT::v4i32, Op0);
43253 SDValue Shuf = DAG.getVectorShuffle(MVT::v4i32, dl, Cast, Cast,
43278 SDValue FILDChain = Subtarget.getTargetLowering()->BuildFILD(
43285 if (SDValue V = combineToFPTruncExtElt(N, DAG))
43291 static bool needCarryOrOverflowFlag(SDValue Flags) {
43329 static bool onlyZeroFlagUsed(SDValue Flags) {
43355 static SDValue combineCMP(SDNode *N, SelectionDAG &DAG) {
43365 SDValue Op = N->getOperand(0);
43427 SDValue Op0 = DAG.getNode(ISD::TRUNCATE, dl, VT, Op.getOperand(0));
43428 SDValue Op1 = DAG.getNode(ISD::TRUNCATE, dl, VT, Op.getOperand(1));
43443 static SDValue combineX86AddSub(SDNode *N, SelectionDAG &DAG,
43449 SDValue LHS = N->getOperand(0);
43450 SDValue RHS = N->getOperand(1);
43456 SDValue Res = DAG.getNode(GenericOpc, DL, VT, LHS, RHS);
43462 SDValue Ops[] = {N0, N1};
43465 SDValue Op(N, 0);
43477 static SDValue combineSBB(SDNode *N, SelectionDAG &DAG) {
43478 if (SDValue Flags = combineCarryThroughADD(N->getOperand(2), DAG)) {
43488 SDValue Op0 = N->getOperand(0);
43489 SDValue Op1 = N->getOperand(1);
43499 static SDValue combineADC(SDNode *N, SelectionDAG &DAG,
43511 SDValue CarryOut = DAG.getConstant(0, DL, N->getValueType(1));
43512 SDValue Res1 =
43521 if (SDValue Flags = combineCarryThroughADD(N->getOperand(2), DAG)) {
43535 static SDValue combineAddOrSubToADCOrSBB(SDNode *N, SelectionDAG &DAG) {
43537 SDValue X = N->getOperand(0);
43538 SDValue Y = N->getOperand(1);
43583 SDValue EFLAGS = Y->getOperand(1);
43590 SDValue NewSub = DAG.getNode(
43593 SDValue NewEFLAGS = SDValue(NewSub.getNode(), EFLAGS.getResNo());
43610 SDValue EFLAGS = Y->getOperand(1);
43620 SDValue NewSub = DAG.getNode(X86ISD::SUB, SDLoc(EFLAGS),
43623 SDValue NewEFLAGS = SDValue(NewSub.getNode(), EFLAGS.getResNo());
43633 SDValue Cmp = Y.getOperand(1);
43639 SDValue Z = Cmp.getOperand(0);
43651 SDValue Zero = DAG.getConstant(0, DL, ZVT);
43653 SDValue Neg = DAG.getNode(X86ISD::SUB, DL, X86SubVTs, Zero, Z);
43665 SDValue One = DAG.getConstant(1, DL, ZVT);
43666 SDValue Cmp1 = DAG.getNode(X86ISD::CMP, DL, MVT::i32, Z, One);
43673 SDValue One = DAG.getConstant(1, DL, ZVT);
43674 SDValue Cmp1 = DAG.getNode(X86ISD::CMP, DL, MVT::i32, Z, One);
43691 static SDValue combineLoopMAddPattern(SDNode *N, SelectionDAG &DAG,
43703 SDValue Op0 = N->getOperand(0);
43704 SDValue Op1 = N->getOperand(1);
43715 SDValue MulOp, OtherOp;
43732 SDValue N0 = DAG.getNode(ISD::TRUNCATE, DL, ReducedVT, MulOp->getOperand(0));
43733 SDValue N1 = DAG.getNode(ISD::TRUNCATE, DL, ReducedVT, MulOp->getOperand(1));
43741 SDValue Madd = SplitOpsAndApply(DAG, Subtarget, DL, MAddVT, { N0, N1 },
43744 SDValue Zero = DAG.getConstant(0, DL, Madd.getSimpleValueType());
43745 SDValue Concat = DAG.getNode(ISD::CONCAT_VECTORS, DL, VT, Madd, Zero);
43754 static SDValue combineLoopSADPattern(SDNode *N, SelectionDAG &DAG,
43782 SDValue AbsOp = N->getOperand(0);
43783 SDValue OtherOp = N->getOperand(1);
43790 SDValue SadOp0, SadOp1;
43798 SDValue Sad = createPSADBW(DAG, SadOp0, SadOp1, DL, Subtarget);
43814 SmallVector<SDValue, 4> Ops(NumConcats, DAG.getConstant(0, DL, ResVT));
43829 static SDValue matchPMADDWD(SelectionDAG &DAG, SDValue Op0, SDValue Op1,
43829 static SDValue matchPMADDWD(SelectionDAG &DAG, SDValue Op0, SDValue Op1,
43829 static SDValue matchPMADDWD(SelectionDAG &DAG, SDValue Op0, SDValue Op1,
43866 SDValue Mul;
43868 SDValue Op0L = Op0->getOperand(i), Op1L = Op1->getOperand(i),
43941 static SDValue matchPMADDWD_2(SelectionDAG &DAG, SDValue N0, SDValue N1,
43941 static SDValue matchPMADDWD_2(SelectionDAG &DAG, SDValue N0, SDValue N1,
43941 static SDValue matchPMADDWD_2(SelectionDAG &DAG, SDValue N0, SDValue N1,
43955 SDValue N00 = N0.getOperand(0);
43956 SDValue N01 = N0.getOperand(1);
43957 SDValue N10 = N1.getOperand(0);
43958 SDValue N11 = N1.getOperand(1);
43993 SDValue In0, In1;
43995 SDValue N00Elt = N00.getOperand(i);
43996 SDValue N01Elt = N01.getOperand(i);
43997 SDValue N10Elt = N10.getOperand(i);
43998 SDValue N11Elt = N11.getOperand(i);
44024 SDValue N00In = N00Elt.getOperand(0);
44025 SDValue N01In = N01Elt.getOperand(0);
44026 SDValue N10In = N10Elt.getOperand(0);
44027 SDValue N11In = N11Elt.getOperand(0);
44059 static SDValue combineAdd(SDNode *N, SelectionDAG &DAG,
44064 if (SDValue Sad = combineLoopSADPattern(N, DAG, Subtarget))
44066 if (SDValue MAdd = combineLoopMAddPattern(N, DAG, Subtarget))
44070 SDValue Op0 = N->getOperand(0);
44071 SDValue Op1 = N->getOperand(1);
44073 if (SDValue MAdd = matchPMADDWD(DAG, Op0, Op1, SDLoc(N), VT, Subtarget))
44075 if (SDValue MAdd = matchPMADDWD_2(DAG, Op0, Op1, SDLoc(N), VT, Subtarget))
44102 SDValue SExt = DAG.getNode(ISD::SIGN_EXTEND, DL, VT, Op0.getOperand(0));
44110 SDValue SExt = DAG.getNode(ISD::SIGN_EXTEND, DL, VT, Op1.getOperand(0));
44118 static SDValue combineSubToSubus(SDNode *N, SelectionDAG &DAG,
44120 SDValue Op0 = N->getOperand(0);
44121 SDValue Op1 = N->getOperand(1);
44135 SDValue SubusLHS, SubusRHS;
44141 SDValue MaxLHS = Op0.getOperand(0);
44142 SDValue MaxRHS = Op0.getOperand(1);
44151 SDValue MinLHS = Op1.getOperand(0);
44152 SDValue MinRHS = Op1.getOperand(1);
44188 SDValue SaturationConst =
44192 SDValue UMin = DAG.getNode(ISD::UMIN, SDLoc(SubusLHS), ExtType, SubusRHS,
44194 SDValue NewSubusLHS =
44196 SDValue NewSubusRHS = DAG.getZExtOrTrunc(UMin, SDLoc(SubusRHS), ShrinkedType);
44197 SDValue Psubus = DAG.getNode(ISD::USUBSAT, SDLoc(N), ShrinkedType,
44205 static SDValue combineSub(SDNode *N, SelectionDAG &DAG,
44208 SDValue Op0 = N->getOperand(0);
44209 SDValue Op1 = N->getOperand(1);
44221 SDValue NewXor = DAG.getNode(ISD::XOR, SDLoc(Op1), VT,
44244 if (SDValue V = combineSubToSubus(N, DAG, Subtarget))
44250 static SDValue combineVectorCompare(SDNode *N, SelectionDAG &DAG,
44268 static SDValue combineConcatVectorOps(const SDLoc &DL, MVT VT,
44269 ArrayRef<SDValue> Ops, SelectionDAG &DAG,
44282 SDValue Op0 = Ops[0];
44292 if (SDValue Ld =
44337 SmallVector<SDValue, 2> Src;
44349 SmallVector<SDValue, 2> Src;
44352 SDValue Res = DAG.getNode(ISD::CONCAT_VECTORS, DL, MVT::v8f32, Src);
44360 SmallVector<SDValue, 2> LHS, RHS;
44379 static SDValue combineConcatVectors(SDNode *N, SelectionDAG &DAG,
44391 SmallVector<SDValue, 4> Ops(N->op_begin(), N->op_end());
44392 if (SDValue R = combineConcatVectorOps(SDLoc(N), VT.getSimpleVT(), Ops, DAG,
44400 static SDValue combineInsertSubvector(SDNode *N, SelectionDAG &DAG,
44411 SDValue Vec = N->getOperand(0);
44412 SDValue SubVec = N->getOperand(1);
44444 SDValue Ins = SubVec.getOperand(0);
44480 SmallVector<SDValue, 2> SubVectorOps;
44482 if (SDValue Fold =
44508 SDValue Ops[] = { MemIntr->getChain(), MemIntr->getBasePtr() };
44509 SDValue BcastLd =
44526 static SDValue narrowExtractedVectorSelect(SDNode *Ext, SelectionDAG &DAG) {
44527 SDValue Sel = peekThroughBitcasts(Ext->getOperand(0));
44528 SmallVector<SDValue, 4> CatOps;
44571 SDValue ExtCond = extract128BitVector(Sel.getOperand(0), ExtIdx, DAG, DL);
44572 SDValue ExtT = extract128BitVector(Sel.getOperand(1), ExtIdx, DAG, DL);
44573 SDValue ExtF = extract128BitVector(Sel.getOperand(2), ExtIdx, DAG, DL);
44574 SDValue NarrowSel = DAG.getSelect(DL, NarrowSelVT, ExtCond, ExtT, ExtF);
44578 static SDValue combineExtractSubvector(SDNode *N, SelectionDAG &DAG,
44595 SDValue InVec = N->getOperand(0);
44596 SDValue InVecBC = peekThroughBitcasts(InVec);
44608 SDValue NotOp = V->getOperand(0);
44614 SDValue Concat = split256IntArith(InVecBC, DAG);
44623 if (SDValue V = narrowExtractedVectorSelect(N, DAG))
44658 SDValue NewIndex = DAG.getIntPtrConstant(IndexValScaled, DL);
44659 SDValue NewExtract = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, NewExtVT,
44692 SDValue Ops[] = { MemIntr->getChain(), MemIntr->getBasePtr() };
44693 SDValue BcastLd =
44739 SDValue Ext0 = extractSubVector(InVec.getOperand(0), 0, DAG, DL, 128);
44740 SDValue Ext1 = extractSubVector(InVec.getOperand(1), 0, DAG, DL, 128);
44741 SDValue Ext2 = extractSubVector(InVec.getOperand(2), 0, DAG, DL, 128);
44749 static SDValue combineScalarToVector(SDNode *N, SelectionDAG &DAG) {
44751 SDValue Src = N->getOperand(0);
44786 static SDValue combinePMULDQ(SDNode *N, SelectionDAG &DAG,
44789 SDValue LHS = N->getOperand(0);
44790 SDValue RHS = N->getOperand(1);
44838 static SDValue combineExtInVec(SDNode *N, SelectionDAG &DAG,
44842 SDValue In = N->getOperand(0);
44855 SDValue Load =
44868 SDValue Op(N, 0);
44870 if (SDValue Res = combineX86ShufflesRecursively(Op, DAG, Subtarget))
44877 static SDValue combineKSHIFT(SDNode *N, SelectionDAG &DAG,
44891 SDValue X86TargetLowering::PerformDAGCombine(SDNode *N,
45085 SDValue X86TargetLowering::expandIndirectJTBranch(const SDLoc& dl,
45086 SDValue Value, SDValue Addr,
45086 SDValue Value, SDValue Addr,
45101 bool X86TargetLowering::IsDesirableToPromoteOp(SDValue Op, EVT &PVT) const {
45147 SDValue N0 = Op.getOperand(0);
45161 SDValue N0 = Op.getOperand(0);
45162 SDValue N1 = Op.getOperand(1);
45586 SDValue X86TargetLowering::LowerAsmOutputForConstraint(
45587 SDValue &Chain, SDValue &Flag, SDLoc DL, const AsmOperandInfo &OpInfo,
45587 SDValue &Chain, SDValue &Flag, SDLoc DL, const AsmOperandInfo &OpInfo,
45604 SDValue CC = getSETCC(Cond, Flag, DL, DAG);
45606 SDValue Result = DAG.getNode(ISD::ZERO_EXTEND, DL, OpInfo.ConstraintVT, CC);
45613 void X86TargetLowering::LowerAsmOperandForConstraint(SDValue Op,
45615 std::vector<SDValue>&Ops,
45617 SDValue Result;
lib/Target/X86/X86ISelLowering.h 678 bool isZeroNode(SDValue Elt);
692 bool isConstantSplat(SDValue Op, APInt &SplatVal);
718 SDValue getPICJumpTableRelocBase(SDValue Table,
718 SDValue getPICJumpTableRelocBase(SDValue Table,
762 SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
762 SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
769 SmallVectorImpl<SDValue> &Results,
775 void ReplaceNodeResults(SDNode *N, SmallVectorImpl<SDValue>&Results,
778 SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const override;
803 bool IsDesirableToPromoteOp(SDValue Op, EVT &PVT) const override;
808 char isNegatibleForFree(SDValue Op, SelectionDAG &DAG, bool LegalOperations,
812 SDValue getNegatedExpression(SDValue Op, SelectionDAG &DAG,
812 SDValue getNegatedExpression(SDValue Op, SelectionDAG &DAG,
860 bool hasAndNotCompare(SDValue Y) const override;
862 bool hasAndNot(SDValue Y) const override;
864 bool hasBitTest(SDValue X, SDValue Y) const override;
864 bool hasBitTest(SDValue X, SDValue Y) const override;
867 SDValue X, ConstantSDNode *XC, ConstantSDNode *CC, SDValue Y,
867 SDValue X, ConstantSDNode *XC, ConstantSDNode *CC, SDValue Y,
874 bool shouldFoldMaskToVariableShiftPair(SDValue Y) const override;
909 bool targetShrinkDemandedConstant(SDValue Op, const APInt &Demanded,
914 void computeKnownBitsForTargetNode(const SDValue Op,
921 unsigned ComputeNumSignBitsForTargetNode(SDValue Op,
926 bool SimplifyDemandedVectorEltsForTargetNode(SDValue Op,
933 bool SimplifyDemandedBitsForTargetNode(SDValue Op,
940 SDValue SimplifyMultipleUseDemandedBitsForTargetNode(
941 SDValue Op, const APInt &DemandedBits, const APInt &DemandedElts,
946 SDValue unwrapAddress(SDValue N) const override;
946 SDValue unwrapAddress(SDValue N) const override;
948 SDValue getReturnAddressFrameIndex(SelectionDAG &DAG) const;
965 void LowerAsmOperandForConstraint(SDValue Op,
967 std::vector<SDValue> &Ops,
984 SDValue LowerAsmOutputForConstraint(SDValue &Chain, SDValue &Flag, SDLoc DL,
984 SDValue LowerAsmOutputForConstraint(SDValue &Chain, SDValue &Flag, SDLoc DL,
984 SDValue LowerAsmOutputForConstraint(SDValue &Chain, SDValue &Flag, SDLoc DL,
1050 bool isZExtFree(SDValue Val, EVT VT2) const override;
1054 bool isVectorLoadExtDesirable(SDValue) const override;
1126 SDValue C) const override;
1139 bool shouldScalarizeBinop(SDValue) const override;
1197 SDValue emitStackGuardXorFP(SelectionDAG &DAG, SDValue Val,
1197 SDValue emitStackGuardXorFP(SelectionDAG &DAG, SDValue Val,
1206 SDValue BuildFILD(SDValue Op, EVT SrcVT, SDValue Chain, SDValue StackSlot,
1206 SDValue BuildFILD(SDValue Op, EVT SrcVT, SDValue Chain, SDValue StackSlot,
1206 SDValue BuildFILD(SDValue Op, EVT SrcVT, SDValue Chain, SDValue StackSlot,
1206 SDValue BuildFILD(SDValue Op, EVT SrcVT, SDValue Chain, SDValue StackSlot,
1249 SDValue expandIndirectJTBranch(const SDLoc& dl, SDValue Value,
1249 SDValue expandIndirectJTBranch(const SDLoc& dl, SDValue Value,
1250 SDValue Addr, SelectionDAG &DAG)
1278 SDValue LowerCallResult(SDValue Chain, SDValue InFlag,
1278 SDValue LowerCallResult(SDValue Chain, SDValue InFlag,
1278 SDValue LowerCallResult(SDValue Chain, SDValue InFlag,
1282 SmallVectorImpl<SDValue> &InVals,
1284 SDValue LowerMemArgument(SDValue Chain, CallingConv::ID CallConv,
1284 SDValue LowerMemArgument(SDValue Chain, CallingConv::ID CallConv,
1289 SDValue LowerMemOpCallTo(SDValue Chain, SDValue StackPtr, SDValue Arg,
1289 SDValue LowerMemOpCallTo(SDValue Chain, SDValue StackPtr, SDValue Arg,
1289 SDValue LowerMemOpCallTo(SDValue Chain, SDValue StackPtr, SDValue Arg,
1289 SDValue LowerMemOpCallTo(SDValue Chain, SDValue StackPtr, SDValue Arg,
1298 bool IsEligibleForTailCallOptimization(SDValue Callee,
1305 const SmallVectorImpl<SDValue> &OutVals,
1308 SDValue EmitTailCallLoadRetAddr(SelectionDAG &DAG, SDValue &OutRetAddr,
1308 SDValue EmitTailCallLoadRetAddr(SelectionDAG &DAG, SDValue &OutRetAddr,
1309 SDValue Chain, bool IsTailCall,
1318 SDValue FP_TO_INTHelper(SDValue Op, SelectionDAG &DAG, bool isSigned) const;
1318 SDValue FP_TO_INTHelper(SDValue Op, SelectionDAG &DAG, bool isSigned) const;
1320 SDValue LowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG) const;
1320 SDValue LowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG) const;
1321 SDValue LowerVSELECT(SDValue Op, SelectionDAG &DAG) const;
1321 SDValue LowerVSELECT(SDValue Op, SelectionDAG &DAG) const;
1322 SDValue LowerEXTRACT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const;
1322 SDValue LowerEXTRACT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const;
1323 SDValue LowerINSERT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const;
1323 SDValue LowerINSERT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const;
1327 SDValue LowerConstantPool(SDValue Op, SelectionDAG &DAG) const;
1327 SDValue LowerConstantPool(SDValue Op, SelectionDAG &DAG) const;
1328 SDValue LowerBlockAddress(SDValue Op, SelectionDAG &DAG) const;
1328 SDValue LowerBlockAddress(SDValue Op, SelectionDAG &DAG) const;
1329 SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const;
1329 SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const;
1330 SDValue LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const;
1330 SDValue LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const;
1331 SDValue LowerExternalSymbol(SDValue Op, SelectionDAG &DAG) const;
1331 SDValue LowerExternalSymbol(SDValue Op, SelectionDAG &DAG) const;
1335 SDValue LowerGlobalOrExternal(SDValue Op, SelectionDAG &DAG,
1335 SDValue LowerGlobalOrExternal(SDValue Op, SelectionDAG &DAG,
1338 SDValue LowerSINT_TO_FP(SDValue Op, SelectionDAG &DAG) const;
1338 SDValue LowerSINT_TO_FP(SDValue Op, SelectionDAG &DAG) const;
1339 SDValue LowerUINT_TO_FP(SDValue Op, SelectionDAG &DAG) const;
1339 SDValue LowerUINT_TO_FP(SDValue Op, SelectionDAG &DAG) const;
1340 SDValue LowerTRUNCATE(SDValue Op, SelectionDAG &DAG) const;
1340 SDValue LowerTRUNCATE(SDValue Op, SelectionDAG &DAG) const;
1341 SDValue LowerFP_TO_INT(SDValue Op, SelectionDAG &DAG) const;
1341 SDValue LowerFP_TO_INT(SDValue Op, SelectionDAG &DAG) const;
1342 SDValue LowerSETCC(SDValue Op, SelectionDAG &DAG) const;
1342 SDValue LowerSETCC(SDValue Op, SelectionDAG &DAG) const;
1343 SDValue LowerSETCCCARRY(SDValue Op, SelectionDAG &DAG) const;
1343 SDValue LowerSETCCCARRY(SDValue Op, SelectionDAG &DAG) const;
1344 SDValue LowerSELECT(SDValue Op, SelectionDAG &DAG) const;
1344 SDValue LowerSELECT(SDValue Op, SelectionDAG &DAG) const;
1345 SDValue LowerBRCOND(SDValue Op, SelectionDAG &DAG) const;
1345 SDValue LowerBRCOND(SDValue Op, SelectionDAG &DAG) const;
1346 SDValue LowerJumpTable(SDValue Op, SelectionDAG &DAG) const;
1346 SDValue LowerJumpTable(SDValue Op, SelectionDAG &DAG) const;
1347 SDValue LowerDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG) const;
1347 SDValue LowerDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG) const;
1348 SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG) const;
1348 SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG) const;
1349 SDValue LowerVAARG(SDValue Op, SelectionDAG &DAG) const;
1349 SDValue LowerVAARG(SDValue Op, SelectionDAG &DAG) const;
1350 SDValue LowerRETURNADDR(SDValue Op, SelectionDAG &DAG) const;
1350 SDValue LowerRETURNADDR(SDValue Op, SelectionDAG &DAG) const;
1351 SDValue LowerADDROFRETURNADDR(SDValue Op, SelectionDAG &DAG) const;
1351 SDValue LowerADDROFRETURNADDR(SDValue Op, SelectionDAG &DAG) const;
1352 SDValue LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const;
1352 SDValue LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const;
1353 SDValue LowerFRAME_TO_ARGS_OFFSET(SDValue Op, SelectionDAG &DAG) const;
1353 SDValue LowerFRAME_TO_ARGS_OFFSET(SDValue Op, SelectionDAG &DAG) const;
1354 SDValue LowerEH_RETURN(SDValue Op, SelectionDAG &DAG) const;
1354 SDValue LowerEH_RETURN(SDValue Op, SelectionDAG &DAG) const;
1355 SDValue lowerEH_SJLJ_SETJMP(SDValue Op, SelectionDAG &DAG) const;
1355 SDValue lowerEH_SJLJ_SETJMP(SDValue Op, SelectionDAG &DAG) const;
1356 SDValue lowerEH_SJLJ_LONGJMP(SDValue Op, SelectionDAG &DAG) const;
1356 SDValue lowerEH_SJLJ_LONGJMP(SDValue Op, SelectionDAG &DAG) const;
1357 SDValue lowerEH_SJLJ_SETUP_DISPATCH(SDValue Op, SelectionDAG &DAG) const;
1357 SDValue lowerEH_SJLJ_SETUP_DISPATCH(SDValue Op, SelectionDAG &DAG) const;
1358 SDValue LowerINIT_TRAMPOLINE(SDValue Op, SelectionDAG &DAG) const;
1358 SDValue LowerINIT_TRAMPOLINE(SDValue Op, SelectionDAG &DAG) const;
1359 SDValue LowerFLT_ROUNDS_(SDValue Op, SelectionDAG &DAG) const;
1359 SDValue LowerFLT_ROUNDS_(SDValue Op, SelectionDAG &DAG) const;
1360 SDValue LowerWin64_i128OP(SDValue Op, SelectionDAG &DAG) const;
1360 SDValue LowerWin64_i128OP(SDValue Op, SelectionDAG &DAG) const;
1361 SDValue LowerGC_TRANSITION_START(SDValue Op, SelectionDAG &DAG) const;
1361 SDValue LowerGC_TRANSITION_START(SDValue Op, SelectionDAG &DAG) const;
1362 SDValue LowerGC_TRANSITION_END(SDValue Op, SelectionDAG &DAG) const;
1362 SDValue LowerGC_TRANSITION_END(SDValue Op, SelectionDAG &DAG) const;
1363 SDValue LowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG) const;
1363 SDValue LowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG) const;
1364 SDValue lowerFaddFsub(SDValue Op, SelectionDAG &DAG) const;
1364 SDValue lowerFaddFsub(SDValue Op, SelectionDAG &DAG) const;
1365 SDValue LowerFP_EXTEND(SDValue Op, SelectionDAG &DAG) const;
1365 SDValue LowerFP_EXTEND(SDValue Op, SelectionDAG &DAG) const;
1366 SDValue LowerFP_ROUND(SDValue Op, SelectionDAG &DAG) const;
1366 SDValue LowerFP_ROUND(SDValue Op, SelectionDAG &DAG) const;
1368 SDValue LowerF128Call(SDValue Op, SelectionDAG &DAG,
1368 SDValue LowerF128Call(SDValue Op, SelectionDAG &DAG,
1371 SDValue
1372 LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
1375 SmallVectorImpl<SDValue> &InVals) const override;
1376 SDValue LowerCall(CallLoweringInfo &CLI,
1377 SmallVectorImpl<SDValue> &InVals) const override;
1379 SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
1379 SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
1381 const SmallVectorImpl<SDValue> &OutVals,
1393 bool isUsedByReturnOnly(SDNode *N, SDValue &Chain) const override;
1482 SDValue EmitCmp(SDValue Op0, SDValue Op1, unsigned X86CC, const SDLoc &dl,
1482 SDValue EmitCmp(SDValue Op0, SDValue Op1, unsigned X86CC, const SDLoc &dl,
1482 SDValue EmitCmp(SDValue Op0, SDValue Op1, unsigned X86CC, const SDLoc &dl,
1486 SDValue ConvertCmpIfNecessary(SDValue Cmp, SelectionDAG &DAG) const;
1486 SDValue ConvertCmpIfNecessary(SDValue Cmp, SelectionDAG &DAG) const;
1490 SDValue emitFlagsForSetcc(SDValue Op0, SDValue Op1,
1490 SDValue emitFlagsForSetcc(SDValue Op0, SDValue Op1,
1490 SDValue emitFlagsForSetcc(SDValue Op0, SDValue Op1,
1493 SDValue &X86CC) const;
1496 bool isFsqrtCheap(SDValue Operand, SelectionDAG &DAG) const override;
1499 SDValue getSqrtEstimate(SDValue Operand, SelectionDAG &DAG, int Enabled,
1499 SDValue getSqrtEstimate(SDValue Operand, SelectionDAG &DAG, int Enabled,
1504 SDValue getRecipEstimate(SDValue Operand, SelectionDAG &DAG, int Enabled,
1504 SDValue getRecipEstimate(SDValue Operand, SelectionDAG &DAG, int Enabled,
1510 SDValue BuildSDIVPow2(SDNode *N, const APInt &Divisor, SelectionDAG &DAG,
1526 const SDValue &getValue() const { return getOperand(1); }
1527 const SDValue &getBasePtr() const { return getOperand(2); }
1545 const SDValue &getValue() const { return getOperand(1); }
1546 const SDValue &getBasePtr() const { return getOperand(2); }
1547 const SDValue &getMask() const { return getOperand(3); }
1615 const SDValue &getBasePtr() const { return getOperand(3); }
1616 const SDValue &getIndex() const { return getOperand(4); }
1617 const SDValue &getMask() const { return getOperand(2); }
1618 const SDValue &getScale() const { return getOperand(5); }
1633 const SDValue &getPassThru() const { return getOperand(1); }
1647 const SDValue &getValue() const { return getOperand(1); }
lib/Target/X86/X86InstrInfo.cpp 5615 std::vector<SDValue> AddrOps;
5616 std::vector<SDValue> BeforeOps;
5617 std::vector<SDValue> AfterOps;
5621 SDValue Op = N->getOperand(i);
5629 SDValue Chain = N->getOperand(NumOps-1);
lib/Target/X86/X86SelectionDAGInfo.cpp 46 SDValue X86SelectionDAGInfo::EmitTargetCodeForMemset(
47 SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Val,
47 SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Val,
47 SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Val,
48 SDValue Size, unsigned Align, bool isVolatile,
95 std::pair<SDValue,SDValue> CallResult = TLI.LowerCallTo(CLI);
95 std::pair<SDValue,SDValue> CallResult = TLI.LowerCallTo(CLI);
104 SDValue InFlag;
106 SDValue Count;
163 SDValue Ops[] = { Chain, DAG.getValueType(AVT), InFlag };
186 static SDValue emitRepmovs(const X86Subtarget &Subtarget, SelectionDAG &DAG,
187 const SDLoc &dl, SDValue Chain, SDValue Dst,
187 const SDLoc &dl, SDValue Chain, SDValue Dst,
188 SDValue Src, SDValue Size, MVT AVT) {
188 SDValue Src, SDValue Size, MVT AVT) {
194 SDValue InFlag;
203 SDValue Ops[] = {Chain, DAG.getValueType(AVT), InFlag};
208 static SDValue emitRepmovsB(const X86Subtarget &Subtarget, SelectionDAG &DAG,
209 const SDLoc &dl, SDValue Chain, SDValue Dst,
209 const SDLoc &dl, SDValue Chain, SDValue Dst,
210 SDValue Src, uint64_t Size) {
236 static SDValue emitConstantSizeRepmov(
238 SDValue Chain, SDValue Dst, SDValue Src, uint64_t Size, EVT SizeVT,
238 SDValue Chain, SDValue Dst, SDValue Src, uint64_t Size, EVT SizeVT,
238 SDValue Chain, SDValue Dst, SDValue Src, uint64_t Size, EVT SizeVT,
261 SDValue RepMovs =
277 SmallVector<SDValue, 4> Results;
292 SDValue X86SelectionDAGInfo::EmitTargetCodeForMemcpy(
293 SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src,
293 SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src,
293 SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src,
294 SDValue Size, unsigned Align, bool isVolatile, bool AlwaysInline,
lib/Target/X86/X86SelectionDAGInfo.h 34 SDValue EmitTargetCodeForMemset(SelectionDAG &DAG, const SDLoc &dl,
35 SDValue Chain, SDValue Dst, SDValue Src,
35 SDValue Chain, SDValue Dst, SDValue Src,
35 SDValue Chain, SDValue Dst, SDValue Src,
36 SDValue Size, unsigned Align, bool isVolatile,
39 SDValue EmitTargetCodeForMemcpy(SelectionDAG &DAG, const SDLoc &dl,
40 SDValue Chain, SDValue Dst, SDValue Src,
40 SDValue Chain, SDValue Dst, SDValue Src,
40 SDValue Chain, SDValue Dst, SDValue Src,
41 SDValue Size, unsigned Align, bool isVolatile,
lib/Target/XCore/XCoreISelDAGToDAG.cpp 48 inline SDValue getI32Imm(unsigned Imm, const SDLoc &dl) {
64 bool SelectADDRspii(SDValue Addr, SDValue &Base, SDValue &Offset);
64 bool SelectADDRspii(SDValue Addr, SDValue &Base, SDValue &Offset);
64 bool SelectADDRspii(SDValue Addr, SDValue &Base, SDValue &Offset);
66 bool SelectInlineAsmMemoryOperand(const SDValue &Op, unsigned ConstraintID,
67 std::vector<SDValue> &OutOps) override;
86 bool XCoreDAGToDAGISel::SelectADDRspii(SDValue Addr, SDValue &Base,
86 bool XCoreDAGToDAGISel::SelectADDRspii(SDValue Addr, SDValue &Base,
87 SDValue &Offset) {
110 SelectInlineAsmMemoryOperand(const SDValue &Op, unsigned ConstraintID,
111 std::vector<SDValue> &OutOps) {
112 SDValue Reg;
140 SDValue MskSize = getI32Imm(32 - countLeadingZeros((uint32_t)Val), dl);
146 SDValue CPIdx = CurDAG->getTargetConstantPool(
162 SDValue Ops[] = { N->getOperand(0), N->getOperand(1),
169 SDValue Ops[] = { N->getOperand(0), N->getOperand(1),
176 SDValue Ops[] = { N->getOperand(0), N->getOperand(1),
183 SDValue Ops[] = { N->getOperand(0), N->getOperand(1),
190 SDValue Ops[] = { N->getOperand(0), N->getOperand(1),
197 SDValue Ops[] = { N->getOperand(0), N->getOperand(1), N->getOperand(2) };
215 static SDValue
216 replaceInChain(SelectionDAG *CurDAG, SDValue Chain, SDValue Old, SDValue New)
216 replaceInChain(SelectionDAG *CurDAG, SDValue Chain, SDValue Old, SDValue New)
216 replaceInChain(SelectionDAG *CurDAG, SDValue Chain, SDValue Old, SDValue New)
222 SmallVector<SDValue, 8> Ops;
240 SDValue Chain = N->getOperand(0);
241 SDValue Addr = N->getOperand(1);
247 SDValue nextAddr = Addr->getOperand(2);
248 SDValue CheckEventChainOut(Addr.getNode(), 1);
254 SDValue CheckEventChainIn = Addr->getOperand(0);
255 SDValue NewChain = replaceInChain(CurDAG, Chain, CheckEventChainOut,
265 SDValue constOne = getI32Imm(1, dl);
266 SDValue Glue =
lib/Target/XCore/XCoreISelLowering.cpp 178 bool XCoreTargetLowering::isZExtFree(SDValue Val, EVT VT2) const {
196 SDValue XCoreTargetLowering::
197 LowerOperation(SDValue Op, SelectionDAG &DAG) const {
231 SmallVectorImpl<SDValue>&Results,
247 SDValue XCoreTargetLowering::getGlobalAddressWrapper(SDValue GA,
247 SDValue XCoreTargetLowering::getGlobalAddressWrapper(SDValue GA,
277 SDValue XCoreTargetLowering::
278 LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const
287 SDValue GA = DAG.getTargetGlobalAddress(GV, DL, MVT::i32, FoldedOffset);
291 SDValue Remaining = DAG.getConstant(Offset - FoldedOffset, DL, MVT::i32);
303 SDValue CP = DAG.getConstantPool(GAI, MVT::i32);
309 SDValue XCoreTargetLowering::
310 LowerBlockAddress(SDValue Op, SelectionDAG &DAG) const
315 SDValue Result = DAG.getTargetBlockAddress(BA, PtrVT);
320 SDValue XCoreTargetLowering::
321 LowerConstantPool(SDValue Op, SelectionDAG &DAG) const
327 SDValue Res;
342 SDValue XCoreTargetLowering::
343 LowerBR_JT(SDValue Op, SelectionDAG &DAG) const
345 SDValue Chain = Op.getOperand(0);
346 SDValue Table = Op.getOperand(1);
347 SDValue Index = Op.getOperand(2);
353 SDValue TargetJT = DAG.getTargetJumpTable(JT->getIndex(), MVT::i32);
360 SDValue ScaledIndex = DAG.getNode(ISD::SHL, dl, MVT::i32, Index,
366 SDValue XCoreTargetLowering::lowerLoadWordFromAlignedBasePlusOffset(
367 const SDLoc &DL, SDValue Chain, SDValue Base, int64_t Offset,
367 const SDLoc &DL, SDValue Chain, SDValue Base, int64_t Offset,
376 SDValue LowAddr, HighAddr;
389 SDValue LowShift = DAG.getConstant((Offset - LowOffset) * 8, DL, MVT::i32);
390 SDValue HighShift = DAG.getConstant((HighOffset - Offset) * 8, DL, MVT::i32);
392 SDValue Low = DAG.getLoad(PtrVT, DL, Chain, LowAddr, MachinePointerInfo());
393 SDValue High = DAG.getLoad(PtrVT, DL, Chain, HighAddr, MachinePointerInfo());
394 SDValue LowShifted = DAG.getNode(ISD::SRL, DL, MVT::i32, Low, LowShift);
395 SDValue HighShifted = DAG.getNode(ISD::SHL, DL, MVT::i32, High, HighShift);
396 SDValue Result = DAG.getNode(ISD::OR, DL, MVT::i32, LowShifted, HighShifted);
399 SDValue Ops[] = { Result, Chain };
403 static bool isWordAligned(SDValue Value, SelectionDAG &DAG)
409 SDValue XCoreTargetLowering::LowerLOAD(SDValue Op, SelectionDAG &DAG) const {
409 SDValue XCoreTargetLowering::LowerLOAD(SDValue Op, SelectionDAG &DAG) const {
421 SDValue Chain = LD->getChain();
422 SDValue BasePtr = LD->getBasePtr();
430 SDValue NewBasePtr = BasePtr->getOperand(0);
437 SDValue NewBasePtr = DAG.getGlobalAddress(GV, DL,
445 SDValue Low =
449 SDValue HighAddr = DAG.getNode(ISD::ADD, DL, MVT::i32, BasePtr,
451 SDValue High =
455 SDValue HighShifted = DAG.getNode(ISD::SHL, DL, MVT::i32, High,
457 SDValue Result = DAG.getNode(ISD::OR, DL, MVT::i32, Low, HighShifted);
460 SDValue Ops[] = { Result, Chain };
480 std::pair<SDValue, SDValue> CallResult = LowerCallTo(CLI);
480 std::pair<SDValue, SDValue> CallResult = LowerCallTo(CLI);
481 SDValue Ops[] = { CallResult.first, CallResult.second };
485 SDValue XCoreTargetLowering::LowerSTORE(SDValue Op, SelectionDAG &DAG) const {
485 SDValue XCoreTargetLowering::LowerSTORE(SDValue Op, SelectionDAG &DAG) const {
495 SDValue Chain = ST->getChain();
496 SDValue BasePtr = ST->getBasePtr();
497 SDValue Value = ST->getValue();
501 SDValue Low = Value;
502 SDValue High = DAG.getNode(ISD::SRL, dl, MVT::i32, Value,
504 SDValue StoreLow = DAG.getTruncStore(
507 SDValue HighAddr = DAG.getNode(ISD::ADD, dl, MVT::i32, BasePtr,
509 SDValue StoreHigh = DAG.getTruncStore(
534 std::pair<SDValue, SDValue> CallResult = LowerCallTo(CLI);
534 std::pair<SDValue, SDValue> CallResult = LowerCallTo(CLI);
538 SDValue XCoreTargetLowering::
539 LowerSMUL_LOHI(SDValue Op, SelectionDAG &DAG) const
544 SDValue LHS = Op.getOperand(0);
545 SDValue RHS = Op.getOperand(1);
546 SDValue Zero = DAG.getConstant(0, dl, MVT::i32);
547 SDValue Hi = DAG.getNode(XCoreISD::MACCS, dl,
550 SDValue Lo(Hi.getNode(), 1);
551 SDValue Ops[] = { Lo, Hi };
555 SDValue XCoreTargetLowering::
556 LowerUMUL_LOHI(SDValue Op, SelectionDAG &DAG) const
561 SDValue LHS = Op.getOperand(0);
562 SDValue RHS = Op.getOperand(1);
563 SDValue Zero = DAG.getConstant(0, dl, MVT::i32);
564 SDValue Hi = DAG.getNode(XCoreISD::LMUL, dl,
567 SDValue Lo(Hi.getNode(), 1);
568 SDValue Ops[] = { Lo, Hi };
578 isADDADDMUL(SDValue Op, SDValue &Mul0, SDValue &Mul1, SDValue &Addend0,
578 isADDADDMUL(SDValue Op, SDValue &Mul0, SDValue &Mul1, SDValue &Addend0,
578 isADDADDMUL(SDValue Op, SDValue &Mul0, SDValue &Mul1, SDValue &Addend0,
578 isADDADDMUL(SDValue Op, SDValue &Mul0, SDValue &Mul1, SDValue &Addend0,
579 SDValue &Addend1, bool requireIntermediatesHaveOneUse)
583 SDValue N0 = Op.getOperand(0);
584 SDValue N1 = Op.getOperand(1);
585 SDValue AddOp;
586 SDValue OtherOp;
631 SDValue XCoreTargetLowering::
634 SDValue Mul;
635 SDValue Other;
646 SDValue LL, RL, AddendL, AddendH;
661 SDValue Hi = DAG.getNode(XCoreISD::MACCU, dl,
664 SDValue Lo(Hi.getNode(), 1);
669 SDValue Hi = DAG.getNode(XCoreISD::MACCS, dl,
672 SDValue Lo(Hi.getNode(), 1);
675 SDValue LH, RH;
680 SDValue Hi = DAG.getNode(XCoreISD::MACCU, dl,
683 SDValue Lo(Hi.getNode(), 1);
691 SDValue XCoreTargetLowering::
699 if (SDValue Result = TryExpandADDWithMul(N, DAG))
705 SDValue LHSL = DAG.getNode(ISD::EXTRACT_ELEMENT, dl, MVT::i32,
708 SDValue LHSH = DAG.getNode(ISD::EXTRACT_ELEMENT, dl, MVT::i32,
711 SDValue RHSL = DAG.getNode(ISD::EXTRACT_ELEMENT, dl, MVT::i32,
714 SDValue RHSH = DAG.getNode(ISD::EXTRACT_ELEMENT, dl, MVT::i32,
721 SDValue Zero = DAG.getConstant(0, dl, MVT::i32);
722 SDValue Lo = DAG.getNode(Opcode, dl, DAG.getVTList(MVT::i32, MVT::i32),
724 SDValue Carry(Lo.getNode(), 1);
726 SDValue Hi = DAG.getNode(Opcode, dl, DAG.getVTList(MVT::i32, MVT::i32),
728 SDValue Ignored(Hi.getNode(), 1);
733 SDValue XCoreTargetLowering::
734 LowerVAARG(SDValue Op, SelectionDAG &DAG) const
740 SDValue InChain = Node->getOperand(0);
741 SDValue VAListPtr = Node->getOperand(1);
745 SDValue VAList =
748 SDValue nextPtr = DAG.getNode(ISD::ADD, dl, PtrVT, VAList,
758 SDValue XCoreTargetLowering::
759 LowerVASTART(SDValue Op, SelectionDAG &DAG) const
766 SDValue Addr = DAG.getFrameIndex(XFI->getVarArgsFrameIndex(), MVT::i32);
771 SDValue XCoreTargetLowering::LowerFRAMEADDR(SDValue Op,
771 SDValue XCoreTargetLowering::LowerFRAMEADDR(SDValue Op,
787 SDValue XCoreTargetLowering::
788 LowerRETURNADDR(SDValue Op, SelectionDAG &DAG) const {
800 SDValue FIN = DAG.getFrameIndex(FI, MVT::i32);
806 SDValue XCoreTargetLowering::
807 LowerFRAME_TO_ARGS_OFFSET(SDValue Op, SelectionDAG &DAG) const {
815 SDValue XCoreTargetLowering::
816 LowerEH_RETURN(SDValue Op, SelectionDAG &DAG) const {
822 SDValue Chain = Op.getOperand(0);
823 SDValue Offset = Op.getOperand(1);
824 SDValue Handler = Op.getOperand(2);
829 SDValue Stack = DAG.getCopyFromReg(DAG.getEntryNode(), dl,
831 SDValue FrameToArgs = DAG.getNode(XCoreISD::FRAME_TO_ARGS_OFFSET, dl,
841 SDValue OutChains[] = {
854 SDValue XCoreTargetLowering::
855 LowerADJUST_TRAMPOLINE(SDValue Op, SelectionDAG &DAG) const {
859 SDValue XCoreTargetLowering::
860 LowerINIT_TRAMPOLINE(SDValue Op, SelectionDAG &DAG) const {
861 SDValue Chain = Op.getOperand(0);
862 SDValue Trmp = Op.getOperand(1); // trampoline
863 SDValue FPtr = Op.getOperand(2); // nested function
864 SDValue Nest = Op.getOperand(3); // 'nest' parameter value
879 SDValue OutChains[5];
881 SDValue Addr = Trmp;
913 SDValue XCoreTargetLowering::
914 LowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG) const {
920 SDValue Data =
923 SDValue Crc(Data.getNode(), 1);
924 SDValue Results[] = { Crc, Data };
930 SDValue XCoreTargetLowering::
931 LowerATOMIC_FENCE(SDValue Op, SelectionDAG &DAG) const {
936 SDValue XCoreTargetLowering::
937 LowerATOMIC_LOAD(SDValue Op, SelectionDAG &DAG) const {
967 SDValue XCoreTargetLowering::
968 LowerATOMIC_STORE(SDValue Op, SelectionDAG &DAG) const {
1029 SDValue
1031 SmallVectorImpl<SDValue> &InVals) const {
1035 SmallVectorImpl<SDValue> &OutVals = CLI.OutVals;
1037 SDValue Chain = CLI.Chain;
1038 SDValue Callee = CLI.Callee;
1060 static SDValue LowerCallResult(SDValue Chain, SDValue InFlag,
1060 static SDValue LowerCallResult(SDValue Chain, SDValue InFlag,
1060 static SDValue LowerCallResult(SDValue Chain, SDValue InFlag,
1063 SmallVectorImpl<SDValue> &InVals) {
1083 SmallVector<SDValue, 4> MemOpChains;
1088 SDValue Ops[] = { Chain, DAG.getConstant(offset / 4, dl, MVT::i32) };
1089 SDValue load = DAG.getNode(XCoreISD::LDWSP, dl, VTs, Ops);
1106 SDValue XCoreTargetLowering::LowerCCCCallTo(
1107 SDValue Chain, SDValue Callee, CallingConv::ID CallConv, bool isVarArg,
1107 SDValue Chain, SDValue Callee, CallingConv::ID CallConv, bool isVarArg,
1109 const SmallVectorImpl<SDValue> &OutVals,
1111 SelectionDAG &DAG, SmallVectorImpl<SDValue> &InVals) const {
1137 SmallVector<std::pair<unsigned, SDValue>, 4> RegsToPass;
1138 SmallVector<SDValue, 12> MemOpChains;
1143 SDValue Arg = OutVals[i];
1185 SDValue InFlag;
1205 SmallVector<SDValue, 8> Ops;
1236 struct ArgDataPair { SDValue SDV; ISD::ArgFlagsTy Flags; };
1240 SDValue XCoreTargetLowering::LowerFormalArguments(
1241 SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
1243 SelectionDAG &DAG, SmallVectorImpl<SDValue> &InVals) const {
1259 SDValue XCoreTargetLowering::LowerCCCArguments(
1260 SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
1262 SelectionDAG &DAG, SmallVectorImpl<SDValue> &InVals) const {
1289 SmallVector<SDValue, 4> CFRegNode;
1291 SmallVector<SDValue, 4> MemOps;
1297 SDValue ArgIn;
1334 SDValue FIN = DAG.getFrameIndex(FI, MVT::i32);
1361 SDValue FIN = DAG.getFrameIndex(FI, MVT::i32);
1365 SDValue Val = DAG.getCopyFromReg(Chain, dl, VReg, MVT::i32);
1368 SDValue Store =
1396 SDValue FIN = DAG.getFrameIndex(FI, MVT::i32);
1435 SDValue
1436 XCoreTargetLowering::LowerReturn(SDValue Chain, CallingConv::ID CallConv,
1439 const SmallVectorImpl<SDValue> &OutVals,
1460 SDValue Flag;
1461 SmallVector<SDValue, 4> RetOps(1, Chain);
1466 SmallVector<SDValue, 4> MemOpChains;
1484 SDValue FIN = DAG.getFrameIndex(FI, MVT::i32);
1589 SDValue XCoreTargetLowering::PerformDAGCombine(SDNode *N,
1600 SDValue OutVal = N->getOperand(3);
1616 SDValue Time = N->getOperand(3);
1634 SDValue N0 = N->getOperand(0);
1635 SDValue N1 = N->getOperand(1);
1636 SDValue N2 = N->getOperand(2);
1647 SDValue Carry = DAG.getConstant(0, dl, VT);
1648 SDValue Result = DAG.getNode(ISD::AND, dl, VT, N2,
1650 SDValue Ops[] = { Result, Carry };
1661 SDValue Carry = DAG.getConstant(0, dl, VT);
1662 SDValue Result = DAG.getNode(ISD::ADD, dl, VT, N0, N2);
1663 SDValue Ops[] = { Result, Carry };
1670 SDValue N0 = N->getOperand(0);
1671 SDValue N1 = N->getOperand(1);
1672 SDValue N2 = N->getOperand(2);
1683 SDValue Borrow = N2;
1684 SDValue Result = DAG.getNode(ISD::SUB, dl, VT,
1686 SDValue Ops[] = { Result, Borrow };
1698 SDValue Borrow = DAG.getConstant(0, dl, VT);
1699 SDValue Result = DAG.getNode(ISD::SUB, dl, VT, N0, N2);
1700 SDValue Ops[] = { Result, Borrow };
1707 SDValue N0 = N->getOperand(0);
1708 SDValue N1 = N->getOperand(1);
1709 SDValue N2 = N->getOperand(2);
1710 SDValue N3 = N->getOperand(3);
1725 SDValue Lo = DAG.getNode(ISD::ADD, dl, VT, N2, N3);
1726 SDValue Ops[] = { Lo, Lo };
1730 SDValue Result =
1732 SDValue Carry(Result.getNode(), 1);
1733 SDValue Ops[] = { Carry, Result };
1743 SDValue Mul0, Mul1, Addend0, Addend1;
1746 SDValue Ignored = DAG.getNode(XCoreISD::LMUL, dl,
1749 SDValue Result(Ignored.getNode(), 1);
1763 SDValue Mul0L = DAG.getNode(ISD::EXTRACT_ELEMENT, dl, MVT::i32,
1765 SDValue Mul1L = DAG.getNode(ISD::EXTRACT_ELEMENT, dl, MVT::i32,
1767 SDValue Addend0L = DAG.getNode(ISD::EXTRACT_ELEMENT, dl, MVT::i32,
1769 SDValue Addend1L = DAG.getNode(ISD::EXTRACT_ELEMENT, dl, MVT::i32,
1771 SDValue Hi = DAG.getNode(XCoreISD::LMUL, dl,
1774 SDValue Lo(Hi.getNode(), 1);
1789 SDValue Chain = ST->getChain();
1815 void XCoreTargetLowering::computeKnownBitsForTargetNode(const SDValue Op,
lib/Target/XCore/XCoreISelLowering.h 99 bool isZExtFree(SDValue Val, EVT VT2) const override;
108 SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
108 SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
113 void ReplaceNodeResults(SDNode *N, SmallVectorImpl<SDValue>&Results,
147 SDValue LowerCCCArguments(SDValue Chain, CallingConv::ID CallConv,
147 SDValue LowerCCCArguments(SDValue Chain, CallingConv::ID CallConv,
151 SmallVectorImpl<SDValue> &InVals) const;
152 SDValue LowerCCCCallTo(SDValue Chain, SDValue Callee,
152 SDValue LowerCCCCallTo(SDValue Chain, SDValue Callee,
152 SDValue LowerCCCCallTo(SDValue Chain, SDValue Callee,
156 const SmallVectorImpl<SDValue> &OutVals,
159 SmallVectorImpl<SDValue> &InVals) const;
160 SDValue getReturnAddressFrameIndex(SelectionDAG &DAG) const;
161 SDValue getGlobalAddressWrapper(SDValue GA, const GlobalValue *GV,
161 SDValue getGlobalAddressWrapper(SDValue GA, const GlobalValue *GV,
163 SDValue lowerLoadWordFromAlignedBasePlusOffset(const SDLoc &DL,
164 SDValue Chain, SDValue Base,
164 SDValue Chain, SDValue Base,
169 SDValue LowerLOAD(SDValue Op, SelectionDAG &DAG) const;
169 SDValue LowerLOAD(SDValue Op, SelectionDAG &DAG) const;
170 SDValue LowerSTORE(SDValue Op, SelectionDAG &DAG) const;
170 SDValue LowerSTORE(SDValue Op, SelectionDAG &DAG) const;
171 SDValue LowerEH_RETURN(SDValue Op, SelectionDAG &DAG) const;
171 SDValue LowerEH_RETURN(SDValue Op, SelectionDAG &DAG) const;
172 SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const;
172 SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const;
173 SDValue LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const;
173 SDValue LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const;
174 SDValue LowerBlockAddress(SDValue Op, SelectionDAG &DAG) const;
174 SDValue LowerBlockAddress(SDValue Op, SelectionDAG &DAG) const;
175 SDValue LowerConstantPool(SDValue Op, SelectionDAG &DAG) const;
175 SDValue LowerConstantPool(SDValue Op, SelectionDAG &DAG) const;
176 SDValue LowerBR_JT(SDValue Op, SelectionDAG &DAG) const;
176 SDValue LowerBR_JT(SDValue Op, SelectionDAG &DAG) const;
177 SDValue LowerVAARG(SDValue Op, SelectionDAG &DAG) const;
177 SDValue LowerVAARG(SDValue Op, SelectionDAG &DAG) const;
178 SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG) const;
178 SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG) const;
179 SDValue LowerUMUL_LOHI(SDValue Op, SelectionDAG &DAG) const;
179 SDValue LowerUMUL_LOHI(SDValue Op, SelectionDAG &DAG) const;
180 SDValue LowerSMUL_LOHI(SDValue Op, SelectionDAG &DAG) const;
180 SDValue LowerSMUL_LOHI(SDValue Op, SelectionDAG &DAG) const;
181 SDValue LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const;
181 SDValue LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const;
182 SDValue LowerFRAME_TO_ARGS_OFFSET(SDValue Op, SelectionDAG &DAG) const;
182 SDValue LowerFRAME_TO_ARGS_OFFSET(SDValue Op, SelectionDAG &DAG) const;
183 SDValue LowerRETURNADDR(SDValue Op, SelectionDAG &DAG) const;
183 SDValue LowerRETURNADDR(SDValue Op, SelectionDAG &DAG) const;
184 SDValue LowerINIT_TRAMPOLINE(SDValue Op, SelectionDAG &DAG) const;
184 SDValue LowerINIT_TRAMPOLINE(SDValue Op, SelectionDAG &DAG) const;
185 SDValue LowerADJUST_TRAMPOLINE(SDValue Op, SelectionDAG &DAG) const;
185 SDValue LowerADJUST_TRAMPOLINE(SDValue Op, SelectionDAG &DAG) const;
186 SDValue LowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG) const;
186 SDValue LowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG) const;
187 SDValue LowerATOMIC_FENCE(SDValue Op, SelectionDAG &DAG) const;
187 SDValue LowerATOMIC_FENCE(SDValue Op, SelectionDAG &DAG) const;
188 SDValue LowerATOMIC_LOAD(SDValue Op, SelectionDAG &DAG) const;
188 SDValue LowerATOMIC_LOAD(SDValue Op, SelectionDAG &DAG) const;
189 SDValue LowerATOMIC_STORE(SDValue Op, SelectionDAG &DAG) const;
189 SDValue LowerATOMIC_STORE(SDValue Op, SelectionDAG &DAG) const;
199 SDValue TryExpandADDWithMul(SDNode *Op, SelectionDAG &DAG) const;
200 SDValue ExpandADDSUB(SDNode *Op, SelectionDAG &DAG) const;
202 SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const override;
204 void computeKnownBitsForTargetNode(const SDValue Op,
210 SDValue
211 LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
214 SmallVectorImpl<SDValue> &InVals) const override;
216 SDValue
218 SmallVectorImpl<SDValue> &InVals) const override;
220 SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
220 SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
222 const SmallVectorImpl<SDValue> &OutVals,
lib/Target/XCore/XCoreSelectionDAGInfo.cpp 18 SDValue XCoreSelectionDAGInfo::EmitTargetCodeForMemcpy(
19 SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src,
19 SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src,
19 SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src,
20 SDValue Size, unsigned Align, bool isVolatile, bool AlwaysInline,
44 std::pair<SDValue,SDValue> CallResult = TLI.LowerCallTo(CLI);
44 std::pair<SDValue,SDValue> CallResult = TLI.LowerCallTo(CLI);
lib/Target/XCore/XCoreSelectionDAGInfo.h 24 SDValue EmitTargetCodeForMemcpy(SelectionDAG &DAG, const SDLoc &dl,
25 SDValue Chain, SDValue Op1, SDValue Op2,
25 SDValue Chain, SDValue Op1, SDValue Op2,
25 SDValue Chain, SDValue Op1, SDValue Op2,
26 SDValue Op3, unsigned Align, bool isVolatile,
unittests/CodeGen/AArch64SelectionDAGTest.cpp 88 auto InVec = DAG->getConstant(0, Loc, InVecVT);
89 auto Op = DAG->getNode(ISD::ZERO_EXTEND_VECTOR_INREG, Loc, OutVecVT, InVec);
102 auto Vec = DAG->getConstant(0, Loc, VecVT);
103 auto ZeroIdx = DAG->getConstant(0, Loc, IdxVT);
104 auto Op = DAG->getNode(ISD::EXTRACT_SUBVECTOR, Loc, VecVT, Vec, ZeroIdx);
118 auto InVec = DAG->getConstant(1, Loc, InVecVT);
119 auto Op = DAG->getNode(ISD::SIGN_EXTEND_VECTOR_INREG, Loc, OutVecVT, InVec);
131 auto Vec = DAG->getConstant(1, Loc, VecVT);
132 auto ZeroIdx = DAG->getConstant(0, Loc, IdxVT);
133 auto Op = DAG->getNode(ISD::EXTRACT_SUBVECTOR, Loc, VecVT, Vec, ZeroIdx);
148 auto Vec = DAG->getConstant(1, Loc, VecVT);
149 auto ZeroIdx = DAG->getConstant(0, Loc, IdxVT);
150 auto Op = DAG->getNode(ISD::EXTRACT_SUBVECTOR, Loc, VecVT, Vec, ZeroIdx);
166 auto UnknownOp = DAG->getRegister(0, IntVT);
167 auto Mask = DAG->getConstant(0x8A, Loc, IntVT);
168 auto N0 = DAG->getNode(ISD::AND, Loc, IntVT, Mask, UnknownOp);
169 auto N1 = DAG->getConstant(0x55, Loc, IntVT);
170 auto Op = DAG->getNode(ISD::ADD, Loc, IntVT, N0, N1);
187 auto N0 = DAG->getConstant(0x55, Loc, IntVT);
188 auto UnknownOp = DAG->getRegister(0, IntVT);
189 auto Mask = DAG->getConstant(0x2e, Loc, IntVT);
190 auto N1 = DAG->getNode(ISD::AND, Loc, IntVT, Mask, UnknownOp);
191 auto Op = DAG->getNode(ISD::SUB, Loc, IntVT, N0, N1);
unittests/CodeGen/TypeTraitsTest.cpp 21 static_assert(is_trivially_copyable<SDValue>::value, "trivially copyable");
usr/include/c++/7.4.0/bits/alloc_traits.h 387 using allocator_type = allocator<_Tp>;
389 using value_type = _Tp;
392 using pointer = _Tp*;
395 using const_pointer = const _Tp*;
474 construct(allocator_type& __a, _Up* __p, _Args&&... __args)
474 construct(allocator_type& __a, _Up* __p, _Args&&... __args)
475 { __a.construct(__p, std::forward<_Args>(__args)...); }
486 destroy(allocator_type& __a, _Up* __p)
usr/include/c++/7.4.0/bits/allocator.h 108 class allocator: public __allocator_base<_Tp>
113 typedef _Tp* pointer;
114 typedef const _Tp* const_pointer;
115 typedef _Tp& reference;
116 typedef const _Tp& const_reference;
117 typedef _Tp value_type;
137 allocator(const allocator<_Tp1>&) throw() { }
usr/include/c++/7.4.0/bits/move.h 46 inline _GLIBCXX_CONSTEXPR _Tp*
47 __addressof(_Tp& __r) _GLIBCXX_NOEXCEPT
72 constexpr _Tp&&
73 forward(typename std::remove_reference<_Tp>::type& __t) noexcept
83 constexpr _Tp&&
84 forward(typename std::remove_reference<_Tp>::type&& __t) noexcept
98 move(_Tp&& __t) noexcept
104 : public __and_<__not_<is_nothrow_move_constructible<_Tp>>,
105 is_copy_constructible<_Tp>>::type { };
136 inline _GLIBCXX17_CONSTEXPR _Tp*
137 addressof(_Tp& __r) noexcept
143 const _Tp* addressof(const _Tp&&) = delete;
143 const _Tp* addressof(const _Tp&&) = delete;
184 typename enable_if<__and_<__not_<__is_tuple_like<_Tp>>,
185 is_move_constructible<_Tp>,
186 is_move_assignable<_Tp>>::value>::type
187 swap(_Tp& __a, _Tp& __b)
187 swap(_Tp& __a, _Tp& __b)
198 _Tp __tmp = _GLIBCXX_MOVE(__a);
usr/include/c++/7.4.0/bits/ptr_traits.h 126 typedef _Tp* pointer;
128 typedef _Tp element_type;
141 pointer_to(__make_not_void<element_type>& __r) noexcept
141 pointer_to(__make_not_void<element_type>& __r) noexcept
usr/include/c++/7.4.0/bits/std_function.h 62 : std::unary_function<_T1, _Res> { };
299 _M_invoke(const _Any_data& __functor, _ArgTypes&&... __args)
302 std::forward<_ArgTypes>(__args)...);
314 _M_invoke(const _Any_data& __functor, _ArgTypes&&... __args)
317 std::forward<_ArgTypes>(__args)...);
390 : public _Maybe_unary_or_binary_function<_Res, _ArgTypes...>,
595 _Res operator()(_ArgTypes... __args) const;
628 using _Invoker_type = _Res (*)(const _Any_data&, _ArgTypes&&...);
689 typedef _Function_handler<_Res(_ArgTypes...), _Functor> _My_handler;
706 return _M_invoker(_M_functor, std::forward<_ArgTypes>(__args)...);
usr/include/c++/7.4.0/bits/stl_algo.h 3900 const _Tp& __val)
4397 _Predicate __pred, const _Tp& __new_value)
usr/include/c++/7.4.0/bits/stl_construct.h 74 _Construct(_T1* __p, _Args&&... __args)
74 _Construct(_T1* __p, _Args&&... __args)
75 { ::new(static_cast<void*>(__p)) _T1(std::forward<_Args>(__args)...); }
75 { ::new(static_cast<void*>(__p)) _T1(std::forward<_Args>(__args)...); }
204 allocator<_Tp>&)
usr/include/c++/7.4.0/bits/stl_function.h 108 typedef _Arg argument_type;
111 typedef _Result result_type;
121 typedef _Arg1 first_argument_type;
124 typedef _Arg2 second_argument_type;
381 struct less : public binary_function<_Tp, _Tp, bool>
381 struct less : public binary_function<_Tp, _Tp, bool>
385 operator()(const _Tp& __x, const _Tp& __y) const
385 operator()(const _Tp& __x, const _Tp& __y) const
870 : public unary_function<_Tp,_Tp>
870 : public unary_function<_Tp,_Tp>
872 _Tp&
873 operator()(_Tp& __x) const
876 const _Tp&
877 operator()(const _Tp& __x) const
usr/include/c++/7.4.0/bits/stl_iterator.h 1224 __make_move_if_noexcept_iterator(_Tp* __i)
usr/include/c++/7.4.0/bits/stl_iterator_base_types.h 123 typedef _Tp value_type;
181 typedef _Tp value_type;
183 typedef _Tp* pointer;
184 typedef _Tp& reference;
192 typedef _Tp value_type;
194 typedef const _Tp* pointer;
195 typedef const _Tp& reference;
usr/include/c++/7.4.0/bits/stl_list.h 570 _M_create_node(_Args&&... __args)
1081 emplace_front(_Args&&... __args)
1131 emplace_back(_Args&&... __args)
1799 _M_insert(iterator __position, _Args&&... __args)
usr/include/c++/7.4.0/bits/stl_pair.h 100 return __and_<is_constructible<_T1, const _U1&>,
100 return __and_<is_constructible<_T1, const _U1&>,
101 is_constructible<_T2, const _U2&>>::value;
101 is_constructible<_T2, const _U2&>>::value;
107 return __and_<is_convertible<const _U1&, _T1>,
107 return __and_<is_convertible<const _U1&, _T1>,
108 is_convertible<const _U2&, _T2>>::value;
108 is_convertible<const _U2&, _T2>>::value;
114 return __and_<is_constructible<_T1, _U1&&>,
114 return __and_<is_constructible<_T1, _U1&&>,
115 is_constructible<_T2, _U2&&>>::value;
115 is_constructible<_T2, _U2&&>>::value;
121 return __and_<is_convertible<_U1&&, _T1>,
121 return __and_<is_convertible<_U1&&, _T1>,
122 is_convertible<_U2&&, _T2>>::value;
122 is_convertible<_U2&&, _T2>>::value;
128 using __do_converts = __and_<is_convertible<const _U1&, _T1>,
128 using __do_converts = __and_<is_convertible<const _U1&, _T1>,
129 is_convertible<_U2&&, _T2>>;
129 is_convertible<_U2&&, _T2>>;
133 return __and_<is_constructible<_T1, const _U1&>,
133 return __and_<is_constructible<_T1, const _U1&>,
134 is_constructible<_T2, _U2&&>,
134 is_constructible<_T2, _U2&&>,
142 using __do_converts = __and_<is_convertible<_U1&&, _T1>,
142 using __do_converts = __and_<is_convertible<_U1&&, _T1>,
143 is_convertible<const _U2&, _T2>>;
143 is_convertible<const _U2&, _T2>>;
147 return __and_<is_constructible<_T1, _U1&&>,
147 return __and_<is_constructible<_T1, _U1&&>,
148 is_constructible<_T2, const _U2&&>,
148 is_constructible<_T2, const _U2&&>,
209 : private __pair_base<_T1, _T2>
209 : private __pair_base<_T1, _T2>
211 typedef _T1 first_type; /// @c first_type is the first bound type
212 typedef _T2 second_type; /// @c second_type is the second bound type
214 _T1 first; /// @c first is a copy of the first object
215 _T2 second; /// @c second is a copy of the second object
252 using _PCCP = _PCC<true, _T1, _T2>;
252 using _PCCP = _PCC<true, _T1, _T2>;
260 constexpr pair(const _T1& __a, const _T2& __b)
260 constexpr pair(const _T1& __a, const _T2& __b)
269 explicit constexpr pair(const _T1& __a, const _T2& __b)
269 explicit constexpr pair(const _T1& __a, const _T2& __b)
283 _T1, _T2>;
283 _T1, _T2>;
291 constexpr pair(const pair<_U1, _U2>& __p)
291 constexpr pair(const pair<_U1, _U2>& __p)
311 constexpr pair(_U1&& __x, const _T2& __y)
311 constexpr pair(_U1&& __x, const _T2& __y)
318 explicit constexpr pair(_U1&& __x, const _T2& __y)
325 constexpr pair(const _T1& __x, _U2&& __y)
325 constexpr pair(const _T1& __x, _U2&& __y)
332 explicit pair(const _T1& __x, _U2&& __y)
341 constexpr pair(_U1&& __x, _U2&& __y)
341 constexpr pair(_U1&& __x, _U2&& __y)
342 : first(std::forward<_U1>(__x)), second(std::forward<_U2>(__y)) { }
342 : first(std::forward<_U1>(__x)), second(std::forward<_U2>(__y)) { }
360 constexpr pair(pair<_U1, _U2>&& __p)
360 constexpr pair(pair<_U1, _U2>&& __p)
361 : first(std::forward<_U1>(__p.first)),
362 second(std::forward<_U2>(__p.second)) { }
379 __and_<is_copy_assignable<_T1>,
380 is_copy_assignable<_T2>>::value,
390 __and_<is_move_assignable<_T1>,
391 is_move_assignable<_T2>>::value,
402 typename enable_if<__and_<is_assignable<_T1&, const _U1&>,
402 typename enable_if<__and_<is_assignable<_T1&, const _U1&>,
403 is_assignable<_T2&, const _U2&>>::value,
403 is_assignable<_T2&, const _U2&>>::value,
405 operator=(const pair<_U1, _U2>& __p)
405 operator=(const pair<_U1, _U2>& __p)
413 typename enable_if<__and_<is_assignable<_T1&, _U1&&>,
413 typename enable_if<__and_<is_assignable<_T1&, _U1&&>,
414 is_assignable<_T2&, _U2&&>>::value,
414 is_assignable<_T2&, _U2&&>>::value,
416 operator=(pair<_U1, _U2>&& __p)
416 operator=(pair<_U1, _U2>&& __p)
448 operator==(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)
448 operator==(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)
448 operator==(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)
448 operator==(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)
495 swap(pair<_T1, _T2>& __x, pair<_T1, _T2>& __y)
522 constexpr pair<typename __decay_and_strip<_T1>::__type,
523 typename __decay_and_strip<_T2>::__type>
524 make_pair(_T1&& __x, _T2&& __y)
524 make_pair(_T1&& __x, _T2&& __y)
526 typedef typename __decay_and_strip<_T1>::__type __ds_type1;
527 typedef typename __decay_and_strip<_T2>::__type __ds_type2;
529 return __pair_type(std::forward<_T1>(__x), std::forward<_T2>(__y));
529 return __pair_type(std::forward<_T1>(__x), std::forward<_T2>(__y));
usr/include/c++/7.4.0/bits/stl_set.h 110 typedef _Key key_type;
111 typedef _Key value_type;
119 rebind<_Key>::other _Key_alloc_type;
usr/include/c++/7.4.0/bits/stl_tree.h 218 typedef _Rb_tree_node<_Val>* _Link_type;
231 __gnu_cxx::__aligned_membuf<_Val> _M_storage;
233 _Val*
237 const _Val*
258 typedef _Tp value_type;
259 typedef _Tp& reference;
260 typedef _Tp* pointer;
265 typedef _Rb_tree_iterator<_Tp> _Self;
267 typedef _Rb_tree_node<_Tp>* _Link_type;
328 typedef _Tp value_type;
329 typedef const _Tp& reference;
330 typedef const _Tp* pointer;
332 typedef _Rb_tree_iterator<_Tp> iterator;
337 typedef _Rb_tree_const_iterator<_Tp> _Self;
339 typedef const _Rb_tree_node<_Tp>* _Link_type;
447 rebind<_Rb_tree_node<_Val> >::other _Node_allocator;
454 typedef _Rb_tree_node<_Val>* _Link_type;
455 typedef const _Rb_tree_node<_Val>* _Const_Link_type;
554 operator()(_Arg&& __arg) const
563 typedef _Key key_type;
564 typedef _Val value_type;
621 _M_construct_node(_Link_type __node, _Args&&... __args)
625 ::new(__node) _Rb_tree_node<_Val>;
640 _M_create_node(_Args&&... __args)
758 static const _Key&
782 static const _Key&
834 _M_insert_(_Base_ptr __x, _Base_ptr __y, _Arg&& __v, _NodeGen&);
894 const _Key& __k);
898 const _Key& __k) const;
902 const _Key& __k);
906 const _Key& __k) const;
1011 _M_insert_unique(_Arg&& __x);
usr/include/c++/7.4.0/bits/stl_uninitialized.h 144 const _Tp& __x)
182 const _Tp& __x)
204 const _Tp& __x)
244 uninitialized_fill_n(_ForwardIterator __first, _Size __n, const _Tp& __x)
288 _ForwardIterator __result, allocator<_Tp>&)
644 allocator<_Tp>&)
usr/include/c++/7.4.0/bits/stl_vector.h 77 rebind<_Tp>::other _Tp_alloc_type;
216 class vector : protected _Vector_base<_Tp, _Alloc>
227 typedef _Vector_base<_Tp, _Alloc> _Base;
232 typedef _Tp value_type;
919 _Tp*
923 const _Tp*
962 emplace_back(_Args&&... __args);
1455 _Temporary_value(vector* __vec, _Args&&... __args) : _M_this(__vec)
1472 typename aligned_storage<sizeof(_Tp), alignof(_Tp)>::type __buf;
1472 typename aligned_storage<sizeof(_Tp), alignof(_Tp)>::type __buf;
1479 _M_insert_aux(iterator __position, _Arg&& __arg);
1483 _M_realloc_insert(iterator __position, _Args&&... __args);
1561 _Up*
1562 _M_data_ptr(_Up* __ptr) const _GLIBCXX_NOEXCEPT
1649 swap(vector<_Tp, _Alloc>& __x, vector<_Tp, _Alloc>& __y)
1649 swap(vector<_Tp, _Alloc>& __x, vector<_Tp, _Alloc>& __y)
usr/include/c++/7.4.0/bits/vector.tcc 101 std::forward<_Args>(__args)...);
105 _M_realloc_insert(end(), std::forward<_Args>(__args)...);
386 *__position = std::forward<_Arg>(__arg);
418 std::forward<_Args>(__args)...);
usr/include/c++/7.4.0/ext/aligned_buffer.h 52 struct _Tp2 { _Tp _M_t; };
54 alignas(__alignof__(_Tp2::_M_t)) unsigned char _M_storage[sizeof(_Tp)];
69 _Tp*
73 const _Tp*
usr/include/c++/7.4.0/ext/alloc_traits.h 117 { typedef typename _Base_type::template rebind_alloc<_Tp> other; };
usr/include/c++/7.4.0/ext/new_allocator.h 63 typedef _Tp* pointer;
64 typedef const _Tp* const_pointer;
65 typedef _Tp& reference;
66 typedef const _Tp& const_reference;
67 typedef _Tp value_type;
84 new_allocator(const new_allocator<_Tp1>&) _GLIBCXX_USE_NOEXCEPT { }
111 return static_cast<_Tp*>(::operator new(__n * sizeof(_Tp)));
130 { return size_t(-1) / sizeof(_Tp); }
135 construct(_Up* __p, _Args&&... __args)
135 construct(_Up* __p, _Args&&... __args)
136 { ::new((void *)__p) _Up(std::forward<_Args>(__args)...); }
136 { ::new((void *)__p) _Up(std::forward<_Args>(__args)...); }
140 destroy(_Up* __p) { __p->~_Up(); }
usr/include/c++/7.4.0/initializer_list 50 typedef _E value_type;
51 typedef const _E& reference;
52 typedef const _E& const_reference;
54 typedef const _E* iterator;
55 typedef const _E* const_iterator;
usr/include/c++/7.4.0/tuple 56 struct __is_empty_non_tuple : is_empty<_Tp> { };
125 constexpr _Head_base(const _Head& __h)
132 constexpr _Head_base(_UHead&& __h)
133 : _M_head_impl(std::forward<_UHead>(__h)) { }
159 static constexpr _Head&
162 static constexpr const _Head&
165 _Head _M_head_impl;
186 : public _Tuple_impl<_Idx + 1, _Tail...>,
187 private _Head_base<_Idx, _Head>
191 typedef _Tuple_impl<_Idx + 1, _Tail...> _Inherited;
192 typedef _Head_base<_Idx, _Head> _Base;
194 static constexpr _Head&
197 static constexpr const _Head&
210 constexpr _Tuple_impl(const _Head& __head, const _Tail&... __tail)
210 constexpr _Tuple_impl(const _Head& __head, const _Tail&... __tail)
216 constexpr _Tuple_impl(_UHead&& __head, _UTail&&... __tail)
216 constexpr _Tuple_impl(_UHead&& __head, _UTail&&... __tail)
227 _Base(std::forward<_Head>(_M_head(__in))) { }
230 constexpr _Tuple_impl(const _Tuple_impl<_Idx, _UElements...>& __in)
235 constexpr _Tuple_impl(_Tuple_impl<_Idx, _UHead, _UTails...>&& __in)
235 constexpr _Tuple_impl(_Tuple_impl<_Idx, _UHead, _UTails...>&& __in)
242 _Tuple_impl(allocator_arg_t __tag, const _Alloc& __a)
248 const _Head& __head, const _Tail&... __tail)
248 const _Head& __head, const _Tail&... __tail)
262 _Tuple_impl(allocator_arg_t __tag, const _Alloc& __a,
268 _Tuple_impl(allocator_arg_t __tag, const _Alloc& __a,
350 static constexpr _Head&
353 static constexpr const _Head&
360 constexpr _Tuple_impl(const _Head& __head)
365 constexpr _Tuple_impl(_UHead&& __head)
390 const _Head& __head)
473 return __and_<is_constructible<_Elements, const _UElements&>...>::value;
473 return __and_<is_constructible<_Elements, const _UElements&>...>::value;
479 return __and_<is_convertible<const _UElements&, _Elements>...>::value;
479 return __and_<is_convertible<const _UElements&, _Elements>...>::value;
485 return __and_<is_constructible<_Elements, _UElements&&>...>::value;
485 return __and_<is_constructible<_Elements, _UElements&&>...>::value;
491 return __and_<is_convertible<_UElements&&, _Elements>...>::value;
491 return __and_<is_convertible<_UElements&&, _Elements>...>::value;
508 return __not_<is_same<tuple<_Elements...>,
556 class tuple : public _Tuple_impl<0, _Elements...>
558 typedef _Tuple_impl<0, _Elements...> _Inherited;
598 _Elements...>;
608 constexpr tuple(const _Elements&... __elements)
619 explicit constexpr tuple(const _Elements&... __elements)
628 _Elements...>;
636 _Elements...>;
646 constexpr tuple(_UElements&&... __elements)
668 _Elements...>;
730 const _Elements&... __elements)
741 const _Elements&... __elements)
767 tuple(allocator_arg_t __tag, const _Alloc& __a, const tuple& __in)
771 tuple(allocator_arg_t __tag, const _Alloc& __a, tuple&& __in)
947 constexpr tuple(const _T1& __a1, const _T2& __a2)
947 constexpr tuple(const _T1& __a1, const _T2& __a2)
956 explicit constexpr tuple(const _T1& __a1, const _T2& __a2)
956 explicit constexpr tuple(const _T1& __a1, const _T2& __a2)
971 constexpr tuple(_U1&& __a1, _U2&& __a2)
971 constexpr tuple(_U1&& __a1, _U2&& __a2)
1066 tuple(allocator_arg_t __tag, const _Alloc& __a)
1078 const _T1& __a1, const _T2& __a2)
1078 const _T1& __a1, const _T2& __a2)
1090 const _T1& __a1, const _T2& __a2)
1090 const _T1& __a1, const _T2& __a2)
1241 operator=(const pair<_U1, _U2>& __in)
1241 operator=(const pair<_U1, _U2>& __in)
1250 operator=(pair<_U1, _U2>&& __in)
1250 operator=(pair<_U1, _U2>&& __in)
1252 this->_M_head(*this) = std::forward<_U1>(__in.first);
1253 this->_M_tail(*this)._M_head(*this) = std::forward<_U2>(__in.second);
1280 : tuple_element<__i - 1, tuple<_Tail...> > { };
1288 typedef _Head type;
1302 constexpr _Head&
1303 __get_helper(_Tuple_impl<__i, _Head, _Tail...>& __t) noexcept
1303 __get_helper(_Tuple_impl<__i, _Head, _Tail...>& __t) noexcept
1304 { return _Tuple_impl<__i, _Head, _Tail...>::_M_head(__t); }
1304 { return _Tuple_impl<__i, _Head, _Tail...>::_M_head(__t); }
1307 constexpr const _Head&
1308 __get_helper(const _Tuple_impl<__i, _Head, _Tail...>& __t) noexcept
1308 __get_helper(const _Tuple_impl<__i, _Head, _Tail...>& __t) noexcept
1313 constexpr __tuple_element_t<__i, tuple<_Elements...>>&
1313 constexpr __tuple_element_t<__i, tuple<_Elements...>>&
1313 constexpr __tuple_element_t<__i, tuple<_Elements...>>&
1314 get(tuple<_Elements...>& __t) noexcept
1319 constexpr const __tuple_element_t<__i, tuple<_Elements...>>&
1319 constexpr const __tuple_element_t<__i, tuple<_Elements...>>&
1319 constexpr const __tuple_element_t<__i, tuple<_Elements...>>&
1320 get(const tuple<_Elements...>& __t) noexcept
1325 constexpr __tuple_element_t<__i, tuple<_Elements...>>&&
1325 constexpr __tuple_element_t<__i, tuple<_Elements...>>&&
1325 constexpr __tuple_element_t<__i, tuple<_Elements...>>&&
1326 get(tuple<_Elements...>&& __t) noexcept
1448 make_tuple(_Elements&&... __args)
1588 constexpr tuple<_Elements&...>
1589 tie(_Elements&... __args) noexcept
usr/include/c++/7.4.0/type_traits 215 : public __is_void_helper<typename remove_cv<_Tp>::type>::type
326 : public __is_integral_helper<typename remove_cv<_Tp>::type>::type
354 : public __is_floating_point_helper<typename remove_cv<_Tp>::type>::type
381 : public __is_pointer_helper<typename remove_cv<_Tp>::type>::type
567 : public __is_null_pointer_helper<typename remove_cv<_Tp>::type>::type
581 : public __or_<is_lvalue_reference<_Tp>,
582 is_rvalue_reference<_Tp>>::type
588 : public __or_<is_integral<_Tp>, is_floating_point<_Tp>>::type
588 : public __or_<is_integral<_Tp>, is_floating_point<_Tp>>::type
601 : public __not_<__or_<is_function<_Tp>, is_reference<_Tp>,
601 : public __not_<__or_<is_function<_Tp>, is_reference<_Tp>,
602 is_void<_Tp>>>::type
611 : public __or_<is_arithmetic<_Tp>, is_enum<_Tp>, is_pointer<_Tp>,
611 : public __or_<is_arithmetic<_Tp>, is_enum<_Tp>, is_pointer<_Tp>,
611 : public __or_<is_arithmetic<_Tp>, is_enum<_Tp>, is_pointer<_Tp>,
612 is_member_pointer<_Tp>, is_null_pointer<_Tp>>::type
612 is_member_pointer<_Tp>, is_null_pointer<_Tp>>::type
631 : public __is_member_pointer_helper<typename remove_cv<_Tp>::type>::type
638 : public __or_<is_object<_Tp>, is_reference<_Tp>>::type
638 : public __or_<is_object<_Tp>, is_reference<_Tp>>::type
762 typename add_rvalue_reference<_Tp>::type declval() noexcept;
777 : public __and_<is_array<_Tp>, __not_<extent<_Tp>>>
777 : public __and_<is_array<_Tp>, __not_<extent<_Tp>>>
798 typedef decltype(__test<_Tp>(0)) type;
811 remove_all_extents<_Tp>::type>::type
825 : public __is_destructible_safe<_Tp>::type
889 typedef decltype(__test<_Tp>(0)) type;
894 : public __and_<__not_<is_void<_Tp>>,
895 __is_default_constructible_impl<_Tp>>
915 : public __is_default_constructible_atom<_Tp>::type
921 : public __is_default_constructible_safe<_Tp>::type
984 typedef decltype(__test<_Tp, _Arg>(0)) type;
989 : public __and_<is_destructible<_Tp>,
990 __is_direct_constructible_impl<_Tp, _Arg>>
1072 __is_direct_constructible_ref_cast<_Tp, _Arg>,
1073 __is_direct_constructible_new_safe<_Tp, _Arg>
1079 : public __is_direct_constructible_new<_Tp, _Arg>::type
1119 : public __is_direct_constructible<_Tp, _Arg>
1130 : public __is_constructible_impl<_Tp, _Args...>::type
1142 : public is_constructible<_Tp, const _Tp&>
1142 : public is_constructible<_Tp, const _Tp&>
1148 : public __is_copy_constructible_impl<_Tp>
1160 : public is_constructible<_Tp, _Tp&&>
1160 : public is_constructible<_Tp, _Tp&&>
1166 : public __is_move_constructible_impl<_Tp>
1215 : public __and_<is_constructible<_Tp, _Args...>,
1216 __is_nt_constructible_impl<_Tp, _Args...>>
1246 : public is_nothrow_constructible<_Tp, _Tp&&>
1246 : public is_nothrow_constructible<_Tp, _Tp&&>
1252 : public __is_nothrow_move_constructible_impl<_Tp>
1286 : public is_assignable<_Tp&, const _Tp&>
1286 : public is_assignable<_Tp&, const _Tp&>
1292 : public __is_copy_assignable_impl<_Tp>
1304 : public is_assignable<_Tp&, _Tp&&>
1304 : public is_assignable<_Tp&, _Tp&&>
1310 : public __is_move_assignable_impl<_Tp>
1352 : public is_nothrow_assignable<_Tp&, _Tp&&>
1352 : public is_nothrow_assignable<_Tp&, _Tp&&>
1358 : public __is_nt_move_assignable_impl<_Tp>
1377 static void __helper(const _Tp&);
1380 static true_type __test(const _Tp&,
1381 decltype(__helper<const _Tp&>({}))* = 0);
1390 typedef decltype(__test(declval<_Tp>())) type;
1395 : public __is_implicitly_default_constructible_impl<_Tp>::type
1400 : public __and_<is_default_constructible<_Tp>,
1401 __is_implicitly_default_constructible_safe<_Tp>>
1526 static void __test_aux(_To1);
1538 typedef decltype(__test<_From, _To>(0)) type;
1545 : public __is_convertible_helper<_From, _To>::type
1554 { typedef _Tp type; };
1558 { typedef _Tp type; };
1563 { typedef _Tp type; };
1574 remove_const<typename remove_volatile<_Tp>::type>::type type;
1629 { typedef _Tp type; };
1633 { typedef _Tp type; };
1659 { typedef _Tp&& type; };
1664 : public __add_rvalue_reference_helper<_Tp>
1955 { typedef _Tp type; };
2104 { typedef typename remove_cv<_Up>::type __type; };
2118 typedef typename remove_reference<_Tp>::type __remove_type;
2131 typedef _Tp __type;
2144 typename decay<_Tp>::type>::__type __type;
2171 { typedef _Iffalse type; };
2253 inline typename add_rvalue_reference<_Tp>::type
2428 std::declval<_Fn>()(std::declval<_Args>()...)
2439 typedef decltype(_S_test<_Functor, _ArgTypes...>(0)) type;
2452 _Functor, _ArgTypes...
2458 : public __invoke_result<_Functor, _ArgTypes...>
2574 typename remove_reference<_Tp>::type>::type>::type
2609 noexcept(swap(std::declval<_Tp&>(), std::declval<_Tp&>()))
2609 noexcept(swap(std::declval<_Tp&>(), std::declval<_Tp&>()))
2629 typedef decltype(__test<_Tp>(0)) type;
2639 : public __is_nothrow_swappable_impl<_Tp>::type