CodeGenInstruction.h revision 83a8031336a1155e6b0c3e9a84164324e08d1c8b
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" 18225549f775db61c5dba10e14758f4b43c53ef593Chris Lattner#include "llvm/ADT/StringRef.h" 19a49c7dfb360154070c08b8eb94ad31711d1babaeBob Wilson#include "llvm/Support/SourceMgr.h" 20ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner#include <string> 21ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner#include <vector> 22ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner#include <utility> 23ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner 24ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattnernamespace llvm { 25ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner class Record; 2665303d6bd777b76735ef179870678a1d14671c54Chris Lattner class DagInit; 279414ae52911f1d62cabd5108e0381b9d17476157Chris Lattner class CodeGenTarget; 284d43d0fd996a01c2cd21fd51082bc1bba783ef3cChris Lattner class StringRef; 290c4d44aa7ae109dfbc0551dbe77e4e0f903b38aeJim Grosbach 30c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner class CGIOperandList { 31d41b30def3181bce4bf87e8bde664d15663165d0Jeff Cohen public: 32a7d479c7bd9723cabdd7c9e1e9a1e6e482f78e7eChris Lattner class ConstraintInfo { 33a7d479c7bd9723cabdd7c9e1e9a1e6e482f78e7eChris Lattner enum { None, EarlyClobber, Tied } Kind; 34a7d479c7bd9723cabdd7c9e1e9a1e6e482f78e7eChris Lattner unsigned OtherTiedOperand; 35a7d479c7bd9723cabdd7c9e1e9a1e6e482f78e7eChris Lattner public: 36a7d479c7bd9723cabdd7c9e1e9a1e6e482f78e7eChris Lattner ConstraintInfo() : Kind(None) {} 370c4d44aa7ae109dfbc0551dbe77e4e0f903b38aeJim Grosbach 38a7d479c7bd9723cabdd7c9e1e9a1e6e482f78e7eChris Lattner static ConstraintInfo getEarlyClobber() { 39a7d479c7bd9723cabdd7c9e1e9a1e6e482f78e7eChris Lattner ConstraintInfo I; 40a7d479c7bd9723cabdd7c9e1e9a1e6e482f78e7eChris Lattner I.Kind = EarlyClobber; 41e555c9f4a54fd854af13f117fc0650ada3df3d24Chris Lattner I.OtherTiedOperand = 0; 42a7d479c7bd9723cabdd7c9e1e9a1e6e482f78e7eChris Lattner return I; 43a7d479c7bd9723cabdd7c9e1e9a1e6e482f78e7eChris Lattner } 440c4d44aa7ae109dfbc0551dbe77e4e0f903b38aeJim Grosbach 45a7d479c7bd9723cabdd7c9e1e9a1e6e482f78e7eChris Lattner static ConstraintInfo getTied(unsigned Op) { 46a7d479c7bd9723cabdd7c9e1e9a1e6e482f78e7eChris Lattner ConstraintInfo I; 47a7d479c7bd9723cabdd7c9e1e9a1e6e482f78e7eChris Lattner I.Kind = Tied; 48a7d479c7bd9723cabdd7c9e1e9a1e6e482f78e7eChris Lattner I.OtherTiedOperand = Op; 49a7d479c7bd9723cabdd7c9e1e9a1e6e482f78e7eChris Lattner return I; 50a7d479c7bd9723cabdd7c9e1e9a1e6e482f78e7eChris Lattner } 510c4d44aa7ae109dfbc0551dbe77e4e0f903b38aeJim Grosbach 52a7d479c7bd9723cabdd7c9e1e9a1e6e482f78e7eChris Lattner bool isNone() const { return Kind == None; } 53a7d479c7bd9723cabdd7c9e1e9a1e6e482f78e7eChris Lattner bool isEarlyClobber() const { return Kind == EarlyClobber; } 54a7d479c7bd9723cabdd7c9e1e9a1e6e482f78e7eChris Lattner bool isTied() const { return Kind == Tied; } 550c4d44aa7ae109dfbc0551dbe77e4e0f903b38aeJim Grosbach 56a7d479c7bd9723cabdd7c9e1e9a1e6e482f78e7eChris Lattner unsigned getTiedOperand() const { 57a7d479c7bd9723cabdd7c9e1e9a1e6e482f78e7eChris Lattner assert(isTied()); 58a7d479c7bd9723cabdd7c9e1e9a1e6e482f78e7eChris Lattner return OtherTiedOperand; 59a7d479c7bd9723cabdd7c9e1e9a1e6e482f78e7eChris Lattner } 60a7d479c7bd9723cabdd7c9e1e9a1e6e482f78e7eChris Lattner }; 619ed2cee1057e2df3a4305b9c818aa577c8504f59Jim Grosbach 62cf03da0ce913267c4971534e8792297e06535a4eChris Lattner /// OperandInfo - The information we keep track of for each operand in the 63cf03da0ce913267c4971534e8792297e06535a4eChris Lattner /// operand list for a tablegen instruction. 6487c5905e0b6f551e21c9a96f1b6418920d908210Chris Lattner struct OperandInfo { 65cf03da0ce913267c4971534e8792297e06535a4eChris Lattner /// Rec - The definition this operand is declared as. 660e384b66a781fc0ff005f475a7ab151afa054fb0Chris Lattner /// 6787c5905e0b6f551e21c9a96f1b6418920d908210Chris Lattner Record *Rec; 680c4d44aa7ae109dfbc0551dbe77e4e0f903b38aeJim Grosbach 69cf03da0ce913267c4971534e8792297e06535a4eChris Lattner /// Name - If this operand was assigned a symbolic name, this is it, 70cf03da0ce913267c4971534e8792297e06535a4eChris Lattner /// otherwise, it's empty. 7187c5905e0b6f551e21c9a96f1b6418920d908210Chris Lattner std::string Name; 720c4d44aa7ae109dfbc0551dbe77e4e0f903b38aeJim Grosbach 73cf03da0ce913267c4971534e8792297e06535a4eChris Lattner /// PrinterMethodName - The method used to print operands of this type in 74cf03da0ce913267c4971534e8792297e06535a4eChris Lattner /// the asmprinter. 75cf03da0ce913267c4971534e8792297e06535a4eChris Lattner std::string PrinterMethodName; 760c4d44aa7ae109dfbc0551dbe77e4e0f903b38aeJim Grosbach 775013f7469ec44adba127de65517e699180ee532fJim Grosbach /// EncoderMethodName - The method used to get the machine operand value 785013f7469ec44adba127de65517e699180ee532fJim Grosbach /// for binary encoding. "getMachineOpValue" by default. 795013f7469ec44adba127de65517e699180ee532fJim Grosbach std::string EncoderMethodName; 800c4d44aa7ae109dfbc0551dbe77e4e0f903b38aeJim Grosbach 815196c12e9fdec9ef3c63d96cb529c1c1cb732773Benjamin Kramer /// OperandType - A value from MCOI::OperandType representing the type of 825196c12e9fdec9ef3c63d96cb529c1c1cb732773Benjamin Kramer /// the operand. 835196c12e9fdec9ef3c63d96cb529c1c1cb732773Benjamin Kramer std::string OperandType; 845196c12e9fdec9ef3c63d96cb529c1c1cb732773Benjamin Kramer 85cf03da0ce913267c4971534e8792297e06535a4eChris Lattner /// MIOperandNo - Currently (this is meant to be phased out), some logical 86cf03da0ce913267c4971534e8792297e06535a4eChris Lattner /// operands correspond to multiple MachineInstr operands. In the X86 87cf03da0ce913267c4971534e8792297e06535a4eChris Lattner /// target for example, one address operand is represented as 4 88cf03da0ce913267c4971534e8792297e06535a4eChris Lattner /// MachineOperands. Because of this, the operand number in the 89cf03da0ce913267c4971534e8792297e06535a4eChris Lattner /// OperandList may not match the MachineInstr operand num. Until it 90cf03da0ce913267c4971534e8792297e06535a4eChris Lattner /// does, this contains the MI operand index of this operand. 91cf03da0ce913267c4971534e8792297e06535a4eChris Lattner unsigned MIOperandNo; 92cfbf96aa9c3bd317548f72e022ba28a40353f95aChris Lattner unsigned MINumOperands; // The number of operands. 930c4d44aa7ae109dfbc0551dbe77e4e0f903b38aeJim Grosbach 94f64f9a4b75d07819866bfcf918b922a76d3e1600Chris Lattner /// DoNotEncode - Bools are set to true in this vector for each operand in 95f64f9a4b75d07819866bfcf918b922a76d3e1600Chris Lattner /// the DisableEncoding list. These should not be emitted by the code 96f64f9a4b75d07819866bfcf918b922a76d3e1600Chris Lattner /// emitter. 97f64f9a4b75d07819866bfcf918b922a76d3e1600Chris Lattner std::vector<bool> DoNotEncode; 980c4d44aa7ae109dfbc0551dbe77e4e0f903b38aeJim Grosbach 998ef9d16d3913db11c89fc2d14899e153bdbdc91bNate Begeman /// MIOperandInfo - Default MI operand type. Note an operand may be made 1008ef9d16d3913db11c89fc2d14899e153bdbdc91bNate Begeman /// up of multiple MI operands. 10105bce0beee87512e52428d4b80f5a8e79a949576David Greene DagInit *MIOperandInfo; 1020c4d44aa7ae109dfbc0551dbe77e4e0f903b38aeJim Grosbach 1030bb75004ff6c0ad26de7610cb873f81ea26fd6caChris Lattner /// Constraint info for this operand. This operand can have pieces, so we 1040bb75004ff6c0ad26de7610cb873f81ea26fd6caChris Lattner /// track constraint info for each. 105a7d479c7bd9723cabdd7c9e1e9a1e6e482f78e7eChris Lattner std::vector<ConstraintInfo> Constraints; 1060c4d44aa7ae109dfbc0551dbe77e4e0f903b38aeJim Grosbach 1079ed2cee1057e2df3a4305b9c818aa577c8504f59Jim Grosbach OperandInfo(Record *R, const std::string &N, const std::string &PMN, 1085196c12e9fdec9ef3c63d96cb529c1c1cb732773Benjamin Kramer const std::string &EMN, const std::string &OT, unsigned MION, 10905bce0beee87512e52428d4b80f5a8e79a949576David Greene unsigned MINO, DagInit *MIOI) 110c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner : Rec(R), Name(N), PrinterMethodName(PMN), EncoderMethodName(EMN), 1115196c12e9fdec9ef3c63d96cb529c1c1cb732773Benjamin Kramer OperandType(OT), MIOperandNo(MION), MINumOperands(MINO), 1125196c12e9fdec9ef3c63d96cb529c1c1cb732773Benjamin Kramer MIOperandInfo(MIOI) {} 1130c4d44aa7ae109dfbc0551dbe77e4e0f903b38aeJim Grosbach 1140c4d44aa7ae109dfbc0551dbe77e4e0f903b38aeJim Grosbach 1159b0d4bfca0f23d39f5f2aef6b6740267a26ee17cChris Lattner /// getTiedOperand - If this operand is tied to another one, return the 1169b0d4bfca0f23d39f5f2aef6b6740267a26ee17cChris Lattner /// other operand number. Otherwise, return -1. 1179b0d4bfca0f23d39f5f2aef6b6740267a26ee17cChris Lattner int getTiedRegister() const { 1189b0d4bfca0f23d39f5f2aef6b6740267a26ee17cChris Lattner for (unsigned j = 0, e = Constraints.size(); j != e; ++j) { 1199b0d4bfca0f23d39f5f2aef6b6740267a26ee17cChris Lattner const CGIOperandList::ConstraintInfo &CI = Constraints[j]; 1209b0d4bfca0f23d39f5f2aef6b6740267a26ee17cChris Lattner if (CI.isTied()) return CI.getTiedOperand(); 1219b0d4bfca0f23d39f5f2aef6b6740267a26ee17cChris Lattner } 1229b0d4bfca0f23d39f5f2aef6b6740267a26ee17cChris Lattner return -1; 1239b0d4bfca0f23d39f5f2aef6b6740267a26ee17cChris Lattner } 12487c5905e0b6f551e21c9a96f1b6418920d908210Chris Lattner }; 1250c4d44aa7ae109dfbc0551dbe77e4e0f903b38aeJim Grosbach 126c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner CGIOperandList(Record *D); 1270c4d44aa7ae109dfbc0551dbe77e4e0f903b38aeJim Grosbach 128c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner Record *TheDef; // The actual record containing this OperandList. 1293da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman 130cedef1ccf0d53693b5e62d524e7ba6b2122231c7Chris Lattner /// NumDefs - Number of def operands declared, this is the number of 131cedef1ccf0d53693b5e62d524e7ba6b2122231c7Chris Lattner /// elements in the instruction's (outs) list. 13264d80e3387f328d21cd9cc06464b5de7861e3f27Evan Cheng /// 13364d80e3387f328d21cd9cc06464b5de7861e3f27Evan Cheng unsigned NumDefs; 1340c4d44aa7ae109dfbc0551dbe77e4e0f903b38aeJim Grosbach 135ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner /// OperandList - The list of declared operands, along with their declared 136ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner /// type (which is a record). 13787c5905e0b6f551e21c9a96f1b6418920d908210Chris Lattner std::vector<OperandInfo> OperandList; 1380c4d44aa7ae109dfbc0551dbe77e4e0f903b38aeJim Grosbach 139c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner // Information gleaned from the operand list. 1405127ce09a4e4379f971280fab461a5f03befddbcEvan Cheng bool isPredicable; 14188cc092ca5bd79480205ee7b01aa39c13f3e35d7Evan Cheng bool hasOptionalDef; 142c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner bool isVariadic; 1430c4d44aa7ae109dfbc0551dbe77e4e0f903b38aeJim Grosbach 144c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner // Provide transparent accessors to the operand list. 145a90dbc133f7bc7bf0e042fb03222bfdfafce3965Chris Lattner bool empty() const { return OperandList.empty(); } 146c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner unsigned size() const { return OperandList.size(); } 147c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner const OperandInfo &operator[](unsigned i) const { return OperandList[i]; } 148c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner OperandInfo &operator[](unsigned i) { return OperandList[i]; } 149c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner OperandInfo &back() { return OperandList.back(); } 150c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner const OperandInfo &back() const { return OperandList.back(); } 1510c4d44aa7ae109dfbc0551dbe77e4e0f903b38aeJim Grosbach 1520c4d44aa7ae109dfbc0551dbe77e4e0f903b38aeJim Grosbach 153c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner /// getOperandNamed - Return the index of the operand with the specified 154c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner /// non-empty name. If the instruction does not have an operand with the 155c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner /// specified name, throw an exception. 156c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner unsigned getOperandNamed(StringRef Name) const; 1570c4d44aa7ae109dfbc0551dbe77e4e0f903b38aeJim Grosbach 158c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner /// hasOperandNamed - Query whether the instruction has an operand of the 159c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner /// given name. If so, return true and set OpIdx to the index of the 160c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner /// operand. Otherwise, return false. 161c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner bool hasOperandNamed(StringRef Name, unsigned &OpIdx) const; 1620c4d44aa7ae109dfbc0551dbe77e4e0f903b38aeJim Grosbach 1630bb75004ff6c0ad26de7610cb873f81ea26fd6caChris Lattner /// ParseOperandName - Parse an operand name like "$foo" or "$foo.bar", 1640bb75004ff6c0ad26de7610cb873f81ea26fd6caChris Lattner /// where $foo is a whole operand and $foo.bar refers to a suboperand. 1650bb75004ff6c0ad26de7610cb873f81ea26fd6caChris Lattner /// This throws an exception if the name is invalid. If AllowWholeOp is 1660bb75004ff6c0ad26de7610cb873f81ea26fd6caChris Lattner /// true, references to operands with suboperands are allowed, otherwise 1670bb75004ff6c0ad26de7610cb873f81ea26fd6caChris Lattner /// not. 1680bb75004ff6c0ad26de7610cb873f81ea26fd6caChris Lattner std::pair<unsigned,unsigned> ParseOperandName(const std::string &Op, 1690bb75004ff6c0ad26de7610cb873f81ea26fd6caChris Lattner bool AllowWholeOp = true); 1700c4d44aa7ae109dfbc0551dbe77e4e0f903b38aeJim Grosbach 1710bb75004ff6c0ad26de7610cb873f81ea26fd6caChris Lattner /// getFlattenedOperandNumber - Flatten a operand/suboperand pair into a 1720bb75004ff6c0ad26de7610cb873f81ea26fd6caChris Lattner /// flat machineinstr operand #. 1730bb75004ff6c0ad26de7610cb873f81ea26fd6caChris Lattner unsigned getFlattenedOperandNumber(std::pair<unsigned,unsigned> Op) const { 1740bb75004ff6c0ad26de7610cb873f81ea26fd6caChris Lattner return OperandList[Op.first].MIOperandNo + Op.second; 1750bb75004ff6c0ad26de7610cb873f81ea26fd6caChris Lattner } 1760c4d44aa7ae109dfbc0551dbe77e4e0f903b38aeJim Grosbach 177f64f9a4b75d07819866bfcf918b922a76d3e1600Chris Lattner /// getSubOperandNumber - Unflatten a operand number into an 178f64f9a4b75d07819866bfcf918b922a76d3e1600Chris Lattner /// operand/suboperand pair. 179f64f9a4b75d07819866bfcf918b922a76d3e1600Chris Lattner std::pair<unsigned,unsigned> getSubOperandNumber(unsigned Op) const { 180f64f9a4b75d07819866bfcf918b922a76d3e1600Chris Lattner for (unsigned i = 0; ; ++i) { 181f64f9a4b75d07819866bfcf918b922a76d3e1600Chris Lattner assert(i < OperandList.size() && "Invalid flat operand #"); 182f64f9a4b75d07819866bfcf918b922a76d3e1600Chris Lattner if (OperandList[i].MIOperandNo+OperandList[i].MINumOperands > Op) 183f64f9a4b75d07819866bfcf918b922a76d3e1600Chris Lattner return std::make_pair(i, Op-OperandList[i].MIOperandNo); 184f64f9a4b75d07819866bfcf918b922a76d3e1600Chris Lattner } 185f64f9a4b75d07819866bfcf918b922a76d3e1600Chris Lattner } 1860c4d44aa7ae109dfbc0551dbe77e4e0f903b38aeJim Grosbach 1870c4d44aa7ae109dfbc0551dbe77e4e0f903b38aeJim Grosbach 188f64f9a4b75d07819866bfcf918b922a76d3e1600Chris Lattner /// isFlatOperandNotEmitted - Return true if the specified flat operand # 189f64f9a4b75d07819866bfcf918b922a76d3e1600Chris Lattner /// should not be emitted with the code emitter. 190f64f9a4b75d07819866bfcf918b922a76d3e1600Chris Lattner bool isFlatOperandNotEmitted(unsigned FlatOpNo) const { 191f64f9a4b75d07819866bfcf918b922a76d3e1600Chris Lattner std::pair<unsigned,unsigned> Op = getSubOperandNumber(FlatOpNo); 192f64f9a4b75d07819866bfcf918b922a76d3e1600Chris Lattner if (OperandList[Op.first].DoNotEncode.size() > Op.second) 193f64f9a4b75d07819866bfcf918b922a76d3e1600Chris Lattner return OperandList[Op.first].DoNotEncode[Op.second]; 194f64f9a4b75d07819866bfcf918b922a76d3e1600Chris Lattner return false; 195f64f9a4b75d07819866bfcf918b922a76d3e1600Chris Lattner } 1960c4d44aa7ae109dfbc0551dbe77e4e0f903b38aeJim Grosbach 197c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner void ProcessDisableEncoding(std::string Value); 198c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner }; 1990c4d44aa7ae109dfbc0551dbe77e4e0f903b38aeJim Grosbach 200ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner 201c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner class CodeGenInstruction { 202c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner public: 203c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner Record *TheDef; // The actual record defining this instruction. 204c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner std::string Namespace; // The namespace the instruction is in. 20587c5905e0b6f551e21c9a96f1b6418920d908210Chris Lattner 206c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner /// AsmString - The format string used to emit a .s file for the 207c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner /// instruction. 208c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner std::string AsmString; 2099ed2cee1057e2df3a4305b9c818aa577c8504f59Jim Grosbach 210c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner /// Operands - This is information about the (ins) and (outs) list specified 211c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner /// to the instruction. 212c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner CGIOperandList Operands; 213c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner 214c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner /// ImplicitDefs/ImplicitUses - These are lists of registers that are 215c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner /// implicitly defined and used by the instruction. 216c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner std::vector<Record*> ImplicitDefs, ImplicitUses; 217c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner 218c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner // Various boolean values we track for the instruction. 219c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner bool isReturn; 220c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner bool isBranch; 221c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner bool isIndirectBranch; 222c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner bool isCompare; 223c4af4638dfdab0dc3b6257276cfad2ee45053060Evan Cheng bool isMoveImm; 2240f040a258ff6a2372fc232212b5e4189e8e7185dEvan Cheng bool isBitcast; 225c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner bool isBarrier; 226c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner bool isCall; 227c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner bool canFoldAsLoad; 228c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner bool mayLoad, mayStore; 229c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner bool isPredicable; 230c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner bool isConvertibleToThreeAddress; 231c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner bool isCommutable; 232c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner bool isTerminator; 233c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner bool isReMaterializable; 234c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner bool hasDelaySlot; 235c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner bool usesCustomInserter; 23683a8031336a1155e6b0c3e9a84164324e08d1c8bAndrew Trick bool hasPostISelHook; 237c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner bool hasCtrlDep; 238c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner bool isNotDuplicable; 239c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner bool hasSideEffects; 240c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner bool neverHasSideEffects; 241c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner bool isAsCheapAsAMove; 242c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner bool hasExtraSrcRegAllocReq; 243c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner bool hasExtraDefRegAllocReq; 244e727d67c585ae8d4779ddd29490d9009cfc8e845Jim Grosbach bool isCodeGenOnly; 245806fcc040e0bc7962891f12d6e09fc86f0bc2184Jim Grosbach bool isPseudo; 246c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner 247c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner 248c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner CodeGenInstruction(Record *R); 24901855071e24e0e3e75306b82267d3ad0b13a0c15Jim Grosbach 2509414ae52911f1d62cabd5108e0381b9d17476157Chris Lattner /// HasOneImplicitDefWithKnownVT - If the instruction has at least one 2519414ae52911f1d62cabd5108e0381b9d17476157Chris Lattner /// implicit def and it has a known VT, return the VT, otherwise return 2529414ae52911f1d62cabd5108e0381b9d17476157Chris Lattner /// MVT::Other. 2539ed2cee1057e2df3a4305b9c818aa577c8504f59Jim Grosbach MVT::SimpleValueType 2549414ae52911f1d62cabd5108e0381b9d17476157Chris Lattner HasOneImplicitDefWithKnownVT(const CodeGenTarget &TargetInfo) const; 2550c4d44aa7ae109dfbc0551dbe77e4e0f903b38aeJim Grosbach 2560c4d44aa7ae109dfbc0551dbe77e4e0f903b38aeJim Grosbach 2574d43d0fd996a01c2cd21fd51082bc1bba783ef3cChris Lattner /// FlattenAsmStringVariants - Flatten the specified AsmString to only 2584d43d0fd996a01c2cd21fd51082bc1bba783ef3cChris Lattner /// include text from the specified variant, returning the new string. 2594d43d0fd996a01c2cd21fd51082bc1bba783ef3cChris Lattner static std::string FlattenAsmStringVariants(StringRef AsmString, 2604d43d0fd996a01c2cd21fd51082bc1bba783ef3cChris Lattner unsigned Variant); 261ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner }; 2620c4d44aa7ae109dfbc0551dbe77e4e0f903b38aeJim Grosbach 2630c4d44aa7ae109dfbc0551dbe77e4e0f903b38aeJim Grosbach 264c76e80ded753b78a72be0db40fcdba543435d818Chris Lattner /// CodeGenInstAlias - This represents an InstAlias definition. 265c76e80ded753b78a72be0db40fcdba543435d818Chris Lattner class CodeGenInstAlias { 266c76e80ded753b78a72be0db40fcdba543435d818Chris Lattner public: 267c76e80ded753b78a72be0db40fcdba543435d818Chris Lattner Record *TheDef; // The actual record defining this InstAlias. 2680c4d44aa7ae109dfbc0551dbe77e4e0f903b38aeJim Grosbach 269c76e80ded753b78a72be0db40fcdba543435d818Chris Lattner /// AsmString - The format string used to emit a .s file for the 270c76e80ded753b78a72be0db40fcdba543435d818Chris Lattner /// instruction. 271c76e80ded753b78a72be0db40fcdba543435d818Chris Lattner std::string AsmString; 2720c4d44aa7ae109dfbc0551dbe77e4e0f903b38aeJim Grosbach 273b501d4f673c0db267a76800339f9943f2ce6fe33Chris Lattner /// Result - The result instruction. 27405bce0beee87512e52428d4b80f5a8e79a949576David Greene DagInit *Result; 2750c4d44aa7ae109dfbc0551dbe77e4e0f903b38aeJim Grosbach 276225549f775db61c5dba10e14758f4b43c53ef593Chris Lattner /// ResultInst - The instruction generated by the alias (decoded from 277225549f775db61c5dba10e14758f4b43c53ef593Chris Lattner /// Result). 278225549f775db61c5dba10e14758f4b43c53ef593Chris Lattner CodeGenInstruction *ResultInst; 2790c4d44aa7ae109dfbc0551dbe77e4e0f903b38aeJim Grosbach 2800c4d44aa7ae109dfbc0551dbe77e4e0f903b38aeJim Grosbach 281225549f775db61c5dba10e14758f4b43c53ef593Chris Lattner struct ResultOperand { 28298c870f87b7f0c996a9ba67003d88d434d6dbcd0Chris Lattner private: 283225549f775db61c5dba10e14758f4b43c53ef593Chris Lattner StringRef Name; 284225549f775db61c5dba10e14758f4b43c53ef593Chris Lattner Record *R; 2850c4d44aa7ae109dfbc0551dbe77e4e0f903b38aeJim Grosbach 28698c870f87b7f0c996a9ba67003d88d434d6dbcd0Chris Lattner int64_t Imm; 2870c4d44aa7ae109dfbc0551dbe77e4e0f903b38aeJim Grosbach public: 28898c870f87b7f0c996a9ba67003d88d434d6dbcd0Chris Lattner enum { 28998c870f87b7f0c996a9ba67003d88d434d6dbcd0Chris Lattner K_Record, 29090fd797dc739319347861d4f3984bc8952ae9a29Chris Lattner K_Imm, 29190fd797dc739319347861d4f3984bc8952ae9a29Chris Lattner K_Reg 29298c870f87b7f0c996a9ba67003d88d434d6dbcd0Chris Lattner } Kind; 2930c4d44aa7ae109dfbc0551dbe77e4e0f903b38aeJim Grosbach 29498c870f87b7f0c996a9ba67003d88d434d6dbcd0Chris Lattner ResultOperand(StringRef N, Record *r) : Name(N), R(r), Kind(K_Record) {} 29598c870f87b7f0c996a9ba67003d88d434d6dbcd0Chris Lattner ResultOperand(int64_t I) : Imm(I), Kind(K_Imm) {} 29690fd797dc739319347861d4f3984bc8952ae9a29Chris Lattner ResultOperand(Record *r) : R(r), Kind(K_Reg) {} 29798c870f87b7f0c996a9ba67003d88d434d6dbcd0Chris Lattner 29898c870f87b7f0c996a9ba67003d88d434d6dbcd0Chris Lattner bool isRecord() const { return Kind == K_Record; } 29998c870f87b7f0c996a9ba67003d88d434d6dbcd0Chris Lattner bool isImm() const { return Kind == K_Imm; } 30090fd797dc739319347861d4f3984bc8952ae9a29Chris Lattner bool isReg() const { return Kind == K_Reg; } 3010c4d44aa7ae109dfbc0551dbe77e4e0f903b38aeJim Grosbach 30298c870f87b7f0c996a9ba67003d88d434d6dbcd0Chris Lattner StringRef getName() const { assert(isRecord()); return Name; } 30398c870f87b7f0c996a9ba67003d88d434d6dbcd0Chris Lattner Record *getRecord() const { assert(isRecord()); return R; } 30498c870f87b7f0c996a9ba67003d88d434d6dbcd0Chris Lattner int64_t getImm() const { assert(isImm()); return Imm; } 30590fd797dc739319347861d4f3984bc8952ae9a29Chris Lattner Record *getRegister() const { assert(isReg()); return R; } 306225549f775db61c5dba10e14758f4b43c53ef593Chris Lattner }; 3070c4d44aa7ae109dfbc0551dbe77e4e0f903b38aeJim Grosbach 308225549f775db61c5dba10e14758f4b43c53ef593Chris Lattner /// ResultOperands - The decoded operands for the result instruction. 309225549f775db61c5dba10e14758f4b43c53ef593Chris Lattner std::vector<ResultOperand> ResultOperands; 3105e8f2a65ca2044815039129610876dfc4de3ebfaBob Wilson 311a49c7dfb360154070c08b8eb94ad31711d1babaeBob Wilson /// ResultInstOperandIndex - For each operand, this vector holds a pair of 312a49c7dfb360154070c08b8eb94ad31711d1babaeBob Wilson /// indices to identify the corresponding operand in the result 313a49c7dfb360154070c08b8eb94ad31711d1babaeBob Wilson /// instruction. The first index specifies the operand and the second 314a49c7dfb360154070c08b8eb94ad31711d1babaeBob Wilson /// index specifies the suboperand. If there are no suboperands or if all 315a49c7dfb360154070c08b8eb94ad31711d1babaeBob Wilson /// of them are matched by the operand, the second value should be -1. 316a49c7dfb360154070c08b8eb94ad31711d1babaeBob Wilson std::vector<std::pair<unsigned, int> > ResultInstOperandIndex; 3170c4d44aa7ae109dfbc0551dbe77e4e0f903b38aeJim Grosbach 318225549f775db61c5dba10e14758f4b43c53ef593Chris Lattner CodeGenInstAlias(Record *R, CodeGenTarget &T); 319a49c7dfb360154070c08b8eb94ad31711d1babaeBob Wilson 32005bce0beee87512e52428d4b80f5a8e79a949576David Greene bool tryAliasOpMatch(DagInit *Result, unsigned AliasOpNo, 321a49c7dfb360154070c08b8eb94ad31711d1babaeBob Wilson Record *InstOpRec, bool hasSubOps, SMLoc Loc, 322a49c7dfb360154070c08b8eb94ad31711d1babaeBob Wilson CodeGenTarget &T, ResultOperand &ResOp); 3230c4d44aa7ae109dfbc0551dbe77e4e0f903b38aeJim Grosbach }; 324c76e80ded753b78a72be0db40fcdba543435d818Chris Lattner} 325ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner 326ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner#endif 327