18ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan//===- X86RecognizableInstr.cpp - Disassembler instruction spec --*- C++ -*-===//
28ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan//
38ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan//                     The LLVM Compiler Infrastructure
48ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan//
58ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan// This file is distributed under the University of Illinois Open Source
68ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan// License. See LICENSE.TXT for details.
78ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan//
88ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan//===----------------------------------------------------------------------===//
98ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan//
108ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan// This file is part of the X86 Disassembler Emitter.
118ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan// It contains the implementation of a single recognizable instruction.
128ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan// Documentation for the disassembler emitter in general can be found in
138ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan//  X86DisasemblerEmitter.h.
148ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan//
158ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan//===----------------------------------------------------------------------===//
168ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
178ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#include "X86DisassemblerShared.h"
188ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#include "X86RecognizableInstr.h"
198ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#include "X86ModRMFilters.h"
208ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
218ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#include "llvm/Support/ErrorHandling.h"
228ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
238ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#include <string>
248ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
258ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callananusing namespace llvm;
268ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
279492be8d10d7df8efaf33bcf2eb3ad13d49ddd60Sean Callanan#define MRM_MAPPING     \
289492be8d10d7df8efaf33bcf2eb3ad13d49ddd60Sean Callanan  MAP(C1, 33)           \
29a599de241041eebc84867ac8e4cb76668cabd236Chris Lattner  MAP(C2, 34)           \
30a599de241041eebc84867ac8e4cb76668cabd236Chris Lattner  MAP(C3, 35)           \
31a599de241041eebc84867ac8e4cb76668cabd236Chris Lattner  MAP(C4, 36)           \
32a599de241041eebc84867ac8e4cb76668cabd236Chris Lattner  MAP(C8, 37)           \
33a599de241041eebc84867ac8e4cb76668cabd236Chris Lattner  MAP(C9, 38)           \
34a599de241041eebc84867ac8e4cb76668cabd236Chris Lattner  MAP(E8, 39)           \
35a599de241041eebc84867ac8e4cb76668cabd236Chris Lattner  MAP(F0, 40)           \
363472766f9eb7d66f234c390ce1b3a8b76f0ee9ceDuncan Sands  MAP(F8, 41)           \
3787ca0e077d91b96a765b3b24cadfa8891026a33aRafael Espindola  MAP(F9, 42)           \
3887ca0e077d91b96a765b3b24cadfa8891026a33aRafael Espindola  MAP(D0, 45)           \
399e3d0b335111b2df73984a6cfd9ef1cd5d323872Craig Topper  MAP(D1, 46)           \
4028a713b20ad17f9a02d4677d8a2fea0edb208418Craig Topper  MAP(D4, 47)           \
4128a713b20ad17f9a02d4677d8a2fea0edb208418Craig Topper  MAP(D8, 48)           \
4228a713b20ad17f9a02d4677d8a2fea0edb208418Craig Topper  MAP(D9, 49)           \
4328a713b20ad17f9a02d4677d8a2fea0edb208418Craig Topper  MAP(DA, 50)           \
4428a713b20ad17f9a02d4677d8a2fea0edb208418Craig Topper  MAP(DB, 51)           \
4528a713b20ad17f9a02d4677d8a2fea0edb208418Craig Topper  MAP(DC, 52)           \
4628a713b20ad17f9a02d4677d8a2fea0edb208418Craig Topper  MAP(DD, 53)           \
4728a713b20ad17f9a02d4677d8a2fea0edb208418Craig Topper  MAP(DE, 54)           \
4828a713b20ad17f9a02d4677d8a2fea0edb208418Craig Topper  MAP(DF, 55)
499492be8d10d7df8efaf33bcf2eb3ad13d49ddd60Sean Callanan
508ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan// A clone of X86 since we can't depend on something that is generated.
518ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanannamespace X86Local {
528ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  enum {
538ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    Pseudo      = 0,
548ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    RawFrm      = 1,
558ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    AddRegFrm   = 2,
568ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    MRMDestReg  = 3,
578ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    MRMDestMem  = 4,
588ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    MRMSrcReg   = 5,
598ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    MRMSrcMem   = 6,
60e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper    MRM0r = 16, MRM1r = 17, MRM2r = 18, MRM3r = 19,
618ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    MRM4r = 20, MRM5r = 21, MRM6r = 22, MRM7r = 23,
628ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    MRM0m = 24, MRM1m = 25, MRM2m = 26, MRM3m = 27,
638ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    MRM4m = 28, MRM5m = 29, MRM6m = 30, MRM7m = 31,
649492be8d10d7df8efaf33bcf2eb3ad13d49ddd60Sean Callanan    MRMInitReg  = 32,
6576f63aef5645885a4cf3eb3a7274850ed2ff9a62Richard Trieu    RawFrmImm8  = 43,
6676f63aef5645885a4cf3eb3a7274850ed2ff9a62Richard Trieu    RawFrmImm16 = 44,
679492be8d10d7df8efaf33bcf2eb3ad13d49ddd60Sean Callanan#define MAP(from, to) MRM_##from = to,
689492be8d10d7df8efaf33bcf2eb3ad13d49ddd60Sean Callanan    MRM_MAPPING
699492be8d10d7df8efaf33bcf2eb3ad13d49ddd60Sean Callanan#undef MAP
709492be8d10d7df8efaf33bcf2eb3ad13d49ddd60Sean Callanan    lastMRM
718ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  };
72e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper
738ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  enum {
748ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    TB  = 1,
758ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    REP = 2,
768ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    D8 = 3, D9 = 4, DA = 5, DB = 6,
778ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    DC = 7, DD = 8, DE = 9, DF = 10,
788ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    XD = 11,  XS = 12,
790d8db8e0a8492ab2d4bef725ec61b519471b97ecChris Lattner    T8 = 13,  P_TA = 14,
8075485d6746f8b5b23c17cf6d2364e7e1e0705992Craig Topper    A6 = 15,  A7 = 16, T8XD = 17, T8XS = 18, TAXD = 19
818ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  };
828ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan}
839492be8d10d7df8efaf33bcf2eb3ad13d49ddd60Sean Callanan
849492be8d10d7df8efaf33bcf2eb3ad13d49ddd60Sean Callanan// If rows are added to the opcode extension tables, then corresponding entries
85e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper// must be added here.
869492be8d10d7df8efaf33bcf2eb3ad13d49ddd60Sean Callanan//
879492be8d10d7df8efaf33bcf2eb3ad13d49ddd60Sean Callanan// If the row corresponds to a single byte (i.e., 8f), then add an entry for
889492be8d10d7df8efaf33bcf2eb3ad13d49ddd60Sean Callanan// that byte to ONE_BYTE_EXTENSION_TABLES.
899492be8d10d7df8efaf33bcf2eb3ad13d49ddd60Sean Callanan//
90e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper// If the row corresponds to two bytes where the first is 0f, add an entry for
919492be8d10d7df8efaf33bcf2eb3ad13d49ddd60Sean Callanan// the second byte to TWO_BYTE_EXTENSION_TABLES.
929492be8d10d7df8efaf33bcf2eb3ad13d49ddd60Sean Callanan//
939492be8d10d7df8efaf33bcf2eb3ad13d49ddd60Sean Callanan// If the row corresponds to some other set of bytes, you will need to modify
949492be8d10d7df8efaf33bcf2eb3ad13d49ddd60Sean Callanan// the code in RecognizableInstr::emitDecodePath() as well, and add new prefixes
95e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper// to the X86 TD files, except in two cases: if the first two bytes of such a
969492be8d10d7df8efaf33bcf2eb3ad13d49ddd60Sean Callanan// new combination are 0f 38 or 0f 3a, you just have to add maps called
979492be8d10d7df8efaf33bcf2eb3ad13d49ddd60Sean Callanan// THREE_BYTE_38_EXTENSION_TABLES and THREE_BYTE_3A_EXTENSION_TABLES and add a
989492be8d10d7df8efaf33bcf2eb3ad13d49ddd60Sean Callanan// switch(Opcode) just below the case X86Local::T8: or case X86Local::TA: line
999492be8d10d7df8efaf33bcf2eb3ad13d49ddd60Sean Callanan// in RecognizableInstr::emitDecodePath().
1009492be8d10d7df8efaf33bcf2eb3ad13d49ddd60Sean Callanan
1018ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#define ONE_BYTE_EXTENSION_TABLES \
1028ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  EXTENSION_TABLE(80)             \
1038ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  EXTENSION_TABLE(81)             \
1048ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  EXTENSION_TABLE(82)             \
1058ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  EXTENSION_TABLE(83)             \
1068ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  EXTENSION_TABLE(8f)             \
1078ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  EXTENSION_TABLE(c0)             \
1088ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  EXTENSION_TABLE(c1)             \
1098ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  EXTENSION_TABLE(c6)             \
1108ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  EXTENSION_TABLE(c7)             \
1118ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  EXTENSION_TABLE(d0)             \
1128ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  EXTENSION_TABLE(d1)             \
1138ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  EXTENSION_TABLE(d2)             \
1148ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  EXTENSION_TABLE(d3)             \
1158ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  EXTENSION_TABLE(f6)             \
1168ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  EXTENSION_TABLE(f7)             \
1178ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  EXTENSION_TABLE(fe)             \
1188ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  EXTENSION_TABLE(ff)
119e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper
1208ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#define TWO_BYTE_EXTENSION_TABLES \
1218ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  EXTENSION_TABLE(00)             \
1228ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  EXTENSION_TABLE(01)             \
1238ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  EXTENSION_TABLE(18)             \
1248ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  EXTENSION_TABLE(71)             \
1258ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  EXTENSION_TABLE(72)             \
1268ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  EXTENSION_TABLE(73)             \
1278ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  EXTENSION_TABLE(ae)             \
1288ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  EXTENSION_TABLE(ba)             \
1298ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  EXTENSION_TABLE(c7)
1308ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
131566f233ba64c0bb2773b5717cb18753c7564f4b7Craig Topper#define THREE_BYTE_38_EXTENSION_TABLES \
132566f233ba64c0bb2773b5717cb18753c7564f4b7Craig Topper  EXTENSION_TABLE(F3)
133566f233ba64c0bb2773b5717cb18753c7564f4b7Craig Topper
1348ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callananusing namespace X86Disassembler;
1358ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
1368ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan/// needsModRMForDecode - Indicates whether a particular instruction requires a
137e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper///   ModR/M byte for the instruction to be properly decoded.  For example, a
1388ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan///   MRMDestReg instruction needs the Mod field in the ModR/M byte to be set to
1398ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan///   0b11.
1408ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan///
1418ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan/// @param form - The form of the instruction.
1428ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan/// @return     - true if the form implies that a ModR/M byte is required, false
1438ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan///               otherwise.
1448ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callananstatic bool needsModRMForDecode(uint8_t form) {
1458ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  if (form == X86Local::MRMDestReg    ||
1468ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan     form == X86Local::MRMDestMem    ||
1478ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan     form == X86Local::MRMSrcReg     ||
1488ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan     form == X86Local::MRMSrcMem     ||
1498ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan     (form >= X86Local::MRM0r && form <= X86Local::MRM7r) ||
1508ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan     (form >= X86Local::MRM0m && form <= X86Local::MRM7m))
1518ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    return true;
1528ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  else
1538ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    return false;
1548ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan}
1558ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
1568ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan/// isRegFormat - Indicates whether a particular form requires the Mod field of
1578ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan///   the ModR/M byte to be 0b11.
1588ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan///
1598ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan/// @param form - The form of the instruction.
1608ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan/// @return     - true if the form implies that Mod must be 0b11, false
1618ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan///               otherwise.
1628ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callananstatic bool isRegFormat(uint8_t form) {
1638ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  if (form == X86Local::MRMDestReg ||
1648ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan     form == X86Local::MRMSrcReg  ||
1658ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan     (form >= X86Local::MRM0r && form <= X86Local::MRM7r))
1668ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    return true;
1678ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  else
1688ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    return false;
1698ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan}
1708ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
1718ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan/// byteFromBitsInit - Extracts a value at most 8 bits in width from a BitsInit.
1728ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan///   Useful for switch statements and the like.
1738ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan///
1748ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan/// @param init - A reference to the BitsInit to be decoded.
1758ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan/// @return     - The field, with the first bit in the BitsInit as the lowest
1768ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan///               order bit.
17705bce0beee87512e52428d4b80f5a8e79a949576David Greenestatic uint8_t byteFromBitsInit(BitsInit &init) {
1788ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  int width = init.getNumBits();
1798ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
1808ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  assert(width <= 8 && "Field is too large for uint8_t!");
1818ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
1828ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  int     index;
1838ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  uint8_t mask = 0x01;
1848ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
1858ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  uint8_t ret = 0;
1868ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
1878ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  for (index = 0; index < width; index++) {
18805bce0beee87512e52428d4b80f5a8e79a949576David Greene    if (static_cast<BitInit*>(init.getBit(index))->getValue())
1898ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      ret |= mask;
1908ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
1918ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    mask <<= 1;
1928ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  }
1938ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
1948ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  return ret;
1958ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan}
1968ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
1978ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan/// byteFromRec - Extract a value at most 8 bits in with from a Record given the
1988ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan///   name of the field.
1998ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan///
2008ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan/// @param rec  - The record from which to extract the value.
2018ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan/// @param name - The name of the field in the record.
2028ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan/// @return     - The field, as translated by byteFromBitsInit().
2038ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callananstatic uint8_t byteFromRec(const Record* rec, const std::string &name) {
20405bce0beee87512e52428d4b80f5a8e79a949576David Greene  BitsInit* bits = rec->getValueAsBitsInit(name);
2058ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  return byteFromBitsInit(*bits);
2068ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan}
2078ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
2088ed9f51663bc5533f36ca62e5668ae08e9a1313fSean CallananRecognizableInstr::RecognizableInstr(DisassemblerTables &tables,
2098ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan                                     const CodeGenInstruction &insn,
2108ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan                                     InstrUID uid) {
2118ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  UID = uid;
2128ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
2138ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  Rec = insn.TheDef;
2148ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  Name = Rec->getName();
2158ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  Spec = &tables.specForUID(UID);
216e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper
2178ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  if (!Rec->isSubClassOf("X86Inst")) {
2188ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    ShouldBeEmitted = false;
2198ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    return;
2208ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  }
221e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper
2228ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  Prefix   = byteFromRec(Rec, "Prefix");
2238ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  Opcode   = byteFromRec(Rec, "Opcode");
2248ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  Form     = byteFromRec(Rec, "FormBits");
2258ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  SegOvr   = byteFromRec(Rec, "SegOvrBits");
226e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper
2278ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  HasOpSizePrefix  = Rec->getValueAsBit("hasOpSizePrefix");
228930a1ebd929aa0ab4c2610e7f7a721c18dcfe052Craig Topper  HasAdSizePrefix  = Rec->getValueAsBit("hasAdSizePrefix");
2298ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  HasREX_WPrefix   = Rec->getValueAsBit("hasREX_WPrefix");
230a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan  HasVEXPrefix     = Rec->getValueAsBit("hasVEXPrefix");
23199405df044f2c584242e711cc9023ec90356da82Bruno Cardoso Lopes  HasVEX_4VPrefix  = Rec->getValueAsBit("hasVEX_4VPrefix");
232b53fa8bf19a51f0c49a9f8b6ede3e2ff3bdfb961Craig Topper  HasVEX_4VOp3Prefix = Rec->getValueAsBit("hasVEX_4VOp3Prefix");
233a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan  HasVEX_WPrefix   = Rec->getValueAsBit("hasVEX_WPrefix");
234e6a3a2990e3f783c906e9db58e55439cb06f9fa5Craig Topper  HasMemOp4Prefix  = Rec->getValueAsBit("hasMemOp4Prefix");
2356744a17dcfb941d9fdd869b9f06e20660e18ff88Craig Topper  IgnoresVEX_L     = Rec->getValueAsBit("ignoresVEX_L");
2368ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  HasLockPrefix    = Rec->getValueAsBit("hasLockPrefix");
2378ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  IsCodeGenOnly    = Rec->getValueAsBit("isCodeGenOnly");
238e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper
2398ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  Name      = Rec->getName();
2408ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  AsmString = Rec->getValueAsString("AsmString");
241e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper
242c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner  Operands = &insn.Operands.OperandList;
243e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper
24498f213cd60f21437846ce4075c0fe15d7f09a3fdKevin Enderby  IsSSE            = (HasOpSizePrefix && (Name.find("16") == Name.npos)) ||
24598f213cd60f21437846ce4075c0fe15d7f09a3fdKevin Enderby                     (Name.find("CRC32") != Name.npos);
246a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan  HasFROperands    = hasFROperands();
247a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan  HasVEX_LPrefix   = has256BitOperands() || Rec->getValueAsBit("hasVEX_L");
24817730847d59c919d97f097d46a3fcba1888e5300Craig Topper
2497105259ce8e9fd78ce9fc1b7a9aaab123fb5db64Eli Friedman  // Check for 64-bit inst which does not require REX
2504da632e6e09b96db4b3f9202cde4e6ca732001c1Craig Topper  Is32Bit = false;
2517105259ce8e9fd78ce9fc1b7a9aaab123fb5db64Eli Friedman  Is64Bit = false;
2527105259ce8e9fd78ce9fc1b7a9aaab123fb5db64Eli Friedman  // FIXME: Is there some better way to check for In64BitMode?
2537105259ce8e9fd78ce9fc1b7a9aaab123fb5db64Eli Friedman  std::vector<Record*> Predicates = Rec->getValueAsListOfDefs("Predicates");
2547105259ce8e9fd78ce9fc1b7a9aaab123fb5db64Eli Friedman  for (unsigned i = 0, e = Predicates.size(); i != e; ++i) {
2554da632e6e09b96db4b3f9202cde4e6ca732001c1Craig Topper    if (Predicates[i]->getName().find("32Bit") != Name.npos) {
2564da632e6e09b96db4b3f9202cde4e6ca732001c1Craig Topper      Is32Bit = true;
2574da632e6e09b96db4b3f9202cde4e6ca732001c1Craig Topper      break;
2584da632e6e09b96db4b3f9202cde4e6ca732001c1Craig Topper    }
2597105259ce8e9fd78ce9fc1b7a9aaab123fb5db64Eli Friedman    if (Predicates[i]->getName().find("64Bit") != Name.npos) {
2607105259ce8e9fd78ce9fc1b7a9aaab123fb5db64Eli Friedman      Is64Bit = true;
2617105259ce8e9fd78ce9fc1b7a9aaab123fb5db64Eli Friedman      break;
2627105259ce8e9fd78ce9fc1b7a9aaab123fb5db64Eli Friedman    }
2637105259ce8e9fd78ce9fc1b7a9aaab123fb5db64Eli Friedman  }
2647105259ce8e9fd78ce9fc1b7a9aaab123fb5db64Eli Friedman  // FIXME: These instructions aren't marked as 64-bit in any way
265e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper  Is64Bit |= Rec->getName() == "JMP64pcrel32" ||
266e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper             Rec->getName() == "MASKMOVDQU64" ||
267e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper             Rec->getName() == "POPFS64" ||
268e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper             Rec->getName() == "POPGS64" ||
269e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper             Rec->getName() == "PUSHFS64" ||
2707105259ce8e9fd78ce9fc1b7a9aaab123fb5db64Eli Friedman             Rec->getName() == "PUSHGS64" ||
2717105259ce8e9fd78ce9fc1b7a9aaab123fb5db64Eli Friedman             Rec->getName() == "REX64_PREFIX" ||
272e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper             Rec->getName().find("MOV64") != Name.npos ||
2737105259ce8e9fd78ce9fc1b7a9aaab123fb5db64Eli Friedman             Rec->getName().find("PUSH64") != Name.npos ||
2747105259ce8e9fd78ce9fc1b7a9aaab123fb5db64Eli Friedman             Rec->getName().find("POP64") != Name.npos;
2757105259ce8e9fd78ce9fc1b7a9aaab123fb5db64Eli Friedman
2768ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ShouldBeEmitted  = true;
2778ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan}
278e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper
2798ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callananvoid RecognizableInstr::processInstr(DisassemblerTables &tables,
2805aba78bd8056dc407bcbce4080ffcd12b13c7342Craig Topper                                     const CodeGenInstruction &insn,
2815aba78bd8056dc407bcbce4080ffcd12b13c7342Craig Topper                                     InstrUID uid)
2828ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan{
2834072886a690a853c57c79a87a6423a7bfe0ce61fDaniel Dunbar  // Ignore "asm parser only" instructions.
2844072886a690a853c57c79a87a6423a7bfe0ce61fDaniel Dunbar  if (insn.TheDef->getValueAsBit("isAsmParserOnly"))
2854072886a690a853c57c79a87a6423a7bfe0ce61fDaniel Dunbar    return;
286e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper
2878ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  RecognizableInstr recogInstr(tables, insn, uid);
288e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper
2898ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  recogInstr.emitInstructionSpecifier(tables);
290e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper
2918ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  if (recogInstr.shouldBeEmitted())
2928ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    recogInstr.emitDecodePath(tables);
2938ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan}
2948ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
2958ed9f51663bc5533f36ca62e5668ae08e9a1313fSean CallananInstructionContext RecognizableInstr::insnContext() const {
2968ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  InstructionContext insnContext;
2978ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
298b53fa8bf19a51f0c49a9f8b6ede3e2ff3bdfb961Craig Topper  if (HasVEX_4VPrefix || HasVEX_4VOp3Prefix|| HasVEXPrefix) {
299c8eb880a7fb0958a3a048a82c8558beec11f1209Craig Topper    if (HasVEX_LPrefix && HasVEX_WPrefix) {
300c8eb880a7fb0958a3a048a82c8558beec11f1209Craig Topper      if (HasOpSizePrefix)
301c8eb880a7fb0958a3a048a82c8558beec11f1209Craig Topper        insnContext = IC_VEX_L_W_OPSIZE;
302c8eb880a7fb0958a3a048a82c8558beec11f1209Craig Topper      else
303c8eb880a7fb0958a3a048a82c8558beec11f1209Craig Topper        llvm_unreachable("Don't support VEX.L and VEX.W together");
304c8eb880a7fb0958a3a048a82c8558beec11f1209Craig Topper    } else if (HasOpSizePrefix && HasVEX_LPrefix)
305a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan      insnContext = IC_VEX_L_OPSIZE;
306a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan    else if (HasOpSizePrefix && HasVEX_WPrefix)
307a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan      insnContext = IC_VEX_W_OPSIZE;
308a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan    else if (HasOpSizePrefix)
309a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan      insnContext = IC_VEX_OPSIZE;
310ee62e4f6d192ee31d1ad9dd0ba0c41db6663d3c7Craig Topper    else if (HasVEX_LPrefix &&
311ee62e4f6d192ee31d1ad9dd0ba0c41db6663d3c7Craig Topper             (Prefix == X86Local::XS || Prefix == X86Local::T8XS))
312a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan      insnContext = IC_VEX_L_XS;
31375485d6746f8b5b23c17cf6d2364e7e1e0705992Craig Topper    else if (HasVEX_LPrefix && (Prefix == X86Local::XD ||
31475485d6746f8b5b23c17cf6d2364e7e1e0705992Craig Topper                                Prefix == X86Local::T8XD ||
31575485d6746f8b5b23c17cf6d2364e7e1e0705992Craig Topper                                Prefix == X86Local::TAXD))
316a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan      insnContext = IC_VEX_L_XD;
317ee62e4f6d192ee31d1ad9dd0ba0c41db6663d3c7Craig Topper    else if (HasVEX_WPrefix &&
318ee62e4f6d192ee31d1ad9dd0ba0c41db6663d3c7Craig Topper             (Prefix == X86Local::XS || Prefix == X86Local::T8XS))
319a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan      insnContext = IC_VEX_W_XS;
32075485d6746f8b5b23c17cf6d2364e7e1e0705992Craig Topper    else if (HasVEX_WPrefix && (Prefix == X86Local::XD ||
32175485d6746f8b5b23c17cf6d2364e7e1e0705992Craig Topper                                Prefix == X86Local::T8XD ||
32275485d6746f8b5b23c17cf6d2364e7e1e0705992Craig Topper                                Prefix == X86Local::TAXD))
323a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan      insnContext = IC_VEX_W_XD;
324a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan    else if (HasVEX_WPrefix)
325a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan      insnContext = IC_VEX_W;
326a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan    else if (HasVEX_LPrefix)
327a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan      insnContext = IC_VEX_L;
32875485d6746f8b5b23c17cf6d2364e7e1e0705992Craig Topper    else if (Prefix == X86Local::XD || Prefix == X86Local::T8XD ||
32975485d6746f8b5b23c17cf6d2364e7e1e0705992Craig Topper             Prefix == X86Local::TAXD)
330a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan      insnContext = IC_VEX_XD;
331ee62e4f6d192ee31d1ad9dd0ba0c41db6663d3c7Craig Topper    else if (Prefix == X86Local::XS || Prefix == X86Local::T8XS)
332a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan      insnContext = IC_VEX_XS;
333a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan    else
334a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan      insnContext = IC_VEX;
3357105259ce8e9fd78ce9fc1b7a9aaab123fb5db64Eli Friedman  } else if (Is64Bit || HasREX_WPrefix) {
3368ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    if (HasREX_WPrefix && HasOpSizePrefix)
3378ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      insnContext = IC_64BIT_REXW_OPSIZE;
33875485d6746f8b5b23c17cf6d2364e7e1e0705992Craig Topper    else if (HasOpSizePrefix && (Prefix == X86Local::XD ||
33975485d6746f8b5b23c17cf6d2364e7e1e0705992Craig Topper                                 Prefix == X86Local::T8XD ||
34075485d6746f8b5b23c17cf6d2364e7e1e0705992Craig Topper                                 Prefix == X86Local::TAXD))
341e1b4a1a07ec79440536e4535721f15de3893cd13Craig Topper      insnContext = IC_64BIT_XD_OPSIZE;
342ee62e4f6d192ee31d1ad9dd0ba0c41db6663d3c7Craig Topper    else if (HasOpSizePrefix &&
343ee62e4f6d192ee31d1ad9dd0ba0c41db6663d3c7Craig Topper             (Prefix == X86Local::XS || Prefix == X86Local::T8XS))
34429480fd798dc6452948f63825ff41c66f09c2493Craig Topper      insnContext = IC_64BIT_XS_OPSIZE;
3458ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    else if (HasOpSizePrefix)
3468ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      insnContext = IC_64BIT_OPSIZE;
347930a1ebd929aa0ab4c2610e7f7a721c18dcfe052Craig Topper    else if (HasAdSizePrefix)
348930a1ebd929aa0ab4c2610e7f7a721c18dcfe052Craig Topper      insnContext = IC_64BIT_ADSIZE;
349ee62e4f6d192ee31d1ad9dd0ba0c41db6663d3c7Craig Topper    else if (HasREX_WPrefix &&
350ee62e4f6d192ee31d1ad9dd0ba0c41db6663d3c7Craig Topper             (Prefix == X86Local::XS || Prefix == X86Local::T8XS))
3518ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      insnContext = IC_64BIT_REXW_XS;
35275485d6746f8b5b23c17cf6d2364e7e1e0705992Craig Topper    else if (HasREX_WPrefix && (Prefix == X86Local::XD ||
35375485d6746f8b5b23c17cf6d2364e7e1e0705992Craig Topper                                Prefix == X86Local::T8XD ||
35475485d6746f8b5b23c17cf6d2364e7e1e0705992Craig Topper                                Prefix == X86Local::TAXD))
3558ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      insnContext = IC_64BIT_REXW_XD;
35675485d6746f8b5b23c17cf6d2364e7e1e0705992Craig Topper    else if (Prefix == X86Local::XD || Prefix == X86Local::T8XD ||
35775485d6746f8b5b23c17cf6d2364e7e1e0705992Craig Topper             Prefix == X86Local::TAXD)
3588ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      insnContext = IC_64BIT_XD;
359ee62e4f6d192ee31d1ad9dd0ba0c41db6663d3c7Craig Topper    else if (Prefix == X86Local::XS || Prefix == X86Local::T8XS)
3608ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      insnContext = IC_64BIT_XS;
3618ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    else if (HasREX_WPrefix)
3628ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      insnContext = IC_64BIT_REXW;
3638ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    else
3648ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      insnContext = IC_64BIT;
3658ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  } else {
36675485d6746f8b5b23c17cf6d2364e7e1e0705992Craig Topper    if (HasOpSizePrefix && (Prefix == X86Local::XD ||
36775485d6746f8b5b23c17cf6d2364e7e1e0705992Craig Topper                            Prefix == X86Local::T8XD ||
36875485d6746f8b5b23c17cf6d2364e7e1e0705992Craig Topper                            Prefix == X86Local::TAXD))
369e1b4a1a07ec79440536e4535721f15de3893cd13Craig Topper      insnContext = IC_XD_OPSIZE;
370ee62e4f6d192ee31d1ad9dd0ba0c41db6663d3c7Craig Topper    else if (HasOpSizePrefix &&
371ee62e4f6d192ee31d1ad9dd0ba0c41db6663d3c7Craig Topper             (Prefix == X86Local::XS || Prefix == X86Local::T8XS))
37229480fd798dc6452948f63825ff41c66f09c2493Craig Topper      insnContext = IC_XS_OPSIZE;
37398f213cd60f21437846ce4075c0fe15d7f09a3fdKevin Enderby    else if (HasOpSizePrefix)
3748ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      insnContext = IC_OPSIZE;
375930a1ebd929aa0ab4c2610e7f7a721c18dcfe052Craig Topper    else if (HasAdSizePrefix)
376930a1ebd929aa0ab4c2610e7f7a721c18dcfe052Craig Topper      insnContext = IC_ADSIZE;
37775485d6746f8b5b23c17cf6d2364e7e1e0705992Craig Topper    else if (Prefix == X86Local::XD || Prefix == X86Local::T8XD ||
37875485d6746f8b5b23c17cf6d2364e7e1e0705992Craig Topper             Prefix == X86Local::TAXD)
3798ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      insnContext = IC_XD;
380ee62e4f6d192ee31d1ad9dd0ba0c41db6663d3c7Craig Topper    else if (Prefix == X86Local::XS || Prefix == X86Local::T8XS ||
381ee62e4f6d192ee31d1ad9dd0ba0c41db6663d3c7Craig Topper             Prefix == X86Local::REP)
3828ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      insnContext = IC_XS;
3838ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    else
3848ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      insnContext = IC;
3858ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  }
3868ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
3878ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  return insnContext;
3888ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan}
389e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper
3908ed9f51663bc5533f36ca62e5668ae08e9a1313fSean CallananRecognizableInstr::filter_ret RecognizableInstr::filter() const {
391a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan  ///////////////////
392a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan  // FILTER_STRONG
393a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan  //
394e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper
3958ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  // Filter out intrinsics
396e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper
39724fd0ddf3136ad7dec6c554f3a97f2d24fe2027fCraig Topper  assert(Rec->isSubClassOf("X86Inst") && "Can only filter X86 instructions");
398e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper
3998ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  if (Form == X86Local::Pseudo ||
400038197988bcd7619657633da7116c7292187d4aeCraig Topper      (IsCodeGenOnly && Name.find("_REV") == Name.npos))
4018ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    return FILTER_STRONG;
402e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper
403e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper
404faf72ffda3bf83b08769428129ee4755787ee6cfKevin Enderby  // Filter out artificial instructions but leave in the LOCK_PREFIX so it is
405faf72ffda3bf83b08769428129ee4755787ee6cfKevin Enderby  // printed as a separate "instruction".
406e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper
407787a88ff18b3fe9e8f66eda63544eb10a0c806efCraig Topper  if (Name.find("_Int") != Name.npos       ||
40849d86c9eb95bf0233cf749c79f0e10d03f33c58eCraig Topper      Name.find("Int_") != Name.npos)
409a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan    return FILTER_STRONG;
410a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan
411a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan  // Filter out instructions with segment override prefixes.
412a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan  // They're too messy to handle now and we'll special case them if needed.
413e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper
414a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan  if (SegOvr)
415a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan    return FILTER_STRONG;
416e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper
417a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan
418a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan  /////////////////
419a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan  // FILTER_WEAK
420a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan  //
421a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan
422e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper
4238ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  // Filter out instructions with a LOCK prefix;
4248ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  //   prefer forms that do not have the prefix
4258ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  if (HasLockPrefix)
4268ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    return FILTER_WEAK;
4278ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
428a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan  // Filter out alternate forms of AVX instructions
429a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan  if (Name.find("_alt") != Name.npos ||
430a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan      Name.find("XrYr") != Name.npos ||
431e1b4a1a07ec79440536e4535721f15de3893cd13Craig Topper      (Name.find("r64r") != Name.npos && Name.find("r64r64") == Name.npos) ||
432a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan      Name.find("_64mr") != Name.npos ||
433a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan      Name.find("Xrr") != Name.npos ||
434a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan      Name.find("rr64") != Name.npos)
435a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan    return FILTER_WEAK;
4368ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
4378ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  // Special cases.
43886097c384f84981494ed9c200ff5763afcd960deDale Johannesen
4398ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  if (Name.find("PCMPISTRI") != Name.npos && Name != "PCMPISTRI")
4408ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    return FILTER_WEAK;
4418ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  if (Name.find("PCMPESTRI") != Name.npos && Name != "PCMPESTRI")
4428ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    return FILTER_WEAK;
4438ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
4448ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  if (Name.find("MOV") != Name.npos && Name.find("r0") != Name.npos)
4458ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    return FILTER_WEAK;
4468ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  if (Name.find("MOVZ") != Name.npos && Name.find("MOVZX") == Name.npos)
4478ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    return FILTER_WEAK;
4488ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  if (Name.find("Fs") != Name.npos)
4498ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    return FILTER_WEAK;
450787a88ff18b3fe9e8f66eda63544eb10a0c806efCraig Topper  if (Name == "PUSH64i16"         ||
4518ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      Name == "MOVPQI2QImr"       ||
452a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan      Name == "VMOVPQI2QImr"      ||
4538ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      Name == "MMX_MOVD64rrv164"  ||
4548ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      Name == "MOV64ri64i32"      ||
455787a88ff18b3fe9e8f66eda63544eb10a0c806efCraig Topper      Name == "VMASKMOVDQU64"     ||
456787a88ff18b3fe9e8f66eda63544eb10a0c806efCraig Topper      Name == "VEXTRACTPSrr64"    ||
457787a88ff18b3fe9e8f66eda63544eb10a0c806efCraig Topper      Name == "VMOVQd64rr"        ||
458787a88ff18b3fe9e8f66eda63544eb10a0c806efCraig Topper      Name == "VMOVQs64rr")
4598ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    return FILTER_WEAK;
4608ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
4618ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  if (HasFROperands && Name.find("MOV") != Name.npos &&
462e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper     ((Name.find("2") != Name.npos && Name.find("32") == Name.npos) ||
4638ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      (Name.find("to") != Name.npos)))
46450c5c8275e576c2129a4ab6146ca4226dcdfe6feCraig Topper    return FILTER_STRONG;
4658ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
4668ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  return FILTER_NORMAL;
4678ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan}
468a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan
469a21e2eae3def2fe39caed861dcb73c76c715569bSean Callananbool RecognizableInstr::hasFROperands() const {
470a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan  const std::vector<CGIOperandList::OperandInfo> &OperandList = *Operands;
471a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan  unsigned numOperands = OperandList.size();
472a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan
473a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan  for (unsigned operandIndex = 0; operandIndex < numOperands; ++operandIndex) {
474a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan    const std::string &recName = OperandList[operandIndex].Rec->getName();
475e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper
476a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan    if (recName.find("FR") != recName.npos)
477a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan      return true;
478a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan  }
479a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan  return false;
480a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan}
481a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan
482a21e2eae3def2fe39caed861dcb73c76c715569bSean Callananbool RecognizableInstr::has256BitOperands() const {
483a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan  const std::vector<CGIOperandList::OperandInfo> &OperandList = *Operands;
484a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan  unsigned numOperands = OperandList.size();
485e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper
486a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan  for (unsigned operandIndex = 0; operandIndex < numOperands; ++operandIndex) {
487a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan    const std::string &recName = OperandList[operandIndex].Rec->getName();
488e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper
48987a9ece154acdf2164094e6b5a47bac48a53aa4dCraig Topper    if (!recName.compare("VR256")) {
490a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan      return true;
491a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan    }
492a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan  }
493a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan  return false;
494a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan}
495e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper
4965aba78bd8056dc407bcbce4080ffcd12b13c7342Craig Toppervoid RecognizableInstr::handleOperand(bool optional, unsigned &operandIndex,
4975aba78bd8056dc407bcbce4080ffcd12b13c7342Craig Topper                                      unsigned &physicalOperandIndex,
4985aba78bd8056dc407bcbce4080ffcd12b13c7342Craig Topper                                      unsigned &numPhysicalOperands,
4995aba78bd8056dc407bcbce4080ffcd12b13c7342Craig Topper                                      const unsigned *operandMapping,
5005aba78bd8056dc407bcbce4080ffcd12b13c7342Craig Topper                                      OperandEncoding (*encodingFromString)
5015aba78bd8056dc407bcbce4080ffcd12b13c7342Craig Topper                                        (const std::string&,
5025aba78bd8056dc407bcbce4080ffcd12b13c7342Craig Topper                                         bool hasOpSizePrefix)) {
5038ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  if (optional) {
5048ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    if (physicalOperandIndex >= numPhysicalOperands)
5058ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      return;
5068ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  } else {
5078ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    assert(physicalOperandIndex < numPhysicalOperands);
5088ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  }
509e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper
5108ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  while (operandMapping[operandIndex] != operandIndex) {
5118ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    Spec->operands[operandIndex].encoding = ENCODING_DUP;
5128ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    Spec->operands[operandIndex].type =
5138ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      (OperandType)(TYPE_DUP0 + operandMapping[operandIndex]);
5148ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    ++operandIndex;
5158ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  }
516e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper
5178ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  const std::string &typeName = (*Operands)[operandIndex].Rec->getName();
518a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan
5198ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  Spec->operands[operandIndex].encoding = encodingFromString(typeName,
5208ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan                                                              HasOpSizePrefix);
521e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper  Spec->operands[operandIndex].type = typeFromString(typeName,
522a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan                                                     IsSSE,
523a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan                                                     HasREX_WPrefix,
524a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan                                                     HasOpSizePrefix);
525e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper
5268ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ++operandIndex;
5278ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ++physicalOperandIndex;
5288ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan}
5298ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
5308ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callananvoid RecognizableInstr::emitInstructionSpecifier(DisassemblerTables &tables) {
5318ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  Spec->name       = Name;
532e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper
53324fd0ddf3136ad7dec6c554f3a97f2d24fe2027fCraig Topper  if (!ShouldBeEmitted)
5348ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    return;
535e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper
5368ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  switch (filter()) {
5378ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  case FILTER_WEAK:
5388ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    Spec->filtered = true;
5398ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    break;
5408ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  case FILTER_STRONG:
5418ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    ShouldBeEmitted = false;
5428ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    return;
5438ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  case FILTER_NORMAL:
5448ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    break;
5458ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  }
546e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper
5478ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  Spec->insnContext = insnContext();
548e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper
549c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner  const std::vector<CGIOperandList::OperandInfo> &OperandList = *Operands;
550e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper
5518ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  unsigned numOperands = OperandList.size();
5528ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  unsigned numPhysicalOperands = 0;
553e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper
5548ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  // operandMapping maps from operands in OperandList to their originals.
5558ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  // If operandMapping[i] != i, then the entry is a duplicate.
5568ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  unsigned operandMapping[X86_MAX_OPERANDS];
55706f554d06ab0f9390d04bcbaabb76f572d940249Craig Topper  assert(numOperands <= X86_MAX_OPERANDS && "X86_MAX_OPERANDS is not large enough");
558e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper
5595aba78bd8056dc407bcbce4080ffcd12b13c7342Craig Topper  for (unsigned operandIndex = 0; operandIndex < numOperands; ++operandIndex) {
5608ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    if (OperandList[operandIndex].Constraints.size()) {
561c240bb0ede0541426254d0e0dc81d891beda4b22Chris Lattner      const CGIOperandList::ConstraintInfo &Constraint =
562a7d479c7bd9723cabdd7c9e1e9a1e6e482f78e7eChris Lattner        OperandList[operandIndex].Constraints[0];
563a7d479c7bd9723cabdd7c9e1e9a1e6e482f78e7eChris Lattner      if (Constraint.isTied()) {
5645aba78bd8056dc407bcbce4080ffcd12b13c7342Craig Topper        operandMapping[operandIndex] = operandIndex;
5655aba78bd8056dc407bcbce4080ffcd12b13c7342Craig Topper        operandMapping[Constraint.getTiedOperand()] = operandIndex;
5668ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      } else {
5678ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan        ++numPhysicalOperands;
5688ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan        operandMapping[operandIndex] = operandIndex;
5698ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      }
5708ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    } else {
5718ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      ++numPhysicalOperands;
5728ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      operandMapping[operandIndex] = operandIndex;
5738ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    }
5748ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  }
575e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper
5768ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#define HANDLE_OPERAND(class)               \
5778ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  handleOperand(false,                      \
5788ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan                operandIndex,               \
5798ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan                physicalOperandIndex,       \
5808ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan                numPhysicalOperands,        \
5818ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan                operandMapping,             \
5828ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan                class##EncodingFromString);
583e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper
5848ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#define HANDLE_OPTIONAL(class)              \
5858ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  handleOperand(true,                       \
5868ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan                operandIndex,               \
5878ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan                physicalOperandIndex,       \
5888ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan                numPhysicalOperands,        \
5898ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan                operandMapping,             \
5908ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan                class##EncodingFromString);
591e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper
5928ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  // operandIndex should always be < numOperands
5935aba78bd8056dc407bcbce4080ffcd12b13c7342Craig Topper  unsigned operandIndex = 0;
5948ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  // physicalOperandIndex should always be < numPhysicalOperands
5958ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  unsigned physicalOperandIndex = 0;
596e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper
5978ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  switch (Form) {
5988ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  case X86Local::RawFrm:
5998ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    // Operand 1 (optional) is an address or immediate.
6008ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    // Operand 2 (optional) is an immediate.
601e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper    assert(numPhysicalOperands <= 2 &&
6028ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan           "Unexpected number of operands for RawFrm");
6038ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    HANDLE_OPTIONAL(relocation)
6048ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    HANDLE_OPTIONAL(immediate)
6058ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    break;
6068ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  case X86Local::AddRegFrm:
6078ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    // Operand 1 is added to the opcode.
6088ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    // Operand 2 (optional) is an address.
6098ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    assert(numPhysicalOperands >= 1 && numPhysicalOperands <= 2 &&
6108ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan           "Unexpected number of operands for AddRegFrm");
6118ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    HANDLE_OPERAND(opcodeModifier)
6128ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    HANDLE_OPTIONAL(relocation)
6138ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    break;
6148ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  case X86Local::MRMDestReg:
6158ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    // Operand 1 is a register operand in the R/M field.
6168ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    // Operand 2 is a register operand in the Reg/Opcode field.
6173daa5c29d444a759a0c60656d1aaf2579e5e447cCraig Topper    // - In AVX, there is a register operand in the VEX.vvvv field here -
6188ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    // Operand 3 (optional) is an immediate.
6193daa5c29d444a759a0c60656d1aaf2579e5e447cCraig Topper    if (HasVEX_4VPrefix)
6203daa5c29d444a759a0c60656d1aaf2579e5e447cCraig Topper      assert(numPhysicalOperands >= 3 && numPhysicalOperands <= 4 &&
6213daa5c29d444a759a0c60656d1aaf2579e5e447cCraig Topper             "Unexpected number of operands for MRMDestRegFrm with VEX_4V");
6223daa5c29d444a759a0c60656d1aaf2579e5e447cCraig Topper    else
6233daa5c29d444a759a0c60656d1aaf2579e5e447cCraig Topper      assert(numPhysicalOperands >= 2 && numPhysicalOperands <= 3 &&
6243daa5c29d444a759a0c60656d1aaf2579e5e447cCraig Topper             "Unexpected number of operands for MRMDestRegFrm");
625e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper
6268ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    HANDLE_OPERAND(rmRegister)
6273daa5c29d444a759a0c60656d1aaf2579e5e447cCraig Topper
6283daa5c29d444a759a0c60656d1aaf2579e5e447cCraig Topper    if (HasVEX_4VPrefix)
6293daa5c29d444a759a0c60656d1aaf2579e5e447cCraig Topper      // FIXME: In AVX, the register below becomes the one encoded
6303daa5c29d444a759a0c60656d1aaf2579e5e447cCraig Topper      // in ModRMVEX and the one above the one in the VEX.VVVV field
6313daa5c29d444a759a0c60656d1aaf2579e5e447cCraig Topper      HANDLE_OPERAND(vvvvRegister)
632e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper
6338ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    HANDLE_OPERAND(roRegister)
6348ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    HANDLE_OPTIONAL(immediate)
6358ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    break;
6368ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  case X86Local::MRMDestMem:
6378ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    // Operand 1 is a memory operand (possibly SIB-extended)
6388ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    // Operand 2 is a register operand in the Reg/Opcode field.
6393daa5c29d444a759a0c60656d1aaf2579e5e447cCraig Topper    // - In AVX, there is a register operand in the VEX.vvvv field here -
6408ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    // Operand 3 (optional) is an immediate.
6413daa5c29d444a759a0c60656d1aaf2579e5e447cCraig Topper    if (HasVEX_4VPrefix)
6423daa5c29d444a759a0c60656d1aaf2579e5e447cCraig Topper      assert(numPhysicalOperands >= 3 && numPhysicalOperands <= 4 &&
6433daa5c29d444a759a0c60656d1aaf2579e5e447cCraig Topper             "Unexpected number of operands for MRMDestMemFrm with VEX_4V");
6443daa5c29d444a759a0c60656d1aaf2579e5e447cCraig Topper    else
6453daa5c29d444a759a0c60656d1aaf2579e5e447cCraig Topper      assert(numPhysicalOperands >= 2 && numPhysicalOperands <= 3 &&
6463daa5c29d444a759a0c60656d1aaf2579e5e447cCraig Topper             "Unexpected number of operands for MRMDestMemFrm");
6478ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    HANDLE_OPERAND(memory)
6483daa5c29d444a759a0c60656d1aaf2579e5e447cCraig Topper
6493daa5c29d444a759a0c60656d1aaf2579e5e447cCraig Topper    if (HasVEX_4VPrefix)
6503daa5c29d444a759a0c60656d1aaf2579e5e447cCraig Topper      // FIXME: In AVX, the register below becomes the one encoded
6513daa5c29d444a759a0c60656d1aaf2579e5e447cCraig Topper      // in ModRMVEX and the one above the one in the VEX.VVVV field
6523daa5c29d444a759a0c60656d1aaf2579e5e447cCraig Topper      HANDLE_OPERAND(vvvvRegister)
653e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper
6548ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    HANDLE_OPERAND(roRegister)
6558ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    HANDLE_OPTIONAL(immediate)
6568ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    break;
6578ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  case X86Local::MRMSrcReg:
6588ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    // Operand 1 is a register operand in the Reg/Opcode field.
6598ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    // Operand 2 is a register operand in the R/M field.
660a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan    // - In AVX, there is a register operand in the VEX.vvvv field here -
6618ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    // Operand 3 (optional) is an immediate.
6621386e9b7b16a8138ae7060c2dbb8b029f7c4fce2Benjamin Kramer    // Operand 4 (optional) is an immediate.
66399405df044f2c584242e711cc9023ec90356da82Bruno Cardoso Lopes
664b53fa8bf19a51f0c49a9f8b6ede3e2ff3bdfb961Craig Topper    if (HasVEX_4VPrefix || HasVEX_4VOp3Prefix)
66506f554d06ab0f9390d04bcbaabb76f572d940249Craig Topper      assert(numPhysicalOperands >= 3 && numPhysicalOperands <= 5 &&
666e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper             "Unexpected number of operands for MRMSrcRegFrm with VEX_4V");
667a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan    else
6681386e9b7b16a8138ae7060c2dbb8b029f7c4fce2Benjamin Kramer      assert(numPhysicalOperands >= 2 && numPhysicalOperands <= 4 &&
669a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan             "Unexpected number of operands for MRMSrcRegFrm");
670e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper
671a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan    HANDLE_OPERAND(roRegister)
67217730847d59c919d97f097d46a3fcba1888e5300Craig Topper
673b53fa8bf19a51f0c49a9f8b6ede3e2ff3bdfb961Craig Topper    if (HasVEX_4VPrefix)
674c902a59f4c786a2a047f0b4c964a93108f248915Bruno Cardoso Lopes      // FIXME: In AVX, the register below becomes the one encoded
675c902a59f4c786a2a047f0b4c964a93108f248915Bruno Cardoso Lopes      // in ModRMVEX and the one above the one in the VEX.VVVV field
676a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan      HANDLE_OPERAND(vvvvRegister)
67717730847d59c919d97f097d46a3fcba1888e5300Craig Topper
678e6a3a2990e3f783c906e9db58e55439cb06f9fa5Craig Topper    if (HasMemOp4Prefix)
679e6a3a2990e3f783c906e9db58e55439cb06f9fa5Craig Topper      HANDLE_OPERAND(immediate)
680e6a3a2990e3f783c906e9db58e55439cb06f9fa5Craig Topper
681a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan    HANDLE_OPERAND(rmRegister)
68217730847d59c919d97f097d46a3fcba1888e5300Craig Topper
683b53fa8bf19a51f0c49a9f8b6ede3e2ff3bdfb961Craig Topper    if (HasVEX_4VOp3Prefix)
68417730847d59c919d97f097d46a3fcba1888e5300Craig Topper      HANDLE_OPERAND(vvvvRegister)
68517730847d59c919d97f097d46a3fcba1888e5300Craig Topper
68606f554d06ab0f9390d04bcbaabb76f572d940249Craig Topper    if (!HasMemOp4Prefix)
68706f554d06ab0f9390d04bcbaabb76f572d940249Craig Topper      HANDLE_OPTIONAL(immediate)
68806f554d06ab0f9390d04bcbaabb76f572d940249Craig Topper    HANDLE_OPTIONAL(immediate) // above might be a register in 7:4
6891386e9b7b16a8138ae7060c2dbb8b029f7c4fce2Benjamin Kramer    HANDLE_OPTIONAL(immediate)
6908ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    break;
6918ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  case X86Local::MRMSrcMem:
6928ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    // Operand 1 is a register operand in the Reg/Opcode field.
6938ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    // Operand 2 is a memory operand (possibly SIB-extended)
694a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan    // - In AVX, there is a register operand in the VEX.vvvv field here -
6958ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    // Operand 3 (optional) is an immediate.
696b53fa8bf19a51f0c49a9f8b6ede3e2ff3bdfb961Craig Topper
697b53fa8bf19a51f0c49a9f8b6ede3e2ff3bdfb961Craig Topper    if (HasVEX_4VPrefix || HasVEX_4VOp3Prefix)
69806f554d06ab0f9390d04bcbaabb76f572d940249Craig Topper      assert(numPhysicalOperands >= 3 && numPhysicalOperands <= 5 &&
699e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper             "Unexpected number of operands for MRMSrcMemFrm with VEX_4V");
700a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan    else
701a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan      assert(numPhysicalOperands >= 2 && numPhysicalOperands <= 3 &&
702a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan             "Unexpected number of operands for MRMSrcMemFrm");
703e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper
7048ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    HANDLE_OPERAND(roRegister)
705c902a59f4c786a2a047f0b4c964a93108f248915Bruno Cardoso Lopes
706b53fa8bf19a51f0c49a9f8b6ede3e2ff3bdfb961Craig Topper    if (HasVEX_4VPrefix)
707c902a59f4c786a2a047f0b4c964a93108f248915Bruno Cardoso Lopes      // FIXME: In AVX, the register below becomes the one encoded
708c902a59f4c786a2a047f0b4c964a93108f248915Bruno Cardoso Lopes      // in ModRMVEX and the one above the one in the VEX.VVVV field
709a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan      HANDLE_OPERAND(vvvvRegister)
710c902a59f4c786a2a047f0b4c964a93108f248915Bruno Cardoso Lopes
711e6a3a2990e3f783c906e9db58e55439cb06f9fa5Craig Topper    if (HasMemOp4Prefix)
712e6a3a2990e3f783c906e9db58e55439cb06f9fa5Craig Topper      HANDLE_OPERAND(immediate)
713e6a3a2990e3f783c906e9db58e55439cb06f9fa5Craig Topper
7148ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    HANDLE_OPERAND(memory)
71517730847d59c919d97f097d46a3fcba1888e5300Craig Topper
716b53fa8bf19a51f0c49a9f8b6ede3e2ff3bdfb961Craig Topper    if (HasVEX_4VOp3Prefix)
71717730847d59c919d97f097d46a3fcba1888e5300Craig Topper      HANDLE_OPERAND(vvvvRegister)
71817730847d59c919d97f097d46a3fcba1888e5300Craig Topper
71906f554d06ab0f9390d04bcbaabb76f572d940249Craig Topper    if (!HasMemOp4Prefix)
72006f554d06ab0f9390d04bcbaabb76f572d940249Craig Topper      HANDLE_OPTIONAL(immediate)
72106f554d06ab0f9390d04bcbaabb76f572d940249Craig Topper    HANDLE_OPTIONAL(immediate) // above might be a register in 7:4
7228ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    break;
7238ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  case X86Local::MRM0r:
7248ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  case X86Local::MRM1r:
7258ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  case X86Local::MRM2r:
7268ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  case X86Local::MRM3r:
7278ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  case X86Local::MRM4r:
7288ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  case X86Local::MRM5r:
7298ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  case X86Local::MRM6r:
7308ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  case X86Local::MRM7r:
7318ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    // Operand 1 is a register operand in the R/M field.
7328ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    // Operand 2 (optional) is an immediate or relocation.
7331386e9b7b16a8138ae7060c2dbb8b029f7c4fce2Benjamin Kramer    // Operand 3 (optional) is an immediate.
734a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan    if (HasVEX_4VPrefix)
735a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan      assert(numPhysicalOperands <= 3 &&
736566f233ba64c0bb2773b5717cb18753c7564f4b7Craig Topper             "Unexpected number of operands for MRMnRFrm with VEX_4V");
737a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan    else
7381386e9b7b16a8138ae7060c2dbb8b029f7c4fce2Benjamin Kramer      assert(numPhysicalOperands <= 3 &&
739a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan             "Unexpected number of operands for MRMnRFrm");
740a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan    if (HasVEX_4VPrefix)
741566f233ba64c0bb2773b5717cb18753c7564f4b7Craig Topper      HANDLE_OPERAND(vvvvRegister)
7428ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    HANDLE_OPTIONAL(rmRegister)
7438ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    HANDLE_OPTIONAL(relocation)
7441386e9b7b16a8138ae7060c2dbb8b029f7c4fce2Benjamin Kramer    HANDLE_OPTIONAL(immediate)
7458ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    break;
7468ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  case X86Local::MRM0m:
7478ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  case X86Local::MRM1m:
7488ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  case X86Local::MRM2m:
7498ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  case X86Local::MRM3m:
7508ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  case X86Local::MRM4m:
7518ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  case X86Local::MRM5m:
7528ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  case X86Local::MRM6m:
7538ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  case X86Local::MRM7m:
7548ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    // Operand 1 is a memory operand (possibly SIB-extended)
7558ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    // Operand 2 (optional) is an immediate or relocation.
756566f233ba64c0bb2773b5717cb18753c7564f4b7Craig Topper    if (HasVEX_4VPrefix)
757566f233ba64c0bb2773b5717cb18753c7564f4b7Craig Topper      assert(numPhysicalOperands >= 2 && numPhysicalOperands <= 3 &&
758566f233ba64c0bb2773b5717cb18753c7564f4b7Craig Topper             "Unexpected number of operands for MRMnMFrm");
759566f233ba64c0bb2773b5717cb18753c7564f4b7Craig Topper    else
760566f233ba64c0bb2773b5717cb18753c7564f4b7Craig Topper      assert(numPhysicalOperands >= 1 && numPhysicalOperands <= 2 &&
761566f233ba64c0bb2773b5717cb18753c7564f4b7Craig Topper             "Unexpected number of operands for MRMnMFrm");
762566f233ba64c0bb2773b5717cb18753c7564f4b7Craig Topper    if (HasVEX_4VPrefix)
763566f233ba64c0bb2773b5717cb18753c7564f4b7Craig Topper      HANDLE_OPERAND(vvvvRegister)
7648ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    HANDLE_OPERAND(memory)
7658ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    HANDLE_OPTIONAL(relocation)
7668ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    break;
7676aeb2e32b7724e7c4bd878d4c899be917492cb32Sean Callanan  case X86Local::RawFrmImm8:
7686aeb2e32b7724e7c4bd878d4c899be917492cb32Sean Callanan    // operand 1 is a 16-bit immediate
7696aeb2e32b7724e7c4bd878d4c899be917492cb32Sean Callanan    // operand 2 is an 8-bit immediate
7706aeb2e32b7724e7c4bd878d4c899be917492cb32Sean Callanan    assert(numPhysicalOperands == 2 &&
7716aeb2e32b7724e7c4bd878d4c899be917492cb32Sean Callanan           "Unexpected number of operands for X86Local::RawFrmImm8");
7726aeb2e32b7724e7c4bd878d4c899be917492cb32Sean Callanan    HANDLE_OPERAND(immediate)
7736aeb2e32b7724e7c4bd878d4c899be917492cb32Sean Callanan    HANDLE_OPERAND(immediate)
7746aeb2e32b7724e7c4bd878d4c899be917492cb32Sean Callanan    break;
7756aeb2e32b7724e7c4bd878d4c899be917492cb32Sean Callanan  case X86Local::RawFrmImm16:
7766aeb2e32b7724e7c4bd878d4c899be917492cb32Sean Callanan    // operand 1 is a 16-bit immediate
7776aeb2e32b7724e7c4bd878d4c899be917492cb32Sean Callanan    // operand 2 is a 16-bit immediate
7786aeb2e32b7724e7c4bd878d4c899be917492cb32Sean Callanan    HANDLE_OPERAND(immediate)
7796aeb2e32b7724e7c4bd878d4c899be917492cb32Sean Callanan    HANDLE_OPERAND(immediate)
7806aeb2e32b7724e7c4bd878d4c899be917492cb32Sean Callanan    break;
7818ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  case X86Local::MRMInitReg:
7828ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    // Ignored.
7838ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    break;
7848ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  }
785e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper
7868ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  #undef HANDLE_OPERAND
7878ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  #undef HANDLE_OPTIONAL
7888ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan}
7898ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
7908ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callananvoid RecognizableInstr::emitDecodePath(DisassemblerTables &tables) const {
7918ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  // Special cases where the LLVM tables are not complete
7928ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
7939492be8d10d7df8efaf33bcf2eb3ad13d49ddd60Sean Callanan#define MAP(from, to)                     \
7949492be8d10d7df8efaf33bcf2eb3ad13d49ddd60Sean Callanan  case X86Local::MRM_##from:              \
7959492be8d10d7df8efaf33bcf2eb3ad13d49ddd60Sean Callanan    filter = new ExactFilter(0x##from);   \
7969492be8d10d7df8efaf33bcf2eb3ad13d49ddd60Sean Callanan    break;
7978ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
7988ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  OpcodeType    opcodeType  = (OpcodeType)-1;
799e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper
800e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper  ModRMFilter*  filter      = NULL;
8018ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  uint8_t       opcodeToSet = 0;
8028ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
8038ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  switch (Prefix) {
8048ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  // Extended two-byte opcodes can start with f2 0f, f3 0f, or 0f
8058ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  case X86Local::XD:
8068ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  case X86Local::XS:
8078ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  case X86Local::TB:
8088ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    opcodeType = TWOBYTE;
8098ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
8108ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    switch (Opcode) {
81195a5a7d57015c21b355a351c2efc6866f89b2f61Sean Callanan    default:
81295a5a7d57015c21b355a351c2efc6866f89b2f61Sean Callanan      if (needsModRMForDecode(Form))
81395a5a7d57015c21b355a351c2efc6866f89b2f61Sean Callanan        filter = new ModFilter(isRegFormat(Form));
81495a5a7d57015c21b355a351c2efc6866f89b2f61Sean Callanan      else
81595a5a7d57015c21b355a351c2efc6866f89b2f61Sean Callanan        filter = new DumbFilter();
81695a5a7d57015c21b355a351c2efc6866f89b2f61Sean Callanan      break;
8178ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#define EXTENSION_TABLE(n) case 0x##n:
8188ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    TWO_BYTE_EXTENSION_TABLES
8198ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#undef EXTENSION_TABLE
8208ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      switch (Form) {
8218ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      default:
8228ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan        llvm_unreachable("Unhandled two-byte extended opcode");
8238ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      case X86Local::MRM0r:
8248ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      case X86Local::MRM1r:
8258ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      case X86Local::MRM2r:
8268ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      case X86Local::MRM3r:
8278ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      case X86Local::MRM4r:
8288ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      case X86Local::MRM5r:
8298ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      case X86Local::MRM6r:
8308ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      case X86Local::MRM7r:
8318ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan        filter = new ExtendedFilter(true, Form - X86Local::MRM0r);
8328ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan        break;
8338ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      case X86Local::MRM0m:
8348ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      case X86Local::MRM1m:
8358ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      case X86Local::MRM2m:
8368ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      case X86Local::MRM3m:
8378ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      case X86Local::MRM4m:
8388ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      case X86Local::MRM5m:
8398ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      case X86Local::MRM6m:
8408ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      case X86Local::MRM7m:
8418ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan        filter = new ExtendedFilter(false, Form - X86Local::MRM0m);
8428ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan        break;
8439492be8d10d7df8efaf33bcf2eb3ad13d49ddd60Sean Callanan      MRM_MAPPING
8448ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      } // switch (Form)
8458ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      break;
84695a5a7d57015c21b355a351c2efc6866f89b2f61Sean Callanan    } // switch (Opcode)
8478ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    opcodeToSet = Opcode;
8488ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    break;
8498ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  case X86Local::T8:
850ee62e4f6d192ee31d1ad9dd0ba0c41db6663d3c7Craig Topper  case X86Local::T8XD:
851ee62e4f6d192ee31d1ad9dd0ba0c41db6663d3c7Craig Topper  case X86Local::T8XS:
8528ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    opcodeType = THREEBYTE_38;
853566f233ba64c0bb2773b5717cb18753c7564f4b7Craig Topper    switch (Opcode) {
854566f233ba64c0bb2773b5717cb18753c7564f4b7Craig Topper    default:
855566f233ba64c0bb2773b5717cb18753c7564f4b7Craig Topper      if (needsModRMForDecode(Form))
856566f233ba64c0bb2773b5717cb18753c7564f4b7Craig Topper        filter = new ModFilter(isRegFormat(Form));
857566f233ba64c0bb2773b5717cb18753c7564f4b7Craig Topper      else
858566f233ba64c0bb2773b5717cb18753c7564f4b7Craig Topper        filter = new DumbFilter();
859566f233ba64c0bb2773b5717cb18753c7564f4b7Craig Topper      break;
860566f233ba64c0bb2773b5717cb18753c7564f4b7Craig Topper#define EXTENSION_TABLE(n) case 0x##n:
861566f233ba64c0bb2773b5717cb18753c7564f4b7Craig Topper    THREE_BYTE_38_EXTENSION_TABLES
862566f233ba64c0bb2773b5717cb18753c7564f4b7Craig Topper#undef EXTENSION_TABLE
863566f233ba64c0bb2773b5717cb18753c7564f4b7Craig Topper      switch (Form) {
864566f233ba64c0bb2773b5717cb18753c7564f4b7Craig Topper      default:
865566f233ba64c0bb2773b5717cb18753c7564f4b7Craig Topper        llvm_unreachable("Unhandled two-byte extended opcode");
866566f233ba64c0bb2773b5717cb18753c7564f4b7Craig Topper      case X86Local::MRM0r:
867566f233ba64c0bb2773b5717cb18753c7564f4b7Craig Topper      case X86Local::MRM1r:
868566f233ba64c0bb2773b5717cb18753c7564f4b7Craig Topper      case X86Local::MRM2r:
869566f233ba64c0bb2773b5717cb18753c7564f4b7Craig Topper      case X86Local::MRM3r:
870566f233ba64c0bb2773b5717cb18753c7564f4b7Craig Topper      case X86Local::MRM4r:
871566f233ba64c0bb2773b5717cb18753c7564f4b7Craig Topper      case X86Local::MRM5r:
872566f233ba64c0bb2773b5717cb18753c7564f4b7Craig Topper      case X86Local::MRM6r:
873566f233ba64c0bb2773b5717cb18753c7564f4b7Craig Topper      case X86Local::MRM7r:
874566f233ba64c0bb2773b5717cb18753c7564f4b7Craig Topper        filter = new ExtendedFilter(true, Form - X86Local::MRM0r);
875566f233ba64c0bb2773b5717cb18753c7564f4b7Craig Topper        break;
876566f233ba64c0bb2773b5717cb18753c7564f4b7Craig Topper      case X86Local::MRM0m:
877566f233ba64c0bb2773b5717cb18753c7564f4b7Craig Topper      case X86Local::MRM1m:
878566f233ba64c0bb2773b5717cb18753c7564f4b7Craig Topper      case X86Local::MRM2m:
879566f233ba64c0bb2773b5717cb18753c7564f4b7Craig Topper      case X86Local::MRM3m:
880566f233ba64c0bb2773b5717cb18753c7564f4b7Craig Topper      case X86Local::MRM4m:
881566f233ba64c0bb2773b5717cb18753c7564f4b7Craig Topper      case X86Local::MRM5m:
882566f233ba64c0bb2773b5717cb18753c7564f4b7Craig Topper      case X86Local::MRM6m:
883566f233ba64c0bb2773b5717cb18753c7564f4b7Craig Topper      case X86Local::MRM7m:
884566f233ba64c0bb2773b5717cb18753c7564f4b7Craig Topper        filter = new ExtendedFilter(false, Form - X86Local::MRM0m);
885566f233ba64c0bb2773b5717cb18753c7564f4b7Craig Topper        break;
886566f233ba64c0bb2773b5717cb18753c7564f4b7Craig Topper      MRM_MAPPING
887566f233ba64c0bb2773b5717cb18753c7564f4b7Craig Topper      } // switch (Form)
888566f233ba64c0bb2773b5717cb18753c7564f4b7Craig Topper      break;
889566f233ba64c0bb2773b5717cb18753c7564f4b7Craig Topper    } // switch (Opcode)
8908ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    opcodeToSet = Opcode;
8918ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    break;
8920d8db8e0a8492ab2d4bef725ec61b519471b97ecChris Lattner  case X86Local::P_TA:
89375485d6746f8b5b23c17cf6d2364e7e1e0705992Craig Topper  case X86Local::TAXD:
8948ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    opcodeType = THREEBYTE_3A;
8958ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    if (needsModRMForDecode(Form))
8968ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      filter = new ModFilter(isRegFormat(Form));
8978ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    else
8988ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      filter = new DumbFilter();
8998ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    opcodeToSet = Opcode;
9008ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    break;
9014a8ac8de1ddfeaadb9ff13ce361bfc6435f18028Joerg Sonnenberger  case X86Local::A6:
9024a8ac8de1ddfeaadb9ff13ce361bfc6435f18028Joerg Sonnenberger    opcodeType = THREEBYTE_A6;
9034a8ac8de1ddfeaadb9ff13ce361bfc6435f18028Joerg Sonnenberger    if (needsModRMForDecode(Form))
9044a8ac8de1ddfeaadb9ff13ce361bfc6435f18028Joerg Sonnenberger      filter = new ModFilter(isRegFormat(Form));
9054a8ac8de1ddfeaadb9ff13ce361bfc6435f18028Joerg Sonnenberger    else
9064a8ac8de1ddfeaadb9ff13ce361bfc6435f18028Joerg Sonnenberger      filter = new DumbFilter();
9074a8ac8de1ddfeaadb9ff13ce361bfc6435f18028Joerg Sonnenberger    opcodeToSet = Opcode;
9084a8ac8de1ddfeaadb9ff13ce361bfc6435f18028Joerg Sonnenberger    break;
9094a8ac8de1ddfeaadb9ff13ce361bfc6435f18028Joerg Sonnenberger  case X86Local::A7:
9104a8ac8de1ddfeaadb9ff13ce361bfc6435f18028Joerg Sonnenberger    opcodeType = THREEBYTE_A7;
9114a8ac8de1ddfeaadb9ff13ce361bfc6435f18028Joerg Sonnenberger    if (needsModRMForDecode(Form))
9124a8ac8de1ddfeaadb9ff13ce361bfc6435f18028Joerg Sonnenberger      filter = new ModFilter(isRegFormat(Form));
9134a8ac8de1ddfeaadb9ff13ce361bfc6435f18028Joerg Sonnenberger    else
9144a8ac8de1ddfeaadb9ff13ce361bfc6435f18028Joerg Sonnenberger      filter = new DumbFilter();
9154a8ac8de1ddfeaadb9ff13ce361bfc6435f18028Joerg Sonnenberger    opcodeToSet = Opcode;
9164a8ac8de1ddfeaadb9ff13ce361bfc6435f18028Joerg Sonnenberger    break;
9178ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  case X86Local::D8:
9188ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  case X86Local::D9:
9198ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  case X86Local::DA:
9208ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  case X86Local::DB:
9218ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  case X86Local::DC:
9228ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  case X86Local::DD:
9238ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  case X86Local::DE:
9248ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  case X86Local::DF:
9258ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    assert(Opcode >= 0xc0 && "Unexpected opcode for an escape opcode");
9268ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    opcodeType = ONEBYTE;
9278ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    if (Form == X86Local::AddRegFrm) {
9288ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      Spec->modifierType = MODIFIER_MODRM;
9298ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      Spec->modifierBase = Opcode;
9308ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      filter = new AddRegEscapeFilter(Opcode);
9318ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    } else {
9328ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      filter = new EscapeFilter(true, Opcode);
9338ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    }
9348ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    opcodeToSet = 0xd8 + (Prefix - X86Local::D8);
9358ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    break;
936842f58f9be82e1a0d2751e7982ef3641829acf87Craig Topper  case X86Local::REP:
9378ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  default:
9388ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    opcodeType = ONEBYTE;
9398ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    switch (Opcode) {
9408ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#define EXTENSION_TABLE(n) case 0x##n:
9418ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    ONE_BYTE_EXTENSION_TABLES
9428ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#undef EXTENSION_TABLE
9438ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      switch (Form) {
9448ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      default:
9458ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan        llvm_unreachable("Fell through the cracks of a single-byte "
9468ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan                         "extended opcode");
9478ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      case X86Local::MRM0r:
9488ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      case X86Local::MRM1r:
9498ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      case X86Local::MRM2r:
9508ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      case X86Local::MRM3r:
9518ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      case X86Local::MRM4r:
9528ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      case X86Local::MRM5r:
9538ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      case X86Local::MRM6r:
9548ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      case X86Local::MRM7r:
9558ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan        filter = new ExtendedFilter(true, Form - X86Local::MRM0r);
9568ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan        break;
9578ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      case X86Local::MRM0m:
9588ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      case X86Local::MRM1m:
9598ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      case X86Local::MRM2m:
9608ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      case X86Local::MRM3m:
9618ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      case X86Local::MRM4m:
9628ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      case X86Local::MRM5m:
9638ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      case X86Local::MRM6m:
9648ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      case X86Local::MRM7m:
9658ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan        filter = new ExtendedFilter(false, Form - X86Local::MRM0m);
9668ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan        break;
9679492be8d10d7df8efaf33bcf2eb3ad13d49ddd60Sean Callanan      MRM_MAPPING
9688ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      } // switch (Form)
9698ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      break;
9708ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    case 0xd8:
9718ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    case 0xd9:
9728ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    case 0xda:
9738ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    case 0xdb:
9748ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    case 0xdc:
9758ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    case 0xdd:
9768ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    case 0xde:
9778ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    case 0xdf:
9788ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      filter = new EscapeFilter(false, Form - X86Local::MRM0m);
9798ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      break;
9808ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    default:
9818ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      if (needsModRMForDecode(Form))
9828ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan        filter = new ModFilter(isRegFormat(Form));
9838ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      else
9848ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan        filter = new DumbFilter();
9858ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      break;
9868ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    } // switch (Opcode)
9878ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    opcodeToSet = Opcode;
9888ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  } // switch (Prefix)
9898ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
9908ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  assert(opcodeType != (OpcodeType)-1 &&
9918ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan         "Opcode type not set");
9928ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  assert(filter && "Filter not set");
9938ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
9948ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  if (Form == X86Local::AddRegFrm) {
9958ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    if(Spec->modifierType != MODIFIER_MODRM) {
9968ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      assert(opcodeToSet < 0xf9 &&
9978ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan             "Not enough room for all ADDREG_FRM operands");
998e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper
9998ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      uint8_t currentOpcode;
10008ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
10018ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      for (currentOpcode = opcodeToSet;
10028ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan           currentOpcode < opcodeToSet + 8;
10038ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan           ++currentOpcode)
1004e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper        tables.setTableFields(opcodeType,
1005e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper                              insnContext(),
1006e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper                              currentOpcode,
1007e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper                              *filter,
10086744a17dcfb941d9fdd869b9f06e20660e18ff88Craig Topper                              UID, Is32Bit, IgnoresVEX_L);
1009e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper
10108ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      Spec->modifierType = MODIFIER_OPCODE;
10118ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      Spec->modifierBase = opcodeToSet;
10128ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    } else {
10138ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan      // modifierBase was set where MODIFIER_MODRM was set
1014e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper      tables.setTableFields(opcodeType,
1015e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper                            insnContext(),
1016e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper                            opcodeToSet,
1017e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper                            *filter,
10186744a17dcfb941d9fdd869b9f06e20660e18ff88Craig Topper                            UID, Is32Bit, IgnoresVEX_L);
10198ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    }
10208ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  } else {
10218ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    tables.setTableFields(opcodeType,
10228ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan                          insnContext(),
10238ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan                          opcodeToSet,
10248ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan                          *filter,
10256744a17dcfb941d9fdd869b9f06e20660e18ff88Craig Topper                          UID, Is32Bit, IgnoresVEX_L);
1026e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper
10278ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    Spec->modifierType = MODIFIER_NONE;
10288ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    Spec->modifierBase = opcodeToSet;
10298ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  }
1030e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper
10318ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  delete filter;
1032e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper
10339492be8d10d7df8efaf33bcf2eb3ad13d49ddd60Sean Callanan#undef MAP
10348ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan}
10358ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
10368ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#define TYPE(str, type) if (s == str) return type;
10378ed9f51663bc5533f36ca62e5668ae08e9a1313fSean CallananOperandType RecognizableInstr::typeFromString(const std::string &s,
10388ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan                                              bool isSSE,
10398ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan                                              bool hasREX_WPrefix,
10408ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan                                              bool hasOpSizePrefix) {
10418ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  if (isSSE) {
1042e6c97ffb0d69125d989acc7e1a62c182096dd4e2Craig Topper    // For SSE instructions, we ignore the OpSize prefix and force operand
10438ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    // sizes.
10448ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    TYPE("GR16",              TYPE_R16)
10458ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    TYPE("GR32",              TYPE_R32)
10468ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    TYPE("GR64",              TYPE_R64)
10478ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  }
10488ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  if(hasREX_WPrefix) {
10498ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    // For instructions with a REX_W prefix, a declared 32-bit register encoding
10508ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    // is special.
10518ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    TYPE("GR32",              TYPE_R32)
10528ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  }
10538ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  if(!hasOpSizePrefix) {
10548ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    // For instructions without an OpSize prefix, a declared 16-bit register or
10558ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    // immediate encoding is special.
10568ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    TYPE("GR16",              TYPE_R16)
10578ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    TYPE("i16imm",            TYPE_IMM16)
10588ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  }
10598ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  TYPE("i16mem",              TYPE_Mv)
10608ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  TYPE("i16imm",              TYPE_IMMv)
10618ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  TYPE("i16i8imm",            TYPE_IMMv)
10628ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  TYPE("GR16",                TYPE_Rv)
10638ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  TYPE("i32mem",              TYPE_Mv)
10648ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  TYPE("i32imm",              TYPE_IMMv)
10658ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  TYPE("i32i8imm",            TYPE_IMM32)
1066c37d4bbf1f33c5e4b1c2f1bf1a6e2cae2ae5603aKevin Enderby  TYPE("u32u8imm",            TYPE_IMM32)
10678ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  TYPE("GR32",                TYPE_Rv)
10688ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  TYPE("i64mem",              TYPE_Mv)
10698ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  TYPE("i64i32imm",           TYPE_IMM64)
10708ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  TYPE("i64i8imm",            TYPE_IMM64)
10718ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  TYPE("GR64",                TYPE_R64)
10728ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  TYPE("i8mem",               TYPE_M8)
10738ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  TYPE("i8imm",               TYPE_IMM8)
10748ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  TYPE("GR8",                 TYPE_R8)
10758ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  TYPE("VR128",               TYPE_XMM128)
10768ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  TYPE("f128mem",             TYPE_M128)
1077b2ef4c1235c846c2503d0796541f4255ef1e13f5Chris Lattner  TYPE("f256mem",             TYPE_M256)
10788ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  TYPE("FR64",                TYPE_XMM64)
10798ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  TYPE("f64mem",              TYPE_M64FP)
1080b2ef4c1235c846c2503d0796541f4255ef1e13f5Chris Lattner  TYPE("sdmem",               TYPE_M64FP)
10818ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  TYPE("FR32",                TYPE_XMM32)
10828ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  TYPE("f32mem",              TYPE_M32FP)
1083b2ef4c1235c846c2503d0796541f4255ef1e13f5Chris Lattner  TYPE("ssmem",               TYPE_M32FP)
10848ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  TYPE("RST",                 TYPE_ST)
10858ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  TYPE("i128mem",             TYPE_M128)
1086a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan  TYPE("i256mem",             TYPE_M256)
10878ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  TYPE("i64i32imm_pcrel",     TYPE_REL64)
10889fc05227a2596c545b845ed9a72673995e49d16bChris Lattner  TYPE("i16imm_pcrel",        TYPE_REL16)
10898ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  TYPE("i32imm_pcrel",        TYPE_REL32)
10905edca8162623b742282f5f03b0872ac3469b5bedSean Callanan  TYPE("SSECC",               TYPE_IMM3)
1091769bbfd951018f9b36f3d2f0d70a23d81f2d3287Craig Topper  TYPE("AVXCC",               TYPE_IMM5)
10928ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  TYPE("brtarget",            TYPE_RELv)
1093c266600bec4b5ba0ee93ffdfeaafcab8f1295145Owen Anderson  TYPE("uncondbrtarget",      TYPE_RELv)
10948ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  TYPE("brtarget8",           TYPE_REL8)
10958ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  TYPE("f80mem",              TYPE_M80FP)
10967fb35a2fd83f5deadefcb230669b07e1d5b98137Sean Callanan  TYPE("lea32mem",            TYPE_LEA)
10977fb35a2fd83f5deadefcb230669b07e1d5b98137Sean Callanan  TYPE("lea64_32mem",         TYPE_LEA)
10987fb35a2fd83f5deadefcb230669b07e1d5b98137Sean Callanan  TYPE("lea64mem",            TYPE_LEA)
10998ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  TYPE("VR64",                TYPE_MM64)
11008ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  TYPE("i64imm",              TYPE_IMMv)
11018ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  TYPE("opaque32mem",         TYPE_M1616)
11028ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  TYPE("opaque48mem",         TYPE_M1632)
11038ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  TYPE("opaque80mem",         TYPE_M1664)
11048ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  TYPE("opaque512mem",        TYPE_M512)
11058ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  TYPE("SEGMENT_REG",         TYPE_SEGMENTREG)
11068ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  TYPE("DEBUG_REG",           TYPE_DEBUGREG)
11071a8b789a4b8290d263c1c75411788ca45bae3230Sean Callanan  TYPE("CONTROL_REG",         TYPE_CONTROLREG)
11088ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  TYPE("offset8",             TYPE_MOFFS8)
11098ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  TYPE("offset16",            TYPE_MOFFS16)
11108ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  TYPE("offset32",            TYPE_MOFFS32)
11118ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  TYPE("offset64",            TYPE_MOFFS64)
1112a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan  TYPE("VR256",               TYPE_XMM256)
11137ea16b01fad5236cc132cb5fc3e443fcbf70d3b8Craig Topper  TYPE("GR16_NOAX",           TYPE_Rv)
11147ea16b01fad5236cc132cb5fc3e443fcbf70d3b8Craig Topper  TYPE("GR32_NOAX",           TYPE_Rv)
11157ea16b01fad5236cc132cb5fc3e443fcbf70d3b8Craig Topper  TYPE("GR64_NOAX",           TYPE_R64)
111675dc33a60b65bbbf2253b0b916df1d36a4da4237Craig Topper  TYPE("vx32mem",             TYPE_M32)
111775dc33a60b65bbbf2253b0b916df1d36a4da4237Craig Topper  TYPE("vy32mem",             TYPE_M32)
111875dc33a60b65bbbf2253b0b916df1d36a4da4237Craig Topper  TYPE("vx64mem",             TYPE_M64)
111975dc33a60b65bbbf2253b0b916df1d36a4da4237Craig Topper  TYPE("vy64mem",             TYPE_M64)
11208ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  errs() << "Unhandled type string " << s << "\n";
11218ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  llvm_unreachable("Unhandled type string");
11228ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan}
11238ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#undef TYPE
11248ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
11258ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#define ENCODING(str, encoding) if (s == str) return encoding;
11268ed9f51663bc5533f36ca62e5668ae08e9a1313fSean CallananOperandEncoding RecognizableInstr::immediateEncodingFromString
11278ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  (const std::string &s,
11288ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan   bool hasOpSizePrefix) {
11298ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  if(!hasOpSizePrefix) {
11308ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    // For instructions without an OpSize prefix, a declared 16-bit register or
11318ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    // immediate encoding is special.
11328ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    ENCODING("i16imm",        ENCODING_IW)
11338ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  }
11348ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENCODING("i32i8imm",        ENCODING_IB)
1135c37d4bbf1f33c5e4b1c2f1bf1a6e2cae2ae5603aKevin Enderby  ENCODING("u32u8imm",        ENCODING_IB)
11368ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENCODING("SSECC",           ENCODING_IB)
1137769bbfd951018f9b36f3d2f0d70a23d81f2d3287Craig Topper  ENCODING("AVXCC",           ENCODING_IB)
11388ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENCODING("i16imm",          ENCODING_Iv)
11398ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENCODING("i16i8imm",        ENCODING_IB)
11408ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENCODING("i32imm",          ENCODING_Iv)
11418ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENCODING("i64i32imm",       ENCODING_ID)
11428ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENCODING("i64i8imm",        ENCODING_IB)
11438ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENCODING("i8imm",           ENCODING_IB)
1144a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan  // This is not a typo.  Instructions like BLENDVPD put
1145a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan  // register IDs in 8-bit immediates nowadays.
1146a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan  ENCODING("VR256",           ENCODING_IB)
1147a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan  ENCODING("VR128",           ENCODING_IB)
1148bf4043768c6726db523f99460645842e5024fc7fCraig Topper  ENCODING("FR32",            ENCODING_IB)
1149bf4043768c6726db523f99460645842e5024fc7fCraig Topper  ENCODING("FR64",            ENCODING_IB)
11508ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  errs() << "Unhandled immediate encoding " << s << "\n";
11518ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  llvm_unreachable("Unhandled immediate encoding");
11528ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan}
11538ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
11548ed9f51663bc5533f36ca62e5668ae08e9a1313fSean CallananOperandEncoding RecognizableInstr::rmRegisterEncodingFromString
11558ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  (const std::string &s,
11568ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan   bool hasOpSizePrefix) {
11578ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENCODING("GR16",            ENCODING_RM)
11588ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENCODING("GR32",            ENCODING_RM)
11598ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENCODING("GR64",            ENCODING_RM)
11608ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENCODING("GR8",             ENCODING_RM)
11618ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENCODING("VR128",           ENCODING_RM)
11628ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENCODING("FR64",            ENCODING_RM)
11638ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENCODING("FR32",            ENCODING_RM)
11648ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENCODING("VR64",            ENCODING_RM)
1165a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan  ENCODING("VR256",           ENCODING_RM)
11668ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  errs() << "Unhandled R/M register encoding " << s << "\n";
11678ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  llvm_unreachable("Unhandled R/M register encoding");
11688ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan}
11698ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
11708ed9f51663bc5533f36ca62e5668ae08e9a1313fSean CallananOperandEncoding RecognizableInstr::roRegisterEncodingFromString
11718ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  (const std::string &s,
11728ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan   bool hasOpSizePrefix) {
11738ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENCODING("GR16",            ENCODING_REG)
11748ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENCODING("GR32",            ENCODING_REG)
11758ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENCODING("GR64",            ENCODING_REG)
11768ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENCODING("GR8",             ENCODING_REG)
11778ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENCODING("VR128",           ENCODING_REG)
11788ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENCODING("FR64",            ENCODING_REG)
11798ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENCODING("FR32",            ENCODING_REG)
11808ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENCODING("VR64",            ENCODING_REG)
11818ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENCODING("SEGMENT_REG",     ENCODING_REG)
11828ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENCODING("DEBUG_REG",       ENCODING_REG)
11831a8b789a4b8290d263c1c75411788ca45bae3230Sean Callanan  ENCODING("CONTROL_REG",     ENCODING_REG)
1184a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan  ENCODING("VR256",           ENCODING_REG)
11858ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  errs() << "Unhandled reg/opcode register encoding " << s << "\n";
11868ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  llvm_unreachable("Unhandled reg/opcode register encoding");
11878ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan}
11888ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
1189a21e2eae3def2fe39caed861dcb73c76c715569bSean CallananOperandEncoding RecognizableInstr::vvvvRegisterEncodingFromString
1190a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan  (const std::string &s,
1191a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan   bool hasOpSizePrefix) {
119254a11176f6a5e07e243f1d87ba19ac3f4681976bCraig Topper  ENCODING("GR32",            ENCODING_VVVV)
119354a11176f6a5e07e243f1d87ba19ac3f4681976bCraig Topper  ENCODING("GR64",            ENCODING_VVVV)
1194a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan  ENCODING("FR32",            ENCODING_VVVV)
1195a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan  ENCODING("FR64",            ENCODING_VVVV)
1196a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan  ENCODING("VR128",           ENCODING_VVVV)
1197a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan  ENCODING("VR256",           ENCODING_VVVV)
1198a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan  errs() << "Unhandled VEX.vvvv register encoding " << s << "\n";
1199a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan  llvm_unreachable("Unhandled VEX.vvvv register encoding");
1200a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan}
1201a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan
12028ed9f51663bc5533f36ca62e5668ae08e9a1313fSean CallananOperandEncoding RecognizableInstr::memoryEncodingFromString
12038ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  (const std::string &s,
12048ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan   bool hasOpSizePrefix) {
12058ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENCODING("i16mem",          ENCODING_RM)
12068ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENCODING("i32mem",          ENCODING_RM)
12078ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENCODING("i64mem",          ENCODING_RM)
12088ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENCODING("i8mem",           ENCODING_RM)
1209b2ef4c1235c846c2503d0796541f4255ef1e13f5Chris Lattner  ENCODING("ssmem",           ENCODING_RM)
1210b2ef4c1235c846c2503d0796541f4255ef1e13f5Chris Lattner  ENCODING("sdmem",           ENCODING_RM)
12118ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENCODING("f128mem",         ENCODING_RM)
1212b2ef4c1235c846c2503d0796541f4255ef1e13f5Chris Lattner  ENCODING("f256mem",         ENCODING_RM)
12138ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENCODING("f64mem",          ENCODING_RM)
12148ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENCODING("f32mem",          ENCODING_RM)
12158ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENCODING("i128mem",         ENCODING_RM)
1216a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan  ENCODING("i256mem",         ENCODING_RM)
12178ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENCODING("f80mem",          ENCODING_RM)
12188ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENCODING("lea32mem",        ENCODING_RM)
12198ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENCODING("lea64_32mem",     ENCODING_RM)
12208ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENCODING("lea64mem",        ENCODING_RM)
12218ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENCODING("opaque32mem",     ENCODING_RM)
12228ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENCODING("opaque48mem",     ENCODING_RM)
12238ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENCODING("opaque80mem",     ENCODING_RM)
12248ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENCODING("opaque512mem",    ENCODING_RM)
122575dc33a60b65bbbf2253b0b916df1d36a4da4237Craig Topper  ENCODING("vx32mem",         ENCODING_RM)
122675dc33a60b65bbbf2253b0b916df1d36a4da4237Craig Topper  ENCODING("vy32mem",         ENCODING_RM)
122775dc33a60b65bbbf2253b0b916df1d36a4da4237Craig Topper  ENCODING("vx64mem",         ENCODING_RM)
122875dc33a60b65bbbf2253b0b916df1d36a4da4237Craig Topper  ENCODING("vy64mem",         ENCODING_RM)
12298ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  errs() << "Unhandled memory encoding " << s << "\n";
12308ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  llvm_unreachable("Unhandled memory encoding");
12318ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan}
12328ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
12338ed9f51663bc5533f36ca62e5668ae08e9a1313fSean CallananOperandEncoding RecognizableInstr::relocationEncodingFromString
12348ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  (const std::string &s,
12358ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan   bool hasOpSizePrefix) {
12368ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  if(!hasOpSizePrefix) {
12378ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    // For instructions without an OpSize prefix, a declared 16-bit register or
12388ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    // immediate encoding is special.
12398ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan    ENCODING("i16imm",        ENCODING_IW)
12408ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  }
12418ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENCODING("i16imm",          ENCODING_Iv)
12428ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENCODING("i16i8imm",        ENCODING_IB)
12438ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENCODING("i32imm",          ENCODING_Iv)
12448ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENCODING("i32i8imm",        ENCODING_IB)
12458ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENCODING("i64i32imm",       ENCODING_ID)
12468ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENCODING("i64i8imm",        ENCODING_IB)
12478ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENCODING("i8imm",           ENCODING_IB)
12488ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENCODING("i64i32imm_pcrel", ENCODING_ID)
12499fc05227a2596c545b845ed9a72673995e49d16bChris Lattner  ENCODING("i16imm_pcrel",    ENCODING_IW)
12508ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENCODING("i32imm_pcrel",    ENCODING_ID)
12518ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENCODING("brtarget",        ENCODING_Iv)
12528ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENCODING("brtarget8",       ENCODING_IB)
12538ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENCODING("i64imm",          ENCODING_IO)
12548ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENCODING("offset8",         ENCODING_Ia)
12558ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENCODING("offset16",        ENCODING_Ia)
12568ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENCODING("offset32",        ENCODING_Ia)
12578ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENCODING("offset64",        ENCODING_Ia)
12588ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  errs() << "Unhandled relocation encoding " << s << "\n";
12598ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  llvm_unreachable("Unhandled relocation encoding");
12608ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan}
12618ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
12628ed9f51663bc5533f36ca62e5668ae08e9a1313fSean CallananOperandEncoding RecognizableInstr::opcodeModifierEncodingFromString
12638ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  (const std::string &s,
12648ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan   bool hasOpSizePrefix) {
12658ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENCODING("RST",             ENCODING_I)
12668ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENCODING("GR32",            ENCODING_Rv)
12678ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENCODING("GR64",            ENCODING_RO)
12688ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENCODING("GR16",            ENCODING_Rv)
12698ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENCODING("GR8",             ENCODING_RB)
12707ea16b01fad5236cc132cb5fc3e443fcbf70d3b8Craig Topper  ENCODING("GR16_NOAX",       ENCODING_Rv)
12717ea16b01fad5236cc132cb5fc3e443fcbf70d3b8Craig Topper  ENCODING("GR32_NOAX",       ENCODING_Rv)
12727ea16b01fad5236cc132cb5fc3e443fcbf70d3b8Craig Topper  ENCODING("GR64_NOAX",       ENCODING_RO)
12738ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  errs() << "Unhandled opcode modifier encoding " << s << "\n";
12748ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  llvm_unreachable("Unhandled opcode modifier encoding");
12758ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan}
12769e6d1d1f5034347d237941f1bf08fba5c1583cd3Daniel Dunbar#undef ENCODING
1277