| //===-- 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); |
| } |