| //===-- Nios2ISelDAGToDAG.cpp - A Dag to Dag Inst Selector for Nios2 ------===// | |
| // | |
| // The LLVM Compiler Infrastructure | |
| // | |
| // This file is distributed under the University of Illinois Open Source | |
| // License. See LICENSE.TXT for details. | |
| // | |
| //===----------------------------------------------------------------------===// | |
| // | |
| // This file defines an instruction selector for the NIOS2 target. | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #include "Nios2.h" | |
| #include "Nios2TargetMachine.h" | |
| #include "llvm/CodeGen/SelectionDAGISel.h" | |
| #include "llvm/Support/Debug.h" | |
| using namespace llvm; | |
| #define DEBUG_TYPE "nios2-isel" | |
| //===----------------------------------------------------------------------===// | |
| // Instruction Selector Implementation | |
| //===----------------------------------------------------------------------===// | |
| //===----------------------------------------------------------------------===// | |
| // Nios2DAGToDAGISel - NIOS2 specific code to select NIOS2 machine | |
| // instructions for SelectionDAG operations. | |
| //===----------------------------------------------------------------------===// | |
| namespace { | |
| class Nios2DAGToDAGISel : public SelectionDAGISel { | |
| /// Subtarget - Keep a pointer to the Nios2 Subtarget around so that we can | |
| /// make the right decision when generating code for different targets. | |
| const Nios2Subtarget *Subtarget; | |
| public: | |
| explicit Nios2DAGToDAGISel(Nios2TargetMachine &TM, CodeGenOpt::Level OL) | |
| : SelectionDAGISel(TM, OL) {} | |
| bool runOnMachineFunction(MachineFunction &MF) override { | |
| Subtarget = &MF.getSubtarget<Nios2Subtarget>(); | |
| return SelectionDAGISel::runOnMachineFunction(MF); | |
| } | |
| void Select(SDNode *N) override; | |
| // Pass Name | |
| StringRef getPassName() const override { | |
| return "NIOS2 DAG->DAG Pattern Instruction Selection"; | |
| } | |
| #include "Nios2GenDAGISel.inc" | |
| }; | |
| } // namespace | |
| // Select instructions not customized! Used for | |
| // expanded, promoted and normal instructions | |
| void Nios2DAGToDAGISel::Select(SDNode *Node) { | |
| // If we have a custom node, we already have selected! | |
| if (Node->isMachineOpcode()) { | |
| LLVM_DEBUG(errs() << "== "; Node->dump(CurDAG); errs() << "\n"); | |
| Node->setNodeId(-1); | |
| return; | |
| } | |
| // Select the default instruction | |
| SelectCode(Node); | |
| } | |
| FunctionPass *llvm::createNios2ISelDag(Nios2TargetMachine &TM, | |
| CodeGenOpt::Level OptLevel) { | |
| return new Nios2DAGToDAGISel(TM, OptLevel); | |
| } |