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