PPCISelDAGToDAG.cpp revision 26653500bbbc21cd1c2d12ecc433fa439536b657
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    unsigned GlobalBaseReg;
39a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    bool GlobalBaseInitialized;
40a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  public:
41a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    PPC32DAGToDAGISel(TargetMachine &TM)
42a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      : SelectionDAGISel(PPC32Lowering), PPC32Lowering(TM) {}
43a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner
44a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    /// runOnFunction - Override this function in order to reset our
45a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    /// per-function variables.
46a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    virtual bool runOnFunction(Function &Fn) {
47a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      // Make sure we re-emit a set of the global base reg if necessary
48a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      GlobalBaseInitialized = false;
49a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      return SelectionDAGISel::runOnFunction(Fn);
50a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    }
51a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner
52a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    /// getI32Imm - Return a target constant with the specified value, of type
53a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    /// i32.
54a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    inline SDOperand getI32Imm(unsigned Imm) {
55a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      return CurDAG->getTargetConstant(Imm, MVT::i32);
56a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    }
57a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner
58a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    // Select - Convert the specified operand from a target-independent to a
59a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    // target-specific node if it hasn't already been changed.
60a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    SDOperand Select(SDOperand Op);
61a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner
62a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    SDNode *SelectIntImmediateExpr(SDOperand LHS, SDOperand RHS,
63a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner                                   unsigned OCHi, unsigned OCLo,
64a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner                                   bool IsArithmetic = false,
65a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner                                   bool Negate = false);
66a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner
67a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    /// InstructionSelectBasicBlock - This callback is invoked by
68a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    /// SelectionDAGISel when it has created a SelectionDAG for us to codegen.
69a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    virtual void InstructionSelectBasicBlock(SelectionDAG &DAG) {
70a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      DEBUG(BB->dump());
71a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      // Codegen the basic block.
72a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      Select(DAG.getRoot());
73a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      DAG.RemoveDeadNodes();
74a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      DAG.viewGraph();
75a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    }
76a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner
77a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    virtual const char *getPassName() const {
78a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      return "PowerPC DAG->DAG Pattern Instruction Selection";
79a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    }
80a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  };
81a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner}
82a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner
83a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner// Immediate constant composers.
84a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner// Lo16 - grabs the lo 16 bits from a 32 bit constant.
85a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner// Hi16 - grabs the hi 16 bits from a 32 bit constant.
86a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner// HA16 - computes the hi bits required if the lo bits are add/subtracted in
87a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner// arithmethically.
88a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattnerstatic unsigned Lo16(unsigned x)  { return x & 0x0000FFFF; }
89a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattnerstatic unsigned Hi16(unsigned x)  { return Lo16(x >> 16); }
90a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattnerstatic unsigned HA16(unsigned x)  { return Hi16((signed)x - (signed short)x); }
91a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner
92a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner// isIntImmediate - This method tests to see if a constant operand.
93a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner// If so Imm will receive the 32 bit value.
94a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattnerstatic bool isIntImmediate(SDOperand N, unsigned& Imm) {
95a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  if (ConstantSDNode *CN = dyn_cast<ConstantSDNode>(N)) {
96a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    Imm = (unsigned)CN->getSignExtended();
97a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    return true;
98a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  }
99a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  return false;
100a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner}
101a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner
102a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner// SelectIntImmediateExpr - Choose code for integer operations with an immediate
103a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner// operand.
104a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris LattnerSDNode *PPC32DAGToDAGISel::SelectIntImmediateExpr(SDOperand LHS, SDOperand RHS,
105a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner                                                  unsigned OCHi, unsigned OCLo,
106a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner                                                  bool IsArithmetic,
107a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner                                                  bool Negate) {
108a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  // Check to make sure this is a constant.
109a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  ConstantSDNode *CN = dyn_cast<ConstantSDNode>(RHS);
110a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  // Exit if not a constant.
111a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  if (!CN) return 0;
112a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  // Extract immediate.
113a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  unsigned C = (unsigned)CN->getValue();
114a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  // Negate if required (ISD::SUB).
115a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  if (Negate) C = -C;
116a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  // Get the hi and lo portions of constant.
117a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  unsigned Hi = IsArithmetic ? HA16(C) : Hi16(C);
118a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  unsigned Lo = Lo16(C);
119a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner
120a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  // If two instructions are needed and usage indicates it would be better to
121a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  // load immediate into a register, bail out.
122a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  if (Hi && Lo && CN->use_size() > 2) return false;
123a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner
124a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  // Select the first operand.
125a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  SDOperand Opr0 = Select(LHS);
126a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner
127a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  if (Lo)  // Add in the lo-part.
128a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    Opr0 = CurDAG->getTargetNode(OCLo, MVT::i32, Opr0, getI32Imm(Lo));
129a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  if (Hi)  // Add in the hi-part.
130a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    Opr0 = CurDAG->getTargetNode(OCHi, MVT::i32, Opr0, getI32Imm(Hi));
131a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  return Opr0.Val;
132a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner}
133a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner
134a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner
135a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner// Select - Convert the specified operand from a target-independent to a
136a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner// target-specific node if it hasn't already been changed.
137a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris LattnerSDOperand PPC32DAGToDAGISel::Select(SDOperand Op) {
138a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  SDNode *N = Op.Val;
139a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  if (N->getOpcode() >= ISD::BUILTIN_OP_END)
140a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    return Op;   // Already selected.
141a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner
142a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  switch (N->getOpcode()) {
143a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  default:
144a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    std::cerr << "Cannot yet select: ";
145a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    N->dump();
146a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    std::cerr << "\n";
147a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    abort();
148a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  case ISD::EntryToken:       // These leaves remain the same.
149a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  case ISD::UNDEF:
150a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    return Op;
151a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  case ISD::TokenFactor: {
152a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    SDOperand New;
153a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    if (N->getNumOperands() == 2) {
154a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      SDOperand Op0 = Select(N->getOperand(0));
155a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      SDOperand Op1 = Select(N->getOperand(1));
156a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      New = CurDAG->getNode(ISD::TokenFactor, MVT::Other, Op0, Op1);
157a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    } else {
158a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      std::vector<SDOperand> Ops;
159a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i)
160a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner        Ops.push_back(Select(N->getOperand(0)));
161a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      New = CurDAG->getNode(ISD::TokenFactor, MVT::Other, Ops);
162a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    }
163a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner
164a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    if (New.Val != N) {
165a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      CurDAG->ReplaceAllUsesWith(N, New.Val);
166a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      N = New.Val;
167a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    }
168a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    break;
169a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  }
170a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  case ISD::CopyFromReg: {
171a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    SDOperand Chain = Select(N->getOperand(0));
172a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    if (Chain == N->getOperand(0)) return Op; // No change
173a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    SDOperand New = CurDAG->getCopyFromReg(Chain,
174a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner         cast<RegisterSDNode>(N->getOperand(1))->getReg(), N->getValueType(0));
175a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    return New.getValue(Op.ResNo);
176a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  }
177a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  case ISD::CopyToReg: {
178a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    SDOperand Chain = Select(N->getOperand(0));
179a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    SDOperand Reg = N->getOperand(1);
180a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    SDOperand Val = Select(N->getOperand(2));
181a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    if (Chain != N->getOperand(0) || Val != N->getOperand(2)) {
182a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      SDOperand New = CurDAG->getNode(ISD::CopyToReg, MVT::Other,
183a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner                                      Chain, Reg, Val);
184a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      CurDAG->ReplaceAllUsesWith(N, New.Val);
185a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      N = New.Val;
186a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    }
187a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    break;
188a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  }
189a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  case ISD::Constant: {
190a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    assert(N->getValueType(0) == MVT::i32);
191a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    unsigned v = (unsigned)cast<ConstantSDNode>(N)->getValue();
192a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    if ((unsigned)(short)v == v) {
193a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      CurDAG->SelectNodeTo(N, MVT::i32, PPC::LI, getI32Imm(v));
194a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      break;
195a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    } else {
196a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      SDOperand Top = CurDAG->getTargetNode(PPC::LIS, MVT::i32,
197a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner                                            getI32Imm(unsigned(v) >> 16));
198a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      CurDAG->SelectNodeTo(N, MVT::i32, PPC::ORI, Top, getI32Imm(v & 0xFFFF));
199a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      break;
200a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    }
201a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  }
202a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  case ISD::ADD: {
203a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    MVT::ValueType Ty = N->getValueType(0);
204a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    if (Ty == MVT::i32) {
205a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      if (SDNode *I = SelectIntImmediateExpr(N->getOperand(0), N->getOperand(1),
206a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner                                             PPC::ADDIS, PPC::ADDI, true)) {
207a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner        CurDAG->ReplaceAllUsesWith(N, I);
208a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner        N = I;
209a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      } else {
210a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner        CurDAG->SelectNodeTo(N, Ty, PPC::ADD, Select(N->getOperand(0)),
211a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner                             Select(N->getOperand(1)));
212a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      }
213a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      break;
214a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    }
215a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner
216a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    if (!NoExcessFPPrecision) {  // Match FMA ops
217a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      if (N->getOperand(0).getOpcode() == ISD::MUL &&
218a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner          N->getOperand(0).Val->hasOneUse()) {
219a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner        ++FusedFP; // Statistic
220a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner        CurDAG->SelectNodeTo(N, Ty, Ty == MVT::f64 ? PPC::FMADD : PPC::FMADDS,
221a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner                             Select(N->getOperand(0).getOperand(0)),
222a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner                             Select(N->getOperand(0).getOperand(1)),
223a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner                             Select(N->getOperand(1)));
224a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner        break;
225a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      } else if (N->getOperand(1).getOpcode() == ISD::MUL &&
226a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner                 N->getOperand(1).hasOneUse()) {
227a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner        ++FusedFP; // Statistic
228a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner        CurDAG->SelectNodeTo(N, Ty, Ty == MVT::f64 ? PPC::FMADD : PPC::FMADDS,
229a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner                             Select(N->getOperand(1).getOperand(0)),
230a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner                             Select(N->getOperand(1).getOperand(1)),
231a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner                             Select(N->getOperand(0)));
232a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner        break;
233a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      }
234a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    }
235a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner
236a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    CurDAG->SelectNodeTo(N, Ty, Ty == MVT::f64 ? PPC::FADD : PPC::FADDS,
237a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner                         Select(N->getOperand(0)), Select(N->getOperand(1)));
238a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    break;
239a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  }
240a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  case ISD::SUB: {
241a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    MVT::ValueType Ty = N->getValueType(0);
242a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    if (Ty == MVT::i32) {
243a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      unsigned Imm;
244a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      if (isIntImmediate(N->getOperand(0), Imm) && isInt16(Imm)) {
245a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner        CurDAG->SelectNodeTo(N, Ty, PPC::SUBFIC, Select(N->getOperand(1)),
246a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner                             getI32Imm(Lo16(Imm)));
247a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner        break;
248a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      }
249a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      if (SDNode *I = SelectIntImmediateExpr(N->getOperand(0), N->getOperand(1),
250a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner                                          PPC::ADDIS, PPC::ADDI, true, true)) {
251a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner        CurDAG->ReplaceAllUsesWith(N, I);
252a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner        N = I;
253a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      } else {
254a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner        CurDAG->SelectNodeTo(N, Ty, PPC::SUBF, Select(N->getOperand(1)),
255a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner                             Select(N->getOperand(0)));
256a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      }
257a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      break;
258a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    }
259a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner
260a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    if (!NoExcessFPPrecision) {  // Match FMA ops
261a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      if (N->getOperand(0).getOpcode() == ISD::MUL &&
262a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner          N->getOperand(0).Val->hasOneUse()) {
263a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner        ++FusedFP; // Statistic
264a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner        CurDAG->SelectNodeTo(N, Ty, Ty == MVT::f64 ? PPC::FMSUB : PPC::FMSUBS,
265a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner                             Select(N->getOperand(0).getOperand(0)),
266a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner                             Select(N->getOperand(0).getOperand(1)),
267a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner                             Select(N->getOperand(1)));
268a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner        break;
269a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      } else if (N->getOperand(1).getOpcode() == ISD::MUL &&
270a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner                 N->getOperand(1).Val->hasOneUse()) {
271a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner        ++FusedFP; // Statistic
272a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner        CurDAG->SelectNodeTo(N, Ty, Ty == MVT::f64 ? PPC::FNMSUB : PPC::FNMSUBS,
273a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner                             Select(N->getOperand(1).getOperand(0)),
274a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner                             Select(N->getOperand(1).getOperand(1)),
275a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner                             Select(N->getOperand(0)));
276a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner        break;
277a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      }
278a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    }
279a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    CurDAG->SelectNodeTo(N, Ty, Ty == MVT::f64 ? PPC::FSUB : PPC::FSUBS,
280a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner                         Select(N->getOperand(0)),
281a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner                         Select(N->getOperand(1)));
282a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    break;
28326653500bbbc21cd1c2d12ecc433fa439536b657Nate Begeman  }
28426653500bbbc21cd1c2d12ecc433fa439536b657Nate Begeman  case ISD::FNEG: {
28526653500bbbc21cd1c2d12ecc433fa439536b657Nate Begeman    SDOperand Val = Select(N->getOperand(0));
28626653500bbbc21cd1c2d12ecc433fa439536b657Nate Begeman    MVT::ValueType Ty = N->getValueType(0);
28726653500bbbc21cd1c2d12ecc433fa439536b657Nate Begeman    if (Val.Val->hasOneUse()) {
28826653500bbbc21cd1c2d12ecc433fa439536b657Nate Begeman      unsigned Opc;
28926653500bbbc21cd1c2d12ecc433fa439536b657Nate Begeman      switch (Val.getTargetOpcode()) {
29026653500bbbc21cd1c2d12ecc433fa439536b657Nate Begeman      default:          Opc = 0;            break;
29126653500bbbc21cd1c2d12ecc433fa439536b657Nate Begeman      case PPC::FABS:   Opc = PPC::FNABS;   break;
29226653500bbbc21cd1c2d12ecc433fa439536b657Nate Begeman      case PPC::FMADD:  Opc = PPC::FNMADD;  break;
29326653500bbbc21cd1c2d12ecc433fa439536b657Nate Begeman      case PPC::FMADDS: Opc = PPC::FNMADDS; break;
29426653500bbbc21cd1c2d12ecc433fa439536b657Nate Begeman      case PPC::FMSUB:  Opc = PPC::FNMSUB;  break;
29526653500bbbc21cd1c2d12ecc433fa439536b657Nate Begeman      case PPC::FMSUBS: Opc = PPC::FNMSUBS; break;
29626653500bbbc21cd1c2d12ecc433fa439536b657Nate Begeman      }
29726653500bbbc21cd1c2d12ecc433fa439536b657Nate Begeman      // If we inverted the opcode, then emit the new instruction with the
29826653500bbbc21cd1c2d12ecc433fa439536b657Nate Begeman      // inverted opcode and the original instruction's operands.  Otherwise,
29926653500bbbc21cd1c2d12ecc433fa439536b657Nate Begeman      // fall through and generate a fneg instruction.
30026653500bbbc21cd1c2d12ecc433fa439536b657Nate Begeman      if (Opc) {
30126653500bbbc21cd1c2d12ecc433fa439536b657Nate Begeman        if (PPC::FNABS == Opc)
30226653500bbbc21cd1c2d12ecc433fa439536b657Nate Begeman          CurDAG->SelectNodeTo(N, Ty, Opc, Val.getOperand(0));
30326653500bbbc21cd1c2d12ecc433fa439536b657Nate Begeman        else
30426653500bbbc21cd1c2d12ecc433fa439536b657Nate Begeman          CurDAG->SelectNodeTo(N, Ty, Opc, Val.getOperand(0),
30526653500bbbc21cd1c2d12ecc433fa439536b657Nate Begeman                               Val.getOperand(1), Val.getOperand(2));
30626653500bbbc21cd1c2d12ecc433fa439536b657Nate Begeman        break;
30726653500bbbc21cd1c2d12ecc433fa439536b657Nate Begeman      }
30826653500bbbc21cd1c2d12ecc433fa439536b657Nate Begeman    }
30926653500bbbc21cd1c2d12ecc433fa439536b657Nate Begeman    CurDAG->SelectNodeTo(N, Ty, PPC::FNEG, Val);
31026653500bbbc21cd1c2d12ecc433fa439536b657Nate Begeman    break;
31126653500bbbc21cd1c2d12ecc433fa439536b657Nate Begeman  }
312a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  case ISD::RET: {
313a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    SDOperand Chain = Select(N->getOperand(0));     // Token chain.
314a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner
315a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    if (N->getNumOperands() > 1) {
316a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      SDOperand Val = Select(N->getOperand(1));
317a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      switch (N->getOperand(1).getValueType()) {
318a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      default: assert(0 && "Unknown return type!");
319a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      case MVT::f64:
320a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      case MVT::f32:
321a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner        Chain = CurDAG->getCopyToReg(Chain, PPC::F1, Val);
322a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner        break;
323a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      case MVT::i32:
324a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner        Chain = CurDAG->getCopyToReg(Chain, PPC::R3, Val);
325a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner        break;
326a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      }
327a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner
328a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      if (N->getNumOperands() > 2) {
329a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner        assert(N->getOperand(1).getValueType() == MVT::i32 &&
330a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner               N->getOperand(2).getValueType() == MVT::i32 &&
331a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner               N->getNumOperands() == 2 && "Unknown two-register ret value!");
332a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner        Val = Select(N->getOperand(2));
333a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner        Chain = CurDAG->getCopyToReg(Chain, PPC::R4, Val);
334a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner      }
335a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    }
336a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner
337a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    // Finally, select this to a blr (return) instruction.
338a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    CurDAG->SelectNodeTo(N, MVT::Other, PPC::BLR, Chain);
339a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner    break;
340a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  }
341a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  }
342a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  return SDOperand(N, 0);
343a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner}
344a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner
345a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner
346a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner/// createPPC32ISelDag - This pass converts a legalized DAG into a
347a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner/// PowerPC-specific DAG, ready for instruction scheduling.
348a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner///
349a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris LattnerFunctionPass *llvm::createPPC32ISelDag(TargetMachine &TM) {
350a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner  return new PPC32DAGToDAGISel(TM);
351a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner}
352a5a91b10262f5bbcf1ec8abd1e66ee6585d3f00eChris Lattner
353