Home | History | Annotate | Download | only in TableGen
      1 //===- CodeGenInstruction.h - Instruction Class Wrapper ---------*- C++ -*-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 // This file defines a wrapper class for the 'Instruction' TableGen class.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #ifndef CODEGEN_INSTRUCTION_H
     15 #define CODEGEN_INSTRUCTION_H
     16 
     17 #include "llvm/ADT/StringRef.h"
     18 #include "llvm/CodeGen/ValueTypes.h"
     19 #include "llvm/Support/SourceMgr.h"
     20 #include <string>
     21 #include <utility>
     22 #include <vector>
     23 
     24 namespace llvm {
     25   class Record;
     26   class DagInit;
     27   class CodeGenTarget;
     28   class StringRef;
     29 
     30   class CGIOperandList {
     31   public:
     32     class ConstraintInfo {
     33       enum { None, EarlyClobber, Tied } Kind;
     34       unsigned OtherTiedOperand;
     35     public:
     36       ConstraintInfo() : Kind(None) {}
     37 
     38       static ConstraintInfo getEarlyClobber() {
     39         ConstraintInfo I;
     40         I.Kind = EarlyClobber;
     41         I.OtherTiedOperand = 0;
     42         return I;
     43       }
     44 
     45       static ConstraintInfo getTied(unsigned Op) {
     46         ConstraintInfo I;
     47         I.Kind = Tied;
     48         I.OtherTiedOperand = Op;
     49         return I;
     50       }
     51 
     52       bool isNone() const { return Kind == None; }
     53       bool isEarlyClobber() const { return Kind == EarlyClobber; }
     54       bool isTied() const { return Kind == Tied; }
     55 
     56       unsigned getTiedOperand() const {
     57         assert(isTied());
     58         return OtherTiedOperand;
     59       }
     60     };
     61 
     62     /// OperandInfo - The information we keep track of for each operand in the
     63     /// operand list for a tablegen instruction.
     64     struct OperandInfo {
     65       /// Rec - The definition this operand is declared as.
     66       ///
     67       Record *Rec;
     68 
     69       /// Name - If this operand was assigned a symbolic name, this is it,
     70       /// otherwise, it's empty.
     71       std::string Name;
     72 
     73       /// PrinterMethodName - The method used to print operands of this type in
     74       /// the asmprinter.
     75       std::string PrinterMethodName;
     76 
     77       /// EncoderMethodName - The method used to get the machine operand value
     78       /// for binary encoding. "getMachineOpValue" by default.
     79       std::string EncoderMethodName;
     80 
     81       /// OperandType - A value from MCOI::OperandType representing the type of
     82       /// the operand.
     83       std::string OperandType;
     84 
     85       /// MIOperandNo - Currently (this is meant to be phased out), some logical
     86       /// operands correspond to multiple MachineInstr operands.  In the X86
     87       /// target for example, one address operand is represented as 4
     88       /// MachineOperands.  Because of this, the operand number in the
     89       /// OperandList may not match the MachineInstr operand num.  Until it
     90       /// does, this contains the MI operand index of this operand.
     91       unsigned MIOperandNo;
     92       unsigned MINumOperands;   // The number of operands.
     93 
     94       /// DoNotEncode - Bools are set to true in this vector for each operand in
     95       /// the DisableEncoding list.  These should not be emitted by the code
     96       /// emitter.
     97       std::vector<bool> DoNotEncode;
     98 
     99       /// MIOperandInfo - Default MI operand type. Note an operand may be made
    100       /// up of multiple MI operands.
    101       DagInit *MIOperandInfo;
    102 
    103       /// Constraint info for this operand.  This operand can have pieces, so we
    104       /// track constraint info for each.
    105       std::vector<ConstraintInfo> Constraints;
    106 
    107       OperandInfo(Record *R, const std::string &N, const std::string &PMN,
    108                   const std::string &EMN, const std::string &OT, unsigned MION,
    109                   unsigned MINO, DagInit *MIOI)
    110       : Rec(R), Name(N), PrinterMethodName(PMN), EncoderMethodName(EMN),
    111         OperandType(OT), MIOperandNo(MION), MINumOperands(MINO),
    112         MIOperandInfo(MIOI) {}
    113 
    114 
    115       /// getTiedOperand - If this operand is tied to another one, return the
    116       /// other operand number.  Otherwise, return -1.
    117       int getTiedRegister() const {
    118         for (unsigned j = 0, e = Constraints.size(); j != e; ++j) {
    119           const CGIOperandList::ConstraintInfo &CI = Constraints[j];
    120           if (CI.isTied()) return CI.getTiedOperand();
    121         }
    122         return -1;
    123       }
    124     };
    125 
    126     CGIOperandList(Record *D);
    127 
    128     Record *TheDef;            // The actual record containing this OperandList.
    129 
    130     /// NumDefs - Number of def operands declared, this is the number of
    131     /// elements in the instruction's (outs) list.
    132     ///
    133     unsigned NumDefs;
    134 
    135     /// OperandList - The list of declared operands, along with their declared
    136     /// type (which is a record).
    137     std::vector<OperandInfo> OperandList;
    138 
    139     // Information gleaned from the operand list.
    140     bool isPredicable;
    141     bool hasOptionalDef;
    142     bool isVariadic;
    143 
    144     // Provide transparent accessors to the operand list.
    145     bool empty() const { return OperandList.empty(); }
    146     unsigned size() const { return OperandList.size(); }
    147     const OperandInfo &operator[](unsigned i) const { return OperandList[i]; }
    148     OperandInfo &operator[](unsigned i) { return OperandList[i]; }
    149     OperandInfo &back() { return OperandList.back(); }
    150     const OperandInfo &back() const { return OperandList.back(); }
    151 
    152 
    153     /// getOperandNamed - Return the index of the operand with the specified
    154     /// non-empty name.  If the instruction does not have an operand with the
    155     /// specified name, abort.
    156     unsigned getOperandNamed(StringRef Name) const;
    157 
    158     /// hasOperandNamed - Query whether the instruction has an operand of the
    159     /// given name. If so, return true and set OpIdx to the index of the
    160     /// operand. Otherwise, return false.
    161     bool hasOperandNamed(StringRef Name, unsigned &OpIdx) const;
    162 
    163     /// ParseOperandName - Parse an operand name like "$foo" or "$foo.bar",
    164     /// where $foo is a whole operand and $foo.bar refers to a suboperand.
    165     /// This aborts if the name is invalid.  If AllowWholeOp is true, references
    166     /// to operands with suboperands are allowed, otherwise not.
    167     std::pair<unsigned,unsigned> ParseOperandName(const std::string &Op,
    168                                                   bool AllowWholeOp = true);
    169 
    170     /// getFlattenedOperandNumber - Flatten a operand/suboperand pair into a
    171     /// flat machineinstr operand #.
    172     unsigned getFlattenedOperandNumber(std::pair<unsigned,unsigned> Op) const {
    173       return OperandList[Op.first].MIOperandNo + Op.second;
    174     }
    175 
    176     /// getSubOperandNumber - Unflatten a operand number into an
    177     /// operand/suboperand pair.
    178     std::pair<unsigned,unsigned> getSubOperandNumber(unsigned Op) const {
    179       for (unsigned i = 0; ; ++i) {
    180         assert(i < OperandList.size() && "Invalid flat operand #");
    181         if (OperandList[i].MIOperandNo+OperandList[i].MINumOperands > Op)
    182           return std::make_pair(i, Op-OperandList[i].MIOperandNo);
    183       }
    184     }
    185 
    186 
    187     /// isFlatOperandNotEmitted - Return true if the specified flat operand #
    188     /// should not be emitted with the code emitter.
    189     bool isFlatOperandNotEmitted(unsigned FlatOpNo) const {
    190       std::pair<unsigned,unsigned> Op = getSubOperandNumber(FlatOpNo);
    191       if (OperandList[Op.first].DoNotEncode.size() > Op.second)
    192         return OperandList[Op.first].DoNotEncode[Op.second];
    193       return false;
    194     }
    195 
    196     void ProcessDisableEncoding(std::string Value);
    197   };
    198 
    199 
    200   class CodeGenInstruction {
    201   public:
    202     Record *TheDef;            // The actual record defining this instruction.
    203     std::string Namespace;     // The namespace the instruction is in.
    204 
    205     /// AsmString - The format string used to emit a .s file for the
    206     /// instruction.
    207     std::string AsmString;
    208 
    209     /// Operands - This is information about the (ins) and (outs) list specified
    210     /// to the instruction.
    211     CGIOperandList Operands;
    212 
    213     /// ImplicitDefs/ImplicitUses - These are lists of registers that are
    214     /// implicitly defined and used by the instruction.
    215     std::vector<Record*> ImplicitDefs, ImplicitUses;
    216 
    217     // Various boolean values we track for the instruction.
    218     bool isReturn;
    219     bool isBranch;
    220     bool isIndirectBranch;
    221     bool isCompare;
    222     bool isMoveImm;
    223     bool isBitcast;
    224     bool isSelect;
    225     bool isBarrier;
    226     bool isCall;
    227     bool canFoldAsLoad;
    228     bool mayLoad;
    229     bool mayLoad_Unset;
    230     bool mayStore;
    231     bool mayStore_Unset;
    232     bool isPredicable;
    233     bool isConvertibleToThreeAddress;
    234     bool isCommutable;
    235     bool isTerminator;
    236     bool isReMaterializable;
    237     bool hasDelaySlot;
    238     bool usesCustomInserter;
    239     bool hasPostISelHook;
    240     bool hasCtrlDep;
    241     bool isNotDuplicable;
    242     bool hasSideEffects;
    243     bool hasSideEffects_Unset;
    244     bool neverHasSideEffects;
    245     bool isAsCheapAsAMove;
    246     bool hasExtraSrcRegAllocReq;
    247     bool hasExtraDefRegAllocReq;
    248     bool isCodeGenOnly;
    249     bool isPseudo;
    250 
    251     /// Are there any undefined flags?
    252     bool hasUndefFlags() const {
    253       return mayLoad_Unset || mayStore_Unset || hasSideEffects_Unset;
    254     }
    255 
    256     // The record used to infer instruction flags, or NULL if no flag values
    257     // have been inferred.
    258     Record *InferredFrom;
    259 
    260     CodeGenInstruction(Record *R);
    261 
    262     /// HasOneImplicitDefWithKnownVT - If the instruction has at least one
    263     /// implicit def and it has a known VT, return the VT, otherwise return
    264     /// MVT::Other.
    265     MVT::SimpleValueType
    266       HasOneImplicitDefWithKnownVT(const CodeGenTarget &TargetInfo) const;
    267 
    268 
    269     /// FlattenAsmStringVariants - Flatten the specified AsmString to only
    270     /// include text from the specified variant, returning the new string.
    271     static std::string FlattenAsmStringVariants(StringRef AsmString,
    272                                                 unsigned Variant);
    273   };
    274 
    275 
    276   /// CodeGenInstAlias - This represents an InstAlias definition.
    277   class CodeGenInstAlias {
    278   public:
    279     Record *TheDef;            // The actual record defining this InstAlias.
    280 
    281     /// AsmString - The format string used to emit a .s file for the
    282     /// instruction.
    283     std::string AsmString;
    284 
    285     /// Result - The result instruction.
    286     DagInit *Result;
    287 
    288     /// ResultInst - The instruction generated by the alias (decoded from
    289     /// Result).
    290     CodeGenInstruction *ResultInst;
    291 
    292 
    293     struct ResultOperand {
    294     private:
    295       std::string Name;
    296       Record *R;
    297 
    298       int64_t Imm;
    299     public:
    300       enum {
    301         K_Record,
    302         K_Imm,
    303         K_Reg
    304       } Kind;
    305 
    306       ResultOperand(std::string N, Record *r) : Name(N), R(r), Kind(K_Record) {}
    307       ResultOperand(int64_t I) : Imm(I), Kind(K_Imm) {}
    308       ResultOperand(Record *r) : R(r), Kind(K_Reg) {}
    309 
    310       bool isRecord() const { return Kind == K_Record; }
    311       bool isImm() const { return Kind == K_Imm; }
    312       bool isReg() const { return Kind == K_Reg; }
    313 
    314       StringRef getName() const { assert(isRecord()); return Name; }
    315       Record *getRecord() const { assert(isRecord()); return R; }
    316       int64_t getImm() const { assert(isImm()); return Imm; }
    317       Record *getRegister() const { assert(isReg()); return R; }
    318     };
    319 
    320     /// ResultOperands - The decoded operands for the result instruction.
    321     std::vector<ResultOperand> ResultOperands;
    322 
    323     /// ResultInstOperandIndex - For each operand, this vector holds a pair of
    324     /// indices to identify the corresponding operand in the result
    325     /// instruction.  The first index specifies the operand and the second
    326     /// index specifies the suboperand.  If there are no suboperands or if all
    327     /// of them are matched by the operand, the second value should be -1.
    328     std::vector<std::pair<unsigned, int> > ResultInstOperandIndex;
    329 
    330     CodeGenInstAlias(Record *R, CodeGenTarget &T);
    331 
    332     bool tryAliasOpMatch(DagInit *Result, unsigned AliasOpNo,
    333                          Record *InstOpRec, bool hasSubOps, ArrayRef<SMLoc> Loc,
    334                          CodeGenTarget &T, ResultOperand &ResOp);
    335   };
    336 }
    337 
    338 #endif
    339