SparcISelDAGToDAG.cpp revision 6c18b10ad4873ad7e1b1c1d589bcf844c46f4120
1//===-- SparcV8ISelDAGToDAG.cpp - A dag to dag inst selector for SparcV8 --===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file was developed by Chris Lattner and is distributed under 6// the University of Illinois Open Source License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file defines an instruction selector for the V8 target 11// 12//===----------------------------------------------------------------------===// 13 14#include "SparcV8.h" 15#include "SparcV8TargetMachine.h" 16#include "llvm/CodeGen/SelectionDAG.h" 17#include "llvm/CodeGen/SelectionDAGISel.h" 18#include "llvm/Target/TargetLowering.h" 19#include "llvm/Support/Debug.h" 20#include <iostream> 21using namespace llvm; 22 23//===----------------------------------------------------------------------===// 24// TargetLowering Implementation 25//===----------------------------------------------------------------------===// 26 27namespace { 28 class SparcV8TargetLowering : public TargetLowering { 29 public: 30 SparcV8TargetLowering(TargetMachine &TM); 31 32 virtual std::vector<SDOperand> 33 LowerArguments(Function &F, SelectionDAG &DAG); 34 virtual std::pair<SDOperand, SDOperand> 35 LowerCallTo(SDOperand Chain, const Type *RetTy, bool isVarArg, 36 unsigned CC, 37 bool isTailCall, SDOperand Callee, ArgListTy &Args, 38 SelectionDAG &DAG); 39 40 virtual SDOperand LowerReturnTo(SDOperand Chain, SDOperand Op, 41 SelectionDAG &DAG); 42 virtual SDOperand LowerVAStart(SDOperand Chain, SDOperand VAListP, 43 Value *VAListV, SelectionDAG &DAG); 44 virtual std::pair<SDOperand,SDOperand> 45 LowerVAArg(SDOperand Chain, SDOperand VAListP, Value *VAListV, 46 const Type *ArgTy, SelectionDAG &DAG); 47 virtual std::pair<SDOperand, SDOperand> 48 LowerFrameReturnAddress(bool isFrameAddr, SDOperand Chain, unsigned Depth, 49 SelectionDAG &DAG); 50 }; 51} 52 53SparcV8TargetLowering::SparcV8TargetLowering(TargetMachine &TM) 54 : TargetLowering(TM) { 55 56 // Set up the register classes. 57 addRegisterClass(MVT::i32, V8::IntRegsRegisterClass); 58 addRegisterClass(MVT::f32, V8::FPRegsRegisterClass); 59 addRegisterClass(MVT::f64, V8::DFPRegsRegisterClass); 60 61 computeRegisterProperties(); 62} 63 64std::vector<SDOperand> 65SparcV8TargetLowering::LowerArguments(Function &F, SelectionDAG &DAG) { 66 assert(0 && "Unimp"); 67 abort(); 68} 69 70std::pair<SDOperand, SDOperand> 71SparcV8TargetLowering::LowerCallTo(SDOperand Chain, const Type *RetTy, 72 bool isVarArg, unsigned CC, 73 bool isTailCall, SDOperand Callee, 74 ArgListTy &Args, SelectionDAG &DAG) { 75 assert(0 && "Unimp"); 76 abort(); 77} 78 79SDOperand SparcV8TargetLowering::LowerReturnTo(SDOperand Chain, SDOperand Op, 80 SelectionDAG &DAG) { 81 assert(0 && "Unimp"); 82 abort(); 83} 84 85SDOperand SparcV8TargetLowering::LowerVAStart(SDOperand Chain, SDOperand VAListP, 86 Value *VAListV, SelectionDAG &DAG) { 87 assert(0 && "Unimp"); 88 abort(); 89} 90 91std::pair<SDOperand,SDOperand> 92SparcV8TargetLowering::LowerVAArg(SDOperand Chain, SDOperand VAListP, Value *VAListV, 93 const Type *ArgTy, SelectionDAG &DAG) { 94 assert(0 && "Unimp"); 95 abort(); 96} 97 98std::pair<SDOperand, SDOperand> 99SparcV8TargetLowering::LowerFrameReturnAddress(bool isFrameAddr, SDOperand Chain, unsigned Depth, 100 SelectionDAG &DAG) { 101 assert(0 && "Unimp"); 102 abort(); 103} 104 105//===----------------------------------------------------------------------===// 106// Instruction Selector Implementation 107//===----------------------------------------------------------------------===// 108 109//===--------------------------------------------------------------------===// 110/// SparcV8DAGToDAGISel - PPC specific code to select Sparc V8 machine 111/// instructions for SelectionDAG operations. 112/// 113namespace { 114class SparcV8DAGToDAGISel : public SelectionDAGISel { 115 SparcV8TargetLowering V8Lowering; 116public: 117 SparcV8DAGToDAGISel(TargetMachine &TM) 118 : SelectionDAGISel(V8Lowering), V8Lowering(TM) {} 119 120 SDOperand Select(SDOperand Op); 121 122 /// InstructionSelectBasicBlock - This callback is invoked by 123 /// SelectionDAGISel when it has created a SelectionDAG for us to codegen. 124 virtual void InstructionSelectBasicBlock(SelectionDAG &DAG); 125 126 virtual const char *getPassName() const { 127 return "PowerPC DAG->DAG Pattern Instruction Selection"; 128 } 129 130 // Include the pieces autogenerated from the target description. 131#include "SparcV8GenDAGISel.inc" 132}; 133} // end anonymous namespace 134 135/// InstructionSelectBasicBlock - This callback is invoked by 136/// SelectionDAGISel when it has created a SelectionDAG for us to codegen. 137void SparcV8DAGToDAGISel::InstructionSelectBasicBlock(SelectionDAG &DAG) { 138 DEBUG(BB->dump()); 139 140 // Select target instructions for the DAG. 141 DAG.setRoot(Select(DAG.getRoot())); 142 CodeGenMap.clear(); 143 DAG.RemoveDeadNodes(); 144 145 // Emit machine code to BB. 146 ScheduleAndEmitDAG(DAG); 147} 148 149 150SDOperand SparcV8DAGToDAGISel::Select(SDOperand Op) { 151 SDNode *N = Op.Val; 152 if (N->getOpcode() >= ISD::BUILTIN_OP_END/* && 153 N->getOpcode() < V8ISD::FIRST_NUMBER*/) 154 return Op; // Already selected. 155 // If this has already been converted, use it. 156 std::map<SDOperand, SDOperand>::iterator CGMI = CodeGenMap.find(Op); 157 if (CGMI != CodeGenMap.end()) return CGMI->second; 158 159 switch (N->getOpcode()) { 160 default: break; 161 } 162 163 return SelectCode(Op); 164} 165 166 167/// createPPCISelDag - This pass converts a legalized DAG into a 168/// PowerPC-specific DAG, ready for instruction scheduling. 169/// 170FunctionPass *llvm::createSparcV8ISelDag(TargetMachine &TM) { 171 return new SparcV8DAGToDAGISel(TM); 172} 173