|  | //===- SparcV9InstrForest.h - SparcV9 BURG Instruction Selector Trees -----===// | 
|  | // | 
|  | //                     The LLVM Compiler Infrastructure | 
|  | // | 
|  | // This file was developed by the LLVM research group and is distributed under | 
|  | // the University of Illinois Open Source License. See LICENSE.TXT for details. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  | // | 
|  | // A forest of BURG instruction trees (class InstrForest) which represents | 
|  | // a function to the BURG-based instruction selector, and a bunch of constants | 
|  | // and declarations used by the generated BURG code. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | #ifndef SPARCV9INSTRFOREST_H | 
|  | #define SPARCV9INSTRFOREST_H | 
|  |  | 
|  | #include "llvm/Instruction.h" | 
|  | using namespace llvm; | 
|  |  | 
|  | /// OpLabel values for special-case nodes created for instruction selection. | 
|  | /// All op-labels not defined here are identical to the instruction | 
|  | /// opcode returned by Instruction::getOpcode(). | 
|  | /// | 
|  | static const int | 
|  | InvalidOp      = -1, | 
|  | VRegListOp     = 97, | 
|  | VRegNodeOp     = 98, | 
|  | ConstantNodeOp = 99, | 
|  | LabelNodeOp    = 100, | 
|  | RetValueOp     = 100 + Instruction::Ret,               // 101 | 
|  | BrCondOp       = 100 + Instruction::Br,                // 102 | 
|  | BAndOp         = 100 + Instruction::And,               // 111 | 
|  | BOrOp          = 100 + Instruction::Or,                // 112 | 
|  | BXorOp         = 100 + Instruction::Xor,               // 113 | 
|  | BNotOp         = 200 + Instruction::Xor,               // 213 | 
|  | NotOp         = 300 + Instruction::Xor,               // 313 | 
|  | SetCCOp        = 100 + Instruction::SetEQ,             // 114 | 
|  | AllocaN        = 100 + Instruction::Alloca,            // 122 | 
|  | LoadIdx        = 100 + Instruction::Load,              // 123 | 
|  | GetElemPtrIdx  = 100 + Instruction::GetElementPtr,     // 125 | 
|  | ToBoolTy       = 100 + Instruction::Cast;              // 127 | 
|  | static const int | 
|  | ToUByteTy      = ToBoolTy +  1, | 
|  | ToSByteTy      = ToBoolTy +  2, | 
|  | ToUShortTy     = ToBoolTy +  3, | 
|  | ToShortTy      = ToBoolTy +  4, | 
|  | ToUIntTy       = ToBoolTy +  5, | 
|  | ToIntTy        = ToBoolTy +  6, | 
|  | ToULongTy      = ToBoolTy +  7, | 
|  | ToLongTy       = ToBoolTy +  8, | 
|  | ToFloatTy      = ToBoolTy +  9, | 
|  | ToDoubleTy     = ToBoolTy + 10, | 
|  | ToArrayTy      = ToBoolTy + 11, | 
|  | ToPointerTy    = ToBoolTy + 12; | 
|  |  | 
|  | /// Data types needed by BURG | 
|  | /// | 
|  | typedef int OpLabel; | 
|  | typedef int StateLabel; | 
|  |  | 
|  | /// Declarations of data and functions created by BURG | 
|  | /// | 
|  | namespace llvm { | 
|  | class InstrTreeNode; | 
|  | }; | 
|  | extern short*           burm_nts[]; | 
|  | extern StateLabel       burm_label      (InstrTreeNode* p); | 
|  | extern StateLabel       burm_state      (OpLabel op, StateLabel leftState, | 
|  | StateLabel rightState); | 
|  | extern StateLabel       burm_rule       (StateLabel state, int goalNT); | 
|  | extern InstrTreeNode**  burm_kids       (InstrTreeNode* p, int eruleno, | 
|  | InstrTreeNode* kids[]); | 
|  | extern void             printcover      (InstrTreeNode*, int, int); | 
|  | extern void             printtree       (InstrTreeNode*); | 
|  | extern int              treecost        (InstrTreeNode*, int, int); | 
|  | extern void             printMatches    (InstrTreeNode*); | 
|  |  | 
|  | namespace llvm { | 
|  |  | 
|  | /// InstrTreeNode - A single tree node in the instruction tree used for | 
|  | /// instruction selection via BURG. | 
|  | /// | 
|  | class InstrTreeNode { | 
|  | InstrTreeNode(const InstrTreeNode &);   // DO NOT IMPLEMENT | 
|  | void operator=(const InstrTreeNode &);  // DO NOT IMPLEMENT | 
|  | public: | 
|  | enum InstrTreeNodeType { NTInstructionNode, | 
|  | NTVRegListNode, | 
|  | NTVRegNode, | 
|  | NTConstNode, | 
|  | NTLabelNode }; | 
|  | InstrTreeNode* LeftChild; | 
|  | InstrTreeNode* RightChild; | 
|  | InstrTreeNode* Parent; | 
|  | OpLabel        opLabel; | 
|  | StateLabel     state; | 
|  |  | 
|  | protected: | 
|  | InstrTreeNodeType treeNodeType; | 
|  | Value*           val; | 
|  |  | 
|  | public: | 
|  | InstrTreeNode(InstrTreeNodeType nodeType, Value* _val) | 
|  | : treeNodeType(nodeType), val(_val) { | 
|  | LeftChild = RightChild = Parent = 0; | 
|  | opLabel   = InvalidOp; | 
|  | } | 
|  | virtual ~InstrTreeNode() { | 
|  | delete LeftChild; | 
|  | delete RightChild; | 
|  | } | 
|  | InstrTreeNodeType     getNodeType     () const { return treeNodeType; } | 
|  | Value*                getValue        () const { return val; } | 
|  | inline OpLabel        getOpLabel      () const { return opLabel; } | 
|  | inline InstrTreeNode *leftChild       () const { return LeftChild; } | 
|  | inline InstrTreeNode *parent          () const { return Parent; } | 
|  |  | 
|  | // If right child is a list node, recursively get its *left* child | 
|  | inline InstrTreeNode* rightChild() const { | 
|  | return (!RightChild ? 0 : | 
|  | (RightChild->getOpLabel() == VRegListOp | 
|  | ? RightChild->LeftChild : RightChild)); | 
|  | } | 
|  | void dump(int dumpChildren, int indent) const; | 
|  | protected: | 
|  | virtual void dumpNode(int indent) const = 0; | 
|  | friend class InstrForest; | 
|  | }; | 
|  |  | 
|  | } // end namespace llvm. | 
|  |  | 
|  | #endif |