PPCISelDAGToDAG.cpp revision c23197a26f34f559ea9797de51e187087c039c42
121e463b2bf864671a87ebe386cb100ef9349a540Nate Begeman//===-- PPCISelDAGToDAG.cpp - PPC --pattern matching inst selector --------===//
2a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner//
3a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner//                     The LLVM Compiler Infrastructure
4a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner//
54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source
64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details.
7a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner//
8a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner//===----------------------------------------------------------------------===//
9a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner//
1021e463b2bf864671a87ebe386cb100ef9349a540Nate Begeman// This file defines a pattern matching instruction selector for PowerPC,
11a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner// converting from a legalized dag to a PPC dag.
12a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner//
13a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner//===----------------------------------------------------------------------===//
14a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner
1595b2c7da5e83670881270c1cd231a240be0556d9Chris Lattner#define DEBUG_TYPE "ppc-codegen"
162668959b8879097db368aec7d76c455260abc75bChris Lattner#include "PPC.h"
17df4ed6350b2a51f71c0980e86c9078f4046ea706Chris Lattner#include "PPCPredicates.h"
1816e71f2f70811c69c56052dd146324fe20e31db5Chris Lattner#include "PPCTargetMachine.h"
1916e71f2f70811c69c56052dd146324fe20e31db5Chris Lattner#include "PPCISelLowering.h"
20c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner#include "PPCHazardRecognizers.h"
214416f1a0a5b17906b9e162209fd506656a2e07d8Chris Lattner#include "llvm/CodeGen/MachineInstrBuilder.h"
224416f1a0a5b17906b9e162209fd506656a2e07d8Chris Lattner#include "llvm/CodeGen/MachineFunction.h"
2384bc5427d6883f73cfeae3da640acd011d35c006Chris Lattner#include "llvm/CodeGen/MachineRegisterInfo.h"
24a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner#include "llvm/CodeGen/SelectionDAG.h"
25a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner#include "llvm/CodeGen/SelectionDAGISel.h"
26a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner#include "llvm/Target/TargetOptions.h"
272fe76e58eb734a09ec08ea006a32700572ffc0caChris Lattner#include "llvm/Constants.h"
289062d9a55b0b8b473b927d8b020e36990e147a58Chris Lattner#include "llvm/Function.h"
294416f1a0a5b17906b9e162209fd506656a2e07d8Chris Lattner#include "llvm/GlobalValue.h"
30420736dc85c01702bb7bc40495f8a4be5e5f8a6cChris Lattner#include "llvm/Intrinsics.h"
31a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner#include "llvm/Support/Debug.h"
32a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner#include "llvm/Support/MathExtras.h"
33a4f0b3a084d120cfc5b5bb06f64b222f5cb72740Chris Lattner#include "llvm/Support/Compiler.h"
34dac237e18209b697a8ba122d0ddd9cad4dfba1f8Torok Edwin#include "llvm/Support/ErrorHandling.h"
35dac237e18209b697a8ba122d0ddd9cad4dfba1f8Torok Edwin#include "llvm/Support/raw_ostream.h"
36a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattnerusing namespace llvm;
37a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner
38a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattnernamespace {
39a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  //===--------------------------------------------------------------------===//
401d9d7427c4a4e3c7bdcfd1f725447f355e509c20Nate Begeman  /// PPCDAGToDAGISel - PPC specific code to select PPC machine
41a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  /// instructions for SelectionDAG operations.
42a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  ///
432a41a98fb70923e2d6780220eb225ac0e8b4ff36Chris Lattner  class VISIBILITY_HIDDEN PPCDAGToDAGISel : public SelectionDAGISel {
444bb189507281af0da8aff91743b5198acbf2398bChris Lattner    PPCTargetMachine &TM;
45da8ac5fd9130b70b61be61e4819faa8d842d708fDan Gohman    PPCTargetLowering &PPCLowering;
46152b7e18748f7e06a93260f22cc9dac8eb3abee2Evan Cheng    const PPCSubtarget &PPCSubTarget;
474416f1a0a5b17906b9e162209fd506656a2e07d8Chris Lattner    unsigned GlobalBaseReg;
48a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  public:
491002c0203450620594a85454c6a095ca94b87cb2Dan Gohman    explicit PPCDAGToDAGISel(PPCTargetMachine &tm)
5079ce276083ced01256a0eb7d80731e4948ca6e87Dan Gohman      : SelectionDAGISel(tm), TM(tm),
51152b7e18748f7e06a93260f22cc9dac8eb3abee2Evan Cheng        PPCLowering(*TM.getTargetLowering()),
52152b7e18748f7e06a93260f22cc9dac8eb3abee2Evan Cheng        PPCSubTarget(*TM.getSubtargetImpl()) {}
53a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner
544416f1a0a5b17906b9e162209fd506656a2e07d8Chris Lattner    virtual bool runOnFunction(Function &Fn) {
559062d9a55b0b8b473b927d8b020e36990e147a58Chris Lattner      // Do not codegen any 'available_externally' functions at all, they have
569062d9a55b0b8b473b927d8b020e36990e147a58Chris Lattner      // definitions outside the translation unit.
579062d9a55b0b8b473b927d8b020e36990e147a58Chris Lattner      if (Fn.hasAvailableExternallyLinkage())
589062d9a55b0b8b473b927d8b020e36990e147a58Chris Lattner        return false;
599062d9a55b0b8b473b927d8b020e36990e147a58Chris Lattner
604416f1a0a5b17906b9e162209fd506656a2e07d8Chris Lattner      // Make sure we re-emit a set of the global base reg if necessary
614416f1a0a5b17906b9e162209fd506656a2e07d8Chris Lattner      GlobalBaseReg = 0;
624bb189507281af0da8aff91743b5198acbf2398bChris Lattner      SelectionDAGISel::runOnFunction(Fn);
634bb189507281af0da8aff91743b5198acbf2398bChris Lattner
644bb189507281af0da8aff91743b5198acbf2398bChris Lattner      InsertVRSaveCode(Fn);
654bb189507281af0da8aff91743b5198acbf2398bChris Lattner      return true;
664416f1a0a5b17906b9e162209fd506656a2e07d8Chris Lattner    }
674416f1a0a5b17906b9e162209fd506656a2e07d8Chris Lattner
68a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    /// getI32Imm - Return a target constant with the specified value, of type
69a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    /// i32.
70475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    inline SDValue getI32Imm(unsigned Imm) {
71a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      return CurDAG->getTargetConstant(Imm, MVT::i32);
72a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    }
734416f1a0a5b17906b9e162209fd506656a2e07d8Chris Lattner
74c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner    /// getI64Imm - Return a target constant with the specified value, of type
75c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner    /// i64.
76475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    inline SDValue getI64Imm(uint64_t Imm) {
77c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner      return CurDAG->getTargetConstant(Imm, MVT::i64);
78c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner    }
79c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner
80c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner    /// getSmallIPtrImm - Return a target constant of pointer type.
81475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    inline SDValue getSmallIPtrImm(unsigned Imm) {
82c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner      return CurDAG->getTargetConstant(Imm, PPCLowering.getPointerTy());
83c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner    }
84c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner
85f42f133938545d4f5c249bcfef63db772ce8e942Nate Begeman    /// isRunOfOnes - Returns true iff Val consists of one contiguous run of 1s
86f42f133938545d4f5c249bcfef63db772ce8e942Nate Begeman    /// with any number of 0s on either side.  The 1s are allowed to wrap from
87f42f133938545d4f5c249bcfef63db772ce8e942Nate Begeman    /// LSB to MSB, so 0x000FFF0, 0x0000FFFF, and 0xFF0000FF are all runs.
88f42f133938545d4f5c249bcfef63db772ce8e942Nate Begeman    /// 0x0F0F0000 is not, since all 1s are not contiguous.
89f42f133938545d4f5c249bcfef63db772ce8e942Nate Begeman    static bool isRunOfOnes(unsigned Val, unsigned &MB, unsigned &ME);
90f42f133938545d4f5c249bcfef63db772ce8e942Nate Begeman
91f42f133938545d4f5c249bcfef63db772ce8e942Nate Begeman
92f42f133938545d4f5c249bcfef63db772ce8e942Nate Begeman    /// isRotateAndMask - Returns true if Mask and Shift can be folded into a
93f42f133938545d4f5c249bcfef63db772ce8e942Nate Begeman    /// rotate and mask opcode and mask operation.
94f42f133938545d4f5c249bcfef63db772ce8e942Nate Begeman    static bool isRotateAndMask(SDNode *N, unsigned Mask, bool IsShiftMask,
95f42f133938545d4f5c249bcfef63db772ce8e942Nate Begeman                                unsigned &SH, unsigned &MB, unsigned &ME);
96c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner
974416f1a0a5b17906b9e162209fd506656a2e07d8Chris Lattner    /// getGlobalBaseReg - insert code into the entry mbb to materialize the PIC
984416f1a0a5b17906b9e162209fd506656a2e07d8Chris Lattner    /// base register.  Return the virtual register that holds this value.
999ade218533429146731213eacb7e12060e65ff58Evan Cheng    SDNode *getGlobalBaseReg();
100a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner
101a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    // Select - Convert the specified operand from a target-independent to a
102a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    // target-specific node if it hasn't already been changed.
103475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDNode *Select(SDValue Op);
104a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner
10502b88a4586704f34bc65afca3348453eae69d1d3Nate Begeman    SDNode *SelectBitfieldInsert(SDNode *N);
10602b88a4586704f34bc65afca3348453eae69d1d3Nate Begeman
1072fbb4579d6d6bbde8387283b78307c2ea477a312Chris Lattner    /// SelectCC - Select a comparison of the specified values with the
1082fbb4579d6d6bbde8387283b78307c2ea477a312Chris Lattner    /// specified condition code, returning the CR# of the expression.
109f5f5dce897269885754fc79adeb809194da52942Dale Johannesen    SDValue SelectCC(SDValue LHS, SDValue RHS, ISD::CondCode CC, DebugLoc dl);
1102fbb4579d6d6bbde8387283b78307c2ea477a312Chris Lattner
1117fd1edd32e9a6782dbcd00818bbdaf82f14284a1Nate Begeman    /// SelectAddrImm - Returns true if the address N can be represented by
1127fd1edd32e9a6782dbcd00818bbdaf82f14284a1Nate Begeman    /// a base register plus a signed 16-bit displacement [r+imm].
113475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    bool SelectAddrImm(SDValue Op, SDValue N, SDValue &Disp,
114475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                       SDValue &Base) {
115fc5b1ab94959879a91c34aee8859e652a50270d0Chris Lattner      return PPCLowering.SelectAddressRegImm(N, Disp, Base, *CurDAG);
116fc5b1ab94959879a91c34aee8859e652a50270d0Chris Lattner    }
11774531e49ef97cc2bef8fc9c35963368fc63153cfChris Lattner
11874531e49ef97cc2bef8fc9c35963368fc63153cfChris Lattner    /// SelectAddrImmOffs - Return true if the operand is valid for a preinc
11974531e49ef97cc2bef8fc9c35963368fc63153cfChris Lattner    /// immediate field.  Because preinc imms have already been validated, just
12074531e49ef97cc2bef8fc9c35963368fc63153cfChris Lattner    /// accept it.
121475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    bool SelectAddrImmOffs(SDValue Op, SDValue N, SDValue &Out) const {
12274531e49ef97cc2bef8fc9c35963368fc63153cfChris Lattner      Out = N;
12374531e49ef97cc2bef8fc9c35963368fc63153cfChris Lattner      return true;
12474531e49ef97cc2bef8fc9c35963368fc63153cfChris Lattner    }
1257fd1edd32e9a6782dbcd00818bbdaf82f14284a1Nate Begeman
1267fd1edd32e9a6782dbcd00818bbdaf82f14284a1Nate Begeman    /// SelectAddrIdx - Given the specified addressed, check to see if it can be
1277fd1edd32e9a6782dbcd00818bbdaf82f14284a1Nate Begeman    /// represented as an indexed [r+r] operation.  Returns false if it can
1287fd1edd32e9a6782dbcd00818bbdaf82f14284a1Nate Begeman    /// be represented by [r+imm], which are preferred.
129475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    bool SelectAddrIdx(SDValue Op, SDValue N, SDValue &Base,
130475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                       SDValue &Index) {
131fc5b1ab94959879a91c34aee8859e652a50270d0Chris Lattner      return PPCLowering.SelectAddressRegReg(N, Base, Index, *CurDAG);
132fc5b1ab94959879a91c34aee8859e652a50270d0Chris Lattner    }
133f43a3ca26d7bf431be5cdfb5963350a158e840afNate Begeman
1347fd1edd32e9a6782dbcd00818bbdaf82f14284a1Nate Begeman    /// SelectAddrIdxOnly - Given the specified addressed, force it to be
1357fd1edd32e9a6782dbcd00818bbdaf82f14284a1Nate Begeman    /// represented as an indexed [r+r] operation.
136475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    bool SelectAddrIdxOnly(SDValue Op, SDValue N, SDValue &Base,
137475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                           SDValue &Index) {
138fc5b1ab94959879a91c34aee8859e652a50270d0Chris Lattner      return PPCLowering.SelectAddressRegRegOnly(N, Base, Index, *CurDAG);
139fc5b1ab94959879a91c34aee8859e652a50270d0Chris Lattner    }
1409944b76cfe74981d2c41c8237d25267ba0c467c7Chris Lattner
141e5ba580ab05b18eaa9fd4d36e31466e41f693ad9Chris Lattner    /// SelectAddrImmShift - Returns true if the address N can be represented by
142e5ba580ab05b18eaa9fd4d36e31466e41f693ad9Chris Lattner    /// a base register plus a signed 14-bit displacement [r+imm*4].  Suitable
143e5ba580ab05b18eaa9fd4d36e31466e41f693ad9Chris Lattner    /// for use by STD and friends.
144475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    bool SelectAddrImmShift(SDValue Op, SDValue N, SDValue &Disp,
145475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                            SDValue &Base) {
146fc5b1ab94959879a91c34aee8859e652a50270d0Chris Lattner      return PPCLowering.SelectAddressRegImmShift(N, Disp, Base, *CurDAG);
147fc5b1ab94959879a91c34aee8859e652a50270d0Chris Lattner    }
148fc5b1ab94959879a91c34aee8859e652a50270d0Chris Lattner
149e5d8861126959d01cf847b6ef280dd9ef38d33cfChris Lattner    /// SelectInlineAsmMemoryOperand - Implement addressing mode selection for
150e5d8861126959d01cf847b6ef280dd9ef38d33cfChris Lattner    /// inline asm expressions.
151475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    virtual bool SelectInlineAsmMemoryOperand(const SDValue &Op,
152e5d8861126959d01cf847b6ef280dd9ef38d33cfChris Lattner                                              char ConstraintCode,
153f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman                                              std::vector<SDValue> &OutOps) {
154475871a144eb604ddaf37503397ba0941442e5fbDan Gohman      SDValue Op0, Op1;
155e5d8861126959d01cf847b6ef280dd9ef38d33cfChris Lattner      switch (ConstraintCode) {
156e5d8861126959d01cf847b6ef280dd9ef38d33cfChris Lattner      default: return true;
157e5d8861126959d01cf847b6ef280dd9ef38d33cfChris Lattner      case 'm':   // memory
1580d53826f3653a789cf1491c3c40a1f4a993992b6Evan Cheng        if (!SelectAddrIdx(Op, Op, Op0, Op1))
1590d53826f3653a789cf1491c3c40a1f4a993992b6Evan Cheng          SelectAddrImm(Op, Op, Op0, Op1);
160e5d8861126959d01cf847b6ef280dd9ef38d33cfChris Lattner        break;
161e5d8861126959d01cf847b6ef280dd9ef38d33cfChris Lattner      case 'o':   // offsetable
1620d53826f3653a789cf1491c3c40a1f4a993992b6Evan Cheng        if (!SelectAddrImm(Op, Op, Op0, Op1)) {
1636da2f3268d12a9e64f2635dbb94b63e1c4142f59Evan Cheng          Op0 = Op;
164c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner          Op1 = getSmallIPtrImm(0);
165e5d8861126959d01cf847b6ef280dd9ef38d33cfChris Lattner        }
166e5d8861126959d01cf847b6ef280dd9ef38d33cfChris Lattner        break;
167e5d8861126959d01cf847b6ef280dd9ef38d33cfChris Lattner      case 'v':   // not offsetable
1680d53826f3653a789cf1491c3c40a1f4a993992b6Evan Cheng        SelectAddrIdxOnly(Op, Op, Op0, Op1);
169e5d8861126959d01cf847b6ef280dd9ef38d33cfChris Lattner        break;
170e5d8861126959d01cf847b6ef280dd9ef38d33cfChris Lattner      }
171e5d8861126959d01cf847b6ef280dd9ef38d33cfChris Lattner
172e5d8861126959d01cf847b6ef280dd9ef38d33cfChris Lattner      OutOps.push_back(Op0);
173e5d8861126959d01cf847b6ef280dd9ef38d33cfChris Lattner      OutOps.push_back(Op1);
174e5d8861126959d01cf847b6ef280dd9ef38d33cfChris Lattner      return false;
175e5d8861126959d01cf847b6ef280dd9ef38d33cfChris Lattner    }
176e5d8861126959d01cf847b6ef280dd9ef38d33cfChris Lattner
177475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue BuildSDIVSequence(SDNode *N);
178475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue BuildUDIVSequence(SDNode *N);
179047b952e298352fe6feffedf02e359601133f465Chris Lattner
180db8d56b825efeb576d67b9dbe39d736d93306222Evan Cheng    /// InstructionSelect - This callback is invoked by
181a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    /// SelectionDAGISel when it has created a SelectionDAG for us to codegen.
182f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman    virtual void InstructionSelect();
183bd937b98f48cac17bd3d5102b2182943b97f8c28Chris Lattner
1844bb189507281af0da8aff91743b5198acbf2398bChris Lattner    void InsertVRSaveCode(Function &Fn);
1854bb189507281af0da8aff91743b5198acbf2398bChris Lattner
186a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    virtual const char *getPassName() const {
187a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      return "PowerPC DAG->DAG Pattern Instruction Selection";
188a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    }
189c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner
190c04ba7a97d5ad599d92a1817de2d7c5fbb145810Chris Lattner    /// CreateTargetHazardRecognizer - Return the hazard recognizer to use for
191c04ba7a97d5ad599d92a1817de2d7c5fbb145810Chris Lattner    /// this target when scheduling the DAG.
192fc54c552963545a81e4ea38e60460590afb2d5aeDan Gohman    virtual ScheduleHazardRecognizer *CreateTargetHazardRecognizer() {
193c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner      // Should use subtarget info to pick the right hazard recognizer.  For
194c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner      // now, always return a PPC970 recognizer.
1956448d91ad1e5497fe2f7015d61b57cb5f3040879Dan Gohman      const TargetInstrInfo *II = TM.getInstrInfo();
19688d211f82304e53694ece666d4a2507b170e4582Chris Lattner      assert(II && "No InstrInfo?");
19788d211f82304e53694ece666d4a2507b170e4582Chris Lattner      return new PPCHazardRecognizer970(*II);
198c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner    }
199af165385112037cb942e94ea562a67990b7d6220Chris Lattner
200af165385112037cb942e94ea562a67990b7d6220Chris Lattner// Include the pieces autogenerated from the target description.
2014c7b43b43fdf943c7298718e15ab5d6dfe345be7Chris Lattner#include "PPCGenDAGISel.inc"
202bd937b98f48cac17bd3d5102b2182943b97f8c28Chris Lattner
203bd937b98f48cac17bd3d5102b2182943b97f8c28Chris Lattnerprivate:
204475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDNode *SelectSETCC(SDValue Op);
205a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  };
206a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner}
207a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner
208db8d56b825efeb576d67b9dbe39d736d93306222Evan Cheng/// InstructionSelect - This callback is invoked by
209bd937b98f48cac17bd3d5102b2182943b97f8c28Chris Lattner/// SelectionDAGISel when it has created a SelectionDAG for us to codegen.
210f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohmanvoid PPCDAGToDAGISel::InstructionSelect() {
211bd937b98f48cac17bd3d5102b2182943b97f8c28Chris Lattner  DEBUG(BB->dump());
212bd937b98f48cac17bd3d5102b2182943b97f8c28Chris Lattner
213bd937b98f48cac17bd3d5102b2182943b97f8c28Chris Lattner  // Select target instructions for the DAG.
2148ad4c00c00233acb8a3395098e2b575cc34de46bDavid Greene  SelectRoot(*CurDAG);
215f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  CurDAG->RemoveDeadNodes();
2164bb189507281af0da8aff91743b5198acbf2398bChris Lattner}
2174bb189507281af0da8aff91743b5198acbf2398bChris Lattner
2184bb189507281af0da8aff91743b5198acbf2398bChris Lattner/// InsertVRSaveCode - Once the entire function has been instruction selected,
2194bb189507281af0da8aff91743b5198acbf2398bChris Lattner/// all virtual registers are created and all machine instructions are built,
2204bb189507281af0da8aff91743b5198acbf2398bChris Lattner/// check to see if we need to save/restore VRSAVE.  If so, do it.
2214bb189507281af0da8aff91743b5198acbf2398bChris Lattnervoid PPCDAGToDAGISel::InsertVRSaveCode(Function &F) {
2221877ec9b02511e111998596b9ba9c3a2275d6a92Chris Lattner  // Check to see if this function uses vector registers, which means we have to
2231877ec9b02511e111998596b9ba9c3a2275d6a92Chris Lattner  // save and restore the VRSAVE register and update it with the regs we use.
2241877ec9b02511e111998596b9ba9c3a2275d6a92Chris Lattner  //
2251877ec9b02511e111998596b9ba9c3a2275d6a92Chris Lattner  // In this case, there will be virtual registers of vector type type created
2261877ec9b02511e111998596b9ba9c3a2275d6a92Chris Lattner  // by the scheduler.  Detect them now.
2274bb189507281af0da8aff91743b5198acbf2398bChris Lattner  MachineFunction &Fn = MachineFunction::get(&F);
2281877ec9b02511e111998596b9ba9c3a2275d6a92Chris Lattner  bool HasVectorVReg = false;
2296f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohman  for (unsigned i = TargetRegisterInfo::FirstVirtualRegister,
23084bc5427d6883f73cfeae3da640acd011d35c006Chris Lattner       e = RegInfo->getLastVirtReg()+1; i != e; ++i)
23184bc5427d6883f73cfeae3da640acd011d35c006Chris Lattner    if (RegInfo->getRegClass(i) == &PPC::VRRCRegClass) {
2321877ec9b02511e111998596b9ba9c3a2275d6a92Chris Lattner      HasVectorVReg = true;
2331877ec9b02511e111998596b9ba9c3a2275d6a92Chris Lattner      break;
2341877ec9b02511e111998596b9ba9c3a2275d6a92Chris Lattner    }
2354bb189507281af0da8aff91743b5198acbf2398bChris Lattner  if (!HasVectorVReg) return;  // nothing to do.
2364bb189507281af0da8aff91743b5198acbf2398bChris Lattner
2371877ec9b02511e111998596b9ba9c3a2275d6a92Chris Lattner  // If we have a vector register, we want to emit code into the entry and exit
2381877ec9b02511e111998596b9ba9c3a2275d6a92Chris Lattner  // blocks to save and restore the VRSAVE register.  We do this here (instead
2391877ec9b02511e111998596b9ba9c3a2275d6a92Chris Lattner  // of marking all vector instructions as clobbering VRSAVE) for two reasons:
2401877ec9b02511e111998596b9ba9c3a2275d6a92Chris Lattner  //
2411877ec9b02511e111998596b9ba9c3a2275d6a92Chris Lattner  // 1. This (trivially) reduces the load on the register allocator, by not
2421877ec9b02511e111998596b9ba9c3a2275d6a92Chris Lattner  //    having to represent the live range of the VRSAVE register.
2431877ec9b02511e111998596b9ba9c3a2275d6a92Chris Lattner  // 2. This (more significantly) allows us to create a temporary virtual
2441877ec9b02511e111998596b9ba9c3a2275d6a92Chris Lattner  //    register to hold the saved VRSAVE value, allowing this temporary to be
2451877ec9b02511e111998596b9ba9c3a2275d6a92Chris Lattner  //    register allocated, instead of forcing it to be spilled to the stack.
2464bb189507281af0da8aff91743b5198acbf2398bChris Lattner
2474bb189507281af0da8aff91743b5198acbf2398bChris Lattner  // Create two vregs - one to hold the VRSAVE register that is live-in to the
2484bb189507281af0da8aff91743b5198acbf2398bChris Lattner  // function and one for the value after having bits or'd into it.
24984bc5427d6883f73cfeae3da640acd011d35c006Chris Lattner  unsigned InVRSAVE = RegInfo->createVirtualRegister(&PPC::GPRCRegClass);
25084bc5427d6883f73cfeae3da640acd011d35c006Chris Lattner  unsigned UpdatedVRSAVE = RegInfo->createVirtualRegister(&PPC::GPRCRegClass);
2514bb189507281af0da8aff91743b5198acbf2398bChris Lattner
252c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng  const TargetInstrInfo &TII = *TM.getInstrInfo();
2534bb189507281af0da8aff91743b5198acbf2398bChris Lattner  MachineBasicBlock &EntryBB = *Fn.begin();
254536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen  DebugLoc dl = DebugLoc::getUnknownLoc();
2554bb189507281af0da8aff91743b5198acbf2398bChris Lattner  // Emit the following code into the entry block:
2564bb189507281af0da8aff91743b5198acbf2398bChris Lattner  // InVRSAVE = MFVRSAVE
2574bb189507281af0da8aff91743b5198acbf2398bChris Lattner  // UpdatedVRSAVE = UPDATE_VRSAVE InVRSAVE
2584bb189507281af0da8aff91743b5198acbf2398bChris Lattner  // MTVRSAVE UpdatedVRSAVE
2594bb189507281af0da8aff91743b5198acbf2398bChris Lattner  MachineBasicBlock::iterator IP = EntryBB.begin();  // Insert Point
260536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen  BuildMI(EntryBB, IP, dl, TII.get(PPC::MFVRSAVE), InVRSAVE);
261536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen  BuildMI(EntryBB, IP, dl, TII.get(PPC::UPDATE_VRSAVE),
26269244300b8a0112efb44b6273ecea4ca6264b8cfChris Lattner          UpdatedVRSAVE).addReg(InVRSAVE);
263536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen  BuildMI(EntryBB, IP, dl, TII.get(PPC::MTVRSAVE)).addReg(UpdatedVRSAVE);
2644bb189507281af0da8aff91743b5198acbf2398bChris Lattner
2654bb189507281af0da8aff91743b5198acbf2398bChris Lattner  // Find all return blocks, outputting a restore in each epilog.
2664bb189507281af0da8aff91743b5198acbf2398bChris Lattner  for (MachineFunction::iterator BB = Fn.begin(), E = Fn.end(); BB != E; ++BB) {
267749c6f6b5ed301c84aac562e414486549d7b98ebChris Lattner    if (!BB->empty() && BB->back().getDesc().isReturn()) {
2684bb189507281af0da8aff91743b5198acbf2398bChris Lattner      IP = BB->end(); --IP;
2694bb189507281af0da8aff91743b5198acbf2398bChris Lattner
2704bb189507281af0da8aff91743b5198acbf2398bChris Lattner      // Skip over all terminator instructions, which are part of the return
2714bb189507281af0da8aff91743b5198acbf2398bChris Lattner      // sequence.
2724bb189507281af0da8aff91743b5198acbf2398bChris Lattner      MachineBasicBlock::iterator I2 = IP;
273749c6f6b5ed301c84aac562e414486549d7b98ebChris Lattner      while (I2 != BB->begin() && (--I2)->getDesc().isTerminator())
2744bb189507281af0da8aff91743b5198acbf2398bChris Lattner        IP = I2;
2754bb189507281af0da8aff91743b5198acbf2398bChris Lattner
2764bb189507281af0da8aff91743b5198acbf2398bChris Lattner      // Emit: MTVRSAVE InVRSave
277536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen      BuildMI(*BB, IP, dl, TII.get(PPC::MTVRSAVE)).addReg(InVRSAVE);
2784bb189507281af0da8aff91743b5198acbf2398bChris Lattner    }
2791877ec9b02511e111998596b9ba9c3a2275d6a92Chris Lattner  }
280bd937b98f48cac17bd3d5102b2182943b97f8c28Chris Lattner}
2816cd40d5888f905a3820d5d6c71e57cc0e02abb4aChris Lattner
2824bb189507281af0da8aff91743b5198acbf2398bChris Lattner
2834416f1a0a5b17906b9e162209fd506656a2e07d8Chris Lattner/// getGlobalBaseReg - Output the instructions required to put the
2844416f1a0a5b17906b9e162209fd506656a2e07d8Chris Lattner/// base address to use for accessing globals into a register.
2854416f1a0a5b17906b9e162209fd506656a2e07d8Chris Lattner///
2869ade218533429146731213eacb7e12060e65ff58Evan ChengSDNode *PPCDAGToDAGISel::getGlobalBaseReg() {
2874416f1a0a5b17906b9e162209fd506656a2e07d8Chris Lattner  if (!GlobalBaseReg) {
288c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng    const TargetInstrInfo &TII = *TM.getInstrInfo();
2894416f1a0a5b17906b9e162209fd506656a2e07d8Chris Lattner    // Insert the set of GlobalBaseReg into the first MBB of the function
2904416f1a0a5b17906b9e162209fd506656a2e07d8Chris Lattner    MachineBasicBlock &FirstMBB = BB->getParent()->front();
2914416f1a0a5b17906b9e162209fd506656a2e07d8Chris Lattner    MachineBasicBlock::iterator MBBI = FirstMBB.begin();
292536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen    DebugLoc dl = DebugLoc::getUnknownLoc();
293c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner
294d10434215da983b58389d2a0880dfcd2cd3b7f35Chris Lattner    if (PPCLowering.getPointerTy() == MVT::i32) {
29584bc5427d6883f73cfeae3da640acd011d35c006Chris Lattner      GlobalBaseReg = RegInfo->createVirtualRegister(PPC::GPRCRegisterClass);
296536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen      BuildMI(FirstMBB, MBBI, dl, TII.get(PPC::MovePCtoLR), PPC::LR);
297536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen      BuildMI(FirstMBB, MBBI, dl, TII.get(PPC::MFLR), GlobalBaseReg);
298d10434215da983b58389d2a0880dfcd2cd3b7f35Chris Lattner    } else {
29984bc5427d6883f73cfeae3da640acd011d35c006Chris Lattner      GlobalBaseReg = RegInfo->createVirtualRegister(PPC::G8RCRegisterClass);
300536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen      BuildMI(FirstMBB, MBBI, dl, TII.get(PPC::MovePCtoLR8), PPC::LR8);
301536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen      BuildMI(FirstMBB, MBBI, dl, TII.get(PPC::MFLR8), GlobalBaseReg);
302d10434215da983b58389d2a0880dfcd2cd3b7f35Chris Lattner    }
3034416f1a0a5b17906b9e162209fd506656a2e07d8Chris Lattner  }
30493c53e5583427ee567293a9a21c6c76fccf218caGabor Greif  return CurDAG->getRegister(GlobalBaseReg,
30593c53e5583427ee567293a9a21c6c76fccf218caGabor Greif                             PPCLowering.getPointerTy()).getNode();
3064416f1a0a5b17906b9e162209fd506656a2e07d8Chris Lattner}
3074416f1a0a5b17906b9e162209fd506656a2e07d8Chris Lattner
308c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner/// isIntS16Immediate - This method tests to see if the node is either a 32-bit
309c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner/// or 64-bit immediate, and if the value can be accurately represented as a
310c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner/// sign extension from a 16-bit value.  If so, this returns true and the
311c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner/// immediate.
312c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattnerstatic bool isIntS16Immediate(SDNode *N, short &Imm) {
313c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner  if (N->getOpcode() != ISD::Constant)
314c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner    return false;
3154416f1a0a5b17906b9e162209fd506656a2e07d8Chris Lattner
316f5aeb1a8e4cf272c7348376d185ef8d8267653e0Dan Gohman  Imm = (short)cast<ConstantSDNode>(N)->getZExtValue();
317c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner  if (N->getValueType(0) == MVT::i32)
318f5aeb1a8e4cf272c7348376d185ef8d8267653e0Dan Gohman    return Imm == (int32_t)cast<ConstantSDNode>(N)->getZExtValue();
319c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner  else
320f5aeb1a8e4cf272c7348376d185ef8d8267653e0Dan Gohman    return Imm == (int64_t)cast<ConstantSDNode>(N)->getZExtValue();
321c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner}
322c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner
323475871a144eb604ddaf37503397ba0941442e5fbDan Gohmanstatic bool isIntS16Immediate(SDValue Op, short &Imm) {
324ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif  return isIntS16Immediate(Op.getNode(), Imm);
325c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner}
326c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner
327c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner
328c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner/// isInt32Immediate - This method tests to see if the node is a 32-bit constant
329c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner/// operand. If so Imm will receive the 32-bit value.
330c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattnerstatic bool isInt32Immediate(SDNode *N, unsigned &Imm) {
331c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner  if (N->getOpcode() == ISD::Constant && N->getValueType(0) == MVT::i32) {
332f5aeb1a8e4cf272c7348376d185ef8d8267653e0Dan Gohman    Imm = cast<ConstantSDNode>(N)->getZExtValue();
3330f3257a3302b60c128a667db6736e81335316c1eNate Begeman    return true;
3340f3257a3302b60c128a667db6736e81335316c1eNate Begeman  }
3350f3257a3302b60c128a667db6736e81335316c1eNate Begeman  return false;
3360f3257a3302b60c128a667db6736e81335316c1eNate Begeman}
3370f3257a3302b60c128a667db6736e81335316c1eNate Begeman
338c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner/// isInt64Immediate - This method tests to see if the node is a 64-bit constant
339c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner/// operand.  If so Imm will receive the 64-bit value.
340c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattnerstatic bool isInt64Immediate(SDNode *N, uint64_t &Imm) {
341711762497c27357adc1edf8d4237c2770fa303bbChris Lattner  if (N->getOpcode() == ISD::Constant && N->getValueType(0) == MVT::i64) {
342f5aeb1a8e4cf272c7348376d185ef8d8267653e0Dan Gohman    Imm = cast<ConstantSDNode>(N)->getZExtValue();
343c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner    return true;
344c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner  }
345c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner  return false;
346c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner}
347c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner
348c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner// isInt32Immediate - This method tests to see if a constant operand.
349c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner// If so Imm will receive the 32 bit value.
350475871a144eb604ddaf37503397ba0941442e5fbDan Gohmanstatic bool isInt32Immediate(SDValue N, unsigned &Imm) {
351ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif  return isInt32Immediate(N.getNode(), Imm);
352c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner}
353c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner
354c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner
355c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner// isOpcWithIntImmediate - This method tests to see if the node is a specific
356c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner// opcode and that it has a immediate integer right operand.
357c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner// If so Imm will receive the 32 bit value.
358c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattnerstatic bool isOpcWithIntImmediate(SDNode *N, unsigned Opc, unsigned& Imm) {
35993c53e5583427ee567293a9a21c6c76fccf218caGabor Greif  return N->getOpcode() == Opc
36093c53e5583427ee567293a9a21c6c76fccf218caGabor Greif         && isInt32Immediate(N->getOperand(1).getNode(), Imm);
361c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner}
362c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner
363f42f133938545d4f5c249bcfef63db772ce8e942Nate Begemanbool PPCDAGToDAGISel::isRunOfOnes(unsigned Val, unsigned &MB, unsigned &ME) {
364cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman  if (isShiftedMask_32(Val)) {
365cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman    // look for the first non-zero bit
366cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman    MB = CountLeadingZeros_32(Val);
367cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman    // look for the first zero bit after the run of ones
368cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman    ME = CountLeadingZeros_32((Val - 1) ^ Val);
369cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman    return true;
3702fe76e58eb734a09ec08ea006a32700572ffc0caChris Lattner  } else {
3712fe76e58eb734a09ec08ea006a32700572ffc0caChris Lattner    Val = ~Val; // invert mask
3722fe76e58eb734a09ec08ea006a32700572ffc0caChris Lattner    if (isShiftedMask_32(Val)) {
3732fe76e58eb734a09ec08ea006a32700572ffc0caChris Lattner      // effectively look for the first zero bit
3742fe76e58eb734a09ec08ea006a32700572ffc0caChris Lattner      ME = CountLeadingZeros_32(Val) - 1;
3752fe76e58eb734a09ec08ea006a32700572ffc0caChris Lattner      // effectively look for the first one bit after the run of zeros
3762fe76e58eb734a09ec08ea006a32700572ffc0caChris Lattner      MB = CountLeadingZeros_32((Val - 1) ^ Val) + 1;
3772fe76e58eb734a09ec08ea006a32700572ffc0caChris Lattner      return true;
3782fe76e58eb734a09ec08ea006a32700572ffc0caChris Lattner    }
379cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman  }
380cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman  // no run present
381cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman  return false;
382cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman}
383cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman
384f42f133938545d4f5c249bcfef63db772ce8e942Nate Begemanbool PPCDAGToDAGISel::isRotateAndMask(SDNode *N, unsigned Mask,
385f42f133938545d4f5c249bcfef63db772ce8e942Nate Begeman                                      bool IsShiftMask, unsigned &SH,
386f42f133938545d4f5c249bcfef63db772ce8e942Nate Begeman                                      unsigned &MB, unsigned &ME) {
387da32c9eed6743c29d219a5c3cb13788853f18016Nate Begeman  // Don't even go down this path for i64, since different logic will be
388da32c9eed6743c29d219a5c3cb13788853f18016Nate Begeman  // necessary for rldicl/rldicr/rldimi.
389da32c9eed6743c29d219a5c3cb13788853f18016Nate Begeman  if (N->getValueType(0) != MVT::i32)
390da32c9eed6743c29d219a5c3cb13788853f18016Nate Begeman    return false;
391da32c9eed6743c29d219a5c3cb13788853f18016Nate Begeman
392cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman  unsigned Shift  = 32;
393cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman  unsigned Indeterminant = ~0;  // bit mask marking indeterminant results
394cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman  unsigned Opcode = N->getOpcode();
39515055733f85da5dc9a29e64cc1a2eeda38898f68Chris Lattner  if (N->getNumOperands() != 2 ||
396ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif      !isInt32Immediate(N->getOperand(1).getNode(), Shift) || (Shift > 31))
397cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman    return false;
398cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman
399cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman  if (Opcode == ISD::SHL) {
400cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman    // apply shift left to mask if it comes first
401cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman    if (IsShiftMask) Mask = Mask << Shift;
402cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman    // determine which bits are made indeterminant by shift
403cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman    Indeterminant = ~(0xFFFFFFFFu << Shift);
404651dea74f6a362d30bc61fd0b549da7707af5bf8Chris Lattner  } else if (Opcode == ISD::SRL) {
405cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman    // apply shift right to mask if it comes first
406cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman    if (IsShiftMask) Mask = Mask >> Shift;
407cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman    // determine which bits are made indeterminant by shift
408cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman    Indeterminant = ~(0xFFFFFFFFu >> Shift);
409cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman    // adjust for the left rotate
410cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman    Shift = 32 - Shift;
411f42f133938545d4f5c249bcfef63db772ce8e942Nate Begeman  } else if (Opcode == ISD::ROTL) {
412f42f133938545d4f5c249bcfef63db772ce8e942Nate Begeman    Indeterminant = 0;
413cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman  } else {
414cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman    return false;
415cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman  }
416cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman
417cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman  // if the mask doesn't intersect any Indeterminant bits
418cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman  if (Mask && !(Mask & Indeterminant)) {
4190949ed5412c0902113aaefe106fed5b383fcc696Chris Lattner    SH = Shift & 31;
420cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman    // make sure the mask is still a mask (wrap arounds may not be)
421cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman    return isRunOfOnes(Mask, MB, ME);
422cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman  }
423cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman  return false;
424cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman}
425cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman
42602b88a4586704f34bc65afca3348453eae69d1d3Nate Begeman/// SelectBitfieldInsert - turn an or of two masked values into
42702b88a4586704f34bc65afca3348453eae69d1d3Nate Begeman/// the rotate left word immediate then mask insert (rlwimi) instruction.
4281d9d7427c4a4e3c7bdcfd1f725447f355e509c20Nate BegemanSDNode *PPCDAGToDAGISel::SelectBitfieldInsert(SDNode *N) {
429475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Op0 = N->getOperand(0);
430475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Op1 = N->getOperand(1);
431ed2eee63a6858312ed17582d8cb85a6856d8eb34Dale Johannesen  DebugLoc dl = N->getDebugLoc();
43202b88a4586704f34bc65afca3348453eae69d1d3Nate Begeman
433b3564aa8367fc38efdab0a812868f6f93b9d883eDan Gohman  APInt LKZ, LKO, RKZ, RKO;
434b3564aa8367fc38efdab0a812868f6f93b9d883eDan Gohman  CurDAG->ComputeMaskedBits(Op0, APInt::getAllOnesValue(32), LKZ, LKO);
435b3564aa8367fc38efdab0a812868f6f93b9d883eDan Gohman  CurDAG->ComputeMaskedBits(Op1, APInt::getAllOnesValue(32), RKZ, RKO);
43602b88a4586704f34bc65afca3348453eae69d1d3Nate Begeman
437b3564aa8367fc38efdab0a812868f6f93b9d883eDan Gohman  unsigned TargetMask = LKZ.getZExtValue();
438b3564aa8367fc38efdab0a812868f6f93b9d883eDan Gohman  unsigned InsertMask = RKZ.getZExtValue();
4394667f2cbad246beccfca5411a26add24d1007035Nate Begeman
4404667f2cbad246beccfca5411a26add24d1007035Nate Begeman  if ((TargetMask | InsertMask) == 0xFFFFFFFF) {
4414667f2cbad246beccfca5411a26add24d1007035Nate Begeman    unsigned Op0Opc = Op0.getOpcode();
4424667f2cbad246beccfca5411a26add24d1007035Nate Begeman    unsigned Op1Opc = Op1.getOpcode();
4434667f2cbad246beccfca5411a26add24d1007035Nate Begeman    unsigned Value, SH = 0;
4444667f2cbad246beccfca5411a26add24d1007035Nate Begeman    TargetMask = ~TargetMask;
4454667f2cbad246beccfca5411a26add24d1007035Nate Begeman    InsertMask = ~InsertMask;
44677f361f5b3ac6ed080d6b0f401b62cd6e08614e5Nate Begeman
4474667f2cbad246beccfca5411a26add24d1007035Nate Begeman    // If the LHS has a foldable shift and the RHS does not, then swap it to the
4484667f2cbad246beccfca5411a26add24d1007035Nate Begeman    // RHS so that we can fold the shift into the insert.
44977f361f5b3ac6ed080d6b0f401b62cd6e08614e5Nate Begeman    if (Op0Opc == ISD::AND && Op1Opc == ISD::AND) {
45077f361f5b3ac6ed080d6b0f401b62cd6e08614e5Nate Begeman      if (Op0.getOperand(0).getOpcode() == ISD::SHL ||
45177f361f5b3ac6ed080d6b0f401b62cd6e08614e5Nate Begeman          Op0.getOperand(0).getOpcode() == ISD::SRL) {
45277f361f5b3ac6ed080d6b0f401b62cd6e08614e5Nate Begeman        if (Op1.getOperand(0).getOpcode() != ISD::SHL &&
45377f361f5b3ac6ed080d6b0f401b62cd6e08614e5Nate Begeman            Op1.getOperand(0).getOpcode() != ISD::SRL) {
45477f361f5b3ac6ed080d6b0f401b62cd6e08614e5Nate Begeman          std::swap(Op0, Op1);
45577f361f5b3ac6ed080d6b0f401b62cd6e08614e5Nate Begeman          std::swap(Op0Opc, Op1Opc);
4564667f2cbad246beccfca5411a26add24d1007035Nate Begeman          std::swap(TargetMask, InsertMask);
45777f361f5b3ac6ed080d6b0f401b62cd6e08614e5Nate Begeman        }
45877f361f5b3ac6ed080d6b0f401b62cd6e08614e5Nate Begeman      }
4594667f2cbad246beccfca5411a26add24d1007035Nate Begeman    } else if (Op0Opc == ISD::SHL || Op0Opc == ISD::SRL) {
4604667f2cbad246beccfca5411a26add24d1007035Nate Begeman      if (Op1Opc == ISD::AND && Op1.getOperand(0).getOpcode() != ISD::SHL &&
4614667f2cbad246beccfca5411a26add24d1007035Nate Begeman          Op1.getOperand(0).getOpcode() != ISD::SRL) {
4624667f2cbad246beccfca5411a26add24d1007035Nate Begeman        std::swap(Op0, Op1);
4634667f2cbad246beccfca5411a26add24d1007035Nate Begeman        std::swap(Op0Opc, Op1Opc);
4644667f2cbad246beccfca5411a26add24d1007035Nate Begeman        std::swap(TargetMask, InsertMask);
4654667f2cbad246beccfca5411a26add24d1007035Nate Begeman      }
46602b88a4586704f34bc65afca3348453eae69d1d3Nate Begeman    }
46777f361f5b3ac6ed080d6b0f401b62cd6e08614e5Nate Begeman
46877f361f5b3ac6ed080d6b0f401b62cd6e08614e5Nate Begeman    unsigned MB, ME;
4690949ed5412c0902113aaefe106fed5b383fcc696Chris Lattner    if (InsertMask && isRunOfOnes(InsertMask, MB, ME)) {
470475871a144eb604ddaf37503397ba0941442e5fbDan Gohman      SDValue Tmp1, Tmp2, Tmp3;
4714667f2cbad246beccfca5411a26add24d1007035Nate Begeman      bool DisjointMask = (TargetMask ^ InsertMask) == 0xFFFFFFFF;
47277f361f5b3ac6ed080d6b0f401b62cd6e08614e5Nate Begeman
47377f361f5b3ac6ed080d6b0f401b62cd6e08614e5Nate Begeman      if ((Op1Opc == ISD::SHL || Op1Opc == ISD::SRL) &&
474c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner          isInt32Immediate(Op1.getOperand(1), Value)) {
47577f361f5b3ac6ed080d6b0f401b62cd6e08614e5Nate Begeman        Op1 = Op1.getOperand(0);
47677f361f5b3ac6ed080d6b0f401b62cd6e08614e5Nate Begeman        SH  = (Op1Opc == ISD::SHL) ? Value : 32 - Value;
47702b88a4586704f34bc65afca3348453eae69d1d3Nate Begeman      }
47877f361f5b3ac6ed080d6b0f401b62cd6e08614e5Nate Begeman      if (Op1Opc == ISD::AND) {
47977f361f5b3ac6ed080d6b0f401b62cd6e08614e5Nate Begeman        unsigned SHOpc = Op1.getOperand(0).getOpcode();
48077f361f5b3ac6ed080d6b0f401b62cd6e08614e5Nate Begeman        if ((SHOpc == ISD::SHL || SHOpc == ISD::SRL) &&
481c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner            isInt32Immediate(Op1.getOperand(0).getOperand(1), Value)) {
48277f361f5b3ac6ed080d6b0f401b62cd6e08614e5Nate Begeman          Op1 = Op1.getOperand(0).getOperand(0);
48377f361f5b3ac6ed080d6b0f401b62cd6e08614e5Nate Begeman          SH  = (SHOpc == ISD::SHL) ? Value : 32 - Value;
48477f361f5b3ac6ed080d6b0f401b62cd6e08614e5Nate Begeman        } else {
48577f361f5b3ac6ed080d6b0f401b62cd6e08614e5Nate Begeman          Op1 = Op1.getOperand(0);
48677f361f5b3ac6ed080d6b0f401b62cd6e08614e5Nate Begeman        }
48702b88a4586704f34bc65afca3348453eae69d1d3Nate Begeman      }
48877f361f5b3ac6ed080d6b0f401b62cd6e08614e5Nate Begeman
48977f361f5b3ac6ed080d6b0f401b62cd6e08614e5Nate Begeman      Tmp3 = (Op0Opc == ISD::AND && DisjointMask) ? Op0.getOperand(0) : Op0;
4900949ed5412c0902113aaefe106fed5b383fcc696Chris Lattner      SH &= 31;
491475871a144eb604ddaf37503397ba0941442e5fbDan Gohman      SDValue Ops[] = { Tmp3, Op1, getI32Imm(SH), getI32Imm(MB),
4920b828e08f94459ac0046b864871d92fed4aaef7cEvan Cheng                          getI32Imm(ME) };
493ed2eee63a6858312ed17582d8cb85a6856d8eb34Dale Johannesen      return CurDAG->getTargetNode(PPC::RLWIMI, dl, MVT::i32, Ops, 5);
49402b88a4586704f34bc65afca3348453eae69d1d3Nate Begeman    }
49502b88a4586704f34bc65afca3348453eae69d1d3Nate Begeman  }
49602b88a4586704f34bc65afca3348453eae69d1d3Nate Begeman  return 0;
49702b88a4586704f34bc65afca3348453eae69d1d3Nate Begeman}
49802b88a4586704f34bc65afca3348453eae69d1d3Nate Begeman
4992fbb4579d6d6bbde8387283b78307c2ea477a312Chris Lattner/// SelectCC - Select a comparison of the specified values with the specified
5002fbb4579d6d6bbde8387283b78307c2ea477a312Chris Lattner/// condition code, returning the CR# of the expression.
501475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue PPCDAGToDAGISel::SelectCC(SDValue LHS, SDValue RHS,
502f5f5dce897269885754fc79adeb809194da52942Dale Johannesen                                    ISD::CondCode CC, DebugLoc dl) {
5032fbb4579d6d6bbde8387283b78307c2ea477a312Chris Lattner  // Always select the LHS.
504c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner  unsigned Opc;
505c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner
506c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner  if (LHS.getValueType() == MVT::i32) {
507529c233498c59a544b26b277f8fe30e6a80cc6f8Chris Lattner    unsigned Imm;
5083836dbd3bde1100c1df847a582784cf83d18daf6Chris Lattner    if (CC == ISD::SETEQ || CC == ISD::SETNE) {
5093836dbd3bde1100c1df847a582784cf83d18daf6Chris Lattner      if (isInt32Immediate(RHS, Imm)) {
5103836dbd3bde1100c1df847a582784cf83d18daf6Chris Lattner        // SETEQ/SETNE comparison with 16-bit immediate, fold it.
5113836dbd3bde1100c1df847a582784cf83d18daf6Chris Lattner        if (isUInt16(Imm))
512f5f5dce897269885754fc79adeb809194da52942Dale Johannesen          return SDValue(CurDAG->getTargetNode(PPC::CMPLWI, dl, MVT::i32, LHS,
5133836dbd3bde1100c1df847a582784cf83d18daf6Chris Lattner                                                 getI32Imm(Imm & 0xFFFF)), 0);
5143836dbd3bde1100c1df847a582784cf83d18daf6Chris Lattner        // If this is a 16-bit signed immediate, fold it.
515aa43e9f73b4ccd700530803803e074eff9b3dca5Chris Lattner        if (isInt16((int)Imm))
516f5f5dce897269885754fc79adeb809194da52942Dale Johannesen          return SDValue(CurDAG->getTargetNode(PPC::CMPWI, dl, MVT::i32, LHS,
5173836dbd3bde1100c1df847a582784cf83d18daf6Chris Lattner                                                 getI32Imm(Imm & 0xFFFF)), 0);
5183836dbd3bde1100c1df847a582784cf83d18daf6Chris Lattner
5193836dbd3bde1100c1df847a582784cf83d18daf6Chris Lattner        // For non-equality comparisons, the default code would materialize the
5203836dbd3bde1100c1df847a582784cf83d18daf6Chris Lattner        // constant, then compare against it, like this:
5213836dbd3bde1100c1df847a582784cf83d18daf6Chris Lattner        //   lis r2, 4660
5223836dbd3bde1100c1df847a582784cf83d18daf6Chris Lattner        //   ori r2, r2, 22136
5233836dbd3bde1100c1df847a582784cf83d18daf6Chris Lattner        //   cmpw cr0, r3, r2
5243836dbd3bde1100c1df847a582784cf83d18daf6Chris Lattner        // Since we are just comparing for equality, we can emit this instead:
5253836dbd3bde1100c1df847a582784cf83d18daf6Chris Lattner        //   xoris r0,r3,0x1234
5263836dbd3bde1100c1df847a582784cf83d18daf6Chris Lattner        //   cmplwi cr0,r0,0x5678
5273836dbd3bde1100c1df847a582784cf83d18daf6Chris Lattner        //   beq cr0,L6
528f5f5dce897269885754fc79adeb809194da52942Dale Johannesen        SDValue Xor(CurDAG->getTargetNode(PPC::XORIS, dl, MVT::i32, LHS,
5293836dbd3bde1100c1df847a582784cf83d18daf6Chris Lattner                                            getI32Imm(Imm >> 16)), 0);
530f5f5dce897269885754fc79adeb809194da52942Dale Johannesen        return SDValue(CurDAG->getTargetNode(PPC::CMPLWI, dl, MVT::i32, Xor,
5313836dbd3bde1100c1df847a582784cf83d18daf6Chris Lattner                                               getI32Imm(Imm & 0xFFFF)), 0);
5323836dbd3bde1100c1df847a582784cf83d18daf6Chris Lattner      }
5333836dbd3bde1100c1df847a582784cf83d18daf6Chris Lattner      Opc = PPC::CMPLW;
5343836dbd3bde1100c1df847a582784cf83d18daf6Chris Lattner    } else if (ISD::isUnsignedIntSetCC(CC)) {
535c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner      if (isInt32Immediate(RHS, Imm) && isUInt16(Imm))
536f5f5dce897269885754fc79adeb809194da52942Dale Johannesen        return SDValue(CurDAG->getTargetNode(PPC::CMPLWI, dl, MVT::i32, LHS,
537c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner                                               getI32Imm(Imm & 0xFFFF)), 0);
538c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner      Opc = PPC::CMPLW;
539c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner    } else {
540c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner      short SImm;
541c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner      if (isIntS16Immediate(RHS, SImm))
542f5f5dce897269885754fc79adeb809194da52942Dale Johannesen        return SDValue(CurDAG->getTargetNode(PPC::CMPWI, dl, MVT::i32, LHS,
543c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner                                               getI32Imm((int)SImm & 0xFFFF)),
544c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner                         0);
545c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner      Opc = PPC::CMPW;
546c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner    }
547c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner  } else if (LHS.getValueType() == MVT::i64) {
548c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner    uint64_t Imm;
549711762497c27357adc1edf8d4237c2770fa303bbChris Lattner    if (CC == ISD::SETEQ || CC == ISD::SETNE) {
550ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif      if (isInt64Immediate(RHS.getNode(), Imm)) {
551711762497c27357adc1edf8d4237c2770fa303bbChris Lattner        // SETEQ/SETNE comparison with 16-bit immediate, fold it.
552711762497c27357adc1edf8d4237c2770fa303bbChris Lattner        if (isUInt16(Imm))
553f5f5dce897269885754fc79adeb809194da52942Dale Johannesen          return SDValue(CurDAG->getTargetNode(PPC::CMPLDI, dl, MVT::i64, LHS,
554711762497c27357adc1edf8d4237c2770fa303bbChris Lattner                                                 getI32Imm(Imm & 0xFFFF)), 0);
555711762497c27357adc1edf8d4237c2770fa303bbChris Lattner        // If this is a 16-bit signed immediate, fold it.
556711762497c27357adc1edf8d4237c2770fa303bbChris Lattner        if (isInt16(Imm))
557f5f5dce897269885754fc79adeb809194da52942Dale Johannesen          return SDValue(CurDAG->getTargetNode(PPC::CMPDI, dl, MVT::i64, LHS,
558711762497c27357adc1edf8d4237c2770fa303bbChris Lattner                                                 getI32Imm(Imm & 0xFFFF)), 0);
559711762497c27357adc1edf8d4237c2770fa303bbChris Lattner
560711762497c27357adc1edf8d4237c2770fa303bbChris Lattner        // For non-equality comparisons, the default code would materialize the
561711762497c27357adc1edf8d4237c2770fa303bbChris Lattner        // constant, then compare against it, like this:
562711762497c27357adc1edf8d4237c2770fa303bbChris Lattner        //   lis r2, 4660
563711762497c27357adc1edf8d4237c2770fa303bbChris Lattner        //   ori r2, r2, 22136
564711762497c27357adc1edf8d4237c2770fa303bbChris Lattner        //   cmpd cr0, r3, r2
565711762497c27357adc1edf8d4237c2770fa303bbChris Lattner        // Since we are just comparing for equality, we can emit this instead:
566711762497c27357adc1edf8d4237c2770fa303bbChris Lattner        //   xoris r0,r3,0x1234
567711762497c27357adc1edf8d4237c2770fa303bbChris Lattner        //   cmpldi cr0,r0,0x5678
568711762497c27357adc1edf8d4237c2770fa303bbChris Lattner        //   beq cr0,L6
569711762497c27357adc1edf8d4237c2770fa303bbChris Lattner        if (isUInt32(Imm)) {
570f5f5dce897269885754fc79adeb809194da52942Dale Johannesen          SDValue Xor(CurDAG->getTargetNode(PPC::XORIS8, dl, MVT::i64, LHS,
571711762497c27357adc1edf8d4237c2770fa303bbChris Lattner                                              getI64Imm(Imm >> 16)), 0);
572f5f5dce897269885754fc79adeb809194da52942Dale Johannesen          return SDValue(CurDAG->getTargetNode(PPC::CMPLDI, dl, MVT::i64, Xor,
573711762497c27357adc1edf8d4237c2770fa303bbChris Lattner                                                 getI64Imm(Imm & 0xFFFF)), 0);
574711762497c27357adc1edf8d4237c2770fa303bbChris Lattner        }
575711762497c27357adc1edf8d4237c2770fa303bbChris Lattner      }
576711762497c27357adc1edf8d4237c2770fa303bbChris Lattner      Opc = PPC::CMPLD;
577711762497c27357adc1edf8d4237c2770fa303bbChris Lattner    } else if (ISD::isUnsignedIntSetCC(CC)) {
578ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif      if (isInt64Immediate(RHS.getNode(), Imm) && isUInt16(Imm))
579f5f5dce897269885754fc79adeb809194da52942Dale Johannesen        return SDValue(CurDAG->getTargetNode(PPC::CMPLDI, dl, MVT::i64, LHS,
580c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner                                               getI64Imm(Imm & 0xFFFF)), 0);
581c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner      Opc = PPC::CMPLD;
582c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner    } else {
583c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner      short SImm;
584c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner      if (isIntS16Immediate(RHS, SImm))
585f5f5dce897269885754fc79adeb809194da52942Dale Johannesen        return SDValue(CurDAG->getTargetNode(PPC::CMPDI, dl, MVT::i64, LHS,
586711762497c27357adc1edf8d4237c2770fa303bbChris Lattner                                               getI64Imm(SImm & 0xFFFF)),
587c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner                         0);
588c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner      Opc = PPC::CMPD;
589c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner    }
590919c032fa4511468aadc6f50d6ed9c50890710b3Chris Lattner  } else if (LHS.getValueType() == MVT::f32) {
591c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner    Opc = PPC::FCMPUS;
5922fbb4579d6d6bbde8387283b78307c2ea477a312Chris Lattner  } else {
593c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner    assert(LHS.getValueType() == MVT::f64 && "Unknown vt!");
594c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner    Opc = PPC::FCMPUD;
5952fbb4579d6d6bbde8387283b78307c2ea477a312Chris Lattner  }
596f5f5dce897269885754fc79adeb809194da52942Dale Johannesen  return SDValue(CurDAG->getTargetNode(Opc, dl, MVT::i32, LHS, RHS), 0);
5972fbb4579d6d6bbde8387283b78307c2ea477a312Chris Lattner}
5982fbb4579d6d6bbde8387283b78307c2ea477a312Chris Lattner
599df4ed6350b2a51f71c0980e86c9078f4046ea706Chris Lattnerstatic PPC::Predicate getPredicateForSetCC(ISD::CondCode CC) {
6002fbb4579d6d6bbde8387283b78307c2ea477a312Chris Lattner  switch (CC) {
6015d634ce466173f6fde49470fad125eb09532caebChris Lattner  case ISD::SETUEQ:
60253e4e4478c69c2c2115db833b54385117c764d14Dale Johannesen  case ISD::SETONE:
60353e4e4478c69c2c2115db833b54385117c764d14Dale Johannesen  case ISD::SETOLE:
60453e4e4478c69c2c2115db833b54385117c764d14Dale Johannesen  case ISD::SETOGE:
605c23197a26f34f559ea9797de51e187087c039c42Torok Edwin    llvm_unreachable("Should be lowered by legalize!");
606c23197a26f34f559ea9797de51e187087c039c42Torok Edwin  default: llvm_unreachable("Unknown condition!");
60753e4e4478c69c2c2115db833b54385117c764d14Dale Johannesen  case ISD::SETOEQ:
608df4ed6350b2a51f71c0980e86c9078f4046ea706Chris Lattner  case ISD::SETEQ:  return PPC::PRED_EQ;
6095d634ce466173f6fde49470fad125eb09532caebChris Lattner  case ISD::SETUNE:
610df4ed6350b2a51f71c0980e86c9078f4046ea706Chris Lattner  case ISD::SETNE:  return PPC::PRED_NE;
61153e4e4478c69c2c2115db833b54385117c764d14Dale Johannesen  case ISD::SETOLT:
612df4ed6350b2a51f71c0980e86c9078f4046ea706Chris Lattner  case ISD::SETLT:  return PPC::PRED_LT;
6132fbb4579d6d6bbde8387283b78307c2ea477a312Chris Lattner  case ISD::SETULE:
614df4ed6350b2a51f71c0980e86c9078f4046ea706Chris Lattner  case ISD::SETLE:  return PPC::PRED_LE;
61553e4e4478c69c2c2115db833b54385117c764d14Dale Johannesen  case ISD::SETOGT:
616df4ed6350b2a51f71c0980e86c9078f4046ea706Chris Lattner  case ISD::SETGT:  return PPC::PRED_GT;
6172fbb4579d6d6bbde8387283b78307c2ea477a312Chris Lattner  case ISD::SETUGE:
618df4ed6350b2a51f71c0980e86c9078f4046ea706Chris Lattner  case ISD::SETGE:  return PPC::PRED_GE;
619df4ed6350b2a51f71c0980e86c9078f4046ea706Chris Lattner  case ISD::SETO:   return PPC::PRED_NU;
620df4ed6350b2a51f71c0980e86c9078f4046ea706Chris Lattner  case ISD::SETUO:  return PPC::PRED_UN;
62153e4e4478c69c2c2115db833b54385117c764d14Dale Johannesen    // These two are invalid for floating point.  Assume we have int.
62253e4e4478c69c2c2115db833b54385117c764d14Dale Johannesen  case ISD::SETULT: return PPC::PRED_LT;
62353e4e4478c69c2c2115db833b54385117c764d14Dale Johannesen  case ISD::SETUGT: return PPC::PRED_GT;
6242fbb4579d6d6bbde8387283b78307c2ea477a312Chris Lattner  }
6252fbb4579d6d6bbde8387283b78307c2ea477a312Chris Lattner}
6262fbb4579d6d6bbde8387283b78307c2ea477a312Chris Lattner
62764906a06b3d1cafec41c6b562f0f8130724decf6Chris Lattner/// getCRIdxForSetCC - Return the index of the condition register field
62864906a06b3d1cafec41c6b562f0f8130724decf6Chris Lattner/// associated with the SetCC condition, and whether or not the field is
62964906a06b3d1cafec41c6b562f0f8130724decf6Chris Lattner/// treated as inverted.  That is, lt = 0; ge = 0 inverted.
630fe39edde27147d4645aff715d5a7630fa07fa885Chris Lattner///
631fe39edde27147d4645aff715d5a7630fa07fa885Chris Lattner/// If this returns with Other != -1, then the returned comparison is an or of
632fe39edde27147d4645aff715d5a7630fa07fa885Chris Lattner/// two simpler comparisons.  In this case, Invert is guaranteed to be false.
633fe39edde27147d4645aff715d5a7630fa07fa885Chris Lattnerstatic unsigned getCRIdxForSetCC(ISD::CondCode CC, bool &Invert, int &Other) {
634fe39edde27147d4645aff715d5a7630fa07fa885Chris Lattner  Invert = false;
635fe39edde27147d4645aff715d5a7630fa07fa885Chris Lattner  Other = -1;
63664906a06b3d1cafec41c6b562f0f8130724decf6Chris Lattner  switch (CC) {
637c23197a26f34f559ea9797de51e187087c039c42Torok Edwin  default: llvm_unreachable("Unknown condition!");
638fe39edde27147d4645aff715d5a7630fa07fa885Chris Lattner  case ISD::SETOLT:
639fe39edde27147d4645aff715d5a7630fa07fa885Chris Lattner  case ISD::SETLT:  return 0;                  // Bit #0 = SETOLT
640fe39edde27147d4645aff715d5a7630fa07fa885Chris Lattner  case ISD::SETOGT:
641fe39edde27147d4645aff715d5a7630fa07fa885Chris Lattner  case ISD::SETGT:  return 1;                  // Bit #1 = SETOGT
642fe39edde27147d4645aff715d5a7630fa07fa885Chris Lattner  case ISD::SETOEQ:
643fe39edde27147d4645aff715d5a7630fa07fa885Chris Lattner  case ISD::SETEQ:  return 2;                  // Bit #2 = SETOEQ
644fe39edde27147d4645aff715d5a7630fa07fa885Chris Lattner  case ISD::SETUO:  return 3;                  // Bit #3 = SETUO
64564906a06b3d1cafec41c6b562f0f8130724decf6Chris Lattner  case ISD::SETUGE:
646fe39edde27147d4645aff715d5a7630fa07fa885Chris Lattner  case ISD::SETGE:  Invert = true; return 0;   // !Bit #0 = SETUGE
64764906a06b3d1cafec41c6b562f0f8130724decf6Chris Lattner  case ISD::SETULE:
648fe39edde27147d4645aff715d5a7630fa07fa885Chris Lattner  case ISD::SETLE:  Invert = true; return 1;   // !Bit #1 = SETULE
6498e2a04e21dc8299bdaba4321a6e690712dab9617Chris Lattner  case ISD::SETUNE:
650fe39edde27147d4645aff715d5a7630fa07fa885Chris Lattner  case ISD::SETNE:  Invert = true; return 2;   // !Bit #2 = SETUNE
651fe39edde27147d4645aff715d5a7630fa07fa885Chris Lattner  case ISD::SETO:   Invert = true; return 3;   // !Bit #3 = SETO
65253e4e4478c69c2c2115db833b54385117c764d14Dale Johannesen  case ISD::SETUEQ:
65353e4e4478c69c2c2115db833b54385117c764d14Dale Johannesen  case ISD::SETOGE:
65453e4e4478c69c2c2115db833b54385117c764d14Dale Johannesen  case ISD::SETOLE:
65553e4e4478c69c2c2115db833b54385117c764d14Dale Johannesen  case ISD::SETONE:
656c23197a26f34f559ea9797de51e187087c039c42Torok Edwin    llvm_unreachable("Invalid branch code: should be expanded by legalize");
65753e4e4478c69c2c2115db833b54385117c764d14Dale Johannesen  // These are invalid for floating point.  Assume integer.
65853e4e4478c69c2c2115db833b54385117c764d14Dale Johannesen  case ISD::SETULT: return 0;
65953e4e4478c69c2c2115db833b54385117c764d14Dale Johannesen  case ISD::SETUGT: return 1;
66064906a06b3d1cafec41c6b562f0f8130724decf6Chris Lattner  }
66164906a06b3d1cafec41c6b562f0f8130724decf6Chris Lattner  return 0;
66264906a06b3d1cafec41c6b562f0f8130724decf6Chris Lattner}
6639944b76cfe74981d2c41c8237d25267ba0c467c7Chris Lattner
664475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDNode *PPCDAGToDAGISel::SelectSETCC(SDValue Op) {
665ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif  SDNode *N = Op.getNode();
666a05dca4f9e051fad19fe9b5f6cce2715c1e5d505Dale Johannesen  DebugLoc dl = N->getDebugLoc();
667222adac30a642b5ea4a916eb3e97d8d95eb32beaChris Lattner  unsigned Imm;
668222adac30a642b5ea4a916eb3e97d8d95eb32beaChris Lattner  ISD::CondCode CC = cast<CondCodeSDNode>(N->getOperand(2))->get();
669c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner  if (isInt32Immediate(N->getOperand(1), Imm)) {
670222adac30a642b5ea4a916eb3e97d8d95eb32beaChris Lattner    // We can codegen setcc op, imm very efficiently compared to a brcond.
671222adac30a642b5ea4a916eb3e97d8d95eb32beaChris Lattner    // Check for those cases here.
672222adac30a642b5ea4a916eb3e97d8d95eb32beaChris Lattner    // setcc op, 0
673222adac30a642b5ea4a916eb3e97d8d95eb32beaChris Lattner    if (Imm == 0) {
674475871a144eb604ddaf37503397ba0941442e5fbDan Gohman      SDValue Op = N->getOperand(0);
675222adac30a642b5ea4a916eb3e97d8d95eb32beaChris Lattner      switch (CC) {
676dabb8291e840053a3d1a2a550d157e9c5c3c38c9Chris Lattner      default: break;
6770b828e08f94459ac0046b864871d92fed4aaef7cEvan Cheng      case ISD::SETEQ: {
678a05dca4f9e051fad19fe9b5f6cce2715c1e5d505Dale Johannesen        Op = SDValue(CurDAG->getTargetNode(PPC::CNTLZW, dl, MVT::i32, Op), 0);
679475871a144eb604ddaf37503397ba0941442e5fbDan Gohman        SDValue Ops[] = { Op, getI32Imm(27), getI32Imm(5), getI32Imm(31) };
6800b828e08f94459ac0046b864871d92fed4aaef7cEvan Cheng        return CurDAG->SelectNodeTo(N, PPC::RLWINM, MVT::i32, Ops, 4);
6810b828e08f94459ac0046b864871d92fed4aaef7cEvan Cheng      }
682dabb8291e840053a3d1a2a550d157e9c5c3c38c9Chris Lattner      case ISD::SETNE: {
683475871a144eb604ddaf37503397ba0941442e5fbDan Gohman        SDValue AD =
684a05dca4f9e051fad19fe9b5f6cce2715c1e5d505Dale Johannesen          SDValue(CurDAG->getTargetNode(PPC::ADDIC, dl, MVT::i32, MVT::Flag,
6857e9b26fc73425ae215fbc9c8010cb53059a93b3aEvan Cheng                                          Op, getI32Imm(~0U)), 0);
68671d3d50b4a2182ce34d383c00a6f0e6231685cbfChris Lattner        return CurDAG->SelectNodeTo(N, PPC::SUBFE, MVT::i32, AD, Op,
68795514bae7309ffacfc0a79b267159dcfde2b7720Evan Cheng                                    AD.getValue(1));
688dabb8291e840053a3d1a2a550d157e9c5c3c38c9Chris Lattner      }
6890b828e08f94459ac0046b864871d92fed4aaef7cEvan Cheng      case ISD::SETLT: {
690475871a144eb604ddaf37503397ba0941442e5fbDan Gohman        SDValue Ops[] = { Op, getI32Imm(1), getI32Imm(31), getI32Imm(31) };
6910b828e08f94459ac0046b864871d92fed4aaef7cEvan Cheng        return CurDAG->SelectNodeTo(N, PPC::RLWINM, MVT::i32, Ops, 4);
6920b828e08f94459ac0046b864871d92fed4aaef7cEvan Cheng      }
693dabb8291e840053a3d1a2a550d157e9c5c3c38c9Chris Lattner      case ISD::SETGT: {
694475871a144eb604ddaf37503397ba0941442e5fbDan Gohman        SDValue T =
695a05dca4f9e051fad19fe9b5f6cce2715c1e5d505Dale Johannesen          SDValue(CurDAG->getTargetNode(PPC::NEG, dl, MVT::i32, Op), 0);
696a05dca4f9e051fad19fe9b5f6cce2715c1e5d505Dale Johannesen        T = SDValue(CurDAG->getTargetNode(PPC::ANDC, dl, MVT::i32, T, Op), 0);
697475871a144eb604ddaf37503397ba0941442e5fbDan Gohman        SDValue Ops[] = { T, getI32Imm(1), getI32Imm(31), getI32Imm(31) };
6980b828e08f94459ac0046b864871d92fed4aaef7cEvan Cheng        return CurDAG->SelectNodeTo(N, PPC::RLWINM, MVT::i32, Ops, 4);
699dabb8291e840053a3d1a2a550d157e9c5c3c38c9Chris Lattner      }
700222adac30a642b5ea4a916eb3e97d8d95eb32beaChris Lattner      }
701222adac30a642b5ea4a916eb3e97d8d95eb32beaChris Lattner    } else if (Imm == ~0U) {        // setcc op, -1
702475871a144eb604ddaf37503397ba0941442e5fbDan Gohman      SDValue Op = N->getOperand(0);
703222adac30a642b5ea4a916eb3e97d8d95eb32beaChris Lattner      switch (CC) {
704dabb8291e840053a3d1a2a550d157e9c5c3c38c9Chris Lattner      default: break;
705dabb8291e840053a3d1a2a550d157e9c5c3c38c9Chris Lattner      case ISD::SETEQ:
706a05dca4f9e051fad19fe9b5f6cce2715c1e5d505Dale Johannesen        Op = SDValue(CurDAG->getTargetNode(PPC::ADDIC, dl, MVT::i32, MVT::Flag,
7077e9b26fc73425ae215fbc9c8010cb53059a93b3aEvan Cheng                                             Op, getI32Imm(1)), 0);
70871d3d50b4a2182ce34d383c00a6f0e6231685cbfChris Lattner        return CurDAG->SelectNodeTo(N, PPC::ADDZE, MVT::i32,
709a05dca4f9e051fad19fe9b5f6cce2715c1e5d505Dale Johannesen                              SDValue(CurDAG->getTargetNode(PPC::LI, dl,
710a05dca4f9e051fad19fe9b5f6cce2715c1e5d505Dale Johannesen                                                            MVT::i32,
711a05dca4f9e051fad19fe9b5f6cce2715c1e5d505Dale Johannesen                                                            getI32Imm(0)), 0),
712a05dca4f9e051fad19fe9b5f6cce2715c1e5d505Dale Johannesen                                      Op.getValue(1));
713dabb8291e840053a3d1a2a550d157e9c5c3c38c9Chris Lattner      case ISD::SETNE: {
714a05dca4f9e051fad19fe9b5f6cce2715c1e5d505Dale Johannesen        Op = SDValue(CurDAG->getTargetNode(PPC::NOR, dl, MVT::i32, Op, Op), 0);
715a05dca4f9e051fad19fe9b5f6cce2715c1e5d505Dale Johannesen        SDNode *AD = CurDAG->getTargetNode(PPC::ADDIC, dl, MVT::i32, MVT::Flag,
7167e9b26fc73425ae215fbc9c8010cb53059a93b3aEvan Cheng                                           Op, getI32Imm(~0U));
717475871a144eb604ddaf37503397ba0941442e5fbDan Gohman        return CurDAG->SelectNodeTo(N, PPC::SUBFE, MVT::i32, SDValue(AD, 0),
718475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                                    Op, SDValue(AD, 1));
719dabb8291e840053a3d1a2a550d157e9c5c3c38c9Chris Lattner      }
720dabb8291e840053a3d1a2a550d157e9c5c3c38c9Chris Lattner      case ISD::SETLT: {
721a05dca4f9e051fad19fe9b5f6cce2715c1e5d505Dale Johannesen        SDValue AD = SDValue(CurDAG->getTargetNode(PPC::ADDI, dl, MVT::i32, Op,
7227e9b26fc73425ae215fbc9c8010cb53059a93b3aEvan Cheng                                                       getI32Imm(1)), 0);
723a05dca4f9e051fad19fe9b5f6cce2715c1e5d505Dale Johannesen        SDValue AN = SDValue(CurDAG->getTargetNode(PPC::AND, dl, MVT::i32, AD,
7247e9b26fc73425ae215fbc9c8010cb53059a93b3aEvan Cheng                                                       Op), 0);
725475871a144eb604ddaf37503397ba0941442e5fbDan Gohman        SDValue Ops[] = { AN, getI32Imm(1), getI32Imm(31), getI32Imm(31) };
7260b828e08f94459ac0046b864871d92fed4aaef7cEvan Cheng        return CurDAG->SelectNodeTo(N, PPC::RLWINM, MVT::i32, Ops, 4);
727dabb8291e840053a3d1a2a550d157e9c5c3c38c9Chris Lattner      }
7280b828e08f94459ac0046b864871d92fed4aaef7cEvan Cheng      case ISD::SETGT: {
729475871a144eb604ddaf37503397ba0941442e5fbDan Gohman        SDValue Ops[] = { Op, getI32Imm(1), getI32Imm(31), getI32Imm(31) };
730a05dca4f9e051fad19fe9b5f6cce2715c1e5d505Dale Johannesen        Op = SDValue(CurDAG->getTargetNode(PPC::RLWINM, dl, MVT::i32, Ops, 4),
731a05dca4f9e051fad19fe9b5f6cce2715c1e5d505Dale Johannesen                     0);
732ccbe2ec890ca41b8fd8c4e8ef0f7bcb42c2f69ecChris Lattner        return CurDAG->SelectNodeTo(N, PPC::XORI, MVT::i32, Op,
73395514bae7309ffacfc0a79b267159dcfde2b7720Evan Cheng                                    getI32Imm(1));
734222adac30a642b5ea4a916eb3e97d8d95eb32beaChris Lattner      }
7350b828e08f94459ac0046b864871d92fed4aaef7cEvan Cheng      }
736222adac30a642b5ea4a916eb3e97d8d95eb32beaChris Lattner    }
737222adac30a642b5ea4a916eb3e97d8d95eb32beaChris Lattner  }
738222adac30a642b5ea4a916eb3e97d8d95eb32beaChris Lattner
739222adac30a642b5ea4a916eb3e97d8d95eb32beaChris Lattner  bool Inv;
740fe39edde27147d4645aff715d5a7630fa07fa885Chris Lattner  int OtherCondIdx;
741fe39edde27147d4645aff715d5a7630fa07fa885Chris Lattner  unsigned Idx = getCRIdxForSetCC(CC, Inv, OtherCondIdx);
742f5f5dce897269885754fc79adeb809194da52942Dale Johannesen  SDValue CCReg = SelectCC(N->getOperand(0), N->getOperand(1), CC, dl);
743475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue IntCR;
744222adac30a642b5ea4a916eb3e97d8d95eb32beaChris Lattner
745222adac30a642b5ea4a916eb3e97d8d95eb32beaChris Lattner  // Force the ccreg into CR7.
746475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue CR7Reg = CurDAG->getRegister(PPC::CR7, MVT::i32);
747222adac30a642b5ea4a916eb3e97d8d95eb32beaChris Lattner
748475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue InFlag(0, 0);  // Null incoming flag value.
749a05dca4f9e051fad19fe9b5f6cce2715c1e5d505Dale Johannesen  CCReg = CurDAG->getCopyToReg(CurDAG->getEntryNode(), dl, CR7Reg, CCReg,
750db1cb2b3a15301c000c2bc5a99d5807510b2a456Chris Lattner                               InFlag).getValue(1);
751222adac30a642b5ea4a916eb3e97d8d95eb32beaChris Lattner
752fe39edde27147d4645aff715d5a7630fa07fa885Chris Lattner  if (PPCSubTarget.isGigaProcessor() && OtherCondIdx == -1)
753a05dca4f9e051fad19fe9b5f6cce2715c1e5d505Dale Johannesen    IntCR = SDValue(CurDAG->getTargetNode(PPC::MFOCRF, dl, MVT::i32, CR7Reg,
7547e9b26fc73425ae215fbc9c8010cb53059a93b3aEvan Cheng                                            CCReg), 0);
755222adac30a642b5ea4a916eb3e97d8d95eb32beaChris Lattner  else
756a05dca4f9e051fad19fe9b5f6cce2715c1e5d505Dale Johannesen    IntCR = SDValue(CurDAG->getTargetNode(PPC::MFCR, dl, MVT::i32, CCReg), 0);
757222adac30a642b5ea4a916eb3e97d8d95eb32beaChris Lattner
758475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Ops[] = { IntCR, getI32Imm((32-(3-Idx)) & 31),
7590b828e08f94459ac0046b864871d92fed4aaef7cEvan Cheng                      getI32Imm(31), getI32Imm(31) };
760fe39edde27147d4645aff715d5a7630fa07fa885Chris Lattner  if (OtherCondIdx == -1 && !Inv)
7610b828e08f94459ac0046b864871d92fed4aaef7cEvan Cheng    return CurDAG->SelectNodeTo(N, PPC::RLWINM, MVT::i32, Ops, 4);
762fe39edde27147d4645aff715d5a7630fa07fa885Chris Lattner
763fe39edde27147d4645aff715d5a7630fa07fa885Chris Lattner  // Get the specified bit.
764475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Tmp =
765a05dca4f9e051fad19fe9b5f6cce2715c1e5d505Dale Johannesen    SDValue(CurDAG->getTargetNode(PPC::RLWINM, dl, MVT::i32, Ops, 4), 0);
766fe39edde27147d4645aff715d5a7630fa07fa885Chris Lattner  if (Inv) {
767fe39edde27147d4645aff715d5a7630fa07fa885Chris Lattner    assert(OtherCondIdx == -1 && "Can't have split plus negation");
76895514bae7309ffacfc0a79b267159dcfde2b7720Evan Cheng    return CurDAG->SelectNodeTo(N, PPC::XORI, MVT::i32, Tmp, getI32Imm(1));
769222adac30a642b5ea4a916eb3e97d8d95eb32beaChris Lattner  }
770fe39edde27147d4645aff715d5a7630fa07fa885Chris Lattner
771fe39edde27147d4645aff715d5a7630fa07fa885Chris Lattner  // Otherwise, we have to turn an operation like SETONE -> SETOLT | SETOGT.
772fe39edde27147d4645aff715d5a7630fa07fa885Chris Lattner  // We already got the bit for the first part of the comparison (e.g. SETULE).
773fe39edde27147d4645aff715d5a7630fa07fa885Chris Lattner
774fe39edde27147d4645aff715d5a7630fa07fa885Chris Lattner  // Get the other bit of the comparison.
775fe39edde27147d4645aff715d5a7630fa07fa885Chris Lattner  Ops[1] = getI32Imm((32-(3-OtherCondIdx)) & 31);
776475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue OtherCond =
777a05dca4f9e051fad19fe9b5f6cce2715c1e5d505Dale Johannesen    SDValue(CurDAG->getTargetNode(PPC::RLWINM, dl, MVT::i32, Ops, 4), 0);
778fe39edde27147d4645aff715d5a7630fa07fa885Chris Lattner
779fe39edde27147d4645aff715d5a7630fa07fa885Chris Lattner  return CurDAG->SelectNodeTo(N, PPC::OR, MVT::i32, Tmp, OtherCond);
780222adac30a642b5ea4a916eb3e97d8d95eb32beaChris Lattner}
7812b63e4c5e2281ebc5575be3339d311d34f850b3bChris Lattner
7826a16f6a14f344eb49a218b3fe159858e95d73e94Chris Lattner
783a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner// Select - Convert the specified operand from a target-independent to a
784a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner// target-specific node if it hasn't already been changed.
785475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDNode *PPCDAGToDAGISel::Select(SDValue Op) {
786ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif  SDNode *N = Op.getNode();
787ed2eee63a6858312ed17582d8cb85a6856d8eb34Dale Johannesen  DebugLoc dl = Op.getDebugLoc();
788e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  if (N->isMachineOpcode())
78964a752f7c7cf160f2887d0a16d5922359832c9c2Evan Cheng    return NULL;   // Already selected.
790d3d2cf52bbb776941bf8cb03d8732ff3f407cdeaChris Lattner
791a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  switch (N->getOpcode()) {
79219c0907ba1c11c81dc231cf7b4143fdaf03466e4Chris Lattner  default: break;
79378f97f3118c0d7fbebf4084e24689c596d5e4fb7Jim Laskey
79478f97f3118c0d7fbebf4084e24689c596d5e4fb7Jim Laskey  case ISD::Constant: {
79578f97f3118c0d7fbebf4084e24689c596d5e4fb7Jim Laskey    if (N->getValueType(0) == MVT::i64) {
79678f97f3118c0d7fbebf4084e24689c596d5e4fb7Jim Laskey      // Get 64 bit value.
797f5aeb1a8e4cf272c7348376d185ef8d8267653e0Dan Gohman      int64_t Imm = cast<ConstantSDNode>(N)->getZExtValue();
79878f97f3118c0d7fbebf4084e24689c596d5e4fb7Jim Laskey      // Assume no remaining bits.
79978f97f3118c0d7fbebf4084e24689c596d5e4fb7Jim Laskey      unsigned Remainder = 0;
80078f97f3118c0d7fbebf4084e24689c596d5e4fb7Jim Laskey      // Assume no shift required.
80178f97f3118c0d7fbebf4084e24689c596d5e4fb7Jim Laskey      unsigned Shift = 0;
80278f97f3118c0d7fbebf4084e24689c596d5e4fb7Jim Laskey
80378f97f3118c0d7fbebf4084e24689c596d5e4fb7Jim Laskey      // If it can't be represented as a 32 bit value.
80478f97f3118c0d7fbebf4084e24689c596d5e4fb7Jim Laskey      if (!isInt32(Imm)) {
80578f97f3118c0d7fbebf4084e24689c596d5e4fb7Jim Laskey        Shift = CountTrailingZeros_64(Imm);
80678f97f3118c0d7fbebf4084e24689c596d5e4fb7Jim Laskey        int64_t ImmSh = static_cast<uint64_t>(Imm) >> Shift;
80778f97f3118c0d7fbebf4084e24689c596d5e4fb7Jim Laskey
80878f97f3118c0d7fbebf4084e24689c596d5e4fb7Jim Laskey        // If the shifted value fits 32 bits.
80978f97f3118c0d7fbebf4084e24689c596d5e4fb7Jim Laskey        if (isInt32(ImmSh)) {
81078f97f3118c0d7fbebf4084e24689c596d5e4fb7Jim Laskey          // Go with the shifted value.
81178f97f3118c0d7fbebf4084e24689c596d5e4fb7Jim Laskey          Imm = ImmSh;
81278f97f3118c0d7fbebf4084e24689c596d5e4fb7Jim Laskey        } else {
81378f97f3118c0d7fbebf4084e24689c596d5e4fb7Jim Laskey          // Still stuck with a 64 bit value.
81478f97f3118c0d7fbebf4084e24689c596d5e4fb7Jim Laskey          Remainder = Imm;
81578f97f3118c0d7fbebf4084e24689c596d5e4fb7Jim Laskey          Shift = 32;
81678f97f3118c0d7fbebf4084e24689c596d5e4fb7Jim Laskey          Imm >>= 32;
81778f97f3118c0d7fbebf4084e24689c596d5e4fb7Jim Laskey        }
81878f97f3118c0d7fbebf4084e24689c596d5e4fb7Jim Laskey      }
81978f97f3118c0d7fbebf4084e24689c596d5e4fb7Jim Laskey
82078f97f3118c0d7fbebf4084e24689c596d5e4fb7Jim Laskey      // Intermediate operand.
82178f97f3118c0d7fbebf4084e24689c596d5e4fb7Jim Laskey      SDNode *Result;
82278f97f3118c0d7fbebf4084e24689c596d5e4fb7Jim Laskey
82378f97f3118c0d7fbebf4084e24689c596d5e4fb7Jim Laskey      // Handle first 32 bits.
82478f97f3118c0d7fbebf4084e24689c596d5e4fb7Jim Laskey      unsigned Lo = Imm & 0xFFFF;
82578f97f3118c0d7fbebf4084e24689c596d5e4fb7Jim Laskey      unsigned Hi = (Imm >> 16) & 0xFFFF;
82678f97f3118c0d7fbebf4084e24689c596d5e4fb7Jim Laskey
82778f97f3118c0d7fbebf4084e24689c596d5e4fb7Jim Laskey      // Simple value.
82878f97f3118c0d7fbebf4084e24689c596d5e4fb7Jim Laskey      if (isInt16(Imm)) {
82978f97f3118c0d7fbebf4084e24689c596d5e4fb7Jim Laskey       // Just the Lo bits.
830ed2eee63a6858312ed17582d8cb85a6856d8eb34Dale Johannesen        Result = CurDAG->getTargetNode(PPC::LI8, dl, MVT::i64, getI32Imm(Lo));
83178f97f3118c0d7fbebf4084e24689c596d5e4fb7Jim Laskey      } else if (Lo) {
83278f97f3118c0d7fbebf4084e24689c596d5e4fb7Jim Laskey        // Handle the Hi bits.
83378f97f3118c0d7fbebf4084e24689c596d5e4fb7Jim Laskey        unsigned OpC = Hi ? PPC::LIS8 : PPC::LI8;
834ed2eee63a6858312ed17582d8cb85a6856d8eb34Dale Johannesen        Result = CurDAG->getTargetNode(OpC, dl, MVT::i64, getI32Imm(Hi));
83578f97f3118c0d7fbebf4084e24689c596d5e4fb7Jim Laskey        // And Lo bits.
836ed2eee63a6858312ed17582d8cb85a6856d8eb34Dale Johannesen        Result = CurDAG->getTargetNode(PPC::ORI8, dl, MVT::i64,
837475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                                       SDValue(Result, 0), getI32Imm(Lo));
83878f97f3118c0d7fbebf4084e24689c596d5e4fb7Jim Laskey      } else {
83978f97f3118c0d7fbebf4084e24689c596d5e4fb7Jim Laskey       // Just the Hi bits.
840ed2eee63a6858312ed17582d8cb85a6856d8eb34Dale Johannesen        Result = CurDAG->getTargetNode(PPC::LIS8, dl, MVT::i64, getI32Imm(Hi));
84178f97f3118c0d7fbebf4084e24689c596d5e4fb7Jim Laskey      }
84278f97f3118c0d7fbebf4084e24689c596d5e4fb7Jim Laskey
84378f97f3118c0d7fbebf4084e24689c596d5e4fb7Jim Laskey      // If no shift, we're done.
84478f97f3118c0d7fbebf4084e24689c596d5e4fb7Jim Laskey      if (!Shift) return Result;
84578f97f3118c0d7fbebf4084e24689c596d5e4fb7Jim Laskey
84678f97f3118c0d7fbebf4084e24689c596d5e4fb7Jim Laskey      // Shift for next step if the upper 32-bits were not zero.
84778f97f3118c0d7fbebf4084e24689c596d5e4fb7Jim Laskey      if (Imm) {
848ed2eee63a6858312ed17582d8cb85a6856d8eb34Dale Johannesen        Result = CurDAG->getTargetNode(PPC::RLDICR, dl, MVT::i64,
849475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                                       SDValue(Result, 0),
85078f97f3118c0d7fbebf4084e24689c596d5e4fb7Jim Laskey                                       getI32Imm(Shift), getI32Imm(63 - Shift));
85178f97f3118c0d7fbebf4084e24689c596d5e4fb7Jim Laskey      }
85278f97f3118c0d7fbebf4084e24689c596d5e4fb7Jim Laskey
85378f97f3118c0d7fbebf4084e24689c596d5e4fb7Jim Laskey      // Add in the last bits as required.
85478f97f3118c0d7fbebf4084e24689c596d5e4fb7Jim Laskey      if ((Hi = (Remainder >> 16) & 0xFFFF)) {
855ed2eee63a6858312ed17582d8cb85a6856d8eb34Dale Johannesen        Result = CurDAG->getTargetNode(PPC::ORIS8, dl, MVT::i64,
856475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                                       SDValue(Result, 0), getI32Imm(Hi));
85778f97f3118c0d7fbebf4084e24689c596d5e4fb7Jim Laskey      }
85878f97f3118c0d7fbebf4084e24689c596d5e4fb7Jim Laskey      if ((Lo = Remainder & 0xFFFF)) {
859ed2eee63a6858312ed17582d8cb85a6856d8eb34Dale Johannesen        Result = CurDAG->getTargetNode(PPC::ORI8, dl, MVT::i64,
860475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                                       SDValue(Result, 0), getI32Imm(Lo));
86178f97f3118c0d7fbebf4084e24689c596d5e4fb7Jim Laskey      }
86278f97f3118c0d7fbebf4084e24689c596d5e4fb7Jim Laskey
86378f97f3118c0d7fbebf4084e24689c596d5e4fb7Jim Laskey      return Result;
86478f97f3118c0d7fbebf4084e24689c596d5e4fb7Jim Laskey    }
86578f97f3118c0d7fbebf4084e24689c596d5e4fb7Jim Laskey    break;
86678f97f3118c0d7fbebf4084e24689c596d5e4fb7Jim Laskey  }
86778f97f3118c0d7fbebf4084e24689c596d5e4fb7Jim Laskey
86834167215a8da717b21e44f1b834dc34d15279bf1Evan Cheng  case ISD::SETCC:
869ccbe2ec890ca41b8fd8c4e8ef0f7bcb42c2f69ecChris Lattner    return SelectSETCC(Op);
87034167215a8da717b21e44f1b834dc34d15279bf1Evan Cheng  case PPCISD::GlobalBaseReg:
8719ade218533429146731213eacb7e12060e65ff58Evan Cheng    return getGlobalBaseReg();
872860e8862c1fbd3b261da4a64a8c0096f9f373681Chris Lattner
873e28e40a2733c5d9a568d1569e2d1d8461716b22dChris Lattner  case ISD::FrameIndex: {
874e28e40a2733c5d9a568d1569e2d1d8461716b22dChris Lattner    int FI = cast<FrameIndexSDNode>(N)->getIndex();
875475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue TFI = CurDAG->getTargetFrameIndex(FI, Op.getValueType());
876c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner    unsigned Opc = Op.getValueType() == MVT::i32 ? PPC::ADDI : PPC::ADDI8;
877ccbe2ec890ca41b8fd8c4e8ef0f7bcb42c2f69ecChris Lattner    if (N->hasOneUse())
878ccbe2ec890ca41b8fd8c4e8ef0f7bcb42c2f69ecChris Lattner      return CurDAG->SelectNodeTo(N, Opc, Op.getValueType(), TFI,
87995514bae7309ffacfc0a79b267159dcfde2b7720Evan Cheng                                  getSmallIPtrImm(0));
880ed2eee63a6858312ed17582d8cb85a6856d8eb34Dale Johannesen    return CurDAG->getTargetNode(Opc, dl, Op.getValueType(), TFI,
881ccbe2ec890ca41b8fd8c4e8ef0f7bcb42c2f69ecChris Lattner                                 getSmallIPtrImm(0));
882e28e40a2733c5d9a568d1569e2d1d8461716b22dChris Lattner  }
8836d92caddc4aa5fc946b294259e00cc35536e61e8Chris Lattner
8846d92caddc4aa5fc946b294259e00cc35536e61e8Chris Lattner  case PPCISD::MFCR: {
885475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue InFlag = N->getOperand(1);
8866d92caddc4aa5fc946b294259e00cc35536e61e8Chris Lattner    // Use MFOCRF if supported.
887152b7e18748f7e06a93260f22cc9dac8eb3abee2Evan Cheng    if (PPCSubTarget.isGigaProcessor())
888ed2eee63a6858312ed17582d8cb85a6856d8eb34Dale Johannesen      return CurDAG->getTargetNode(PPC::MFOCRF, dl, MVT::i32,
889ccbe2ec890ca41b8fd8c4e8ef0f7bcb42c2f69ecChris Lattner                                   N->getOperand(0), InFlag);
8906d92caddc4aa5fc946b294259e00cc35536e61e8Chris Lattner    else
891ed2eee63a6858312ed17582d8cb85a6856d8eb34Dale Johannesen      return CurDAG->getTargetNode(PPC::MFCR, dl, MVT::i32, InFlag);
8926d92caddc4aa5fc946b294259e00cc35536e61e8Chris Lattner  }
8936d92caddc4aa5fc946b294259e00cc35536e61e8Chris Lattner
89488add100b3db715df4275c8ab408e6b51f28ff8fChris Lattner  case ISD::SDIV: {
895405e3ecb563f21e7b4ee30f0de57821f3eb91219Nate Begeman    // FIXME: since this depends on the setting of the carry flag from the srawi
896405e3ecb563f21e7b4ee30f0de57821f3eb91219Nate Begeman    //        we should really be making notes about that for the scheduler.
897405e3ecb563f21e7b4ee30f0de57821f3eb91219Nate Begeman    // FIXME: It sure would be nice if we could cheaply recognize the
898405e3ecb563f21e7b4ee30f0de57821f3eb91219Nate Begeman    //        srl/add/sra pattern the dag combiner will generate for this as
899405e3ecb563f21e7b4ee30f0de57821f3eb91219Nate Begeman    //        sra/addze rather than having to handle sdiv ourselves.  oh well.
9008784a23075f8544f78f8b46cfd10457c1109d433Chris Lattner    unsigned Imm;
901c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner    if (isInt32Immediate(N->getOperand(1), Imm)) {
902475871a144eb604ddaf37503397ba0941442e5fbDan Gohman      SDValue N0 = N->getOperand(0);
9038784a23075f8544f78f8b46cfd10457c1109d433Chris Lattner      if ((signed)Imm > 0 && isPowerOf2_32(Imm)) {
9047e9b26fc73425ae215fbc9c8010cb53059a93b3aEvan Cheng        SDNode *Op =
905ed2eee63a6858312ed17582d8cb85a6856d8eb34Dale Johannesen          CurDAG->getTargetNode(PPC::SRAWI, dl, MVT::i32, MVT::Flag,
90634167215a8da717b21e44f1b834dc34d15279bf1Evan Cheng                                N0, getI32Imm(Log2_32(Imm)));
907ccbe2ec890ca41b8fd8c4e8ef0f7bcb42c2f69ecChris Lattner        return CurDAG->SelectNodeTo(N, PPC::ADDZE, MVT::i32,
908475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                                    SDValue(Op, 0), SDValue(Op, 1));
9098784a23075f8544f78f8b46cfd10457c1109d433Chris Lattner      } else if ((signed)Imm < 0 && isPowerOf2_32(-Imm)) {
9107e9b26fc73425ae215fbc9c8010cb53059a93b3aEvan Cheng        SDNode *Op =
911ed2eee63a6858312ed17582d8cb85a6856d8eb34Dale Johannesen          CurDAG->getTargetNode(PPC::SRAWI, dl, MVT::i32, MVT::Flag,
91234167215a8da717b21e44f1b834dc34d15279bf1Evan Cheng                                N0, getI32Imm(Log2_32(-Imm)));
913475871a144eb604ddaf37503397ba0941442e5fbDan Gohman        SDValue PT =
914ed2eee63a6858312ed17582d8cb85a6856d8eb34Dale Johannesen          SDValue(CurDAG->getTargetNode(PPC::ADDZE, dl, MVT::i32,
915475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                                          SDValue(Op, 0), SDValue(Op, 1)),
9167e9b26fc73425ae215fbc9c8010cb53059a93b3aEvan Cheng                    0);
91795514bae7309ffacfc0a79b267159dcfde2b7720Evan Cheng        return CurDAG->SelectNodeTo(N, PPC::NEG, MVT::i32, PT);
9188784a23075f8544f78f8b46cfd10457c1109d433Chris Lattner      }
9198784a23075f8544f78f8b46cfd10457c1109d433Chris Lattner    }
920047b952e298352fe6feffedf02e359601133f465Chris Lattner
921237733e9335f4d2bb16a818ab184929e12fae407Chris Lattner    // Other cases are autogenerated.
922237733e9335f4d2bb16a818ab184929e12fae407Chris Lattner    break;
923047b952e298352fe6feffedf02e359601133f465Chris Lattner  }
9244eab71497d10622bd209c53f8e56152877ac5638Chris Lattner
9254eab71497d10622bd209c53f8e56152877ac5638Chris Lattner  case ISD::LOAD: {
9264eab71497d10622bd209c53f8e56152877ac5638Chris Lattner    // Handle preincrement loads.
9274eab71497d10622bd209c53f8e56152877ac5638Chris Lattner    LoadSDNode *LD = cast<LoadSDNode>(Op);
92883ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands    MVT LoadedVT = LD->getMemoryVT();
9294eab71497d10622bd209c53f8e56152877ac5638Chris Lattner
9304eab71497d10622bd209c53f8e56152877ac5638Chris Lattner    // Normal loads are handled by code generated from the .td file.
9314eab71497d10622bd209c53f8e56152877ac5638Chris Lattner    if (LD->getAddressingMode() != ISD::PRE_INC)
9324eab71497d10622bd209c53f8e56152877ac5638Chris Lattner      break;
9334eab71497d10622bd209c53f8e56152877ac5638Chris Lattner
934475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue Offset = LD->getOffset();
9355b3bbc7cd7bff4275b94003d4bf1fa296c6a10d0Chris Lattner    if (isa<ConstantSDNode>(Offset) ||
9365b3bbc7cd7bff4275b94003d4bf1fa296c6a10d0Chris Lattner        Offset.getOpcode() == ISD::TargetGlobalAddress) {
9370851b4f3eda110cc21c8d4b59f0d55bc84d9d088Chris Lattner
9380851b4f3eda110cc21c8d4b59f0d55bc84d9d088Chris Lattner      unsigned Opcode;
9390851b4f3eda110cc21c8d4b59f0d55bc84d9d088Chris Lattner      bool isSExt = LD->getExtensionType() == ISD::SEXTLOAD;
9400851b4f3eda110cc21c8d4b59f0d55bc84d9d088Chris Lattner      if (LD->getValueType(0) != MVT::i64) {
9410851b4f3eda110cc21c8d4b59f0d55bc84d9d088Chris Lattner        // Handle PPC32 integer and normal FP loads.
9427c1c261272b43f2a9397c3052819b92c53918075Anton Korobeynikov        assert((!isSExt || LoadedVT == MVT::i16) && "Invalid sext update load");
94383ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands        switch (LoadedVT.getSimpleVT()) {
944c23197a26f34f559ea9797de51e187087c039c42Torok Edwin          default: llvm_unreachable("Invalid PPC load type!");
9450851b4f3eda110cc21c8d4b59f0d55bc84d9d088Chris Lattner          case MVT::f64: Opcode = PPC::LFDU; break;
9460851b4f3eda110cc21c8d4b59f0d55bc84d9d088Chris Lattner          case MVT::f32: Opcode = PPC::LFSU; break;
9470851b4f3eda110cc21c8d4b59f0d55bc84d9d088Chris Lattner          case MVT::i32: Opcode = PPC::LWZU; break;
9480851b4f3eda110cc21c8d4b59f0d55bc84d9d088Chris Lattner          case MVT::i16: Opcode = isSExt ? PPC::LHAU : PPC::LHZU; break;
9490851b4f3eda110cc21c8d4b59f0d55bc84d9d088Chris Lattner          case MVT::i1:
9500851b4f3eda110cc21c8d4b59f0d55bc84d9d088Chris Lattner          case MVT::i8:  Opcode = PPC::LBZU; break;
9510851b4f3eda110cc21c8d4b59f0d55bc84d9d088Chris Lattner        }
9520851b4f3eda110cc21c8d4b59f0d55bc84d9d088Chris Lattner      } else {
9530851b4f3eda110cc21c8d4b59f0d55bc84d9d088Chris Lattner        assert(LD->getValueType(0) == MVT::i64 && "Unknown load result type!");
9547c1c261272b43f2a9397c3052819b92c53918075Anton Korobeynikov        assert((!isSExt || LoadedVT == MVT::i16) && "Invalid sext update load");
95583ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands        switch (LoadedVT.getSimpleVT()) {
956c23197a26f34f559ea9797de51e187087c039c42Torok Edwin          default: llvm_unreachable("Invalid PPC load type!");
9570851b4f3eda110cc21c8d4b59f0d55bc84d9d088Chris Lattner          case MVT::i64: Opcode = PPC::LDU; break;
9580851b4f3eda110cc21c8d4b59f0d55bc84d9d088Chris Lattner          case MVT::i32: Opcode = PPC::LWZU8; break;
9590851b4f3eda110cc21c8d4b59f0d55bc84d9d088Chris Lattner          case MVT::i16: Opcode = isSExt ? PPC::LHAU8 : PPC::LHZU8; break;
9600851b4f3eda110cc21c8d4b59f0d55bc84d9d088Chris Lattner          case MVT::i1:
9610851b4f3eda110cc21c8d4b59f0d55bc84d9d088Chris Lattner          case MVT::i8:  Opcode = PPC::LBZU8; break;
9620851b4f3eda110cc21c8d4b59f0d55bc84d9d088Chris Lattner        }
9630851b4f3eda110cc21c8d4b59f0d55bc84d9d088Chris Lattner      }
9640851b4f3eda110cc21c8d4b59f0d55bc84d9d088Chris Lattner
965475871a144eb604ddaf37503397ba0941442e5fbDan Gohman      SDValue Chain = LD->getChain();
966475871a144eb604ddaf37503397ba0941442e5fbDan Gohman      SDValue Base = LD->getBasePtr();
967475871a144eb604ddaf37503397ba0941442e5fbDan Gohman      SDValue Ops[] = { Offset, Base, Chain };
9684eab71497d10622bd209c53f8e56152877ac5638Chris Lattner      // FIXME: PPC64
969ed2eee63a6858312ed17582d8cb85a6856d8eb34Dale Johannesen      return CurDAG->getTargetNode(Opcode, dl, LD->getValueType(0),
970e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman                                   PPCLowering.getPointerTy(),
9714eab71497d10622bd209c53f8e56152877ac5638Chris Lattner                                   MVT::Other, Ops, 3);
9724eab71497d10622bd209c53f8e56152877ac5638Chris Lattner    } else {
973c23197a26f34f559ea9797de51e187087c039c42Torok Edwin      llvm_unreachable("R+R preindex loads not supported yet!");
9744eab71497d10622bd209c53f8e56152877ac5638Chris Lattner    }
9754eab71497d10622bd209c53f8e56152877ac5638Chris Lattner  }
9764eab71497d10622bd209c53f8e56152877ac5638Chris Lattner
977cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman  case ISD::AND: {
978f42f133938545d4f5c249bcfef63db772ce8e942Nate Begeman    unsigned Imm, Imm2, SH, MB, ME;
979f42f133938545d4f5c249bcfef63db772ce8e942Nate Begeman
980cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman    // If this is an and of a value rotated between 0 and 31 bits and then and'd
981cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman    // with a mask, emit rlwinm
982c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner    if (isInt32Immediate(N->getOperand(1), Imm) &&
983ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif        isRotateAndMask(N->getOperand(0).getNode(), Imm, false, SH, MB, ME)) {
984475871a144eb604ddaf37503397ba0941442e5fbDan Gohman      SDValue Val = N->getOperand(0).getOperand(0);
985475871a144eb604ddaf37503397ba0941442e5fbDan Gohman      SDValue Ops[] = { Val, getI32Imm(SH), getI32Imm(MB), getI32Imm(ME) };
9860b828e08f94459ac0046b864871d92fed4aaef7cEvan Cheng      return CurDAG->SelectNodeTo(N, PPC::RLWINM, MVT::i32, Ops, 4);
987cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman    }
988f42f133938545d4f5c249bcfef63db772ce8e942Nate Begeman    // If this is just a masked value where the input is not handled above, and
989f42f133938545d4f5c249bcfef63db772ce8e942Nate Begeman    // is not a rotate-left (handled by a pattern in the .td file), emit rlwinm
990f42f133938545d4f5c249bcfef63db772ce8e942Nate Begeman    if (isInt32Immediate(N->getOperand(1), Imm) &&
991f42f133938545d4f5c249bcfef63db772ce8e942Nate Begeman        isRunOfOnes(Imm, MB, ME) &&
992f42f133938545d4f5c249bcfef63db772ce8e942Nate Begeman        N->getOperand(0).getOpcode() != ISD::ROTL) {
993475871a144eb604ddaf37503397ba0941442e5fbDan Gohman      SDValue Val = N->getOperand(0);
994475871a144eb604ddaf37503397ba0941442e5fbDan Gohman      SDValue Ops[] = { Val, getI32Imm(0), getI32Imm(MB), getI32Imm(ME) };
995f42f133938545d4f5c249bcfef63db772ce8e942Nate Begeman      return CurDAG->SelectNodeTo(N, PPC::RLWINM, MVT::i32, Ops, 4);
996f42f133938545d4f5c249bcfef63db772ce8e942Nate Begeman    }
997f42f133938545d4f5c249bcfef63db772ce8e942Nate Begeman    // AND X, 0 -> 0, not "rlwinm 32".
998f42f133938545d4f5c249bcfef63db772ce8e942Nate Begeman    if (isInt32Immediate(N->getOperand(1), Imm) && (Imm == 0)) {
999475871a144eb604ddaf37503397ba0941442e5fbDan Gohman      ReplaceUses(SDValue(N, 0), N->getOperand(1));
1000f42f133938545d4f5c249bcfef63db772ce8e942Nate Begeman      return NULL;
1001f42f133938545d4f5c249bcfef63db772ce8e942Nate Begeman    }
100250fb3c498601a84e0d82d7bab3e28c820dd64598Nate Begeman    // ISD::OR doesn't get all the bitfield insertion fun.
100350fb3c498601a84e0d82d7bab3e28c820dd64598Nate Begeman    // (and (or x, c1), c2) where isRunOfOnes(~(c1^c2)) is a bitfield insert
1004c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner    if (isInt32Immediate(N->getOperand(1), Imm) &&
100550fb3c498601a84e0d82d7bab3e28c820dd64598Nate Begeman        N->getOperand(0).getOpcode() == ISD::OR &&
1006c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner        isInt32Immediate(N->getOperand(0).getOperand(1), Imm2)) {
1007c9a5ef524a9f461717bbf647b2d3da061aed720dChris Lattner      unsigned MB, ME;
100850fb3c498601a84e0d82d7bab3e28c820dd64598Nate Begeman      Imm = ~(Imm^Imm2);
100950fb3c498601a84e0d82d7bab3e28c820dd64598Nate Begeman      if (isRunOfOnes(Imm, MB, ME)) {
1010475871a144eb604ddaf37503397ba0941442e5fbDan Gohman        SDValue Ops[] = { N->getOperand(0).getOperand(0),
10110b828e08f94459ac0046b864871d92fed4aaef7cEvan Cheng                            N->getOperand(0).getOperand(1),
10120b828e08f94459ac0046b864871d92fed4aaef7cEvan Cheng                            getI32Imm(0), getI32Imm(MB),getI32Imm(ME) };
1013ed2eee63a6858312ed17582d8cb85a6856d8eb34Dale Johannesen        return CurDAG->getTargetNode(PPC::RLWIMI, dl, MVT::i32, Ops, 5);
101450fb3c498601a84e0d82d7bab3e28c820dd64598Nate Begeman      }
101550fb3c498601a84e0d82d7bab3e28c820dd64598Nate Begeman    }
1016237733e9335f4d2bb16a818ab184929e12fae407Chris Lattner
1017237733e9335f4d2bb16a818ab184929e12fae407Chris Lattner    // Other cases are autogenerated.
1018237733e9335f4d2bb16a818ab184929e12fae407Chris Lattner    break;
1019cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman  }
102002b88a4586704f34bc65afca3348453eae69d1d3Nate Begeman  case ISD::OR:
1021cccef1c6fffa292c227a289d447f6b848ab56c62Chris Lattner    if (N->getValueType(0) == MVT::i32)
1022ccbe2ec890ca41b8fd8c4e8ef0f7bcb42c2f69ecChris Lattner      if (SDNode *I = SelectBitfieldInsert(N))
1023ccbe2ec890ca41b8fd8c4e8ef0f7bcb42c2f69ecChris Lattner        return I;
1024d3d2cf52bbb776941bf8cb03d8732ff3f407cdeaChris Lattner
1025237733e9335f4d2bb16a818ab184929e12fae407Chris Lattner    // Other cases are autogenerated.
1026237733e9335f4d2bb16a818ab184929e12fae407Chris Lattner    break;
1027c15ed447f494c77a76c24661893e22192ebb2103Nate Begeman  case ISD::SHL: {
1028c15ed447f494c77a76c24661893e22192ebb2103Nate Begeman    unsigned Imm, SH, MB, ME;
1029ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif    if (isOpcWithIntImmediate(N->getOperand(0).getNode(), ISD::AND, Imm) &&
10302d5aff761d32b7f4fddc982e9444d20af48f080bNate Begeman        isRotateAndMask(N, Imm, true, SH, MB, ME)) {
1031475871a144eb604ddaf37503397ba0941442e5fbDan Gohman      SDValue Ops[] = { N->getOperand(0).getOperand(0),
10320b828e08f94459ac0046b864871d92fed4aaef7cEvan Cheng                          getI32Imm(SH), getI32Imm(MB), getI32Imm(ME) };
10330b828e08f94459ac0046b864871d92fed4aaef7cEvan Cheng      return CurDAG->SelectNodeTo(N, PPC::RLWINM, MVT::i32, Ops, 4);
10348d948323942cf031e9d1c55bda2bff9d4db4cf42Nate Begeman    }
10352d5aff761d32b7f4fddc982e9444d20af48f080bNate Begeman
10362d5aff761d32b7f4fddc982e9444d20af48f080bNate Begeman    // Other cases are autogenerated.
10372d5aff761d32b7f4fddc982e9444d20af48f080bNate Begeman    break;
1038c15ed447f494c77a76c24661893e22192ebb2103Nate Begeman  }
1039c15ed447f494c77a76c24661893e22192ebb2103Nate Begeman  case ISD::SRL: {
1040c15ed447f494c77a76c24661893e22192ebb2103Nate Begeman    unsigned Imm, SH, MB, ME;
1041ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif    if (isOpcWithIntImmediate(N->getOperand(0).getNode(), ISD::AND, Imm) &&
10422d5aff761d32b7f4fddc982e9444d20af48f080bNate Begeman        isRotateAndMask(N, Imm, true, SH, MB, ME)) {
1043475871a144eb604ddaf37503397ba0941442e5fbDan Gohman      SDValue Ops[] = { N->getOperand(0).getOperand(0),
10440b828e08f94459ac0046b864871d92fed4aaef7cEvan Cheng                          getI32Imm(SH), getI32Imm(MB), getI32Imm(ME) };
10450b828e08f94459ac0046b864871d92fed4aaef7cEvan Cheng      return CurDAG->SelectNodeTo(N, PPC::RLWINM, MVT::i32, Ops, 4);
10468d948323942cf031e9d1c55bda2bff9d4db4cf42Nate Begeman    }
10472d5aff761d32b7f4fddc982e9444d20af48f080bNate Begeman
10482d5aff761d32b7f4fddc982e9444d20af48f080bNate Begeman    // Other cases are autogenerated.
10492d5aff761d32b7f4fddc982e9444d20af48f080bNate Begeman    break;
1050c15ed447f494c77a76c24661893e22192ebb2103Nate Begeman  }
105113794f5d01317d76ec698b43bdf1c35eea57eae5Chris Lattner  case ISD::SELECT_CC: {
105213794f5d01317d76ec698b43bdf1c35eea57eae5Chris Lattner    ISD::CondCode CC = cast<CondCodeSDNode>(N->getOperand(4))->get();
105313794f5d01317d76ec698b43bdf1c35eea57eae5Chris Lattner
1054c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner    // Handle the setcc cases here.  select_cc lhs, 0, 1, 0, cc
105513794f5d01317d76ec698b43bdf1c35eea57eae5Chris Lattner    if (ConstantSDNode *N1C = dyn_cast<ConstantSDNode>(N->getOperand(1)))
105613794f5d01317d76ec698b43bdf1c35eea57eae5Chris Lattner      if (ConstantSDNode *N2C = dyn_cast<ConstantSDNode>(N->getOperand(2)))
105713794f5d01317d76ec698b43bdf1c35eea57eae5Chris Lattner        if (ConstantSDNode *N3C = dyn_cast<ConstantSDNode>(N->getOperand(3)))
105813794f5d01317d76ec698b43bdf1c35eea57eae5Chris Lattner          if (N1C->isNullValue() && N3C->isNullValue() &&
1059f5aeb1a8e4cf272c7348376d185ef8d8267653e0Dan Gohman              N2C->getZExtValue() == 1ULL && CC == ISD::SETNE &&
1060c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner              // FIXME: Implement this optzn for PPC64.
1061c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner              N->getValueType(0) == MVT::i32) {
10627e9b26fc73425ae215fbc9c8010cb53059a93b3aEvan Cheng            SDNode *Tmp =
1063ed2eee63a6858312ed17582d8cb85a6856d8eb34Dale Johannesen              CurDAG->getTargetNode(PPC::ADDIC, dl, MVT::i32, MVT::Flag,
10646da2f3268d12a9e64f2635dbb94b63e1c4142f59Evan Cheng                                    N->getOperand(0), getI32Imm(~0U));
1065ccbe2ec890ca41b8fd8c4e8ef0f7bcb42c2f69ecChris Lattner            return CurDAG->SelectNodeTo(N, PPC::SUBFE, MVT::i32,
1066475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                                        SDValue(Tmp, 0), N->getOperand(0),
1067475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                                        SDValue(Tmp, 1));
106813794f5d01317d76ec698b43bdf1c35eea57eae5Chris Lattner          }
10698a2d3ca7dff8f37ee0f1fc0042f47c194045183dChris Lattner
1070f5f5dce897269885754fc79adeb809194da52942Dale Johannesen    SDValue CCReg = SelectCC(N->getOperand(0), N->getOperand(1), CC, dl);
1071df4ed6350b2a51f71c0980e86c9078f4046ea706Chris Lattner    unsigned BROpc = getPredicateForSetCC(CC);
10728a2d3ca7dff8f37ee0f1fc0042f47c194045183dChris Lattner
1073919c032fa4511468aadc6f50d6ed9c50890710b3Chris Lattner    unsigned SelectCCOp;
1074c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner    if (N->getValueType(0) == MVT::i32)
1075c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner      SelectCCOp = PPC::SELECT_CC_I4;
1076c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner    else if (N->getValueType(0) == MVT::i64)
1077c08f902bb7bfcc8a97a4c7c9eb9187882dc2d6d7Chris Lattner      SelectCCOp = PPC::SELECT_CC_I8;
1078919c032fa4511468aadc6f50d6ed9c50890710b3Chris Lattner    else if (N->getValueType(0) == MVT::f32)
1079919c032fa4511468aadc6f50d6ed9c50890710b3Chris Lattner      SelectCCOp = PPC::SELECT_CC_F4;
1080710ff32983ca919fa0da14e077450b6a7654274fChris Lattner    else if (N->getValueType(0) == MVT::f64)
1081919c032fa4511468aadc6f50d6ed9c50890710b3Chris Lattner      SelectCCOp = PPC::SELECT_CC_F8;
1082710ff32983ca919fa0da14e077450b6a7654274fChris Lattner    else
1083710ff32983ca919fa0da14e077450b6a7654274fChris Lattner      SelectCCOp = PPC::SELECT_CC_VRRC;
1084710ff32983ca919fa0da14e077450b6a7654274fChris Lattner
1085475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue Ops[] = { CCReg, N->getOperand(2), N->getOperand(3),
10860b828e08f94459ac0046b864871d92fed4aaef7cEvan Cheng                        getI32Imm(BROpc) };
10870b828e08f94459ac0046b864871d92fed4aaef7cEvan Cheng    return CurDAG->SelectNodeTo(N, SelectCCOp, N->getValueType(0), Ops, 4);
108813794f5d01317d76ec698b43bdf1c35eea57eae5Chris Lattner  }
108918258c640466274c26e89016e361ec411ff78520Chris Lattner  case PPCISD::COND_BRANCH: {
1090cbb7ab259d08ac5aa5a4764b48628c4bcb5110c7Dan Gohman    // Op #0 is the Chain.
109118258c640466274c26e89016e361ec411ff78520Chris Lattner    // Op #1 is the PPC::PRED_* number.
109218258c640466274c26e89016e361ec411ff78520Chris Lattner    // Op #2 is the CR#
109318258c640466274c26e89016e361ec411ff78520Chris Lattner    // Op #3 is the Dest MBB
10948be6bbe5bfd50945ac6c5542e0f54a0924a5db8dDan Gohman    // Op #4 is the Flag.
10952bda17c92229e7116adf2edd3eea98c0a12f43cbEvan Cheng    // Prevent PPC::PRED_* from being selected into LI.
1096475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue Pred =
1097f5aeb1a8e4cf272c7348376d185ef8d8267653e0Dan Gohman      getI32Imm(cast<ConstantSDNode>(N->getOperand(1))->getZExtValue());
1098475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue Ops[] = { Pred, N->getOperand(2), N->getOperand(3),
109918258c640466274c26e89016e361ec411ff78520Chris Lattner      N->getOperand(0), N->getOperand(4) };
110018258c640466274c26e89016e361ec411ff78520Chris Lattner    return CurDAG->SelectNodeTo(N, PPC::BCC, MVT::Other, Ops, 5);
110118258c640466274c26e89016e361ec411ff78520Chris Lattner  }
110281e8097377529dc3b666f33bb525c49cfbac3f51Nate Begeman  case ISD::BR_CC: {
11032fbb4579d6d6bbde8387283b78307c2ea477a312Chris Lattner    ISD::CondCode CC = cast<CondCodeSDNode>(N->getOperand(1))->get();
1104f5f5dce897269885754fc79adeb809194da52942Dale Johannesen    SDValue CondCode = SelectCC(N->getOperand(2), N->getOperand(3), CC, dl);
1105475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue Ops[] = { getI32Imm(getPredicateForSetCC(CC)), CondCode,
11060b828e08f94459ac0046b864871d92fed4aaef7cEvan Cheng                        N->getOperand(4), N->getOperand(0) };
1107289c2d5f4566d8d7722e3934f4763d3df92886f3Chris Lattner    return CurDAG->SelectNodeTo(N, PPC::BCC, MVT::Other, Ops, 4);
11082fbb4579d6d6bbde8387283b78307c2ea477a312Chris Lattner  }
110937efe6764568a3829fee26aba532283131d1a104Nate Begeman  case ISD::BRIND: {
1110cf0063171995c97ee52dfdf5d6bbbe090d2f5f03Chris Lattner    // FIXME: Should custom lower this.
1111475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue Chain = N->getOperand(0);
1112475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue Target = N->getOperand(1);
11136b76b96c69334f3b6a2a895ff810ed047b4b75e5Chris Lattner    unsigned Opc = Target.getValueType() == MVT::i32 ? PPC::MTCTR : PPC::MTCTR8;
1114ed2eee63a6858312ed17582d8cb85a6856d8eb34Dale Johannesen    Chain = SDValue(CurDAG->getTargetNode(Opc, dl, MVT::Other, Target,
111537efe6764568a3829fee26aba532283131d1a104Nate Begeman                                            Chain), 0);
111695514bae7309ffacfc0a79b267159dcfde2b7720Evan Cheng    return CurDAG->SelectNodeTo(N, PPC::BCTR, MVT::Other, Chain);
111737efe6764568a3829fee26aba532283131d1a104Nate Begeman  }
1118ee5c2b8ba2bd9670931705ca04a46052d534ade9Evan Cheng  case ISD::DECLARE: {
1119ee5c2b8ba2bd9670931705ca04a46052d534ade9Evan Cheng    SDValue Chain = N->getOperand(0);
1120ee5c2b8ba2bd9670931705ca04a46052d534ade9Evan Cheng    SDValue N1 = N->getOperand(1);
1121ee5c2b8ba2bd9670931705ca04a46052d534ade9Evan Cheng    SDValue N2 = N->getOperand(2);
1122ee5c2b8ba2bd9670931705ca04a46052d534ade9Evan Cheng    FrameIndexSDNode *FINode = dyn_cast<FrameIndexSDNode>(N1);
1123f902d246b69c972fa3e8f652b44d10abbb1f9355Chris Lattner
1124f902d246b69c972fa3e8f652b44d10abbb1f9355Chris Lattner    // FIXME: We need to handle this for VLAs.
1125f902d246b69c972fa3e8f652b44d10abbb1f9355Chris Lattner    if (!FINode) {
1126f902d246b69c972fa3e8f652b44d10abbb1f9355Chris Lattner      ReplaceUses(Op.getValue(0), Chain);
1127f902d246b69c972fa3e8f652b44d10abbb1f9355Chris Lattner      return NULL;
1128f902d246b69c972fa3e8f652b44d10abbb1f9355Chris Lattner    }
1129f902d246b69c972fa3e8f652b44d10abbb1f9355Chris Lattner
11305fc742d5b2b647b3dce2c9ba943a2499d980c347Evan Cheng    if (N2.getOpcode() == ISD::ADD) {
11315fc742d5b2b647b3dce2c9ba943a2499d980c347Evan Cheng      if (N2.getOperand(0).getOpcode() == ISD::ADD &&
11325fc742d5b2b647b3dce2c9ba943a2499d980c347Evan Cheng          N2.getOperand(0).getOperand(0).getOpcode() == PPCISD::GlobalBaseReg &&
11335fc742d5b2b647b3dce2c9ba943a2499d980c347Evan Cheng          N2.getOperand(0).getOperand(1).getOpcode() == PPCISD::Hi &&
11345fc742d5b2b647b3dce2c9ba943a2499d980c347Evan Cheng          N2.getOperand(1).getOpcode() == PPCISD::Lo)
11355fc742d5b2b647b3dce2c9ba943a2499d980c347Evan Cheng        N2 = N2.getOperand(0).getOperand(1).getOperand(0);
11365fc742d5b2b647b3dce2c9ba943a2499d980c347Evan Cheng      else if (N2.getOperand(0).getOpcode() == ISD::ADD &&
1137c1a168a0fcbc7483a879e617e91824c4a7e6eeceEvan Cheng          N2.getOperand(0).getOperand(0).getOpcode() == PPCISD::GlobalBaseReg &&
1138c1a168a0fcbc7483a879e617e91824c4a7e6eeceEvan Cheng          N2.getOperand(0).getOperand(1).getOpcode() == PPCISD::Lo &&
11395fc742d5b2b647b3dce2c9ba943a2499d980c347Evan Cheng               N2.getOperand(1).getOpcode() == PPCISD::Hi)
11405fc742d5b2b647b3dce2c9ba943a2499d980c347Evan Cheng        N2 = N2.getOperand(0).getOperand(1).getOperand(0);
11415fc742d5b2b647b3dce2c9ba943a2499d980c347Evan Cheng      else if (N2.getOperand(0).getOpcode() == PPCISD::Hi &&
11425fc742d5b2b647b3dce2c9ba943a2499d980c347Evan Cheng               N2.getOperand(1).getOpcode() == PPCISD::Lo)
11435fc742d5b2b647b3dce2c9ba943a2499d980c347Evan Cheng        N2 = N2.getOperand(0).getOperand(0);
11445fc742d5b2b647b3dce2c9ba943a2499d980c347Evan Cheng    }
1145f902d246b69c972fa3e8f652b44d10abbb1f9355Chris Lattner
1146f902d246b69c972fa3e8f652b44d10abbb1f9355Chris Lattner    // If we don't have a global address here, the debug info is mangled, just
1147f902d246b69c972fa3e8f652b44d10abbb1f9355Chris Lattner    // drop it.
1148f902d246b69c972fa3e8f652b44d10abbb1f9355Chris Lattner    if (!isa<GlobalAddressSDNode>(N2)) {
1149f902d246b69c972fa3e8f652b44d10abbb1f9355Chris Lattner      ReplaceUses(Op.getValue(0), Chain);
1150f902d246b69c972fa3e8f652b44d10abbb1f9355Chris Lattner      return NULL;
1151f902d246b69c972fa3e8f652b44d10abbb1f9355Chris Lattner    }
1152ee5c2b8ba2bd9670931705ca04a46052d534ade9Evan Cheng    int FI = cast<FrameIndexSDNode>(N1)->getIndex();
1153ee5c2b8ba2bd9670931705ca04a46052d534ade9Evan Cheng    GlobalValue *GV = cast<GlobalAddressSDNode>(N2)->getGlobal();
1154ee5c2b8ba2bd9670931705ca04a46052d534ade9Evan Cheng    SDValue Tmp1 = CurDAG->getTargetFrameIndex(FI, TLI.getPointerTy());
1155ee5c2b8ba2bd9670931705ca04a46052d534ade9Evan Cheng    SDValue Tmp2 = CurDAG->getTargetGlobalAddress(GV, TLI.getPointerTy());
1156ee5c2b8ba2bd9670931705ca04a46052d534ade9Evan Cheng    return CurDAG->SelectNodeTo(N, TargetInstrInfo::DECLARE,
1157ee5c2b8ba2bd9670931705ca04a46052d534ade9Evan Cheng                                MVT::Other, Tmp1, Tmp2, Chain);
1158ee5c2b8ba2bd9670931705ca04a46052d534ade9Evan Cheng  }
1159a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  }
116025dae727f3b0c3511c17d7b7a8d476b1eed04f20Chris Lattner
11619ade218533429146731213eacb7e12060e65ff58Evan Cheng  return SelectCode(Op);
1162a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner}
1163a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner
1164a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner
1165cf0063171995c97ee52dfdf5d6bbbe090d2f5f03Chris Lattner
11661d9d7427c4a4e3c7bdcfd1f725447f355e509c20Nate Begeman/// createPPCISelDag - This pass converts a legalized DAG into a
1167a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner/// PowerPC-specific DAG, ready for instruction scheduling.
1168a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner///
1169c4c6257c1a154279bf10e9498d46d6c1793dbaa7Evan ChengFunctionPass *llvm::createPPCISelDag(PPCTargetMachine &TM) {
11701d9d7427c4a4e3c7bdcfd1f725447f355e509c20Nate Begeman  return new PPCDAGToDAGISel(TM);
1171a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner}
1172a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner
1173