PPCISelDAGToDAG.cpp revision 18258c640466274c26e89016e361ec411ff78520
1b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper//===-- PPCISelDAGToDAG.cpp - PPC --pattern matching inst selector --------===//
270c442caa8296a698b395b8969b9a04d5491d47bUlrich Drepper//
3de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard//                     The LLVM Compiler Infrastructure
4b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper//
5b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper// This file was developed by Chris Lattner and is distributed under
6de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard// the University of Illinois Open Source License. See LICENSE.TXT for details.
7de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard//
8b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper//===----------------------------------------------------------------------===//
9de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard//
10de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard// This file defines a pattern matching instruction selector for PowerPC,
11de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard// converting from a legalized dag to a PPC dag.
12de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard//
13de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard//===----------------------------------------------------------------------===//
14de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard
15de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard#include "PPC.h"
16de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard#include "PPCPredicates.h"
17de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard#include "PPCTargetMachine.h"
18de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard#include "PPCISelLowering.h"
19de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard#include "PPCHazardRecognizers.h"
20de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard#include "llvm/CodeGen/MachineInstrBuilder.h"
21de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard#include "llvm/CodeGen/MachineFunction.h"
22361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper#include "llvm/CodeGen/SSARegMap.h"
23361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper#include "llvm/CodeGen/SelectionDAG.h"
24361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper#include "llvm/CodeGen/SelectionDAGISel.h"
25361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper#include "llvm/Target/TargetOptions.h"
26de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard#include "llvm/ADT/Statistic.h"
27de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard#include "llvm/Constants.h"
28de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard#include "llvm/GlobalValue.h"
29b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include "llvm/Intrinsics.h"
30b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include "llvm/Support/Debug.h"
31b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include "llvm/Support/MathExtras.h"
32b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include "llvm/Support/Compiler.h"
33b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include <iostream>
34b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include <queue>
35b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include <set>
36b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperusing namespace llvm;
37b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
38b08d5a8fb42f4586d756068065186b5af7e48daUlrich Dreppernamespace {
391ccdfb683ad6c7e59793136c3a657ddf131cafd1Mark Wielaard  Statistic<> FrameOff("ppc-codegen", "Number of frame idx offsets collapsed");
40b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
41b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  //===--------------------------------------------------------------------===//
42b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  /// PPCDAGToDAGISel - PPC specific code to select PPC machine
43b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  /// instructions for SelectionDAG operations.
44b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  ///
45b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  class VISIBILITY_HIDDEN PPCDAGToDAGISel : public SelectionDAGISel {
46b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    PPCTargetMachine &TM;
47b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    PPCTargetLowering PPCLowering;
48b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    unsigned GlobalBaseReg;
49b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  public:
50b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    PPCDAGToDAGISel(PPCTargetMachine &tm)
51b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      : SelectionDAGISel(PPCLowering), TM(tm),
52b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper        PPCLowering(*TM.getTargetLowering()) {}
53b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
54b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    virtual bool runOnFunction(Function &Fn) {
55b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      // Make sure we re-emit a set of the global base reg if necessary
5670c442caa8296a698b395b8969b9a04d5491d47bUlrich Drepper      GlobalBaseReg = 0;
5770c442caa8296a698b395b8969b9a04d5491d47bUlrich Drepper      SelectionDAGISel::runOnFunction(Fn);
58b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
59b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      InsertVRSaveCode(Fn);
6070c442caa8296a698b395b8969b9a04d5491d47bUlrich Drepper      return true;
6170c442caa8296a698b395b8969b9a04d5491d47bUlrich Drepper    }
6270c442caa8296a698b395b8969b9a04d5491d47bUlrich Drepper
6370c442caa8296a698b395b8969b9a04d5491d47bUlrich Drepper    /// getI32Imm - Return a target constant with the specified value, of type
64b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    /// i32.
65b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    inline SDOperand getI32Imm(unsigned Imm) {
66b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      return CurDAG->getTargetConstant(Imm, MVT::i32);
67b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    }
68b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
69b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    /// getI64Imm - Return a target constant with the specified value, of type
70b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    /// i64.
71b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    inline SDOperand getI64Imm(uint64_t Imm) {
72b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      return CurDAG->getTargetConstant(Imm, MVT::i64);
73b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    }
74b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
75    /// getSmallIPtrImm - Return a target constant of pointer type.
76    inline SDOperand getSmallIPtrImm(unsigned Imm) {
77      return CurDAG->getTargetConstant(Imm, PPCLowering.getPointerTy());
78    }
79
80    /// isRunOfOnes - Returns true iff Val consists of one contiguous run of 1s
81    /// with any number of 0s on either side.  The 1s are allowed to wrap from
82    /// LSB to MSB, so 0x000FFF0, 0x0000FFFF, and 0xFF0000FF are all runs.
83    /// 0x0F0F0000 is not, since all 1s are not contiguous.
84    static bool isRunOfOnes(unsigned Val, unsigned &MB, unsigned &ME);
85
86
87    /// isRotateAndMask - Returns true if Mask and Shift can be folded into a
88    /// rotate and mask opcode and mask operation.
89    static bool isRotateAndMask(SDNode *N, unsigned Mask, bool IsShiftMask,
90                                unsigned &SH, unsigned &MB, unsigned &ME);
91
92    /// getGlobalBaseReg - insert code into the entry mbb to materialize the PIC
93    /// base register.  Return the virtual register that holds this value.
94    SDNode *getGlobalBaseReg();
95
96    // Select - Convert the specified operand from a target-independent to a
97    // target-specific node if it hasn't already been changed.
98    SDNode *Select(SDOperand Op);
99
100    SDNode *SelectBitfieldInsert(SDNode *N);
101
102    /// SelectCC - Select a comparison of the specified values with the
103    /// specified condition code, returning the CR# of the expression.
104    SDOperand SelectCC(SDOperand LHS, SDOperand RHS, ISD::CondCode CC);
105
106    /// SelectAddrImm - Returns true if the address N can be represented by
107    /// a base register plus a signed 16-bit displacement [r+imm].
108    bool SelectAddrImm(SDOperand Op, SDOperand N, SDOperand &Disp,
109                       SDOperand &Base) {
110      return PPCLowering.SelectAddressRegImm(N, Disp, Base, *CurDAG);
111    }
112
113    /// SelectAddrImmOffs - Return true if the operand is valid for a preinc
114    /// immediate field.  Because preinc imms have already been validated, just
115    /// accept it.
116    bool SelectAddrImmOffs(SDOperand Op, SDOperand N, SDOperand &Out) const {
117      Out = N;
118      return true;
119    }
120
121    /// SelectAddrIdx - Given the specified addressed, check to see if it can be
122    /// represented as an indexed [r+r] operation.  Returns false if it can
123    /// be represented by [r+imm], which are preferred.
124    bool SelectAddrIdx(SDOperand Op, SDOperand N, SDOperand &Base,
125                       SDOperand &Index) {
126      return PPCLowering.SelectAddressRegReg(N, Base, Index, *CurDAG);
127    }
128
129    /// SelectAddrIdxOnly - Given the specified addressed, force it to be
130    /// represented as an indexed [r+r] operation.
131    bool SelectAddrIdxOnly(SDOperand Op, SDOperand N, SDOperand &Base,
132                           SDOperand &Index) {
133      return PPCLowering.SelectAddressRegRegOnly(N, Base, Index, *CurDAG);
134    }
135
136    /// SelectAddrImmShift - Returns true if the address N can be represented by
137    /// a base register plus a signed 14-bit displacement [r+imm*4].  Suitable
138    /// for use by STD and friends.
139    bool SelectAddrImmShift(SDOperand Op, SDOperand N, SDOperand &Disp,
140                            SDOperand &Base) {
141      return PPCLowering.SelectAddressRegImmShift(N, Disp, Base, *CurDAG);
142    }
143
144    /// SelectInlineAsmMemoryOperand - Implement addressing mode selection for
145    /// inline asm expressions.
146    virtual bool SelectInlineAsmMemoryOperand(const SDOperand &Op,
147                                              char ConstraintCode,
148                                              std::vector<SDOperand> &OutOps,
149                                              SelectionDAG &DAG) {
150      SDOperand Op0, Op1;
151      switch (ConstraintCode) {
152      default: return true;
153      case 'm':   // memory
154        if (!SelectAddrIdx(Op, Op, Op0, Op1))
155          SelectAddrImm(Op, Op, Op0, Op1);
156        break;
157      case 'o':   // offsetable
158        if (!SelectAddrImm(Op, Op, Op0, Op1)) {
159          Op0 = Op;
160          AddToISelQueue(Op0);     // r+0.
161          Op1 = getSmallIPtrImm(0);
162        }
163        break;
164      case 'v':   // not offsetable
165        SelectAddrIdxOnly(Op, Op, Op0, Op1);
166        break;
167      }
168
169      OutOps.push_back(Op0);
170      OutOps.push_back(Op1);
171      return false;
172    }
173
174    SDOperand BuildSDIVSequence(SDNode *N);
175    SDOperand BuildUDIVSequence(SDNode *N);
176
177    /// InstructionSelectBasicBlock - This callback is invoked by
178    /// SelectionDAGISel when it has created a SelectionDAG for us to codegen.
179    virtual void InstructionSelectBasicBlock(SelectionDAG &DAG);
180
181    void InsertVRSaveCode(Function &Fn);
182
183    virtual const char *getPassName() const {
184      return "PowerPC DAG->DAG Pattern Instruction Selection";
185    }
186
187    /// CreateTargetHazardRecognizer - Return the hazard recognizer to use for
188    /// this target when scheduling the DAG.
189    virtual HazardRecognizer *CreateTargetHazardRecognizer() {
190      // Should use subtarget info to pick the right hazard recognizer.  For
191      // now, always return a PPC970 recognizer.
192      const TargetInstrInfo *II = PPCLowering.getTargetMachine().getInstrInfo();
193      assert(II && "No InstrInfo?");
194      return new PPCHazardRecognizer970(*II);
195    }
196
197// Include the pieces autogenerated from the target description.
198#include "PPCGenDAGISel.inc"
199
200private:
201    SDNode *SelectSETCC(SDOperand Op);
202  };
203}
204
205/// InstructionSelectBasicBlock - This callback is invoked by
206/// SelectionDAGISel when it has created a SelectionDAG for us to codegen.
207void PPCDAGToDAGISel::InstructionSelectBasicBlock(SelectionDAG &DAG) {
208  DEBUG(BB->dump());
209
210  // Select target instructions for the DAG.
211  DAG.setRoot(SelectRoot(DAG.getRoot()));
212  DAG.RemoveDeadNodes();
213
214  // Emit machine code to BB.
215  ScheduleAndEmitDAG(DAG);
216}
217
218/// InsertVRSaveCode - Once the entire function has been instruction selected,
219/// all virtual registers are created and all machine instructions are built,
220/// check to see if we need to save/restore VRSAVE.  If so, do it.
221void PPCDAGToDAGISel::InsertVRSaveCode(Function &F) {
222  // Check to see if this function uses vector registers, which means we have to
223  // save and restore the VRSAVE register and update it with the regs we use.
224  //
225  // In this case, there will be virtual registers of vector type type created
226  // by the scheduler.  Detect them now.
227  MachineFunction &Fn = MachineFunction::get(&F);
228  SSARegMap *RegMap = Fn.getSSARegMap();
229  bool HasVectorVReg = false;
230  for (unsigned i = MRegisterInfo::FirstVirtualRegister,
231       e = RegMap->getLastVirtReg()+1; i != e; ++i)
232    if (RegMap->getRegClass(i) == &PPC::VRRCRegClass) {
233      HasVectorVReg = true;
234      break;
235    }
236  if (!HasVectorVReg) return;  // nothing to do.
237
238  // If we have a vector register, we want to emit code into the entry and exit
239  // blocks to save and restore the VRSAVE register.  We do this here (instead
240  // of marking all vector instructions as clobbering VRSAVE) for two reasons:
241  //
242  // 1. This (trivially) reduces the load on the register allocator, by not
243  //    having to represent the live range of the VRSAVE register.
244  // 2. This (more significantly) allows us to create a temporary virtual
245  //    register to hold the saved VRSAVE value, allowing this temporary to be
246  //    register allocated, instead of forcing it to be spilled to the stack.
247
248  // Create two vregs - one to hold the VRSAVE register that is live-in to the
249  // function and one for the value after having bits or'd into it.
250  unsigned InVRSAVE = RegMap->createVirtualRegister(&PPC::GPRCRegClass);
251  unsigned UpdatedVRSAVE = RegMap->createVirtualRegister(&PPC::GPRCRegClass);
252
253  MachineBasicBlock &EntryBB = *Fn.begin();
254  // Emit the following code into the entry block:
255  // InVRSAVE = MFVRSAVE
256  // UpdatedVRSAVE = UPDATE_VRSAVE InVRSAVE
257  // MTVRSAVE UpdatedVRSAVE
258  MachineBasicBlock::iterator IP = EntryBB.begin();  // Insert Point
259  BuildMI(EntryBB, IP, PPC::MFVRSAVE, 0, InVRSAVE);
260  BuildMI(EntryBB, IP, PPC::UPDATE_VRSAVE, 1, UpdatedVRSAVE).addReg(InVRSAVE);
261  BuildMI(EntryBB, IP, PPC::MTVRSAVE, 1).addReg(UpdatedVRSAVE);
262
263  // Find all return blocks, outputting a restore in each epilog.
264  const TargetInstrInfo &TII = *TM.getInstrInfo();
265  for (MachineFunction::iterator BB = Fn.begin(), E = Fn.end(); BB != E; ++BB) {
266    if (!BB->empty() && TII.isReturn(BB->back().getOpcode())) {
267      IP = BB->end(); --IP;
268
269      // Skip over all terminator instructions, which are part of the return
270      // sequence.
271      MachineBasicBlock::iterator I2 = IP;
272      while (I2 != BB->begin() && TII.isTerminatorInstr((--I2)->getOpcode()))
273        IP = I2;
274
275      // Emit: MTVRSAVE InVRSave
276      BuildMI(*BB, IP, PPC::MTVRSAVE, 1).addReg(InVRSAVE);
277    }
278  }
279}
280
281
282/// getGlobalBaseReg - Output the instructions required to put the
283/// base address to use for accessing globals into a register.
284///
285SDNode *PPCDAGToDAGISel::getGlobalBaseReg() {
286  if (!GlobalBaseReg) {
287    // Insert the set of GlobalBaseReg into the first MBB of the function
288    MachineBasicBlock &FirstMBB = BB->getParent()->front();
289    MachineBasicBlock::iterator MBBI = FirstMBB.begin();
290    SSARegMap *RegMap = BB->getParent()->getSSARegMap();
291
292    if (PPCLowering.getPointerTy() == MVT::i32) {
293      GlobalBaseReg = RegMap->createVirtualRegister(PPC::GPRCRegisterClass);
294      BuildMI(FirstMBB, MBBI, PPC::MovePCtoLR, 0, PPC::LR);
295      BuildMI(FirstMBB, MBBI, PPC::MFLR, 1, GlobalBaseReg);
296    } else {
297      GlobalBaseReg = RegMap->createVirtualRegister(PPC::G8RCRegisterClass);
298      BuildMI(FirstMBB, MBBI, PPC::MovePCtoLR8, 0, PPC::LR8);
299      BuildMI(FirstMBB, MBBI, PPC::MFLR8, 1, GlobalBaseReg);
300    }
301  }
302  return CurDAG->getRegister(GlobalBaseReg, PPCLowering.getPointerTy()).Val;
303}
304
305/// isIntS16Immediate - This method tests to see if the node is either a 32-bit
306/// or 64-bit immediate, and if the value can be accurately represented as a
307/// sign extension from a 16-bit value.  If so, this returns true and the
308/// immediate.
309static bool isIntS16Immediate(SDNode *N, short &Imm) {
310  if (N->getOpcode() != ISD::Constant)
311    return false;
312
313  Imm = (short)cast<ConstantSDNode>(N)->getValue();
314  if (N->getValueType(0) == MVT::i32)
315    return Imm == (int32_t)cast<ConstantSDNode>(N)->getValue();
316  else
317    return Imm == (int64_t)cast<ConstantSDNode>(N)->getValue();
318}
319
320static bool isIntS16Immediate(SDOperand Op, short &Imm) {
321  return isIntS16Immediate(Op.Val, Imm);
322}
323
324
325/// isInt32Immediate - This method tests to see if the node is a 32-bit constant
326/// operand. If so Imm will receive the 32-bit value.
327static bool isInt32Immediate(SDNode *N, unsigned &Imm) {
328  if (N->getOpcode() == ISD::Constant && N->getValueType(0) == MVT::i32) {
329    Imm = cast<ConstantSDNode>(N)->getValue();
330    return true;
331  }
332  return false;
333}
334
335/// isInt64Immediate - This method tests to see if the node is a 64-bit constant
336/// operand.  If so Imm will receive the 64-bit value.
337static bool isInt64Immediate(SDNode *N, uint64_t &Imm) {
338  if (N->getOpcode() == ISD::Constant && N->getValueType(0) == MVT::i64) {
339    Imm = cast<ConstantSDNode>(N)->getValue();
340    return true;
341  }
342  return false;
343}
344
345// isInt32Immediate - This method tests to see if a constant operand.
346// If so Imm will receive the 32 bit value.
347static bool isInt32Immediate(SDOperand N, unsigned &Imm) {
348  return isInt32Immediate(N.Val, Imm);
349}
350
351
352// isOpcWithIntImmediate - This method tests to see if the node is a specific
353// opcode and that it has a immediate integer right operand.
354// If so Imm will receive the 32 bit value.
355static bool isOpcWithIntImmediate(SDNode *N, unsigned Opc, unsigned& Imm) {
356  return N->getOpcode() == Opc && isInt32Immediate(N->getOperand(1).Val, Imm);
357}
358
359bool PPCDAGToDAGISel::isRunOfOnes(unsigned Val, unsigned &MB, unsigned &ME) {
360  if (isShiftedMask_32(Val)) {
361    // look for the first non-zero bit
362    MB = CountLeadingZeros_32(Val);
363    // look for the first zero bit after the run of ones
364    ME = CountLeadingZeros_32((Val - 1) ^ Val);
365    return true;
366  } else {
367    Val = ~Val; // invert mask
368    if (isShiftedMask_32(Val)) {
369      // effectively look for the first zero bit
370      ME = CountLeadingZeros_32(Val) - 1;
371      // effectively look for the first one bit after the run of zeros
372      MB = CountLeadingZeros_32((Val - 1) ^ Val) + 1;
373      return true;
374    }
375  }
376  // no run present
377  return false;
378}
379
380bool PPCDAGToDAGISel::isRotateAndMask(SDNode *N, unsigned Mask,
381                                      bool IsShiftMask, unsigned &SH,
382                                      unsigned &MB, unsigned &ME) {
383  // Don't even go down this path for i64, since different logic will be
384  // necessary for rldicl/rldicr/rldimi.
385  if (N->getValueType(0) != MVT::i32)
386    return false;
387
388  unsigned Shift  = 32;
389  unsigned Indeterminant = ~0;  // bit mask marking indeterminant results
390  unsigned Opcode = N->getOpcode();
391  if (N->getNumOperands() != 2 ||
392      !isInt32Immediate(N->getOperand(1).Val, Shift) || (Shift > 31))
393    return false;
394
395  if (Opcode == ISD::SHL) {
396    // apply shift left to mask if it comes first
397    if (IsShiftMask) Mask = Mask << Shift;
398    // determine which bits are made indeterminant by shift
399    Indeterminant = ~(0xFFFFFFFFu << Shift);
400  } else if (Opcode == ISD::SRL) {
401    // apply shift right to mask if it comes first
402    if (IsShiftMask) Mask = Mask >> Shift;
403    // determine which bits are made indeterminant by shift
404    Indeterminant = ~(0xFFFFFFFFu >> Shift);
405    // adjust for the left rotate
406    Shift = 32 - Shift;
407  } else if (Opcode == ISD::ROTL) {
408    Indeterminant = 0;
409  } else {
410    return false;
411  }
412
413  // if the mask doesn't intersect any Indeterminant bits
414  if (Mask && !(Mask & Indeterminant)) {
415    SH = Shift & 31;
416    // make sure the mask is still a mask (wrap arounds may not be)
417    return isRunOfOnes(Mask, MB, ME);
418  }
419  return false;
420}
421
422/// SelectBitfieldInsert - turn an or of two masked values into
423/// the rotate left word immediate then mask insert (rlwimi) instruction.
424SDNode *PPCDAGToDAGISel::SelectBitfieldInsert(SDNode *N) {
425  SDOperand Op0 = N->getOperand(0);
426  SDOperand Op1 = N->getOperand(1);
427
428  uint64_t LKZ, LKO, RKZ, RKO;
429  TLI.ComputeMaskedBits(Op0, 0xFFFFFFFFULL, LKZ, LKO);
430  TLI.ComputeMaskedBits(Op1, 0xFFFFFFFFULL, RKZ, RKO);
431
432  unsigned TargetMask = LKZ;
433  unsigned InsertMask = RKZ;
434
435  if ((TargetMask | InsertMask) == 0xFFFFFFFF) {
436    unsigned Op0Opc = Op0.getOpcode();
437    unsigned Op1Opc = Op1.getOpcode();
438    unsigned Value, SH = 0;
439    TargetMask = ~TargetMask;
440    InsertMask = ~InsertMask;
441
442    // If the LHS has a foldable shift and the RHS does not, then swap it to the
443    // RHS so that we can fold the shift into the insert.
444    if (Op0Opc == ISD::AND && Op1Opc == ISD::AND) {
445      if (Op0.getOperand(0).getOpcode() == ISD::SHL ||
446          Op0.getOperand(0).getOpcode() == ISD::SRL) {
447        if (Op1.getOperand(0).getOpcode() != ISD::SHL &&
448            Op1.getOperand(0).getOpcode() != ISD::SRL) {
449          std::swap(Op0, Op1);
450          std::swap(Op0Opc, Op1Opc);
451          std::swap(TargetMask, InsertMask);
452        }
453      }
454    } else if (Op0Opc == ISD::SHL || Op0Opc == ISD::SRL) {
455      if (Op1Opc == ISD::AND && Op1.getOperand(0).getOpcode() != ISD::SHL &&
456          Op1.getOperand(0).getOpcode() != ISD::SRL) {
457        std::swap(Op0, Op1);
458        std::swap(Op0Opc, Op1Opc);
459        std::swap(TargetMask, InsertMask);
460      }
461    }
462
463    unsigned MB, ME;
464    if (InsertMask && isRunOfOnes(InsertMask, MB, ME)) {
465      SDOperand Tmp1, Tmp2, Tmp3;
466      bool DisjointMask = (TargetMask ^ InsertMask) == 0xFFFFFFFF;
467
468      if ((Op1Opc == ISD::SHL || Op1Opc == ISD::SRL) &&
469          isInt32Immediate(Op1.getOperand(1), Value)) {
470        Op1 = Op1.getOperand(0);
471        SH  = (Op1Opc == ISD::SHL) ? Value : 32 - Value;
472      }
473      if (Op1Opc == ISD::AND) {
474        unsigned SHOpc = Op1.getOperand(0).getOpcode();
475        if ((SHOpc == ISD::SHL || SHOpc == ISD::SRL) &&
476            isInt32Immediate(Op1.getOperand(0).getOperand(1), Value)) {
477          Op1 = Op1.getOperand(0).getOperand(0);
478          SH  = (SHOpc == ISD::SHL) ? Value : 32 - Value;
479        } else {
480          Op1 = Op1.getOperand(0);
481        }
482      }
483
484      Tmp3 = (Op0Opc == ISD::AND && DisjointMask) ? Op0.getOperand(0) : Op0;
485      AddToISelQueue(Tmp3);
486      AddToISelQueue(Op1);
487      SH &= 31;
488      SDOperand Ops[] = { Tmp3, Op1, getI32Imm(SH), getI32Imm(MB),
489                          getI32Imm(ME) };
490      return CurDAG->getTargetNode(PPC::RLWIMI, MVT::i32, Ops, 5);
491    }
492  }
493  return 0;
494}
495
496/// SelectCC - Select a comparison of the specified values with the specified
497/// condition code, returning the CR# of the expression.
498SDOperand PPCDAGToDAGISel::SelectCC(SDOperand LHS, SDOperand RHS,
499                                    ISD::CondCode CC) {
500  // Always select the LHS.
501  AddToISelQueue(LHS);
502  unsigned Opc;
503
504  if (LHS.getValueType() == MVT::i32) {
505    unsigned Imm;
506    if (CC == ISD::SETEQ || CC == ISD::SETNE) {
507      if (isInt32Immediate(RHS, Imm)) {
508        // SETEQ/SETNE comparison with 16-bit immediate, fold it.
509        if (isUInt16(Imm))
510          return SDOperand(CurDAG->getTargetNode(PPC::CMPLWI, MVT::i32, LHS,
511                                                 getI32Imm(Imm & 0xFFFF)), 0);
512        // If this is a 16-bit signed immediate, fold it.
513        if (isInt16(Imm))
514          return SDOperand(CurDAG->getTargetNode(PPC::CMPWI, MVT::i32, LHS,
515                                                 getI32Imm(Imm & 0xFFFF)), 0);
516
517        // For non-equality comparisons, the default code would materialize the
518        // constant, then compare against it, like this:
519        //   lis r2, 4660
520        //   ori r2, r2, 22136
521        //   cmpw cr0, r3, r2
522        // Since we are just comparing for equality, we can emit this instead:
523        //   xoris r0,r3,0x1234
524        //   cmplwi cr0,r0,0x5678
525        //   beq cr0,L6
526        SDOperand Xor(CurDAG->getTargetNode(PPC::XORIS, MVT::i32, LHS,
527                                            getI32Imm(Imm >> 16)), 0);
528        return SDOperand(CurDAG->getTargetNode(PPC::CMPLWI, MVT::i32, Xor,
529                                               getI32Imm(Imm & 0xFFFF)), 0);
530      }
531      Opc = PPC::CMPLW;
532    } else if (ISD::isUnsignedIntSetCC(CC)) {
533      if (isInt32Immediate(RHS, Imm) && isUInt16(Imm))
534        return SDOperand(CurDAG->getTargetNode(PPC::CMPLWI, MVT::i32, LHS,
535                                               getI32Imm(Imm & 0xFFFF)), 0);
536      Opc = PPC::CMPLW;
537    } else {
538      short SImm;
539      if (isIntS16Immediate(RHS, SImm))
540        return SDOperand(CurDAG->getTargetNode(PPC::CMPWI, MVT::i32, LHS,
541                                               getI32Imm((int)SImm & 0xFFFF)),
542                         0);
543      Opc = PPC::CMPW;
544    }
545  } else if (LHS.getValueType() == MVT::i64) {
546    uint64_t Imm;
547    if (CC == ISD::SETEQ || CC == ISD::SETNE) {
548      if (isInt64Immediate(RHS.Val, Imm)) {
549        // SETEQ/SETNE comparison with 16-bit immediate, fold it.
550        if (isUInt16(Imm))
551          return SDOperand(CurDAG->getTargetNode(PPC::CMPLDI, MVT::i64, LHS,
552                                                 getI32Imm(Imm & 0xFFFF)), 0);
553        // If this is a 16-bit signed immediate, fold it.
554        if (isInt16(Imm))
555          return SDOperand(CurDAG->getTargetNode(PPC::CMPDI, MVT::i64, LHS,
556                                                 getI32Imm(Imm & 0xFFFF)), 0);
557
558        // For non-equality comparisons, the default code would materialize the
559        // constant, then compare against it, like this:
560        //   lis r2, 4660
561        //   ori r2, r2, 22136
562        //   cmpd cr0, r3, r2
563        // Since we are just comparing for equality, we can emit this instead:
564        //   xoris r0,r3,0x1234
565        //   cmpldi cr0,r0,0x5678
566        //   beq cr0,L6
567        if (isUInt32(Imm)) {
568          SDOperand Xor(CurDAG->getTargetNode(PPC::XORIS8, MVT::i64, LHS,
569                                              getI64Imm(Imm >> 16)), 0);
570          return SDOperand(CurDAG->getTargetNode(PPC::CMPLDI, MVT::i64, Xor,
571                                                 getI64Imm(Imm & 0xFFFF)), 0);
572        }
573      }
574      Opc = PPC::CMPLD;
575    } else if (ISD::isUnsignedIntSetCC(CC)) {
576      if (isInt64Immediate(RHS.Val, Imm) && isUInt16(Imm))
577        return SDOperand(CurDAG->getTargetNode(PPC::CMPLDI, MVT::i64, LHS,
578                                               getI64Imm(Imm & 0xFFFF)), 0);
579      Opc = PPC::CMPLD;
580    } else {
581      short SImm;
582      if (isIntS16Immediate(RHS, SImm))
583        return SDOperand(CurDAG->getTargetNode(PPC::CMPDI, MVT::i64, LHS,
584                                               getI64Imm(SImm & 0xFFFF)),
585                         0);
586      Opc = PPC::CMPD;
587    }
588  } else if (LHS.getValueType() == MVT::f32) {
589    Opc = PPC::FCMPUS;
590  } else {
591    assert(LHS.getValueType() == MVT::f64 && "Unknown vt!");
592    Opc = PPC::FCMPUD;
593  }
594  AddToISelQueue(RHS);
595  return SDOperand(CurDAG->getTargetNode(Opc, MVT::i32, LHS, RHS), 0);
596}
597
598static PPC::Predicate getPredicateForSetCC(ISD::CondCode CC) {
599  switch (CC) {
600  default: assert(0 && "Unknown condition!"); abort();
601  case ISD::SETOEQ:    // FIXME: This is incorrect see PR642.
602  case ISD::SETUEQ:
603  case ISD::SETEQ:  return PPC::PRED_EQ;
604  case ISD::SETONE:    // FIXME: This is incorrect see PR642.
605  case ISD::SETUNE:
606  case ISD::SETNE:  return PPC::PRED_NE;
607  case ISD::SETOLT:    // FIXME: This is incorrect see PR642.
608  case ISD::SETULT:
609  case ISD::SETLT:  return PPC::PRED_LT;
610  case ISD::SETOLE:    // FIXME: This is incorrect see PR642.
611  case ISD::SETULE:
612  case ISD::SETLE:  return PPC::PRED_LE;
613  case ISD::SETOGT:    // FIXME: This is incorrect see PR642.
614  case ISD::SETUGT:
615  case ISD::SETGT:  return PPC::PRED_GT;
616  case ISD::SETOGE:    // FIXME: This is incorrect see PR642.
617  case ISD::SETUGE:
618  case ISD::SETGE:  return PPC::PRED_GE;
619
620  case ISD::SETO:   return PPC::PRED_NU;
621  case ISD::SETUO:  return PPC::PRED_UN;
622  }
623}
624
625/// getCRIdxForSetCC - Return the index of the condition register field
626/// associated with the SetCC condition, and whether or not the field is
627/// treated as inverted.  That is, lt = 0; ge = 0 inverted.
628static unsigned getCRIdxForSetCC(ISD::CondCode CC, bool& Inv) {
629  switch (CC) {
630  default: assert(0 && "Unknown condition!"); abort();
631  case ISD::SETOLT:  // FIXME: This is incorrect see PR642.
632  case ISD::SETULT:
633  case ISD::SETLT:  Inv = false;  return 0;
634  case ISD::SETOGE:  // FIXME: This is incorrect see PR642.
635  case ISD::SETUGE:
636  case ISD::SETGE:  Inv = true;   return 0;
637  case ISD::SETOGT:  // FIXME: This is incorrect see PR642.
638  case ISD::SETUGT:
639  case ISD::SETGT:  Inv = false;  return 1;
640  case ISD::SETOLE:  // FIXME: This is incorrect see PR642.
641  case ISD::SETULE:
642  case ISD::SETLE:  Inv = true;   return 1;
643  case ISD::SETOEQ:  // FIXME: This is incorrect see PR642.
644  case ISD::SETUEQ:
645  case ISD::SETEQ:  Inv = false;  return 2;
646  case ISD::SETONE:  // FIXME: This is incorrect see PR642.
647  case ISD::SETUNE:
648  case ISD::SETNE:  Inv = true;   return 2;
649  case ISD::SETO:   Inv = true;   return 3;
650  case ISD::SETUO:  Inv = false;  return 3;
651  }
652  return 0;
653}
654
655SDNode *PPCDAGToDAGISel::SelectSETCC(SDOperand Op) {
656  SDNode *N = Op.Val;
657  unsigned Imm;
658  ISD::CondCode CC = cast<CondCodeSDNode>(N->getOperand(2))->get();
659  if (isInt32Immediate(N->getOperand(1), Imm)) {
660    // We can codegen setcc op, imm very efficiently compared to a brcond.
661    // Check for those cases here.
662    // setcc op, 0
663    if (Imm == 0) {
664      SDOperand Op = N->getOperand(0);
665      AddToISelQueue(Op);
666      switch (CC) {
667      default: break;
668      case ISD::SETEQ: {
669        Op = SDOperand(CurDAG->getTargetNode(PPC::CNTLZW, MVT::i32, Op), 0);
670        SDOperand Ops[] = { Op, getI32Imm(27), getI32Imm(5), getI32Imm(31) };
671        return CurDAG->SelectNodeTo(N, PPC::RLWINM, MVT::i32, Ops, 4);
672      }
673      case ISD::SETNE: {
674        SDOperand AD =
675          SDOperand(CurDAG->getTargetNode(PPC::ADDIC, MVT::i32, MVT::Flag,
676                                          Op, getI32Imm(~0U)), 0);
677        return CurDAG->SelectNodeTo(N, PPC::SUBFE, MVT::i32, AD, Op,
678                                    AD.getValue(1));
679      }
680      case ISD::SETLT: {
681        SDOperand Ops[] = { Op, getI32Imm(1), getI32Imm(31), getI32Imm(31) };
682        return CurDAG->SelectNodeTo(N, PPC::RLWINM, MVT::i32, Ops, 4);
683      }
684      case ISD::SETGT: {
685        SDOperand T =
686          SDOperand(CurDAG->getTargetNode(PPC::NEG, MVT::i32, Op), 0);
687        T = SDOperand(CurDAG->getTargetNode(PPC::ANDC, MVT::i32, T, Op), 0);
688        SDOperand Ops[] = { T, getI32Imm(1), getI32Imm(31), getI32Imm(31) };
689        return CurDAG->SelectNodeTo(N, PPC::RLWINM, MVT::i32, Ops, 4);
690      }
691      }
692    } else if (Imm == ~0U) {        // setcc op, -1
693      SDOperand Op = N->getOperand(0);
694      AddToISelQueue(Op);
695      switch (CC) {
696      default: break;
697      case ISD::SETEQ:
698        Op = SDOperand(CurDAG->getTargetNode(PPC::ADDIC, MVT::i32, MVT::Flag,
699                                             Op, getI32Imm(1)), 0);
700        return CurDAG->SelectNodeTo(N, PPC::ADDZE, MVT::i32,
701                              SDOperand(CurDAG->getTargetNode(PPC::LI, MVT::i32,
702                                                              getI32Imm(0)), 0),
703                                    Op.getValue(1));
704      case ISD::SETNE: {
705        Op = SDOperand(CurDAG->getTargetNode(PPC::NOR, MVT::i32, Op, Op), 0);
706        SDNode *AD = CurDAG->getTargetNode(PPC::ADDIC, MVT::i32, MVT::Flag,
707                                           Op, getI32Imm(~0U));
708        return CurDAG->SelectNodeTo(N, PPC::SUBFE, MVT::i32, SDOperand(AD, 0),
709                                    Op, SDOperand(AD, 1));
710      }
711      case ISD::SETLT: {
712        SDOperand AD = SDOperand(CurDAG->getTargetNode(PPC::ADDI, MVT::i32, Op,
713                                                       getI32Imm(1)), 0);
714        SDOperand AN = SDOperand(CurDAG->getTargetNode(PPC::AND, MVT::i32, AD,
715                                                       Op), 0);
716        SDOperand Ops[] = { AN, getI32Imm(1), getI32Imm(31), getI32Imm(31) };
717        return CurDAG->SelectNodeTo(N, PPC::RLWINM, MVT::i32, Ops, 4);
718      }
719      case ISD::SETGT: {
720        SDOperand Ops[] = { Op, getI32Imm(1), getI32Imm(31), getI32Imm(31) };
721        Op = SDOperand(CurDAG->getTargetNode(PPC::RLWINM, MVT::i32, Ops, 4), 0);
722        return CurDAG->SelectNodeTo(N, PPC::XORI, MVT::i32, Op,
723                                    getI32Imm(1));
724      }
725      }
726    }
727  }
728
729  bool Inv;
730  unsigned Idx = getCRIdxForSetCC(CC, Inv);
731  SDOperand CCReg = SelectCC(N->getOperand(0), N->getOperand(1), CC);
732  SDOperand IntCR;
733
734  // Force the ccreg into CR7.
735  SDOperand CR7Reg = CurDAG->getRegister(PPC::CR7, MVT::i32);
736
737  SDOperand InFlag(0, 0);  // Null incoming flag value.
738  CCReg = CurDAG->getCopyToReg(CurDAG->getEntryNode(), CR7Reg, CCReg,
739                               InFlag).getValue(1);
740
741  if (TLI.getTargetMachine().getSubtarget<PPCSubtarget>().isGigaProcessor())
742    IntCR = SDOperand(CurDAG->getTargetNode(PPC::MFOCRF, MVT::i32, CR7Reg,
743                                            CCReg), 0);
744  else
745    IntCR = SDOperand(CurDAG->getTargetNode(PPC::MFCR, MVT::i32, CCReg), 0);
746
747  SDOperand Ops[] = { IntCR, getI32Imm((32-(3-Idx)) & 31),
748                      getI32Imm(31), getI32Imm(31) };
749  if (!Inv) {
750    return CurDAG->SelectNodeTo(N, PPC::RLWINM, MVT::i32, Ops, 4);
751  } else {
752    SDOperand Tmp =
753      SDOperand(CurDAG->getTargetNode(PPC::RLWINM, MVT::i32, Ops, 4), 0);
754    return CurDAG->SelectNodeTo(N, PPC::XORI, MVT::i32, Tmp, getI32Imm(1));
755  }
756}
757
758
759// Select - Convert the specified operand from a target-independent to a
760// target-specific node if it hasn't already been changed.
761SDNode *PPCDAGToDAGISel::Select(SDOperand Op) {
762  SDNode *N = Op.Val;
763  if (N->getOpcode() >= ISD::BUILTIN_OP_END &&
764      N->getOpcode() < PPCISD::FIRST_NUMBER)
765    return NULL;   // Already selected.
766
767  switch (N->getOpcode()) {
768  default: break;
769  case ISD::SETCC:
770    return SelectSETCC(Op);
771  case PPCISD::GlobalBaseReg:
772    return getGlobalBaseReg();
773
774  case ISD::FrameIndex: {
775    int FI = cast<FrameIndexSDNode>(N)->getIndex();
776    SDOperand TFI = CurDAG->getTargetFrameIndex(FI, Op.getValueType());
777    unsigned Opc = Op.getValueType() == MVT::i32 ? PPC::ADDI : PPC::ADDI8;
778    if (N->hasOneUse())
779      return CurDAG->SelectNodeTo(N, Opc, Op.getValueType(), TFI,
780                                  getSmallIPtrImm(0));
781    return CurDAG->getTargetNode(Opc, Op.getValueType(), TFI,
782                                 getSmallIPtrImm(0));
783  }
784
785  case PPCISD::MFCR: {
786    SDOperand InFlag = N->getOperand(1);
787    AddToISelQueue(InFlag);
788    // Use MFOCRF if supported.
789    if (TLI.getTargetMachine().getSubtarget<PPCSubtarget>().isGigaProcessor())
790      return CurDAG->getTargetNode(PPC::MFOCRF, MVT::i32,
791                                   N->getOperand(0), InFlag);
792    else
793      return CurDAG->getTargetNode(PPC::MFCR, MVT::i32, InFlag);
794  }
795
796  case ISD::SDIV: {
797    // FIXME: since this depends on the setting of the carry flag from the srawi
798    //        we should really be making notes about that for the scheduler.
799    // FIXME: It sure would be nice if we could cheaply recognize the
800    //        srl/add/sra pattern the dag combiner will generate for this as
801    //        sra/addze rather than having to handle sdiv ourselves.  oh well.
802    unsigned Imm;
803    if (isInt32Immediate(N->getOperand(1), Imm)) {
804      SDOperand N0 = N->getOperand(0);
805      AddToISelQueue(N0);
806      if ((signed)Imm > 0 && isPowerOf2_32(Imm)) {
807        SDNode *Op =
808          CurDAG->getTargetNode(PPC::SRAWI, MVT::i32, MVT::Flag,
809                                N0, getI32Imm(Log2_32(Imm)));
810        return CurDAG->SelectNodeTo(N, PPC::ADDZE, MVT::i32,
811                                    SDOperand(Op, 0), SDOperand(Op, 1));
812      } else if ((signed)Imm < 0 && isPowerOf2_32(-Imm)) {
813        SDNode *Op =
814          CurDAG->getTargetNode(PPC::SRAWI, MVT::i32, MVT::Flag,
815                                N0, getI32Imm(Log2_32(-Imm)));
816        SDOperand PT =
817          SDOperand(CurDAG->getTargetNode(PPC::ADDZE, MVT::i32,
818                                          SDOperand(Op, 0), SDOperand(Op, 1)),
819                    0);
820        return CurDAG->SelectNodeTo(N, PPC::NEG, MVT::i32, PT);
821      }
822    }
823
824    // Other cases are autogenerated.
825    break;
826  }
827
828  case ISD::LOAD: {
829    // Handle preincrement loads.
830    LoadSDNode *LD = cast<LoadSDNode>(Op);
831    MVT::ValueType LoadedVT = LD->getLoadedVT();
832
833    // Normal loads are handled by code generated from the .td file.
834    if (LD->getAddressingMode() != ISD::PRE_INC)
835      break;
836
837    SDOperand Offset = LD->getOffset();
838    if (isa<ConstantSDNode>(Offset) ||
839        Offset.getOpcode() == ISD::TargetGlobalAddress) {
840
841      unsigned Opcode;
842      bool isSExt = LD->getExtensionType() == ISD::SEXTLOAD;
843      if (LD->getValueType(0) != MVT::i64) {
844        // Handle PPC32 integer and normal FP loads.
845        assert(!isSExt || LoadedVT == MVT::i16 && "Invalid sext update load");
846        switch (LoadedVT) {
847          default: assert(0 && "Invalid PPC load type!");
848          case MVT::f64: Opcode = PPC::LFDU; break;
849          case MVT::f32: Opcode = PPC::LFSU; break;
850          case MVT::i32: Opcode = PPC::LWZU; break;
851          case MVT::i16: Opcode = isSExt ? PPC::LHAU : PPC::LHZU; break;
852          case MVT::i1:
853          case MVT::i8:  Opcode = PPC::LBZU; break;
854        }
855      } else {
856        assert(LD->getValueType(0) == MVT::i64 && "Unknown load result type!");
857        assert(!isSExt || LoadedVT == MVT::i16 && "Invalid sext update load");
858        switch (LoadedVT) {
859          default: assert(0 && "Invalid PPC load type!");
860          case MVT::i64: Opcode = PPC::LDU; break;
861          case MVT::i32: Opcode = PPC::LWZU8; break;
862          case MVT::i16: Opcode = isSExt ? PPC::LHAU8 : PPC::LHZU8; break;
863          case MVT::i1:
864          case MVT::i8:  Opcode = PPC::LBZU8; break;
865        }
866      }
867
868      SDOperand Chain = LD->getChain();
869      SDOperand Base = LD->getBasePtr();
870      AddToISelQueue(Chain);
871      AddToISelQueue(Base);
872      AddToISelQueue(Offset);
873      SDOperand Ops[] = { Offset, Base, Chain };
874      // FIXME: PPC64
875      return CurDAG->getTargetNode(Opcode, MVT::i32, MVT::i32,
876                                   MVT::Other, Ops, 3);
877    } else {
878      assert(0 && "R+R preindex loads not supported yet!");
879    }
880  }
881
882  case ISD::AND: {
883    unsigned Imm, Imm2, SH, MB, ME;
884
885    // If this is an and of a value rotated between 0 and 31 bits and then and'd
886    // with a mask, emit rlwinm
887    if (isInt32Immediate(N->getOperand(1), Imm) &&
888        isRotateAndMask(N->getOperand(0).Val, Imm, false, SH, MB, ME)) {
889      SDOperand Val = N->getOperand(0).getOperand(0);
890      AddToISelQueue(Val);
891      SDOperand Ops[] = { Val, getI32Imm(SH), getI32Imm(MB), getI32Imm(ME) };
892      return CurDAG->SelectNodeTo(N, PPC::RLWINM, MVT::i32, Ops, 4);
893    }
894    // If this is just a masked value where the input is not handled above, and
895    // is not a rotate-left (handled by a pattern in the .td file), emit rlwinm
896    if (isInt32Immediate(N->getOperand(1), Imm) &&
897        isRunOfOnes(Imm, MB, ME) &&
898        N->getOperand(0).getOpcode() != ISD::ROTL) {
899      SDOperand Val = N->getOperand(0);
900      AddToISelQueue(Val);
901      SDOperand Ops[] = { Val, getI32Imm(0), getI32Imm(MB), getI32Imm(ME) };
902      return CurDAG->SelectNodeTo(N, PPC::RLWINM, MVT::i32, Ops, 4);
903    }
904    // AND X, 0 -> 0, not "rlwinm 32".
905    if (isInt32Immediate(N->getOperand(1), Imm) && (Imm == 0)) {
906      AddToISelQueue(N->getOperand(1));
907      ReplaceUses(SDOperand(N, 0), N->getOperand(1));
908      return NULL;
909    }
910    // ISD::OR doesn't get all the bitfield insertion fun.
911    // (and (or x, c1), c2) where isRunOfOnes(~(c1^c2)) is a bitfield insert
912    if (isInt32Immediate(N->getOperand(1), Imm) &&
913        N->getOperand(0).getOpcode() == ISD::OR &&
914        isInt32Immediate(N->getOperand(0).getOperand(1), Imm2)) {
915      unsigned MB, ME;
916      Imm = ~(Imm^Imm2);
917      if (isRunOfOnes(Imm, MB, ME)) {
918        AddToISelQueue(N->getOperand(0).getOperand(0));
919        AddToISelQueue(N->getOperand(0).getOperand(1));
920        SDOperand Ops[] = { N->getOperand(0).getOperand(0),
921                            N->getOperand(0).getOperand(1),
922                            getI32Imm(0), getI32Imm(MB),getI32Imm(ME) };
923        return CurDAG->getTargetNode(PPC::RLWIMI, MVT::i32, Ops, 5);
924      }
925    }
926
927    // Other cases are autogenerated.
928    break;
929  }
930  case ISD::OR:
931    if (N->getValueType(0) == MVT::i32)
932      if (SDNode *I = SelectBitfieldInsert(N))
933        return I;
934
935    // Other cases are autogenerated.
936    break;
937  case ISD::SHL: {
938    unsigned Imm, SH, MB, ME;
939    if (isOpcWithIntImmediate(N->getOperand(0).Val, ISD::AND, Imm) &&
940        isRotateAndMask(N, Imm, true, SH, MB, ME)) {
941      AddToISelQueue(N->getOperand(0).getOperand(0));
942      SDOperand Ops[] = { N->getOperand(0).getOperand(0),
943                          getI32Imm(SH), getI32Imm(MB), getI32Imm(ME) };
944      return CurDAG->SelectNodeTo(N, PPC::RLWINM, MVT::i32, Ops, 4);
945    }
946
947    // Other cases are autogenerated.
948    break;
949  }
950  case ISD::SRL: {
951    unsigned Imm, SH, MB, ME;
952    if (isOpcWithIntImmediate(N->getOperand(0).Val, ISD::AND, Imm) &&
953        isRotateAndMask(N, Imm, true, SH, MB, ME)) {
954      AddToISelQueue(N->getOperand(0).getOperand(0));
955      SDOperand Ops[] = { N->getOperand(0).getOperand(0),
956                          getI32Imm(SH), getI32Imm(MB), getI32Imm(ME) };
957      return CurDAG->SelectNodeTo(N, PPC::RLWINM, MVT::i32, Ops, 4);
958    }
959
960    // Other cases are autogenerated.
961    break;
962  }
963  case ISD::SELECT_CC: {
964    ISD::CondCode CC = cast<CondCodeSDNode>(N->getOperand(4))->get();
965
966    // Handle the setcc cases here.  select_cc lhs, 0, 1, 0, cc
967    if (ConstantSDNode *N1C = dyn_cast<ConstantSDNode>(N->getOperand(1)))
968      if (ConstantSDNode *N2C = dyn_cast<ConstantSDNode>(N->getOperand(2)))
969        if (ConstantSDNode *N3C = dyn_cast<ConstantSDNode>(N->getOperand(3)))
970          if (N1C->isNullValue() && N3C->isNullValue() &&
971              N2C->getValue() == 1ULL && CC == ISD::SETNE &&
972              // FIXME: Implement this optzn for PPC64.
973              N->getValueType(0) == MVT::i32) {
974            AddToISelQueue(N->getOperand(0));
975            SDNode *Tmp =
976              CurDAG->getTargetNode(PPC::ADDIC, MVT::i32, MVT::Flag,
977                                    N->getOperand(0), getI32Imm(~0U));
978            return CurDAG->SelectNodeTo(N, PPC::SUBFE, MVT::i32,
979                                        SDOperand(Tmp, 0), N->getOperand(0),
980                                        SDOperand(Tmp, 1));
981          }
982
983    SDOperand CCReg = SelectCC(N->getOperand(0), N->getOperand(1), CC);
984    unsigned BROpc = getPredicateForSetCC(CC);
985
986    unsigned SelectCCOp;
987    if (N->getValueType(0) == MVT::i32)
988      SelectCCOp = PPC::SELECT_CC_I4;
989    else if (N->getValueType(0) == MVT::i64)
990      SelectCCOp = PPC::SELECT_CC_I8;
991    else if (N->getValueType(0) == MVT::f32)
992      SelectCCOp = PPC::SELECT_CC_F4;
993    else if (N->getValueType(0) == MVT::f64)
994      SelectCCOp = PPC::SELECT_CC_F8;
995    else
996      SelectCCOp = PPC::SELECT_CC_VRRC;
997
998    AddToISelQueue(N->getOperand(2));
999    AddToISelQueue(N->getOperand(3));
1000    SDOperand Ops[] = { CCReg, N->getOperand(2), N->getOperand(3),
1001                        getI32Imm(BROpc) };
1002    return CurDAG->SelectNodeTo(N, SelectCCOp, N->getValueType(0), Ops, 4);
1003  }
1004  case PPCISD::COND_BRANCH: {
1005    AddToISelQueue(N->getOperand(0));  // Op #0 is the Chain.
1006    // Op #1 is the PPC::PRED_* number.
1007    // Op #2 is the CR#
1008    // Op #3 is the Dest MBB
1009    AddToISelQueue(N->getOperand(4));  // Op #4 is the Flag.
1010    SDOperand Ops[] = { N->getOperand(1), N->getOperand(2), N->getOperand(3),
1011      N->getOperand(0), N->getOperand(4) };
1012    return CurDAG->SelectNodeTo(N, PPC::BCC, MVT::Other, Ops, 5);
1013  }
1014  case ISD::BR_CC: {
1015    AddToISelQueue(N->getOperand(0));
1016    ISD::CondCode CC = cast<CondCodeSDNode>(N->getOperand(1))->get();
1017    SDOperand CondCode = SelectCC(N->getOperand(2), N->getOperand(3), CC);
1018    SDOperand Ops[] = { getI32Imm(getPredicateForSetCC(CC)), CondCode,
1019                        N->getOperand(4), N->getOperand(0) };
1020    return CurDAG->SelectNodeTo(N, PPC::BCC, MVT::Other, Ops, 4);
1021  }
1022  case ISD::BRIND: {
1023    // FIXME: Should custom lower this.
1024    SDOperand Chain = N->getOperand(0);
1025    SDOperand Target = N->getOperand(1);
1026    AddToISelQueue(Chain);
1027    AddToISelQueue(Target);
1028    unsigned Opc = Target.getValueType() == MVT::i32 ? PPC::MTCTR : PPC::MTCTR8;
1029    Chain = SDOperand(CurDAG->getTargetNode(Opc, MVT::Other, Target,
1030                                            Chain), 0);
1031    return CurDAG->SelectNodeTo(N, PPC::BCTR, MVT::Other, Chain);
1032  }
1033  }
1034
1035  return SelectCode(Op);
1036}
1037
1038
1039
1040/// createPPCISelDag - This pass converts a legalized DAG into a
1041/// PowerPC-specific DAG, ready for instruction scheduling.
1042///
1043FunctionPass *llvm::createPPCISelDag(PPCTargetMachine &TM) {
1044  return new PPCDAGToDAGISel(TM);
1045}
1046
1047