[DAGCombiner] Attempt to mask vectors before zero extension instead of after.
[oota-llvm.git] / lib / Target / SystemZ / SystemZISelDAGToDAG.cpp
1 //===-- SystemZISelDAGToDAG.cpp - A dag to dag inst selector for SystemZ --===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file defines an instruction selector for the SystemZ target.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #include "SystemZTargetMachine.h"
15 #include "llvm/Analysis/AliasAnalysis.h"
16 #include "llvm/CodeGen/SelectionDAGISel.h"
17 #include "llvm/Support/Debug.h"
18 #include "llvm/Support/raw_ostream.h"
19
20 using namespace llvm;
21
22 #define DEBUG_TYPE "systemz-isel"
23
24 namespace {
25 // Used to build addressing modes.
26 struct SystemZAddressingMode {
27   // The shape of the address.
28   enum AddrForm {
29     // base+displacement
30     FormBD,
31
32     // base+displacement+index for load and store operands
33     FormBDXNormal,
34
35     // base+displacement+index for load address operands
36     FormBDXLA,
37
38     // base+displacement+index+ADJDYNALLOC
39     FormBDXDynAlloc
40   };
41   AddrForm Form;
42
43   // The type of displacement.  The enum names here correspond directly
44   // to the definitions in SystemZOperand.td.  We could split them into
45   // flags -- single/pair, 128-bit, etc. -- but it hardly seems worth it.
46   enum DispRange {
47     Disp12Only,
48     Disp12Pair,
49     Disp20Only,
50     Disp20Only128,
51     Disp20Pair
52   };
53   DispRange DR;
54
55   // The parts of the address.  The address is equivalent to:
56   //
57   //     Base + Disp + Index + (IncludesDynAlloc ? ADJDYNALLOC : 0)
58   SDValue Base;
59   int64_t Disp;
60   SDValue Index;
61   bool IncludesDynAlloc;
62
63   SystemZAddressingMode(AddrForm form, DispRange dr)
64     : Form(form), DR(dr), Base(), Disp(0), Index(),
65       IncludesDynAlloc(false) {}
66
67   // True if the address can have an index register.
68   bool hasIndexField() { return Form != FormBD; }
69
70   // True if the address can (and must) include ADJDYNALLOC.
71   bool isDynAlloc() { return Form == FormBDXDynAlloc; }
72
73   void dump() {
74     errs() << "SystemZAddressingMode " << this << '\n';
75
76     errs() << " Base ";
77     if (Base.getNode())
78       Base.getNode()->dump();
79     else
80       errs() << "null\n";
81
82     if (hasIndexField()) {
83       errs() << " Index ";
84       if (Index.getNode())
85         Index.getNode()->dump();
86       else
87         errs() << "null\n";
88     }
89
90     errs() << " Disp " << Disp;
91     if (IncludesDynAlloc)
92       errs() << " + ADJDYNALLOC";
93     errs() << '\n';
94   }
95 };
96
97 // Return a mask with Count low bits set.
98 static uint64_t allOnes(unsigned int Count) {
99   assert(Count <= 64);
100   if (Count > 63)
101     return UINT64_MAX;
102   return (uint64_t(1) << Count) - 1;
103 }
104
105 // Represents operands 2 to 5 of the ROTATE AND ... SELECTED BITS operation
106 // given by Opcode.  The operands are: Input (R2), Start (I3), End (I4) and
107 // Rotate (I5).  The combined operand value is effectively:
108 //
109 //   (or (rotl Input, Rotate), ~Mask)
110 //
111 // for RNSBG and:
112 //
113 //   (and (rotl Input, Rotate), Mask)
114 //
115 // otherwise.  The output value has BitSize bits, although Input may be
116 // narrower (in which case the upper bits are don't care).
117 struct RxSBGOperands {
118   RxSBGOperands(unsigned Op, SDValue N)
119     : Opcode(Op), BitSize(N.getValueType().getSizeInBits()),
120       Mask(allOnes(BitSize)), Input(N), Start(64 - BitSize), End(63),
121       Rotate(0) {}
122
123   unsigned Opcode;
124   unsigned BitSize;
125   uint64_t Mask;
126   SDValue Input;
127   unsigned Start;
128   unsigned End;
129   unsigned Rotate;
130 };
131
132 class SystemZDAGToDAGISel : public SelectionDAGISel {
133   const SystemZSubtarget *Subtarget;
134
135   // Used by SystemZOperands.td to create integer constants.
136   inline SDValue getImm(const SDNode *Node, uint64_t Imm) const {
137     return CurDAG->getTargetConstant(Imm, SDLoc(Node), Node->getValueType(0));
138   }
139
140   const SystemZTargetMachine &getTargetMachine() const {
141     return static_cast<const SystemZTargetMachine &>(TM);
142   }
143
144   const SystemZInstrInfo *getInstrInfo() const {
145     return Subtarget->getInstrInfo();
146   }
147
148   // Try to fold more of the base or index of AM into AM, where IsBase
149   // selects between the base and index.
150   bool expandAddress(SystemZAddressingMode &AM, bool IsBase) const;
151
152   // Try to describe N in AM, returning true on success.
153   bool selectAddress(SDValue N, SystemZAddressingMode &AM) const;
154
155   // Extract individual target operands from matched address AM.
156   void getAddressOperands(const SystemZAddressingMode &AM, EVT VT,
157                           SDValue &Base, SDValue &Disp) const;
158   void getAddressOperands(const SystemZAddressingMode &AM, EVT VT,
159                           SDValue &Base, SDValue &Disp, SDValue &Index) const;
160
161   // Try to match Addr as a FormBD address with displacement type DR.
162   // Return true on success, storing the base and displacement in
163   // Base and Disp respectively.
164   bool selectBDAddr(SystemZAddressingMode::DispRange DR, SDValue Addr,
165                     SDValue &Base, SDValue &Disp) const;
166
167   // Try to match Addr as a FormBDX address with displacement type DR.
168   // Return true on success and if the result had no index.  Store the
169   // base and displacement in Base and Disp respectively.
170   bool selectMVIAddr(SystemZAddressingMode::DispRange DR, SDValue Addr,
171                      SDValue &Base, SDValue &Disp) const;
172
173   // Try to match Addr as a FormBDX* address of form Form with
174   // displacement type DR.  Return true on success, storing the base,
175   // displacement and index in Base, Disp and Index respectively.
176   bool selectBDXAddr(SystemZAddressingMode::AddrForm Form,
177                      SystemZAddressingMode::DispRange DR, SDValue Addr,
178                      SDValue &Base, SDValue &Disp, SDValue &Index) const;
179
180   // PC-relative address matching routines used by SystemZOperands.td.
181   bool selectPCRelAddress(SDValue Addr, SDValue &Target) const {
182     if (SystemZISD::isPCREL(Addr.getOpcode())) {
183       Target = Addr.getOperand(0);
184       return true;
185     }
186     return false;
187   }
188
189   // BD matching routines used by SystemZOperands.td.
190   bool selectBDAddr12Only(SDValue Addr, SDValue &Base, SDValue &Disp) const {
191     return selectBDAddr(SystemZAddressingMode::Disp12Only, Addr, Base, Disp);
192   }
193   bool selectBDAddr12Pair(SDValue Addr, SDValue &Base, SDValue &Disp) const {
194     return selectBDAddr(SystemZAddressingMode::Disp12Pair, Addr, Base, Disp);
195   }
196   bool selectBDAddr20Only(SDValue Addr, SDValue &Base, SDValue &Disp) const {
197     return selectBDAddr(SystemZAddressingMode::Disp20Only, Addr, Base, Disp);
198   }
199   bool selectBDAddr20Pair(SDValue Addr, SDValue &Base, SDValue &Disp) const {
200     return selectBDAddr(SystemZAddressingMode::Disp20Pair, Addr, Base, Disp);
201   }
202
203   // MVI matching routines used by SystemZOperands.td.
204   bool selectMVIAddr12Pair(SDValue Addr, SDValue &Base, SDValue &Disp) const {
205     return selectMVIAddr(SystemZAddressingMode::Disp12Pair, Addr, Base, Disp);
206   }
207   bool selectMVIAddr20Pair(SDValue Addr, SDValue &Base, SDValue &Disp) const {
208     return selectMVIAddr(SystemZAddressingMode::Disp20Pair, Addr, Base, Disp);
209   }
210
211   // BDX matching routines used by SystemZOperands.td.
212   bool selectBDXAddr12Only(SDValue Addr, SDValue &Base, SDValue &Disp,
213                            SDValue &Index) const {
214     return selectBDXAddr(SystemZAddressingMode::FormBDXNormal,
215                          SystemZAddressingMode::Disp12Only,
216                          Addr, Base, Disp, Index);
217   }
218   bool selectBDXAddr12Pair(SDValue Addr, SDValue &Base, SDValue &Disp,
219                            SDValue &Index) const {
220     return selectBDXAddr(SystemZAddressingMode::FormBDXNormal,
221                          SystemZAddressingMode::Disp12Pair,
222                          Addr, Base, Disp, Index);
223   }
224   bool selectDynAlloc12Only(SDValue Addr, SDValue &Base, SDValue &Disp,
225                             SDValue &Index) const {
226     return selectBDXAddr(SystemZAddressingMode::FormBDXDynAlloc,
227                          SystemZAddressingMode::Disp12Only,
228                          Addr, Base, Disp, Index);
229   }
230   bool selectBDXAddr20Only(SDValue Addr, SDValue &Base, SDValue &Disp,
231                            SDValue &Index) const {
232     return selectBDXAddr(SystemZAddressingMode::FormBDXNormal,
233                          SystemZAddressingMode::Disp20Only,
234                          Addr, Base, Disp, Index);
235   }
236   bool selectBDXAddr20Only128(SDValue Addr, SDValue &Base, SDValue &Disp,
237                               SDValue &Index) const {
238     return selectBDXAddr(SystemZAddressingMode::FormBDXNormal,
239                          SystemZAddressingMode::Disp20Only128,
240                          Addr, Base, Disp, Index);
241   }
242   bool selectBDXAddr20Pair(SDValue Addr, SDValue &Base, SDValue &Disp,
243                            SDValue &Index) const {
244     return selectBDXAddr(SystemZAddressingMode::FormBDXNormal,
245                          SystemZAddressingMode::Disp20Pair,
246                          Addr, Base, Disp, Index);
247   }
248   bool selectLAAddr12Pair(SDValue Addr, SDValue &Base, SDValue &Disp,
249                           SDValue &Index) const {
250     return selectBDXAddr(SystemZAddressingMode::FormBDXLA,
251                          SystemZAddressingMode::Disp12Pair,
252                          Addr, Base, Disp, Index);
253   }
254   bool selectLAAddr20Pair(SDValue Addr, SDValue &Base, SDValue &Disp,
255                           SDValue &Index) const {
256     return selectBDXAddr(SystemZAddressingMode::FormBDXLA,
257                          SystemZAddressingMode::Disp20Pair,
258                          Addr, Base, Disp, Index);
259   }
260
261   // Try to match Addr as an address with a base, 12-bit displacement
262   // and index, where the index is element Elem of a vector.
263   // Return true on success, storing the base, displacement and vector
264   // in Base, Disp and Index respectively.
265   bool selectBDVAddr12Only(SDValue Addr, SDValue Elem, SDValue &Base,
266                            SDValue &Disp, SDValue &Index) const;
267
268   // Check whether (or Op (and X InsertMask)) is effectively an insertion
269   // of X into bits InsertMask of some Y != Op.  Return true if so and
270   // set Op to that Y.
271   bool detectOrAndInsertion(SDValue &Op, uint64_t InsertMask) const;
272
273   // Try to update RxSBG so that only the bits of RxSBG.Input in Mask are used.
274   // Return true on success.
275   bool refineRxSBGMask(RxSBGOperands &RxSBG, uint64_t Mask) const;
276
277   // Try to fold some of RxSBG.Input into other fields of RxSBG.
278   // Return true on success.
279   bool expandRxSBG(RxSBGOperands &RxSBG) const;
280
281   // Return an undefined value of type VT.
282   SDValue getUNDEF(SDLoc DL, EVT VT) const;
283
284   // Convert N to VT, if it isn't already.
285   SDValue convertTo(SDLoc DL, EVT VT, SDValue N) const;
286
287   // Try to implement AND or shift node N using RISBG with the zero flag set.
288   // Return the selected node on success, otherwise return null.
289   SDNode *tryRISBGZero(SDNode *N);
290
291   // Try to use RISBG or Opcode to implement OR or XOR node N.
292   // Return the selected node on success, otherwise return null.
293   SDNode *tryRxSBG(SDNode *N, unsigned Opcode);
294
295   // If Op0 is null, then Node is a constant that can be loaded using:
296   //
297   //   (Opcode UpperVal LowerVal)
298   //
299   // If Op0 is nonnull, then Node can be implemented using:
300   //
301   //   (Opcode (Opcode Op0 UpperVal) LowerVal)
302   SDNode *splitLargeImmediate(unsigned Opcode, SDNode *Node, SDValue Op0,
303                               uint64_t UpperVal, uint64_t LowerVal);
304
305   // Try to use gather instruction Opcode to implement vector insertion N.
306   SDNode *tryGather(SDNode *N, unsigned Opcode);
307
308   // Try to use scatter instruction Opcode to implement store Store.
309   SDNode *tryScatter(StoreSDNode *Store, unsigned Opcode);
310
311   // Return true if Load and Store are loads and stores of the same size
312   // and are guaranteed not to overlap.  Such operations can be implemented
313   // using block (SS-format) instructions.
314   //
315   // Partial overlap would lead to incorrect code, since the block operations
316   // are logically bytewise, even though they have a fast path for the
317   // non-overlapping case.  We also need to avoid full overlap (i.e. two
318   // addresses that might be equal at run time) because although that case
319   // would be handled correctly, it might be implemented by millicode.
320   bool canUseBlockOperation(StoreSDNode *Store, LoadSDNode *Load) const;
321
322   // N is a (store (load Y), X) pattern.  Return true if it can use an MVC
323   // from Y to X.
324   bool storeLoadCanUseMVC(SDNode *N) const;
325
326   // N is a (store (op (load A[0]), (load A[1])), X) pattern.  Return true
327   // if A[1 - I] == X and if N can use a block operation like NC from A[I]
328   // to X.
329   bool storeLoadCanUseBlockBinary(SDNode *N, unsigned I) const;
330
331 public:
332   SystemZDAGToDAGISel(SystemZTargetMachine &TM, CodeGenOpt::Level OptLevel)
333       : SelectionDAGISel(TM, OptLevel) {}
334
335   bool runOnMachineFunction(MachineFunction &MF) override {
336     Subtarget = &MF.getSubtarget<SystemZSubtarget>();
337     return SelectionDAGISel::runOnMachineFunction(MF);
338   }
339
340   // Override MachineFunctionPass.
341   const char *getPassName() const override {
342     return "SystemZ DAG->DAG Pattern Instruction Selection";
343   }
344
345   // Override SelectionDAGISel.
346   SDNode *Select(SDNode *Node) override;
347   bool SelectInlineAsmMemoryOperand(const SDValue &Op, unsigned ConstraintID,
348                                     std::vector<SDValue> &OutOps) override;
349
350   // Include the pieces autogenerated from the target description.
351   #include "SystemZGenDAGISel.inc"
352 };
353 } // end anonymous namespace
354
355 FunctionPass *llvm::createSystemZISelDag(SystemZTargetMachine &TM,
356                                          CodeGenOpt::Level OptLevel) {
357   return new SystemZDAGToDAGISel(TM, OptLevel);
358 }
359
360 // Return true if Val should be selected as a displacement for an address
361 // with range DR.  Here we're interested in the range of both the instruction
362 // described by DR and of any pairing instruction.
363 static bool selectDisp(SystemZAddressingMode::DispRange DR, int64_t Val) {
364   switch (DR) {
365   case SystemZAddressingMode::Disp12Only:
366     return isUInt<12>(Val);
367
368   case SystemZAddressingMode::Disp12Pair:
369   case SystemZAddressingMode::Disp20Only:
370   case SystemZAddressingMode::Disp20Pair:
371     return isInt<20>(Val);
372
373   case SystemZAddressingMode::Disp20Only128:
374     return isInt<20>(Val) && isInt<20>(Val + 8);
375   }
376   llvm_unreachable("Unhandled displacement range");
377 }
378
379 // Change the base or index in AM to Value, where IsBase selects
380 // between the base and index.
381 static void changeComponent(SystemZAddressingMode &AM, bool IsBase,
382                             SDValue Value) {
383   if (IsBase)
384     AM.Base = Value;
385   else
386     AM.Index = Value;
387 }
388
389 // The base or index of AM is equivalent to Value + ADJDYNALLOC,
390 // where IsBase selects between the base and index.  Try to fold the
391 // ADJDYNALLOC into AM.
392 static bool expandAdjDynAlloc(SystemZAddressingMode &AM, bool IsBase,
393                               SDValue Value) {
394   if (AM.isDynAlloc() && !AM.IncludesDynAlloc) {
395     changeComponent(AM, IsBase, Value);
396     AM.IncludesDynAlloc = true;
397     return true;
398   }
399   return false;
400 }
401
402 // The base of AM is equivalent to Base + Index.  Try to use Index as
403 // the index register.
404 static bool expandIndex(SystemZAddressingMode &AM, SDValue Base,
405                         SDValue Index) {
406   if (AM.hasIndexField() && !AM.Index.getNode()) {
407     AM.Base = Base;
408     AM.Index = Index;
409     return true;
410   }
411   return false;
412 }
413
414 // The base or index of AM is equivalent to Op0 + Op1, where IsBase selects
415 // between the base and index.  Try to fold Op1 into AM's displacement.
416 static bool expandDisp(SystemZAddressingMode &AM, bool IsBase,
417                        SDValue Op0, uint64_t Op1) {
418   // First try adjusting the displacement.
419   int64_t TestDisp = AM.Disp + Op1;
420   if (selectDisp(AM.DR, TestDisp)) {
421     changeComponent(AM, IsBase, Op0);
422     AM.Disp = TestDisp;
423     return true;
424   }
425
426   // We could consider forcing the displacement into a register and
427   // using it as an index, but it would need to be carefully tuned.
428   return false;
429 }
430
431 bool SystemZDAGToDAGISel::expandAddress(SystemZAddressingMode &AM,
432                                         bool IsBase) const {
433   SDValue N = IsBase ? AM.Base : AM.Index;
434   unsigned Opcode = N.getOpcode();
435   if (Opcode == ISD::TRUNCATE) {
436     N = N.getOperand(0);
437     Opcode = N.getOpcode();
438   }
439   if (Opcode == ISD::ADD || CurDAG->isBaseWithConstantOffset(N)) {
440     SDValue Op0 = N.getOperand(0);
441     SDValue Op1 = N.getOperand(1);
442
443     unsigned Op0Code = Op0->getOpcode();
444     unsigned Op1Code = Op1->getOpcode();
445
446     if (Op0Code == SystemZISD::ADJDYNALLOC)
447       return expandAdjDynAlloc(AM, IsBase, Op1);
448     if (Op1Code == SystemZISD::ADJDYNALLOC)
449       return expandAdjDynAlloc(AM, IsBase, Op0);
450
451     if (Op0Code == ISD::Constant)
452       return expandDisp(AM, IsBase, Op1,
453                         cast<ConstantSDNode>(Op0)->getSExtValue());
454     if (Op1Code == ISD::Constant)
455       return expandDisp(AM, IsBase, Op0,
456                         cast<ConstantSDNode>(Op1)->getSExtValue());
457
458     if (IsBase && expandIndex(AM, Op0, Op1))
459       return true;
460   }
461   if (Opcode == SystemZISD::PCREL_OFFSET) {
462     SDValue Full = N.getOperand(0);
463     SDValue Base = N.getOperand(1);
464     SDValue Anchor = Base.getOperand(0);
465     uint64_t Offset = (cast<GlobalAddressSDNode>(Full)->getOffset() -
466                        cast<GlobalAddressSDNode>(Anchor)->getOffset());
467     return expandDisp(AM, IsBase, Base, Offset);
468   }
469   return false;
470 }
471
472 // Return true if an instruction with displacement range DR should be
473 // used for displacement value Val.  selectDisp(DR, Val) must already hold.
474 static bool isValidDisp(SystemZAddressingMode::DispRange DR, int64_t Val) {
475   assert(selectDisp(DR, Val) && "Invalid displacement");
476   switch (DR) {
477   case SystemZAddressingMode::Disp12Only:
478   case SystemZAddressingMode::Disp20Only:
479   case SystemZAddressingMode::Disp20Only128:
480     return true;
481
482   case SystemZAddressingMode::Disp12Pair:
483     // Use the other instruction if the displacement is too large.
484     return isUInt<12>(Val);
485
486   case SystemZAddressingMode::Disp20Pair:
487     // Use the other instruction if the displacement is small enough.
488     return !isUInt<12>(Val);
489   }
490   llvm_unreachable("Unhandled displacement range");
491 }
492
493 // Return true if Base + Disp + Index should be performed by LA(Y).
494 static bool shouldUseLA(SDNode *Base, int64_t Disp, SDNode *Index) {
495   // Don't use LA(Y) for constants.
496   if (!Base)
497     return false;
498
499   // Always use LA(Y) for frame addresses, since we know that the destination
500   // register is almost always (perhaps always) going to be different from
501   // the frame register.
502   if (Base->getOpcode() == ISD::FrameIndex)
503     return true;
504
505   if (Disp) {
506     // Always use LA(Y) if there is a base, displacement and index.
507     if (Index)
508       return true;
509
510     // Always use LA if the displacement is small enough.  It should always
511     // be no worse than AGHI (and better if it avoids a move).
512     if (isUInt<12>(Disp))
513       return true;
514
515     // For similar reasons, always use LAY if the constant is too big for AGHI.
516     // LAY should be no worse than AGFI.
517     if (!isInt<16>(Disp))
518       return true;
519   } else {
520     // Don't use LA for plain registers.
521     if (!Index)
522       return false;
523
524     // Don't use LA for plain addition if the index operand is only used
525     // once.  It should be a natural two-operand addition in that case.
526     if (Index->hasOneUse())
527       return false;
528
529     // Prefer addition if the second operation is sign-extended, in the
530     // hope of using AGF.
531     unsigned IndexOpcode = Index->getOpcode();
532     if (IndexOpcode == ISD::SIGN_EXTEND ||
533         IndexOpcode == ISD::SIGN_EXTEND_INREG)
534       return false;
535   }
536
537   // Don't use LA for two-operand addition if either operand is only
538   // used once.  The addition instructions are better in that case.
539   if (Base->hasOneUse())
540     return false;
541
542   return true;
543 }
544
545 // Return true if Addr is suitable for AM, updating AM if so.
546 bool SystemZDAGToDAGISel::selectAddress(SDValue Addr,
547                                         SystemZAddressingMode &AM) const {
548   // Start out assuming that the address will need to be loaded separately,
549   // then try to extend it as much as we can.
550   AM.Base = Addr;
551
552   // First try treating the address as a constant.
553   if (Addr.getOpcode() == ISD::Constant &&
554       expandDisp(AM, true, SDValue(),
555                  cast<ConstantSDNode>(Addr)->getSExtValue()))
556     ;
557   else
558     // Otherwise try expanding each component.
559     while (expandAddress(AM, true) ||
560            (AM.Index.getNode() && expandAddress(AM, false)))
561       continue;
562
563   // Reject cases where it isn't profitable to use LA(Y).
564   if (AM.Form == SystemZAddressingMode::FormBDXLA &&
565       !shouldUseLA(AM.Base.getNode(), AM.Disp, AM.Index.getNode()))
566     return false;
567
568   // Reject cases where the other instruction in a pair should be used.
569   if (!isValidDisp(AM.DR, AM.Disp))
570     return false;
571
572   // Make sure that ADJDYNALLOC is included where necessary.
573   if (AM.isDynAlloc() && !AM.IncludesDynAlloc)
574     return false;
575
576   DEBUG(AM.dump());
577   return true;
578 }
579
580 // Insert a node into the DAG at least before Pos.  This will reposition
581 // the node as needed, and will assign it a node ID that is <= Pos's ID.
582 // Note that this does *not* preserve the uniqueness of node IDs!
583 // The selection DAG must no longer depend on their uniqueness when this
584 // function is used.
585 static void insertDAGNode(SelectionDAG *DAG, SDNode *Pos, SDValue N) {
586   if (N.getNode()->getNodeId() == -1 ||
587       N.getNode()->getNodeId() > Pos->getNodeId()) {
588     DAG->RepositionNode(Pos, N.getNode());
589     N.getNode()->setNodeId(Pos->getNodeId());
590   }
591 }
592
593 void SystemZDAGToDAGISel::getAddressOperands(const SystemZAddressingMode &AM,
594                                              EVT VT, SDValue &Base,
595                                              SDValue &Disp) const {
596   Base = AM.Base;
597   if (!Base.getNode())
598     // Register 0 means "no base".  This is mostly useful for shifts.
599     Base = CurDAG->getRegister(0, VT);
600   else if (Base.getOpcode() == ISD::FrameIndex) {
601     // Lower a FrameIndex to a TargetFrameIndex.
602     int64_t FrameIndex = cast<FrameIndexSDNode>(Base)->getIndex();
603     Base = CurDAG->getTargetFrameIndex(FrameIndex, VT);
604   } else if (Base.getValueType() != VT) {
605     // Truncate values from i64 to i32, for shifts.
606     assert(VT == MVT::i32 && Base.getValueType() == MVT::i64 &&
607            "Unexpected truncation");
608     SDLoc DL(Base);
609     SDValue Trunc = CurDAG->getNode(ISD::TRUNCATE, DL, VT, Base);
610     insertDAGNode(CurDAG, Base.getNode(), Trunc);
611     Base = Trunc;
612   }
613
614   // Lower the displacement to a TargetConstant.
615   Disp = CurDAG->getTargetConstant(AM.Disp, SDLoc(Base), VT);
616 }
617
618 void SystemZDAGToDAGISel::getAddressOperands(const SystemZAddressingMode &AM,
619                                              EVT VT, SDValue &Base,
620                                              SDValue &Disp,
621                                              SDValue &Index) const {
622   getAddressOperands(AM, VT, Base, Disp);
623
624   Index = AM.Index;
625   if (!Index.getNode())
626     // Register 0 means "no index".
627     Index = CurDAG->getRegister(0, VT);
628 }
629
630 bool SystemZDAGToDAGISel::selectBDAddr(SystemZAddressingMode::DispRange DR,
631                                        SDValue Addr, SDValue &Base,
632                                        SDValue &Disp) const {
633   SystemZAddressingMode AM(SystemZAddressingMode::FormBD, DR);
634   if (!selectAddress(Addr, AM))
635     return false;
636
637   getAddressOperands(AM, Addr.getValueType(), Base, Disp);
638   return true;
639 }
640
641 bool SystemZDAGToDAGISel::selectMVIAddr(SystemZAddressingMode::DispRange DR,
642                                         SDValue Addr, SDValue &Base,
643                                         SDValue &Disp) const {
644   SystemZAddressingMode AM(SystemZAddressingMode::FormBDXNormal, DR);
645   if (!selectAddress(Addr, AM) || AM.Index.getNode())
646     return false;
647
648   getAddressOperands(AM, Addr.getValueType(), Base, Disp);
649   return true;
650 }
651
652 bool SystemZDAGToDAGISel::selectBDXAddr(SystemZAddressingMode::AddrForm Form,
653                                         SystemZAddressingMode::DispRange DR,
654                                         SDValue Addr, SDValue &Base,
655                                         SDValue &Disp, SDValue &Index) const {
656   SystemZAddressingMode AM(Form, DR);
657   if (!selectAddress(Addr, AM))
658     return false;
659
660   getAddressOperands(AM, Addr.getValueType(), Base, Disp, Index);
661   return true;
662 }
663
664 bool SystemZDAGToDAGISel::selectBDVAddr12Only(SDValue Addr, SDValue Elem,
665                                               SDValue &Base,
666                                               SDValue &Disp,
667                                               SDValue &Index) const {
668   SDValue Regs[2];
669   if (selectBDXAddr12Only(Addr, Regs[0], Disp, Regs[1]) &&
670       Regs[0].getNode() && Regs[1].getNode()) {
671     for (unsigned int I = 0; I < 2; ++I) {
672       Base = Regs[I];
673       Index = Regs[1 - I];
674       // We can't tell here whether the index vector has the right type
675       // for the access; the caller needs to do that instead.
676       if (Index.getOpcode() == ISD::ZERO_EXTEND)
677         Index = Index.getOperand(0);
678       if (Index.getOpcode() == ISD::EXTRACT_VECTOR_ELT &&
679           Index.getOperand(1) == Elem) {
680         Index = Index.getOperand(0);
681         return true;
682       }
683     }
684   }
685   return false;
686 }
687
688 bool SystemZDAGToDAGISel::detectOrAndInsertion(SDValue &Op,
689                                                uint64_t InsertMask) const {
690   // We're only interested in cases where the insertion is into some operand
691   // of Op, rather than into Op itself.  The only useful case is an AND.
692   if (Op.getOpcode() != ISD::AND)
693     return false;
694
695   // We need a constant mask.
696   auto *MaskNode = dyn_cast<ConstantSDNode>(Op.getOperand(1).getNode());
697   if (!MaskNode)
698     return false;
699
700   // It's not an insertion of Op.getOperand(0) if the two masks overlap.
701   uint64_t AndMask = MaskNode->getZExtValue();
702   if (InsertMask & AndMask)
703     return false;
704
705   // It's only an insertion if all bits are covered or are known to be zero.
706   // The inner check covers all cases but is more expensive.
707   uint64_t Used = allOnes(Op.getValueType().getSizeInBits());
708   if (Used != (AndMask | InsertMask)) {
709     APInt KnownZero, KnownOne;
710     CurDAG->computeKnownBits(Op.getOperand(0), KnownZero, KnownOne);
711     if (Used != (AndMask | InsertMask | KnownZero.getZExtValue()))
712       return false;
713   }
714
715   Op = Op.getOperand(0);
716   return true;
717 }
718
719 bool SystemZDAGToDAGISel::refineRxSBGMask(RxSBGOperands &RxSBG,
720                                           uint64_t Mask) const {
721   const SystemZInstrInfo *TII = getInstrInfo();
722   if (RxSBG.Rotate != 0)
723     Mask = (Mask << RxSBG.Rotate) | (Mask >> (64 - RxSBG.Rotate));
724   Mask &= RxSBG.Mask;
725   if (TII->isRxSBGMask(Mask, RxSBG.BitSize, RxSBG.Start, RxSBG.End)) {
726     RxSBG.Mask = Mask;
727     return true;
728   }
729   return false;
730 }
731
732 // Return true if any bits of (RxSBG.Input & Mask) are significant.
733 static bool maskMatters(RxSBGOperands &RxSBG, uint64_t Mask) {
734   // Rotate the mask in the same way as RxSBG.Input is rotated.
735   if (RxSBG.Rotate != 0)
736     Mask = ((Mask << RxSBG.Rotate) | (Mask >> (64 - RxSBG.Rotate)));
737   return (Mask & RxSBG.Mask) != 0;
738 }
739
740 bool SystemZDAGToDAGISel::expandRxSBG(RxSBGOperands &RxSBG) const {
741   SDValue N = RxSBG.Input;
742   unsigned Opcode = N.getOpcode();
743   switch (Opcode) {
744   case ISD::AND: {
745     if (RxSBG.Opcode == SystemZ::RNSBG)
746       return false;
747
748     auto *MaskNode = dyn_cast<ConstantSDNode>(N.getOperand(1).getNode());
749     if (!MaskNode)
750       return false;
751
752     SDValue Input = N.getOperand(0);
753     uint64_t Mask = MaskNode->getZExtValue();
754     if (!refineRxSBGMask(RxSBG, Mask)) {
755       // If some bits of Input are already known zeros, those bits will have
756       // been removed from the mask.  See if adding them back in makes the
757       // mask suitable.
758       APInt KnownZero, KnownOne;
759       CurDAG->computeKnownBits(Input, KnownZero, KnownOne);
760       Mask |= KnownZero.getZExtValue();
761       if (!refineRxSBGMask(RxSBG, Mask))
762         return false;
763     }
764     RxSBG.Input = Input;
765     return true;
766   }
767
768   case ISD::OR: {
769     if (RxSBG.Opcode != SystemZ::RNSBG)
770       return false;
771
772     auto *MaskNode = dyn_cast<ConstantSDNode>(N.getOperand(1).getNode());
773     if (!MaskNode)
774       return false;
775
776     SDValue Input = N.getOperand(0);
777     uint64_t Mask = ~MaskNode->getZExtValue();
778     if (!refineRxSBGMask(RxSBG, Mask)) {
779       // If some bits of Input are already known ones, those bits will have
780       // been removed from the mask.  See if adding them back in makes the
781       // mask suitable.
782       APInt KnownZero, KnownOne;
783       CurDAG->computeKnownBits(Input, KnownZero, KnownOne);
784       Mask &= ~KnownOne.getZExtValue();
785       if (!refineRxSBGMask(RxSBG, Mask))
786         return false;
787     }
788     RxSBG.Input = Input;
789     return true;
790   }
791
792   case ISD::ROTL: {
793     // Any 64-bit rotate left can be merged into the RxSBG.
794     if (RxSBG.BitSize != 64 || N.getValueType() != MVT::i64)
795       return false;
796     auto *CountNode = dyn_cast<ConstantSDNode>(N.getOperand(1).getNode());
797     if (!CountNode)
798       return false;
799
800     RxSBG.Rotate = (RxSBG.Rotate + CountNode->getZExtValue()) & 63;
801     RxSBG.Input = N.getOperand(0);
802     return true;
803   }
804
805   case ISD::ANY_EXTEND:
806     // Bits above the extended operand are don't-care.
807     RxSBG.Input = N.getOperand(0);
808     return true;
809
810   case ISD::ZERO_EXTEND:
811     if (RxSBG.Opcode != SystemZ::RNSBG) {
812       // Restrict the mask to the extended operand.
813       unsigned InnerBitSize = N.getOperand(0).getValueType().getSizeInBits();
814       if (!refineRxSBGMask(RxSBG, allOnes(InnerBitSize)))
815         return false;
816
817       RxSBG.Input = N.getOperand(0);
818       return true;
819     }
820     // Fall through.
821
822   case ISD::SIGN_EXTEND: {
823     // Check that the extension bits are don't-care (i.e. are masked out
824     // by the final mask).
825     unsigned InnerBitSize = N.getOperand(0).getValueType().getSizeInBits();
826     if (maskMatters(RxSBG, allOnes(RxSBG.BitSize) - allOnes(InnerBitSize)))
827       return false;
828
829     RxSBG.Input = N.getOperand(0);
830     return true;
831   }
832
833   case ISD::SHL: {
834     auto *CountNode = dyn_cast<ConstantSDNode>(N.getOperand(1).getNode());
835     if (!CountNode)
836       return false;
837
838     uint64_t Count = CountNode->getZExtValue();
839     unsigned BitSize = N.getValueType().getSizeInBits();
840     if (Count < 1 || Count >= BitSize)
841       return false;
842
843     if (RxSBG.Opcode == SystemZ::RNSBG) {
844       // Treat (shl X, count) as (rotl X, size-count) as long as the bottom
845       // count bits from RxSBG.Input are ignored.
846       if (maskMatters(RxSBG, allOnes(Count)))
847         return false;
848     } else {
849       // Treat (shl X, count) as (and (rotl X, count), ~0<<count).
850       if (!refineRxSBGMask(RxSBG, allOnes(BitSize - Count) << Count))
851         return false;
852     }
853
854     RxSBG.Rotate = (RxSBG.Rotate + Count) & 63;
855     RxSBG.Input = N.getOperand(0);
856     return true;
857   }
858
859   case ISD::SRL:
860   case ISD::SRA: {
861     auto *CountNode = dyn_cast<ConstantSDNode>(N.getOperand(1).getNode());
862     if (!CountNode)
863       return false;
864
865     uint64_t Count = CountNode->getZExtValue();
866     unsigned BitSize = N.getValueType().getSizeInBits();
867     if (Count < 1 || Count >= BitSize)
868       return false;
869
870     if (RxSBG.Opcode == SystemZ::RNSBG || Opcode == ISD::SRA) {
871       // Treat (srl|sra X, count) as (rotl X, size-count) as long as the top
872       // count bits from RxSBG.Input are ignored.
873       if (maskMatters(RxSBG, allOnes(Count) << (BitSize - Count)))
874         return false;
875     } else {
876       // Treat (srl X, count), mask) as (and (rotl X, size-count), ~0>>count),
877       // which is similar to SLL above.
878       if (!refineRxSBGMask(RxSBG, allOnes(BitSize - Count)))
879         return false;
880     }
881
882     RxSBG.Rotate = (RxSBG.Rotate - Count) & 63;
883     RxSBG.Input = N.getOperand(0);
884     return true;
885   }
886   default:
887     return false;
888   }
889 }
890
891 SDValue SystemZDAGToDAGISel::getUNDEF(SDLoc DL, EVT VT) const {
892   SDNode *N = CurDAG->getMachineNode(TargetOpcode::IMPLICIT_DEF, DL, VT);
893   return SDValue(N, 0);
894 }
895
896 SDValue SystemZDAGToDAGISel::convertTo(SDLoc DL, EVT VT, SDValue N) const {
897   if (N.getValueType() == MVT::i32 && VT == MVT::i64)
898     return CurDAG->getTargetInsertSubreg(SystemZ::subreg_l32,
899                                          DL, VT, getUNDEF(DL, MVT::i64), N);
900   if (N.getValueType() == MVT::i64 && VT == MVT::i32)
901     return CurDAG->getTargetExtractSubreg(SystemZ::subreg_l32, DL, VT, N);
902   assert(N.getValueType() == VT && "Unexpected value types");
903   return N;
904 }
905
906 SDNode *SystemZDAGToDAGISel::tryRISBGZero(SDNode *N) {
907   SDLoc DL(N);
908   EVT VT = N->getValueType(0);
909   if (!VT.isInteger() || VT.getSizeInBits() > 64)
910     return nullptr;
911   RxSBGOperands RISBG(SystemZ::RISBG, SDValue(N, 0));
912   unsigned Count = 0;
913   while (expandRxSBG(RISBG))
914     if (RISBG.Input.getOpcode() != ISD::ANY_EXTEND)
915       Count += 1;
916   if (Count == 0)
917     return nullptr;
918   if (Count == 1) {
919     // Prefer to use normal shift instructions over RISBG, since they can handle
920     // all cases and are sometimes shorter.
921     if (N->getOpcode() != ISD::AND)
922       return nullptr;
923
924     // Prefer register extensions like LLC over RISBG.  Also prefer to start
925     // out with normal ANDs if one instruction would be enough.  We can convert
926     // these ANDs into an RISBG later if a three-address instruction is useful.
927     if (VT == MVT::i32 ||
928         RISBG.Mask == 0xff ||
929         RISBG.Mask == 0xffff ||
930         SystemZ::isImmLF(~RISBG.Mask) ||
931         SystemZ::isImmHF(~RISBG.Mask)) {
932       // Force the new mask into the DAG, since it may include known-one bits.
933       auto *MaskN = cast<ConstantSDNode>(N->getOperand(1).getNode());
934       if (MaskN->getZExtValue() != RISBG.Mask) {
935         SDValue NewMask = CurDAG->getConstant(RISBG.Mask, DL, VT);
936         N = CurDAG->UpdateNodeOperands(N, N->getOperand(0), NewMask);
937         return SelectCode(N);
938       }
939       return nullptr;
940     }
941   }
942
943   // If the RISBG operands require no rotation and just masks the bottom
944   // 8/16 bits, attempt to convert this to a LLC zero extension.
945   if (RISBG.Rotate == 0 && (RISBG.Mask == 0xff || RISBG.Mask == 0xffff)) {
946     unsigned OpCode = (RISBG.Mask == 0xff ? SystemZ::LLGCR : SystemZ::LLGHR);
947     if (VT == MVT::i32) {
948       if (Subtarget->hasHighWord())
949         OpCode = (RISBG.Mask == 0xff ? SystemZ::LLCRMux : SystemZ::LLHRMux);
950       else
951         OpCode = (RISBG.Mask == 0xff ? SystemZ::LLCR : SystemZ::LLHR);
952     }
953
954     SDValue In = convertTo(DL, VT, RISBG.Input);
955     N = CurDAG->getMachineNode(OpCode, DL, VT, In);
956     return convertTo(DL, VT, SDValue(N, 0)).getNode();
957   }
958
959   unsigned Opcode = SystemZ::RISBG;
960   // Prefer RISBGN if available, since it does not clobber CC.
961   if (Subtarget->hasMiscellaneousExtensions())
962     Opcode = SystemZ::RISBGN;
963   EVT OpcodeVT = MVT::i64;
964   if (VT == MVT::i32 && Subtarget->hasHighWord()) {
965     Opcode = SystemZ::RISBMux;
966     OpcodeVT = MVT::i32;
967     RISBG.Start &= 31;
968     RISBG.End &= 31;
969   }
970   SDValue Ops[5] = {
971     getUNDEF(DL, OpcodeVT),
972     convertTo(DL, OpcodeVT, RISBG.Input),
973     CurDAG->getTargetConstant(RISBG.Start, DL, MVT::i32),
974     CurDAG->getTargetConstant(RISBG.End | 128, DL, MVT::i32),
975     CurDAG->getTargetConstant(RISBG.Rotate, DL, MVT::i32)
976   };
977   N = CurDAG->getMachineNode(Opcode, DL, OpcodeVT, Ops);
978   return convertTo(DL, VT, SDValue(N, 0)).getNode();
979 }
980
981 SDNode *SystemZDAGToDAGISel::tryRxSBG(SDNode *N, unsigned Opcode) {
982   SDLoc DL(N);
983   EVT VT = N->getValueType(0);
984   if (!VT.isInteger() || VT.getSizeInBits() > 64)
985     return nullptr;
986   // Try treating each operand of N as the second operand of the RxSBG
987   // and see which goes deepest.
988   RxSBGOperands RxSBG[] = {
989     RxSBGOperands(Opcode, N->getOperand(0)),
990     RxSBGOperands(Opcode, N->getOperand(1))
991   };
992   unsigned Count[] = { 0, 0 };
993   for (unsigned I = 0; I < 2; ++I)
994     while (expandRxSBG(RxSBG[I]))
995       if (RxSBG[I].Input.getOpcode() != ISD::ANY_EXTEND)
996         Count[I] += 1;
997
998   // Do nothing if neither operand is suitable.
999   if (Count[0] == 0 && Count[1] == 0)
1000     return nullptr;
1001
1002   // Pick the deepest second operand.
1003   unsigned I = Count[0] > Count[1] ? 0 : 1;
1004   SDValue Op0 = N->getOperand(I ^ 1);
1005
1006   // Prefer IC for character insertions from memory.
1007   if (Opcode == SystemZ::ROSBG && (RxSBG[I].Mask & 0xff) == 0)
1008     if (auto *Load = dyn_cast<LoadSDNode>(Op0.getNode()))
1009       if (Load->getMemoryVT() == MVT::i8)
1010         return nullptr;
1011
1012   // See whether we can avoid an AND in the first operand by converting
1013   // ROSBG to RISBG.
1014   if (Opcode == SystemZ::ROSBG && detectOrAndInsertion(Op0, RxSBG[I].Mask)) {
1015     Opcode = SystemZ::RISBG;
1016     // Prefer RISBGN if available, since it does not clobber CC.
1017     if (Subtarget->hasMiscellaneousExtensions())
1018       Opcode = SystemZ::RISBGN;
1019   }
1020
1021   SDValue Ops[5] = {
1022     convertTo(DL, MVT::i64, Op0),
1023     convertTo(DL, MVT::i64, RxSBG[I].Input),
1024     CurDAG->getTargetConstant(RxSBG[I].Start, DL, MVT::i32),
1025     CurDAG->getTargetConstant(RxSBG[I].End, DL, MVT::i32),
1026     CurDAG->getTargetConstant(RxSBG[I].Rotate, DL, MVT::i32)
1027   };
1028   N = CurDAG->getMachineNode(Opcode, DL, MVT::i64, Ops);
1029   return convertTo(DL, VT, SDValue(N, 0)).getNode();
1030 }
1031
1032 SDNode *SystemZDAGToDAGISel::splitLargeImmediate(unsigned Opcode, SDNode *Node,
1033                                                  SDValue Op0, uint64_t UpperVal,
1034                                                  uint64_t LowerVal) {
1035   EVT VT = Node->getValueType(0);
1036   SDLoc DL(Node);
1037   SDValue Upper = CurDAG->getConstant(UpperVal, DL, VT);
1038   if (Op0.getNode())
1039     Upper = CurDAG->getNode(Opcode, DL, VT, Op0, Upper);
1040   Upper = SDValue(Select(Upper.getNode()), 0);
1041
1042   SDValue Lower = CurDAG->getConstant(LowerVal, DL, VT);
1043   SDValue Or = CurDAG->getNode(Opcode, DL, VT, Upper, Lower);
1044   return Or.getNode();
1045 }
1046
1047 SDNode *SystemZDAGToDAGISel::tryGather(SDNode *N, unsigned Opcode) {
1048   SDValue ElemV = N->getOperand(2);
1049   auto *ElemN = dyn_cast<ConstantSDNode>(ElemV);
1050   if (!ElemN)
1051     return 0;
1052
1053   unsigned Elem = ElemN->getZExtValue();
1054   EVT VT = N->getValueType(0);
1055   if (Elem >= VT.getVectorNumElements())
1056     return 0;
1057
1058   auto *Load = dyn_cast<LoadSDNode>(N->getOperand(1));
1059   if (!Load || !Load->hasOneUse())
1060     return 0;
1061   if (Load->getMemoryVT().getSizeInBits() !=
1062       Load->getValueType(0).getSizeInBits())
1063     return 0;
1064
1065   SDValue Base, Disp, Index;
1066   if (!selectBDVAddr12Only(Load->getBasePtr(), ElemV, Base, Disp, Index) ||
1067       Index.getValueType() != VT.changeVectorElementTypeToInteger())
1068     return 0;
1069
1070   SDLoc DL(Load);
1071   SDValue Ops[] = {
1072     N->getOperand(0), Base, Disp, Index,
1073     CurDAG->getTargetConstant(Elem, DL, MVT::i32), Load->getChain()
1074   };
1075   SDNode *Res = CurDAG->getMachineNode(Opcode, DL, VT, MVT::Other, Ops);
1076   ReplaceUses(SDValue(Load, 1), SDValue(Res, 1));
1077   return Res;
1078 }
1079
1080 SDNode *SystemZDAGToDAGISel::tryScatter(StoreSDNode *Store, unsigned Opcode) {
1081   SDValue Value = Store->getValue();
1082   if (Value.getOpcode() != ISD::EXTRACT_VECTOR_ELT)
1083     return 0;
1084   if (Store->getMemoryVT().getSizeInBits() !=
1085       Value.getValueType().getSizeInBits())
1086     return 0;
1087
1088   SDValue ElemV = Value.getOperand(1);
1089   auto *ElemN = dyn_cast<ConstantSDNode>(ElemV);
1090   if (!ElemN)
1091     return 0;
1092
1093   SDValue Vec = Value.getOperand(0);
1094   EVT VT = Vec.getValueType();
1095   unsigned Elem = ElemN->getZExtValue();
1096   if (Elem >= VT.getVectorNumElements())
1097     return 0;
1098
1099   SDValue Base, Disp, Index;
1100   if (!selectBDVAddr12Only(Store->getBasePtr(), ElemV, Base, Disp, Index) ||
1101       Index.getValueType() != VT.changeVectorElementTypeToInteger())
1102     return 0;
1103
1104   SDLoc DL(Store);
1105   SDValue Ops[] = {
1106     Vec, Base, Disp, Index, CurDAG->getTargetConstant(Elem, DL, MVT::i32),
1107     Store->getChain()
1108   };
1109   return CurDAG->getMachineNode(Opcode, DL, MVT::Other, Ops);
1110 }
1111
1112 bool SystemZDAGToDAGISel::canUseBlockOperation(StoreSDNode *Store,
1113                                                LoadSDNode *Load) const {
1114   // Check that the two memory operands have the same size.
1115   if (Load->getMemoryVT() != Store->getMemoryVT())
1116     return false;
1117
1118   // Volatility stops an access from being decomposed.
1119   if (Load->isVolatile() || Store->isVolatile())
1120     return false;
1121
1122   // There's no chance of overlap if the load is invariant.
1123   if (Load->isInvariant())
1124     return true;
1125
1126   // Otherwise we need to check whether there's an alias.
1127   const Value *V1 = Load->getMemOperand()->getValue();
1128   const Value *V2 = Store->getMemOperand()->getValue();
1129   if (!V1 || !V2)
1130     return false;
1131
1132   // Reject equality.
1133   uint64_t Size = Load->getMemoryVT().getStoreSize();
1134   int64_t End1 = Load->getSrcValueOffset() + Size;
1135   int64_t End2 = Store->getSrcValueOffset() + Size;
1136   if (V1 == V2 && End1 == End2)
1137     return false;
1138
1139   return !AA->alias(MemoryLocation(V1, End1, Load->getAAInfo()),
1140                     MemoryLocation(V2, End2, Store->getAAInfo()));
1141 }
1142
1143 bool SystemZDAGToDAGISel::storeLoadCanUseMVC(SDNode *N) const {
1144   auto *Store = cast<StoreSDNode>(N);
1145   auto *Load = cast<LoadSDNode>(Store->getValue());
1146
1147   // Prefer not to use MVC if either address can use ... RELATIVE LONG
1148   // instructions.
1149   uint64_t Size = Load->getMemoryVT().getStoreSize();
1150   if (Size > 1 && Size <= 8) {
1151     // Prefer LHRL, LRL and LGRL.
1152     if (SystemZISD::isPCREL(Load->getBasePtr().getOpcode()))
1153       return false;
1154     // Prefer STHRL, STRL and STGRL.
1155     if (SystemZISD::isPCREL(Store->getBasePtr().getOpcode()))
1156       return false;
1157   }
1158
1159   return canUseBlockOperation(Store, Load);
1160 }
1161
1162 bool SystemZDAGToDAGISel::storeLoadCanUseBlockBinary(SDNode *N,
1163                                                      unsigned I) const {
1164   auto *StoreA = cast<StoreSDNode>(N);
1165   auto *LoadA = cast<LoadSDNode>(StoreA->getValue().getOperand(1 - I));
1166   auto *LoadB = cast<LoadSDNode>(StoreA->getValue().getOperand(I));
1167   return !LoadA->isVolatile() && canUseBlockOperation(StoreA, LoadB);
1168 }
1169
1170 SDNode *SystemZDAGToDAGISel::Select(SDNode *Node) {
1171   // Dump information about the Node being selected
1172   DEBUG(errs() << "Selecting: "; Node->dump(CurDAG); errs() << "\n");
1173
1174   // If we have a custom node, we already have selected!
1175   if (Node->isMachineOpcode()) {
1176     DEBUG(errs() << "== "; Node->dump(CurDAG); errs() << "\n");
1177     Node->setNodeId(-1);
1178     return nullptr;
1179   }
1180
1181   unsigned Opcode = Node->getOpcode();
1182   SDNode *ResNode = nullptr;
1183   switch (Opcode) {
1184   case ISD::OR:
1185     if (Node->getOperand(1).getOpcode() != ISD::Constant)
1186       ResNode = tryRxSBG(Node, SystemZ::ROSBG);
1187     goto or_xor;
1188
1189   case ISD::XOR:
1190     if (Node->getOperand(1).getOpcode() != ISD::Constant)
1191       ResNode = tryRxSBG(Node, SystemZ::RXSBG);
1192     // Fall through.
1193   or_xor:
1194     // If this is a 64-bit operation in which both 32-bit halves are nonzero,
1195     // split the operation into two.
1196     if (!ResNode && Node->getValueType(0) == MVT::i64)
1197       if (auto *Op1 = dyn_cast<ConstantSDNode>(Node->getOperand(1))) {
1198         uint64_t Val = Op1->getZExtValue();
1199         if (!SystemZ::isImmLF(Val) && !SystemZ::isImmHF(Val))
1200           Node = splitLargeImmediate(Opcode, Node, Node->getOperand(0),
1201                                      Val - uint32_t(Val), uint32_t(Val));
1202       }
1203     break;
1204
1205   case ISD::AND:
1206     if (Node->getOperand(1).getOpcode() != ISD::Constant)
1207       ResNode = tryRxSBG(Node, SystemZ::RNSBG);
1208     // Fall through.
1209   case ISD::ROTL:
1210   case ISD::SHL:
1211   case ISD::SRL:
1212   case ISD::ZERO_EXTEND:
1213     if (!ResNode)
1214       ResNode = tryRISBGZero(Node);
1215     break;
1216
1217   case ISD::Constant:
1218     // If this is a 64-bit constant that is out of the range of LLILF,
1219     // LLIHF and LGFI, split it into two 32-bit pieces.
1220     if (Node->getValueType(0) == MVT::i64) {
1221       uint64_t Val = cast<ConstantSDNode>(Node)->getZExtValue();
1222       if (!SystemZ::isImmLF(Val) && !SystemZ::isImmHF(Val) && !isInt<32>(Val))
1223         Node = splitLargeImmediate(ISD::OR, Node, SDValue(),
1224                                    Val - uint32_t(Val), uint32_t(Val));
1225     }
1226     break;
1227
1228   case SystemZISD::SELECT_CCMASK: {
1229     SDValue Op0 = Node->getOperand(0);
1230     SDValue Op1 = Node->getOperand(1);
1231     // Prefer to put any load first, so that it can be matched as a
1232     // conditional load.
1233     if (Op1.getOpcode() == ISD::LOAD && Op0.getOpcode() != ISD::LOAD) {
1234       SDValue CCValid = Node->getOperand(2);
1235       SDValue CCMask = Node->getOperand(3);
1236       uint64_t ConstCCValid =
1237         cast<ConstantSDNode>(CCValid.getNode())->getZExtValue();
1238       uint64_t ConstCCMask =
1239         cast<ConstantSDNode>(CCMask.getNode())->getZExtValue();
1240       // Invert the condition.
1241       CCMask = CurDAG->getConstant(ConstCCValid ^ ConstCCMask, SDLoc(Node),
1242                                    CCMask.getValueType());
1243       SDValue Op4 = Node->getOperand(4);
1244       Node = CurDAG->UpdateNodeOperands(Node, Op1, Op0, CCValid, CCMask, Op4);
1245     }
1246     break;
1247   }
1248
1249   case ISD::INSERT_VECTOR_ELT: {
1250     EVT VT = Node->getValueType(0);
1251     unsigned ElemBitSize = VT.getVectorElementType().getSizeInBits();
1252     if (ElemBitSize == 32)
1253       ResNode = tryGather(Node, SystemZ::VGEF);
1254     else if (ElemBitSize == 64)
1255       ResNode = tryGather(Node, SystemZ::VGEG);
1256     break;
1257   }
1258
1259   case ISD::STORE: {
1260     auto *Store = cast<StoreSDNode>(Node);
1261     unsigned ElemBitSize = Store->getValue().getValueType().getSizeInBits();
1262     if (ElemBitSize == 32)
1263       ResNode = tryScatter(Store, SystemZ::VSCEF);
1264     else if (ElemBitSize == 64)
1265       ResNode = tryScatter(Store, SystemZ::VSCEG);
1266     break;
1267   }
1268   }
1269
1270   // Select the default instruction
1271   if (!ResNode)
1272     ResNode = SelectCode(Node);
1273
1274   DEBUG(errs() << "=> ";
1275         if (ResNode == nullptr || ResNode == Node)
1276           Node->dump(CurDAG);
1277         else
1278           ResNode->dump(CurDAG);
1279         errs() << "\n";
1280         );
1281   return ResNode;
1282 }
1283
1284 bool SystemZDAGToDAGISel::
1285 SelectInlineAsmMemoryOperand(const SDValue &Op,
1286                              unsigned ConstraintID,
1287                              std::vector<SDValue> &OutOps) {
1288   switch(ConstraintID) {
1289   default:
1290     llvm_unreachable("Unexpected asm memory constraint");
1291   case InlineAsm::Constraint_i:
1292   case InlineAsm::Constraint_m:
1293   case InlineAsm::Constraint_Q:
1294   case InlineAsm::Constraint_R:
1295   case InlineAsm::Constraint_S:
1296   case InlineAsm::Constraint_T:
1297     // Accept addresses with short displacements, which are compatible
1298     // with Q, R, S and T.  But keep the index operand for future expansion.
1299     SDValue Base, Disp, Index;
1300     if (selectBDXAddr(SystemZAddressingMode::FormBD,
1301                       SystemZAddressingMode::Disp12Only,
1302                       Op, Base, Disp, Index)) {
1303       OutOps.push_back(Base);
1304       OutOps.push_back(Disp);
1305       OutOps.push_back(Index);
1306       return false;
1307     }
1308     break;
1309   }
1310   return true;
1311 }