195fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan//===- EDEmitter.cpp - Generate instruction descriptions for ED -*- C++ -*-===// 295fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan// 395fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan// The LLVM Compiler Infrastructure 495fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan// 595fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan// This file is distributed under the University of Illinois Open Source 695fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan// License. See LICENSE.TXT for details. 795fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan// 895fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan//===----------------------------------------------------------------------===// 995fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan// 1095fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan// This tablegen backend is responsible for emitting a description of each 1195fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan// instruction in a format that the enhanced disassembler can use to tokenize 1295fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan// and parse instructions. 1395fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan// 1495fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan//===----------------------------------------------------------------------===// 1595fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan 16d0bc7f060ece77c670794ef60f7052e2ff1847c9Sean Callanan#include "AsmWriterInst.h" 1795fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan#include "CodeGenTarget.h" 189899f70a7406d632c82849978bf6981f1ee4ccb5Sean Callanan#include "llvm/MC/EDInstInfo.h" 1995fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan#include "llvm/Support/ErrorHandling.h" 2095fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan#include "llvm/Support/Format.h" 2195fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan#include "llvm/Support/raw_ostream.h" 226f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen#include "llvm/TableGen/Record.h" 236f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen#include "llvm/TableGen/TableGenBackend.h" 2495fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan#include <string> 258f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan#include <vector> 2695fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan 2795fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callananusing namespace llvm; 2895fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan 296f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen// TODO: There's a suspiciously large amount of "table" data in this 306f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen// backend which should probably be in the TableGen file itself. 316f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen 3295fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan/////////////////////////////////////////////////////////// 3395fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan// Support classes for emitting nested C data structures // 3495fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan/////////////////////////////////////////////////////////// 3595fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan 366f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen// TODO: These classes are probably generally useful to other backends; 376f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen// add them to TableGen's "helper" API's. 389c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach 396f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesennamespace { 406f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesenclass EnumEmitter { 416f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesenprivate: 426f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen std::string Name; 436f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen std::vector<std::string> Entries; 446f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesenpublic: 456f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen EnumEmitter(const char *N) : Name(N) { 466f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen } 476f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen int addEntry(const char *e) { 486f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen Entries.push_back(std::string(e)); 496f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen return Entries.size() - 1; 506f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen } 516f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen void emit(raw_ostream &o, unsigned int &i) { 526f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen o.indent(i) << "enum " << Name.c_str() << " {" << "\n"; 536f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen i += 2; 546f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen 556f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen unsigned int index = 0; 566f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen unsigned int numEntries = Entries.size(); 576f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen for (index = 0; index < numEntries; ++index) { 586f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen o.indent(i) << Entries[index]; 596f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen if (index < (numEntries - 1)) 606f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen o << ","; 616f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen o << "\n"; 6295fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan } 639c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach 646f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen i -= 2; 656f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen o.indent(i) << "};" << "\n"; 666f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen } 676f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen 686f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen void emitAsFlags(raw_ostream &o, unsigned int &i) { 696f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen o.indent(i) << "enum " << Name.c_str() << " {" << "\n"; 706f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen i += 2; 716f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen 726f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen unsigned int index = 0; 736f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen unsigned int numEntries = Entries.size(); 746f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen unsigned int flag = 1; 756f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen for (index = 0; index < numEntries; ++index) { 766f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen o.indent(i) << Entries[index] << " = " << format("0x%x", flag); 776f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen if (index < (numEntries - 1)) 786f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen o << ","; 796f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen o << "\n"; 806f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen flag <<= 1; 8195fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan } 829c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach 836f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen i -= 2; 846f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen o.indent(i) << "};" << "\n"; 856f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen } 866f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen}; 876f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen} // End anonymous namespace 889c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach 896f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesennamespace { 906f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesenclass ConstantEmitter { 916f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesenpublic: 926f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen virtual ~ConstantEmitter() { } 936f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen virtual void emit(raw_ostream &o, unsigned int &i) = 0; 946f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen}; 956f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen} // End anonymous namespace 9695fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan 976f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesennamespace { 986f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesenclass LiteralConstantEmitter : public ConstantEmitter { 996f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesenprivate: 1006f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen bool IsNumber; 1016f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen union { 1026f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen int Number; 1036f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen const char* String; 10495fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan }; 1056f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesenpublic: 1066f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen LiteralConstantEmitter(int number = 0) : 1076f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen IsNumber(true), 1086f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen Number(number) { 1096f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen } 1106f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen void set(const char *string) { 1116f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen IsNumber = false; 1126f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen Number = 0; 1136f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen String = string; 1146f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen } 1156f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen bool is(const char *string) { 1166f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen return !strcmp(String, string); 1176f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen } 1186f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen void emit(raw_ostream &o, unsigned int &i) { 1196f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen if (IsNumber) 1206f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen o << Number; 1216f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen else 1226f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen o << String; 1236f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen } 1246f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen}; 1256f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen} // End anonymous namespace 1269c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach 1276f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesennamespace { 1286f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesenclass CompoundConstantEmitter : public ConstantEmitter { 1296f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesenprivate: 1306f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen unsigned int Padding; 1316f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen std::vector<ConstantEmitter *> Entries; 1326f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesenpublic: 1336f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen CompoundConstantEmitter(unsigned int padding = 0) : Padding(padding) { 1346f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen } 1356f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen CompoundConstantEmitter &addEntry(ConstantEmitter *e) { 1366f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen Entries.push_back(e); 1379c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach 1386f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen return *this; 1396f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen } 1406f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen ~CompoundConstantEmitter() { 1416f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen while (Entries.size()) { 1426f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen ConstantEmitter *entry = Entries.back(); 1436f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen Entries.pop_back(); 1446f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen delete entry; 14595fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan } 1466f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen } 1476f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen void emit(raw_ostream &o, unsigned int &i) { 1486f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen o << "{" << "\n"; 1496f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen i += 2; 1509c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach 1516f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen unsigned int index; 1526f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen unsigned int numEntries = Entries.size(); 1539c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach 1546f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen unsigned int numToPrint; 1559c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach 1566f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen if (Padding) { 1576f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen if (numEntries > Padding) { 1586f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen fprintf(stderr, "%u entries but %u padding\n", numEntries, Padding); 1596f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen llvm_unreachable("More entries than padding"); 16095fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan } 1616f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen numToPrint = Padding; 1626f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen } else { 1636f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen numToPrint = numEntries; 16495fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan } 1659c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach 1666f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen for (index = 0; index < numToPrint; ++index) { 1676f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen o.indent(i); 1686f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen if (index < numEntries) 1696f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen Entries[index]->emit(o, i); 1706f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen else 1716f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen o << "-1"; 1726f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen 1736f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen if (index < (numToPrint - 1)) 1746f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen o << ","; 1756f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen o << "\n"; 17695fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan } 17795fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan 1786f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen i -= 2; 1796f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen o.indent(i) << "}"; 1806f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen } 1816f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen}; 1826f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen} // End anonymous namespace 1836f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen 1846f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesennamespace { 1856f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesenclass FlagsConstantEmitter : public ConstantEmitter { 1866f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesenprivate: 1876f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen std::vector<std::string> Flags; 1886f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesenpublic: 1896f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen FlagsConstantEmitter() { 1906f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen } 1916f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen FlagsConstantEmitter &addEntry(const char *f) { 1926f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen Flags.push_back(std::string(f)); 1936f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen return *this; 1946f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen } 1956f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen void emit(raw_ostream &o, unsigned int &i) { 1966f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen unsigned int index; 1976f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen unsigned int numFlags = Flags.size(); 1986f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen if (numFlags == 0) 1996f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen o << "0"; 2006f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen 2016f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen for (index = 0; index < numFlags; ++index) { 2026f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen o << Flags[index].c_str(); 2036f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen if (index < (numFlags - 1)) 2046f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen o << " | "; 2056f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen } 2066f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen } 2076f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen}; 2086f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen} // End anonymous namespace 20995fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan 2102db6ff2285bbfacf675739f46008581517abe8bfSean Callanan/// populateOperandOrder - Accepts a CodeGenInstruction and generates its 2112db6ff2285bbfacf675739f46008581517abe8bfSean Callanan/// AsmWriterInst for the desired assembly syntax, giving an ordered list of 2122db6ff2285bbfacf675739f46008581517abe8bfSean Callanan/// operands in the order they appear in the printed instruction. Then, for 2132db6ff2285bbfacf675739f46008581517abe8bfSean Callanan/// each entry in that list, determines the index of the same operand in the 2142db6ff2285bbfacf675739f46008581517abe8bfSean Callanan/// CodeGenInstruction, and emits the resulting mapping into an array, filling 2152db6ff2285bbfacf675739f46008581517abe8bfSean Callanan/// in unused slots with -1. 21695fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan/// 21795fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan/// @arg operandOrder - The array that will be populated with the operand 21895fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan/// mapping. Each entry will contain -1 (invalid index 21995fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan/// into the operands present in the AsmString) or a number 22095fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan/// representing an index in the operand descriptor array. 2212db6ff2285bbfacf675739f46008581517abe8bfSean Callanan/// @arg inst - The instruction to use when looking up the operands 2222db6ff2285bbfacf675739f46008581517abe8bfSean Callanan/// @arg syntax - The syntax to use, according to LLVM's enumeration 2236f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesenstatic void populateOperandOrder(CompoundConstantEmitter *operandOrder, 2246f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen const CodeGenInstruction &inst, 2256f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen unsigned syntax) { 22695fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan unsigned int numArgs = 0; 2279c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach 2282db6ff2285bbfacf675739f46008581517abe8bfSean Callanan AsmWriterInst awInst(inst, syntax, -1, -1); 2299c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach 2302db6ff2285bbfacf675739f46008581517abe8bfSean Callanan std::vector<AsmWriterOperand>::iterator operandIterator; 2319c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach 2322db6ff2285bbfacf675739f46008581517abe8bfSean Callanan for (operandIterator = awInst.Operands.begin(); 2332db6ff2285bbfacf675739f46008581517abe8bfSean Callanan operandIterator != awInst.Operands.end(); 2342db6ff2285bbfacf675739f46008581517abe8bfSean Callanan ++operandIterator) { 2359c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach if (operandIterator->OperandType == 2362db6ff2285bbfacf675739f46008581517abe8bfSean Callanan AsmWriterOperand::isMachineInstrOperand) { 2378f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan operandOrder->addEntry( 2388f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan new LiteralConstantEmitter(operandIterator->CGIOpNo)); 2392db6ff2285bbfacf675739f46008581517abe8bfSean Callanan numArgs++; 24095fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan } 24195fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan } 24295fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan} 24395fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan 24495fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan///////////////////////////////////////////////////// 24595fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan// Support functions for handling X86 instructions // 24695fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan///////////////////////////////////////////////////// 24795fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan 2488f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan#define SET(flag) { type->set(flag); return 0; } 24995fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan 2508f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan#define REG(str) if (name == str) SET("kOperandTypeRegister"); 2518f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan#define MEM(str) if (name == str) SET("kOperandTypeX86Memory"); 2528f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan#define LEA(str) if (name == str) SET("kOperandTypeX86EffectiveAddress"); 2538f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan#define IMM(str) if (name == str) SET("kOperandTypeImmediate"); 2548f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan#define PCR(str) if (name == str) SET("kOperandTypeX86PCRelative"); 25595fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan 2568f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan/// X86TypeFromOpName - Processes the name of a single X86 operand (which is 2578f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan/// actually its type) and translates it into an operand type 25895fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan/// 2598f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan/// @arg flags - The type object to set 26095fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan/// @arg name - The name of the operand 2618f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callananstatic int X86TypeFromOpName(LiteralConstantEmitter *type, 26295fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan const std::string &name) { 26395fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan REG("GR8"); 26495fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan REG("GR8_NOREX"); 26595fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan REG("GR16"); 2667ea16b01fad5236cc132cb5fc3e443fcbf70d3b8Craig Topper REG("GR16_NOAX"); 26795fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan REG("GR32"); 2687ea16b01fad5236cc132cb5fc3e443fcbf70d3b8Craig Topper REG("GR32_NOAX"); 26995fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan REG("GR32_NOREX"); 2705e81716425dc3373fbc834bfa7936a5c1205579bEvan Cheng REG("GR32_TC"); 27195fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan REG("FR32"); 27295fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan REG("RFP32"); 27395fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan REG("GR64"); 2747ea16b01fad5236cc132cb5fc3e443fcbf70d3b8Craig Topper REG("GR64_NOAX"); 2755e81716425dc3373fbc834bfa7936a5c1205579bEvan Cheng REG("GR64_TC"); 27695fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan REG("FR64"); 27795fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan REG("VR64"); 27895fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan REG("RFP64"); 27995fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan REG("RFP80"); 28095fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan REG("VR128"); 281e86b01c153ba52307ecb6e7513ec33f57caedfddBruno Cardoso Lopes REG("VR256"); 28295fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan REG("RST"); 28395fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan REG("SEGMENT_REG"); 28495fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan REG("DEBUG_REG"); 2851a8b789a4b8290d263c1c75411788ca45bae3230Sean Callanan REG("CONTROL_REG"); 2869c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach 2878f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan IMM("i8imm"); 2888f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan IMM("i16imm"); 2898f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan IMM("i16i8imm"); 2908f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan IMM("i32imm"); 2918f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan IMM("i32i8imm"); 292c37d4bbf1f33c5e4b1c2f1bf1a6e2cae2ae5603aKevin Enderby IMM("u32u8imm"); 2938f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan IMM("i64imm"); 2948f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan IMM("i64i8imm"); 2958f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan IMM("i64i32imm"); 2968f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan IMM("SSECC"); 297769bbfd951018f9b36f3d2f0d70a23d81f2d3287Craig Topper IMM("AVXCC"); 2989c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach 2998f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan // all R, I, R, I, R 30095fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan MEM("i8mem"); 30195fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan MEM("i8mem_NOREX"); 30295fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan MEM("i16mem"); 30395fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan MEM("i32mem"); 3045e81716425dc3373fbc834bfa7936a5c1205579bEvan Cheng MEM("i32mem_TC"); 30595fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan MEM("f32mem"); 30695fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan MEM("ssmem"); 30795fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan MEM("opaque32mem"); 30895fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan MEM("opaque48mem"); 30995fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan MEM("i64mem"); 3105e81716425dc3373fbc834bfa7936a5c1205579bEvan Cheng MEM("i64mem_TC"); 31195fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan MEM("f64mem"); 31295fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan MEM("sdmem"); 31395fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan MEM("f80mem"); 31495fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan MEM("opaque80mem"); 31595fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan MEM("i128mem"); 31694143ee6254944a26adba2200037328c2c8ef289Bruno Cardoso Lopes MEM("i256mem"); 31795fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan MEM("f128mem"); 318e86b01c153ba52307ecb6e7513ec33f57caedfddBruno Cardoso Lopes MEM("f256mem"); 31995fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan MEM("opaque512mem"); 32075dc33a60b65bbbf2253b0b916df1d36a4da4237Craig Topper // Gather 32175dc33a60b65bbbf2253b0b916df1d36a4da4237Craig Topper MEM("vx32mem") 32275dc33a60b65bbbf2253b0b916df1d36a4da4237Craig Topper MEM("vy32mem") 32375dc33a60b65bbbf2253b0b916df1d36a4da4237Craig Topper MEM("vx64mem") 32475dc33a60b65bbbf2253b0b916df1d36a4da4237Craig Topper MEM("vy64mem") 3259c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach 3268f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan // all R, I, R, I 32795fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan LEA("lea32mem"); 32895fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan LEA("lea64_32mem"); 32995fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan LEA("lea64mem"); 3309c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach 3318f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan // all I 3329fc05227a2596c545b845ed9a72673995e49d16bChris Lattner PCR("i16imm_pcrel"); 333a0f914b6c1fa9708d9b2d2712930430de4f1afacSean Callanan PCR("i32imm_pcrel"); 334a0f914b6c1fa9708d9b2d2712930430de4f1afacSean Callanan PCR("i64i32imm_pcrel"); 33595fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan PCR("brtarget8"); 33695fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan PCR("offset8"); 33795fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan PCR("offset16"); 33895fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan PCR("offset32"); 33995fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan PCR("offset64"); 34095fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan PCR("brtarget"); 341c266600bec4b5ba0ee93ffdfeaafcab8f1295145Owen Anderson PCR("uncondbrtarget"); 342d1d5a39cada320949353e8b2c59b6a160a67f7bfJim Grosbach PCR("bltarget"); 3439c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach 344685c350ae76b588e1f00c01a511fe8bd57f18394Jason W Kim // all I, ARM mode only, conditional/unconditional 345685c350ae76b588e1f00c01a511fe8bd57f18394Jason W Kim PCR("br_target"); 346685c350ae76b588e1f00c01a511fe8bd57f18394Jason W Kim PCR("bl_target"); 34795fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan return 1; 34895fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan} 34995fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan 35095fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan#undef REG 35195fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan#undef MEM 35295fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan#undef LEA 35395fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan#undef IMM 35495fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan#undef PCR 3558f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan 3568f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan#undef SET 35795fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan 35895fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan/// X86PopulateOperands - Handles all the operands in an X86 instruction, adding 35995fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan/// the appropriate flags to their descriptors 36095fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan/// 36195fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan/// @operandFlags - A reference the array of operand flag objects 36295fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan/// @inst - The instruction to use as a source of information 36395fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callananstatic void X86PopulateOperands( 3649899f70a7406d632c82849978bf6981f1ee4ccb5Sean Callanan LiteralConstantEmitter *(&operandTypes)[EDIS_MAX_OPERANDS], 36595fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan const CodeGenInstruction &inst) { 36695fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan if (!inst.TheDef->isSubClassOf("X86Inst")) 36795fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan return; 3689c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach 36995fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan unsigned int index; 370c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner unsigned int numOperands = inst.Operands.size(); 3719c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach 37295fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan for (index = 0; index < numOperands; ++index) { 373c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner const CGIOperandList::OperandInfo &operandInfo = inst.Operands[index]; 37495fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan Record &rec = *operandInfo.Rec; 3759c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach 37636c3bc431b92f1573b3f3bd75b644774681998eeNAKAMURA Takumi if (X86TypeFromOpName(operandTypes[index], rec.getName()) && 37736c3bc431b92f1573b3f3bd75b644774681998eeNAKAMURA Takumi !rec.isSubClassOf("PointerLikeRegClass")) { 37895fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan errs() << "Operand type: " << rec.getName().c_str() << "\n"; 37995fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan errs() << "Operand name: " << operandInfo.Name.c_str() << "\n"; 380519c893c2682a597049f958b2842e34c456b0434Cameron Esfahani errs() << "Instruction name: " << inst.TheDef->getName().c_str() << "\n"; 38195fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan llvm_unreachable("Unhandled type"); 38295fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan } 38395fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan } 38495fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan} 38595fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan 38695fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan/// decorate1 - Decorates a named operand with a new flag 38795fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan/// 38895fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan/// @operandFlags - The array of operand flag objects, which don't have names 38995fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan/// @inst - The CodeGenInstruction, which provides a way to translate 39095fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan/// between names and operand indices 39195fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan/// @opName - The name of the operand 39295fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan/// @flag - The name of the flag to add 3938f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callananstatic inline void decorate1( 3949899f70a7406d632c82849978bf6981f1ee4ccb5Sean Callanan FlagsConstantEmitter *(&operandFlags)[EDIS_MAX_OPERANDS], 3958f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan const CodeGenInstruction &inst, 3968f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan const char *opName, 3978f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan const char *opFlag) { 39895fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan unsigned opIndex; 3999c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach 400c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner opIndex = inst.Operands.getOperandNamed(std::string(opName)); 4019c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach 40295fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan operandFlags[opIndex]->addEntry(opFlag); 40395fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan} 40495fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan 40595fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan#define DECORATE1(opName, opFlag) decorate1(operandFlags, inst, opName, opFlag) 40695fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan 4078f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan#define MOV(source, target) { \ 4088f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan instType.set("kInstructionTypeMove"); \ 4098f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan DECORATE1(source, "kOperandFlagSource"); \ 4108f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan DECORATE1(target, "kOperandFlagTarget"); \ 41195fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan} 41295fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan 4138f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan#define BRANCH(target) { \ 4148f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan instType.set("kInstructionTypeBranch"); \ 4158f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan DECORATE1(target, "kOperandFlagTarget"); \ 41695fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan} 41795fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan 4188f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan#define PUSH(source) { \ 4198f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan instType.set("kInstructionTypePush"); \ 4208f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan DECORATE1(source, "kOperandFlagSource"); \ 42195fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan} 42295fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan 4238f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan#define POP(target) { \ 4248f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan instType.set("kInstructionTypePop"); \ 4258f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan DECORATE1(target, "kOperandFlagTarget"); \ 42695fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan} 42795fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan 4288f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan#define CALL(target) { \ 4298f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan instType.set("kInstructionTypeCall"); \ 4308f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan DECORATE1(target, "kOperandFlagTarget"); \ 43195fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan} 43295fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan 4338f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan#define RETURN() { \ 4348f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan instType.set("kInstructionTypeReturn"); \ 43595fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan} 43695fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan 43795fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan/// X86ExtractSemantics - Performs various checks on the name of an X86 4389c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach/// instruction to determine what sort of an instruction it is and then adds 43995fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan/// the appropriate flags to the instruction and its operands 44095fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan/// 4418f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan/// @arg instType - A reference to the type for the instruction as a whole 44295fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan/// @arg operandFlags - A reference to the array of operand flag object pointers 44395fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan/// @arg inst - A reference to the original instruction 4448f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callananstatic void X86ExtractSemantics( 4458f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan LiteralConstantEmitter &instType, 4469899f70a7406d632c82849978bf6981f1ee4ccb5Sean Callanan FlagsConstantEmitter *(&operandFlags)[EDIS_MAX_OPERANDS], 4478f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan const CodeGenInstruction &inst) { 44895fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan const std::string &name = inst.TheDef->getName(); 4499c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach 45095fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan if (name.find("MOV") != name.npos) { 45195fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan if (name.find("MOV_V") != name.npos) { 45295fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan // ignore (this is a pseudoinstruction) 4538f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan } else if (name.find("MASK") != name.npos) { 45495fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan // ignore (this is a masking move) 4558f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan } else if (name.find("r0") != name.npos) { 45695fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan // ignore (this is a pseudoinstruction) 4578f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan } else if (name.find("PS") != name.npos || 45895fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan name.find("PD") != name.npos) { 45995fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan // ignore (this is a shuffling move) 4608f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan } else if (name.find("MOVS") != name.npos) { 46195fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan // ignore (this is a string move) 4628f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan } else if (name.find("_F") != name.npos) { 46395fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan // TODO handle _F moves to ST(0) 4648f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan } else if (name.find("a") != name.npos) { 46595fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan // TODO handle moves to/from %ax 4668f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan } else if (name.find("CMOV") != name.npos) { 46795fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan MOV("src2", "dst"); 4688f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan } else if (name.find("PC") != name.npos) { 46995fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan MOV("label", "reg") 4708f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan } else { 47195fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan MOV("src", "dst"); 47295fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan } 47395fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan } 4749c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach 47595fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan if (name.find("JMP") != name.npos || 47695fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan name.find("J") == 0) { 47795fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan if (name.find("FAR") != name.npos && name.find("i") != name.npos) { 47895fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan BRANCH("off"); 4798f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan } else { 48095fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan BRANCH("dst"); 48195fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan } 48295fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan } 4839c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach 48495fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan if (name.find("PUSH") != name.npos) { 485373c458850a963ab062046529337fe976e1f944dChris Lattner if (name.find("CS") != name.npos || 486373c458850a963ab062046529337fe976e1f944dChris Lattner name.find("DS") != name.npos || 487373c458850a963ab062046529337fe976e1f944dChris Lattner name.find("ES") != name.npos || 488373c458850a963ab062046529337fe976e1f944dChris Lattner name.find("FS") != name.npos || 489373c458850a963ab062046529337fe976e1f944dChris Lattner name.find("GS") != name.npos || 490373c458850a963ab062046529337fe976e1f944dChris Lattner name.find("SS") != name.npos) { 4918f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan instType.set("kInstructionTypePush"); 49295fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan // TODO add support for fixed operands 4938f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan } else if (name.find("F") != name.npos) { 49495fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan // ignore (this pushes onto the FP stack) 49550b9efc2a852bab753948a35e6615ace3100c9daNico Weber } else if (name.find("A") != name.npos) { 49650b9efc2a852bab753948a35e6615ace3100c9daNico Weber // ignore (pushes all GP registoers onto the stack) 4978f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan } else if (name[name.length() - 1] == 'm') { 49895fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan PUSH("src"); 4998f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan } else if (name.find("i") != name.npos) { 50095fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan PUSH("imm"); 5018f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan } else { 50295fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan PUSH("reg"); 50395fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan } 50495fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan } 5059c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach 50695fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan if (name.find("POP") != name.npos) { 50795fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan if (name.find("POPCNT") != name.npos) { 50895fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan // ignore (not a real pop) 509373c458850a963ab062046529337fe976e1f944dChris Lattner } else if (name.find("CS") != name.npos || 510373c458850a963ab062046529337fe976e1f944dChris Lattner name.find("DS") != name.npos || 511373c458850a963ab062046529337fe976e1f944dChris Lattner name.find("ES") != name.npos || 512373c458850a963ab062046529337fe976e1f944dChris Lattner name.find("FS") != name.npos || 513373c458850a963ab062046529337fe976e1f944dChris Lattner name.find("GS") != name.npos || 514373c458850a963ab062046529337fe976e1f944dChris Lattner name.find("SS") != name.npos) { 5158f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan instType.set("kInstructionTypePop"); 51695fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan // TODO add support for fixed operands 5178f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan } else if (name.find("F") != name.npos) { 51895fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan // ignore (this pops from the FP stack) 51950b9efc2a852bab753948a35e6615ace3100c9daNico Weber } else if (name.find("A") != name.npos) { 52050b9efc2a852bab753948a35e6615ace3100c9daNico Weber // ignore (pushes all GP registoers onto the stack) 5218f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan } else if (name[name.length() - 1] == 'm') { 52295fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan POP("dst"); 5238f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan } else { 52495fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan POP("reg"); 52595fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan } 52695fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan } 5279c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach 52895fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan if (name.find("CALL") != name.npos) { 52995fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan if (name.find("ADJ") != name.npos) { 53095fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan // ignore (not a call) 5318f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan } else if (name.find("SYSCALL") != name.npos) { 53295fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan // ignore (doesn't go anywhere we know about) 5338f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan } else if (name.find("VMCALL") != name.npos) { 53495fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan // ignore (rather different semantics than a regular call) 5359e3d0b335111b2df73984a6cfd9ef1cd5d323872Craig Topper } else if (name.find("VMMCALL") != name.npos) { 5369e3d0b335111b2df73984a6cfd9ef1cd5d323872Craig Topper // ignore (rather different semantics than a regular call) 5378f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan } else if (name.find("FAR") != name.npos && name.find("i") != name.npos) { 53895fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan CALL("off"); 5398f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan } else { 54095fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan CALL("dst"); 54195fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan } 54295fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan } 5439c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach 54495fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan if (name.find("RET") != name.npos) { 54595fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan RETURN(); 54695fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan } 54795fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan} 54895fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan 54995fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan#undef MOV 55095fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan#undef BRANCH 55195fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan#undef PUSH 55295fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan#undef POP 55395fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan#undef CALL 55495fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan#undef RETURN 55595fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan 5568f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan///////////////////////////////////////////////////// 5578f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan// Support functions for handling ARM instructions // 5588f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan///////////////////////////////////////////////////// 5598f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan 5608f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan#define SET(flag) { type->set(flag); return 0; } 5618f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan 5628f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan#define REG(str) if (name == str) SET("kOperandTypeRegister"); 5638f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan#define IMM(str) if (name == str) SET("kOperandTypeImmediate"); 5648f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan 5658f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan#define MISC(str, type) if (name == str) SET(type); 5668f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan 5678f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan/// ARMFlagFromOpName - Processes the name of a single ARM operand (which is 5688f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan/// actually its type) and translates it into an operand type 5698f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan/// 5708f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan/// @arg type - The type object to set 5718f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan/// @arg name - The name of the operand 5728f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callananstatic int ARMFlagFromOpName(LiteralConstantEmitter *type, 5738f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan const std::string &name) { 5748f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan REG("GPR"); 5756ccfc507dc1f7ad8c8964193a2407264ca644f0dJim Grosbach REG("rGPR"); 57651c9805c4bcca635bc6a854e4a246ebd4258f512Owen Anderson REG("GPRnopc"); 5775b81584f7403ffdb9cc6babaaeb0411c080e0f81Jim Grosbach REG("GPRsp"); 5786470a116f17b70aba0c2e7ee751551a5ac9797f6Dale Johannesen REG("tcGPR"); 5798f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan REG("cc_out"); 5808f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan REG("s_cc_out"); 5818f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan REG("tGPR"); 5828f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan REG("DPR"); 5838f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan REG("DPR_VFP2"); 5848f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan REG("DPR_8"); 5855b2f9136644c58ae32e00d8317540692a697d1c9Jakob Stoklund Olesen REG("DPair"); 586b63387afc6b10e88631d1ef232c41ab6c18c8581Evan Cheng REG("SPR"); 587b63387afc6b10e88631d1ef232c41ab6c18c8581Evan Cheng REG("QPR"); 588b63387afc6b10e88631d1ef232c41ab6c18c8581Evan Cheng REG("QQPR"); 58922c687b6421d9cc03351ddb0c7fd3d45382bc01aEvan Cheng REG("QQQQPR"); 590862019c37f5b5d76e34eeb0d5686e617d544059fJim Grosbach REG("VecListOneD"); 59128f08c93e75d291695ea89b9004145103292e85bJim Grosbach REG("VecListDPair"); 592c3384c93c0e4c50da4ad093f08997507f9281c75Jim Grosbach REG("VecListDPairSpaced"); 593cdcfa280568d5d48ebeba2dcfc87915105e090d1Jim Grosbach REG("VecListThreeD"); 594b6310316dbaf8716003531d7ed245f77f1a76a11Jim Grosbach REG("VecListFourD"); 59598b05a57b67d1968381563c8cccbbb6c6cb65e3dJim Grosbach REG("VecListOneDAllLanes"); 596c0fc450f0754508871bc70f21e528bf2f1520da1Jim Grosbach REG("VecListDPairAllLanes"); 5974d0983a4d734280d481bb56472fe44ad0ddc447dJim Grosbach REG("VecListDPairSpacedAllLanes"); 5989c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach 5998f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan IMM("i32imm"); 6004050bc4cab61f8d3c7583a9b60f17c7da47bbf69Jim Grosbach IMM("fbits16"); 6014050bc4cab61f8d3c7583a9b60f17c7da47bbf69Jim Grosbach IMM("fbits32"); 6027597212abced110723f2fee985a7d60557c092ecEvan Cheng IMM("i32imm_hilo16"); 6038f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan IMM("bf_inv_mask_imm"); 604a461d4222877f43588da38c466145f38dd74e229Bruno Cardoso Lopes IMM("lsb_pos_imm"); 605a461d4222877f43588da38c466145f38dd74e229Bruno Cardoso Lopes IMM("width_imm"); 6068f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan IMM("jtblock_operand"); 6078f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan IMM("nohash_imm"); 608e4e5e2aae7e1e0e84877061432e7b981a360a77dOwen Anderson IMM("p_imm"); 609e546c4c9c3004274c8e275e8303ca078b794bf28Silviu Baranga IMM("pf_imm"); 610e4e5e2aae7e1e0e84877061432e7b981a360a77dOwen Anderson IMM("c_imm"); 6119b8f2a0b365ea62a5fef80bbaab3cf0252db2fcfJim Grosbach IMM("coproc_option_imm"); 612a2b6e4151b75248f9dbf8067186cba673520f8f4Bruno Cardoso Lopes IMM("imod_op"); 613a2b6e4151b75248f9dbf8067186cba673520f8f4Bruno Cardoso Lopes IMM("iflags_op"); 6148f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan IMM("cpinst_operand"); 615b3af5de2d97c30355b8109e149326b0664d34085Jim Grosbach IMM("setend_op"); 6168f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan IMM("cps_opt"); 6178f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan IMM("vfp_f64imm"); 6188f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan IMM("vfp_f32imm"); 6191adc40cac314b0a77b790b094bca146a3a868452Johnny Chen IMM("memb_opt"); 6208f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan IMM("msr_mask"); 6218f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan IMM("neg_zero"); 6228f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan IMM("imm0_31"); 6238abe32af38b66bf4577526b23b6af6ec7eb6c155Jim Grosbach IMM("imm0_31_m1"); 624f49433523e8a39db6d83503e312ae55160eed90aJim Grosbach IMM("imm1_16"); 6254a5ffb399f841783c201c599b88d576757f1922eJim Grosbach IMM("imm1_32"); 6261a913ed17875d1a0fb490e1266b74c057c76a94bBob Wilson IMM("nModImm"); 6270e387b2877e4eebeedfcb26b08253f9c1b946035Jim Grosbach IMM("nImmSplatI8"); 628ea46110f57b293844a314aec3b8092adf21ff63fJim Grosbach IMM("nImmSplatI16"); 6296248a546f23e7ffa84c171dc364b922e28467275Jim Grosbach IMM("nImmSplatI32"); 630f2f5bc60f61acf0490d856ddd09e461bf93c5459Jim Grosbach IMM("nImmSplatI64"); 6316248a546f23e7ffa84c171dc364b922e28467275Jim Grosbach IMM("nImmVMOVI32"); 632eaa192af18677c4dc5894e049514d8a6b1d6d7c2Evan Cheng IMM("nImmVMOVF32"); 6333b8991cc98a469cbf8d9fa2a2ad971f46b8b6fd2Jim Grosbach IMM("imm8"); 6343b8991cc98a469cbf8d9fa2a2ad971f46b8b6fd2Jim Grosbach IMM("imm16"); 6353b8991cc98a469cbf8d9fa2a2ad971f46b8b6fd2Jim Grosbach IMM("imm32"); 6363b8991cc98a469cbf8d9fa2a2ad971f46b8b6fd2Jim Grosbach IMM("imm1_7"); 6373b8991cc98a469cbf8d9fa2a2ad971f46b8b6fd2Jim Grosbach IMM("imm1_15"); 6383b8991cc98a469cbf8d9fa2a2ad971f46b8b6fd2Jim Grosbach IMM("imm1_31"); 639587f5062b9e4532c4f464942e593cb87c58ac153Jim Grosbach IMM("imm0_1"); 640587f5062b9e4532c4f464942e593cb87c58ac153Jim Grosbach IMM("imm0_3"); 64183ab070fc1fbb02ca77b0a37e6ae0eacf58001e1Jim Grosbach IMM("imm0_7"); 64283ab070fc1fbb02ca77b0a37e6ae0eacf58001e1Jim Grosbach IMM("imm0_15"); 6436b8f1e35eacba34a11e2a7d5f614efc47b43d2e3Jim Grosbach IMM("imm0_255"); 6448f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan IMM("imm0_4095"); 645619e0d6d95879a08ede97c171e1c8712554c7951Jim Grosbach IMM("imm0_65535"); 646ffa3225e26cc1977d20f0d9649fcd6f38a3c4815Jim Grosbach IMM("imm0_65535_expr"); 647ed8384806e56952c44f8a717c1ef54a8468d2c8dJim Grosbach IMM("imm24b"); 648dde038af59506c631ce181aff66e315a0c477f4dJim Grosbach IMM("pkh_lsl_amt"); 649dde038af59506c631ce181aff66e315a0c477f4dJim Grosbach IMM("pkh_asr_amt"); 6508f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan IMM("jt2block_operand"); 65172f39f8436848885176943b0ba985a7171145423Jim Grosbach IMM("t_imm0_1020s4"); 65272f39f8436848885176943b0ba985a7171145423Jim Grosbach IMM("t_imm0_508s4"); 6538f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan IMM("pclabel"); 6545d14f9be7ba64162c7b996f36d419b11d8cdbe9aJim Grosbach IMM("adrlabel"); 655d40963c4065432ec7e47879d3ca665a54ee903b6Jim Grosbach IMM("t_adrlabel"); 656a838a25d59838adfa91463f6a918ae3adeb352c1Owen Anderson IMM("t2adrlabel"); 65722f5dc79c05d69391b17e14ed912aa8e98a63027Bob Wilson IMM("shift_imm"); 6580afa0094afdfe589f407feb76948f273b414b278Owen Anderson IMM("t2_shift_imm"); 659498ec20703c89d0c2890b0967791f0f5f2b59a2fOwen Anderson IMM("neon_vcvt_imm32"); 6603116dce33840a115130c5f8ffcb9679d023496d6Bill Wendling IMM("shr_imm8"); 6613116dce33840a115130c5f8ffcb9679d023496d6Bill Wendling IMM("shr_imm16"); 6623116dce33840a115130c5f8ffcb9679d023496d6Bill Wendling IMM("shr_imm32"); 6633116dce33840a115130c5f8ffcb9679d023496d6Bill Wendling IMM("shr_imm64"); 664c9bd496aa206746d0bc114d15781650a5b543296Owen Anderson IMM("t2ldrlabel"); 6657ce057983ea7b8ad42d5cca1bb5d3f6941662269Jim Grosbach IMM("postidx_imm8"); 666154c41dbbc06284efd56782a8bc137a25148918eOwen Anderson IMM("postidx_imm8s4"); 6676d74631062e4464326eb5c680a4d62d340fa42ebOwen Anderson IMM("imm_sr"); 6686d74631062e4464326eb5c680a4d62d340fa42ebOwen Anderson IMM("imm1_31"); 669460a90540b045c102012da2492999557e6840526Jim Grosbach IMM("VectorIndex8"); 670460a90540b045c102012da2492999557e6840526Jim Grosbach IMM("VectorIndex16"); 671460a90540b045c102012da2492999557e6840526Jim Grosbach IMM("VectorIndex32"); 6729c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach 6738f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan MISC("brtarget", "kOperandTypeARMBranchTarget"); // ? 674c266600bec4b5ba0ee93ffdfeaafcab8f1295145Owen Anderson MISC("uncondbrtarget", "kOperandTypeARMBranchTarget"); // ? 675e246717c3a36a913fd4200776ed621649bb2b624Jim Grosbach MISC("t_brtarget", "kOperandTypeARMBranchTarget"); // ? 67601086451393ef33e82b6fad623989dd97dd70edfJim Grosbach MISC("t_bcctarget", "kOperandTypeARMBranchTarget"); // ? 677cf6220a9de15d8a2a431f2672ebab3ffb0048c78Jim Grosbach MISC("t_cbtarget", "kOperandTypeARMBranchTarget"); // ? 678d1d5a39cada320949353e8b2c59b6a160a67f7bfJim Grosbach MISC("bltarget", "kOperandTypeARMBranchTarget"); // ? 679685c350ae76b588e1f00c01a511fe8bd57f18394Jason W Kim 680685c350ae76b588e1f00c01a511fe8bd57f18394Jason W Kim MISC("br_target", "kOperandTypeARMBranchTarget"); // ? 681685c350ae76b588e1f00c01a511fe8bd57f18394Jason W Kim MISC("bl_target", "kOperandTypeARMBranchTarget"); // ? 682f1eab597b2316c6cfcabfcee98895fedb2071722Owen Anderson MISC("blx_target", "kOperandTypeARMBranchTarget"); // ? 683685c350ae76b588e1f00c01a511fe8bd57f18394Jason W Kim 684dff2f7151f695b86db8c4b0c6604463bdb8a63eaBill Wendling MISC("t_bltarget", "kOperandTypeARMBranchTarget"); // ? 68509aa3f0ef35d9241c92439d74b8d5e9a81d814c2Bill Wendling MISC("t_blxtarget", "kOperandTypeARMBranchTarget"); // ? 686152d4a4bb6b75de740b4b8a9f48abb9069d50c17Owen Anderson MISC("so_reg_imm", "kOperandTypeARMSoRegReg"); // R, R, I 687152d4a4bb6b75de740b4b8a9f48abb9069d50c17Owen Anderson MISC("so_reg_reg", "kOperandTypeARMSoRegImm"); // R, R, I 688152d4a4bb6b75de740b4b8a9f48abb9069d50c17Owen Anderson MISC("shift_so_reg_reg", "kOperandTypeARMSoRegReg"); // R, R, I 689152d4a4bb6b75de740b4b8a9f48abb9069d50c17Owen Anderson MISC("shift_so_reg_imm", "kOperandTypeARMSoRegImm"); // R, R, I 6908f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan MISC("t2_so_reg", "kOperandTypeThumb2SoReg"); // R, I 6918f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan MISC("so_imm", "kOperandTypeARMSoImm"); // I 692b35ad41fef5d1edd9495f708fb7eae1a0a94ef9dJim Grosbach MISC("rot_imm", "kOperandTypeARMRotImm"); // I 6938f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan MISC("t2_so_imm", "kOperandTypeThumb2SoImm"); // I 6948f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan MISC("so_imm2part", "kOperandTypeARMSoImm2Part"); // I 6958f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan MISC("pred", "kOperandTypeARMPredicate"); // I, R 6968f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan MISC("it_pred", "kOperandTypeARMPredicate"); // I 6973e5561247202bae994dd259a2d8dc4eff8f799f3Jim Grosbach MISC("addrmode_imm12", "kOperandTypeAddrModeImm12"); // R, I 6983e5561247202bae994dd259a2d8dc4eff8f799f3Jim Grosbach MISC("ldst_so_reg", "kOperandTypeLdStSOReg"); // R, R, I 6997ce057983ea7b8ad42d5cca1bb5d3f6941662269Jim Grosbach MISC("postidx_reg", "kOperandTypeARMAddrMode3Offset"); // R, I 7008f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan MISC("addrmode2", "kOperandTypeARMAddrMode2"); // R, R, I 7017ce057983ea7b8ad42d5cca1bb5d3f6941662269Jim Grosbach MISC("am2offset_reg", "kOperandTypeARMAddrMode2Offset"); // R, I 7027ce057983ea7b8ad42d5cca1bb5d3f6941662269Jim Grosbach MISC("am2offset_imm", "kOperandTypeARMAddrMode2Offset"); // R, I 7038f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan MISC("addrmode3", "kOperandTypeARMAddrMode3"); // R, R, I 7048f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan MISC("am3offset", "kOperandTypeARMAddrMode3Offset"); // R, I 705e6913600c723a10ab1f06a43c93d82ee8e26c71cJim Grosbach MISC("ldstm_mode", "kOperandTypeARMLdStmMode"); // I 7068f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan MISC("addrmode5", "kOperandTypeARMAddrMode5"); // R, I 7078f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan MISC("addrmode6", "kOperandTypeARMAddrMode6"); // R, R, I, I 7088f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan MISC("am6offset", "kOperandTypeARMAddrMode6Offset"); // R, I, I 7098e0c7b52877983b4838e54e233449912fc1a2325Bob Wilson MISC("addrmode6dup", "kOperandTypeARMAddrMode6"); // R, R, I, I 710183c627d89be5d0e8f3255ab7f6d1204c2fabedfMon P Wang MISC("addrmode6oneL32", "kOperandTypeARMAddrMode6"); // R, R, I, I 7118f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan MISC("addrmodepc", "kOperandTypeARMAddrModePC"); // R, I 712e39389a58d54208fe005aba1709c601ef78b3ec1Jim Grosbach MISC("addr_offset_none", "kOperandTypeARMAddrMode7"); // R 7138f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan MISC("reglist", "kOperandTypeARMRegisterList"); // I, R, ... 7140f6307561359fac4425a0b9e512931cf96c1ec5bBill Wendling MISC("dpr_reglist", "kOperandTypeARMDPRRegisterList"); // I, R, ... 7150f6307561359fac4425a0b9e512931cf96c1ec5bBill Wendling MISC("spr_reglist", "kOperandTypeARMSPRRegisterList"); // I, R, ... 7168f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan MISC("it_mask", "kOperandTypeThumbITMask"); // I 717505f3cd2965e65b6b7ad023eaba0e3dc89b67409Bruno Cardoso Lopes MISC("t2addrmode_reg", "kOperandTypeThumb2AddrModeReg"); // R 718f0eee6eca8c39b11b6a41d9b04eba8985655df77Jim Grosbach MISC("t2addrmode_posimm8", "kOperandTypeThumb2AddrModeImm8"); // R, I 719a8307dd1c9279cbde1f3497e530d2ed9d014a0c5Jim Grosbach MISC("t2addrmode_negimm8", "kOperandTypeThumb2AddrModeImm8"); // R, I 7208f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan MISC("t2addrmode_imm8", "kOperandTypeThumb2AddrModeImm8"); // R, I 7218f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan MISC("t2am_imm8_offset", "kOperandTypeThumb2AddrModeImm8Offset");//I 7228f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan MISC("t2addrmode_imm12", "kOperandTypeThumb2AddrModeImm12"); // R, I 7238f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan MISC("t2addrmode_so_reg", "kOperandTypeThumb2AddrModeSoReg"); // R, R, I 7248f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan MISC("t2addrmode_imm8s4", "kOperandTypeThumb2AddrModeImm8s4"); // R, I 725b6aed508e310e31dcb080e761ca856127cec0773Jim Grosbach MISC("t2addrmode_imm0_1020s4", "kOperandTypeThumb2AddrModeImm8s4"); // R, I 7269c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach MISC("t2am_imm8s4_offset", "kOperandTypeThumb2AddrModeImm8s4Offset"); 7278f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan // R, I 7288f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan MISC("tb_addrmode", "kOperandTypeARMTBAddrMode"); // I 7297ae0df41422193e65231a0f9526bfe66067c6532Shantonu Sen MISC("t_addrmode_rrs1", "kOperandTypeThumbAddrModeRegS1"); // R, R 7307ae0df41422193e65231a0f9526bfe66067c6532Shantonu Sen MISC("t_addrmode_rrs2", "kOperandTypeThumbAddrModeRegS2"); // R, R 7317ae0df41422193e65231a0f9526bfe66067c6532Shantonu Sen MISC("t_addrmode_rrs4", "kOperandTypeThumbAddrModeRegS4"); // R, R 7327ae0df41422193e65231a0f9526bfe66067c6532Shantonu Sen MISC("t_addrmode_is1", "kOperandTypeThumbAddrModeImmS1"); // R, I 7337ae0df41422193e65231a0f9526bfe66067c6532Shantonu Sen MISC("t_addrmode_is2", "kOperandTypeThumbAddrModeImmS2"); // R, I 7347ae0df41422193e65231a0f9526bfe66067c6532Shantonu Sen MISC("t_addrmode_is4", "kOperandTypeThumbAddrModeImmS4"); // R, I 7358f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan MISC("t_addrmode_rr", "kOperandTypeThumbAddrModeRR"); // R, R 7368f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan MISC("t_addrmode_sp", "kOperandTypeThumbAddrModeSP"); // R, I 737b8958b031ec5163261f490f131780c5dc3d823d6Bill Wendling MISC("t_addrmode_pc", "kOperandTypeThumbAddrModePC"); // R, I 7387f739bee261debdf56bd89ac922b57eca53e91dcJim Grosbach MISC("addrmode_tbb", "kOperandTypeThumbAddrModeRR"); // R, R 7397f739bee261debdf56bd89ac922b57eca53e91dcJim Grosbach MISC("addrmode_tbh", "kOperandTypeThumbAddrModeRR"); // R, R 7409c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach 7418f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan return 1; 7428f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan} 7438f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan 7448f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan#undef REG 7458f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan#undef MEM 7467ae0df41422193e65231a0f9526bfe66067c6532Shantonu Sen#undef MISC 7478f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan 7488f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan#undef SET 7498f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan 7508f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan/// ARMPopulateOperands - Handles all the operands in an ARM instruction, adding 7518f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan/// the appropriate flags to their descriptors 7528f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan/// 7538f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan/// @operandFlags - A reference the array of operand flag objects 7548f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan/// @inst - The instruction to use as a source of information 7558f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callananstatic void ARMPopulateOperands( 7569899f70a7406d632c82849978bf6981f1ee4ccb5Sean Callanan LiteralConstantEmitter *(&operandTypes)[EDIS_MAX_OPERANDS], 7578f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan const CodeGenInstruction &inst) { 7588f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan if (!inst.TheDef->isSubClassOf("InstARM") && 7598f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan !inst.TheDef->isSubClassOf("InstThumb")) 7608f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan return; 7619c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach 7628f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan unsigned int index; 763c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner unsigned int numOperands = inst.Operands.size(); 7649c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach 7659899f70a7406d632c82849978bf6981f1ee4ccb5Sean Callanan if (numOperands > EDIS_MAX_OPERANDS) { 7669c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach errs() << "numOperands == " << numOperands << " > " << 7679899f70a7406d632c82849978bf6981f1ee4ccb5Sean Callanan EDIS_MAX_OPERANDS << '\n'; 7688f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan llvm_unreachable("Too many operands"); 7698f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan } 7709c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach 7718f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan for (index = 0; index < numOperands; ++index) { 772c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner const CGIOperandList::OperandInfo &operandInfo = inst.Operands[index]; 7738f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan Record &rec = *operandInfo.Rec; 7749c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach 7758f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan if (ARMFlagFromOpName(operandTypes[index], rec.getName())) { 776127dc5e615390609540b07ce262ac368278ddb88Benjamin Kramer errs() << "Operand type: " << rec.getName() << '\n'; 777127dc5e615390609540b07ce262ac368278ddb88Benjamin Kramer errs() << "Operand name: " << operandInfo.Name << '\n'; 778519c893c2682a597049f958b2842e34c456b0434Cameron Esfahani errs() << "Instruction name: " << inst.TheDef->getName() << '\n'; 779d4578a4f8d61b5ca0f686b14a5d734eb97694fcfJim Grosbach throw("Unhandled type in EDEmitter"); 7808f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan } 7818f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan } 7828f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan} 7838f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan 7848f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan#define BRANCH(target) { \ 7858f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan instType.set("kInstructionTypeBranch"); \ 7868f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan DECORATE1(target, "kOperandFlagTarget"); \ 7878f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan} 7888f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan 7898f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan/// ARMExtractSemantics - Performs various checks on the name of an ARM 7909c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach/// instruction to determine what sort of an instruction it is and then adds 7918f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan/// the appropriate flags to the instruction and its operands 7928f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan/// 7938f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan/// @arg instType - A reference to the type for the instruction as a whole 7948f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan/// @arg operandTypes - A reference to the array of operand type object pointers 7958f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan/// @arg operandFlags - A reference to the array of operand flag object pointers 7968f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan/// @arg inst - A reference to the original instruction 7978f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callananstatic void ARMExtractSemantics( 7988f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan LiteralConstantEmitter &instType, 7999899f70a7406d632c82849978bf6981f1ee4ccb5Sean Callanan LiteralConstantEmitter *(&operandTypes)[EDIS_MAX_OPERANDS], 8009899f70a7406d632c82849978bf6981f1ee4ccb5Sean Callanan FlagsConstantEmitter *(&operandFlags)[EDIS_MAX_OPERANDS], 8018f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan const CodeGenInstruction &inst) { 8028f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan const std::string &name = inst.TheDef->getName(); 8039c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach 8048f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan if (name == "tBcc" || 8058f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan name == "tB" || 8068f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan name == "t2Bcc" || 8078f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan name == "Bcc" || 8088f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan name == "tCBZ" || 8098f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan name == "tCBNZ") { 8108f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan BRANCH("target"); 8118f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan } 8129c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach 8138f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan if (name == "tBLr9" || 8148f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan name == "BLr9_pred" || 8158f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan name == "tBLXi_r9" || 8168f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan name == "tBLXr_r9" || 8178f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan name == "BLXr9" || 8188f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan name == "t2BXJ" || 8198f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan name == "BXJ") { 8208f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan BRANCH("func"); 8219c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach 8228f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan unsigned opIndex; 823c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner opIndex = inst.Operands.getOperandNamed("func"); 8248f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan if (operandTypes[opIndex]->is("kOperandTypeImmediate")) 8258f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan operandTypes[opIndex]->set("kOperandTypeARMBranchTarget"); 8268f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan } 8278f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan} 8288f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan 8298f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan#undef BRANCH 83095fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan 8319c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach/// populateInstInfo - Fills an array of InstInfos with information about each 83295fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan/// instruction in a target 83395fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan/// 83495fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan/// @arg infoArray - The array of InstInfo objects to populate 83595fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan/// @arg target - The CodeGenTarget to use as a source of instructions 83695fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callananstatic void populateInstInfo(CompoundConstantEmitter &infoArray, 83795fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan CodeGenTarget &target) { 838f65027842e82027dd6e8020586a299aaa548e355Chris Lattner const std::vector<const CodeGenInstruction*> &numberedInstructions = 839f65027842e82027dd6e8020586a299aaa548e355Chris Lattner target.getInstructionsByEnumValue(); 8409c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach 84195fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan unsigned int index; 84295fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan unsigned int numInstructions = numberedInstructions.size(); 8439c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach 84495fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan for (index = 0; index < numInstructions; ++index) { 84595fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan const CodeGenInstruction& inst = *numberedInstructions[index]; 8469c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach 847a0ed0c0fcdd8b94f741f296a67669da3180fb42cJakob Stoklund Olesen CompoundConstantEmitter *infoStruct = new CompoundConstantEmitter; 848a0ed0c0fcdd8b94f741f296a67669da3180fb42cJakob Stoklund Olesen infoArray.addEntry(infoStruct); 849a0ed0c0fcdd8b94f741f296a67669da3180fb42cJakob Stoklund Olesen 8508f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan LiteralConstantEmitter *instType = new LiteralConstantEmitter; 8518f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan infoStruct->addEntry(instType); 8529c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach 8539c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach LiteralConstantEmitter *numOperandsEmitter = 854c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner new LiteralConstantEmitter(inst.Operands.size()); 85595fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan infoStruct->addEntry(numOperandsEmitter); 8569c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach 8578f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan CompoundConstantEmitter *operandTypeArray = new CompoundConstantEmitter; 8588f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan infoStruct->addEntry(operandTypeArray); 8599c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach 8609899f70a7406d632c82849978bf6981f1ee4ccb5Sean Callanan LiteralConstantEmitter *operandTypes[EDIS_MAX_OPERANDS]; 8619c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach 86295fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan CompoundConstantEmitter *operandFlagArray = new CompoundConstantEmitter; 86395fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan infoStruct->addEntry(operandFlagArray); 8649c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach 8659899f70a7406d632c82849978bf6981f1ee4ccb5Sean Callanan FlagsConstantEmitter *operandFlags[EDIS_MAX_OPERANDS]; 8669c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach 8679c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach for (unsigned operandIndex = 0; 8689c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach operandIndex < EDIS_MAX_OPERANDS; 8698f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan ++operandIndex) { 8708f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan operandTypes[operandIndex] = new LiteralConstantEmitter; 8718f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan operandTypeArray->addEntry(operandTypes[operandIndex]); 8729c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach 87395fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan operandFlags[operandIndex] = new FlagsConstantEmitter; 87495fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan operandFlagArray->addEntry(operandFlags[operandIndex]); 87595fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan } 8769c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach 87795fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan unsigned numSyntaxes = 0; 8789c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach 879819a2abc72e9e27d105ebc085aac09c6029db4a6Jakob Stoklund Olesen // We don't need to do anything for pseudo-instructions, as we'll never 880819a2abc72e9e27d105ebc085aac09c6029db4a6Jakob Stoklund Olesen // see them here. We'll only see real instructions. 881819a2abc72e9e27d105ebc085aac09c6029db4a6Jakob Stoklund Olesen // We still need to emit null initializers for everything. 882819a2abc72e9e27d105ebc085aac09c6029db4a6Jakob Stoklund Olesen if (!inst.isPseudo) { 883819a2abc72e9e27d105ebc085aac09c6029db4a6Jakob Stoklund Olesen if (target.getName() == "X86") { 884819a2abc72e9e27d105ebc085aac09c6029db4a6Jakob Stoklund Olesen X86PopulateOperands(operandTypes, inst); 885819a2abc72e9e27d105ebc085aac09c6029db4a6Jakob Stoklund Olesen X86ExtractSemantics(*instType, operandFlags, inst); 886819a2abc72e9e27d105ebc085aac09c6029db4a6Jakob Stoklund Olesen numSyntaxes = 2; 887819a2abc72e9e27d105ebc085aac09c6029db4a6Jakob Stoklund Olesen } 888819a2abc72e9e27d105ebc085aac09c6029db4a6Jakob Stoklund Olesen else if (target.getName() == "ARM") { 889819a2abc72e9e27d105ebc085aac09c6029db4a6Jakob Stoklund Olesen ARMPopulateOperands(operandTypes, inst); 890819a2abc72e9e27d105ebc085aac09c6029db4a6Jakob Stoklund Olesen ARMExtractSemantics(*instType, operandTypes, operandFlags, inst); 891819a2abc72e9e27d105ebc085aac09c6029db4a6Jakob Stoklund Olesen numSyntaxes = 1; 892819a2abc72e9e27d105ebc085aac09c6029db4a6Jakob Stoklund Olesen } 8938f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan } 8949c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach 8959c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach CompoundConstantEmitter *operandOrderArray = new CompoundConstantEmitter; 8969c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach 89795fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan infoStruct->addEntry(operandOrderArray); 8989c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach 8999c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach for (unsigned syntaxIndex = 0; 9009c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach syntaxIndex < EDIS_MAX_SYNTAXES; 9019899f70a7406d632c82849978bf6981f1ee4ccb5Sean Callanan ++syntaxIndex) { 9029c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach CompoundConstantEmitter *operandOrder = 9039899f70a7406d632c82849978bf6981f1ee4ccb5Sean Callanan new CompoundConstantEmitter(EDIS_MAX_OPERANDS); 9049c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach 90595fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan operandOrderArray->addEntry(operandOrder); 9069c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach 90795fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan if (syntaxIndex < numSyntaxes) { 9082db6ff2285bbfacf675739f46008581517abe8bfSean Callanan populateOperandOrder(operandOrder, inst, syntaxIndex); 90995fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan } 91095fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan } 9119c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach 9128f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan infoStruct = NULL; 91395fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan } 91495fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan} 91595fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan 9169899f70a7406d632c82849978bf6981f1ee4ccb5Sean Callananstatic void emitCommonEnums(raw_ostream &o, unsigned int &i) { 9178f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan EnumEmitter operandTypes("OperandTypes"); 9188f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan operandTypes.addEntry("kOperandTypeNone"); 9198f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan operandTypes.addEntry("kOperandTypeImmediate"); 9208f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan operandTypes.addEntry("kOperandTypeRegister"); 9218f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan operandTypes.addEntry("kOperandTypeX86Memory"); 9228f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan operandTypes.addEntry("kOperandTypeX86EffectiveAddress"); 9238f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan operandTypes.addEntry("kOperandTypeX86PCRelative"); 9248f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan operandTypes.addEntry("kOperandTypeARMBranchTarget"); 925152d4a4bb6b75de740b4b8a9f48abb9069d50c17Owen Anderson operandTypes.addEntry("kOperandTypeARMSoRegReg"); 926152d4a4bb6b75de740b4b8a9f48abb9069d50c17Owen Anderson operandTypes.addEntry("kOperandTypeARMSoRegImm"); 9278f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan operandTypes.addEntry("kOperandTypeARMSoImm"); 928b35ad41fef5d1edd9495f708fb7eae1a0a94ef9dJim Grosbach operandTypes.addEntry("kOperandTypeARMRotImm"); 9298f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan operandTypes.addEntry("kOperandTypeARMSoImm2Part"); 9308f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan operandTypes.addEntry("kOperandTypeARMPredicate"); 9313e5561247202bae994dd259a2d8dc4eff8f799f3Jim Grosbach operandTypes.addEntry("kOperandTypeAddrModeImm12"); 9323e5561247202bae994dd259a2d8dc4eff8f799f3Jim Grosbach operandTypes.addEntry("kOperandTypeLdStSOReg"); 9338f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan operandTypes.addEntry("kOperandTypeARMAddrMode2"); 9348f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan operandTypes.addEntry("kOperandTypeARMAddrMode2Offset"); 9358f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan operandTypes.addEntry("kOperandTypeARMAddrMode3"); 9368f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan operandTypes.addEntry("kOperandTypeARMAddrMode3Offset"); 937e6913600c723a10ab1f06a43c93d82ee8e26c71cJim Grosbach operandTypes.addEntry("kOperandTypeARMLdStmMode"); 9388f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan operandTypes.addEntry("kOperandTypeARMAddrMode5"); 9398f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan operandTypes.addEntry("kOperandTypeARMAddrMode6"); 9408f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan operandTypes.addEntry("kOperandTypeARMAddrMode6Offset"); 941505f3cd2965e65b6b7ad023eaba0e3dc89b67409Bruno Cardoso Lopes operandTypes.addEntry("kOperandTypeARMAddrMode7"); 9428f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan operandTypes.addEntry("kOperandTypeARMAddrModePC"); 9438f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan operandTypes.addEntry("kOperandTypeARMRegisterList"); 9440f6307561359fac4425a0b9e512931cf96c1ec5bBill Wendling operandTypes.addEntry("kOperandTypeARMDPRRegisterList"); 9450f6307561359fac4425a0b9e512931cf96c1ec5bBill Wendling operandTypes.addEntry("kOperandTypeARMSPRRegisterList"); 9468f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan operandTypes.addEntry("kOperandTypeARMTBAddrMode"); 9478f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan operandTypes.addEntry("kOperandTypeThumbITMask"); 9487ae0df41422193e65231a0f9526bfe66067c6532Shantonu Sen operandTypes.addEntry("kOperandTypeThumbAddrModeImmS1"); 9497ae0df41422193e65231a0f9526bfe66067c6532Shantonu Sen operandTypes.addEntry("kOperandTypeThumbAddrModeImmS2"); 9507ae0df41422193e65231a0f9526bfe66067c6532Shantonu Sen operandTypes.addEntry("kOperandTypeThumbAddrModeImmS4"); 9517ae0df41422193e65231a0f9526bfe66067c6532Shantonu Sen operandTypes.addEntry("kOperandTypeThumbAddrModeRegS1"); 9527ae0df41422193e65231a0f9526bfe66067c6532Shantonu Sen operandTypes.addEntry("kOperandTypeThumbAddrModeRegS2"); 9537ae0df41422193e65231a0f9526bfe66067c6532Shantonu Sen operandTypes.addEntry("kOperandTypeThumbAddrModeRegS4"); 9548f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan operandTypes.addEntry("kOperandTypeThumbAddrModeRR"); 9558f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan operandTypes.addEntry("kOperandTypeThumbAddrModeSP"); 956b8958b031ec5163261f490f131780c5dc3d823d6Bill Wendling operandTypes.addEntry("kOperandTypeThumbAddrModePC"); 957505f3cd2965e65b6b7ad023eaba0e3dc89b67409Bruno Cardoso Lopes operandTypes.addEntry("kOperandTypeThumb2AddrModeReg"); 9588f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan operandTypes.addEntry("kOperandTypeThumb2SoReg"); 9598f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan operandTypes.addEntry("kOperandTypeThumb2SoImm"); 9608f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan operandTypes.addEntry("kOperandTypeThumb2AddrModeImm8"); 9618f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan operandTypes.addEntry("kOperandTypeThumb2AddrModeImm8Offset"); 9628f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan operandTypes.addEntry("kOperandTypeThumb2AddrModeImm12"); 9638f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan operandTypes.addEntry("kOperandTypeThumb2AddrModeSoReg"); 9648f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan operandTypes.addEntry("kOperandTypeThumb2AddrModeImm8s4"); 9658f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan operandTypes.addEntry("kOperandTypeThumb2AddrModeImm8s4Offset"); 9668f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan operandTypes.emit(o, i); 9679c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach 9688f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan o << "\n"; 9699c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach 97095fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan EnumEmitter operandFlags("OperandFlags"); 97195fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan operandFlags.addEntry("kOperandFlagSource"); 97295fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan operandFlags.addEntry("kOperandFlagTarget"); 97395fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan operandFlags.emitAsFlags(o, i); 9749c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach 97595fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan o << "\n"; 9769c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach 9778f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan EnumEmitter instructionTypes("InstructionTypes"); 9788f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan instructionTypes.addEntry("kInstructionTypeNone"); 9798f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan instructionTypes.addEntry("kInstructionTypeMove"); 9808f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan instructionTypes.addEntry("kInstructionTypeBranch"); 9818f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan instructionTypes.addEntry("kInstructionTypePush"); 9828f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan instructionTypes.addEntry("kInstructionTypePop"); 9838f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan instructionTypes.addEntry("kInstructionTypeCall"); 9848f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan instructionTypes.addEntry("kInstructionTypeReturn"); 9858f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan instructionTypes.emit(o, i); 9869c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach 98795fcebd5c490c725ee5d88be963d39ddaf0971bdSean Callanan o << "\n"; 9889899f70a7406d632c82849978bf6981f1ee4ccb5Sean Callanan} 9899899f70a7406d632c82849978bf6981f1ee4ccb5Sean Callanan 9906f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesennamespace llvm { 9916f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen 9926f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesenvoid EmitEnhancedDisassemblerInfo(RecordKeeper &RK, raw_ostream &OS) { 9936f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen emitSourceFileHeader("Enhanced Disassembler Info", OS); 9949899f70a7406d632c82849978bf6981f1ee4ccb5Sean Callanan unsigned int i = 0; 9959c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach 9969899f70a7406d632c82849978bf6981f1ee4ccb5Sean Callanan CompoundConstantEmitter infoArray; 9976f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen CodeGenTarget target(RK); 9989c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach 9999899f70a7406d632c82849978bf6981f1ee4ccb5Sean Callanan populateInstInfo(infoArray, target); 10009c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach 10016f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen emitCommonEnums(OS, i); 10029c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99Jim Grosbach 10036f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen OS << "static const llvm::EDInstInfo instInfo" 10046f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen << target.getName() << "[] = "; 10056f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen infoArray.emit(OS, i); 10066f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen OS << ";" << "\n"; 10079899f70a7406d632c82849978bf6981f1ee4ccb5Sean Callanan} 10086f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen 10096f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen} // End llvm namespace 1010