PPCISelDAGToDAG.cpp revision c15ed447f494c77a76c24661893e22192ebb2103
1a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner//===-- PPC32ISelDAGToDAG.cpp - PPC32 pattern matching inst selector ------===//
2a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner//
3a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner//                     The LLVM Compiler Infrastructure
4a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner//
5a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner// This file was developed by Chris Lattner and is distributed under
6a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner// the University of Illinois Open Source License. See LICENSE.TXT for details.
7a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner//
8a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner//===----------------------------------------------------------------------===//
9a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner//
10a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner// This file defines a pattern matching instruction selector for 32 bit PowerPC,
11a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner// converting from a legalized dag to a PPC dag.
12a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner//
13a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner//===----------------------------------------------------------------------===//
14a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner
15a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner#include "PowerPC.h"
16a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner#include "PPC32TargetMachine.h"
17a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner#include "PPC32ISelLowering.h"
18a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner#include "llvm/CodeGen/SelectionDAG.h"
19a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner#include "llvm/CodeGen/SelectionDAGISel.h"
20a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner#include "llvm/Target/TargetOptions.h"
21a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner#include "llvm/ADT/Statistic.h"
22a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner#include "llvm/Support/Debug.h"
23a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner#include "llvm/Support/MathExtras.h"
24a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattnerusing namespace llvm;
25a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner
26a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattnernamespace {
27a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  Statistic<> Recorded("ppc-codegen", "Number of recording ops emitted");
28a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  Statistic<> FusedFP ("ppc-codegen", "Number of fused fp operations");
29a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  Statistic<> FrameOff("ppc-codegen", "Number of frame idx offsets collapsed");
30a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner
31a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  //===--------------------------------------------------------------------===//
32a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  /// PPC32DAGToDAGISel - PPC32 specific code to select PPC32 machine
33a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  /// instructions for SelectionDAG operations.
34a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  ///
35a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  class PPC32DAGToDAGISel : public SelectionDAGISel {
36a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    PPC32TargetLowering PPC32Lowering;
37a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner
38a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  public:
39a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    PPC32DAGToDAGISel(TargetMachine &TM)
40a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      : SelectionDAGISel(PPC32Lowering), PPC32Lowering(TM) {}
41a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner
42a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    /// getI32Imm - Return a target constant with the specified value, of type
43a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    /// i32.
44a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    inline SDOperand getI32Imm(unsigned Imm) {
45a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      return CurDAG->getTargetConstant(Imm, MVT::i32);
46a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    }
47a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner
48a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    // Select - Convert the specified operand from a target-independent to a
49a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    // target-specific node if it hasn't already been changed.
50a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    SDOperand Select(SDOperand Op);
51a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner
52a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    SDNode *SelectIntImmediateExpr(SDOperand LHS, SDOperand RHS,
53a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner                                   unsigned OCHi, unsigned OCLo,
54a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner                                   bool IsArithmetic = false,
55a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner                                   bool Negate = false);
56a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner
57a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    /// InstructionSelectBasicBlock - This callback is invoked by
58a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    /// SelectionDAGISel when it has created a SelectionDAG for us to codegen.
59a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    virtual void InstructionSelectBasicBlock(SelectionDAG &DAG) {
60a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      DEBUG(BB->dump());
61d607c12e8e8533028a66c9f533007c6c32a64cefChris Lattner      // Select target instructions for the DAG.
62a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      Select(DAG.getRoot());
63a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      DAG.RemoveDeadNodes();
64d607c12e8e8533028a66c9f533007c6c32a64cefChris Lattner
65d607c12e8e8533028a66c9f533007c6c32a64cefChris Lattner      // Emit machine code to BB.
66d607c12e8e8533028a66c9f533007c6c32a64cefChris Lattner      ScheduleAndEmitDAG(DAG);
67a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    }
68a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner
69a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    virtual const char *getPassName() const {
70a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      return "PowerPC DAG->DAG Pattern Instruction Selection";
71a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    }
72a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  };
73a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner}
74a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner
750f3257a3302b60c128a667db6736e81335316c1eNate Begeman// isIntImmediate - This method tests to see if a constant operand.
760f3257a3302b60c128a667db6736e81335316c1eNate Begeman// If so Imm will receive the 32 bit value.
770f3257a3302b60c128a667db6736e81335316c1eNate Begemanstatic bool isIntImmediate(SDNode *N, unsigned& Imm) {
780f3257a3302b60c128a667db6736e81335316c1eNate Begeman  if (N->getOpcode() == ISD::Constant) {
790f3257a3302b60c128a667db6736e81335316c1eNate Begeman    Imm = cast<ConstantSDNode>(N)->getValue();
800f3257a3302b60c128a667db6736e81335316c1eNate Begeman    return true;
810f3257a3302b60c128a667db6736e81335316c1eNate Begeman  }
820f3257a3302b60c128a667db6736e81335316c1eNate Begeman  return false;
830f3257a3302b60c128a667db6736e81335316c1eNate Begeman}
840f3257a3302b60c128a667db6736e81335316c1eNate Begeman
85cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman// isOprShiftImm - Returns true if the specified operand is a shift opcode with
86cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman// a immediate shift count less than 32.
87cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begemanstatic bool isOprShiftImm(SDNode *N, unsigned& Opc, unsigned& SH) {
88cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman  Opc = N->getOpcode();
89cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman  return (Opc == ISD::SHL || Opc == ISD::SRL || Opc == ISD::SRA) &&
90cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman    isIntImmediate(N->getOperand(1).Val, SH) && SH < 32;
91cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman}
92cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman
93cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman// isRunOfOnes - Returns true iff Val consists of one contiguous run of 1s with
94cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman// any number of 0s on either side.  The 1s are allowed to wrap from LSB to
95cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman// MSB, so 0x000FFF0, 0x0000FFFF, and 0xFF0000FF are all runs.  0x0F0F0000 is
96cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman// not, since all 1s are not contiguous.
97cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begemanstatic bool isRunOfOnes(unsigned Val, unsigned &MB, unsigned &ME) {
98cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman  if (isShiftedMask_32(Val)) {
99cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman    // look for the first non-zero bit
100cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman    MB = CountLeadingZeros_32(Val);
101cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman    // look for the first zero bit after the run of ones
102cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman    ME = CountLeadingZeros_32((Val - 1) ^ Val);
103cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman    return true;
104cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman  } else if (isShiftedMask_32(Val = ~Val)) { // invert mask
105cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman                                             // effectively look for the first zero bit
106cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman    ME = CountLeadingZeros_32(Val) - 1;
107cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman    // effectively look for the first one bit after the run of zeros
108cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman    MB = CountLeadingZeros_32((Val - 1) ^ Val) + 1;
109cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman    return true;
110cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman  }
111cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman  // no run present
112cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman  return false;
113cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman}
114cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman
115cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman// isRotateAndMask - Returns true if Mask and Shift can be folded in to a rotate
116cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman// and mask opcode and mask operation.
117cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begemanstatic bool isRotateAndMask(SDNode *N, unsigned Mask, bool IsShiftMask,
118cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman                            unsigned &SH, unsigned &MB, unsigned &ME) {
119cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman  unsigned Shift  = 32;
120cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman  unsigned Indeterminant = ~0;  // bit mask marking indeterminant results
121cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman  unsigned Opcode = N->getOpcode();
122cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman  if (!isIntImmediate(N->getOperand(1).Val, Shift) || (Shift > 31))
123cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman    return false;
124cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman
125cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman  if (Opcode == ISD::SHL) {
126cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman    // apply shift left to mask if it comes first
127cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman    if (IsShiftMask) Mask = Mask << Shift;
128cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman    // determine which bits are made indeterminant by shift
129cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman    Indeterminant = ~(0xFFFFFFFFu << Shift);
130cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman  } else if (Opcode == ISD::SRA || Opcode == ISD::SRL) {
131cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman    // apply shift right to mask if it comes first
132cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman    if (IsShiftMask) Mask = Mask >> Shift;
133cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman    // determine which bits are made indeterminant by shift
134cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman    Indeterminant = ~(0xFFFFFFFFu >> Shift);
135cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman    // adjust for the left rotate
136cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman    Shift = 32 - Shift;
137cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman  } else {
138cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman    return false;
139cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman  }
140cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman
141cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman  // if the mask doesn't intersect any Indeterminant bits
142cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman  if (Mask && !(Mask & Indeterminant)) {
143cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman    SH = Shift;
144cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman    // make sure the mask is still a mask (wrap arounds may not be)
145cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman    return isRunOfOnes(Mask, MB, ME);
146cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman  }
147cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman  return false;
148cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman}
149cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman
1500f3257a3302b60c128a667db6736e81335316c1eNate Begeman// isOpcWithIntImmediate - This method tests to see if the node is a specific
1510f3257a3302b60c128a667db6736e81335316c1eNate Begeman// opcode and that it has a immediate integer right operand.
1520f3257a3302b60c128a667db6736e81335316c1eNate Begeman// If so Imm will receive the 32 bit value.
1530f3257a3302b60c128a667db6736e81335316c1eNate Begemanstatic bool isOpcWithIntImmediate(SDNode *N, unsigned Opc, unsigned& Imm) {
1540f3257a3302b60c128a667db6736e81335316c1eNate Begeman  return N->getOpcode() == Opc && isIntImmediate(N->getOperand(1).Val, Imm);
1550f3257a3302b60c128a667db6736e81335316c1eNate Begeman}
1560f3257a3302b60c128a667db6736e81335316c1eNate Begeman
1570f3257a3302b60c128a667db6736e81335316c1eNate Begeman// isOprNot - Returns true if the specified operand is an xor with immediate -1.
1580f3257a3302b60c128a667db6736e81335316c1eNate Begemanstatic bool isOprNot(SDNode *N) {
1590f3257a3302b60c128a667db6736e81335316c1eNate Begeman  unsigned Imm;
1600f3257a3302b60c128a667db6736e81335316c1eNate Begeman  return isOpcWithIntImmediate(N, ISD::XOR, Imm) && (signed)Imm == -1;
1610f3257a3302b60c128a667db6736e81335316c1eNate Begeman}
1620f3257a3302b60c128a667db6736e81335316c1eNate Begeman
163a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner// Immediate constant composers.
164a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner// Lo16 - grabs the lo 16 bits from a 32 bit constant.
165a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner// Hi16 - grabs the hi 16 bits from a 32 bit constant.
166a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner// HA16 - computes the hi bits required if the lo bits are add/subtracted in
167a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner// arithmethically.
168a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattnerstatic unsigned Lo16(unsigned x)  { return x & 0x0000FFFF; }
169a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattnerstatic unsigned Hi16(unsigned x)  { return Lo16(x >> 16); }
170a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattnerstatic unsigned HA16(unsigned x)  { return Hi16((signed)x - (signed short)x); }
171a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner
172a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner// isIntImmediate - This method tests to see if a constant operand.
173a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner// If so Imm will receive the 32 bit value.
174a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattnerstatic bool isIntImmediate(SDOperand N, unsigned& Imm) {
175a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  if (ConstantSDNode *CN = dyn_cast<ConstantSDNode>(N)) {
176a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    Imm = (unsigned)CN->getSignExtended();
177a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    return true;
178a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  }
179a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  return false;
180a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner}
181a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner
182a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner// SelectIntImmediateExpr - Choose code for integer operations with an immediate
183a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner// operand.
184a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris LattnerSDNode *PPC32DAGToDAGISel::SelectIntImmediateExpr(SDOperand LHS, SDOperand RHS,
185a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner                                                  unsigned OCHi, unsigned OCLo,
186a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner                                                  bool IsArithmetic,
187a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner                                                  bool Negate) {
188a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  // Check to make sure this is a constant.
189a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  ConstantSDNode *CN = dyn_cast<ConstantSDNode>(RHS);
190a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  // Exit if not a constant.
191a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  if (!CN) return 0;
192a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  // Extract immediate.
193a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  unsigned C = (unsigned)CN->getValue();
194a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  // Negate if required (ISD::SUB).
195a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  if (Negate) C = -C;
196a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  // Get the hi and lo portions of constant.
197a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  unsigned Hi = IsArithmetic ? HA16(C) : Hi16(C);
198a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  unsigned Lo = Lo16(C);
199a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner
200a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  // If two instructions are needed and usage indicates it would be better to
201a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  // load immediate into a register, bail out.
202a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  if (Hi && Lo && CN->use_size() > 2) return false;
203a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner
204a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  // Select the first operand.
205a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  SDOperand Opr0 = Select(LHS);
206a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner
207a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  if (Lo)  // Add in the lo-part.
208a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    Opr0 = CurDAG->getTargetNode(OCLo, MVT::i32, Opr0, getI32Imm(Lo));
209a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  if (Hi)  // Add in the hi-part.
210a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    Opr0 = CurDAG->getTargetNode(OCHi, MVT::i32, Opr0, getI32Imm(Hi));
211a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  return Opr0.Val;
212a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner}
213a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner
214a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner
215a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner// Select - Convert the specified operand from a target-independent to a
216a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner// target-specific node if it hasn't already been changed.
217a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris LattnerSDOperand PPC32DAGToDAGISel::Select(SDOperand Op) {
218a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  SDNode *N = Op.Val;
219a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  if (N->getOpcode() >= ISD::BUILTIN_OP_END)
220a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    return Op;   // Already selected.
221a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner
222a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  switch (N->getOpcode()) {
223a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  default:
224a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    std::cerr << "Cannot yet select: ";
225a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    N->dump();
226a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    std::cerr << "\n";
227a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    abort();
228a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  case ISD::EntryToken:       // These leaves remain the same.
229a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  case ISD::UNDEF:
230a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    return Op;
231a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  case ISD::TokenFactor: {
232a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    SDOperand New;
233a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    if (N->getNumOperands() == 2) {
234a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      SDOperand Op0 = Select(N->getOperand(0));
235a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      SDOperand Op1 = Select(N->getOperand(1));
236a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      New = CurDAG->getNode(ISD::TokenFactor, MVT::Other, Op0, Op1);
237a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    } else {
238a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      std::vector<SDOperand> Ops;
239a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i)
240a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner        Ops.push_back(Select(N->getOperand(0)));
241a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      New = CurDAG->getNode(ISD::TokenFactor, MVT::Other, Ops);
242a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    }
243a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner
244a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    if (New.Val != N) {
245a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      CurDAG->ReplaceAllUsesWith(N, New.Val);
246a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      N = New.Val;
247a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    }
248a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    break;
249a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  }
250a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  case ISD::CopyFromReg: {
251a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    SDOperand Chain = Select(N->getOperand(0));
252a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    if (Chain == N->getOperand(0)) return Op; // No change
253a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    SDOperand New = CurDAG->getCopyFromReg(Chain,
254a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner         cast<RegisterSDNode>(N->getOperand(1))->getReg(), N->getValueType(0));
255a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    return New.getValue(Op.ResNo);
256a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  }
257a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  case ISD::CopyToReg: {
258a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    SDOperand Chain = Select(N->getOperand(0));
259a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    SDOperand Reg = N->getOperand(1);
260a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    SDOperand Val = Select(N->getOperand(2));
261a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    if (Chain != N->getOperand(0) || Val != N->getOperand(2)) {
262a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      SDOperand New = CurDAG->getNode(ISD::CopyToReg, MVT::Other,
263a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner                                      Chain, Reg, Val);
264a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      CurDAG->ReplaceAllUsesWith(N, New.Val);
265a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      N = New.Val;
266a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    }
267a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    break;
268a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  }
269a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  case ISD::Constant: {
270a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    assert(N->getValueType(0) == MVT::i32);
271a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    unsigned v = (unsigned)cast<ConstantSDNode>(N)->getValue();
272a69404781344c4aee05935ee921bbf2844911bc0Nate Begeman    unsigned Hi = HA16(v);
273a69404781344c4aee05935ee921bbf2844911bc0Nate Begeman    unsigned Lo = Lo16(v);
274a69404781344c4aee05935ee921bbf2844911bc0Nate Begeman    if (Hi && Lo) {
275a69404781344c4aee05935ee921bbf2844911bc0Nate Begeman      SDOperand Top = CurDAG->getTargetNode(PPC::LIS, MVT::i32,
276a69404781344c4aee05935ee921bbf2844911bc0Nate Begeman                                            getI32Imm(v >> 16));
277a69404781344c4aee05935ee921bbf2844911bc0Nate Begeman      CurDAG->SelectNodeTo(N, MVT::i32, PPC::ORI, Top, getI32Imm(v & 0xFFFF));
278a69404781344c4aee05935ee921bbf2844911bc0Nate Begeman    } else if (Lo) {
279a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      CurDAG->SelectNodeTo(N, MVT::i32, PPC::LI, getI32Imm(v));
280a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    } else {
281a69404781344c4aee05935ee921bbf2844911bc0Nate Begeman      CurDAG->SelectNodeTo(N, MVT::i32, PPC::LIS, getI32Imm(v >> 16));
282a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    }
283a69404781344c4aee05935ee921bbf2844911bc0Nate Begeman    break;
284a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  }
285305a1c75cfcc1b2e97c2bccebd42a70d99e7d127Nate Begeman  case ISD::SIGN_EXTEND_INREG:
286305a1c75cfcc1b2e97c2bccebd42a70d99e7d127Nate Begeman    switch(cast<VTSDNode>(N->getOperand(1))->getVT()) {
287305a1c75cfcc1b2e97c2bccebd42a70d99e7d127Nate Begeman    default: assert(0 && "Illegal type in SIGN_EXTEND_INREG"); break;
288305a1c75cfcc1b2e97c2bccebd42a70d99e7d127Nate Begeman    case MVT::i16:
289305a1c75cfcc1b2e97c2bccebd42a70d99e7d127Nate Begeman      CurDAG->SelectNodeTo(N, MVT::i32, PPC::EXTSH, Select(N->getOperand(0)));
290305a1c75cfcc1b2e97c2bccebd42a70d99e7d127Nate Begeman      break;
291305a1c75cfcc1b2e97c2bccebd42a70d99e7d127Nate Begeman    case MVT::i8:
292305a1c75cfcc1b2e97c2bccebd42a70d99e7d127Nate Begeman      CurDAG->SelectNodeTo(N, MVT::i32, PPC::EXTSB, Select(N->getOperand(0)));
293305a1c75cfcc1b2e97c2bccebd42a70d99e7d127Nate Begeman      break;
294305a1c75cfcc1b2e97c2bccebd42a70d99e7d127Nate Begeman    }
295305a1c75cfcc1b2e97c2bccebd42a70d99e7d127Nate Begeman    break;
296305a1c75cfcc1b2e97c2bccebd42a70d99e7d127Nate Begeman  case ISD::CTLZ:
297305a1c75cfcc1b2e97c2bccebd42a70d99e7d127Nate Begeman    assert(N->getValueType(0) == MVT::i32);
298305a1c75cfcc1b2e97c2bccebd42a70d99e7d127Nate Begeman    CurDAG->SelectNodeTo(N, MVT::i32, PPC::CNTLZW, Select(N->getOperand(0)));
299305a1c75cfcc1b2e97c2bccebd42a70d99e7d127Nate Begeman    break;
300a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  case ISD::ADD: {
301a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    MVT::ValueType Ty = N->getValueType(0);
302a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    if (Ty == MVT::i32) {
303a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      if (SDNode *I = SelectIntImmediateExpr(N->getOperand(0), N->getOperand(1),
304a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner                                             PPC::ADDIS, PPC::ADDI, true)) {
305a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner        CurDAG->ReplaceAllUsesWith(N, I);
306a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner        N = I;
307a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      } else {
308a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner        CurDAG->SelectNodeTo(N, Ty, PPC::ADD, Select(N->getOperand(0)),
309a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner                             Select(N->getOperand(1)));
310a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      }
311a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      break;
312a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    }
313a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner
314a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    if (!NoExcessFPPrecision) {  // Match FMA ops
315a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      if (N->getOperand(0).getOpcode() == ISD::MUL &&
316a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner          N->getOperand(0).Val->hasOneUse()) {
317a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner        ++FusedFP; // Statistic
318a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner        CurDAG->SelectNodeTo(N, Ty, Ty == MVT::f64 ? PPC::FMADD : PPC::FMADDS,
319a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner                             Select(N->getOperand(0).getOperand(0)),
320a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner                             Select(N->getOperand(0).getOperand(1)),
321a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner                             Select(N->getOperand(1)));
322a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner        break;
323a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      } else if (N->getOperand(1).getOpcode() == ISD::MUL &&
324a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner                 N->getOperand(1).hasOneUse()) {
325a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner        ++FusedFP; // Statistic
326a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner        CurDAG->SelectNodeTo(N, Ty, Ty == MVT::f64 ? PPC::FMADD : PPC::FMADDS,
327a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner                             Select(N->getOperand(1).getOperand(0)),
328a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner                             Select(N->getOperand(1).getOperand(1)),
329a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner                             Select(N->getOperand(0)));
330a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner        break;
331a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      }
332a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    }
333a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner
334a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    CurDAG->SelectNodeTo(N, Ty, Ty == MVT::f64 ? PPC::FADD : PPC::FADDS,
335a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner                         Select(N->getOperand(0)), Select(N->getOperand(1)));
336a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    break;
337a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  }
338a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  case ISD::SUB: {
339a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    MVT::ValueType Ty = N->getValueType(0);
340a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    if (Ty == MVT::i32) {
341a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      unsigned Imm;
342a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      if (isIntImmediate(N->getOperand(0), Imm) && isInt16(Imm)) {
343a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner        CurDAG->SelectNodeTo(N, Ty, PPC::SUBFIC, Select(N->getOperand(1)),
344a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner                             getI32Imm(Lo16(Imm)));
345a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner        break;
346a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      }
347a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      if (SDNode *I = SelectIntImmediateExpr(N->getOperand(0), N->getOperand(1),
348a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner                                          PPC::ADDIS, PPC::ADDI, true, true)) {
349a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner        CurDAG->ReplaceAllUsesWith(N, I);
350a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner        N = I;
351a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      } else {
352a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner        CurDAG->SelectNodeTo(N, Ty, PPC::SUBF, Select(N->getOperand(1)),
353a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner                             Select(N->getOperand(0)));
354a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      }
355a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      break;
356a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    }
357a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner
358a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    if (!NoExcessFPPrecision) {  // Match FMA ops
359a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      if (N->getOperand(0).getOpcode() == ISD::MUL &&
360a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner          N->getOperand(0).Val->hasOneUse()) {
361a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner        ++FusedFP; // Statistic
362a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner        CurDAG->SelectNodeTo(N, Ty, Ty == MVT::f64 ? PPC::FMSUB : PPC::FMSUBS,
363a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner                             Select(N->getOperand(0).getOperand(0)),
364a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner                             Select(N->getOperand(0).getOperand(1)),
365a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner                             Select(N->getOperand(1)));
366a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner        break;
367a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      } else if (N->getOperand(1).getOpcode() == ISD::MUL &&
368a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner                 N->getOperand(1).Val->hasOneUse()) {
369a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner        ++FusedFP; // Statistic
370a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner        CurDAG->SelectNodeTo(N, Ty, Ty == MVT::f64 ? PPC::FNMSUB : PPC::FNMSUBS,
371a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner                             Select(N->getOperand(1).getOperand(0)),
372a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner                             Select(N->getOperand(1).getOperand(1)),
373a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner                             Select(N->getOperand(0)));
374a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner        break;
375a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      }
376a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    }
377a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    CurDAG->SelectNodeTo(N, Ty, Ty == MVT::f64 ? PPC::FSUB : PPC::FSUBS,
378a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner                         Select(N->getOperand(0)),
379a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner                         Select(N->getOperand(1)));
380a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    break;
38126653500bbbc21cd1c2d12ecc433fa439536b657Nate Begeman  }
382b5a0668d43582297e19d03df34e0a0c09a1f6c45Nate Begeman  case ISD::MUL: {
383b5a0668d43582297e19d03df34e0a0c09a1f6c45Nate Begeman    unsigned Imm, Opc;
384b5a0668d43582297e19d03df34e0a0c09a1f6c45Nate Begeman    if (isIntImmediate(N->getOperand(1), Imm) && isInt16(Imm)) {
385b5a0668d43582297e19d03df34e0a0c09a1f6c45Nate Begeman      CurDAG->SelectNodeTo(N, N->getValueType(0), PPC::MULLI,
386b5a0668d43582297e19d03df34e0a0c09a1f6c45Nate Begeman                           Select(N->getOperand(0)), getI32Imm(Lo16(Imm)));
387b5a0668d43582297e19d03df34e0a0c09a1f6c45Nate Begeman      break;
388b5a0668d43582297e19d03df34e0a0c09a1f6c45Nate Begeman    }
389b5a0668d43582297e19d03df34e0a0c09a1f6c45Nate Begeman    switch (N->getValueType(0)) {
390b5a0668d43582297e19d03df34e0a0c09a1f6c45Nate Begeman      default: assert(0 && "Unhandled multiply type!");
391b5a0668d43582297e19d03df34e0a0c09a1f6c45Nate Begeman      case MVT::i32: Opc = PPC::MULLW; break;
392b5a0668d43582297e19d03df34e0a0c09a1f6c45Nate Begeman      case MVT::f32: Opc = PPC::FMULS; break;
393b5a0668d43582297e19d03df34e0a0c09a1f6c45Nate Begeman      case MVT::f64: Opc = PPC::FMUL;  break;
394b5a0668d43582297e19d03df34e0a0c09a1f6c45Nate Begeman    }
395b5a0668d43582297e19d03df34e0a0c09a1f6c45Nate Begeman    CurDAG->SelectNodeTo(N, N->getValueType(0), Opc, Select(N->getOperand(0)),
396b5a0668d43582297e19d03df34e0a0c09a1f6c45Nate Begeman                         Select(N->getOperand(1)));
397b5a0668d43582297e19d03df34e0a0c09a1f6c45Nate Begeman    break;
398b5a0668d43582297e19d03df34e0a0c09a1f6c45Nate Begeman  }
399305a1c75cfcc1b2e97c2bccebd42a70d99e7d127Nate Begeman  case ISD::MULHS:
400b5a0668d43582297e19d03df34e0a0c09a1f6c45Nate Begeman    assert(N->getValueType(0) == MVT::i32);
401305a1c75cfcc1b2e97c2bccebd42a70d99e7d127Nate Begeman    CurDAG->SelectNodeTo(N, MVT::i32, PPC::MULHW, Select(N->getOperand(0)),
402305a1c75cfcc1b2e97c2bccebd42a70d99e7d127Nate Begeman                         Select(N->getOperand(1)));
403b5a0668d43582297e19d03df34e0a0c09a1f6c45Nate Begeman    break;
404305a1c75cfcc1b2e97c2bccebd42a70d99e7d127Nate Begeman  case ISD::MULHU:
405b5a0668d43582297e19d03df34e0a0c09a1f6c45Nate Begeman    assert(N->getValueType(0) == MVT::i32);
406305a1c75cfcc1b2e97c2bccebd42a70d99e7d127Nate Begeman    CurDAG->SelectNodeTo(N, MVT::i32, PPC::MULHWU, Select(N->getOperand(0)),
407305a1c75cfcc1b2e97c2bccebd42a70d99e7d127Nate Begeman                         Select(N->getOperand(1)));
408b5a0668d43582297e19d03df34e0a0c09a1f6c45Nate Begeman    break;
409cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman  case ISD::AND: {
410a69404781344c4aee05935ee921bbf2844911bc0Nate Begeman    unsigned Imm;
411cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman    // If this is an and of a value rotated between 0 and 31 bits and then and'd
412cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman    // with a mask, emit rlwinm
413cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman    if (isIntImmediate(N->getOperand(1), Imm) && (isShiftedMask_32(Imm) ||
414cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman                                                  isShiftedMask_32(~Imm))) {
415cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman      SDOperand Val;
416a69404781344c4aee05935ee921bbf2844911bc0Nate Begeman      unsigned SH, MB, ME;
417cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman      if (isRotateAndMask(N->getOperand(0).Val, Imm, false, SH, MB, ME)) {
418cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman        Val = Select(N->getOperand(0).getOperand(0));
419cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman      } else {
420cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman        Val = Select(N->getOperand(0));
421cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman        isRunOfOnes(Imm, MB, ME);
422cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman        SH = 0;
423cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman      }
424cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman      CurDAG->SelectNodeTo(N, MVT::i32, PPC::RLWINM, Val, getI32Imm(SH),
425cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman                           getI32Imm(MB), getI32Imm(ME));
426cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman      break;
427cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman    }
428cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman    // If this is an and with an immediate that isn't a mask, then codegen it as
429cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman    // high and low 16 bit immediate ands.
430cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman    if (SDNode *I = SelectIntImmediateExpr(N->getOperand(0),
431cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman                                           N->getOperand(1),
432cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman                                           PPC::ANDISo, PPC::ANDIo)) {
433cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman      CurDAG->ReplaceAllUsesWith(N, I);
434cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman      N = I;
435cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman      break;
436cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman    }
437cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman    // Finally, check for the case where we are being asked to select
438cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman    // and (not(a), b) or and (a, not(b)) which can be selected as andc.
439cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman    if (isOprNot(N->getOperand(0).Val))
440cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman      CurDAG->SelectNodeTo(N, MVT::i32, PPC::ANDC, Select(N->getOperand(1)),
441cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman                           Select(N->getOperand(0).getOperand(0)));
442cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman    else if (isOprNot(N->getOperand(1).Val))
443cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman      CurDAG->SelectNodeTo(N, MVT::i32, PPC::ANDC, Select(N->getOperand(0)),
444cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman                           Select(N->getOperand(1).getOperand(0)));
445cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman    else
446cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman      CurDAG->SelectNodeTo(N, MVT::i32, PPC::AND, Select(N->getOperand(0)),
447cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman                           Select(N->getOperand(1)));
448cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman    break;
449cffc32b6e2e1edc2ddd62a00159f7008ee765d3eNate Begeman  }
4500f3257a3302b60c128a667db6736e81335316c1eNate Begeman  case ISD::XOR:
4510f3257a3302b60c128a667db6736e81335316c1eNate Begeman    // Check whether or not this node is a logical 'not'.  This is represented
4520f3257a3302b60c128a667db6736e81335316c1eNate Begeman    // by llvm as a xor with the constant value -1 (all bits set).  If this is a
4530f3257a3302b60c128a667db6736e81335316c1eNate Begeman    // 'not', then fold 'or' into 'nor', and so forth for the supported ops.
4540f3257a3302b60c128a667db6736e81335316c1eNate Begeman    if (isOprNot(N)) {
4550f3257a3302b60c128a667db6736e81335316c1eNate Begeman      unsigned Opc;
456131a8805205c383f67b3b6a11777401e27b90371Nate Begeman      SDOperand Val = Select(N->getOperand(0));
457131a8805205c383f67b3b6a11777401e27b90371Nate Begeman      switch (Val.getTargetOpcode()) {
4580f3257a3302b60c128a667db6736e81335316c1eNate Begeman      default:        Opc = 0;          break;
459131a8805205c383f67b3b6a11777401e27b90371Nate Begeman      case PPC::OR:   Opc = PPC::NOR;   break;
460131a8805205c383f67b3b6a11777401e27b90371Nate Begeman      case PPC::AND:  Opc = PPC::NAND;  break;
461131a8805205c383f67b3b6a11777401e27b90371Nate Begeman      case PPC::XOR:  Opc = PPC::EQV;   break;
4620f3257a3302b60c128a667db6736e81335316c1eNate Begeman      }
4630f3257a3302b60c128a667db6736e81335316c1eNate Begeman      if (Opc)
464131a8805205c383f67b3b6a11777401e27b90371Nate Begeman        CurDAG->SelectNodeTo(N, MVT::i32, Opc, Val.getOperand(0),
465131a8805205c383f67b3b6a11777401e27b90371Nate Begeman                             Val.getOperand(1));
4660f3257a3302b60c128a667db6736e81335316c1eNate Begeman      else
467131a8805205c383f67b3b6a11777401e27b90371Nate Begeman        CurDAG->SelectNodeTo(N, MVT::i32, PPC::NOR, Val, Val);
4680f3257a3302b60c128a667db6736e81335316c1eNate Begeman      break;
4690f3257a3302b60c128a667db6736e81335316c1eNate Begeman    }
4700f3257a3302b60c128a667db6736e81335316c1eNate Begeman    // If this is a xor with an immediate other than -1, then codegen it as high
4710f3257a3302b60c128a667db6736e81335316c1eNate Begeman    // and low 16 bit immediate xors.
4720f3257a3302b60c128a667db6736e81335316c1eNate Begeman    if (SDNode *I = SelectIntImmediateExpr(N->getOperand(0),
4730f3257a3302b60c128a667db6736e81335316c1eNate Begeman                                           N->getOperand(1),
4740f3257a3302b60c128a667db6736e81335316c1eNate Begeman                                           PPC::XORIS, PPC::XORI)) {
4750f3257a3302b60c128a667db6736e81335316c1eNate Begeman      CurDAG->ReplaceAllUsesWith(N, I);
4760f3257a3302b60c128a667db6736e81335316c1eNate Begeman      N = I;
4770f3257a3302b60c128a667db6736e81335316c1eNate Begeman      break;
4780f3257a3302b60c128a667db6736e81335316c1eNate Begeman    }
4790f3257a3302b60c128a667db6736e81335316c1eNate Begeman    // Finally, check for the case where we are being asked to select
4800f3257a3302b60c128a667db6736e81335316c1eNate Begeman    // xor (not(a), b) which is equivalent to not(xor a, b), which is eqv
4810f3257a3302b60c128a667db6736e81335316c1eNate Begeman    if (isOprNot(N->getOperand(0).Val))
4820f3257a3302b60c128a667db6736e81335316c1eNate Begeman      CurDAG->SelectNodeTo(N, MVT::i32, PPC::EQV,
4830f3257a3302b60c128a667db6736e81335316c1eNate Begeman                           Select(N->getOperand(0).getOperand(0)),
4840f3257a3302b60c128a667db6736e81335316c1eNate Begeman                           Select(N->getOperand(1)));
4850f3257a3302b60c128a667db6736e81335316c1eNate Begeman    else
4860f3257a3302b60c128a667db6736e81335316c1eNate Begeman      CurDAG->SelectNodeTo(N, MVT::i32, PPC::XOR, Select(N->getOperand(0)),
4870f3257a3302b60c128a667db6736e81335316c1eNate Begeman                           Select(N->getOperand(1)));
4880f3257a3302b60c128a667db6736e81335316c1eNate Begeman    break;
489c15ed447f494c77a76c24661893e22192ebb2103Nate Begeman  case ISD::SHL: {
490c15ed447f494c77a76c24661893e22192ebb2103Nate Begeman    unsigned Imm, SH, MB, ME;
491c15ed447f494c77a76c24661893e22192ebb2103Nate Begeman    if (isOpcWithIntImmediate(N->getOperand(0).Val, ISD::AND, Imm) &&
492c15ed447f494c77a76c24661893e22192ebb2103Nate Begeman        isRotateAndMask(N, Imm, true, SH, MB, ME))
493c15ed447f494c77a76c24661893e22192ebb2103Nate Begeman      CurDAG->SelectNodeTo(N, MVT::i32, PPC::RLWINM,
494c15ed447f494c77a76c24661893e22192ebb2103Nate Begeman                           Select(N->getOperand(0).getOperand(0)),
495c15ed447f494c77a76c24661893e22192ebb2103Nate Begeman                           getI32Imm(SH), getI32Imm(MB), getI32Imm(ME));
496c15ed447f494c77a76c24661893e22192ebb2103Nate Begeman    else if (isIntImmediate(N->getOperand(1), Imm))
497c15ed447f494c77a76c24661893e22192ebb2103Nate Begeman      CurDAG->SelectNodeTo(N, MVT::i32, PPC::RLWINM, Select(N->getOperand(0)),
498c15ed447f494c77a76c24661893e22192ebb2103Nate Begeman                           getI32Imm(Imm), getI32Imm(0), getI32Imm(31-Imm));
499c15ed447f494c77a76c24661893e22192ebb2103Nate Begeman    else
500c15ed447f494c77a76c24661893e22192ebb2103Nate Begeman      CurDAG->SelectNodeTo(N, MVT::i32, PPC::SLW, Select(N->getOperand(0)),
501c15ed447f494c77a76c24661893e22192ebb2103Nate Begeman                           Select(N->getOperand(1)));
502c15ed447f494c77a76c24661893e22192ebb2103Nate Begeman    break;
503c15ed447f494c77a76c24661893e22192ebb2103Nate Begeman  }
504c15ed447f494c77a76c24661893e22192ebb2103Nate Begeman  case ISD::SRL: {
505c15ed447f494c77a76c24661893e22192ebb2103Nate Begeman    unsigned Imm, SH, MB, ME;
506c15ed447f494c77a76c24661893e22192ebb2103Nate Begeman    if (isOpcWithIntImmediate(N->getOperand(0).Val, ISD::AND, Imm) &&
507c15ed447f494c77a76c24661893e22192ebb2103Nate Begeman        isRotateAndMask(N, Imm, true, SH, MB, ME))
508c15ed447f494c77a76c24661893e22192ebb2103Nate Begeman      CurDAG->SelectNodeTo(N, MVT::i32, PPC::RLWINM,
509c15ed447f494c77a76c24661893e22192ebb2103Nate Begeman                           Select(N->getOperand(0).getOperand(0)),
510c15ed447f494c77a76c24661893e22192ebb2103Nate Begeman                           getI32Imm(SH), getI32Imm(MB), getI32Imm(ME));
511c15ed447f494c77a76c24661893e22192ebb2103Nate Begeman    else if (isIntImmediate(N->getOperand(1), Imm))
512c15ed447f494c77a76c24661893e22192ebb2103Nate Begeman      CurDAG->SelectNodeTo(N, MVT::i32, PPC::RLWINM, Select(N->getOperand(0)),
513c15ed447f494c77a76c24661893e22192ebb2103Nate Begeman                           getI32Imm(32-Imm), getI32Imm(Imm), getI32Imm(31));
514c15ed447f494c77a76c24661893e22192ebb2103Nate Begeman    else
515c15ed447f494c77a76c24661893e22192ebb2103Nate Begeman      CurDAG->SelectNodeTo(N, MVT::i32, PPC::SRW, Select(N->getOperand(0)),
516c15ed447f494c77a76c24661893e22192ebb2103Nate Begeman                           Select(N->getOperand(1)));
517c15ed447f494c77a76c24661893e22192ebb2103Nate Begeman    break;
518c15ed447f494c77a76c24661893e22192ebb2103Nate Begeman  }
519c15ed447f494c77a76c24661893e22192ebb2103Nate Begeman  case ISD::SRA: {
520c15ed447f494c77a76c24661893e22192ebb2103Nate Begeman    unsigned Imm, SH, MB, ME;
521c15ed447f494c77a76c24661893e22192ebb2103Nate Begeman    if (isOpcWithIntImmediate(N->getOperand(0).Val, ISD::AND, Imm) &&
522c15ed447f494c77a76c24661893e22192ebb2103Nate Begeman        isRotateAndMask(N, Imm, true, SH, MB, ME))
523c15ed447f494c77a76c24661893e22192ebb2103Nate Begeman      CurDAG->SelectNodeTo(N, MVT::i32, PPC::RLWINM,
524c15ed447f494c77a76c24661893e22192ebb2103Nate Begeman                           Select(N->getOperand(0).getOperand(0)),
525c15ed447f494c77a76c24661893e22192ebb2103Nate Begeman                           getI32Imm(SH), getI32Imm(MB), getI32Imm(ME));
526c15ed447f494c77a76c24661893e22192ebb2103Nate Begeman    else if (isIntImmediate(N->getOperand(1), Imm))
527c15ed447f494c77a76c24661893e22192ebb2103Nate Begeman      CurDAG->SelectNodeTo(N, MVT::i32, PPC::SRAWI, Select(N->getOperand(0)),
528c15ed447f494c77a76c24661893e22192ebb2103Nate Begeman                           getI32Imm(Imm));
529c15ed447f494c77a76c24661893e22192ebb2103Nate Begeman    else
530c15ed447f494c77a76c24661893e22192ebb2103Nate Begeman      CurDAG->SelectNodeTo(N, MVT::i32, PPC::SRAW, Select(N->getOperand(0)),
531c15ed447f494c77a76c24661893e22192ebb2103Nate Begeman                           Select(N->getOperand(1)));
532c15ed447f494c77a76c24661893e22192ebb2103Nate Begeman    break;
533c15ed447f494c77a76c24661893e22192ebb2103Nate Begeman  }
534305a1c75cfcc1b2e97c2bccebd42a70d99e7d127Nate Begeman  case ISD::FABS:
5356a7d61179c77c23dc22cd64e5e922bc40ed234e9Nate Begeman    CurDAG->SelectNodeTo(N, N->getValueType(0), PPC::FABS,
5366a7d61179c77c23dc22cd64e5e922bc40ed234e9Nate Begeman                         Select(N->getOperand(0)));
5376a7d61179c77c23dc22cd64e5e922bc40ed234e9Nate Begeman    break;
538305a1c75cfcc1b2e97c2bccebd42a70d99e7d127Nate Begeman  case ISD::FP_EXTEND:
539305a1c75cfcc1b2e97c2bccebd42a70d99e7d127Nate Begeman    assert(MVT::f64 == N->getValueType(0) &&
540305a1c75cfcc1b2e97c2bccebd42a70d99e7d127Nate Begeman           MVT::f32 == N->getOperand(0).getValueType() && "Illegal FP_EXTEND");
541305a1c75cfcc1b2e97c2bccebd42a70d99e7d127Nate Begeman    CurDAG->SelectNodeTo(N, MVT::f64, PPC::FMR, Select(N->getOperand(0)));
542305a1c75cfcc1b2e97c2bccebd42a70d99e7d127Nate Begeman    break;
543305a1c75cfcc1b2e97c2bccebd42a70d99e7d127Nate Begeman  case ISD::FP_ROUND:
544305a1c75cfcc1b2e97c2bccebd42a70d99e7d127Nate Begeman    assert(MVT::f32 == N->getValueType(0) &&
545305a1c75cfcc1b2e97c2bccebd42a70d99e7d127Nate Begeman           MVT::f64 == N->getOperand(0).getValueType() && "Illegal FP_ROUND");
546305a1c75cfcc1b2e97c2bccebd42a70d99e7d127Nate Begeman    CurDAG->SelectNodeTo(N, MVT::f32, PPC::FRSP, Select(N->getOperand(0)));
547305a1c75cfcc1b2e97c2bccebd42a70d99e7d127Nate Begeman    break;
54826653500bbbc21cd1c2d12ecc433fa439536b657Nate Begeman  case ISD::FNEG: {
54926653500bbbc21cd1c2d12ecc433fa439536b657Nate Begeman    SDOperand Val = Select(N->getOperand(0));
55026653500bbbc21cd1c2d12ecc433fa439536b657Nate Begeman    MVT::ValueType Ty = N->getValueType(0);
55126653500bbbc21cd1c2d12ecc433fa439536b657Nate Begeman    if (Val.Val->hasOneUse()) {
55226653500bbbc21cd1c2d12ecc433fa439536b657Nate Begeman      unsigned Opc;
55326653500bbbc21cd1c2d12ecc433fa439536b657Nate Begeman      switch (Val.getTargetOpcode()) {
55426653500bbbc21cd1c2d12ecc433fa439536b657Nate Begeman      default:          Opc = 0;            break;
55526653500bbbc21cd1c2d12ecc433fa439536b657Nate Begeman      case PPC::FABS:   Opc = PPC::FNABS;   break;
55626653500bbbc21cd1c2d12ecc433fa439536b657Nate Begeman      case PPC::FMADD:  Opc = PPC::FNMADD;  break;
55726653500bbbc21cd1c2d12ecc433fa439536b657Nate Begeman      case PPC::FMADDS: Opc = PPC::FNMADDS; break;
55826653500bbbc21cd1c2d12ecc433fa439536b657Nate Begeman      case PPC::FMSUB:  Opc = PPC::FNMSUB;  break;
55926653500bbbc21cd1c2d12ecc433fa439536b657Nate Begeman      case PPC::FMSUBS: Opc = PPC::FNMSUBS; break;
56026653500bbbc21cd1c2d12ecc433fa439536b657Nate Begeman      }
56126653500bbbc21cd1c2d12ecc433fa439536b657Nate Begeman      // If we inverted the opcode, then emit the new instruction with the
56226653500bbbc21cd1c2d12ecc433fa439536b657Nate Begeman      // inverted opcode and the original instruction's operands.  Otherwise,
56326653500bbbc21cd1c2d12ecc433fa439536b657Nate Begeman      // fall through and generate a fneg instruction.
56426653500bbbc21cd1c2d12ecc433fa439536b657Nate Begeman      if (Opc) {
56526653500bbbc21cd1c2d12ecc433fa439536b657Nate Begeman        if (PPC::FNABS == Opc)
56626653500bbbc21cd1c2d12ecc433fa439536b657Nate Begeman          CurDAG->SelectNodeTo(N, Ty, Opc, Val.getOperand(0));
56726653500bbbc21cd1c2d12ecc433fa439536b657Nate Begeman        else
56826653500bbbc21cd1c2d12ecc433fa439536b657Nate Begeman          CurDAG->SelectNodeTo(N, Ty, Opc, Val.getOperand(0),
56926653500bbbc21cd1c2d12ecc433fa439536b657Nate Begeman                               Val.getOperand(1), Val.getOperand(2));
57026653500bbbc21cd1c2d12ecc433fa439536b657Nate Begeman        break;
57126653500bbbc21cd1c2d12ecc433fa439536b657Nate Begeman      }
57226653500bbbc21cd1c2d12ecc433fa439536b657Nate Begeman    }
57326653500bbbc21cd1c2d12ecc433fa439536b657Nate Begeman    CurDAG->SelectNodeTo(N, Ty, PPC::FNEG, Val);
57426653500bbbc21cd1c2d12ecc433fa439536b657Nate Begeman    break;
57526653500bbbc21cd1c2d12ecc433fa439536b657Nate Begeman  }
5766a7d61179c77c23dc22cd64e5e922bc40ed234e9Nate Begeman  case ISD::FSQRT: {
5776a7d61179c77c23dc22cd64e5e922bc40ed234e9Nate Begeman    MVT::ValueType Ty = N->getValueType(0);
5786a7d61179c77c23dc22cd64e5e922bc40ed234e9Nate Begeman    CurDAG->SelectNodeTo(N, Ty, Ty == MVT::f64 ? PPC::FSQRT : PPC::FSQRTS,
5796a7d61179c77c23dc22cd64e5e922bc40ed234e9Nate Begeman                         Select(N->getOperand(0)));
5806a7d61179c77c23dc22cd64e5e922bc40ed234e9Nate Begeman    break;
5816a7d61179c77c23dc22cd64e5e922bc40ed234e9Nate Begeman  }
582a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  case ISD::RET: {
583a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    SDOperand Chain = Select(N->getOperand(0));     // Token chain.
584a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner
585a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    if (N->getNumOperands() > 1) {
586a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      SDOperand Val = Select(N->getOperand(1));
587a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      switch (N->getOperand(1).getValueType()) {
588a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      default: assert(0 && "Unknown return type!");
589a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      case MVT::f64:
590a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      case MVT::f32:
591a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner        Chain = CurDAG->getCopyToReg(Chain, PPC::F1, Val);
592a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner        break;
593a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      case MVT::i32:
594a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner        Chain = CurDAG->getCopyToReg(Chain, PPC::R3, Val);
595a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner        break;
596a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      }
597a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner
598a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      if (N->getNumOperands() > 2) {
599a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner        assert(N->getOperand(1).getValueType() == MVT::i32 &&
600a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner               N->getOperand(2).getValueType() == MVT::i32 &&
601a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner               N->getNumOperands() == 2 && "Unknown two-register ret value!");
602a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner        Val = Select(N->getOperand(2));
603a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner        Chain = CurDAG->getCopyToReg(Chain, PPC::R4, Val);
604a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      }
605a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    }
606a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner
607a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    // Finally, select this to a blr (return) instruction.
608a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    CurDAG->SelectNodeTo(N, MVT::Other, PPC::BLR, Chain);
609a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    break;
610a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  }
611a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  }
612a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  return SDOperand(N, 0);
613a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner}
614a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner
615a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner
616a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner/// createPPC32ISelDag - This pass converts a legalized DAG into a
617a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner/// PowerPC-specific DAG, ready for instruction scheduling.
618a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner///
619a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris LattnerFunctionPass *llvm::createPPC32ISelDag(TargetMachine &TM) {
620a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  return new PPC32DAGToDAGISel(TM);
621a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner}
622a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner
623