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