1 //===- X86DisassemblerTables.cpp - Disassembler tables ----------*- C++ -*-===//
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-exception
7 //===----------------------------------------------------------------------===//
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 in
12 // X86DisassemblerEmitter.h.
14 //===----------------------------------------------------------------------===//
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"
26 using namespace X86Disassembler
;
28 /// stringForContext - Returns a string containing the name of a particular
29 /// InstructionContext, usually for diagnostic purposes.
31 /// @param insnContext - The instruction class to transform to a string.
32 /// @return - A statically-allocated string constant that contains the
33 /// name of the instruction class.
34 static inline const char *stringForContext(InstructionContext insnContext
) {
35 switch (insnContext
) {
37 llvm_unreachable("Unhandled instruction class");
38 #define ENUM_ENTRY(n, r, d) \
42 #define ENUM_ENTRY_K_B(n, r, d) \
44 ENUM_ENTRY(n##_K_B, r, d) ENUM_ENTRY(n##_KZ, r, d) ENUM_ENTRY(n##_K, r, d) \
45 ENUM_ENTRY(n##_B, r, d) ENUM_ENTRY(n##_KZ_B, r, d)
52 /// stringForOperandType - Like stringForContext, but for OperandTypes.
53 static inline const char *stringForOperandType(OperandType type
) {
56 llvm_unreachable("Unhandled type");
57 #define ENUM_ENTRY(i, d) \
65 /// stringForOperandEncoding - like stringForContext, but for
67 static inline const char *stringForOperandEncoding(OperandEncoding encoding
) {
70 llvm_unreachable("Unhandled encoding");
71 #define ENUM_ENTRY(i, d) \
79 /// inheritsFrom - Indicates whether all instructions in one class also belong
82 /// @param child - The class that may be the subset
83 /// @param parent - The class that may be the superset
84 /// @return - True if child is a subset of parent, false otherwise.
85 static inline bool inheritsFrom(InstructionContext child
,
86 InstructionContext parent
, bool noPrefix
= true,
87 bool VEX_LIG
= false, bool WIG
= false,
88 bool AdSize64
= false) {
94 return (inheritsFrom(child
, IC_64BIT
, AdSize64
) ||
95 (noPrefix
&& inheritsFrom(child
, IC_OPSIZE
, noPrefix
)) ||
96 inheritsFrom(child
, IC_ADSIZE
) ||
97 (noPrefix
&& inheritsFrom(child
, IC_XD
, noPrefix
)) ||
98 (noPrefix
&& inheritsFrom(child
, IC_XS
, noPrefix
)));
100 return (inheritsFrom(child
, IC_64BIT_REXW
) ||
101 (noPrefix
&& inheritsFrom(child
, IC_64BIT_OPSIZE
, noPrefix
)) ||
102 (!AdSize64
&& inheritsFrom(child
, IC_64BIT_ADSIZE
)) ||
103 (noPrefix
&& inheritsFrom(child
, IC_64BIT_XD
, noPrefix
)) ||
104 (noPrefix
&& inheritsFrom(child
, IC_64BIT_XS
, noPrefix
)));
106 return inheritsFrom(child
, IC_64BIT_OPSIZE
) ||
107 inheritsFrom(child
, IC_OPSIZE_ADSIZE
);
109 return (noPrefix
&& inheritsFrom(child
, IC_OPSIZE_ADSIZE
, noPrefix
));
110 case IC_OPSIZE_ADSIZE
:
112 case IC_64BIT_ADSIZE
:
113 return (noPrefix
&& inheritsFrom(child
, IC_64BIT_OPSIZE_ADSIZE
, noPrefix
));
114 case IC_64BIT_OPSIZE_ADSIZE
:
117 return inheritsFrom(child
, IC_64BIT_XD
);
119 return inheritsFrom(child
, IC_64BIT_XS
);
121 return inheritsFrom(child
, IC_64BIT_XD_OPSIZE
);
123 return inheritsFrom(child
, IC_64BIT_XS_OPSIZE
);
125 return inheritsFrom(child
, IC_64BIT_XD_ADSIZE
);
127 return inheritsFrom(child
, IC_64BIT_XS_ADSIZE
);
129 return ((noPrefix
&& inheritsFrom(child
, IC_64BIT_REXW_XS
, noPrefix
)) ||
130 (noPrefix
&& inheritsFrom(child
, IC_64BIT_REXW_XD
, noPrefix
)) ||
131 (noPrefix
&& inheritsFrom(child
, IC_64BIT_REXW_OPSIZE
, noPrefix
)) ||
132 (!AdSize64
&& inheritsFrom(child
, IC_64BIT_REXW_ADSIZE
)));
133 case IC_64BIT_OPSIZE
:
134 return inheritsFrom(child
, IC_64BIT_REXW_OPSIZE
) ||
135 (!AdSize64
&& inheritsFrom(child
, IC_64BIT_OPSIZE_ADSIZE
)) ||
136 (!AdSize64
&& inheritsFrom(child
, IC_64BIT_REXW_ADSIZE
));
138 return (inheritsFrom(child
, IC_64BIT_REXW_XD
) ||
139 (!AdSize64
&& inheritsFrom(child
, IC_64BIT_XD_ADSIZE
)));
141 return (inheritsFrom(child
, IC_64BIT_REXW_XS
) ||
142 (!AdSize64
&& inheritsFrom(child
, IC_64BIT_XS_ADSIZE
)));
143 case IC_64BIT_XD_OPSIZE
:
144 case IC_64BIT_XS_OPSIZE
:
146 case IC_64BIT_XD_ADSIZE
:
147 case IC_64BIT_XS_ADSIZE
:
149 case IC_64BIT_REXW_XD
:
150 case IC_64BIT_REXW_XS
:
151 case IC_64BIT_REXW_OPSIZE
:
152 case IC_64BIT_REXW_ADSIZE
:
156 return (VEX_LIG
&& WIG
&& inheritsFrom(child
, IC_VEX_L_W
)) ||
157 (WIG
&& inheritsFrom(child
, IC_VEX_W
)) ||
158 (VEX_LIG
&& inheritsFrom(child
, IC_VEX_L
));
160 return (VEX_LIG
&& WIG
&& inheritsFrom(child
, IC_VEX_L_W_XS
)) ||
161 (WIG
&& inheritsFrom(child
, IC_VEX_W_XS
)) ||
162 (VEX_LIG
&& inheritsFrom(child
, IC_VEX_L_XS
));
164 return (VEX_LIG
&& WIG
&& inheritsFrom(child
, IC_VEX_L_W_XD
)) ||
165 (WIG
&& inheritsFrom(child
, IC_VEX_W_XD
)) ||
166 (VEX_LIG
&& inheritsFrom(child
, IC_VEX_L_XD
));
168 return (VEX_LIG
&& WIG
&& inheritsFrom(child
, IC_VEX_L_W_OPSIZE
)) ||
169 (WIG
&& inheritsFrom(child
, IC_VEX_W_OPSIZE
)) ||
170 (VEX_LIG
&& inheritsFrom(child
, IC_VEX_L_OPSIZE
));
172 return VEX_LIG
&& inheritsFrom(child
, IC_VEX_L_W
);
174 return VEX_LIG
&& inheritsFrom(child
, IC_VEX_L_W_XS
);
176 return VEX_LIG
&& inheritsFrom(child
, IC_VEX_L_W_XD
);
177 case IC_VEX_W_OPSIZE
:
178 return VEX_LIG
&& inheritsFrom(child
, IC_VEX_L_W_OPSIZE
);
180 return WIG
&& inheritsFrom(child
, IC_VEX_L_W
);
182 return WIG
&& inheritsFrom(child
, IC_VEX_L_W_XS
);
184 return WIG
&& inheritsFrom(child
, IC_VEX_L_W_XD
);
185 case IC_VEX_L_OPSIZE
:
186 return WIG
&& inheritsFrom(child
, IC_VEX_L_W_OPSIZE
);
190 case IC_VEX_L_W_OPSIZE
:
193 return (VEX_LIG
&& WIG
&& inheritsFrom(child
, IC_EVEX_L_W
)) ||
194 (VEX_LIG
&& WIG
&& inheritsFrom(child
, IC_EVEX_L2_W
)) ||
195 (WIG
&& inheritsFrom(child
, IC_EVEX_W
)) ||
196 (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L
)) ||
197 (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L2
));
199 return (VEX_LIG
&& WIG
&& inheritsFrom(child
, IC_EVEX_L_W_XS
)) ||
200 (VEX_LIG
&& WIG
&& inheritsFrom(child
, IC_EVEX_L2_W_XS
)) ||
201 (WIG
&& inheritsFrom(child
, IC_EVEX_W_XS
)) ||
202 (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L_XS
)) ||
203 (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L2_XS
));
205 return (VEX_LIG
&& WIG
&& inheritsFrom(child
, IC_EVEX_L_W_XD
)) ||
206 (VEX_LIG
&& WIG
&& inheritsFrom(child
, IC_EVEX_L2_W_XD
)) ||
207 (WIG
&& inheritsFrom(child
, IC_EVEX_W_XD
)) ||
208 (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L_XD
)) ||
209 (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L2_XD
));
211 return (VEX_LIG
&& WIG
&& inheritsFrom(child
, IC_EVEX_L_W_OPSIZE
)) ||
212 (VEX_LIG
&& WIG
&& inheritsFrom(child
, IC_EVEX_L2_W_OPSIZE
)) ||
213 (WIG
&& inheritsFrom(child
, IC_EVEX_W_OPSIZE
)) ||
214 (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L_OPSIZE
)) ||
215 (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L2_OPSIZE
));
216 case IC_EVEX_OPSIZE_ADSIZE
:
219 return (VEX_LIG
&& WIG
&& inheritsFrom(child
, IC_EVEX_L_W_K
)) ||
220 (VEX_LIG
&& WIG
&& inheritsFrom(child
, IC_EVEX_L2_W_K
)) ||
221 (WIG
&& inheritsFrom(child
, IC_EVEX_W_K
)) ||
222 (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L_K
)) ||
223 (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L2_K
));
225 return (VEX_LIG
&& WIG
&& inheritsFrom(child
, IC_EVEX_L_W_XS_K
)) ||
226 (VEX_LIG
&& WIG
&& inheritsFrom(child
, IC_EVEX_L2_W_XS_K
)) ||
227 (WIG
&& inheritsFrom(child
, IC_EVEX_W_XS_K
)) ||
228 (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L_XS_K
)) ||
229 (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L2_XS_K
));
231 return (VEX_LIG
&& WIG
&& inheritsFrom(child
, IC_EVEX_L_W_XD_K
)) ||
232 (VEX_LIG
&& WIG
&& inheritsFrom(child
, IC_EVEX_L2_W_XD_K
)) ||
233 (WIG
&& inheritsFrom(child
, IC_EVEX_W_XD_K
)) ||
234 (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L_XD_K
)) ||
235 (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L2_XD_K
));
236 case IC_EVEX_OPSIZE_K
:
237 return (VEX_LIG
&& WIG
&& inheritsFrom(child
, IC_EVEX_L_W_OPSIZE_K
)) ||
238 (VEX_LIG
&& WIG
&& inheritsFrom(child
, IC_EVEX_L2_W_OPSIZE_K
)) ||
239 (WIG
&& inheritsFrom(child
, IC_EVEX_W_OPSIZE_K
)) ||
240 (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L_OPSIZE_K
)) ||
241 (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L2_OPSIZE_K
));
243 return (VEX_LIG
&& WIG
&& inheritsFrom(child
, IC_EVEX_L_W_KZ
)) ||
244 (VEX_LIG
&& WIG
&& inheritsFrom(child
, IC_EVEX_L2_W_KZ
)) ||
245 (WIG
&& inheritsFrom(child
, IC_EVEX_W_KZ
)) ||
246 (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L_KZ
)) ||
247 (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L2_KZ
));
249 return (VEX_LIG
&& WIG
&& inheritsFrom(child
, IC_EVEX_L_W_XS_KZ
)) ||
250 (VEX_LIG
&& WIG
&& inheritsFrom(child
, IC_EVEX_L2_W_XS_KZ
)) ||
251 (WIG
&& inheritsFrom(child
, IC_EVEX_W_XS_KZ
)) ||
252 (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L_XS_KZ
)) ||
253 (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L2_XS_KZ
));
255 return (VEX_LIG
&& WIG
&& inheritsFrom(child
, IC_EVEX_L_W_XD_KZ
)) ||
256 (VEX_LIG
&& WIG
&& inheritsFrom(child
, IC_EVEX_L2_W_XD_KZ
)) ||
257 (WIG
&& inheritsFrom(child
, IC_EVEX_W_XD_KZ
)) ||
258 (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L_XD_KZ
)) ||
259 (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L2_XD_KZ
));
260 case IC_EVEX_OPSIZE_KZ
:
261 return (VEX_LIG
&& WIG
&& inheritsFrom(child
, IC_EVEX_L_W_OPSIZE_KZ
)) ||
262 (VEX_LIG
&& WIG
&& inheritsFrom(child
, IC_EVEX_L2_W_OPSIZE_KZ
)) ||
263 (WIG
&& inheritsFrom(child
, IC_EVEX_W_OPSIZE_KZ
)) ||
264 (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L_OPSIZE_KZ
)) ||
265 (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L2_OPSIZE_KZ
));
267 return (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L_W
)) ||
268 (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L2_W
));
270 return (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L_W_XS
)) ||
271 (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L2_W_XS
));
273 return (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L_W_XD
)) ||
274 (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L2_W_XD
));
275 case IC_EVEX_W_OPSIZE
:
276 return (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L_W_OPSIZE
)) ||
277 (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L2_W_OPSIZE
));
279 return (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L_W_K
)) ||
280 (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L2_W_K
));
282 return (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L_W_XS_K
)) ||
283 (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L2_W_XS_K
));
285 return (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L_W_XD_K
)) ||
286 (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L2_W_XD_K
));
287 case IC_EVEX_W_OPSIZE_K
:
288 return (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L_W_OPSIZE_K
)) ||
289 (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L2_W_OPSIZE_K
));
291 return (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L_W_KZ
)) ||
292 (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L2_W_KZ
));
293 case IC_EVEX_W_XS_KZ
:
294 return (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L_W_XS_KZ
)) ||
295 (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L2_W_XS_KZ
));
296 case IC_EVEX_W_XD_KZ
:
297 return (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L_W_XD_KZ
)) ||
298 (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L2_W_XD_KZ
));
299 case IC_EVEX_W_OPSIZE_KZ
:
300 return (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L_W_OPSIZE_KZ
)) ||
301 (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L2_W_OPSIZE_KZ
));
303 return WIG
&& inheritsFrom(child
, IC_EVEX_L_W
);
305 return WIG
&& inheritsFrom(child
, IC_EVEX_L_W_XS
);
307 return WIG
&& inheritsFrom(child
, IC_EVEX_L_W_XD
);
308 case IC_EVEX_L_OPSIZE
:
309 return WIG
&& inheritsFrom(child
, IC_EVEX_L_W_OPSIZE
);
311 return WIG
&& inheritsFrom(child
, IC_EVEX_L_W_K
);
313 return WIG
&& inheritsFrom(child
, IC_EVEX_L_W_XS_K
);
315 return WIG
&& inheritsFrom(child
, IC_EVEX_L_W_XD_K
);
316 case IC_EVEX_L_OPSIZE_K
:
317 return WIG
&& inheritsFrom(child
, IC_EVEX_L_W_OPSIZE_K
);
319 return WIG
&& inheritsFrom(child
, IC_EVEX_L_W_KZ
);
320 case IC_EVEX_L_XS_KZ
:
321 return WIG
&& inheritsFrom(child
, IC_EVEX_L_W_XS_KZ
);
322 case IC_EVEX_L_XD_KZ
:
323 return WIG
&& inheritsFrom(child
, IC_EVEX_L_W_XD_KZ
);
324 case IC_EVEX_L_OPSIZE_KZ
:
325 return WIG
&& inheritsFrom(child
, IC_EVEX_L_W_OPSIZE_KZ
);
329 case IC_EVEX_L_W_OPSIZE
:
332 case IC_EVEX_L_W_XS_K
:
333 case IC_EVEX_L_W_XD_K
:
334 case IC_EVEX_L_W_OPSIZE_K
:
337 case IC_EVEX_L_W_XS_KZ
:
338 case IC_EVEX_L_W_XD_KZ
:
339 case IC_EVEX_L_W_OPSIZE_KZ
:
342 return WIG
&& inheritsFrom(child
, IC_EVEX_L2_W
);
344 return WIG
&& inheritsFrom(child
, IC_EVEX_L2_W_XS
);
346 return WIG
&& inheritsFrom(child
, IC_EVEX_L2_W_XD
);
347 case IC_EVEX_L2_OPSIZE
:
348 return WIG
&& inheritsFrom(child
, IC_EVEX_L2_W_OPSIZE
);
350 return WIG
&& inheritsFrom(child
, IC_EVEX_L2_W_K
);
351 case IC_EVEX_L2_XS_K
:
352 return WIG
&& inheritsFrom(child
, IC_EVEX_L2_W_XS_K
);
353 case IC_EVEX_L2_XD_K
:
354 return WIG
&& inheritsFrom(child
, IC_EVEX_L2_W_XD_K
);
355 case IC_EVEX_L2_OPSIZE_K
:
356 return WIG
&& inheritsFrom(child
, IC_EVEX_L2_W_OPSIZE_K
);
358 return WIG
&& inheritsFrom(child
, IC_EVEX_L2_W_KZ
);
359 case IC_EVEX_L2_XS_KZ
:
360 return WIG
&& inheritsFrom(child
, IC_EVEX_L2_W_XS_KZ
);
361 case IC_EVEX_L2_XD_KZ
:
362 return WIG
&& inheritsFrom(child
, IC_EVEX_L2_W_XD_KZ
);
363 case IC_EVEX_L2_OPSIZE_KZ
:
364 return WIG
&& inheritsFrom(child
, IC_EVEX_L2_W_OPSIZE_KZ
);
366 case IC_EVEX_L2_W_XS
:
367 case IC_EVEX_L2_W_XD
:
368 case IC_EVEX_L2_W_OPSIZE
:
371 case IC_EVEX_L2_W_XS_K
:
372 case IC_EVEX_L2_W_XD_K
:
373 case IC_EVEX_L2_W_OPSIZE_K
:
375 case IC_EVEX_L2_W_KZ
:
376 case IC_EVEX_L2_W_XS_KZ
:
377 case IC_EVEX_L2_W_XD_KZ
:
378 case IC_EVEX_L2_W_OPSIZE_KZ
:
381 return (VEX_LIG
&& WIG
&& inheritsFrom(child
, IC_EVEX_L_W_B
)) ||
382 (VEX_LIG
&& WIG
&& inheritsFrom(child
, IC_EVEX_L2_W_B
)) ||
383 (WIG
&& inheritsFrom(child
, IC_EVEX_W_B
)) ||
384 (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L_B
)) ||
385 (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L2_B
));
387 return (VEX_LIG
&& WIG
&& inheritsFrom(child
, IC_EVEX_L_W_XS_B
)) ||
388 (VEX_LIG
&& WIG
&& inheritsFrom(child
, IC_EVEX_L2_W_XS_B
)) ||
389 (WIG
&& inheritsFrom(child
, IC_EVEX_W_XS_B
)) ||
390 (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L_XS_B
)) ||
391 (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L2_XS_B
));
393 return (VEX_LIG
&& WIG
&& inheritsFrom(child
, IC_EVEX_L_W_XD_B
)) ||
394 (VEX_LIG
&& WIG
&& inheritsFrom(child
, IC_EVEX_L2_W_XD_B
)) ||
395 (WIG
&& inheritsFrom(child
, IC_EVEX_W_XD_B
)) ||
396 (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L_XD_B
)) ||
397 (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L2_XD_B
));
398 case IC_EVEX_OPSIZE_B
:
399 return (VEX_LIG
&& WIG
&& inheritsFrom(child
, IC_EVEX_L_W_OPSIZE_B
)) ||
400 (VEX_LIG
&& WIG
&& inheritsFrom(child
, IC_EVEX_L2_W_OPSIZE_B
)) ||
401 (WIG
&& inheritsFrom(child
, IC_EVEX_W_OPSIZE_B
)) ||
402 (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L_OPSIZE_B
)) ||
403 (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L2_OPSIZE_B
));
405 return (VEX_LIG
&& WIG
&& inheritsFrom(child
, IC_EVEX_L_W_K_B
)) ||
406 (VEX_LIG
&& WIG
&& inheritsFrom(child
, IC_EVEX_L2_W_K_B
)) ||
407 (WIG
&& inheritsFrom(child
, IC_EVEX_W_K_B
)) ||
408 (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L_K_B
)) ||
409 (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L2_K_B
));
411 return (VEX_LIG
&& WIG
&& inheritsFrom(child
, IC_EVEX_L_W_XS_K_B
)) ||
412 (VEX_LIG
&& WIG
&& inheritsFrom(child
, IC_EVEX_L2_W_XS_K_B
)) ||
413 (WIG
&& inheritsFrom(child
, IC_EVEX_W_XS_K_B
)) ||
414 (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L_XS_K_B
)) ||
415 (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L2_XS_K_B
));
417 return (VEX_LIG
&& WIG
&& inheritsFrom(child
, IC_EVEX_L_W_XD_K_B
)) ||
418 (VEX_LIG
&& WIG
&& inheritsFrom(child
, IC_EVEX_L2_W_XD_K_B
)) ||
419 (WIG
&& inheritsFrom(child
, IC_EVEX_W_XD_K_B
)) ||
420 (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L_XD_K_B
)) ||
421 (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L2_XD_K_B
));
422 case IC_EVEX_OPSIZE_K_B
:
423 return (VEX_LIG
&& WIG
&& inheritsFrom(child
, IC_EVEX_L_W_OPSIZE_K_B
)) ||
424 (VEX_LIG
&& WIG
&& inheritsFrom(child
, IC_EVEX_L2_W_OPSIZE_K_B
)) ||
425 (WIG
&& inheritsFrom(child
, IC_EVEX_W_OPSIZE_K_B
)) ||
426 (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L_OPSIZE_K_B
)) ||
427 (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L2_OPSIZE_K_B
));
429 return (VEX_LIG
&& WIG
&& inheritsFrom(child
, IC_EVEX_L_W_KZ_B
)) ||
430 (VEX_LIG
&& WIG
&& inheritsFrom(child
, IC_EVEX_L2_W_KZ_B
)) ||
431 (WIG
&& inheritsFrom(child
, IC_EVEX_W_KZ_B
)) ||
432 (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L_KZ_B
)) ||
433 (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L2_KZ_B
));
434 case IC_EVEX_XS_KZ_B
:
435 return (VEX_LIG
&& WIG
&& inheritsFrom(child
, IC_EVEX_L_W_XS_KZ_B
)) ||
436 (VEX_LIG
&& WIG
&& inheritsFrom(child
, IC_EVEX_L2_W_XS_KZ_B
)) ||
437 (WIG
&& inheritsFrom(child
, IC_EVEX_W_XS_KZ_B
)) ||
438 (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L_XS_KZ_B
)) ||
439 (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L2_XS_KZ_B
));
440 case IC_EVEX_XD_KZ_B
:
441 return (VEX_LIG
&& WIG
&& inheritsFrom(child
, IC_EVEX_L_W_XD_KZ_B
)) ||
442 (VEX_LIG
&& WIG
&& inheritsFrom(child
, IC_EVEX_L2_W_XD_KZ_B
)) ||
443 (WIG
&& inheritsFrom(child
, IC_EVEX_W_XD_KZ_B
)) ||
444 (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L_XD_KZ_B
)) ||
445 (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L2_XD_KZ_B
));
446 case IC_EVEX_OPSIZE_KZ_B
:
447 return (VEX_LIG
&& WIG
&& inheritsFrom(child
, IC_EVEX_L_W_OPSIZE_KZ_B
)) ||
448 (VEX_LIG
&& WIG
&& inheritsFrom(child
, IC_EVEX_L2_W_OPSIZE_KZ_B
)) ||
449 (WIG
&& inheritsFrom(child
, IC_EVEX_W_OPSIZE_KZ_B
)) ||
450 (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L_OPSIZE_KZ_B
)) ||
451 (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L2_OPSIZE_KZ_B
));
453 return (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L_W_B
)) ||
454 (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L2_W_B
));
456 return (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L_W_XS_B
)) ||
457 (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L2_W_XS_B
));
459 return (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L_W_XD_B
)) ||
460 (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L2_W_XD_B
));
461 case IC_EVEX_W_OPSIZE_B
:
462 return (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L_W_OPSIZE_B
)) ||
463 (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L2_W_OPSIZE_B
));
465 return (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L_W_K_B
)) ||
466 (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L2_W_K_B
));
467 case IC_EVEX_W_XS_K_B
:
468 return (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L_W_XS_K_B
)) ||
469 (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L2_W_XS_K_B
));
470 case IC_EVEX_W_XD_K_B
:
471 return (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L_W_XD_K_B
)) ||
472 (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L2_W_XD_K_B
));
473 case IC_EVEX_W_OPSIZE_K_B
:
474 return (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L_W_OPSIZE_K_B
)) ||
475 (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L2_W_OPSIZE_K_B
));
477 return (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L_W_KZ_B
)) ||
478 (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L2_W_KZ_B
));
479 case IC_EVEX_W_XS_KZ_B
:
480 return (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L_W_XS_KZ_B
)) ||
481 (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L2_W_XS_KZ_B
));
482 case IC_EVEX_W_XD_KZ_B
:
483 return (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L_W_XD_KZ_B
)) ||
484 (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L2_W_XD_KZ_B
));
485 case IC_EVEX_W_OPSIZE_KZ_B
:
486 return (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L_W_OPSIZE_KZ_B
)) ||
487 (VEX_LIG
&& inheritsFrom(child
, IC_EVEX_L2_W_OPSIZE_KZ_B
));
489 return WIG
&& inheritsFrom(child
, IC_EVEX_L_W_B
);
491 return WIG
&& inheritsFrom(child
, IC_EVEX_L_W_XS_B
);
493 return WIG
&& inheritsFrom(child
, IC_EVEX_L_W_XD_B
);
494 case IC_EVEX_L_OPSIZE_B
:
495 return WIG
&& inheritsFrom(child
, IC_EVEX_L_W_OPSIZE_B
);
497 return WIG
&& inheritsFrom(child
, IC_EVEX_L_W_K_B
);
498 case IC_EVEX_L_XS_K_B
:
499 return WIG
&& inheritsFrom(child
, IC_EVEX_L_W_XS_K_B
);
500 case IC_EVEX_L_XD_K_B
:
501 return WIG
&& inheritsFrom(child
, IC_EVEX_L_W_XD_K_B
);
502 case IC_EVEX_L_OPSIZE_K_B
:
503 return WIG
&& inheritsFrom(child
, IC_EVEX_L_W_OPSIZE_K_B
);
505 return WIG
&& inheritsFrom(child
, IC_EVEX_L_W_KZ_B
);
506 case IC_EVEX_L_XS_KZ_B
:
507 return WIG
&& inheritsFrom(child
, IC_EVEX_L_W_XS_KZ_B
);
508 case IC_EVEX_L_XD_KZ_B
:
509 return WIG
&& inheritsFrom(child
, IC_EVEX_L_W_XD_KZ_B
);
510 case IC_EVEX_L_OPSIZE_KZ_B
:
511 return WIG
&& inheritsFrom(child
, IC_EVEX_L_W_OPSIZE_KZ_B
);
513 case IC_EVEX_L_W_XS_B
:
514 case IC_EVEX_L_W_XD_B
:
515 case IC_EVEX_L_W_OPSIZE_B
:
517 case IC_EVEX_L_W_K_B
:
518 case IC_EVEX_L_W_XS_K_B
:
519 case IC_EVEX_L_W_XD_K_B
:
520 case IC_EVEX_L_W_OPSIZE_K_B
:
522 case IC_EVEX_L_W_KZ_B
:
523 case IC_EVEX_L_W_XS_KZ_B
:
524 case IC_EVEX_L_W_XD_KZ_B
:
525 case IC_EVEX_L_W_OPSIZE_KZ_B
:
528 return WIG
&& inheritsFrom(child
, IC_EVEX_L2_W_B
);
529 case IC_EVEX_L2_XS_B
:
530 return WIG
&& inheritsFrom(child
, IC_EVEX_L2_W_XS_B
);
531 case IC_EVEX_L2_XD_B
:
532 return WIG
&& inheritsFrom(child
, IC_EVEX_L2_W_XD_B
);
533 case IC_EVEX_L2_OPSIZE_B
:
534 return WIG
&& inheritsFrom(child
, IC_EVEX_L2_W_OPSIZE_B
);
536 return WIG
&& inheritsFrom(child
, IC_EVEX_L2_W_K_B
);
537 case IC_EVEX_L2_XS_K_B
:
538 return WIG
&& inheritsFrom(child
, IC_EVEX_L2_W_XS_K_B
);
539 case IC_EVEX_L2_XD_K_B
:
540 return WIG
&& inheritsFrom(child
, IC_EVEX_L2_W_XD_K_B
);
541 case IC_EVEX_L2_OPSIZE_K_B
:
542 return WIG
&& inheritsFrom(child
, IC_EVEX_L2_W_OPSIZE_K_B
);
543 case IC_EVEX_L2_KZ_B
:
544 return WIG
&& inheritsFrom(child
, IC_EVEX_L2_W_KZ_B
);
545 case IC_EVEX_L2_XS_KZ_B
:
546 return WIG
&& inheritsFrom(child
, IC_EVEX_L2_W_XS_KZ_B
);
547 case IC_EVEX_L2_XD_KZ_B
:
548 return WIG
&& inheritsFrom(child
, IC_EVEX_L2_W_XD_KZ_B
);
549 case IC_EVEX_L2_OPSIZE_KZ_B
:
550 return WIG
&& inheritsFrom(child
, IC_EVEX_L2_W_OPSIZE_KZ_B
);
552 case IC_EVEX_L2_W_XS_B
:
553 case IC_EVEX_L2_W_XD_B
:
554 case IC_EVEX_L2_W_OPSIZE_B
:
556 case IC_EVEX_L2_W_K_B
:
557 case IC_EVEX_L2_W_XS_K_B
:
558 case IC_EVEX_L2_W_XD_K_B
:
559 case IC_EVEX_L2_W_OPSIZE_K_B
:
561 case IC_EVEX_L2_W_KZ_B
:
562 case IC_EVEX_L2_W_XS_KZ_B
:
563 case IC_EVEX_L2_W_XD_KZ_B
:
564 case IC_EVEX_L2_W_OPSIZE_KZ_B
:
568 case IC_EVEX_OPSIZE_NF
:
569 case IC_EVEX_OPSIZE_B_NF
:
574 errs() << "Unknown instruction class: "
575 << stringForContext((InstructionContext
)parent
) << "\n";
576 llvm_unreachable("Unknown instruction class");
580 /// outranks - Indicates whether, if an instruction has two different applicable
581 /// classes, which class should be preferred when performing decode. This
582 /// imposes a total ordering (ties are resolved toward "lower")
584 /// @param upper - The class that may be preferable
585 /// @param lower - The class that may be less preferable
586 /// @return - True if upper is to be preferred, false otherwise.
587 static inline bool outranks(InstructionContext upper
,
588 InstructionContext lower
) {
589 assert(upper
< IC_max
);
590 assert(lower
< IC_max
);
592 #define ENUM_ENTRY(n, r, d) r,
593 #define ENUM_ENTRY_K_B(n, r, d) \
594 ENUM_ENTRY(n, r, d) \
595 ENUM_ENTRY(n##_K_B, r, d) \
596 ENUM_ENTRY(n##_KZ_B, r, d) ENUM_ENTRY(n##_KZ, r, d) ENUM_ENTRY(n##_K, r, d) \
597 ENUM_ENTRY(n##_B, r, d)
598 static int ranks
[IC_max
] = {INSTRUCTION_CONTEXTS
};
600 #undef ENUM_ENTRY_K_B
602 return (ranks
[upper
] > ranks
[lower
]);
605 /// getDecisionType - Determines whether a ModRM decision with 255 entries can
606 /// be compacted by eliminating redundant information.
608 /// @param decision - The decision to be compacted.
609 /// @return - The compactest available representation for the decision.
610 static ModRMDecisionType
getDecisionType(ModRMDecision
&decision
) {
611 bool satisfiesOneEntry
= true;
612 bool satisfiesSplitRM
= true;
613 bool satisfiesSplitReg
= true;
614 bool satisfiesSplitMisc
= true;
616 for (unsigned index
= 0; index
< 256; ++index
) {
617 if (decision
.instructionIDs
[index
] != decision
.instructionIDs
[0])
618 satisfiesOneEntry
= false;
620 if (((index
& 0xc0) == 0xc0) &&
621 (decision
.instructionIDs
[index
] != decision
.instructionIDs
[0xc0]))
622 satisfiesSplitRM
= false;
624 if (((index
& 0xc0) != 0xc0) &&
625 (decision
.instructionIDs
[index
] != decision
.instructionIDs
[0x00]))
626 satisfiesSplitRM
= false;
628 if (((index
& 0xc0) == 0xc0) && (decision
.instructionIDs
[index
] !=
629 decision
.instructionIDs
[index
& 0xf8]))
630 satisfiesSplitReg
= false;
632 if (((index
& 0xc0) != 0xc0) && (decision
.instructionIDs
[index
] !=
633 decision
.instructionIDs
[index
& 0x38]))
634 satisfiesSplitMisc
= false;
637 if (satisfiesOneEntry
)
638 return MODRM_ONEENTRY
;
640 if (satisfiesSplitRM
)
641 return MODRM_SPLITRM
;
643 if (satisfiesSplitReg
&& satisfiesSplitMisc
)
644 return MODRM_SPLITREG
;
646 if (satisfiesSplitMisc
)
647 return MODRM_SPLITMISC
;
652 /// stringForDecisionType - Returns a statically-allocated string corresponding
653 /// to a particular decision type.
655 /// @param dt - The decision type.
656 /// @return - A pointer to the statically-allocated string (e.g.,
657 /// "MODRM_ONEENTRY" for MODRM_ONEENTRY).
658 static const char *stringForDecisionType(ModRMDecisionType dt
) {
659 #define ENUM_ENTRY(n) \
664 llvm_unreachable("Unknown decision type");
670 DisassemblerTables::DisassemblerTables() {
671 for (unsigned i
= 0; i
< std::size(Tables
); i
++)
672 Tables
[i
] = std::make_unique
<ContextDecision
>();
674 HasConflicts
= false;
677 DisassemblerTables::~DisassemblerTables() {}
679 void DisassemblerTables::emitModRMDecision(raw_ostream
&o1
, raw_ostream
&o2
,
680 unsigned &i1
, unsigned &i2
,
681 unsigned &ModRMTableNum
,
682 ModRMDecision
&decision
) const {
683 static uint32_t sEntryNumber
= 1;
684 ModRMDecisionType dt
= getDecisionType(decision
);
686 if (dt
== MODRM_ONEENTRY
&& decision
.instructionIDs
[0] == 0) {
688 o2
<< "{" << stringForDecisionType(dt
) << ", 0}";
692 std::vector
<unsigned> ModRMDecision
;
696 llvm_unreachable("Unknown decision type");
698 ModRMDecision
.push_back(decision
.instructionIDs
[0]);
701 ModRMDecision
.push_back(decision
.instructionIDs
[0x00]);
702 ModRMDecision
.push_back(decision
.instructionIDs
[0xc0]);
705 for (unsigned index
= 0; index
< 64; index
+= 8)
706 ModRMDecision
.push_back(decision
.instructionIDs
[index
]);
707 for (unsigned index
= 0xc0; index
< 256; index
+= 8)
708 ModRMDecision
.push_back(decision
.instructionIDs
[index
]);
710 case MODRM_SPLITMISC
:
711 for (unsigned index
= 0; index
< 64; index
+= 8)
712 ModRMDecision
.push_back(decision
.instructionIDs
[index
]);
713 for (unsigned index
= 0xc0; index
< 256; ++index
)
714 ModRMDecision
.push_back(decision
.instructionIDs
[index
]);
717 for (unsigned short InstructionID
: decision
.instructionIDs
)
718 ModRMDecision
.push_back(InstructionID
);
722 unsigned &EntryNumber
= ModRMTable
[ModRMDecision
];
723 if (EntryNumber
== 0) {
724 EntryNumber
= ModRMTableNum
;
726 ModRMTableNum
+= ModRMDecision
.size();
727 o1
<< "/*Table" << EntryNumber
<< "*/\n";
729 for (unsigned I
: ModRMDecision
) {
730 o1
.indent(i1
* 2) << format("0x%hx", I
) << ", /*"
731 << InstructionSpecifiers
[I
].name
<< "*/\n";
736 o2
<< "{" << stringForDecisionType(dt
) << ", " << EntryNumber
<< "}";
740 llvm_unreachable("Unknown decision type");
750 case MODRM_SPLITMISC
:
751 sEntryNumber
+= 8 + 64;
758 // We assume that the index can fit into uint16_t.
759 assert(sEntryNumber
< 65536U &&
760 "Index into ModRMDecision is too large for uint16_t!");
764 void DisassemblerTables::emitOpcodeDecision(raw_ostream
&o1
, raw_ostream
&o2
,
765 unsigned &i1
, unsigned &i2
,
766 unsigned &ModRMTableNum
,
767 OpcodeDecision
&opDecision
) const {
772 for (index
= 0; index
< 256; ++index
) {
773 auto &decision
= opDecision
.modRMDecisions
[index
];
774 ModRMDecisionType dt
= getDecisionType(decision
);
775 if (!(dt
== MODRM_ONEENTRY
&& decision
.instructionIDs
[0] == 0))
779 // If all 256 entries are MODRM_ONEENTRY, omit output.
780 static_assert(MODRM_ONEENTRY
== 0);
784 o2
<< " /* struct OpcodeDecision */ {\n";
785 for (index
= 0; index
< 256; ++index
) {
788 o2
<< "/*0x" << format("%02hhx", index
) << "*/";
790 emitModRMDecision(o1
, o2
, i1
, i2
, ModRMTableNum
,
791 opDecision
.modRMDecisions
[index
]);
798 o2
.indent(i2
) << "}\n";
800 o2
.indent(i2
) << "},\n";
804 void DisassemblerTables::emitContextDecision(raw_ostream
&o1
, raw_ostream
&o2
,
805 unsigned &i1
, unsigned &i2
,
806 unsigned &ModRMTableNum
,
807 ContextDecision
&decision
,
808 const char *name
) const {
809 o2
.indent(i2
) << "static const struct ContextDecision " << name
810 << " = {{/* opcodeDecisions */\n";
813 for (unsigned index
= 0; index
< IC_max
; ++index
) {
814 o2
.indent(i2
) << "/*";
815 o2
<< stringForContext((InstructionContext
)index
);
818 emitOpcodeDecision(o1
, o2
, i1
, i2
, ModRMTableNum
,
819 decision
.opcodeDecisions
[index
]);
823 o2
.indent(i2
) << "}};" << "\n";
826 void DisassemblerTables::emitInstructionInfo(raw_ostream
&o
,
828 unsigned NumInstructions
= InstructionSpecifiers
.size();
830 o
<< "static const struct OperandSpecifier x86OperandSets[]["
831 << X86_MAX_OPERANDS
<< "] = {\n";
833 typedef SmallVector
<std::pair
<OperandEncoding
, OperandType
>, X86_MAX_OPERANDS
>
835 std::map
<OperandListTy
, unsigned> OperandSets
;
837 unsigned OperandSetNum
= 0;
838 for (unsigned Index
= 0; Index
< NumInstructions
; ++Index
) {
839 OperandListTy OperandList
;
841 for (auto Operand
: InstructionSpecifiers
[Index
].operands
) {
842 OperandEncoding Encoding
= (OperandEncoding
)Operand
.encoding
;
843 OperandType Type
= (OperandType
)Operand
.type
;
844 OperandList
.push_back(std::make_pair(Encoding
, Type
));
846 unsigned &N
= OperandSets
[OperandList
];
852 o
<< " { /* " << (OperandSetNum
- 1) << " */\n";
853 for (unsigned i
= 0, e
= OperandList
.size(); i
!= e
; ++i
) {
854 const char *Encoding
= stringForOperandEncoding(OperandList
[i
].first
);
855 const char *Type
= stringForOperandType(OperandList
[i
].second
);
856 o
<< " { " << Encoding
<< ", " << Type
<< " },\n";
862 o
.indent(i
* 2) << "static const struct InstructionSpecifier ";
863 o
<< INSTRUCTIONS_STR
"[" << InstructionSpecifiers
.size() << "] = {\n";
867 for (unsigned index
= 0; index
< NumInstructions
; ++index
) {
868 o
.indent(i
* 2) << "{ /* " << index
<< " */\n";
871 OperandListTy OperandList
;
872 for (auto Operand
: InstructionSpecifiers
[index
].operands
) {
873 OperandEncoding Encoding
= (OperandEncoding
)Operand
.encoding
;
874 OperandType Type
= (OperandType
)Operand
.type
;
875 OperandList
.push_back(std::make_pair(Encoding
, Type
));
877 o
.indent(i
* 2) << (OperandSets
[OperandList
] - 1) << ",\n";
879 o
.indent(i
* 2) << "/* " << InstructionSpecifiers
[index
].name
<< " */\n";
882 o
.indent(i
* 2) << "},\n";
886 o
.indent(i
* 2) << "};" << "\n";
889 void DisassemblerTables::emitContextTable(raw_ostream
&o
, unsigned &i
) const {
890 o
.indent(i
* 2) << "static const uint8_t " CONTEXTS_STR
"[" << ATTR_max
894 for (unsigned index
= 0; index
< ATTR_max
; ++index
) {
897 if ((index
& ATTR_EVEX
) && (index
& ATTR_OPSIZE
) && (index
& ATTR_ADSIZE
))
898 o
<< "IC_EVEX_OPSIZE_ADSIZE";
899 else if (index
& ATTR_EVEXNF
) {
901 if (index
& ATTR_REXW
)
903 else if (index
& ATTR_OPSIZE
)
906 if (index
& ATTR_EVEXB
)
910 } else if ((index
& ATTR_EVEX
) || (index
& ATTR_VEX
) ||
911 (index
& ATTR_VEXL
)) {
912 if (index
& ATTR_EVEX
)
917 if ((index
& ATTR_EVEX
) && (index
& ATTR_EVEXL2
))
919 else if (index
& ATTR_VEXL
)
922 if (index
& ATTR_REXW
)
925 if (index
& ATTR_OPSIZE
)
927 else if (index
& ATTR_XD
)
929 else if (index
& ATTR_XS
)
932 if (index
& ATTR_EVEX
) {
933 if (index
& ATTR_EVEXKZ
)
935 else if (index
& ATTR_EVEXK
)
938 if (index
& ATTR_EVEXB
)
941 } else if ((index
& ATTR_64BIT
) && (index
& ATTR_REX2
))
942 o
<< "IC_64BIT_REX2";
943 else if ((index
& ATTR_64BIT
) && (index
& ATTR_REXW
) && (index
& ATTR_XS
))
944 o
<< "IC_64BIT_REXW_XS";
945 else if ((index
& ATTR_64BIT
) && (index
& ATTR_REXW
) && (index
& ATTR_XD
))
946 o
<< "IC_64BIT_REXW_XD";
947 else if ((index
& ATTR_64BIT
) && (index
& ATTR_REXW
) &&
948 (index
& ATTR_OPSIZE
))
949 o
<< "IC_64BIT_REXW_OPSIZE";
950 else if ((index
& ATTR_64BIT
) && (index
& ATTR_REXW
) &&
951 (index
& ATTR_ADSIZE
))
952 o
<< "IC_64BIT_REXW_ADSIZE";
953 else if ((index
& ATTR_64BIT
) && (index
& ATTR_XD
) && (index
& ATTR_OPSIZE
))
954 o
<< "IC_64BIT_XD_OPSIZE";
955 else if ((index
& ATTR_64BIT
) && (index
& ATTR_XD
) && (index
& ATTR_ADSIZE
))
956 o
<< "IC_64BIT_XD_ADSIZE";
957 else if ((index
& ATTR_64BIT
) && (index
& ATTR_XS
) && (index
& ATTR_OPSIZE
))
958 o
<< "IC_64BIT_XS_OPSIZE";
959 else if ((index
& ATTR_64BIT
) && (index
& ATTR_XS
) && (index
& ATTR_ADSIZE
))
960 o
<< "IC_64BIT_XS_ADSIZE";
961 else if ((index
& ATTR_64BIT
) && (index
& ATTR_XS
))
963 else if ((index
& ATTR_64BIT
) && (index
& ATTR_XD
))
965 else if ((index
& ATTR_64BIT
) && (index
& ATTR_OPSIZE
) &&
966 (index
& ATTR_ADSIZE
))
967 o
<< "IC_64BIT_OPSIZE_ADSIZE";
968 else if ((index
& ATTR_64BIT
) && (index
& ATTR_OPSIZE
))
969 o
<< "IC_64BIT_OPSIZE";
970 else if ((index
& ATTR_64BIT
) && (index
& ATTR_ADSIZE
))
971 o
<< "IC_64BIT_ADSIZE";
972 else if ((index
& ATTR_64BIT
) && (index
& ATTR_REXW
))
973 o
<< "IC_64BIT_REXW";
974 else if ((index
& ATTR_64BIT
))
976 else if ((index
& ATTR_XS
) && (index
& ATTR_OPSIZE
))
978 else if ((index
& ATTR_XD
) && (index
& ATTR_OPSIZE
))
980 else if ((index
& ATTR_XS
) && (index
& ATTR_ADSIZE
))
982 else if ((index
& ATTR_XD
) && (index
& ATTR_ADSIZE
))
984 else if (index
& ATTR_XS
)
986 else if (index
& ATTR_XD
)
988 else if ((index
& ATTR_OPSIZE
) && (index
& ATTR_ADSIZE
))
989 o
<< "IC_OPSIZE_ADSIZE";
990 else if (index
& ATTR_OPSIZE
)
992 else if (index
& ATTR_ADSIZE
)
997 o
<< ", // " << index
<< "\n";
1001 o
.indent(i
* 2) << "};" << "\n";
1004 void DisassemblerTables::emitContextDecisions(raw_ostream
&o1
, raw_ostream
&o2
,
1005 unsigned &i1
, unsigned &i2
,
1006 unsigned &ModRMTableNum
) const {
1007 emitContextDecision(o1
, o2
, i1
, i2
, ModRMTableNum
, *Tables
[0], ONEBYTE_STR
);
1008 emitContextDecision(o1
, o2
, i1
, i2
, ModRMTableNum
, *Tables
[1], TWOBYTE_STR
);
1009 emitContextDecision(o1
, o2
, i1
, i2
, ModRMTableNum
, *Tables
[2],
1011 emitContextDecision(o1
, o2
, i1
, i2
, ModRMTableNum
, *Tables
[3],
1013 emitContextDecision(o1
, o2
, i1
, i2
, ModRMTableNum
, *Tables
[4], XOP8_MAP_STR
);
1014 emitContextDecision(o1
, o2
, i1
, i2
, ModRMTableNum
, *Tables
[5], XOP9_MAP_STR
);
1015 emitContextDecision(o1
, o2
, i1
, i2
, ModRMTableNum
, *Tables
[6], XOPA_MAP_STR
);
1016 emitContextDecision(o1
, o2
, i1
, i2
, ModRMTableNum
, *Tables
[7],
1018 emitContextDecision(o1
, o2
, i1
, i2
, ModRMTableNum
, *Tables
[8], MAP4_STR
);
1019 emitContextDecision(o1
, o2
, i1
, i2
, ModRMTableNum
, *Tables
[9], MAP5_STR
);
1020 emitContextDecision(o1
, o2
, i1
, i2
, ModRMTableNum
, *Tables
[10], MAP6_STR
);
1021 emitContextDecision(o1
, o2
, i1
, i2
, ModRMTableNum
, *Tables
[11], MAP7_STR
);
1024 void DisassemblerTables::emit(raw_ostream
&o
) const {
1031 raw_string_ostream
o1(s1
);
1032 raw_string_ostream
o2(s2
);
1034 emitInstructionInfo(o
, i2
);
1037 emitContextTable(o
, i2
);
1040 unsigned ModRMTableNum
= 0;
1042 o
<< "static const InstrUID modRMTable[] = {\n";
1044 std::vector
<unsigned> EmptyTable(1, 0);
1045 ModRMTable
[EmptyTable
] = ModRMTableNum
;
1046 ModRMTableNum
+= EmptyTable
.size();
1047 o1
<< "/*EmptyTable*/\n";
1048 o1
.indent(i1
* 2) << "0x0,\n";
1050 emitContextDecisions(o1
, o2
, i1
, i2
, ModRMTableNum
);
1061 void DisassemblerTables::setTableFields(ModRMDecision
&decision
,
1062 const ModRMFilter
&filter
, InstrUID uid
,
1064 for (unsigned index
= 0; index
< 256; ++index
) {
1065 if (filter
.accepts(index
)) {
1066 if (decision
.instructionIDs
[index
] == uid
)
1069 if (decision
.instructionIDs
[index
] != 0) {
1070 InstructionSpecifier
&newInfo
= InstructionSpecifiers
[uid
];
1071 InstructionSpecifier
&previousInfo
=
1072 InstructionSpecifiers
[decision
.instructionIDs
[index
]];
1074 if (previousInfo
.name
== "NOOP" &&
1075 (newInfo
.name
== "XCHG16ar" || newInfo
.name
== "XCHG32ar" ||
1076 newInfo
.name
== "XCHG64ar"))
1077 continue; // special case for XCHG*ar and NOOP
1079 if (outranks(previousInfo
.insnContext
, newInfo
.insnContext
))
1082 if (previousInfo
.insnContext
== newInfo
.insnContext
) {
1083 errs() << "Error: Primary decode conflict: ";
1084 errs() << newInfo
.name
<< " would overwrite " << previousInfo
.name
;
1086 errs() << "ModRM " << index
<< "\n";
1087 errs() << "Opcode " << (uint16_t)opcode
<< "\n";
1088 errs() << "Context " << stringForContext(newInfo
.insnContext
) << "\n";
1089 HasConflicts
= true;
1093 decision
.instructionIDs
[index
] = uid
;
1098 void DisassemblerTables::setTableFields(
1099 OpcodeType type
, InstructionContext insnContext
, uint8_t opcode
,
1100 const ModRMFilter
&filter
, InstrUID uid
, bool is32bit
, bool noPrefix
,
1101 bool ignoresVEX_L
, bool ignoresW
, unsigned addressSize
) {
1102 ContextDecision
&decision
= *Tables
[type
];
1104 for (unsigned index
= 0; index
< IC_max
; ++index
) {
1105 if ((is32bit
|| addressSize
== 16) &&
1106 inheritsFrom((InstructionContext
)index
, IC_64BIT
))
1109 bool adSize64
= addressSize
== 64;
1110 if (inheritsFrom((InstructionContext
)index
,
1111 InstructionSpecifiers
[uid
].insnContext
, noPrefix
,
1112 ignoresVEX_L
, ignoresW
, adSize64
))
1113 setTableFields(decision
.opcodeDecisions
[index
].modRMDecisions
[opcode
],
1114 filter
, uid
, opcode
);