| //===-- PIC16ISelDAGToDAG.cpp - A dag to dag inst selector for PIC16 ------===// |
| // |
| // 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 PIC16 target. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #define DEBUG_TYPE "pic16-isel" |
| |
| #include "llvm/Support/ErrorHandling.h" |
| #include "llvm/Support/raw_ostream.h" |
| #include "PIC16ISelDAGToDAG.h" |
| #include "llvm/Support/Debug.h" |
| |
| using namespace llvm; |
| |
| /// createPIC16ISelDag - This pass converts a legalized DAG into a |
| /// PIC16-specific DAG, ready for instruction scheduling. |
| FunctionPass *llvm::createPIC16ISelDag(PIC16TargetMachine &TM) { |
| return new PIC16DAGToDAGISel(TM); |
| } |
| |
| |
| /// InstructionSelect - This callback is invoked by |
| /// SelectionDAGISel when it has created a SelectionDAG for us to codegen. |
| void PIC16DAGToDAGISel::InstructionSelect() { |
| DEBUG(BB->dump()); |
| SelectRoot(*CurDAG); |
| CurDAG->RemoveDeadNodes(); |
| } |
| |
| /// Select - Select instructions not customized! Used for |
| /// expanded, promoted and normal instructions. |
| SDNode* PIC16DAGToDAGISel::Select(SDValue N) { |
| |
| // Select the default instruction. |
| SDNode *ResNode = SelectCode(N); |
| |
| return ResNode; |
| } |
| |
| |
| // SelectDirectAddr - Match a direct address for DAG. |
| // A direct address could be a globaladdress or externalsymbol. |
| bool PIC16DAGToDAGISel::SelectDirectAddr(SDValue Op, SDValue N, |
| SDValue &Address) { |
| // Return true if TGA or ES. |
| if (N.getOpcode() == ISD::TargetGlobalAddress |
| || N.getOpcode() == ISD::TargetExternalSymbol) { |
| Address = N; |
| return true; |
| } |
| |
| return false; |
| } |