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