X86DisassemblerTables.cpp revision 360784
174462Salfred//===- X86DisassemblerTables.cpp - Disassembler tables ----------*- C++ -*-===// 274462Salfred// 374462Salfred// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 474462Salfred// See https://llvm.org/LICENSE.txt for license information. 574462Salfred// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 674462Salfred// 774462Salfred//===----------------------------------------------------------------------===// 874462Salfred// 974462Salfred// This file is part of the X86 Disassembler Emitter. 1074462Salfred// It contains the implementation of the disassembler tables. 1174462Salfred// Documentation for the disassembler emitter in general can be found in 1274462Salfred// X86DisassemblerEmitter.h. 1374462Salfred// 1474462Salfred//===----------------------------------------------------------------------===// 1574462Salfred 1674462Salfred#include "X86DisassemblerTables.h" 1774462Salfred#include "X86DisassemblerShared.h" 1874462Salfred#include "llvm/ADT/STLExtras.h" 1974462Salfred#include "llvm/Support/ErrorHandling.h" 2074462Salfred#include "llvm/Support/Format.h" 2174462Salfred#include <map> 2274462Salfred 2374462Salfredusing namespace llvm; 2474462Salfredusing namespace X86Disassembler; 2574462Salfred 2674462Salfred/// stringForContext - Returns a string containing the name of a particular 2774462Salfred/// InstructionContext, usually for diagnostic purposes. 2874462Salfred/// 2974462Salfred/// @param insnContext - The instruction class to transform to a string. 3074462Salfred/// @return - A statically-allocated string constant that contains the 3174462Salfred/// name of the instruction class. 3274462Salfredstatic inline const char* stringForContext(InstructionContext insnContext) { 3374462Salfred switch (insnContext) { 3474462Salfred default: 3574462Salfred llvm_unreachable("Unhandled instruction class"); 3674462Salfred#define ENUM_ENTRY(n, r, d) case n: return #n; break; 3774462Salfred#define ENUM_ENTRY_K_B(n, r, d) ENUM_ENTRY(n, r, d) ENUM_ENTRY(n##_K_B, r, d)\ 3874462Salfred ENUM_ENTRY(n##_KZ, r, d) ENUM_ENTRY(n##_K, r, d) ENUM_ENTRY(n##_B, r, d)\ 3974462Salfred ENUM_ENTRY(n##_KZ_B, r, d) 4092990Sobrien INSTRUCTION_CONTEXTS 4192990Sobrien#undef ENUM_ENTRY 4274462Salfred#undef ENUM_ENTRY_K_B 4374462Salfred } 4474462Salfred} 4574462Salfred 4674462Salfred/// stringForOperandType - Like stringForContext, but for OperandTypes. 4774462Salfredstatic inline const char* stringForOperandType(OperandType type) { 4874462Salfred switch (type) { 4974462Salfred default: 5074462Salfred llvm_unreachable("Unhandled type"); 5174462Salfred#define ENUM_ENTRY(i, d) case i: return #i; 5274462Salfred TYPES 5374462Salfred#undef ENUM_ENTRY 5474462Salfred } 5574462Salfred} 5674462Salfred 5774462Salfred/// stringForOperandEncoding - like stringForContext, but for 5874462Salfred/// OperandEncodings. 5974462Salfredstatic inline const char* stringForOperandEncoding(OperandEncoding encoding) { 6074462Salfred switch (encoding) { 6174462Salfred default: 6274462Salfred llvm_unreachable("Unhandled encoding"); 6374462Salfred#define ENUM_ENTRY(i, d) case i: return #i; 6474462Salfred ENCODINGS 6574462Salfred#undef ENUM_ENTRY 6674462Salfred } 6774462Salfred} 6874462Salfred 6974462Salfred/// inheritsFrom - Indicates whether all instructions in one class also belong 7074462Salfred/// to another class. 7174462Salfred/// 7274462Salfred/// @param child - The class that may be the subset 7374462Salfred/// @param parent - The class that may be the superset 7474462Salfred/// @return - True if child is a subset of parent, false otherwise. 7574462Salfredstatic inline bool inheritsFrom(InstructionContext child, 7674462Salfred InstructionContext parent, bool noPrefix = true, 7774462Salfred bool VEX_LIG = false, bool VEX_WIG = false, 7874462Salfred bool AdSize64 = false) { 7974462Salfred if (child == parent) 8074462Salfred return true; 8174462Salfred 8274462Salfred switch (parent) { 8374462Salfred case IC: 8474462Salfred return(inheritsFrom(child, IC_64BIT, AdSize64) || 8574462Salfred (noPrefix && inheritsFrom(child, IC_OPSIZE, noPrefix)) || 8674462Salfred inheritsFrom(child, IC_ADSIZE) || 8774462Salfred (noPrefix && inheritsFrom(child, IC_XD, noPrefix)) || 8874462Salfred (noPrefix && inheritsFrom(child, IC_XS, noPrefix))); 8974462Salfred case IC_64BIT: 9074462Salfred return(inheritsFrom(child, IC_64BIT_REXW) || 9174462Salfred (noPrefix && inheritsFrom(child, IC_64BIT_OPSIZE, noPrefix)) || 9274462Salfred (!AdSize64 && inheritsFrom(child, IC_64BIT_ADSIZE)) || 9374462Salfred (noPrefix && inheritsFrom(child, IC_64BIT_XD, noPrefix)) || 9474462Salfred (noPrefix && inheritsFrom(child, IC_64BIT_XS, noPrefix))); 9574462Salfred case IC_OPSIZE: 9674462Salfred return inheritsFrom(child, IC_64BIT_OPSIZE) || 9774462Salfred inheritsFrom(child, IC_OPSIZE_ADSIZE); 9874462Salfred case IC_ADSIZE: 9974462Salfred return (noPrefix && inheritsFrom(child, IC_OPSIZE_ADSIZE, noPrefix)); 10074462Salfred case IC_OPSIZE_ADSIZE: 10174462Salfred return false; 10274462Salfred case IC_64BIT_ADSIZE: 10374462Salfred return (noPrefix && inheritsFrom(child, IC_64BIT_OPSIZE_ADSIZE, noPrefix)); 10474462Salfred case IC_64BIT_OPSIZE_ADSIZE: 10574462Salfred return false; 10674462Salfred case IC_XD: 10774462Salfred return inheritsFrom(child, IC_64BIT_XD); 10874462Salfred case IC_XS: 10974462Salfred return inheritsFrom(child, IC_64BIT_XS); 11074462Salfred case IC_XD_OPSIZE: 11174462Salfred return inheritsFrom(child, IC_64BIT_XD_OPSIZE); 11274462Salfred case IC_XS_OPSIZE: 11374462Salfred return inheritsFrom(child, IC_64BIT_XS_OPSIZE); 11474462Salfred case IC_XD_ADSIZE: 11574462Salfred return inheritsFrom(child, IC_64BIT_XD_ADSIZE); 11674462Salfred case IC_XS_ADSIZE: 11774462Salfred return inheritsFrom(child, IC_64BIT_XS_ADSIZE); 11892905Sobrien case IC_64BIT_REXW: 11992905Sobrien return((noPrefix && inheritsFrom(child, IC_64BIT_REXW_XS, noPrefix)) || 12092905Sobrien (noPrefix && inheritsFrom(child, IC_64BIT_REXW_XD, noPrefix)) || 12174462Salfred (noPrefix && inheritsFrom(child, IC_64BIT_REXW_OPSIZE, noPrefix)) || 12274462Salfred (!AdSize64 && inheritsFrom(child, IC_64BIT_REXW_ADSIZE))); 12374462Salfred case IC_64BIT_OPSIZE: 12474462Salfred return inheritsFrom(child, IC_64BIT_REXW_OPSIZE) || 12574462Salfred (!AdSize64 && inheritsFrom(child, IC_64BIT_OPSIZE_ADSIZE)) || 12674462Salfred (!AdSize64 && inheritsFrom(child, IC_64BIT_REXW_ADSIZE)); 12774462Salfred case IC_64BIT_XD: 12874462Salfred return(inheritsFrom(child, IC_64BIT_REXW_XD) || 12974462Salfred (!AdSize64 && inheritsFrom(child, IC_64BIT_XD_ADSIZE))); 13074462Salfred case IC_64BIT_XS: 13174462Salfred return(inheritsFrom(child, IC_64BIT_REXW_XS) || 13274462Salfred (!AdSize64 && inheritsFrom(child, IC_64BIT_XS_ADSIZE))); 13374462Salfred case IC_64BIT_XD_OPSIZE: 13474462Salfred case IC_64BIT_XS_OPSIZE: 13574462Salfred return false; 13674462Salfred case IC_64BIT_XD_ADSIZE: 13774462Salfred case IC_64BIT_XS_ADSIZE: 13874462Salfred return false; 13974462Salfred case IC_64BIT_REXW_XD: 14074462Salfred case IC_64BIT_REXW_XS: 14174462Salfred case IC_64BIT_REXW_OPSIZE: 14274462Salfred case IC_64BIT_REXW_ADSIZE: 14374462Salfred return false; 14474462Salfred case IC_VEX: 14574462Salfred return (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_VEX_L_W)) || 14674462Salfred (VEX_WIG && inheritsFrom(child, IC_VEX_W)) || 14774462Salfred (VEX_LIG && inheritsFrom(child, IC_VEX_L)); 14874462Salfred case IC_VEX_XS: 14974462Salfred return (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_VEX_L_W_XS)) || 15074462Salfred (VEX_WIG && inheritsFrom(child, IC_VEX_W_XS)) || 15174462Salfred (VEX_LIG && inheritsFrom(child, IC_VEX_L_XS)); 15274462Salfred case IC_VEX_XD: 15374462Salfred return (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_VEX_L_W_XD)) || 15474462Salfred (VEX_WIG && inheritsFrom(child, IC_VEX_W_XD)) || 15574462Salfred (VEX_LIG && inheritsFrom(child, IC_VEX_L_XD)); 156109955Smbr case IC_VEX_OPSIZE: 15774462Salfred return (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_VEX_L_W_OPSIZE)) || 158109955Smbr (VEX_WIG && inheritsFrom(child, IC_VEX_W_OPSIZE)) || 15974462Salfred (VEX_LIG && inheritsFrom(child, IC_VEX_L_OPSIZE)); 160109955Smbr case IC_VEX_W: 161109955Smbr return VEX_LIG && inheritsFrom(child, IC_VEX_L_W); 16274462Salfred case IC_VEX_W_XS: 16374462Salfred return VEX_LIG && inheritsFrom(child, IC_VEX_L_W_XS); 16474462Salfred case IC_VEX_W_XD: 16574462Salfred return VEX_LIG && inheritsFrom(child, IC_VEX_L_W_XD); 16674462Salfred case IC_VEX_W_OPSIZE: 16774462Salfred return VEX_LIG && inheritsFrom(child, IC_VEX_L_W_OPSIZE); 168109955Smbr case IC_VEX_L: 16974462Salfred return VEX_WIG && inheritsFrom(child, IC_VEX_L_W); 170109955Smbr case IC_VEX_L_XS: 17174462Salfred return VEX_WIG && inheritsFrom(child, IC_VEX_L_W_XS); 17274462Salfred case IC_VEX_L_XD: 17374462Salfred return VEX_WIG && inheritsFrom(child, IC_VEX_L_W_XD); 17474462Salfred case IC_VEX_L_OPSIZE: 17574462Salfred return VEX_WIG && inheritsFrom(child, IC_VEX_L_W_OPSIZE); 17674462Salfred case IC_VEX_L_W: 17774462Salfred case IC_VEX_L_W_XS: 17874462Salfred case IC_VEX_L_W_XD: 179109955Smbr case IC_VEX_L_W_OPSIZE: 18074462Salfred return false; 181109955Smbr case IC_EVEX: 182109955Smbr return (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L_W)) || 183109955Smbr (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W)) || 18474462Salfred (VEX_WIG && inheritsFrom(child, IC_EVEX_W)) || 18574462Salfred (VEX_LIG && inheritsFrom(child, IC_EVEX_L)) || 18674462Salfred (VEX_LIG && inheritsFrom(child, IC_EVEX_L2)); 18774462Salfred case IC_EVEX_XS: 18874462Salfred return (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_XS)) || 18974462Salfred (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_XS)) || 19074462Salfred (VEX_WIG && inheritsFrom(child, IC_EVEX_W_XS)) || 19174462Salfred (VEX_LIG && inheritsFrom(child, IC_EVEX_L_XS)) || 19274462Salfred (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_XS)); 19374462Salfred case IC_EVEX_XD: 19474462Salfred return (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_XD)) || 19574462Salfred (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_XD)) || 19674462Salfred (VEX_WIG && inheritsFrom(child, IC_EVEX_W_XD)) || 19774462Salfred (VEX_LIG && inheritsFrom(child, IC_EVEX_L_XD)) || 19874462Salfred (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_XD)); 19974462Salfred case IC_EVEX_OPSIZE: 20074462Salfred return (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_OPSIZE)) || 20174462Salfred (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_OPSIZE)) || 20274462Salfred (VEX_WIG && inheritsFrom(child, IC_EVEX_W_OPSIZE)) || 20374462Salfred (VEX_LIG && inheritsFrom(child, IC_EVEX_L_OPSIZE)) || 20474462Salfred (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_OPSIZE)); 20574462Salfred case IC_EVEX_K: 20674462Salfred return (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_K)) || 20774462Salfred (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_K)) || 20874462Salfred (VEX_WIG && inheritsFrom(child, IC_EVEX_W_K)) || 20974462Salfred (VEX_LIG && inheritsFrom(child, IC_EVEX_L_K)) || 21074462Salfred (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_K)); 21174462Salfred case IC_EVEX_XS_K: 21274462Salfred return (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_XS_K)) || 21374462Salfred (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_XS_K)) || 21474462Salfred (VEX_WIG && inheritsFrom(child, IC_EVEX_W_XS_K)) || 21574462Salfred (VEX_LIG && inheritsFrom(child, IC_EVEX_L_XS_K)) || 21674462Salfred (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_XS_K)); 21774462Salfred case IC_EVEX_XD_K: 21874462Salfred return (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_XD_K)) || 21974462Salfred (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_XD_K)) || 22074462Salfred (VEX_WIG && inheritsFrom(child, IC_EVEX_W_XD_K)) || 22174462Salfred (VEX_LIG && inheritsFrom(child, IC_EVEX_L_XD_K)) || 22274462Salfred (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_XD_K)); 22374462Salfred case IC_EVEX_OPSIZE_K: 22474462Salfred return (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_OPSIZE_K)) || 22574462Salfred (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_OPSIZE_K)) || 22674462Salfred (VEX_WIG && inheritsFrom(child, IC_EVEX_W_OPSIZE_K)) || 22774462Salfred (VEX_LIG && inheritsFrom(child, IC_EVEX_L_OPSIZE_K)) || 22874462Salfred (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_OPSIZE_K)); 22974462Salfred case IC_EVEX_KZ: 23074462Salfred return (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_KZ)) || 23174462Salfred (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_KZ)) || 23274462Salfred (VEX_WIG && inheritsFrom(child, IC_EVEX_W_KZ)) || 23374462Salfred (VEX_LIG && inheritsFrom(child, IC_EVEX_L_KZ)) || 23474462Salfred (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_KZ)); 23574462Salfred case IC_EVEX_XS_KZ: 23674462Salfred return (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_XS_KZ)) || 23774462Salfred (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_XS_KZ)) || 23874462Salfred (VEX_WIG && inheritsFrom(child, IC_EVEX_W_XS_KZ)) || 23974462Salfred (VEX_LIG && inheritsFrom(child, IC_EVEX_L_XS_KZ)) || 24074462Salfred (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_XS_KZ)); 24174462Salfred case IC_EVEX_XD_KZ: 24274462Salfred return (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_XD_KZ)) || 24374462Salfred (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_XD_KZ)) || 24474462Salfred (VEX_WIG && inheritsFrom(child, IC_EVEX_W_XD_KZ)) || 24574462Salfred (VEX_LIG && inheritsFrom(child, IC_EVEX_L_XD_KZ)) || 24674462Salfred (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_XD_KZ)); 24774462Salfred case IC_EVEX_OPSIZE_KZ: 24874462Salfred return (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_OPSIZE_KZ)) || 24974462Salfred (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_OPSIZE_KZ)) || 25074462Salfred (VEX_WIG && inheritsFrom(child, IC_EVEX_W_OPSIZE_KZ)) || 25174462Salfred (VEX_LIG && inheritsFrom(child, IC_EVEX_L_OPSIZE_KZ)) || 25274462Salfred (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_OPSIZE_KZ)); 25374462Salfred case IC_EVEX_W: 25474462Salfred return (VEX_LIG && inheritsFrom(child, IC_EVEX_L_W)) || 25574462Salfred (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_W)); 25674462Salfred case IC_EVEX_W_XS: 25774462Salfred return (VEX_LIG && inheritsFrom(child, IC_EVEX_L_W_XS)) || 25874462Salfred (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_W_XS)); 25974462Salfred case IC_EVEX_W_XD: 26074462Salfred return (VEX_LIG && inheritsFrom(child, IC_EVEX_L_W_XD)) || 26174462Salfred (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_W_XD)); 26274462Salfred case IC_EVEX_W_OPSIZE: 26374462Salfred return (VEX_LIG && inheritsFrom(child, IC_EVEX_L_W_OPSIZE)) || 26474462Salfred (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_W_OPSIZE)); 26574462Salfred case IC_EVEX_W_K: 26674462Salfred return (VEX_LIG && inheritsFrom(child, IC_EVEX_L_W_K)) || 26774462Salfred (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_W_K)); 26874462Salfred case IC_EVEX_W_XS_K: 26974462Salfred return (VEX_LIG && inheritsFrom(child, IC_EVEX_L_W_XS_K)) || 27074462Salfred (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_W_XS_K)); 27174462Salfred case IC_EVEX_W_XD_K: 27274462Salfred return (VEX_LIG && inheritsFrom(child, IC_EVEX_L_W_XD_K)) || 27374462Salfred (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_W_XD_K)); 27490271Salfred case IC_EVEX_W_OPSIZE_K: 27574462Salfred return (VEX_LIG && inheritsFrom(child, IC_EVEX_L_W_OPSIZE_K)) || 27674462Salfred (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_W_OPSIZE_K)); 27774462Salfred case IC_EVEX_W_KZ: 27874462Salfred return (VEX_LIG && inheritsFrom(child, IC_EVEX_L_W_KZ)) || 27974462Salfred (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_W_KZ)); 28074462Salfred case IC_EVEX_W_XS_KZ: 28190271Salfred return (VEX_LIG && inheritsFrom(child, IC_EVEX_L_W_XS_KZ)) || 28274462Salfred (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_W_XS_KZ)); 28374462Salfred case IC_EVEX_W_XD_KZ: 28474462Salfred return (VEX_LIG && inheritsFrom(child, IC_EVEX_L_W_XD_KZ)) || 28574462Salfred (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_W_XD_KZ)); 28674462Salfred case IC_EVEX_W_OPSIZE_KZ: 28774462Salfred return (VEX_LIG && inheritsFrom(child, IC_EVEX_L_W_OPSIZE_KZ)) || 28874462Salfred (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_W_OPSIZE_KZ)); 28974462Salfred case IC_EVEX_L: 29074462Salfred return VEX_WIG && inheritsFrom(child, IC_EVEX_L_W); 29174462Salfred case IC_EVEX_L_XS: 29274462Salfred return VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_XS); 29374462Salfred case IC_EVEX_L_XD: 29474462Salfred return VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_XD); 29574462Salfred case IC_EVEX_L_OPSIZE: 29674462Salfred return VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_OPSIZE); 29774462Salfred case IC_EVEX_L_K: 29874462Salfred return VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_K); 29974462Salfred case IC_EVEX_L_XS_K: 30074462Salfred return VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_XS_K); 30174462Salfred case IC_EVEX_L_XD_K: 30274462Salfred return VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_XD_K); 30374462Salfred case IC_EVEX_L_OPSIZE_K: 30474462Salfred return VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_OPSIZE_K); 30574462Salfred case IC_EVEX_L_KZ: 30674462Salfred return VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_KZ); 30774462Salfred case IC_EVEX_L_XS_KZ: 30874462Salfred return VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_XS_KZ); 30974462Salfred case IC_EVEX_L_XD_KZ: 31074462Salfred return VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_XD_KZ); 31174462Salfred case IC_EVEX_L_OPSIZE_KZ: 31274462Salfred return VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_OPSIZE_KZ); 31374462Salfred case IC_EVEX_L_W: 31474462Salfred case IC_EVEX_L_W_XS: 31574462Salfred case IC_EVEX_L_W_XD: 31674462Salfred case IC_EVEX_L_W_OPSIZE: 31774462Salfred return false; 31874462Salfred case IC_EVEX_L_W_K: 31974462Salfred case IC_EVEX_L_W_XS_K: 32074462Salfred case IC_EVEX_L_W_XD_K: 32174462Salfred case IC_EVEX_L_W_OPSIZE_K: 32274462Salfred return false; 32374462Salfred case IC_EVEX_L_W_KZ: 32474462Salfred case IC_EVEX_L_W_XS_KZ: 32574462Salfred case IC_EVEX_L_W_XD_KZ: 32674462Salfred case IC_EVEX_L_W_OPSIZE_KZ: 32774462Salfred return false; 32874462Salfred case IC_EVEX_L2: 32974462Salfred return VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W); 33074462Salfred case IC_EVEX_L2_XS: 33174462Salfred return VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_XS); 33274462Salfred case IC_EVEX_L2_XD: 33374462Salfred return VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_XD); 33474462Salfred case IC_EVEX_L2_OPSIZE: 33574462Salfred return VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_OPSIZE); 33674462Salfred case IC_EVEX_L2_K: 33774462Salfred return VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_K); 33874462Salfred case IC_EVEX_L2_XS_K: 33974462Salfred return VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_XS_K); 34074462Salfred case IC_EVEX_L2_XD_K: 34174462Salfred return VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_XD_K); 34274462Salfred case IC_EVEX_L2_OPSIZE_K: 34374462Salfred return VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_OPSIZE_K); 34474462Salfred case IC_EVEX_L2_KZ: 34574462Salfred return VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_KZ); 34674462Salfred case IC_EVEX_L2_XS_KZ: 34774462Salfred return VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_XS_KZ); 34874462Salfred case IC_EVEX_L2_XD_KZ: 34974462Salfred return VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_XD_KZ); 35074462Salfred case IC_EVEX_L2_OPSIZE_KZ: 35174462Salfred return VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_OPSIZE_KZ); 35274462Salfred case IC_EVEX_L2_W: 35374462Salfred case IC_EVEX_L2_W_XS: 35474462Salfred case IC_EVEX_L2_W_XD: 35574462Salfred case IC_EVEX_L2_W_OPSIZE: 35674462Salfred return false; 35774462Salfred case IC_EVEX_L2_W_K: 35874462Salfred case IC_EVEX_L2_W_XS_K: 35974462Salfred case IC_EVEX_L2_W_XD_K: 36074462Salfred case IC_EVEX_L2_W_OPSIZE_K: 36174462Salfred return false; 36274462Salfred case IC_EVEX_L2_W_KZ: 36374462Salfred case IC_EVEX_L2_W_XS_KZ: 36474462Salfred case IC_EVEX_L2_W_XD_KZ: 36574462Salfred case IC_EVEX_L2_W_OPSIZE_KZ: 36674462Salfred return false; 36774462Salfred case IC_EVEX_B: 36874462Salfred return (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_B)) || 36974462Salfred (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_B)) || 37074462Salfred (VEX_WIG && inheritsFrom(child, IC_EVEX_W_B)) || 37174462Salfred (VEX_LIG && inheritsFrom(child, IC_EVEX_L_B)) || 37274462Salfred (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_B)); 37374462Salfred case IC_EVEX_XS_B: 37474462Salfred return (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_XS_B)) || 37574462Salfred (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_XS_B)) || 37674462Salfred (VEX_WIG && inheritsFrom(child, IC_EVEX_W_XS_B)) || 37774462Salfred (VEX_LIG && inheritsFrom(child, IC_EVEX_L_XS_B)) || 37874462Salfred (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_XS_B)); 37974462Salfred case IC_EVEX_XD_B: 38074462Salfred return (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_XD_B)) || 38174462Salfred (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_XD_B)) || 38274462Salfred (VEX_WIG && inheritsFrom(child, IC_EVEX_W_XD_B)) || 38374462Salfred (VEX_LIG && inheritsFrom(child, IC_EVEX_L_XD_B)) || 38474462Salfred (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_XD_B)); 38574462Salfred case IC_EVEX_OPSIZE_B: 38674462Salfred return (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_OPSIZE_B)) || 38774462Salfred (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_OPSIZE_B)) || 38874462Salfred (VEX_WIG && inheritsFrom(child, IC_EVEX_W_OPSIZE_B)) || 38974462Salfred (VEX_LIG && inheritsFrom(child, IC_EVEX_L_OPSIZE_B)) || 39074462Salfred (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_OPSIZE_B)); 39174462Salfred case IC_EVEX_K_B: 39274462Salfred return (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_K_B)) || 39374462Salfred (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_K_B)) || 39474462Salfred (VEX_WIG && inheritsFrom(child, IC_EVEX_W_K_B)) || 39574462Salfred (VEX_LIG && inheritsFrom(child, IC_EVEX_L_K_B)) || 39674462Salfred (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_K_B)); 39774462Salfred case IC_EVEX_XS_K_B: 39874462Salfred return (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_XS_K_B)) || 39974462Salfred (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_XS_K_B)) || 40074462Salfred (VEX_WIG && inheritsFrom(child, IC_EVEX_W_XS_K_B)) || 40174462Salfred (VEX_LIG && inheritsFrom(child, IC_EVEX_L_XS_K_B)) || 40274462Salfred (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_XS_K_B)); 40374462Salfred case IC_EVEX_XD_K_B: 40474462Salfred return (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_XD_K_B)) || 40574462Salfred (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_XD_K_B)) || 40674462Salfred (VEX_WIG && inheritsFrom(child, IC_EVEX_W_XD_K_B)) || 40774462Salfred (VEX_LIG && inheritsFrom(child, IC_EVEX_L_XD_K_B)) || 40874462Salfred (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_XD_K_B)); 40974462Salfred case IC_EVEX_OPSIZE_K_B: 41074462Salfred return (VEX_LIG && VEX_WIG && 41174462Salfred inheritsFrom(child, IC_EVEX_L_W_OPSIZE_K_B)) || 41274462Salfred (VEX_LIG && VEX_WIG && 41374462Salfred inheritsFrom(child, IC_EVEX_L2_W_OPSIZE_K_B)) || 41474462Salfred (VEX_WIG && inheritsFrom(child, IC_EVEX_W_OPSIZE_K_B)) || 41574462Salfred (VEX_LIG && inheritsFrom(child, IC_EVEX_L_OPSIZE_K_B)) || 41674462Salfred (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_OPSIZE_K_B)); 41774462Salfred case IC_EVEX_KZ_B: 41874462Salfred return (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_KZ_B)) || 41974462Salfred (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_KZ_B)) || 42074462Salfred (VEX_WIG && inheritsFrom(child, IC_EVEX_W_KZ_B)) || 42174462Salfred (VEX_LIG && inheritsFrom(child, IC_EVEX_L_KZ_B)) || 42274462Salfred (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_KZ_B)); 42387966Speter case IC_EVEX_XS_KZ_B: 42474462Salfred return (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_XS_KZ_B)) || 42574462Salfred (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_XS_KZ_B)) || 42674462Salfred (VEX_WIG && inheritsFrom(child, IC_EVEX_W_XS_KZ_B)) || 42774462Salfred (VEX_LIG && inheritsFrom(child, IC_EVEX_L_XS_KZ_B)) || 42874462Salfred (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_XS_KZ_B)); 42974462Salfred case IC_EVEX_XD_KZ_B: 43074462Salfred return (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_XD_KZ_B)) || 43174462Salfred (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_XD_KZ_B)) || 43274462Salfred (VEX_WIG && inheritsFrom(child, IC_EVEX_W_XD_KZ_B)) || 43374462Salfred (VEX_LIG && inheritsFrom(child, IC_EVEX_L_XD_KZ_B)) || 43474462Salfred (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_XD_KZ_B)); 43574462Salfred case IC_EVEX_OPSIZE_KZ_B: 43674462Salfred return (VEX_LIG && VEX_WIG && 43774462Salfred inheritsFrom(child, IC_EVEX_L_W_OPSIZE_KZ_B)) || 43874462Salfred (VEX_LIG && VEX_WIG && 43974462Salfred inheritsFrom(child, IC_EVEX_L2_W_OPSIZE_KZ_B)) || 44074462Salfred (VEX_WIG && inheritsFrom(child, IC_EVEX_W_OPSIZE_KZ_B)) || 44174462Salfred (VEX_LIG && inheritsFrom(child, IC_EVEX_L_OPSIZE_KZ_B)) || 44274462Salfred (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_OPSIZE_KZ_B)); 44374462Salfred case IC_EVEX_W_B: 44474462Salfred return (VEX_LIG && inheritsFrom(child, IC_EVEX_L_W_B)) || 44574462Salfred (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_W_B)); 44674462Salfred case IC_EVEX_W_XS_B: 44774462Salfred return (VEX_LIG && inheritsFrom(child, IC_EVEX_L_W_XS_B)) || 44874462Salfred (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_W_XS_B)); 44974462Salfred case IC_EVEX_W_XD_B: 45074462Salfred return (VEX_LIG && inheritsFrom(child, IC_EVEX_L_W_XD_B)) || 45174462Salfred (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_W_XD_B)); 45274462Salfred case IC_EVEX_W_OPSIZE_B: 45374462Salfred return (VEX_LIG && inheritsFrom(child, IC_EVEX_L_W_OPSIZE_B)) || 45474462Salfred (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_W_OPSIZE_B)); 45574462Salfred case IC_EVEX_W_K_B: 45674462Salfred return (VEX_LIG && inheritsFrom(child, IC_EVEX_L_W_K_B)) || 45774462Salfred (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_W_K_B)); 45874462Salfred case IC_EVEX_W_XS_K_B: 45974462Salfred return (VEX_LIG && inheritsFrom(child, IC_EVEX_L_W_XS_K_B)) || 46074462Salfred (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_W_XS_K_B)); 46174462Salfred case IC_EVEX_W_XD_K_B: 46274462Salfred return (VEX_LIG && inheritsFrom(child, IC_EVEX_L_W_XD_K_B)) || 46374462Salfred (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_W_XD_K_B)); 46474462Salfred case IC_EVEX_W_OPSIZE_K_B: 46574462Salfred return (VEX_LIG && inheritsFrom(child, IC_EVEX_L_W_OPSIZE_K_B)) || 46674462Salfred (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_W_OPSIZE_K_B)); 46774462Salfred case IC_EVEX_W_KZ_B: 46874462Salfred return (VEX_LIG && inheritsFrom(child, IC_EVEX_L_W_KZ_B)) || 46974462Salfred (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_W_KZ_B)); 47074462Salfred case IC_EVEX_W_XS_KZ_B: 47174462Salfred return (VEX_LIG && inheritsFrom(child, IC_EVEX_L_W_XS_KZ_B)) || 47274462Salfred (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_W_XS_KZ_B)); 47374462Salfred case IC_EVEX_W_XD_KZ_B: 47474462Salfred return (VEX_LIG && inheritsFrom(child, IC_EVEX_L_W_XD_KZ_B)) || 47574462Salfred (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_W_XD_KZ_B)); 47674462Salfred case IC_EVEX_W_OPSIZE_KZ_B: 47774462Salfred return (VEX_LIG && inheritsFrom(child, IC_EVEX_L_W_OPSIZE_KZ_B)) || 478109954Smbr (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_W_OPSIZE_KZ_B)); 479109954Smbr case IC_EVEX_L_B: 48074462Salfred return VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_B); 48174462Salfred case IC_EVEX_L_XS_B: 48274462Salfred return VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_XS_B); 48374462Salfred case IC_EVEX_L_XD_B: 48474462Salfred return VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_XD_B); 48574462Salfred case IC_EVEX_L_OPSIZE_B: 48674462Salfred return VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_OPSIZE_B); 48774462Salfred case IC_EVEX_L_K_B: 48874462Salfred return VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_K_B); 48974462Salfred case IC_EVEX_L_XS_K_B: 49074462Salfred return VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_XS_K_B); 49174462Salfred case IC_EVEX_L_XD_K_B: 49274462Salfred return VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_XD_K_B); 49374462Salfred case IC_EVEX_L_OPSIZE_K_B: 49474462Salfred return VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_OPSIZE_K_B); 49574462Salfred case IC_EVEX_L_KZ_B: 49674462Salfred return VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_KZ_B); 49774462Salfred case IC_EVEX_L_XS_KZ_B: 49874462Salfred return VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_XS_KZ_B); 49974462Salfred case IC_EVEX_L_XD_KZ_B: 50074462Salfred return VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_XD_KZ_B); 50174462Salfred case IC_EVEX_L_OPSIZE_KZ_B: 50274462Salfred return VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_OPSIZE_KZ_B); 50374462Salfred case IC_EVEX_L_W_B: 50474462Salfred case IC_EVEX_L_W_XS_B: 50574462Salfred case IC_EVEX_L_W_XD_B: 50674462Salfred case IC_EVEX_L_W_OPSIZE_B: 50774462Salfred return false; 50874462Salfred case IC_EVEX_L_W_K_B: 50974462Salfred case IC_EVEX_L_W_XS_K_B: 51074462Salfred case IC_EVEX_L_W_XD_K_B: 51174462Salfred case IC_EVEX_L_W_OPSIZE_K_B: 51274462Salfred return false; 51374462Salfred case IC_EVEX_L_W_KZ_B: 51474462Salfred case IC_EVEX_L_W_XS_KZ_B: 51574462Salfred case IC_EVEX_L_W_XD_KZ_B: 51674462Salfred case IC_EVEX_L_W_OPSIZE_KZ_B: 51774462Salfred return false; 51874462Salfred case IC_EVEX_L2_B: 51974462Salfred return VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_B); 52074462Salfred case IC_EVEX_L2_XS_B: 52174462Salfred return VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_XS_B); 52274462Salfred case IC_EVEX_L2_XD_B: 52374462Salfred return VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_XD_B); 52474462Salfred case IC_EVEX_L2_OPSIZE_B: 52574462Salfred return VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_OPSIZE_B); 52674462Salfred case IC_EVEX_L2_K_B: 52774462Salfred return VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_K_B); 52874462Salfred case IC_EVEX_L2_XS_K_B: 52974462Salfred return VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_XS_K_B); 53074462Salfred case IC_EVEX_L2_XD_K_B: 53174462Salfred return VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_XD_K_B); 53274462Salfred case IC_EVEX_L2_OPSIZE_K_B: 53374462Salfred return VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_OPSIZE_K_B); 53474462Salfred case IC_EVEX_L2_KZ_B: 53574462Salfred return VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_KZ_B); 53674462Salfred case IC_EVEX_L2_XS_KZ_B: 53774462Salfred return VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_XS_KZ_B); 53874462Salfred case IC_EVEX_L2_XD_KZ_B: 53974462Salfred return VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_XD_KZ_B); 54074462Salfred case IC_EVEX_L2_OPSIZE_KZ_B: 54174462Salfred return VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_OPSIZE_KZ_B); 54274462Salfred case IC_EVEX_L2_W_B: 54374462Salfred case IC_EVEX_L2_W_XS_B: 54474462Salfred case IC_EVEX_L2_W_XD_B: 54574462Salfred case IC_EVEX_L2_W_OPSIZE_B: 54674462Salfred return false; 54774462Salfred case IC_EVEX_L2_W_K_B: 54874462Salfred case IC_EVEX_L2_W_XS_K_B: 54974462Salfred case IC_EVEX_L2_W_XD_K_B: 55074462Salfred case IC_EVEX_L2_W_OPSIZE_K_B: 55174462Salfred return false; 55274462Salfred case IC_EVEX_L2_W_KZ_B: 55374462Salfred case IC_EVEX_L2_W_XS_KZ_B: 55474462Salfred case IC_EVEX_L2_W_XD_KZ_B: 55574462Salfred case IC_EVEX_L2_W_OPSIZE_KZ_B: 55674462Salfred return false; 55774462Salfred default: 55874462Salfred errs() << "Unknown instruction class: " << 55974462Salfred stringForContext((InstructionContext)parent) << "\n"; 56074462Salfred llvm_unreachable("Unknown instruction class"); 56174462Salfred } 56274462Salfred} 56374462Salfred 56474462Salfred/// outranks - Indicates whether, if an instruction has two different applicable 56574462Salfred/// classes, which class should be preferred when performing decode. This 56674462Salfred/// imposes a total ordering (ties are resolved toward "lower") 56774462Salfred/// 56874462Salfred/// @param upper - The class that may be preferable 56974462Salfred/// @param lower - The class that may be less preferable 57074462Salfred/// @return - True if upper is to be preferred, false otherwise. 57174462Salfredstatic inline bool outranks(InstructionContext upper, 57274462Salfred InstructionContext lower) { 57374462Salfred assert(upper < IC_max); 57474462Salfred assert(lower < IC_max); 57574462Salfred 57674462Salfred#define ENUM_ENTRY(n, r, d) r, 57774462Salfred#define ENUM_ENTRY_K_B(n, r, d) ENUM_ENTRY(n, r, d) \ 57874462Salfred ENUM_ENTRY(n##_K_B, r, d) ENUM_ENTRY(n##_KZ_B, r, d) \ 57974462Salfred ENUM_ENTRY(n##_KZ, r, d) ENUM_ENTRY(n##_K, r, d) ENUM_ENTRY(n##_B, r, d) 58074462Salfred static int ranks[IC_max] = { 58174462Salfred INSTRUCTION_CONTEXTS 58274462Salfred }; 58374462Salfred#undef ENUM_ENTRY 58474462Salfred#undef ENUM_ENTRY_K_B 58574462Salfred 58674462Salfred return (ranks[upper] > ranks[lower]); 58774462Salfred} 58874462Salfred 58974462Salfred/// getDecisionType - Determines whether a ModRM decision with 255 entries can 59074462Salfred/// be compacted by eliminating redundant information. 59174462Salfred/// 59274462Salfred/// @param decision - The decision to be compacted. 59374462Salfred/// @return - The compactest available representation for the decision. 59474462Salfredstatic ModRMDecisionType getDecisionType(ModRMDecision &decision) { 59574462Salfred bool satisfiesOneEntry = true; 59674462Salfred bool satisfiesSplitRM = true; 59774462Salfred bool satisfiesSplitReg = true; 59874462Salfred bool satisfiesSplitMisc = true; 59974462Salfred 60074462Salfred for (unsigned index = 0; index < 256; ++index) { 60174462Salfred if (decision.instructionIDs[index] != decision.instructionIDs[0]) 60274462Salfred satisfiesOneEntry = false; 60374462Salfred 60474462Salfred if (((index & 0xc0) == 0xc0) && 60574462Salfred (decision.instructionIDs[index] != decision.instructionIDs[0xc0])) 60674462Salfred satisfiesSplitRM = false; 60774462Salfred 60874462Salfred if (((index & 0xc0) != 0xc0) && 60974462Salfred (decision.instructionIDs[index] != decision.instructionIDs[0x00])) 61074462Salfred satisfiesSplitRM = false; 61174462Salfred 61274462Salfred if (((index & 0xc0) == 0xc0) && 61374462Salfred (decision.instructionIDs[index] != decision.instructionIDs[index&0xf8])) 61474462Salfred satisfiesSplitReg = false; 61574462Salfred 61674462Salfred if (((index & 0xc0) != 0xc0) && 61774462Salfred (decision.instructionIDs[index] != decision.instructionIDs[index&0x38])) 61874462Salfred satisfiesSplitMisc = false; 61974462Salfred } 62074462Salfred 62174462Salfred if (satisfiesOneEntry) 62274462Salfred return MODRM_ONEENTRY; 62374462Salfred 62474462Salfred if (satisfiesSplitRM) 62574462Salfred return MODRM_SPLITRM; 62674462Salfred 62774462Salfred if (satisfiesSplitReg && satisfiesSplitMisc) 62874462Salfred return MODRM_SPLITREG; 62974462Salfred 63074462Salfred if (satisfiesSplitMisc) 63174462Salfred return MODRM_SPLITMISC; 63274462Salfred 63374462Salfred return MODRM_FULL; 63474462Salfred} 63574462Salfred 63674462Salfred/// stringForDecisionType - Returns a statically-allocated string corresponding 63774462Salfred/// to a particular decision type. 63874462Salfred/// 63974462Salfred/// @param dt - The decision type. 64074462Salfred/// @return - A pointer to the statically-allocated string (e.g., 64174462Salfred/// "MODRM_ONEENTRY" for MODRM_ONEENTRY). 64274462Salfredstatic const char* stringForDecisionType(ModRMDecisionType dt) { 64374462Salfred#define ENUM_ENTRY(n) case n: return #n; 64474462Salfred switch (dt) { 64574462Salfred default: 64674462Salfred llvm_unreachable("Unknown decision type"); 64774462Salfred MODRMTYPES 64874462Salfred }; 64974462Salfred#undef ENUM_ENTRY 65074462Salfred} 65174462Salfred 65274462SalfredDisassemblerTables::DisassemblerTables() { 65374462Salfred for (unsigned i = 0; i < array_lengthof(Tables); i++) 65474462Salfred Tables[i] = std::make_unique<ContextDecision>(); 65574462Salfred 65674462Salfred HasConflicts = false; 65774462Salfred} 65874462Salfred 65974462SalfredDisassemblerTables::~DisassemblerTables() { 66074462Salfred} 66174462Salfred 66274462Salfredvoid DisassemblerTables::emitModRMDecision(raw_ostream &o1, raw_ostream &o2, 66374462Salfred unsigned &i1, unsigned &i2, 66474462Salfred unsigned &ModRMTableNum, 66574462Salfred ModRMDecision &decision) const { 66674462Salfred static uint32_t sTableNumber = 0; 66774462Salfred static uint32_t sEntryNumber = 1; 66874462Salfred ModRMDecisionType dt = getDecisionType(decision); 66974462Salfred 67074462Salfred if (dt == MODRM_ONEENTRY && decision.instructionIDs[0] == 0) { 67174462Salfred // Empty table. 672 o2 << "{ " << stringForDecisionType(dt) << ", 0 }"; 673 return; 674 } 675 676 std::vector<unsigned> ModRMDecision; 677 678 switch (dt) { 679 default: 680 llvm_unreachable("Unknown decision type"); 681 case MODRM_ONEENTRY: 682 ModRMDecision.push_back(decision.instructionIDs[0]); 683 break; 684 case MODRM_SPLITRM: 685 ModRMDecision.push_back(decision.instructionIDs[0x00]); 686 ModRMDecision.push_back(decision.instructionIDs[0xc0]); 687 break; 688 case MODRM_SPLITREG: 689 for (unsigned index = 0; index < 64; index += 8) 690 ModRMDecision.push_back(decision.instructionIDs[index]); 691 for (unsigned index = 0xc0; index < 256; index += 8) 692 ModRMDecision.push_back(decision.instructionIDs[index]); 693 break; 694 case MODRM_SPLITMISC: 695 for (unsigned index = 0; index < 64; index += 8) 696 ModRMDecision.push_back(decision.instructionIDs[index]); 697 for (unsigned index = 0xc0; index < 256; ++index) 698 ModRMDecision.push_back(decision.instructionIDs[index]); 699 break; 700 case MODRM_FULL: 701 for (unsigned index = 0; index < 256; ++index) 702 ModRMDecision.push_back(decision.instructionIDs[index]); 703 break; 704 } 705 706 unsigned &EntryNumber = ModRMTable[ModRMDecision]; 707 if (EntryNumber == 0) { 708 EntryNumber = ModRMTableNum; 709 710 ModRMTableNum += ModRMDecision.size(); 711 o1 << "/* Table" << EntryNumber << " */\n"; 712 i1++; 713 for (std::vector<unsigned>::const_iterator I = ModRMDecision.begin(), 714 E = ModRMDecision.end(); I != E; ++I) { 715 o1.indent(i1 * 2) << format("0x%hx", *I) << ", /* " 716 << InstructionSpecifiers[*I].name << " */\n"; 717 } 718 i1--; 719 } 720 721 o2 << "{ " << stringForDecisionType(dt) << ", " << EntryNumber << " /* Table" 722 << EntryNumber << " */ }"; 723 724 switch (dt) { 725 default: 726 llvm_unreachable("Unknown decision type"); 727 case MODRM_ONEENTRY: 728 sEntryNumber += 1; 729 break; 730 case MODRM_SPLITRM: 731 sEntryNumber += 2; 732 break; 733 case MODRM_SPLITREG: 734 sEntryNumber += 16; 735 break; 736 case MODRM_SPLITMISC: 737 sEntryNumber += 8 + 64; 738 break; 739 case MODRM_FULL: 740 sEntryNumber += 256; 741 break; 742 } 743 744 // We assume that the index can fit into uint16_t. 745 assert(sEntryNumber < 65536U && 746 "Index into ModRMDecision is too large for uint16_t!"); 747 748 ++sTableNumber; 749} 750 751void DisassemblerTables::emitOpcodeDecision(raw_ostream &o1, raw_ostream &o2, 752 unsigned &i1, unsigned &i2, 753 unsigned &ModRMTableNum, 754 OpcodeDecision &opDecision) const { 755 o2 << "{"; 756 ++i2; 757 758 unsigned index; 759 for (index = 0; index < 256; ++index) { 760 auto &decision = opDecision.modRMDecisions[index]; 761 ModRMDecisionType dt = getDecisionType(decision); 762 if (!(dt == MODRM_ONEENTRY && decision.instructionIDs[0] == 0)) 763 break; 764 } 765 if (index == 256) { 766 // If all 256 entries are MODRM_ONEENTRY, omit output. 767 assert(MODRM_ONEENTRY == 0); 768 --i2; 769 o2 << "},\n"; 770 } else { 771 o2 << " /* struct OpcodeDecision */ {\n"; 772 ++i2; 773 for (index = 0; index < 256; ++index) { 774 o2.indent(i2); 775 776 o2 << "/* 0x" << format("%02hhx", index) << " */ "; 777 778 emitModRMDecision(o1, o2, i1, i2, ModRMTableNum, 779 opDecision.modRMDecisions[index]); 780 781 if (index < 255) 782 o2 << ","; 783 784 o2 << "\n"; 785 } 786 --i2; 787 o2.indent(i2) << "}\n"; 788 --i2; 789 o2.indent(i2) << "},\n"; 790 } 791} 792 793void DisassemblerTables::emitContextDecision(raw_ostream &o1, raw_ostream &o2, 794 unsigned &i1, unsigned &i2, 795 unsigned &ModRMTableNum, 796 ContextDecision &decision, 797 const char* name) const { 798 o2.indent(i2) << "static const struct ContextDecision " << name << " = {\n"; 799 i2++; 800 o2.indent(i2) << "{ /* opcodeDecisions */" << "\n"; 801 i2++; 802 803 for (unsigned index = 0; index < IC_max; ++index) { 804 o2.indent(i2) << "/* "; 805 o2 << stringForContext((InstructionContext)index); 806 o2 << " */ "; 807 808 emitOpcodeDecision(o1, o2, i1, i2, ModRMTableNum, 809 decision.opcodeDecisions[index]); 810 } 811 812 i2--; 813 o2.indent(i2) << "}" << "\n"; 814 i2--; 815 o2.indent(i2) << "};" << "\n"; 816} 817 818void DisassemblerTables::emitInstructionInfo(raw_ostream &o, 819 unsigned &i) const { 820 unsigned NumInstructions = InstructionSpecifiers.size(); 821 822 o << "static const struct OperandSpecifier x86OperandSets[][" 823 << X86_MAX_OPERANDS << "] = {\n"; 824 825 typedef SmallVector<std::pair<OperandEncoding, OperandType>, 826 X86_MAX_OPERANDS> OperandListTy; 827 std::map<OperandListTy, unsigned> OperandSets; 828 829 unsigned OperandSetNum = 0; 830 for (unsigned Index = 0; Index < NumInstructions; ++Index) { 831 OperandListTy OperandList; 832 833 for (unsigned OperandIndex = 0; OperandIndex < X86_MAX_OPERANDS; 834 ++OperandIndex) { 835 OperandEncoding Encoding = (OperandEncoding)InstructionSpecifiers[Index] 836 .operands[OperandIndex].encoding; 837 OperandType Type = (OperandType)InstructionSpecifiers[Index] 838 .operands[OperandIndex].type; 839 OperandList.push_back(std::make_pair(Encoding, Type)); 840 } 841 unsigned &N = OperandSets[OperandList]; 842 if (N != 0) continue; 843 844 N = ++OperandSetNum; 845 846 o << " { /* " << (OperandSetNum - 1) << " */\n"; 847 for (unsigned i = 0, e = OperandList.size(); i != e; ++i) { 848 const char *Encoding = stringForOperandEncoding(OperandList[i].first); 849 const char *Type = stringForOperandType(OperandList[i].second); 850 o << " { " << Encoding << ", " << Type << " },\n"; 851 } 852 o << " },\n"; 853 } 854 o << "};" << "\n\n"; 855 856 o.indent(i * 2) << "static const struct InstructionSpecifier "; 857 o << INSTRUCTIONS_STR "[" << InstructionSpecifiers.size() << "] = {\n"; 858 859 i++; 860 861 for (unsigned index = 0; index < NumInstructions; ++index) { 862 o.indent(i * 2) << "{ /* " << index << " */\n"; 863 i++; 864 865 OperandListTy OperandList; 866 for (unsigned OperandIndex = 0; OperandIndex < X86_MAX_OPERANDS; 867 ++OperandIndex) { 868 OperandEncoding Encoding = (OperandEncoding)InstructionSpecifiers[index] 869 .operands[OperandIndex].encoding; 870 OperandType Type = (OperandType)InstructionSpecifiers[index] 871 .operands[OperandIndex].type; 872 OperandList.push_back(std::make_pair(Encoding, Type)); 873 } 874 o.indent(i * 2) << (OperandSets[OperandList] - 1) << ",\n"; 875 876 o.indent(i * 2) << "/* " << InstructionSpecifiers[index].name << " */\n"; 877 878 i--; 879 o.indent(i * 2) << "},\n"; 880 } 881 882 i--; 883 o.indent(i * 2) << "};" << "\n"; 884} 885 886void DisassemblerTables::emitContextTable(raw_ostream &o, unsigned &i) const { 887 o.indent(i * 2) << "static const uint8_t " CONTEXTS_STR 888 "[" << ATTR_max << "] = {\n"; 889 i++; 890 891 for (unsigned index = 0; index < ATTR_max; ++index) { 892 o.indent(i * 2); 893 894 if ((index & ATTR_EVEX) || (index & ATTR_VEX) || (index & ATTR_VEXL)) { 895 if (index & ATTR_EVEX) 896 o << "IC_EVEX"; 897 else 898 o << "IC_VEX"; 899 900 if ((index & ATTR_EVEX) && (index & ATTR_EVEXL2)) 901 o << "_L2"; 902 else if (index & ATTR_VEXL) 903 o << "_L"; 904 905 if (index & ATTR_REXW) 906 o << "_W"; 907 908 if (index & ATTR_OPSIZE) 909 o << "_OPSIZE"; 910 else if (index & ATTR_XD) 911 o << "_XD"; 912 else if (index & ATTR_XS) 913 o << "_XS"; 914 915 if ((index & ATTR_EVEX)) { 916 if (index & ATTR_EVEXKZ) 917 o << "_KZ"; 918 else if (index & ATTR_EVEXK) 919 o << "_K"; 920 921 if (index & ATTR_EVEXB) 922 o << "_B"; 923 } 924 } 925 else if ((index & ATTR_64BIT) && (index & ATTR_REXW) && (index & ATTR_XS)) 926 o << "IC_64BIT_REXW_XS"; 927 else if ((index & ATTR_64BIT) && (index & ATTR_REXW) && (index & ATTR_XD)) 928 o << "IC_64BIT_REXW_XD"; 929 else if ((index & ATTR_64BIT) && (index & ATTR_REXW) && 930 (index & ATTR_OPSIZE)) 931 o << "IC_64BIT_REXW_OPSIZE"; 932 else if ((index & ATTR_64BIT) && (index & ATTR_REXW) && 933 (index & ATTR_ADSIZE)) 934 o << "IC_64BIT_REXW_ADSIZE"; 935 else if ((index & ATTR_64BIT) && (index & ATTR_XD) && (index & ATTR_OPSIZE)) 936 o << "IC_64BIT_XD_OPSIZE"; 937 else if ((index & ATTR_64BIT) && (index & ATTR_XD) && (index & ATTR_ADSIZE)) 938 o << "IC_64BIT_XD_ADSIZE"; 939 else if ((index & ATTR_64BIT) && (index & ATTR_XS) && (index & ATTR_OPSIZE)) 940 o << "IC_64BIT_XS_OPSIZE"; 941 else if ((index & ATTR_64BIT) && (index & ATTR_XS) && (index & ATTR_ADSIZE)) 942 o << "IC_64BIT_XS_ADSIZE"; 943 else if ((index & ATTR_64BIT) && (index & ATTR_XS)) 944 o << "IC_64BIT_XS"; 945 else if ((index & ATTR_64BIT) && (index & ATTR_XD)) 946 o << "IC_64BIT_XD"; 947 else if ((index & ATTR_64BIT) && (index & ATTR_OPSIZE) && 948 (index & ATTR_ADSIZE)) 949 o << "IC_64BIT_OPSIZE_ADSIZE"; 950 else if ((index & ATTR_64BIT) && (index & ATTR_OPSIZE)) 951 o << "IC_64BIT_OPSIZE"; 952 else if ((index & ATTR_64BIT) && (index & ATTR_ADSIZE)) 953 o << "IC_64BIT_ADSIZE"; 954 else if ((index & ATTR_64BIT) && (index & ATTR_REXW)) 955 o << "IC_64BIT_REXW"; 956 else if ((index & ATTR_64BIT)) 957 o << "IC_64BIT"; 958 else if ((index & ATTR_XS) && (index & ATTR_OPSIZE)) 959 o << "IC_XS_OPSIZE"; 960 else if ((index & ATTR_XD) && (index & ATTR_OPSIZE)) 961 o << "IC_XD_OPSIZE"; 962 else if ((index & ATTR_XS) && (index & ATTR_ADSIZE)) 963 o << "IC_XS_ADSIZE"; 964 else if ((index & ATTR_XD) && (index & ATTR_ADSIZE)) 965 o << "IC_XD_ADSIZE"; 966 else if (index & ATTR_XS) 967 o << "IC_XS"; 968 else if (index & ATTR_XD) 969 o << "IC_XD"; 970 else if ((index & ATTR_OPSIZE) && (index & ATTR_ADSIZE)) 971 o << "IC_OPSIZE_ADSIZE"; 972 else if (index & ATTR_OPSIZE) 973 o << "IC_OPSIZE"; 974 else if (index & ATTR_ADSIZE) 975 o << "IC_ADSIZE"; 976 else 977 o << "IC"; 978 979 o << ", /* " << index << " */"; 980 981 o << "\n"; 982 } 983 984 i--; 985 o.indent(i * 2) << "};" << "\n"; 986} 987 988void DisassemblerTables::emitContextDecisions(raw_ostream &o1, raw_ostream &o2, 989 unsigned &i1, unsigned &i2, 990 unsigned &ModRMTableNum) const { 991 emitContextDecision(o1, o2, i1, i2, ModRMTableNum, *Tables[0], ONEBYTE_STR); 992 emitContextDecision(o1, o2, i1, i2, ModRMTableNum, *Tables[1], TWOBYTE_STR); 993 emitContextDecision(o1, o2, i1, i2, ModRMTableNum, *Tables[2], THREEBYTE38_STR); 994 emitContextDecision(o1, o2, i1, i2, ModRMTableNum, *Tables[3], THREEBYTE3A_STR); 995 emitContextDecision(o1, o2, i1, i2, ModRMTableNum, *Tables[4], XOP8_MAP_STR); 996 emitContextDecision(o1, o2, i1, i2, ModRMTableNum, *Tables[5], XOP9_MAP_STR); 997 emitContextDecision(o1, o2, i1, i2, ModRMTableNum, *Tables[6], XOPA_MAP_STR); 998 emitContextDecision(o1, o2, i1, i2, ModRMTableNum, *Tables[7], THREEDNOW_MAP_STR); 999} 1000 1001void DisassemblerTables::emit(raw_ostream &o) const { 1002 unsigned i1 = 0; 1003 unsigned i2 = 0; 1004 1005 std::string s1; 1006 std::string s2; 1007 1008 raw_string_ostream o1(s1); 1009 raw_string_ostream o2(s2); 1010 1011 emitInstructionInfo(o, i2); 1012 o << "\n"; 1013 1014 emitContextTable(o, i2); 1015 o << "\n"; 1016 1017 unsigned ModRMTableNum = 0; 1018 1019 o << "static const InstrUID modRMTable[] = {\n"; 1020 i1++; 1021 std::vector<unsigned> EmptyTable(1, 0); 1022 ModRMTable[EmptyTable] = ModRMTableNum; 1023 ModRMTableNum += EmptyTable.size(); 1024 o1 << "/* EmptyTable */\n"; 1025 o1.indent(i1 * 2) << "0x0,\n"; 1026 i1--; 1027 emitContextDecisions(o1, o2, i1, i2, ModRMTableNum); 1028 1029 o << o1.str(); 1030 o << " 0x0\n"; 1031 o << "};\n"; 1032 o << "\n"; 1033 o << o2.str(); 1034 o << "\n"; 1035 o << "\n"; 1036} 1037 1038void DisassemblerTables::setTableFields(ModRMDecision &decision, 1039 const ModRMFilter &filter, 1040 InstrUID uid, 1041 uint8_t opcode) { 1042 for (unsigned index = 0; index < 256; ++index) { 1043 if (filter.accepts(index)) { 1044 if (decision.instructionIDs[index] == uid) 1045 continue; 1046 1047 if (decision.instructionIDs[index] != 0) { 1048 InstructionSpecifier &newInfo = 1049 InstructionSpecifiers[uid]; 1050 InstructionSpecifier &previousInfo = 1051 InstructionSpecifiers[decision.instructionIDs[index]]; 1052 1053 if(previousInfo.name == "NOOP" && (newInfo.name == "XCHG16ar" || 1054 newInfo.name == "XCHG32ar" || 1055 newInfo.name == "XCHG64ar")) 1056 continue; // special case for XCHG*ar and NOOP 1057 1058 if (outranks(previousInfo.insnContext, newInfo.insnContext)) 1059 continue; 1060 1061 if (previousInfo.insnContext == newInfo.insnContext) { 1062 errs() << "Error: Primary decode conflict: "; 1063 errs() << newInfo.name << " would overwrite " << previousInfo.name; 1064 errs() << "\n"; 1065 errs() << "ModRM " << index << "\n"; 1066 errs() << "Opcode " << (uint16_t)opcode << "\n"; 1067 errs() << "Context " << stringForContext(newInfo.insnContext) << "\n"; 1068 HasConflicts = true; 1069 } 1070 } 1071 1072 decision.instructionIDs[index] = uid; 1073 } 1074 } 1075} 1076 1077void DisassemblerTables::setTableFields(OpcodeType type, 1078 InstructionContext insnContext, 1079 uint8_t opcode, 1080 const ModRMFilter &filter, 1081 InstrUID uid, 1082 bool is32bit, 1083 bool noPrefix, 1084 bool ignoresVEX_L, 1085 bool ignoresVEX_W, 1086 unsigned addressSize) { 1087 ContextDecision &decision = *Tables[type]; 1088 1089 for (unsigned index = 0; index < IC_max; ++index) { 1090 if ((is32bit || addressSize == 16) && 1091 inheritsFrom((InstructionContext)index, IC_64BIT)) 1092 continue; 1093 1094 bool adSize64 = addressSize == 64; 1095 if (inheritsFrom((InstructionContext)index, 1096 InstructionSpecifiers[uid].insnContext, noPrefix, 1097 ignoresVEX_L, ignoresVEX_W, adSize64)) 1098 setTableFields(decision.opcodeDecisions[index].modRMDecisions[opcode], 1099 filter, 1100 uid, 1101 opcode); 1102 } 1103} 1104