CodeGenInstruction.h revision b501d4f673c0db267a76800339f9943f2ce6fe33
1ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner//===- CodeGenInstruction.h - Instruction Class Wrapper ---------*- C++ -*-===// 23da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman// 3ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner// The LLVM Compiler Infrastructure 4ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner// 53060910e290949a9ac5eda8726d030790c4d60ffChris Lattner// This file is distributed under the University of Illinois Open Source 63060910e290949a9ac5eda8726d030790c4d60ffChris Lattner// License. See LICENSE.TXT for details. 73da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman// 8ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner//===----------------------------------------------------------------------===// 9ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner// 10ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner// This file defines a wrapper class for the 'Instruction' TableGen class. 11ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner// 12ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner//===----------------------------------------------------------------------===// 13ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner 14ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner#ifndef CODEGEN_INSTRUCTION_H 15ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner#define CODEGEN_INSTRUCTION_H 16ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner 1787c5905e0b6f551e21c9a96f1b6418920d908210Chris Lattner#include "llvm/CodeGen/ValueTypes.h" 18ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner#include <string> 19ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner#include <vector> 20ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner#include <utility> 21ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner 22ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattnernamespace llvm { 23ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner class Record; 2465303d6bd777b76735ef179870678a1d14671c54Chris Lattner class DagInit; 259414ae52911f1d62cabd5108e0381b9d17476157Chris Lattner class CodeGenTarget; 264d43d0fd996a01c2cd21fd51082bc1bba783ef3cChris Lattner class StringRef; 27c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner 28c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner class CGIOperandList { 29d41b30def3181bce4bf87e8bde664d15663165d0Jeff Cohen public: 30a7d479c7bd9723cabdd7c9e1e9a1e6e482f78e7eChris Lattner class ConstraintInfo { 31a7d479c7bd9723cabdd7c9e1e9a1e6e482f78e7eChris Lattner enum { None, EarlyClobber, Tied } Kind; 32a7d479c7bd9723cabdd7c9e1e9a1e6e482f78e7eChris Lattner unsigned OtherTiedOperand; 33a7d479c7bd9723cabdd7c9e1e9a1e6e482f78e7eChris Lattner public: 34a7d479c7bd9723cabdd7c9e1e9a1e6e482f78e7eChris Lattner ConstraintInfo() : Kind(None) {} 35c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner 36a7d479c7bd9723cabdd7c9e1e9a1e6e482f78e7eChris Lattner static ConstraintInfo getEarlyClobber() { 37a7d479c7bd9723cabdd7c9e1e9a1e6e482f78e7eChris Lattner ConstraintInfo I; 38a7d479c7bd9723cabdd7c9e1e9a1e6e482f78e7eChris Lattner I.Kind = EarlyClobber; 39e555c9f4a54fd854af13f117fc0650ada3df3d24Chris Lattner I.OtherTiedOperand = 0; 40a7d479c7bd9723cabdd7c9e1e9a1e6e482f78e7eChris Lattner return I; 41a7d479c7bd9723cabdd7c9e1e9a1e6e482f78e7eChris Lattner } 42c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner 43a7d479c7bd9723cabdd7c9e1e9a1e6e482f78e7eChris Lattner static ConstraintInfo getTied(unsigned Op) { 44a7d479c7bd9723cabdd7c9e1e9a1e6e482f78e7eChris Lattner ConstraintInfo I; 45a7d479c7bd9723cabdd7c9e1e9a1e6e482f78e7eChris Lattner I.Kind = Tied; 46a7d479c7bd9723cabdd7c9e1e9a1e6e482f78e7eChris Lattner I.OtherTiedOperand = Op; 47a7d479c7bd9723cabdd7c9e1e9a1e6e482f78e7eChris Lattner return I; 48a7d479c7bd9723cabdd7c9e1e9a1e6e482f78e7eChris Lattner } 49c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner 50a7d479c7bd9723cabdd7c9e1e9a1e6e482f78e7eChris Lattner bool isNone() const { return Kind == None; } 51a7d479c7bd9723cabdd7c9e1e9a1e6e482f78e7eChris Lattner bool isEarlyClobber() const { return Kind == EarlyClobber; } 52a7d479c7bd9723cabdd7c9e1e9a1e6e482f78e7eChris Lattner bool isTied() const { return Kind == Tied; } 53c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner 54a7d479c7bd9723cabdd7c9e1e9a1e6e482f78e7eChris Lattner unsigned getTiedOperand() const { 55a7d479c7bd9723cabdd7c9e1e9a1e6e482f78e7eChris Lattner assert(isTied()); 56a7d479c7bd9723cabdd7c9e1e9a1e6e482f78e7eChris Lattner return OtherTiedOperand; 57a7d479c7bd9723cabdd7c9e1e9a1e6e482f78e7eChris Lattner } 58a7d479c7bd9723cabdd7c9e1e9a1e6e482f78e7eChris Lattner }; 599ed2cee1057e2df3a4305b9c818aa577c8504f59Jim Grosbach 60cf03da0ce913267c4971534e8792297e06535a4eChris Lattner /// OperandInfo - The information we keep track of for each operand in the 61cf03da0ce913267c4971534e8792297e06535a4eChris Lattner /// operand list for a tablegen instruction. 6287c5905e0b6f551e21c9a96f1b6418920d908210Chris Lattner struct OperandInfo { 63cf03da0ce913267c4971534e8792297e06535a4eChris Lattner /// Rec - The definition this operand is declared as. 640e384b66a781fc0ff005f475a7ab151afa054fb0Chris Lattner /// 6587c5905e0b6f551e21c9a96f1b6418920d908210Chris Lattner Record *Rec; 66c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner 67cf03da0ce913267c4971534e8792297e06535a4eChris Lattner /// Name - If this operand was assigned a symbolic name, this is it, 68cf03da0ce913267c4971534e8792297e06535a4eChris Lattner /// otherwise, it's empty. 6987c5905e0b6f551e21c9a96f1b6418920d908210Chris Lattner std::string Name; 70c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner 71cf03da0ce913267c4971534e8792297e06535a4eChris Lattner /// PrinterMethodName - The method used to print operands of this type in 72cf03da0ce913267c4971534e8792297e06535a4eChris Lattner /// the asmprinter. 73cf03da0ce913267c4971534e8792297e06535a4eChris Lattner std::string PrinterMethodName; 74c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner 755013f7469ec44adba127de65517e699180ee532fJim Grosbach /// EncoderMethodName - The method used to get the machine operand value 765013f7469ec44adba127de65517e699180ee532fJim Grosbach /// for binary encoding. "getMachineOpValue" by default. 775013f7469ec44adba127de65517e699180ee532fJim Grosbach std::string EncoderMethodName; 78c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner 79cf03da0ce913267c4971534e8792297e06535a4eChris Lattner /// MIOperandNo - Currently (this is meant to be phased out), some logical 80cf03da0ce913267c4971534e8792297e06535a4eChris Lattner /// operands correspond to multiple MachineInstr operands. In the X86 81cf03da0ce913267c4971534e8792297e06535a4eChris Lattner /// target for example, one address operand is represented as 4 82cf03da0ce913267c4971534e8792297e06535a4eChris Lattner /// MachineOperands. Because of this, the operand number in the 83cf03da0ce913267c4971534e8792297e06535a4eChris Lattner /// OperandList may not match the MachineInstr operand num. Until it 84cf03da0ce913267c4971534e8792297e06535a4eChris Lattner /// does, this contains the MI operand index of this operand. 85cf03da0ce913267c4971534e8792297e06535a4eChris Lattner unsigned MIOperandNo; 86cfbf96aa9c3bd317548f72e022ba28a40353f95aChris Lattner unsigned MINumOperands; // The number of operands. 87c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner 88f64f9a4b75d07819866bfcf918b922a76d3e1600Chris Lattner /// DoNotEncode - Bools are set to true in this vector for each operand in 89f64f9a4b75d07819866bfcf918b922a76d3e1600Chris Lattner /// the DisableEncoding list. These should not be emitted by the code 90f64f9a4b75d07819866bfcf918b922a76d3e1600Chris Lattner /// emitter. 91f64f9a4b75d07819866bfcf918b922a76d3e1600Chris Lattner std::vector<bool> DoNotEncode; 92c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner 938ef9d16d3913db11c89fc2d14899e153bdbdc91bNate Begeman /// MIOperandInfo - Default MI operand type. Note an operand may be made 948ef9d16d3913db11c89fc2d14899e153bdbdc91bNate Begeman /// up of multiple MI operands. 9565303d6bd777b76735ef179870678a1d14671c54Chris Lattner DagInit *MIOperandInfo; 96c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner 970bb75004ff6c0ad26de7610cb873f81ea26fd6caChris Lattner /// Constraint info for this operand. This operand can have pieces, so we 980bb75004ff6c0ad26de7610cb873f81ea26fd6caChris Lattner /// track constraint info for each. 99a7d479c7bd9723cabdd7c9e1e9a1e6e482f78e7eChris Lattner std::vector<ConstraintInfo> Constraints; 100c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner 1019ed2cee1057e2df3a4305b9c818aa577c8504f59Jim Grosbach OperandInfo(Record *R, const std::string &N, const std::string &PMN, 1025013f7469ec44adba127de65517e699180ee532fJim Grosbach const std::string &EMN, unsigned MION, unsigned MINO, 1035013f7469ec44adba127de65517e699180ee532fJim Grosbach DagInit *MIOI) 104c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner : Rec(R), Name(N), PrinterMethodName(PMN), EncoderMethodName(EMN), 105c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner MIOperandNo(MION), MINumOperands(MINO), MIOperandInfo(MIOI) {} 10687c5905e0b6f551e21c9a96f1b6418920d908210Chris Lattner }; 107c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner 108c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner CGIOperandList(Record *D); 109c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner 110c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner Record *TheDef; // The actual record containing this OperandList. 1113da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman 112cedef1ccf0d53693b5e62d524e7ba6b2122231c7Chris Lattner /// NumDefs - Number of def operands declared, this is the number of 113cedef1ccf0d53693b5e62d524e7ba6b2122231c7Chris Lattner /// elements in the instruction's (outs) list. 11464d80e3387f328d21cd9cc06464b5de7861e3f27Evan Cheng /// 11564d80e3387f328d21cd9cc06464b5de7861e3f27Evan Cheng unsigned NumDefs; 116c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner 117ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner /// OperandList - The list of declared operands, along with their declared 118ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner /// type (which is a record). 11987c5905e0b6f551e21c9a96f1b6418920d908210Chris Lattner std::vector<OperandInfo> OperandList; 120c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner 121c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner // Information gleaned from the operand list. 1225127ce09a4e4379f971280fab461a5f03befddbcEvan Cheng bool isPredicable; 12388cc092ca5bd79480205ee7b01aa39c13f3e35d7Evan Cheng bool hasOptionalDef; 124c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner bool isVariadic; 125c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner 126c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner // Provide transparent accessors to the operand list. 127c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner unsigned size() const { return OperandList.size(); } 128c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner const OperandInfo &operator[](unsigned i) const { return OperandList[i]; } 129c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner OperandInfo &operator[](unsigned i) { return OperandList[i]; } 130c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner OperandInfo &back() { return OperandList.back(); } 131c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner const OperandInfo &back() const { return OperandList.back(); } 132c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner 133c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner 134c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner /// getOperandNamed - Return the index of the operand with the specified 135c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner /// non-empty name. If the instruction does not have an operand with the 136c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner /// specified name, throw an exception. 137c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner unsigned getOperandNamed(StringRef Name) const; 138c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner 139c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner /// hasOperandNamed - Query whether the instruction has an operand of the 140c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner /// given name. If so, return true and set OpIdx to the index of the 141c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner /// operand. Otherwise, return false. 142c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner bool hasOperandNamed(StringRef Name, unsigned &OpIdx) const; 143c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner 1440bb75004ff6c0ad26de7610cb873f81ea26fd6caChris Lattner /// ParseOperandName - Parse an operand name like "$foo" or "$foo.bar", 1450bb75004ff6c0ad26de7610cb873f81ea26fd6caChris Lattner /// where $foo is a whole operand and $foo.bar refers to a suboperand. 1460bb75004ff6c0ad26de7610cb873f81ea26fd6caChris Lattner /// This throws an exception if the name is invalid. If AllowWholeOp is 1470bb75004ff6c0ad26de7610cb873f81ea26fd6caChris Lattner /// true, references to operands with suboperands are allowed, otherwise 1480bb75004ff6c0ad26de7610cb873f81ea26fd6caChris Lattner /// not. 1490bb75004ff6c0ad26de7610cb873f81ea26fd6caChris Lattner std::pair<unsigned,unsigned> ParseOperandName(const std::string &Op, 1500bb75004ff6c0ad26de7610cb873f81ea26fd6caChris Lattner bool AllowWholeOp = true); 151c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner 1520bb75004ff6c0ad26de7610cb873f81ea26fd6caChris Lattner /// getFlattenedOperandNumber - Flatten a operand/suboperand pair into a 1530bb75004ff6c0ad26de7610cb873f81ea26fd6caChris Lattner /// flat machineinstr operand #. 1540bb75004ff6c0ad26de7610cb873f81ea26fd6caChris Lattner unsigned getFlattenedOperandNumber(std::pair<unsigned,unsigned> Op) const { 1550bb75004ff6c0ad26de7610cb873f81ea26fd6caChris Lattner return OperandList[Op.first].MIOperandNo + Op.second; 1560bb75004ff6c0ad26de7610cb873f81ea26fd6caChris Lattner } 157c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner 158f64f9a4b75d07819866bfcf918b922a76d3e1600Chris Lattner /// getSubOperandNumber - Unflatten a operand number into an 159f64f9a4b75d07819866bfcf918b922a76d3e1600Chris Lattner /// operand/suboperand pair. 160f64f9a4b75d07819866bfcf918b922a76d3e1600Chris Lattner std::pair<unsigned,unsigned> getSubOperandNumber(unsigned Op) const { 161f64f9a4b75d07819866bfcf918b922a76d3e1600Chris Lattner for (unsigned i = 0; ; ++i) { 162f64f9a4b75d07819866bfcf918b922a76d3e1600Chris Lattner assert(i < OperandList.size() && "Invalid flat operand #"); 163f64f9a4b75d07819866bfcf918b922a76d3e1600Chris Lattner if (OperandList[i].MIOperandNo+OperandList[i].MINumOperands > Op) 164f64f9a4b75d07819866bfcf918b922a76d3e1600Chris Lattner return std::make_pair(i, Op-OperandList[i].MIOperandNo); 165f64f9a4b75d07819866bfcf918b922a76d3e1600Chris Lattner } 166f64f9a4b75d07819866bfcf918b922a76d3e1600Chris Lattner } 167c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner 168c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner 169f64f9a4b75d07819866bfcf918b922a76d3e1600Chris Lattner /// isFlatOperandNotEmitted - Return true if the specified flat operand # 170f64f9a4b75d07819866bfcf918b922a76d3e1600Chris Lattner /// should not be emitted with the code emitter. 171f64f9a4b75d07819866bfcf918b922a76d3e1600Chris Lattner bool isFlatOperandNotEmitted(unsigned FlatOpNo) const { 172f64f9a4b75d07819866bfcf918b922a76d3e1600Chris Lattner std::pair<unsigned,unsigned> Op = getSubOperandNumber(FlatOpNo); 173f64f9a4b75d07819866bfcf918b922a76d3e1600Chris Lattner if (OperandList[Op.first].DoNotEncode.size() > Op.second) 174f64f9a4b75d07819866bfcf918b922a76d3e1600Chris Lattner return OperandList[Op.first].DoNotEncode[Op.second]; 175f64f9a4b75d07819866bfcf918b922a76d3e1600Chris Lattner return false; 176f64f9a4b75d07819866bfcf918b922a76d3e1600Chris Lattner } 177c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner 178c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner void ProcessDisableEncoding(std::string Value); 179c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner }; 180c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner 181ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner 182c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner class CodeGenInstruction { 183c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner public: 184c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner Record *TheDef; // The actual record defining this instruction. 185c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner std::string Namespace; // The namespace the instruction is in. 18687c5905e0b6f551e21c9a96f1b6418920d908210Chris Lattner 187c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner /// AsmString - The format string used to emit a .s file for the 188c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner /// instruction. 189c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner std::string AsmString; 1909ed2cee1057e2df3a4305b9c818aa577c8504f59Jim Grosbach 191c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner /// Operands - This is information about the (ins) and (outs) list specified 192c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner /// to the instruction. 193c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner CGIOperandList Operands; 194c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner 195c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner /// ImplicitDefs/ImplicitUses - These are lists of registers that are 196c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner /// implicitly defined and used by the instruction. 197c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner std::vector<Record*> ImplicitDefs, ImplicitUses; 198c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner 199c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner // Various boolean values we track for the instruction. 200c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner bool isReturn; 201c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner bool isBranch; 202c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner bool isIndirectBranch; 203c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner bool isCompare; 204c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner bool isBarrier; 205c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner bool isCall; 206c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner bool canFoldAsLoad; 207c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner bool mayLoad, mayStore; 208c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner bool isPredicable; 209c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner bool isConvertibleToThreeAddress; 210c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner bool isCommutable; 211c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner bool isTerminator; 212c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner bool isReMaterializable; 213c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner bool hasDelaySlot; 214c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner bool usesCustomInserter; 215c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner bool hasCtrlDep; 216c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner bool isNotDuplicable; 217c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner bool hasSideEffects; 218c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner bool neverHasSideEffects; 219c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner bool isAsCheapAsAMove; 220c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner bool hasExtraSrcRegAllocReq; 221c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner bool hasExtraDefRegAllocReq; 222c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner 223c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner 224c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner CodeGenInstruction(Record *R); 22501855071e24e0e3e75306b82267d3ad0b13a0c15Jim Grosbach 2269414ae52911f1d62cabd5108e0381b9d17476157Chris Lattner /// HasOneImplicitDefWithKnownVT - If the instruction has at least one 2279414ae52911f1d62cabd5108e0381b9d17476157Chris Lattner /// implicit def and it has a known VT, return the VT, otherwise return 2289414ae52911f1d62cabd5108e0381b9d17476157Chris Lattner /// MVT::Other. 2299ed2cee1057e2df3a4305b9c818aa577c8504f59Jim Grosbach MVT::SimpleValueType 2309414ae52911f1d62cabd5108e0381b9d17476157Chris Lattner HasOneImplicitDefWithKnownVT(const CodeGenTarget &TargetInfo) const; 2314d43d0fd996a01c2cd21fd51082bc1bba783ef3cChris Lattner 2324d43d0fd996a01c2cd21fd51082bc1bba783ef3cChris Lattner 2334d43d0fd996a01c2cd21fd51082bc1bba783ef3cChris Lattner /// FlattenAsmStringVariants - Flatten the specified AsmString to only 2344d43d0fd996a01c2cd21fd51082bc1bba783ef3cChris Lattner /// include text from the specified variant, returning the new string. 2354d43d0fd996a01c2cd21fd51082bc1bba783ef3cChris Lattner static std::string FlattenAsmStringVariants(StringRef AsmString, 2364d43d0fd996a01c2cd21fd51082bc1bba783ef3cChris Lattner unsigned Variant); 237ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner }; 238c76e80ded753b78a72be0db40fcdba543435d818Chris Lattner 239c76e80ded753b78a72be0db40fcdba543435d818Chris Lattner 240c76e80ded753b78a72be0db40fcdba543435d818Chris Lattner /// CodeGenInstAlias - This represents an InstAlias definition. 241c76e80ded753b78a72be0db40fcdba543435d818Chris Lattner class CodeGenInstAlias { 242c76e80ded753b78a72be0db40fcdba543435d818Chris Lattner public: 243c76e80ded753b78a72be0db40fcdba543435d818Chris Lattner Record *TheDef; // The actual record defining this InstAlias. 244c76e80ded753b78a72be0db40fcdba543435d818Chris Lattner 245c76e80ded753b78a72be0db40fcdba543435d818Chris Lattner /// AsmString - The format string used to emit a .s file for the 246c76e80ded753b78a72be0db40fcdba543435d818Chris Lattner /// instruction. 247c76e80ded753b78a72be0db40fcdba543435d818Chris Lattner std::string AsmString; 248c76e80ded753b78a72be0db40fcdba543435d818Chris Lattner 249c76e80ded753b78a72be0db40fcdba543435d818Chris Lattner /// Operands - This is information about the (ins) and (outs) list specified 250c76e80ded753b78a72be0db40fcdba543435d818Chris Lattner /// to the alias. 251c76e80ded753b78a72be0db40fcdba543435d818Chris Lattner CGIOperandList Operands; 252c76e80ded753b78a72be0db40fcdba543435d818Chris Lattner 253b501d4f673c0db267a76800339f9943f2ce6fe33Chris Lattner /// Result - The result instruction. 254b501d4f673c0db267a76800339f9943f2ce6fe33Chris Lattner DagInit *Result; 255b501d4f673c0db267a76800339f9943f2ce6fe33Chris Lattner 256c76e80ded753b78a72be0db40fcdba543435d818Chris Lattner CodeGenInstAlias(Record *R); 257c76e80ded753b78a72be0db40fcdba543435d818Chris Lattner }; 258c76e80ded753b78a72be0db40fcdba543435d818Chris Lattner} 259ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner 260ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner#endif 261