1*0b57cec5SDimitry Andric //===- X86DisassemblerTables.cpp - Disassembler tables ----------*- C++ -*-===// 2*0b57cec5SDimitry Andric // 3*0b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*0b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*0b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*0b57cec5SDimitry Andric // 7*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 8*0b57cec5SDimitry Andric // 9*0b57cec5SDimitry Andric // This file is part of the X86 Disassembler Emitter. 10*0b57cec5SDimitry Andric // It contains the implementation of the disassembler tables. 11*0b57cec5SDimitry Andric // Documentation for the disassembler emitter in general can be found in 12*0b57cec5SDimitry Andric // X86DisassemblerEmitter.h. 13*0b57cec5SDimitry Andric // 14*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 15*0b57cec5SDimitry Andric 16*0b57cec5SDimitry Andric #include "X86DisassemblerTables.h" 17*0b57cec5SDimitry Andric #include "X86DisassemblerShared.h" 18*0b57cec5SDimitry Andric #include "llvm/ADT/STLExtras.h" 19*0b57cec5SDimitry Andric #include "llvm/Support/ErrorHandling.h" 20*0b57cec5SDimitry Andric #include "llvm/Support/Format.h" 21*0b57cec5SDimitry Andric #include <map> 22*0b57cec5SDimitry Andric 23*0b57cec5SDimitry Andric using namespace llvm; 24*0b57cec5SDimitry Andric using namespace X86Disassembler; 25*0b57cec5SDimitry Andric 26*0b57cec5SDimitry Andric /// stringForContext - Returns a string containing the name of a particular 27*0b57cec5SDimitry Andric /// InstructionContext, usually for diagnostic purposes. 28*0b57cec5SDimitry Andric /// 29*0b57cec5SDimitry Andric /// @param insnContext - The instruction class to transform to a string. 30*0b57cec5SDimitry Andric /// @return - A statically-allocated string constant that contains the 31*0b57cec5SDimitry Andric /// name of the instruction class. 32*0b57cec5SDimitry Andric static inline const char* stringForContext(InstructionContext insnContext) { 33*0b57cec5SDimitry Andric switch (insnContext) { 34*0b57cec5SDimitry Andric default: 35*0b57cec5SDimitry Andric llvm_unreachable("Unhandled instruction class"); 36*0b57cec5SDimitry Andric #define ENUM_ENTRY(n, r, d) case n: return #n; break; 37*0b57cec5SDimitry Andric #define ENUM_ENTRY_K_B(n, r, d) ENUM_ENTRY(n, r, d) ENUM_ENTRY(n##_K_B, r, d)\ 38*0b57cec5SDimitry Andric ENUM_ENTRY(n##_KZ, r, d) ENUM_ENTRY(n##_K, r, d) ENUM_ENTRY(n##_B, r, d)\ 39*0b57cec5SDimitry Andric ENUM_ENTRY(n##_KZ_B, r, d) 40*0b57cec5SDimitry Andric INSTRUCTION_CONTEXTS 41*0b57cec5SDimitry Andric #undef ENUM_ENTRY 42*0b57cec5SDimitry Andric #undef ENUM_ENTRY_K_B 43*0b57cec5SDimitry Andric } 44*0b57cec5SDimitry Andric } 45*0b57cec5SDimitry Andric 46*0b57cec5SDimitry Andric /// stringForOperandType - Like stringForContext, but for OperandTypes. 47*0b57cec5SDimitry Andric static inline const char* stringForOperandType(OperandType type) { 48*0b57cec5SDimitry Andric switch (type) { 49*0b57cec5SDimitry Andric default: 50*0b57cec5SDimitry Andric llvm_unreachable("Unhandled type"); 51*0b57cec5SDimitry Andric #define ENUM_ENTRY(i, d) case i: return #i; 52*0b57cec5SDimitry Andric TYPES 53*0b57cec5SDimitry Andric #undef ENUM_ENTRY 54*0b57cec5SDimitry Andric } 55*0b57cec5SDimitry Andric } 56*0b57cec5SDimitry Andric 57*0b57cec5SDimitry Andric /// stringForOperandEncoding - like stringForContext, but for 58*0b57cec5SDimitry Andric /// OperandEncodings. 59*0b57cec5SDimitry Andric static inline const char* stringForOperandEncoding(OperandEncoding encoding) { 60*0b57cec5SDimitry Andric switch (encoding) { 61*0b57cec5SDimitry Andric default: 62*0b57cec5SDimitry Andric llvm_unreachable("Unhandled encoding"); 63*0b57cec5SDimitry Andric #define ENUM_ENTRY(i, d) case i: return #i; 64*0b57cec5SDimitry Andric ENCODINGS 65*0b57cec5SDimitry Andric #undef ENUM_ENTRY 66*0b57cec5SDimitry Andric } 67*0b57cec5SDimitry Andric } 68*0b57cec5SDimitry Andric 69*0b57cec5SDimitry Andric /// inheritsFrom - Indicates whether all instructions in one class also belong 70*0b57cec5SDimitry Andric /// to another class. 71*0b57cec5SDimitry Andric /// 72*0b57cec5SDimitry Andric /// @param child - The class that may be the subset 73*0b57cec5SDimitry Andric /// @param parent - The class that may be the superset 74*0b57cec5SDimitry Andric /// @return - True if child is a subset of parent, false otherwise. 75*0b57cec5SDimitry Andric static inline bool inheritsFrom(InstructionContext child, 76*0b57cec5SDimitry Andric InstructionContext parent, bool noPrefix = true, 77*0b57cec5SDimitry Andric bool VEX_LIG = false, bool VEX_WIG = false, 78*0b57cec5SDimitry Andric bool AdSize64 = false) { 79*0b57cec5SDimitry Andric if (child == parent) 80*0b57cec5SDimitry Andric return true; 81*0b57cec5SDimitry Andric 82*0b57cec5SDimitry Andric switch (parent) { 83*0b57cec5SDimitry Andric case IC: 84*0b57cec5SDimitry Andric return(inheritsFrom(child, IC_64BIT, AdSize64) || 85*0b57cec5SDimitry Andric (noPrefix && inheritsFrom(child, IC_OPSIZE, noPrefix)) || 86*0b57cec5SDimitry Andric inheritsFrom(child, IC_ADSIZE) || 87*0b57cec5SDimitry Andric (noPrefix && inheritsFrom(child, IC_XD, noPrefix)) || 88*0b57cec5SDimitry Andric (noPrefix && inheritsFrom(child, IC_XS, noPrefix))); 89*0b57cec5SDimitry Andric case IC_64BIT: 90*0b57cec5SDimitry Andric return(inheritsFrom(child, IC_64BIT_REXW) || 91*0b57cec5SDimitry Andric (noPrefix && inheritsFrom(child, IC_64BIT_OPSIZE, noPrefix)) || 92*0b57cec5SDimitry Andric (!AdSize64 && inheritsFrom(child, IC_64BIT_ADSIZE)) || 93*0b57cec5SDimitry Andric (noPrefix && inheritsFrom(child, IC_64BIT_XD, noPrefix)) || 94*0b57cec5SDimitry Andric (noPrefix && inheritsFrom(child, IC_64BIT_XS, noPrefix))); 95*0b57cec5SDimitry Andric case IC_OPSIZE: 96*0b57cec5SDimitry Andric return inheritsFrom(child, IC_64BIT_OPSIZE) || 97*0b57cec5SDimitry Andric inheritsFrom(child, IC_OPSIZE_ADSIZE); 98*0b57cec5SDimitry Andric case IC_ADSIZE: 99*0b57cec5SDimitry Andric return (noPrefix && inheritsFrom(child, IC_OPSIZE_ADSIZE, noPrefix)); 100*0b57cec5SDimitry Andric case IC_OPSIZE_ADSIZE: 101*0b57cec5SDimitry Andric return false; 102*0b57cec5SDimitry Andric case IC_64BIT_ADSIZE: 103*0b57cec5SDimitry Andric return (noPrefix && inheritsFrom(child, IC_64BIT_OPSIZE_ADSIZE, noPrefix)); 104*0b57cec5SDimitry Andric case IC_64BIT_OPSIZE_ADSIZE: 105*0b57cec5SDimitry Andric return false; 106*0b57cec5SDimitry Andric case IC_XD: 107*0b57cec5SDimitry Andric return inheritsFrom(child, IC_64BIT_XD); 108*0b57cec5SDimitry Andric case IC_XS: 109*0b57cec5SDimitry Andric return inheritsFrom(child, IC_64BIT_XS); 110*0b57cec5SDimitry Andric case IC_XD_OPSIZE: 111*0b57cec5SDimitry Andric return inheritsFrom(child, IC_64BIT_XD_OPSIZE); 112*0b57cec5SDimitry Andric case IC_XS_OPSIZE: 113*0b57cec5SDimitry Andric return inheritsFrom(child, IC_64BIT_XS_OPSIZE); 114*0b57cec5SDimitry Andric case IC_XD_ADSIZE: 115*0b57cec5SDimitry Andric return inheritsFrom(child, IC_64BIT_XD_ADSIZE); 116*0b57cec5SDimitry Andric case IC_XS_ADSIZE: 117*0b57cec5SDimitry Andric return inheritsFrom(child, IC_64BIT_XS_ADSIZE); 118*0b57cec5SDimitry Andric case IC_64BIT_REXW: 119*0b57cec5SDimitry Andric return((noPrefix && inheritsFrom(child, IC_64BIT_REXW_XS, noPrefix)) || 120*0b57cec5SDimitry Andric (noPrefix && inheritsFrom(child, IC_64BIT_REXW_XD, noPrefix)) || 121*0b57cec5SDimitry Andric (noPrefix && inheritsFrom(child, IC_64BIT_REXW_OPSIZE, noPrefix)) || 122*0b57cec5SDimitry Andric (!AdSize64 && inheritsFrom(child, IC_64BIT_REXW_ADSIZE))); 123*0b57cec5SDimitry Andric case IC_64BIT_OPSIZE: 124*0b57cec5SDimitry Andric return inheritsFrom(child, IC_64BIT_REXW_OPSIZE) || 125*0b57cec5SDimitry Andric (!AdSize64 && inheritsFrom(child, IC_64BIT_OPSIZE_ADSIZE)) || 126*0b57cec5SDimitry Andric (!AdSize64 && inheritsFrom(child, IC_64BIT_REXW_ADSIZE)); 127*0b57cec5SDimitry Andric case IC_64BIT_XD: 128*0b57cec5SDimitry Andric return(inheritsFrom(child, IC_64BIT_REXW_XD) || 129*0b57cec5SDimitry Andric (!AdSize64 && inheritsFrom(child, IC_64BIT_XD_ADSIZE))); 130*0b57cec5SDimitry Andric case IC_64BIT_XS: 131*0b57cec5SDimitry Andric return(inheritsFrom(child, IC_64BIT_REXW_XS) || 132*0b57cec5SDimitry Andric (!AdSize64 && inheritsFrom(child, IC_64BIT_XS_ADSIZE))); 133*0b57cec5SDimitry Andric case IC_64BIT_XD_OPSIZE: 134*0b57cec5SDimitry Andric case IC_64BIT_XS_OPSIZE: 135*0b57cec5SDimitry Andric return false; 136*0b57cec5SDimitry Andric case IC_64BIT_XD_ADSIZE: 137*0b57cec5SDimitry Andric case IC_64BIT_XS_ADSIZE: 138*0b57cec5SDimitry Andric return false; 139*0b57cec5SDimitry Andric case IC_64BIT_REXW_XD: 140*0b57cec5SDimitry Andric case IC_64BIT_REXW_XS: 141*0b57cec5SDimitry Andric case IC_64BIT_REXW_OPSIZE: 142*0b57cec5SDimitry Andric case IC_64BIT_REXW_ADSIZE: 143*0b57cec5SDimitry Andric return false; 144*0b57cec5SDimitry Andric case IC_VEX: 145*0b57cec5SDimitry Andric return (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_VEX_L_W)) || 146*0b57cec5SDimitry Andric (VEX_WIG && inheritsFrom(child, IC_VEX_W)) || 147*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_VEX_L)); 148*0b57cec5SDimitry Andric case IC_VEX_XS: 149*0b57cec5SDimitry Andric return (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_VEX_L_W_XS)) || 150*0b57cec5SDimitry Andric (VEX_WIG && inheritsFrom(child, IC_VEX_W_XS)) || 151*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_VEX_L_XS)); 152*0b57cec5SDimitry Andric case IC_VEX_XD: 153*0b57cec5SDimitry Andric return (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_VEX_L_W_XD)) || 154*0b57cec5SDimitry Andric (VEX_WIG && inheritsFrom(child, IC_VEX_W_XD)) || 155*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_VEX_L_XD)); 156*0b57cec5SDimitry Andric case IC_VEX_OPSIZE: 157*0b57cec5SDimitry Andric return (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_VEX_L_W_OPSIZE)) || 158*0b57cec5SDimitry Andric (VEX_WIG && inheritsFrom(child, IC_VEX_W_OPSIZE)) || 159*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_VEX_L_OPSIZE)); 160*0b57cec5SDimitry Andric case IC_VEX_W: 161*0b57cec5SDimitry Andric return VEX_LIG && inheritsFrom(child, IC_VEX_L_W); 162*0b57cec5SDimitry Andric case IC_VEX_W_XS: 163*0b57cec5SDimitry Andric return VEX_LIG && inheritsFrom(child, IC_VEX_L_W_XS); 164*0b57cec5SDimitry Andric case IC_VEX_W_XD: 165*0b57cec5SDimitry Andric return VEX_LIG && inheritsFrom(child, IC_VEX_L_W_XD); 166*0b57cec5SDimitry Andric case IC_VEX_W_OPSIZE: 167*0b57cec5SDimitry Andric return VEX_LIG && inheritsFrom(child, IC_VEX_L_W_OPSIZE); 168*0b57cec5SDimitry Andric case IC_VEX_L: 169*0b57cec5SDimitry Andric return VEX_WIG && inheritsFrom(child, IC_VEX_L_W); 170*0b57cec5SDimitry Andric case IC_VEX_L_XS: 171*0b57cec5SDimitry Andric return VEX_WIG && inheritsFrom(child, IC_VEX_L_W_XS); 172*0b57cec5SDimitry Andric case IC_VEX_L_XD: 173*0b57cec5SDimitry Andric return VEX_WIG && inheritsFrom(child, IC_VEX_L_W_XD); 174*0b57cec5SDimitry Andric case IC_VEX_L_OPSIZE: 175*0b57cec5SDimitry Andric return VEX_WIG && inheritsFrom(child, IC_VEX_L_W_OPSIZE); 176*0b57cec5SDimitry Andric case IC_VEX_L_W: 177*0b57cec5SDimitry Andric case IC_VEX_L_W_XS: 178*0b57cec5SDimitry Andric case IC_VEX_L_W_XD: 179*0b57cec5SDimitry Andric case IC_VEX_L_W_OPSIZE: 180*0b57cec5SDimitry Andric return false; 181*0b57cec5SDimitry Andric case IC_EVEX: 182*0b57cec5SDimitry Andric return (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L_W)) || 183*0b57cec5SDimitry Andric (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W)) || 184*0b57cec5SDimitry Andric (VEX_WIG && inheritsFrom(child, IC_EVEX_W)) || 185*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_EVEX_L)) || 186*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_EVEX_L2)); 187*0b57cec5SDimitry Andric case IC_EVEX_XS: 188*0b57cec5SDimitry Andric return (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_XS)) || 189*0b57cec5SDimitry Andric (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_XS)) || 190*0b57cec5SDimitry Andric (VEX_WIG && inheritsFrom(child, IC_EVEX_W_XS)) || 191*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_EVEX_L_XS)) || 192*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_XS)); 193*0b57cec5SDimitry Andric case IC_EVEX_XD: 194*0b57cec5SDimitry Andric return (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_XD)) || 195*0b57cec5SDimitry Andric (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_XD)) || 196*0b57cec5SDimitry Andric (VEX_WIG && inheritsFrom(child, IC_EVEX_W_XD)) || 197*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_EVEX_L_XD)) || 198*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_XD)); 199*0b57cec5SDimitry Andric case IC_EVEX_OPSIZE: 200*0b57cec5SDimitry Andric return (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_OPSIZE)) || 201*0b57cec5SDimitry Andric (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_OPSIZE)) || 202*0b57cec5SDimitry Andric (VEX_WIG && inheritsFrom(child, IC_EVEX_W_OPSIZE)) || 203*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_EVEX_L_OPSIZE)) || 204*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_OPSIZE)); 205*0b57cec5SDimitry Andric case IC_EVEX_K: 206*0b57cec5SDimitry Andric return (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_K)) || 207*0b57cec5SDimitry Andric (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_K)) || 208*0b57cec5SDimitry Andric (VEX_WIG && inheritsFrom(child, IC_EVEX_W_K)) || 209*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_EVEX_L_K)) || 210*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_K)); 211*0b57cec5SDimitry Andric case IC_EVEX_XS_K: 212*0b57cec5SDimitry Andric return (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_XS_K)) || 213*0b57cec5SDimitry Andric (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_XS_K)) || 214*0b57cec5SDimitry Andric (VEX_WIG && inheritsFrom(child, IC_EVEX_W_XS_K)) || 215*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_EVEX_L_XS_K)) || 216*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_XS_K)); 217*0b57cec5SDimitry Andric case IC_EVEX_XD_K: 218*0b57cec5SDimitry Andric return (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_XD_K)) || 219*0b57cec5SDimitry Andric (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_XD_K)) || 220*0b57cec5SDimitry Andric (VEX_WIG && inheritsFrom(child, IC_EVEX_W_XD_K)) || 221*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_EVEX_L_XD_K)) || 222*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_XD_K)); 223*0b57cec5SDimitry Andric case IC_EVEX_OPSIZE_K: 224*0b57cec5SDimitry Andric return (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_OPSIZE_K)) || 225*0b57cec5SDimitry Andric (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_OPSIZE_K)) || 226*0b57cec5SDimitry Andric (VEX_WIG && inheritsFrom(child, IC_EVEX_W_OPSIZE_K)) || 227*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_EVEX_L_OPSIZE_K)) || 228*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_OPSIZE_K)); 229*0b57cec5SDimitry Andric case IC_EVEX_KZ: 230*0b57cec5SDimitry Andric return (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_KZ)) || 231*0b57cec5SDimitry Andric (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_KZ)) || 232*0b57cec5SDimitry Andric (VEX_WIG && inheritsFrom(child, IC_EVEX_W_KZ)) || 233*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_EVEX_L_KZ)) || 234*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_KZ)); 235*0b57cec5SDimitry Andric case IC_EVEX_XS_KZ: 236*0b57cec5SDimitry Andric return (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_XS_KZ)) || 237*0b57cec5SDimitry Andric (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_XS_KZ)) || 238*0b57cec5SDimitry Andric (VEX_WIG && inheritsFrom(child, IC_EVEX_W_XS_KZ)) || 239*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_EVEX_L_XS_KZ)) || 240*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_XS_KZ)); 241*0b57cec5SDimitry Andric case IC_EVEX_XD_KZ: 242*0b57cec5SDimitry Andric return (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_XD_KZ)) || 243*0b57cec5SDimitry Andric (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_XD_KZ)) || 244*0b57cec5SDimitry Andric (VEX_WIG && inheritsFrom(child, IC_EVEX_W_XD_KZ)) || 245*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_EVEX_L_XD_KZ)) || 246*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_XD_KZ)); 247*0b57cec5SDimitry Andric case IC_EVEX_OPSIZE_KZ: 248*0b57cec5SDimitry Andric return (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_OPSIZE_KZ)) || 249*0b57cec5SDimitry Andric (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_OPSIZE_KZ)) || 250*0b57cec5SDimitry Andric (VEX_WIG && inheritsFrom(child, IC_EVEX_W_OPSIZE_KZ)) || 251*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_EVEX_L_OPSIZE_KZ)) || 252*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_OPSIZE_KZ)); 253*0b57cec5SDimitry Andric case IC_EVEX_W: 254*0b57cec5SDimitry Andric return (VEX_LIG && inheritsFrom(child, IC_EVEX_L_W)) || 255*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_W)); 256*0b57cec5SDimitry Andric case IC_EVEX_W_XS: 257*0b57cec5SDimitry Andric return (VEX_LIG && inheritsFrom(child, IC_EVEX_L_W_XS)) || 258*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_W_XS)); 259*0b57cec5SDimitry Andric case IC_EVEX_W_XD: 260*0b57cec5SDimitry Andric return (VEX_LIG && inheritsFrom(child, IC_EVEX_L_W_XD)) || 261*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_W_XD)); 262*0b57cec5SDimitry Andric case IC_EVEX_W_OPSIZE: 263*0b57cec5SDimitry Andric return (VEX_LIG && inheritsFrom(child, IC_EVEX_L_W_OPSIZE)) || 264*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_W_OPSIZE)); 265*0b57cec5SDimitry Andric case IC_EVEX_W_K: 266*0b57cec5SDimitry Andric return (VEX_LIG && inheritsFrom(child, IC_EVEX_L_W_K)) || 267*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_W_K)); 268*0b57cec5SDimitry Andric case IC_EVEX_W_XS_K: 269*0b57cec5SDimitry Andric return (VEX_LIG && inheritsFrom(child, IC_EVEX_L_W_XS_K)) || 270*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_W_XS_K)); 271*0b57cec5SDimitry Andric case IC_EVEX_W_XD_K: 272*0b57cec5SDimitry Andric return (VEX_LIG && inheritsFrom(child, IC_EVEX_L_W_XD_K)) || 273*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_W_XD_K)); 274*0b57cec5SDimitry Andric case IC_EVEX_W_OPSIZE_K: 275*0b57cec5SDimitry Andric return (VEX_LIG && inheritsFrom(child, IC_EVEX_L_W_OPSIZE_K)) || 276*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_W_OPSIZE_K)); 277*0b57cec5SDimitry Andric case IC_EVEX_W_KZ: 278*0b57cec5SDimitry Andric return (VEX_LIG && inheritsFrom(child, IC_EVEX_L_W_KZ)) || 279*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_W_KZ)); 280*0b57cec5SDimitry Andric case IC_EVEX_W_XS_KZ: 281*0b57cec5SDimitry Andric return (VEX_LIG && inheritsFrom(child, IC_EVEX_L_W_XS_KZ)) || 282*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_W_XS_KZ)); 283*0b57cec5SDimitry Andric case IC_EVEX_W_XD_KZ: 284*0b57cec5SDimitry Andric return (VEX_LIG && inheritsFrom(child, IC_EVEX_L_W_XD_KZ)) || 285*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_W_XD_KZ)); 286*0b57cec5SDimitry Andric case IC_EVEX_W_OPSIZE_KZ: 287*0b57cec5SDimitry Andric return (VEX_LIG && inheritsFrom(child, IC_EVEX_L_W_OPSIZE_KZ)) || 288*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_W_OPSIZE_KZ)); 289*0b57cec5SDimitry Andric case IC_EVEX_L: 290*0b57cec5SDimitry Andric return VEX_WIG && inheritsFrom(child, IC_EVEX_L_W); 291*0b57cec5SDimitry Andric case IC_EVEX_L_XS: 292*0b57cec5SDimitry Andric return VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_XS); 293*0b57cec5SDimitry Andric case IC_EVEX_L_XD: 294*0b57cec5SDimitry Andric return VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_XD); 295*0b57cec5SDimitry Andric case IC_EVEX_L_OPSIZE: 296*0b57cec5SDimitry Andric return VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_OPSIZE); 297*0b57cec5SDimitry Andric case IC_EVEX_L_K: 298*0b57cec5SDimitry Andric return VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_K); 299*0b57cec5SDimitry Andric case IC_EVEX_L_XS_K: 300*0b57cec5SDimitry Andric return VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_XS_K); 301*0b57cec5SDimitry Andric case IC_EVEX_L_XD_K: 302*0b57cec5SDimitry Andric return VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_XD_K); 303*0b57cec5SDimitry Andric case IC_EVEX_L_OPSIZE_K: 304*0b57cec5SDimitry Andric return VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_OPSIZE_K); 305*0b57cec5SDimitry Andric case IC_EVEX_L_KZ: 306*0b57cec5SDimitry Andric return VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_KZ); 307*0b57cec5SDimitry Andric case IC_EVEX_L_XS_KZ: 308*0b57cec5SDimitry Andric return VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_XS_KZ); 309*0b57cec5SDimitry Andric case IC_EVEX_L_XD_KZ: 310*0b57cec5SDimitry Andric return VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_XD_KZ); 311*0b57cec5SDimitry Andric case IC_EVEX_L_OPSIZE_KZ: 312*0b57cec5SDimitry Andric return VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_OPSIZE_KZ); 313*0b57cec5SDimitry Andric case IC_EVEX_L_W: 314*0b57cec5SDimitry Andric case IC_EVEX_L_W_XS: 315*0b57cec5SDimitry Andric case IC_EVEX_L_W_XD: 316*0b57cec5SDimitry Andric case IC_EVEX_L_W_OPSIZE: 317*0b57cec5SDimitry Andric return false; 318*0b57cec5SDimitry Andric case IC_EVEX_L_W_K: 319*0b57cec5SDimitry Andric case IC_EVEX_L_W_XS_K: 320*0b57cec5SDimitry Andric case IC_EVEX_L_W_XD_K: 321*0b57cec5SDimitry Andric case IC_EVEX_L_W_OPSIZE_K: 322*0b57cec5SDimitry Andric return false; 323*0b57cec5SDimitry Andric case IC_EVEX_L_W_KZ: 324*0b57cec5SDimitry Andric case IC_EVEX_L_W_XS_KZ: 325*0b57cec5SDimitry Andric case IC_EVEX_L_W_XD_KZ: 326*0b57cec5SDimitry Andric case IC_EVEX_L_W_OPSIZE_KZ: 327*0b57cec5SDimitry Andric return false; 328*0b57cec5SDimitry Andric case IC_EVEX_L2: 329*0b57cec5SDimitry Andric return VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W); 330*0b57cec5SDimitry Andric case IC_EVEX_L2_XS: 331*0b57cec5SDimitry Andric return VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_XS); 332*0b57cec5SDimitry Andric case IC_EVEX_L2_XD: 333*0b57cec5SDimitry Andric return VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_XD); 334*0b57cec5SDimitry Andric case IC_EVEX_L2_OPSIZE: 335*0b57cec5SDimitry Andric return VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_OPSIZE); 336*0b57cec5SDimitry Andric case IC_EVEX_L2_K: 337*0b57cec5SDimitry Andric return VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_K); 338*0b57cec5SDimitry Andric case IC_EVEX_L2_XS_K: 339*0b57cec5SDimitry Andric return VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_XS_K); 340*0b57cec5SDimitry Andric case IC_EVEX_L2_XD_K: 341*0b57cec5SDimitry Andric return VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_XD_K); 342*0b57cec5SDimitry Andric case IC_EVEX_L2_OPSIZE_K: 343*0b57cec5SDimitry Andric return VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_OPSIZE_K); 344*0b57cec5SDimitry Andric case IC_EVEX_L2_KZ: 345*0b57cec5SDimitry Andric return VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_KZ); 346*0b57cec5SDimitry Andric case IC_EVEX_L2_XS_KZ: 347*0b57cec5SDimitry Andric return VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_XS_KZ); 348*0b57cec5SDimitry Andric case IC_EVEX_L2_XD_KZ: 349*0b57cec5SDimitry Andric return VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_XD_KZ); 350*0b57cec5SDimitry Andric case IC_EVEX_L2_OPSIZE_KZ: 351*0b57cec5SDimitry Andric return VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_OPSIZE_KZ); 352*0b57cec5SDimitry Andric case IC_EVEX_L2_W: 353*0b57cec5SDimitry Andric case IC_EVEX_L2_W_XS: 354*0b57cec5SDimitry Andric case IC_EVEX_L2_W_XD: 355*0b57cec5SDimitry Andric case IC_EVEX_L2_W_OPSIZE: 356*0b57cec5SDimitry Andric return false; 357*0b57cec5SDimitry Andric case IC_EVEX_L2_W_K: 358*0b57cec5SDimitry Andric case IC_EVEX_L2_W_XS_K: 359*0b57cec5SDimitry Andric case IC_EVEX_L2_W_XD_K: 360*0b57cec5SDimitry Andric case IC_EVEX_L2_W_OPSIZE_K: 361*0b57cec5SDimitry Andric return false; 362*0b57cec5SDimitry Andric case IC_EVEX_L2_W_KZ: 363*0b57cec5SDimitry Andric case IC_EVEX_L2_W_XS_KZ: 364*0b57cec5SDimitry Andric case IC_EVEX_L2_W_XD_KZ: 365*0b57cec5SDimitry Andric case IC_EVEX_L2_W_OPSIZE_KZ: 366*0b57cec5SDimitry Andric return false; 367*0b57cec5SDimitry Andric case IC_EVEX_B: 368*0b57cec5SDimitry Andric return (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_B)) || 369*0b57cec5SDimitry Andric (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_B)) || 370*0b57cec5SDimitry Andric (VEX_WIG && inheritsFrom(child, IC_EVEX_W_B)) || 371*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_EVEX_L_B)) || 372*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_B)); 373*0b57cec5SDimitry Andric case IC_EVEX_XS_B: 374*0b57cec5SDimitry Andric return (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_XS_B)) || 375*0b57cec5SDimitry Andric (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_XS_B)) || 376*0b57cec5SDimitry Andric (VEX_WIG && inheritsFrom(child, IC_EVEX_W_XS_B)) || 377*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_EVEX_L_XS_B)) || 378*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_XS_B)); 379*0b57cec5SDimitry Andric case IC_EVEX_XD_B: 380*0b57cec5SDimitry Andric return (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_XD_B)) || 381*0b57cec5SDimitry Andric (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_XD_B)) || 382*0b57cec5SDimitry Andric (VEX_WIG && inheritsFrom(child, IC_EVEX_W_XD_B)) || 383*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_EVEX_L_XD_B)) || 384*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_XD_B)); 385*0b57cec5SDimitry Andric case IC_EVEX_OPSIZE_B: 386*0b57cec5SDimitry Andric return (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_OPSIZE_B)) || 387*0b57cec5SDimitry Andric (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_OPSIZE_B)) || 388*0b57cec5SDimitry Andric (VEX_WIG && inheritsFrom(child, IC_EVEX_W_OPSIZE_B)) || 389*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_EVEX_L_OPSIZE_B)) || 390*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_OPSIZE_B)); 391*0b57cec5SDimitry Andric case IC_EVEX_K_B: 392*0b57cec5SDimitry Andric return (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_K_B)) || 393*0b57cec5SDimitry Andric (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_K_B)) || 394*0b57cec5SDimitry Andric (VEX_WIG && inheritsFrom(child, IC_EVEX_W_K_B)) || 395*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_EVEX_L_K_B)) || 396*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_K_B)); 397*0b57cec5SDimitry Andric case IC_EVEX_XS_K_B: 398*0b57cec5SDimitry Andric return (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_XS_K_B)) || 399*0b57cec5SDimitry Andric (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_XS_K_B)) || 400*0b57cec5SDimitry Andric (VEX_WIG && inheritsFrom(child, IC_EVEX_W_XS_K_B)) || 401*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_EVEX_L_XS_K_B)) || 402*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_XS_K_B)); 403*0b57cec5SDimitry Andric case IC_EVEX_XD_K_B: 404*0b57cec5SDimitry Andric return (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_XD_K_B)) || 405*0b57cec5SDimitry Andric (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_XD_K_B)) || 406*0b57cec5SDimitry Andric (VEX_WIG && inheritsFrom(child, IC_EVEX_W_XD_K_B)) || 407*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_EVEX_L_XD_K_B)) || 408*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_XD_K_B)); 409*0b57cec5SDimitry Andric case IC_EVEX_OPSIZE_K_B: 410*0b57cec5SDimitry Andric return (VEX_LIG && VEX_WIG && 411*0b57cec5SDimitry Andric inheritsFrom(child, IC_EVEX_L_W_OPSIZE_K_B)) || 412*0b57cec5SDimitry Andric (VEX_LIG && VEX_WIG && 413*0b57cec5SDimitry Andric inheritsFrom(child, IC_EVEX_L2_W_OPSIZE_K_B)) || 414*0b57cec5SDimitry Andric (VEX_WIG && inheritsFrom(child, IC_EVEX_W_OPSIZE_K_B)) || 415*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_EVEX_L_OPSIZE_K_B)) || 416*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_OPSIZE_K_B)); 417*0b57cec5SDimitry Andric case IC_EVEX_KZ_B: 418*0b57cec5SDimitry Andric return (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_KZ_B)) || 419*0b57cec5SDimitry Andric (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_KZ_B)) || 420*0b57cec5SDimitry Andric (VEX_WIG && inheritsFrom(child, IC_EVEX_W_KZ_B)) || 421*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_EVEX_L_KZ_B)) || 422*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_KZ_B)); 423*0b57cec5SDimitry Andric case IC_EVEX_XS_KZ_B: 424*0b57cec5SDimitry Andric return (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_XS_KZ_B)) || 425*0b57cec5SDimitry Andric (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_XS_KZ_B)) || 426*0b57cec5SDimitry Andric (VEX_WIG && inheritsFrom(child, IC_EVEX_W_XS_KZ_B)) || 427*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_EVEX_L_XS_KZ_B)) || 428*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_XS_KZ_B)); 429*0b57cec5SDimitry Andric case IC_EVEX_XD_KZ_B: 430*0b57cec5SDimitry Andric return (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_XD_KZ_B)) || 431*0b57cec5SDimitry Andric (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_XD_KZ_B)) || 432*0b57cec5SDimitry Andric (VEX_WIG && inheritsFrom(child, IC_EVEX_W_XD_KZ_B)) || 433*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_EVEX_L_XD_KZ_B)) || 434*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_XD_KZ_B)); 435*0b57cec5SDimitry Andric case IC_EVEX_OPSIZE_KZ_B: 436*0b57cec5SDimitry Andric return (VEX_LIG && VEX_WIG && 437*0b57cec5SDimitry Andric inheritsFrom(child, IC_EVEX_L_W_OPSIZE_KZ_B)) || 438*0b57cec5SDimitry Andric (VEX_LIG && VEX_WIG && 439*0b57cec5SDimitry Andric inheritsFrom(child, IC_EVEX_L2_W_OPSIZE_KZ_B)) || 440*0b57cec5SDimitry Andric (VEX_WIG && inheritsFrom(child, IC_EVEX_W_OPSIZE_KZ_B)) || 441*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_EVEX_L_OPSIZE_KZ_B)) || 442*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_OPSIZE_KZ_B)); 443*0b57cec5SDimitry Andric case IC_EVEX_W_B: 444*0b57cec5SDimitry Andric return (VEX_LIG && inheritsFrom(child, IC_EVEX_L_W_B)) || 445*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_W_B)); 446*0b57cec5SDimitry Andric case IC_EVEX_W_XS_B: 447*0b57cec5SDimitry Andric return (VEX_LIG && inheritsFrom(child, IC_EVEX_L_W_XS_B)) || 448*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_W_XS_B)); 449*0b57cec5SDimitry Andric case IC_EVEX_W_XD_B: 450*0b57cec5SDimitry Andric return (VEX_LIG && inheritsFrom(child, IC_EVEX_L_W_XD_B)) || 451*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_W_XD_B)); 452*0b57cec5SDimitry Andric case IC_EVEX_W_OPSIZE_B: 453*0b57cec5SDimitry Andric return (VEX_LIG && inheritsFrom(child, IC_EVEX_L_W_OPSIZE_B)) || 454*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_W_OPSIZE_B)); 455*0b57cec5SDimitry Andric case IC_EVEX_W_K_B: 456*0b57cec5SDimitry Andric return (VEX_LIG && inheritsFrom(child, IC_EVEX_L_W_K_B)) || 457*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_W_K_B)); 458*0b57cec5SDimitry Andric case IC_EVEX_W_XS_K_B: 459*0b57cec5SDimitry Andric return (VEX_LIG && inheritsFrom(child, IC_EVEX_L_W_XS_K_B)) || 460*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_W_XS_K_B)); 461*0b57cec5SDimitry Andric case IC_EVEX_W_XD_K_B: 462*0b57cec5SDimitry Andric return (VEX_LIG && inheritsFrom(child, IC_EVEX_L_W_XD_K_B)) || 463*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_W_XD_K_B)); 464*0b57cec5SDimitry Andric case IC_EVEX_W_OPSIZE_K_B: 465*0b57cec5SDimitry Andric return (VEX_LIG && inheritsFrom(child, IC_EVEX_L_W_OPSIZE_K_B)) || 466*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_W_OPSIZE_K_B)); 467*0b57cec5SDimitry Andric case IC_EVEX_W_KZ_B: 468*0b57cec5SDimitry Andric return (VEX_LIG && inheritsFrom(child, IC_EVEX_L_W_KZ_B)) || 469*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_W_KZ_B)); 470*0b57cec5SDimitry Andric case IC_EVEX_W_XS_KZ_B: 471*0b57cec5SDimitry Andric return (VEX_LIG && inheritsFrom(child, IC_EVEX_L_W_XS_KZ_B)) || 472*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_W_XS_KZ_B)); 473*0b57cec5SDimitry Andric case IC_EVEX_W_XD_KZ_B: 474*0b57cec5SDimitry Andric return (VEX_LIG && inheritsFrom(child, IC_EVEX_L_W_XD_KZ_B)) || 475*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_W_XD_KZ_B)); 476*0b57cec5SDimitry Andric case IC_EVEX_W_OPSIZE_KZ_B: 477*0b57cec5SDimitry Andric return (VEX_LIG && inheritsFrom(child, IC_EVEX_L_W_OPSIZE_KZ_B)) || 478*0b57cec5SDimitry Andric (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_W_OPSIZE_KZ_B)); 479*0b57cec5SDimitry Andric case IC_EVEX_L_B: 480*0b57cec5SDimitry Andric return VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_B); 481*0b57cec5SDimitry Andric case IC_EVEX_L_XS_B: 482*0b57cec5SDimitry Andric return VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_XS_B); 483*0b57cec5SDimitry Andric case IC_EVEX_L_XD_B: 484*0b57cec5SDimitry Andric return VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_XD_B); 485*0b57cec5SDimitry Andric case IC_EVEX_L_OPSIZE_B: 486*0b57cec5SDimitry Andric return VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_OPSIZE_B); 487*0b57cec5SDimitry Andric case IC_EVEX_L_K_B: 488*0b57cec5SDimitry Andric return VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_K_B); 489*0b57cec5SDimitry Andric case IC_EVEX_L_XS_K_B: 490*0b57cec5SDimitry Andric return VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_XS_K_B); 491*0b57cec5SDimitry Andric case IC_EVEX_L_XD_K_B: 492*0b57cec5SDimitry Andric return VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_XD_K_B); 493*0b57cec5SDimitry Andric case IC_EVEX_L_OPSIZE_K_B: 494*0b57cec5SDimitry Andric return VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_OPSIZE_K_B); 495*0b57cec5SDimitry Andric case IC_EVEX_L_KZ_B: 496*0b57cec5SDimitry Andric return VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_KZ_B); 497*0b57cec5SDimitry Andric case IC_EVEX_L_XS_KZ_B: 498*0b57cec5SDimitry Andric return VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_XS_KZ_B); 499*0b57cec5SDimitry Andric case IC_EVEX_L_XD_KZ_B: 500*0b57cec5SDimitry Andric return VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_XD_KZ_B); 501*0b57cec5SDimitry Andric case IC_EVEX_L_OPSIZE_KZ_B: 502*0b57cec5SDimitry Andric return VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_OPSIZE_KZ_B); 503*0b57cec5SDimitry Andric case IC_EVEX_L_W_B: 504*0b57cec5SDimitry Andric case IC_EVEX_L_W_XS_B: 505*0b57cec5SDimitry Andric case IC_EVEX_L_W_XD_B: 506*0b57cec5SDimitry Andric case IC_EVEX_L_W_OPSIZE_B: 507*0b57cec5SDimitry Andric return false; 508*0b57cec5SDimitry Andric case IC_EVEX_L_W_K_B: 509*0b57cec5SDimitry Andric case IC_EVEX_L_W_XS_K_B: 510*0b57cec5SDimitry Andric case IC_EVEX_L_W_XD_K_B: 511*0b57cec5SDimitry Andric case IC_EVEX_L_W_OPSIZE_K_B: 512*0b57cec5SDimitry Andric return false; 513*0b57cec5SDimitry Andric case IC_EVEX_L_W_KZ_B: 514*0b57cec5SDimitry Andric case IC_EVEX_L_W_XS_KZ_B: 515*0b57cec5SDimitry Andric case IC_EVEX_L_W_XD_KZ_B: 516*0b57cec5SDimitry Andric case IC_EVEX_L_W_OPSIZE_KZ_B: 517*0b57cec5SDimitry Andric return false; 518*0b57cec5SDimitry Andric case IC_EVEX_L2_B: 519*0b57cec5SDimitry Andric return VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_B); 520*0b57cec5SDimitry Andric case IC_EVEX_L2_XS_B: 521*0b57cec5SDimitry Andric return VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_XS_B); 522*0b57cec5SDimitry Andric case IC_EVEX_L2_XD_B: 523*0b57cec5SDimitry Andric return VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_XD_B); 524*0b57cec5SDimitry Andric case IC_EVEX_L2_OPSIZE_B: 525*0b57cec5SDimitry Andric return VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_OPSIZE_B); 526*0b57cec5SDimitry Andric case IC_EVEX_L2_K_B: 527*0b57cec5SDimitry Andric return VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_K_B); 528*0b57cec5SDimitry Andric case IC_EVEX_L2_XS_K_B: 529*0b57cec5SDimitry Andric return VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_XS_K_B); 530*0b57cec5SDimitry Andric case IC_EVEX_L2_XD_K_B: 531*0b57cec5SDimitry Andric return VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_XD_K_B); 532*0b57cec5SDimitry Andric case IC_EVEX_L2_OPSIZE_K_B: 533*0b57cec5SDimitry Andric return VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_OPSIZE_K_B); 534*0b57cec5SDimitry Andric case IC_EVEX_L2_KZ_B: 535*0b57cec5SDimitry Andric return VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_KZ_B); 536*0b57cec5SDimitry Andric case IC_EVEX_L2_XS_KZ_B: 537*0b57cec5SDimitry Andric return VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_XS_KZ_B); 538*0b57cec5SDimitry Andric case IC_EVEX_L2_XD_KZ_B: 539*0b57cec5SDimitry Andric return VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_XD_KZ_B); 540*0b57cec5SDimitry Andric case IC_EVEX_L2_OPSIZE_KZ_B: 541*0b57cec5SDimitry Andric return VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_OPSIZE_KZ_B); 542*0b57cec5SDimitry Andric case IC_EVEX_L2_W_B: 543*0b57cec5SDimitry Andric case IC_EVEX_L2_W_XS_B: 544*0b57cec5SDimitry Andric case IC_EVEX_L2_W_XD_B: 545*0b57cec5SDimitry Andric case IC_EVEX_L2_W_OPSIZE_B: 546*0b57cec5SDimitry Andric return false; 547*0b57cec5SDimitry Andric case IC_EVEX_L2_W_K_B: 548*0b57cec5SDimitry Andric case IC_EVEX_L2_W_XS_K_B: 549*0b57cec5SDimitry Andric case IC_EVEX_L2_W_XD_K_B: 550*0b57cec5SDimitry Andric case IC_EVEX_L2_W_OPSIZE_K_B: 551*0b57cec5SDimitry Andric return false; 552*0b57cec5SDimitry Andric case IC_EVEX_L2_W_KZ_B: 553*0b57cec5SDimitry Andric case IC_EVEX_L2_W_XS_KZ_B: 554*0b57cec5SDimitry Andric case IC_EVEX_L2_W_XD_KZ_B: 555*0b57cec5SDimitry Andric case IC_EVEX_L2_W_OPSIZE_KZ_B: 556*0b57cec5SDimitry Andric return false; 557*0b57cec5SDimitry Andric default: 558*0b57cec5SDimitry Andric errs() << "Unknown instruction class: " << 559*0b57cec5SDimitry Andric stringForContext((InstructionContext)parent) << "\n"; 560*0b57cec5SDimitry Andric llvm_unreachable("Unknown instruction class"); 561*0b57cec5SDimitry Andric } 562*0b57cec5SDimitry Andric } 563*0b57cec5SDimitry Andric 564*0b57cec5SDimitry Andric /// outranks - Indicates whether, if an instruction has two different applicable 565*0b57cec5SDimitry Andric /// classes, which class should be preferred when performing decode. This 566*0b57cec5SDimitry Andric /// imposes a total ordering (ties are resolved toward "lower") 567*0b57cec5SDimitry Andric /// 568*0b57cec5SDimitry Andric /// @param upper - The class that may be preferable 569*0b57cec5SDimitry Andric /// @param lower - The class that may be less preferable 570*0b57cec5SDimitry Andric /// @return - True if upper is to be preferred, false otherwise. 571*0b57cec5SDimitry Andric static inline bool outranks(InstructionContext upper, 572*0b57cec5SDimitry Andric InstructionContext lower) { 573*0b57cec5SDimitry Andric assert(upper < IC_max); 574*0b57cec5SDimitry Andric assert(lower < IC_max); 575*0b57cec5SDimitry Andric 576*0b57cec5SDimitry Andric #define ENUM_ENTRY(n, r, d) r, 577*0b57cec5SDimitry Andric #define ENUM_ENTRY_K_B(n, r, d) ENUM_ENTRY(n, r, d) \ 578*0b57cec5SDimitry Andric ENUM_ENTRY(n##_K_B, r, d) ENUM_ENTRY(n##_KZ_B, r, d) \ 579*0b57cec5SDimitry Andric ENUM_ENTRY(n##_KZ, r, d) ENUM_ENTRY(n##_K, r, d) ENUM_ENTRY(n##_B, r, d) 580*0b57cec5SDimitry Andric static int ranks[IC_max] = { 581*0b57cec5SDimitry Andric INSTRUCTION_CONTEXTS 582*0b57cec5SDimitry Andric }; 583*0b57cec5SDimitry Andric #undef ENUM_ENTRY 584*0b57cec5SDimitry Andric #undef ENUM_ENTRY_K_B 585*0b57cec5SDimitry Andric 586*0b57cec5SDimitry Andric return (ranks[upper] > ranks[lower]); 587*0b57cec5SDimitry Andric } 588*0b57cec5SDimitry Andric 589*0b57cec5SDimitry Andric /// getDecisionType - Determines whether a ModRM decision with 255 entries can 590*0b57cec5SDimitry Andric /// be compacted by eliminating redundant information. 591*0b57cec5SDimitry Andric /// 592*0b57cec5SDimitry Andric /// @param decision - The decision to be compacted. 593*0b57cec5SDimitry Andric /// @return - The compactest available representation for the decision. 594*0b57cec5SDimitry Andric static ModRMDecisionType getDecisionType(ModRMDecision &decision) { 595*0b57cec5SDimitry Andric bool satisfiesOneEntry = true; 596*0b57cec5SDimitry Andric bool satisfiesSplitRM = true; 597*0b57cec5SDimitry Andric bool satisfiesSplitReg = true; 598*0b57cec5SDimitry Andric bool satisfiesSplitMisc = true; 599*0b57cec5SDimitry Andric 600*0b57cec5SDimitry Andric for (unsigned index = 0; index < 256; ++index) { 601*0b57cec5SDimitry Andric if (decision.instructionIDs[index] != decision.instructionIDs[0]) 602*0b57cec5SDimitry Andric satisfiesOneEntry = false; 603*0b57cec5SDimitry Andric 604*0b57cec5SDimitry Andric if (((index & 0xc0) == 0xc0) && 605*0b57cec5SDimitry Andric (decision.instructionIDs[index] != decision.instructionIDs[0xc0])) 606*0b57cec5SDimitry Andric satisfiesSplitRM = false; 607*0b57cec5SDimitry Andric 608*0b57cec5SDimitry Andric if (((index & 0xc0) != 0xc0) && 609*0b57cec5SDimitry Andric (decision.instructionIDs[index] != decision.instructionIDs[0x00])) 610*0b57cec5SDimitry Andric satisfiesSplitRM = false; 611*0b57cec5SDimitry Andric 612*0b57cec5SDimitry Andric if (((index & 0xc0) == 0xc0) && 613*0b57cec5SDimitry Andric (decision.instructionIDs[index] != decision.instructionIDs[index&0xf8])) 614*0b57cec5SDimitry Andric satisfiesSplitReg = false; 615*0b57cec5SDimitry Andric 616*0b57cec5SDimitry Andric if (((index & 0xc0) != 0xc0) && 617*0b57cec5SDimitry Andric (decision.instructionIDs[index] != decision.instructionIDs[index&0x38])) 618*0b57cec5SDimitry Andric satisfiesSplitMisc = false; 619*0b57cec5SDimitry Andric } 620*0b57cec5SDimitry Andric 621*0b57cec5SDimitry Andric if (satisfiesOneEntry) 622*0b57cec5SDimitry Andric return MODRM_ONEENTRY; 623*0b57cec5SDimitry Andric 624*0b57cec5SDimitry Andric if (satisfiesSplitRM) 625*0b57cec5SDimitry Andric return MODRM_SPLITRM; 626*0b57cec5SDimitry Andric 627*0b57cec5SDimitry Andric if (satisfiesSplitReg && satisfiesSplitMisc) 628*0b57cec5SDimitry Andric return MODRM_SPLITREG; 629*0b57cec5SDimitry Andric 630*0b57cec5SDimitry Andric if (satisfiesSplitMisc) 631*0b57cec5SDimitry Andric return MODRM_SPLITMISC; 632*0b57cec5SDimitry Andric 633*0b57cec5SDimitry Andric return MODRM_FULL; 634*0b57cec5SDimitry Andric } 635*0b57cec5SDimitry Andric 636*0b57cec5SDimitry Andric /// stringForDecisionType - Returns a statically-allocated string corresponding 637*0b57cec5SDimitry Andric /// to a particular decision type. 638*0b57cec5SDimitry Andric /// 639*0b57cec5SDimitry Andric /// @param dt - The decision type. 640*0b57cec5SDimitry Andric /// @return - A pointer to the statically-allocated string (e.g., 641*0b57cec5SDimitry Andric /// "MODRM_ONEENTRY" for MODRM_ONEENTRY). 642*0b57cec5SDimitry Andric static const char* stringForDecisionType(ModRMDecisionType dt) { 643*0b57cec5SDimitry Andric #define ENUM_ENTRY(n) case n: return #n; 644*0b57cec5SDimitry Andric switch (dt) { 645*0b57cec5SDimitry Andric default: 646*0b57cec5SDimitry Andric llvm_unreachable("Unknown decision type"); 647*0b57cec5SDimitry Andric MODRMTYPES 648*0b57cec5SDimitry Andric }; 649*0b57cec5SDimitry Andric #undef ENUM_ENTRY 650*0b57cec5SDimitry Andric } 651*0b57cec5SDimitry Andric 652*0b57cec5SDimitry Andric DisassemblerTables::DisassemblerTables() { 653*0b57cec5SDimitry Andric for (unsigned i = 0; i < array_lengthof(Tables); i++) 654*0b57cec5SDimitry Andric Tables[i] = llvm::make_unique<ContextDecision>(); 655*0b57cec5SDimitry Andric 656*0b57cec5SDimitry Andric HasConflicts = false; 657*0b57cec5SDimitry Andric } 658*0b57cec5SDimitry Andric 659*0b57cec5SDimitry Andric DisassemblerTables::~DisassemblerTables() { 660*0b57cec5SDimitry Andric } 661*0b57cec5SDimitry Andric 662*0b57cec5SDimitry Andric void DisassemblerTables::emitModRMDecision(raw_ostream &o1, raw_ostream &o2, 663*0b57cec5SDimitry Andric unsigned &i1, unsigned &i2, 664*0b57cec5SDimitry Andric unsigned &ModRMTableNum, 665*0b57cec5SDimitry Andric ModRMDecision &decision) const { 666*0b57cec5SDimitry Andric static uint32_t sTableNumber = 0; 667*0b57cec5SDimitry Andric static uint32_t sEntryNumber = 1; 668*0b57cec5SDimitry Andric ModRMDecisionType dt = getDecisionType(decision); 669*0b57cec5SDimitry Andric 670*0b57cec5SDimitry Andric if (dt == MODRM_ONEENTRY && decision.instructionIDs[0] == 0) 671*0b57cec5SDimitry Andric { 672*0b57cec5SDimitry Andric o2.indent(i2) << "{ /* ModRMDecision */" << "\n"; 673*0b57cec5SDimitry Andric i2++; 674*0b57cec5SDimitry Andric 675*0b57cec5SDimitry Andric o2.indent(i2) << stringForDecisionType(dt) << "," << "\n"; 676*0b57cec5SDimitry Andric o2.indent(i2) << 0 << " /* EmptyTable */\n"; 677*0b57cec5SDimitry Andric 678*0b57cec5SDimitry Andric i2--; 679*0b57cec5SDimitry Andric o2.indent(i2) << "}"; 680*0b57cec5SDimitry Andric return; 681*0b57cec5SDimitry Andric } 682*0b57cec5SDimitry Andric 683*0b57cec5SDimitry Andric std::vector<unsigned> ModRMDecision; 684*0b57cec5SDimitry Andric 685*0b57cec5SDimitry Andric switch (dt) { 686*0b57cec5SDimitry Andric default: 687*0b57cec5SDimitry Andric llvm_unreachable("Unknown decision type"); 688*0b57cec5SDimitry Andric case MODRM_ONEENTRY: 689*0b57cec5SDimitry Andric ModRMDecision.push_back(decision.instructionIDs[0]); 690*0b57cec5SDimitry Andric break; 691*0b57cec5SDimitry Andric case MODRM_SPLITRM: 692*0b57cec5SDimitry Andric ModRMDecision.push_back(decision.instructionIDs[0x00]); 693*0b57cec5SDimitry Andric ModRMDecision.push_back(decision.instructionIDs[0xc0]); 694*0b57cec5SDimitry Andric break; 695*0b57cec5SDimitry Andric case MODRM_SPLITREG: 696*0b57cec5SDimitry Andric for (unsigned index = 0; index < 64; index += 8) 697*0b57cec5SDimitry Andric ModRMDecision.push_back(decision.instructionIDs[index]); 698*0b57cec5SDimitry Andric for (unsigned index = 0xc0; index < 256; index += 8) 699*0b57cec5SDimitry Andric ModRMDecision.push_back(decision.instructionIDs[index]); 700*0b57cec5SDimitry Andric break; 701*0b57cec5SDimitry Andric case MODRM_SPLITMISC: 702*0b57cec5SDimitry Andric for (unsigned index = 0; index < 64; index += 8) 703*0b57cec5SDimitry Andric ModRMDecision.push_back(decision.instructionIDs[index]); 704*0b57cec5SDimitry Andric for (unsigned index = 0xc0; index < 256; ++index) 705*0b57cec5SDimitry Andric ModRMDecision.push_back(decision.instructionIDs[index]); 706*0b57cec5SDimitry Andric break; 707*0b57cec5SDimitry Andric case MODRM_FULL: 708*0b57cec5SDimitry Andric for (unsigned index = 0; index < 256; ++index) 709*0b57cec5SDimitry Andric ModRMDecision.push_back(decision.instructionIDs[index]); 710*0b57cec5SDimitry Andric break; 711*0b57cec5SDimitry Andric } 712*0b57cec5SDimitry Andric 713*0b57cec5SDimitry Andric unsigned &EntryNumber = ModRMTable[ModRMDecision]; 714*0b57cec5SDimitry Andric if (EntryNumber == 0) { 715*0b57cec5SDimitry Andric EntryNumber = ModRMTableNum; 716*0b57cec5SDimitry Andric 717*0b57cec5SDimitry Andric ModRMTableNum += ModRMDecision.size(); 718*0b57cec5SDimitry Andric o1 << "/* Table" << EntryNumber << " */\n"; 719*0b57cec5SDimitry Andric i1++; 720*0b57cec5SDimitry Andric for (std::vector<unsigned>::const_iterator I = ModRMDecision.begin(), 721*0b57cec5SDimitry Andric E = ModRMDecision.end(); I != E; ++I) { 722*0b57cec5SDimitry Andric o1.indent(i1 * 2) << format("0x%hx", *I) << ", /* " 723*0b57cec5SDimitry Andric << InstructionSpecifiers[*I].name << " */\n"; 724*0b57cec5SDimitry Andric } 725*0b57cec5SDimitry Andric i1--; 726*0b57cec5SDimitry Andric } 727*0b57cec5SDimitry Andric 728*0b57cec5SDimitry Andric o2.indent(i2) << "{ /* struct ModRMDecision */" << "\n"; 729*0b57cec5SDimitry Andric i2++; 730*0b57cec5SDimitry Andric 731*0b57cec5SDimitry Andric o2.indent(i2) << stringForDecisionType(dt) << "," << "\n"; 732*0b57cec5SDimitry Andric o2.indent(i2) << EntryNumber << " /* Table" << EntryNumber << " */\n"; 733*0b57cec5SDimitry Andric 734*0b57cec5SDimitry Andric i2--; 735*0b57cec5SDimitry Andric o2.indent(i2) << "}"; 736*0b57cec5SDimitry Andric 737*0b57cec5SDimitry Andric switch (dt) { 738*0b57cec5SDimitry Andric default: 739*0b57cec5SDimitry Andric llvm_unreachable("Unknown decision type"); 740*0b57cec5SDimitry Andric case MODRM_ONEENTRY: 741*0b57cec5SDimitry Andric sEntryNumber += 1; 742*0b57cec5SDimitry Andric break; 743*0b57cec5SDimitry Andric case MODRM_SPLITRM: 744*0b57cec5SDimitry Andric sEntryNumber += 2; 745*0b57cec5SDimitry Andric break; 746*0b57cec5SDimitry Andric case MODRM_SPLITREG: 747*0b57cec5SDimitry Andric sEntryNumber += 16; 748*0b57cec5SDimitry Andric break; 749*0b57cec5SDimitry Andric case MODRM_SPLITMISC: 750*0b57cec5SDimitry Andric sEntryNumber += 8 + 64; 751*0b57cec5SDimitry Andric break; 752*0b57cec5SDimitry Andric case MODRM_FULL: 753*0b57cec5SDimitry Andric sEntryNumber += 256; 754*0b57cec5SDimitry Andric break; 755*0b57cec5SDimitry Andric } 756*0b57cec5SDimitry Andric 757*0b57cec5SDimitry Andric // We assume that the index can fit into uint16_t. 758*0b57cec5SDimitry Andric assert(sEntryNumber < 65536U && 759*0b57cec5SDimitry Andric "Index into ModRMDecision is too large for uint16_t!"); 760*0b57cec5SDimitry Andric 761*0b57cec5SDimitry Andric ++sTableNumber; 762*0b57cec5SDimitry Andric } 763*0b57cec5SDimitry Andric 764*0b57cec5SDimitry Andric void DisassemblerTables::emitOpcodeDecision(raw_ostream &o1, raw_ostream &o2, 765*0b57cec5SDimitry Andric unsigned &i1, unsigned &i2, 766*0b57cec5SDimitry Andric unsigned &ModRMTableNum, 767*0b57cec5SDimitry Andric OpcodeDecision &decision) const { 768*0b57cec5SDimitry Andric o2.indent(i2) << "{ /* struct OpcodeDecision */" << "\n"; 769*0b57cec5SDimitry Andric i2++; 770*0b57cec5SDimitry Andric o2.indent(i2) << "{" << "\n"; 771*0b57cec5SDimitry Andric i2++; 772*0b57cec5SDimitry Andric 773*0b57cec5SDimitry Andric for (unsigned index = 0; index < 256; ++index) { 774*0b57cec5SDimitry Andric o2.indent(i2); 775*0b57cec5SDimitry Andric 776*0b57cec5SDimitry Andric o2 << "/* 0x" << format("%02hhx", index) << " */" << "\n"; 777*0b57cec5SDimitry Andric 778*0b57cec5SDimitry Andric emitModRMDecision(o1, o2, i1, i2, ModRMTableNum, 779*0b57cec5SDimitry Andric decision.modRMDecisions[index]); 780*0b57cec5SDimitry Andric 781*0b57cec5SDimitry Andric if (index < 255) 782*0b57cec5SDimitry Andric o2 << ","; 783*0b57cec5SDimitry Andric 784*0b57cec5SDimitry Andric o2 << "\n"; 785*0b57cec5SDimitry Andric } 786*0b57cec5SDimitry Andric 787*0b57cec5SDimitry Andric i2--; 788*0b57cec5SDimitry Andric o2.indent(i2) << "}" << "\n"; 789*0b57cec5SDimitry Andric i2--; 790*0b57cec5SDimitry Andric o2.indent(i2) << "}" << "\n"; 791*0b57cec5SDimitry Andric } 792*0b57cec5SDimitry Andric 793*0b57cec5SDimitry Andric void DisassemblerTables::emitContextDecision(raw_ostream &o1, raw_ostream &o2, 794*0b57cec5SDimitry Andric unsigned &i1, unsigned &i2, 795*0b57cec5SDimitry Andric unsigned &ModRMTableNum, 796*0b57cec5SDimitry Andric ContextDecision &decision, 797*0b57cec5SDimitry Andric const char* name) const { 798*0b57cec5SDimitry Andric o2.indent(i2) << "static const struct ContextDecision " << name << " = {\n"; 799*0b57cec5SDimitry Andric i2++; 800*0b57cec5SDimitry Andric o2.indent(i2) << "{ /* opcodeDecisions */" << "\n"; 801*0b57cec5SDimitry Andric i2++; 802*0b57cec5SDimitry Andric 803*0b57cec5SDimitry Andric for (unsigned index = 0; index < IC_max; ++index) { 804*0b57cec5SDimitry Andric o2.indent(i2) << "/* "; 805*0b57cec5SDimitry Andric o2 << stringForContext((InstructionContext)index); 806*0b57cec5SDimitry Andric o2 << " */"; 807*0b57cec5SDimitry Andric o2 << "\n"; 808*0b57cec5SDimitry Andric 809*0b57cec5SDimitry Andric emitOpcodeDecision(o1, o2, i1, i2, ModRMTableNum, 810*0b57cec5SDimitry Andric decision.opcodeDecisions[index]); 811*0b57cec5SDimitry Andric 812*0b57cec5SDimitry Andric if (index + 1 < IC_max) 813*0b57cec5SDimitry Andric o2 << ", "; 814*0b57cec5SDimitry Andric } 815*0b57cec5SDimitry Andric 816*0b57cec5SDimitry Andric i2--; 817*0b57cec5SDimitry Andric o2.indent(i2) << "}" << "\n"; 818*0b57cec5SDimitry Andric i2--; 819*0b57cec5SDimitry Andric o2.indent(i2) << "};" << "\n"; 820*0b57cec5SDimitry Andric } 821*0b57cec5SDimitry Andric 822*0b57cec5SDimitry Andric void DisassemblerTables::emitInstructionInfo(raw_ostream &o, 823*0b57cec5SDimitry Andric unsigned &i) const { 824*0b57cec5SDimitry Andric unsigned NumInstructions = InstructionSpecifiers.size(); 825*0b57cec5SDimitry Andric 826*0b57cec5SDimitry Andric o << "static const struct OperandSpecifier x86OperandSets[][" 827*0b57cec5SDimitry Andric << X86_MAX_OPERANDS << "] = {\n"; 828*0b57cec5SDimitry Andric 829*0b57cec5SDimitry Andric typedef SmallVector<std::pair<OperandEncoding, OperandType>, 830*0b57cec5SDimitry Andric X86_MAX_OPERANDS> OperandListTy; 831*0b57cec5SDimitry Andric std::map<OperandListTy, unsigned> OperandSets; 832*0b57cec5SDimitry Andric 833*0b57cec5SDimitry Andric unsigned OperandSetNum = 0; 834*0b57cec5SDimitry Andric for (unsigned Index = 0; Index < NumInstructions; ++Index) { 835*0b57cec5SDimitry Andric OperandListTy OperandList; 836*0b57cec5SDimitry Andric 837*0b57cec5SDimitry Andric for (unsigned OperandIndex = 0; OperandIndex < X86_MAX_OPERANDS; 838*0b57cec5SDimitry Andric ++OperandIndex) { 839*0b57cec5SDimitry Andric OperandEncoding Encoding = (OperandEncoding)InstructionSpecifiers[Index] 840*0b57cec5SDimitry Andric .operands[OperandIndex].encoding; 841*0b57cec5SDimitry Andric OperandType Type = (OperandType)InstructionSpecifiers[Index] 842*0b57cec5SDimitry Andric .operands[OperandIndex].type; 843*0b57cec5SDimitry Andric OperandList.push_back(std::make_pair(Encoding, Type)); 844*0b57cec5SDimitry Andric } 845*0b57cec5SDimitry Andric unsigned &N = OperandSets[OperandList]; 846*0b57cec5SDimitry Andric if (N != 0) continue; 847*0b57cec5SDimitry Andric 848*0b57cec5SDimitry Andric N = ++OperandSetNum; 849*0b57cec5SDimitry Andric 850*0b57cec5SDimitry Andric o << " { /* " << (OperandSetNum - 1) << " */\n"; 851*0b57cec5SDimitry Andric for (unsigned i = 0, e = OperandList.size(); i != e; ++i) { 852*0b57cec5SDimitry Andric const char *Encoding = stringForOperandEncoding(OperandList[i].first); 853*0b57cec5SDimitry Andric const char *Type = stringForOperandType(OperandList[i].second); 854*0b57cec5SDimitry Andric o << " { " << Encoding << ", " << Type << " },\n"; 855*0b57cec5SDimitry Andric } 856*0b57cec5SDimitry Andric o << " },\n"; 857*0b57cec5SDimitry Andric } 858*0b57cec5SDimitry Andric o << "};" << "\n\n"; 859*0b57cec5SDimitry Andric 860*0b57cec5SDimitry Andric o.indent(i * 2) << "static const struct InstructionSpecifier "; 861*0b57cec5SDimitry Andric o << INSTRUCTIONS_STR "[" << InstructionSpecifiers.size() << "] = {\n"; 862*0b57cec5SDimitry Andric 863*0b57cec5SDimitry Andric i++; 864*0b57cec5SDimitry Andric 865*0b57cec5SDimitry Andric for (unsigned index = 0; index < NumInstructions; ++index) { 866*0b57cec5SDimitry Andric o.indent(i * 2) << "{ /* " << index << " */\n"; 867*0b57cec5SDimitry Andric i++; 868*0b57cec5SDimitry Andric 869*0b57cec5SDimitry Andric OperandListTy OperandList; 870*0b57cec5SDimitry Andric for (unsigned OperandIndex = 0; OperandIndex < X86_MAX_OPERANDS; 871*0b57cec5SDimitry Andric ++OperandIndex) { 872*0b57cec5SDimitry Andric OperandEncoding Encoding = (OperandEncoding)InstructionSpecifiers[index] 873*0b57cec5SDimitry Andric .operands[OperandIndex].encoding; 874*0b57cec5SDimitry Andric OperandType Type = (OperandType)InstructionSpecifiers[index] 875*0b57cec5SDimitry Andric .operands[OperandIndex].type; 876*0b57cec5SDimitry Andric OperandList.push_back(std::make_pair(Encoding, Type)); 877*0b57cec5SDimitry Andric } 878*0b57cec5SDimitry Andric o.indent(i * 2) << (OperandSets[OperandList] - 1) << ",\n"; 879*0b57cec5SDimitry Andric 880*0b57cec5SDimitry Andric o.indent(i * 2) << "/* " << InstructionSpecifiers[index].name << " */\n"; 881*0b57cec5SDimitry Andric 882*0b57cec5SDimitry Andric i--; 883*0b57cec5SDimitry Andric o.indent(i * 2) << "},\n"; 884*0b57cec5SDimitry Andric } 885*0b57cec5SDimitry Andric 886*0b57cec5SDimitry Andric i--; 887*0b57cec5SDimitry Andric o.indent(i * 2) << "};" << "\n"; 888*0b57cec5SDimitry Andric } 889*0b57cec5SDimitry Andric 890*0b57cec5SDimitry Andric void DisassemblerTables::emitContextTable(raw_ostream &o, unsigned &i) const { 891*0b57cec5SDimitry Andric o.indent(i * 2) << "static const uint8_t " CONTEXTS_STR 892*0b57cec5SDimitry Andric "[" << ATTR_max << "] = {\n"; 893*0b57cec5SDimitry Andric i++; 894*0b57cec5SDimitry Andric 895*0b57cec5SDimitry Andric for (unsigned index = 0; index < ATTR_max; ++index) { 896*0b57cec5SDimitry Andric o.indent(i * 2); 897*0b57cec5SDimitry Andric 898*0b57cec5SDimitry Andric if ((index & ATTR_EVEX) || (index & ATTR_VEX) || (index & ATTR_VEXL)) { 899*0b57cec5SDimitry Andric if (index & ATTR_EVEX) 900*0b57cec5SDimitry Andric o << "IC_EVEX"; 901*0b57cec5SDimitry Andric else 902*0b57cec5SDimitry Andric o << "IC_VEX"; 903*0b57cec5SDimitry Andric 904*0b57cec5SDimitry Andric if ((index & ATTR_EVEX) && (index & ATTR_EVEXL2)) 905*0b57cec5SDimitry Andric o << "_L2"; 906*0b57cec5SDimitry Andric else if (index & ATTR_VEXL) 907*0b57cec5SDimitry Andric o << "_L"; 908*0b57cec5SDimitry Andric 909*0b57cec5SDimitry Andric if (index & ATTR_REXW) 910*0b57cec5SDimitry Andric o << "_W"; 911*0b57cec5SDimitry Andric 912*0b57cec5SDimitry Andric if (index & ATTR_OPSIZE) 913*0b57cec5SDimitry Andric o << "_OPSIZE"; 914*0b57cec5SDimitry Andric else if (index & ATTR_XD) 915*0b57cec5SDimitry Andric o << "_XD"; 916*0b57cec5SDimitry Andric else if (index & ATTR_XS) 917*0b57cec5SDimitry Andric o << "_XS"; 918*0b57cec5SDimitry Andric 919*0b57cec5SDimitry Andric if ((index & ATTR_EVEX)) { 920*0b57cec5SDimitry Andric if (index & ATTR_EVEXKZ) 921*0b57cec5SDimitry Andric o << "_KZ"; 922*0b57cec5SDimitry Andric else if (index & ATTR_EVEXK) 923*0b57cec5SDimitry Andric o << "_K"; 924*0b57cec5SDimitry Andric 925*0b57cec5SDimitry Andric if (index & ATTR_EVEXB) 926*0b57cec5SDimitry Andric o << "_B"; 927*0b57cec5SDimitry Andric } 928*0b57cec5SDimitry Andric } 929*0b57cec5SDimitry Andric else if ((index & ATTR_64BIT) && (index & ATTR_REXW) && (index & ATTR_XS)) 930*0b57cec5SDimitry Andric o << "IC_64BIT_REXW_XS"; 931*0b57cec5SDimitry Andric else if ((index & ATTR_64BIT) && (index & ATTR_REXW) && (index & ATTR_XD)) 932*0b57cec5SDimitry Andric o << "IC_64BIT_REXW_XD"; 933*0b57cec5SDimitry Andric else if ((index & ATTR_64BIT) && (index & ATTR_REXW) && 934*0b57cec5SDimitry Andric (index & ATTR_OPSIZE)) 935*0b57cec5SDimitry Andric o << "IC_64BIT_REXW_OPSIZE"; 936*0b57cec5SDimitry Andric else if ((index & ATTR_64BIT) && (index & ATTR_REXW) && 937*0b57cec5SDimitry Andric (index & ATTR_ADSIZE)) 938*0b57cec5SDimitry Andric o << "IC_64BIT_REXW_ADSIZE"; 939*0b57cec5SDimitry Andric else if ((index & ATTR_64BIT) && (index & ATTR_XD) && (index & ATTR_OPSIZE)) 940*0b57cec5SDimitry Andric o << "IC_64BIT_XD_OPSIZE"; 941*0b57cec5SDimitry Andric else if ((index & ATTR_64BIT) && (index & ATTR_XD) && (index & ATTR_ADSIZE)) 942*0b57cec5SDimitry Andric o << "IC_64BIT_XD_ADSIZE"; 943*0b57cec5SDimitry Andric else if ((index & ATTR_64BIT) && (index & ATTR_XS) && (index & ATTR_OPSIZE)) 944*0b57cec5SDimitry Andric o << "IC_64BIT_XS_OPSIZE"; 945*0b57cec5SDimitry Andric else if ((index & ATTR_64BIT) && (index & ATTR_XS) && (index & ATTR_ADSIZE)) 946*0b57cec5SDimitry Andric o << "IC_64BIT_XS_ADSIZE"; 947*0b57cec5SDimitry Andric else if ((index & ATTR_64BIT) && (index & ATTR_XS)) 948*0b57cec5SDimitry Andric o << "IC_64BIT_XS"; 949*0b57cec5SDimitry Andric else if ((index & ATTR_64BIT) && (index & ATTR_XD)) 950*0b57cec5SDimitry Andric o << "IC_64BIT_XD"; 951*0b57cec5SDimitry Andric else if ((index & ATTR_64BIT) && (index & ATTR_OPSIZE) && 952*0b57cec5SDimitry Andric (index & ATTR_ADSIZE)) 953*0b57cec5SDimitry Andric o << "IC_64BIT_OPSIZE_ADSIZE"; 954*0b57cec5SDimitry Andric else if ((index & ATTR_64BIT) && (index & ATTR_OPSIZE)) 955*0b57cec5SDimitry Andric o << "IC_64BIT_OPSIZE"; 956*0b57cec5SDimitry Andric else if ((index & ATTR_64BIT) && (index & ATTR_ADSIZE)) 957*0b57cec5SDimitry Andric o << "IC_64BIT_ADSIZE"; 958*0b57cec5SDimitry Andric else if ((index & ATTR_64BIT) && (index & ATTR_REXW)) 959*0b57cec5SDimitry Andric o << "IC_64BIT_REXW"; 960*0b57cec5SDimitry Andric else if ((index & ATTR_64BIT)) 961*0b57cec5SDimitry Andric o << "IC_64BIT"; 962*0b57cec5SDimitry Andric else if ((index & ATTR_XS) && (index & ATTR_OPSIZE)) 963*0b57cec5SDimitry Andric o << "IC_XS_OPSIZE"; 964*0b57cec5SDimitry Andric else if ((index & ATTR_XD) && (index & ATTR_OPSIZE)) 965*0b57cec5SDimitry Andric o << "IC_XD_OPSIZE"; 966*0b57cec5SDimitry Andric else if ((index & ATTR_XS) && (index & ATTR_ADSIZE)) 967*0b57cec5SDimitry Andric o << "IC_XS_ADSIZE"; 968*0b57cec5SDimitry Andric else if ((index & ATTR_XD) && (index & ATTR_ADSIZE)) 969*0b57cec5SDimitry Andric o << "IC_XD_ADSIZE"; 970*0b57cec5SDimitry Andric else if (index & ATTR_XS) 971*0b57cec5SDimitry Andric o << "IC_XS"; 972*0b57cec5SDimitry Andric else if (index & ATTR_XD) 973*0b57cec5SDimitry Andric o << "IC_XD"; 974*0b57cec5SDimitry Andric else if ((index & ATTR_OPSIZE) && (index & ATTR_ADSIZE)) 975*0b57cec5SDimitry Andric o << "IC_OPSIZE_ADSIZE"; 976*0b57cec5SDimitry Andric else if (index & ATTR_OPSIZE) 977*0b57cec5SDimitry Andric o << "IC_OPSIZE"; 978*0b57cec5SDimitry Andric else if (index & ATTR_ADSIZE) 979*0b57cec5SDimitry Andric o << "IC_ADSIZE"; 980*0b57cec5SDimitry Andric else 981*0b57cec5SDimitry Andric o << "IC"; 982*0b57cec5SDimitry Andric 983*0b57cec5SDimitry Andric o << ", /* " << index << " */"; 984*0b57cec5SDimitry Andric 985*0b57cec5SDimitry Andric o << "\n"; 986*0b57cec5SDimitry Andric } 987*0b57cec5SDimitry Andric 988*0b57cec5SDimitry Andric i--; 989*0b57cec5SDimitry Andric o.indent(i * 2) << "};" << "\n"; 990*0b57cec5SDimitry Andric } 991*0b57cec5SDimitry Andric 992*0b57cec5SDimitry Andric void DisassemblerTables::emitContextDecisions(raw_ostream &o1, raw_ostream &o2, 993*0b57cec5SDimitry Andric unsigned &i1, unsigned &i2, 994*0b57cec5SDimitry Andric unsigned &ModRMTableNum) const { 995*0b57cec5SDimitry Andric emitContextDecision(o1, o2, i1, i2, ModRMTableNum, *Tables[0], ONEBYTE_STR); 996*0b57cec5SDimitry Andric emitContextDecision(o1, o2, i1, i2, ModRMTableNum, *Tables[1], TWOBYTE_STR); 997*0b57cec5SDimitry Andric emitContextDecision(o1, o2, i1, i2, ModRMTableNum, *Tables[2], THREEBYTE38_STR); 998*0b57cec5SDimitry Andric emitContextDecision(o1, o2, i1, i2, ModRMTableNum, *Tables[3], THREEBYTE3A_STR); 999*0b57cec5SDimitry Andric emitContextDecision(o1, o2, i1, i2, ModRMTableNum, *Tables[4], XOP8_MAP_STR); 1000*0b57cec5SDimitry Andric emitContextDecision(o1, o2, i1, i2, ModRMTableNum, *Tables[5], XOP9_MAP_STR); 1001*0b57cec5SDimitry Andric emitContextDecision(o1, o2, i1, i2, ModRMTableNum, *Tables[6], XOPA_MAP_STR); 1002*0b57cec5SDimitry Andric emitContextDecision(o1, o2, i1, i2, ModRMTableNum, *Tables[7], THREEDNOW_MAP_STR); 1003*0b57cec5SDimitry Andric } 1004*0b57cec5SDimitry Andric 1005*0b57cec5SDimitry Andric void DisassemblerTables::emit(raw_ostream &o) const { 1006*0b57cec5SDimitry Andric unsigned i1 = 0; 1007*0b57cec5SDimitry Andric unsigned i2 = 0; 1008*0b57cec5SDimitry Andric 1009*0b57cec5SDimitry Andric std::string s1; 1010*0b57cec5SDimitry Andric std::string s2; 1011*0b57cec5SDimitry Andric 1012*0b57cec5SDimitry Andric raw_string_ostream o1(s1); 1013*0b57cec5SDimitry Andric raw_string_ostream o2(s2); 1014*0b57cec5SDimitry Andric 1015*0b57cec5SDimitry Andric emitInstructionInfo(o, i2); 1016*0b57cec5SDimitry Andric o << "\n"; 1017*0b57cec5SDimitry Andric 1018*0b57cec5SDimitry Andric emitContextTable(o, i2); 1019*0b57cec5SDimitry Andric o << "\n"; 1020*0b57cec5SDimitry Andric 1021*0b57cec5SDimitry Andric unsigned ModRMTableNum = 0; 1022*0b57cec5SDimitry Andric 1023*0b57cec5SDimitry Andric o << "static const InstrUID modRMTable[] = {\n"; 1024*0b57cec5SDimitry Andric i1++; 1025*0b57cec5SDimitry Andric std::vector<unsigned> EmptyTable(1, 0); 1026*0b57cec5SDimitry Andric ModRMTable[EmptyTable] = ModRMTableNum; 1027*0b57cec5SDimitry Andric ModRMTableNum += EmptyTable.size(); 1028*0b57cec5SDimitry Andric o1 << "/* EmptyTable */\n"; 1029*0b57cec5SDimitry Andric o1.indent(i1 * 2) << "0x0,\n"; 1030*0b57cec5SDimitry Andric i1--; 1031*0b57cec5SDimitry Andric emitContextDecisions(o1, o2, i1, i2, ModRMTableNum); 1032*0b57cec5SDimitry Andric 1033*0b57cec5SDimitry Andric o << o1.str(); 1034*0b57cec5SDimitry Andric o << " 0x0\n"; 1035*0b57cec5SDimitry Andric o << "};\n"; 1036*0b57cec5SDimitry Andric o << "\n"; 1037*0b57cec5SDimitry Andric o << o2.str(); 1038*0b57cec5SDimitry Andric o << "\n"; 1039*0b57cec5SDimitry Andric o << "\n"; 1040*0b57cec5SDimitry Andric } 1041*0b57cec5SDimitry Andric 1042*0b57cec5SDimitry Andric void DisassemblerTables::setTableFields(ModRMDecision &decision, 1043*0b57cec5SDimitry Andric const ModRMFilter &filter, 1044*0b57cec5SDimitry Andric InstrUID uid, 1045*0b57cec5SDimitry Andric uint8_t opcode) { 1046*0b57cec5SDimitry Andric for (unsigned index = 0; index < 256; ++index) { 1047*0b57cec5SDimitry Andric if (filter.accepts(index)) { 1048*0b57cec5SDimitry Andric if (decision.instructionIDs[index] == uid) 1049*0b57cec5SDimitry Andric continue; 1050*0b57cec5SDimitry Andric 1051*0b57cec5SDimitry Andric if (decision.instructionIDs[index] != 0) { 1052*0b57cec5SDimitry Andric InstructionSpecifier &newInfo = 1053*0b57cec5SDimitry Andric InstructionSpecifiers[uid]; 1054*0b57cec5SDimitry Andric InstructionSpecifier &previousInfo = 1055*0b57cec5SDimitry Andric InstructionSpecifiers[decision.instructionIDs[index]]; 1056*0b57cec5SDimitry Andric 1057*0b57cec5SDimitry Andric if(previousInfo.name == "NOOP" && (newInfo.name == "XCHG16ar" || 1058*0b57cec5SDimitry Andric newInfo.name == "XCHG32ar" || 1059*0b57cec5SDimitry Andric newInfo.name == "XCHG64ar")) 1060*0b57cec5SDimitry Andric continue; // special case for XCHG*ar and NOOP 1061*0b57cec5SDimitry Andric 1062*0b57cec5SDimitry Andric if (outranks(previousInfo.insnContext, newInfo.insnContext)) 1063*0b57cec5SDimitry Andric continue; 1064*0b57cec5SDimitry Andric 1065*0b57cec5SDimitry Andric if (previousInfo.insnContext == newInfo.insnContext) { 1066*0b57cec5SDimitry Andric errs() << "Error: Primary decode conflict: "; 1067*0b57cec5SDimitry Andric errs() << newInfo.name << " would overwrite " << previousInfo.name; 1068*0b57cec5SDimitry Andric errs() << "\n"; 1069*0b57cec5SDimitry Andric errs() << "ModRM " << index << "\n"; 1070*0b57cec5SDimitry Andric errs() << "Opcode " << (uint16_t)opcode << "\n"; 1071*0b57cec5SDimitry Andric errs() << "Context " << stringForContext(newInfo.insnContext) << "\n"; 1072*0b57cec5SDimitry Andric HasConflicts = true; 1073*0b57cec5SDimitry Andric } 1074*0b57cec5SDimitry Andric } 1075*0b57cec5SDimitry Andric 1076*0b57cec5SDimitry Andric decision.instructionIDs[index] = uid; 1077*0b57cec5SDimitry Andric } 1078*0b57cec5SDimitry Andric } 1079*0b57cec5SDimitry Andric } 1080*0b57cec5SDimitry Andric 1081*0b57cec5SDimitry Andric void DisassemblerTables::setTableFields(OpcodeType type, 1082*0b57cec5SDimitry Andric InstructionContext insnContext, 1083*0b57cec5SDimitry Andric uint8_t opcode, 1084*0b57cec5SDimitry Andric const ModRMFilter &filter, 1085*0b57cec5SDimitry Andric InstrUID uid, 1086*0b57cec5SDimitry Andric bool is32bit, 1087*0b57cec5SDimitry Andric bool noPrefix, 1088*0b57cec5SDimitry Andric bool ignoresVEX_L, 1089*0b57cec5SDimitry Andric bool ignoresVEX_W, 1090*0b57cec5SDimitry Andric unsigned addressSize) { 1091*0b57cec5SDimitry Andric ContextDecision &decision = *Tables[type]; 1092*0b57cec5SDimitry Andric 1093*0b57cec5SDimitry Andric for (unsigned index = 0; index < IC_max; ++index) { 1094*0b57cec5SDimitry Andric if ((is32bit || addressSize == 16) && 1095*0b57cec5SDimitry Andric inheritsFrom((InstructionContext)index, IC_64BIT)) 1096*0b57cec5SDimitry Andric continue; 1097*0b57cec5SDimitry Andric 1098*0b57cec5SDimitry Andric bool adSize64 = addressSize == 64; 1099*0b57cec5SDimitry Andric if (inheritsFrom((InstructionContext)index, 1100*0b57cec5SDimitry Andric InstructionSpecifiers[uid].insnContext, noPrefix, 1101*0b57cec5SDimitry Andric ignoresVEX_L, ignoresVEX_W, adSize64)) 1102*0b57cec5SDimitry Andric setTableFields(decision.opcodeDecisions[index].modRMDecisions[opcode], 1103*0b57cec5SDimitry Andric filter, 1104*0b57cec5SDimitry Andric uid, 1105*0b57cec5SDimitry Andric opcode); 1106*0b57cec5SDimitry Andric } 1107*0b57cec5SDimitry Andric } 1108