xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/VE/VEISelDAGToDAG.cpp (revision bdd1243df58e60e85101c09001d9812a789b6bc4)
1480093f4SDimitry Andric //===-- VEISelDAGToDAG.cpp - A dag to dag inst selector for VE ------------===//
2480093f4SDimitry Andric //
3480093f4SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4480093f4SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5480093f4SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6480093f4SDimitry Andric //
7480093f4SDimitry Andric //===----------------------------------------------------------------------===//
8480093f4SDimitry Andric //
9480093f4SDimitry Andric // This file defines an instruction selector for the VE target.
10480093f4SDimitry Andric //
11480093f4SDimitry Andric //===----------------------------------------------------------------------===//
12480093f4SDimitry Andric 
1381ad6265SDimitry Andric #include "VE.h"
14480093f4SDimitry Andric #include "VETargetMachine.h"
15480093f4SDimitry Andric #include "llvm/CodeGen/MachineRegisterInfo.h"
16480093f4SDimitry Andric #include "llvm/CodeGen/SelectionDAGISel.h"
17480093f4SDimitry Andric #include "llvm/IR/Intrinsics.h"
18480093f4SDimitry Andric #include "llvm/Support/Debug.h"
19480093f4SDimitry Andric #include "llvm/Support/ErrorHandling.h"
20480093f4SDimitry Andric #include "llvm/Support/raw_ostream.h"
21480093f4SDimitry Andric using namespace llvm;
22480093f4SDimitry Andric 
23*bdd1243dSDimitry Andric #define DEBUG_TYPE "ve-isel"
24*bdd1243dSDimitry Andric #define PASS_NAME "VE DAG->DAG Pattern Instruction Selection"
255ffd83dbSDimitry Andric 
26480093f4SDimitry Andric //===--------------------------------------------------------------------===//
27480093f4SDimitry Andric /// VEDAGToDAGISel - VE specific code to select VE machine
28480093f4SDimitry Andric /// instructions for SelectionDAG operations.
29480093f4SDimitry Andric ///
30480093f4SDimitry Andric namespace {
31480093f4SDimitry Andric class VEDAGToDAGISel : public SelectionDAGISel {
32480093f4SDimitry Andric   /// Subtarget - Keep a pointer to the VE Subtarget around so that we can
33480093f4SDimitry Andric   /// make the right decision when generating code for different targets.
34480093f4SDimitry Andric   const VESubtarget *Subtarget;
35480093f4SDimitry Andric 
36480093f4SDimitry Andric public:
37*bdd1243dSDimitry Andric   static char ID;
38*bdd1243dSDimitry Andric 
39*bdd1243dSDimitry Andric   VEDAGToDAGISel() = delete;
40*bdd1243dSDimitry Andric 
41*bdd1243dSDimitry Andric   explicit VEDAGToDAGISel(VETargetMachine &tm) : SelectionDAGISel(ID, tm) {}
42480093f4SDimitry Andric 
43480093f4SDimitry Andric   bool runOnMachineFunction(MachineFunction &MF) override {
44480093f4SDimitry Andric     Subtarget = &MF.getSubtarget<VESubtarget>();
45480093f4SDimitry Andric     return SelectionDAGISel::runOnMachineFunction(MF);
46480093f4SDimitry Andric   }
47480093f4SDimitry Andric 
48480093f4SDimitry Andric   void Select(SDNode *N) override;
49480093f4SDimitry Andric 
505ffd83dbSDimitry Andric   // Complex Pattern Selectors.
515ffd83dbSDimitry Andric   bool selectADDRrri(SDValue N, SDValue &Base, SDValue &Index, SDValue &Offset);
525ffd83dbSDimitry Andric   bool selectADDRrii(SDValue N, SDValue &Base, SDValue &Index, SDValue &Offset);
535ffd83dbSDimitry Andric   bool selectADDRzri(SDValue N, SDValue &Base, SDValue &Index, SDValue &Offset);
545ffd83dbSDimitry Andric   bool selectADDRzii(SDValue N, SDValue &Base, SDValue &Index, SDValue &Offset);
555ffd83dbSDimitry Andric   bool selectADDRri(SDValue N, SDValue &Base, SDValue &Offset);
56e8d8bef9SDimitry Andric   bool selectADDRzi(SDValue N, SDValue &Base, SDValue &Offset);
575ffd83dbSDimitry Andric 
58*bdd1243dSDimitry Andric   /// SelectInlineAsmMemoryOperand - Implement addressing mode selection for
59*bdd1243dSDimitry Andric   /// inline asm expressions.
60*bdd1243dSDimitry Andric   bool SelectInlineAsmMemoryOperand(const SDValue &Op,
61*bdd1243dSDimitry Andric                                     unsigned ConstraintID,
62*bdd1243dSDimitry Andric                                     std::vector<SDValue> &OutOps) override;
63480093f4SDimitry Andric 
64480093f4SDimitry Andric   // Include the pieces autogenerated from the target description.
65480093f4SDimitry Andric #include "VEGenDAGISel.inc"
665ffd83dbSDimitry Andric 
675ffd83dbSDimitry Andric private:
685ffd83dbSDimitry Andric   SDNode *getGlobalBaseReg();
695ffd83dbSDimitry Andric 
705ffd83dbSDimitry Andric   bool matchADDRrr(SDValue N, SDValue &Base, SDValue &Index);
715ffd83dbSDimitry Andric   bool matchADDRri(SDValue N, SDValue &Base, SDValue &Offset);
72480093f4SDimitry Andric };
73480093f4SDimitry Andric } // end anonymous namespace
74480093f4SDimitry Andric 
75*bdd1243dSDimitry Andric char VEDAGToDAGISel::ID = 0;
76*bdd1243dSDimitry Andric 
77*bdd1243dSDimitry Andric INITIALIZE_PASS(VEDAGToDAGISel, DEBUG_TYPE, PASS_NAME, false, false)
78*bdd1243dSDimitry Andric 
795ffd83dbSDimitry Andric bool VEDAGToDAGISel::selectADDRrri(SDValue Addr, SDValue &Base, SDValue &Index,
805ffd83dbSDimitry Andric                                    SDValue &Offset) {
815ffd83dbSDimitry Andric   if (Addr.getOpcode() == ISD::FrameIndex)
825ffd83dbSDimitry Andric     return false;
835ffd83dbSDimitry Andric   if (Addr.getOpcode() == ISD::TargetExternalSymbol ||
845ffd83dbSDimitry Andric       Addr.getOpcode() == ISD::TargetGlobalAddress ||
855ffd83dbSDimitry Andric       Addr.getOpcode() == ISD::TargetGlobalTLSAddress)
865ffd83dbSDimitry Andric     return false; // direct calls.
875ffd83dbSDimitry Andric 
885ffd83dbSDimitry Andric   SDValue LHS, RHS;
895ffd83dbSDimitry Andric   if (matchADDRri(Addr, LHS, RHS)) {
905ffd83dbSDimitry Andric     if (matchADDRrr(LHS, Base, Index)) {
915ffd83dbSDimitry Andric       Offset = RHS;
925ffd83dbSDimitry Andric       return true;
935ffd83dbSDimitry Andric     }
945ffd83dbSDimitry Andric     // Return false to try selectADDRrii.
955ffd83dbSDimitry Andric     return false;
965ffd83dbSDimitry Andric   }
975ffd83dbSDimitry Andric   if (matchADDRrr(Addr, LHS, RHS)) {
98e8d8bef9SDimitry Andric     // If the input is a pair of a frame-index and a register, move a
99e8d8bef9SDimitry Andric     // frame-index to LHS.  This generates MI with following operands.
100e8d8bef9SDimitry Andric     //    %dest, #FI, %reg, offset
101e8d8bef9SDimitry Andric     // In the eliminateFrameIndex, above MI is converted to the following.
102e8d8bef9SDimitry Andric     //    %dest, %fp, %reg, fi_offset + offset
103fe6060f1SDimitry Andric     if (isa<FrameIndexSDNode>(RHS))
104e8d8bef9SDimitry Andric       std::swap(LHS, RHS);
105e8d8bef9SDimitry Andric 
1065ffd83dbSDimitry Andric     if (matchADDRri(RHS, Index, Offset)) {
1075ffd83dbSDimitry Andric       Base = LHS;
1085ffd83dbSDimitry Andric       return true;
1095ffd83dbSDimitry Andric     }
1105ffd83dbSDimitry Andric     if (matchADDRri(LHS, Base, Offset)) {
1115ffd83dbSDimitry Andric       Index = RHS;
1125ffd83dbSDimitry Andric       return true;
1135ffd83dbSDimitry Andric     }
1145ffd83dbSDimitry Andric     Base = LHS;
1155ffd83dbSDimitry Andric     Index = RHS;
1165ffd83dbSDimitry Andric     Offset = CurDAG->getTargetConstant(0, SDLoc(Addr), MVT::i32);
1175ffd83dbSDimitry Andric     return true;
1185ffd83dbSDimitry Andric   }
1195ffd83dbSDimitry Andric   return false; // Let the reg+imm(=0) pattern catch this!
1205ffd83dbSDimitry Andric }
1215ffd83dbSDimitry Andric 
1225ffd83dbSDimitry Andric bool VEDAGToDAGISel::selectADDRrii(SDValue Addr, SDValue &Base, SDValue &Index,
1235ffd83dbSDimitry Andric                                    SDValue &Offset) {
1245ffd83dbSDimitry Andric   if (matchADDRri(Addr, Base, Offset)) {
1255ffd83dbSDimitry Andric     Index = CurDAG->getTargetConstant(0, SDLoc(Addr), MVT::i32);
1265ffd83dbSDimitry Andric     return true;
1275ffd83dbSDimitry Andric   }
1285ffd83dbSDimitry Andric 
1295ffd83dbSDimitry Andric   Base = Addr;
1305ffd83dbSDimitry Andric   Index = CurDAG->getTargetConstant(0, SDLoc(Addr), MVT::i32);
1315ffd83dbSDimitry Andric   Offset = CurDAG->getTargetConstant(0, SDLoc(Addr), MVT::i32);
1325ffd83dbSDimitry Andric   return true;
1335ffd83dbSDimitry Andric }
1345ffd83dbSDimitry Andric 
1355ffd83dbSDimitry Andric bool VEDAGToDAGISel::selectADDRzri(SDValue Addr, SDValue &Base, SDValue &Index,
1365ffd83dbSDimitry Andric                                    SDValue &Offset) {
1375ffd83dbSDimitry Andric   // Prefer ADDRrii.
1385ffd83dbSDimitry Andric   return false;
1395ffd83dbSDimitry Andric }
1405ffd83dbSDimitry Andric 
1415ffd83dbSDimitry Andric bool VEDAGToDAGISel::selectADDRzii(SDValue Addr, SDValue &Base, SDValue &Index,
1425ffd83dbSDimitry Andric                                    SDValue &Offset) {
143fe6060f1SDimitry Andric   if (isa<FrameIndexSDNode>(Addr))
1445ffd83dbSDimitry Andric     return false;
1455ffd83dbSDimitry Andric   if (Addr.getOpcode() == ISD::TargetExternalSymbol ||
1465ffd83dbSDimitry Andric       Addr.getOpcode() == ISD::TargetGlobalAddress ||
1475ffd83dbSDimitry Andric       Addr.getOpcode() == ISD::TargetGlobalTLSAddress)
1485ffd83dbSDimitry Andric     return false; // direct calls.
1495ffd83dbSDimitry Andric 
150e8d8bef9SDimitry Andric   if (auto *CN = dyn_cast<ConstantSDNode>(Addr)) {
1515ffd83dbSDimitry Andric     if (isInt<32>(CN->getSExtValue())) {
1525ffd83dbSDimitry Andric       Base = CurDAG->getTargetConstant(0, SDLoc(Addr), MVT::i32);
1535ffd83dbSDimitry Andric       Index = CurDAG->getTargetConstant(0, SDLoc(Addr), MVT::i32);
1545ffd83dbSDimitry Andric       Offset =
1555ffd83dbSDimitry Andric           CurDAG->getTargetConstant(CN->getZExtValue(), SDLoc(Addr), MVT::i32);
1565ffd83dbSDimitry Andric       return true;
1575ffd83dbSDimitry Andric     }
1585ffd83dbSDimitry Andric   }
1595ffd83dbSDimitry Andric   return false;
1605ffd83dbSDimitry Andric }
1615ffd83dbSDimitry Andric 
1625ffd83dbSDimitry Andric bool VEDAGToDAGISel::selectADDRri(SDValue Addr, SDValue &Base,
1635ffd83dbSDimitry Andric                                   SDValue &Offset) {
1645ffd83dbSDimitry Andric   if (matchADDRri(Addr, Base, Offset))
1655ffd83dbSDimitry Andric     return true;
1665ffd83dbSDimitry Andric 
1675ffd83dbSDimitry Andric   Base = Addr;
1685ffd83dbSDimitry Andric   Offset = CurDAG->getTargetConstant(0, SDLoc(Addr), MVT::i32);
1695ffd83dbSDimitry Andric   return true;
1705ffd83dbSDimitry Andric }
1715ffd83dbSDimitry Andric 
172e8d8bef9SDimitry Andric bool VEDAGToDAGISel::selectADDRzi(SDValue Addr, SDValue &Base,
173e8d8bef9SDimitry Andric                                   SDValue &Offset) {
174fe6060f1SDimitry Andric   if (isa<FrameIndexSDNode>(Addr))
175e8d8bef9SDimitry Andric     return false;
176e8d8bef9SDimitry Andric   if (Addr.getOpcode() == ISD::TargetExternalSymbol ||
177e8d8bef9SDimitry Andric       Addr.getOpcode() == ISD::TargetGlobalAddress ||
178e8d8bef9SDimitry Andric       Addr.getOpcode() == ISD::TargetGlobalTLSAddress)
179e8d8bef9SDimitry Andric     return false; // direct calls.
180e8d8bef9SDimitry Andric 
181e8d8bef9SDimitry Andric   if (auto *CN = dyn_cast<ConstantSDNode>(Addr)) {
182e8d8bef9SDimitry Andric     if (isInt<32>(CN->getSExtValue())) {
183e8d8bef9SDimitry Andric       Base = CurDAG->getTargetConstant(0, SDLoc(Addr), MVT::i32);
184e8d8bef9SDimitry Andric       Offset =
185e8d8bef9SDimitry Andric           CurDAG->getTargetConstant(CN->getZExtValue(), SDLoc(Addr), MVT::i32);
186e8d8bef9SDimitry Andric       return true;
187e8d8bef9SDimitry Andric     }
188e8d8bef9SDimitry Andric   }
189e8d8bef9SDimitry Andric   return false;
190e8d8bef9SDimitry Andric }
191e8d8bef9SDimitry Andric 
1925ffd83dbSDimitry Andric bool VEDAGToDAGISel::matchADDRrr(SDValue Addr, SDValue &Base, SDValue &Index) {
193fe6060f1SDimitry Andric   if (isa<FrameIndexSDNode>(Addr))
1945ffd83dbSDimitry Andric     return false;
1955ffd83dbSDimitry Andric   if (Addr.getOpcode() == ISD::TargetExternalSymbol ||
1965ffd83dbSDimitry Andric       Addr.getOpcode() == ISD::TargetGlobalAddress ||
1975ffd83dbSDimitry Andric       Addr.getOpcode() == ISD::TargetGlobalTLSAddress)
1985ffd83dbSDimitry Andric     return false; // direct calls.
1995ffd83dbSDimitry Andric 
2005ffd83dbSDimitry Andric   if (Addr.getOpcode() == ISD::ADD) {
2015ffd83dbSDimitry Andric     ; // Nothing to do here.
2025ffd83dbSDimitry Andric   } else if (Addr.getOpcode() == ISD::OR) {
2035ffd83dbSDimitry Andric     // We want to look through a transform in InstCombine and DAGCombiner that
2045ffd83dbSDimitry Andric     // turns 'add' into 'or', so we can treat this 'or' exactly like an 'add'.
2055ffd83dbSDimitry Andric     if (!CurDAG->haveNoCommonBitsSet(Addr.getOperand(0), Addr.getOperand(1)))
2065ffd83dbSDimitry Andric       return false;
2075ffd83dbSDimitry Andric   } else {
2085ffd83dbSDimitry Andric     return false;
2095ffd83dbSDimitry Andric   }
2105ffd83dbSDimitry Andric 
2115ffd83dbSDimitry Andric   if (Addr.getOperand(0).getOpcode() == VEISD::Lo ||
2125ffd83dbSDimitry Andric       Addr.getOperand(1).getOpcode() == VEISD::Lo)
2135ffd83dbSDimitry Andric     return false; // Let the LEASL patterns catch this!
2145ffd83dbSDimitry Andric 
2155ffd83dbSDimitry Andric   Base = Addr.getOperand(0);
2165ffd83dbSDimitry Andric   Index = Addr.getOperand(1);
2175ffd83dbSDimitry Andric   return true;
2185ffd83dbSDimitry Andric }
2195ffd83dbSDimitry Andric 
2205ffd83dbSDimitry Andric bool VEDAGToDAGISel::matchADDRri(SDValue Addr, SDValue &Base, SDValue &Offset) {
2215ffd83dbSDimitry Andric   auto AddrTy = Addr->getValueType(0);
2225ffd83dbSDimitry Andric   if (FrameIndexSDNode *FIN = dyn_cast<FrameIndexSDNode>(Addr)) {
2235ffd83dbSDimitry Andric     Base = CurDAG->getTargetFrameIndex(FIN->getIndex(), AddrTy);
2245ffd83dbSDimitry Andric     Offset = CurDAG->getTargetConstant(0, SDLoc(Addr), MVT::i32);
2255ffd83dbSDimitry Andric     return true;
2265ffd83dbSDimitry Andric   }
2275ffd83dbSDimitry Andric   if (Addr.getOpcode() == ISD::TargetExternalSymbol ||
2285ffd83dbSDimitry Andric       Addr.getOpcode() == ISD::TargetGlobalAddress ||
2295ffd83dbSDimitry Andric       Addr.getOpcode() == ISD::TargetGlobalTLSAddress)
2305ffd83dbSDimitry Andric     return false; // direct calls.
2315ffd83dbSDimitry Andric 
2325ffd83dbSDimitry Andric   if (CurDAG->isBaseWithConstantOffset(Addr)) {
2335ffd83dbSDimitry Andric     ConstantSDNode *CN = cast<ConstantSDNode>(Addr.getOperand(1));
2345ffd83dbSDimitry Andric     if (isInt<32>(CN->getSExtValue())) {
2355ffd83dbSDimitry Andric       if (FrameIndexSDNode *FIN =
2365ffd83dbSDimitry Andric               dyn_cast<FrameIndexSDNode>(Addr.getOperand(0))) {
2375ffd83dbSDimitry Andric         // Constant offset from frame ref.
2385ffd83dbSDimitry Andric         Base = CurDAG->getTargetFrameIndex(FIN->getIndex(), AddrTy);
2395ffd83dbSDimitry Andric       } else {
2405ffd83dbSDimitry Andric         Base = Addr.getOperand(0);
2415ffd83dbSDimitry Andric       }
2425ffd83dbSDimitry Andric       Offset =
2435ffd83dbSDimitry Andric           CurDAG->getTargetConstant(CN->getZExtValue(), SDLoc(Addr), MVT::i32);
2445ffd83dbSDimitry Andric       return true;
2455ffd83dbSDimitry Andric     }
2465ffd83dbSDimitry Andric   }
2475ffd83dbSDimitry Andric   return false;
2485ffd83dbSDimitry Andric }
2495ffd83dbSDimitry Andric 
250480093f4SDimitry Andric void VEDAGToDAGISel::Select(SDNode *N) {
251480093f4SDimitry Andric   SDLoc dl(N);
252480093f4SDimitry Andric   if (N->isMachineOpcode()) {
253480093f4SDimitry Andric     N->setNodeId(-1);
254480093f4SDimitry Andric     return; // Already selected.
255480093f4SDimitry Andric   }
256480093f4SDimitry Andric 
2575ffd83dbSDimitry Andric   switch (N->getOpcode()) {
25881ad6265SDimitry Andric 
25981ad6265SDimitry Andric   // Late eliminate the LEGALAVL wrapper
26081ad6265SDimitry Andric   case VEISD::LEGALAVL:
26181ad6265SDimitry Andric     ReplaceNode(N, N->getOperand(0).getNode());
26281ad6265SDimitry Andric     return;
26381ad6265SDimitry Andric 
26481ad6265SDimitry Andric   // Lower (broadcast 1) and (broadcast 0) to VM[P]0
26581ad6265SDimitry Andric   case VEISD::VEC_BROADCAST: {
26681ad6265SDimitry Andric     MVT SplatResTy = N->getSimpleValueType(0);
26781ad6265SDimitry Andric     if (SplatResTy.getVectorElementType() != MVT::i1)
26881ad6265SDimitry Andric       break;
26981ad6265SDimitry Andric 
27081ad6265SDimitry Andric     // Constant non-zero broadcast.
27181ad6265SDimitry Andric     auto BConst = dyn_cast<ConstantSDNode>(N->getOperand(0));
27281ad6265SDimitry Andric     if (!BConst)
27381ad6265SDimitry Andric       break;
27481ad6265SDimitry Andric     bool BCTrueMask = (BConst->getSExtValue() != 0);
27581ad6265SDimitry Andric     if (!BCTrueMask)
27681ad6265SDimitry Andric       break;
27781ad6265SDimitry Andric 
27881ad6265SDimitry Andric     // Packed or non-packed.
27981ad6265SDimitry Andric     SDValue New;
28081ad6265SDimitry Andric     if (SplatResTy.getVectorNumElements() == StandardVectorWidth) {
28181ad6265SDimitry Andric       New = CurDAG->getCopyFromReg(CurDAG->getEntryNode(), SDLoc(N), VE::VM0,
28281ad6265SDimitry Andric                                    MVT::v256i1);
28381ad6265SDimitry Andric     } else if (SplatResTy.getVectorNumElements() == PackedVectorWidth) {
28481ad6265SDimitry Andric       New = CurDAG->getCopyFromReg(CurDAG->getEntryNode(), SDLoc(N), VE::VMP0,
28581ad6265SDimitry Andric                                    MVT::v512i1);
28681ad6265SDimitry Andric     } else
28781ad6265SDimitry Andric       break;
28881ad6265SDimitry Andric 
28981ad6265SDimitry Andric     // Replace.
29081ad6265SDimitry Andric     ReplaceNode(N, New.getNode());
29181ad6265SDimitry Andric     return;
29281ad6265SDimitry Andric   }
29381ad6265SDimitry Andric 
2945ffd83dbSDimitry Andric   case VEISD::GLOBAL_BASE_REG:
2955ffd83dbSDimitry Andric     ReplaceNode(N, getGlobalBaseReg());
2965ffd83dbSDimitry Andric     return;
2975ffd83dbSDimitry Andric   }
2985ffd83dbSDimitry Andric 
299480093f4SDimitry Andric   SelectCode(N);
300480093f4SDimitry Andric }
301480093f4SDimitry Andric 
302*bdd1243dSDimitry Andric /// SelectInlineAsmMemoryOperand - Implement addressing mode selection for
303*bdd1243dSDimitry Andric /// inline asm expressions.
304*bdd1243dSDimitry Andric bool
305*bdd1243dSDimitry Andric VEDAGToDAGISel::SelectInlineAsmMemoryOperand(const SDValue &Op,
306*bdd1243dSDimitry Andric                                              unsigned ConstraintID,
307*bdd1243dSDimitry Andric                                              std::vector<SDValue> &OutOps) {
308*bdd1243dSDimitry Andric   SDValue Op0, Op1;
309*bdd1243dSDimitry Andric   switch (ConstraintID) {
310*bdd1243dSDimitry Andric   default:
311*bdd1243dSDimitry Andric     llvm_unreachable("Unexpected asm memory constraint");
312*bdd1243dSDimitry Andric   case InlineAsm::Constraint_o:
313*bdd1243dSDimitry Andric   case InlineAsm::Constraint_m: // memory
314*bdd1243dSDimitry Andric     // Try to match ADDRri since reg+imm style is safe for all VE instructions
315*bdd1243dSDimitry Andric     // with a memory operand.
316*bdd1243dSDimitry Andric     if (selectADDRri(Op, Op0, Op1)) {
317*bdd1243dSDimitry Andric       OutOps.push_back(Op0);
318*bdd1243dSDimitry Andric       OutOps.push_back(Op1);
319*bdd1243dSDimitry Andric       return false;
320*bdd1243dSDimitry Andric     }
321*bdd1243dSDimitry Andric     // Otherwise, require the address to be in a register and immediate 0.
322*bdd1243dSDimitry Andric     OutOps.push_back(Op);
323*bdd1243dSDimitry Andric     OutOps.push_back(CurDAG->getTargetConstant(0, SDLoc(Op), MVT::i32));
324*bdd1243dSDimitry Andric     return false;
325*bdd1243dSDimitry Andric   }
326*bdd1243dSDimitry Andric   return true;
327*bdd1243dSDimitry Andric }
328*bdd1243dSDimitry Andric 
3295ffd83dbSDimitry Andric SDNode *VEDAGToDAGISel::getGlobalBaseReg() {
3305ffd83dbSDimitry Andric   Register GlobalBaseReg = Subtarget->getInstrInfo()->getGlobalBaseReg(MF);
3315ffd83dbSDimitry Andric   return CurDAG
3325ffd83dbSDimitry Andric       ->getRegister(GlobalBaseReg, TLI->getPointerTy(CurDAG->getDataLayout()))
3335ffd83dbSDimitry Andric       .getNode();
3345ffd83dbSDimitry Andric }
3355ffd83dbSDimitry Andric 
336480093f4SDimitry Andric /// createVEISelDag - This pass converts a legalized DAG into a
337480093f4SDimitry Andric /// VE-specific DAG, ready for instruction scheduling.
338480093f4SDimitry Andric ///
339480093f4SDimitry Andric FunctionPass *llvm::createVEISelDag(VETargetMachine &TM) {
340480093f4SDimitry Andric   return new VEDAGToDAGISel(TM);
341480093f4SDimitry Andric }
342