Update Examples in dataflowAPI (#700)
[dyninst.git] / common / src / arch-x86.C
1 /*
2  * See the dyninst/COPYRIGHT file for copyright information.
3  * 
4  * We provide the Paradyn Tools (below described as "Paradyn")
5  * on an AS IS basis, and do not warrant its validity or performance.
6  * We reserve the right to update, modify, or discontinue this
7  * software at any time.  We shall have no obligation to supply such
8  * updates or modifications or any other form of support to you.
9  * 
10  * By your use of Paradyn, you understand and agree that we (or any
11  * other person or entity with proprietary rights in Paradyn) are
12  * under no obligation to provide either maintenance services,
13  * update services, notices of latent defects, or correction of
14  * defects for Paradyn.
15  * 
16  * This library is free software; you can redistribute it and/or
17  * modify it under the terms of the GNU Lesser General Public
18  * License as published by the Free Software Foundation; either
19  * version 2.1 of the License, or (at your option) any later version.
20  * 
21  * This library is distributed in the hope that it will be useful,
22  * but WITHOUT ANY WARRANTY; without even the implied warranty of
23  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
24  * Lesser General Public License for more details.
25  * 
26  * You should have received a copy of the GNU Lesser General Public
27  * License along with this library; if not, write to the Free Software
28  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
29  */
30
31 // $Id: arch-x86.C,v 1.5 2008/09/04 21:06:48 bill Exp $
32
33 // Official documentation used:    - IA-32 Intel Architecture Software Developer Manual (2001 ed.)
34 //                                 - AMD x86-64 Architecture Programmer's Manual (rev 3.00, 1/2002)
35 // Unofficial documentation used:  - www.sandpile.org/ia32
36 //                                 - NASM documentation
37 // Note: Unless specified "book" refers to Intel's manual
38
39 /**
40  *
41  * Notes on Intel decoding and where to start:
42  *
43  * The descriptions for the instructions in the Intel instruction set are defined
44  * in a struct in arch-x86.h. The struct can be summarized as follows:
45  *
46  * 1. id (Entry ID)
47  *
48  * This is used to identify the instruction. Multiple rows can have the same ID
49  * if they have the same instruction mnemonic. This ID should map with an entry
50  * in the dyn_hash_map which stores the actual string for the instruction
51  * mnemonics.
52  *
53  * 2. otable (Next Opcode Table)
54  *
55  * This is used during the decoding process. It the identifier for the next
56  * table that should be used in the decoding process. This is explained more
57  * in ia32_decode_opcode.
58  *
59  * 3. tabidx (Opcode Table Index)
60  *
61  * This is also used during the decoding process and specifies the index for the
62  * next table that should be used. Depending on the table, this value is ignored
63  * and other logic is used to make the decision as to which table index should
64  * be used next.
65  *
66  * 4. hasModRM (Whether or not this instruction has a ModR/M byte)
67  *
68  * This designates whether or not the instruction being described has a ModR/M
69  * byte or not. NOTE: This MUST be set to true for instructions that have operands
70  * that use the ModR/M byte even if you specify it has operands that use the
71  * ModR/M byte.
72  *
73  * 5. operands[3] (Instruction Operands)
74  *
75  * This is an array of descriptors for the first 3 operands. Please look at the
76  * Intel manual to see which addressing modes and operand sizes are available.
77  * We follow the same format as the Intel manual except for a couple of very
78  * rare cases.
79  *
80  * 6. legacyType (Legacy information)
81  *
82  * This is generally used for dataflow analysis and other semantic information. You
83  * shouldn't have to mess with this assuming that intel doesn't add any new instructions
84  * that are capable of changing the RIP/EIP like jumps, calls, ret, ect.
85  *
86  * 7. opsema (Operand Read/Write Semantics)
87  *
88  * This describes which operands and read and written. Search arch-x86.h for
89  * 'operand semantic' and you should be able to find the options for this.
90  *
91  * 8. impl_dec (Implicit Operand Description)
92  *
93  * This is a mask that should be used to mark implicit operands. If an operand
94  * should not be printed in AT&T syntax, then you should mask it here.
95  *
96  * The Decoding Process
97  * --------------------
98  *
99  * The main decoding function is ia32_decode, which calls a bunch of helper functions
100  * that are for the most part extremely well commented. The overall flow of the
101  * decoding process is like this:
102  *
103  * 1. Decode any prefixes
104  *
105  *      This step is really easy. When we first look at an instruction, we have
106  * to decode which bytes are prefix bytes. Usually, there is only one prefix,
107  * however some instructions can have 2 or more prefixes. All VEX instructions
108  * can only have one prefix: The VEX2, VEX3 or EVEX prefix.
109  *
110  * 2. Decode the opcode and determine the instruction description
111  *
112  *      In this step we start at some initial decoding table. The starting table
113  * is determined by which prefixes are present. If there are no prefixes present,
114  * we start in the twoByteMap. We can go through several tables in the decoding
115  * process and the logic for each table is a bit different.
116  *
117  * 3. Decode operands
118  *
119  *      In this step we look at the description we got from step 2. The operand
120  * descriptions in the ia32_entry entry are used to determine what to look for
121  * and how long the final instruction length should be.
122  *
123  * The main objective of the decoding process is to get the length of the instruction
124  * correct. Because x86 has variable length instructions, getting the instruction
125  * length wrong will mess up the decoding for the instructions that follow.
126  *
127  *
128  */
129
130
131 // This include *really must* come first in the file.
132 #include "common/src/vgannotations.h"
133
134 // This include *must* come first in the file.
135 #include "common/src/Types.h"
136
137 #include <assert.h>
138 #include <stdio.h>
139 #include <map>
140 #include <string>
141 #include <iostream>
142 #include <mutex> // once_flag, call_once
143
144 #include "boost/assign/list_of.hpp"
145 #include "boost/assign/std/vector.hpp"
146 #include "boost/assign/std/set.hpp"
147 #include <boost/thread/lock_guard.hpp>
148 #include <boost/thread/mutex.hpp>
149 #include "common/src/arch-x86.h"
150 #include "dyn_regs.h"
151
152 #if defined(os_vxworks)
153 #include "common/src/wtxKludges.h"
154 #endif
155
156 // #define VEX_DEBUG
157 // #define VEX_PEDANTIC
158
159 using namespace std;
160 using namespace boost::assign;
161
162 namespace NS_x86 {
163
164 unsigned int swapBytesIfNeeded(unsigned int i)
165 {
166     return i;
167 }
168
169 // groups
170 enum {
171   Grp1a=0, Grp1b, Grp1c, Grp1d, Grp2, Grp3a, Grp3b, Grp4, Grp5, Grp6, Grp7,
172   Grp8, Grp9, Grp11, Grp12, Grp13, Grp14, Grp15, Grp16, Grp17, GrpAMD
173 };
174
175 // SSE
176 /** START_DYNINST_TABLE_DEF(sse_table, SSE, NO) */
177 enum {
178   SSE10 = 0, SSE11, SSE12, SSE13, SSE14, SSE15, SSE16, SSE17, 
179   SSE28, SSE29, SSE2A, SSE2B, SSE2C, SSE2D, SSE2E, SSE2F,
180          SSE41, SSE42,        SSE44, SSE45, SSE46, SSE47,
181   SSE4A, SSE4B,
182   SSE50, SSE51, SSE52, SSE53, SSE54, SSE55, SSE56, SSE57,
183   SSE58, SSE59, SSE5A, SSE5B, SSE5C, SSE5D, SSE5E, SSE5F,
184   SSE60, SSE61, SSE62, SSE63, SSE64, SSE65, SSE66, SSE67,
185   SSE68, SSE69, SSE6A, SSE6B, SSE6C, SSE6D, SSE6E, SSE6F,
186   SSE70, SSE71, SSE72, SSE73, SSE74, SSE75, SSE76, SSE77,
187   SSE78, SSE79, SSE7A, SSE7B, SSE7C, SSE7D, SSE7E, SSE7F,
188   SSE90, SSE91, SSE92, SSE93,
189   SSE98, SSE99,
190   SSEB8,                             SSEBD,
191                 SSEC2, SSEC4, SSEC5, SSEC6,
192   SSED0, SSED1, SSED2, SSED3, SSED4, SSED5, SSED6, SSED7,
193   SSED8, SSED9, SSEDA, SSEDB, SSEDC, SSEDD, SSEDE, SSEDF,
194   SSEE0, SSEE1, SSEE2, SSEE3, SSEE4, SSEE5, SSEE6, SSEE7,
195   SSEE8, SSEE9, SSEEA, SSEEB, SSEEC, SSEED, SSEEE, SSEEF,
196   SSEF0, SSEF1, SSEF2, SSEF3, SSEF4, SSEF5, SSEF6, SSEF7,
197   SSEF8, SSEF9, SSEFA, SSEFB, SSEFC, SSEFD, SSEFE, SSEFF
198 };
199 /** END_DYNINST_TABLE_DEF */
200
201 /** Table that multiplexes between VEX and non VEX sse instructions */
202 /** START_DYNINST_TABLE_DEF(sse_vex_mult_table, SSEVEX, NO) */
203 enum {
204     SSEVEX41 = 0, SSEVEX42, SSEVEX44, SSEVEX45, SSEVEX46, SSEVEX47,
205     SSEVEX4A, SSEVEX4B,
206     SSEVEX73, 
207     SSEVEX78,
208     SSEVEX90, SSEVEX91, SSEVEX92, SSEVEX93, 
209     SSEVEX98, SSEVEX99
210 };
211 /** END_DYNINST_TABLE_DEF*/
212
213 // SSE VEX multiplexing table
214 /** START_DYNINST_TABLE_DEF(sse_vex_table, SSE, YES) */
215 enum { /** AUTOGENERATED */
216   SSE10_66 = 0, SSE10_F2, SSE10_F3, SSE10_NO,
217   SSE12_F2,           SSE12_F3, SSE12_NO,
218   SSE13_66,                     SSE13_NO,
219   SSE14_66,                     SSE14_NO,
220   SSE15_66,                     SSE15_NO,
221   SSE16_66,           SSE16_F3, SSE16_NO,
222   SSE28_66,                     SSE28_NO,
223   SSE2A_F2,           SSE2A_F3,
224   SSE2B_66,                     SSE2B_NO,
225   SSE2C_F2,           SSE2C_F3,
226   SSE2D_F2,           SSE2D_F3,
227   SSE2E_66,                     SSE2E_NO,
228   SSE2F_66,                     SSE2F_NO,
229   SSE41_66,                     SSE41_NO,
230   SSE42_66,                     SSE42_NO,
231   SSE44_66,                     SSE44_NO,
232   SSE45_66,                     SSE45_NO,
233   SSE46_66,                     SSE46_NO,
234   SSE47_66,                     SSE47_NO,
235   SSE4A_66,                     SSE4A_NO,
236   SSE4B_66,                     SSE4B_NO,
237   SSE51_66, SSE51_F2, SSE51_F3, SSE51_NO,
238   SSE54_66,                     SSE54_NO,
239   SSE55_66,                     SSE55_NO,
240   SSE56_66,                     SSE56_NO,
241   SSE57_66,                     SSE57_NO,
242   SSE58_66, SSE58_F2, SSE58_F3, SSE58_NO,
243   SSE59_66, SSE59_F2, SSE59_F3, SSE59_NO,
244   SSE5A_66, SSE5A_F2, SSE5A_F3, SSE5A_NO,
245   SSE5B_66, SSE5B_F3,           SSE5B_NO,
246   SSE5C_66, SSE5C_F2, SSE5C_F3, SSE5C_NO,
247   SSE5D_66, SSE5D_F2, SSE5D_F3, SSE5D_NO,
248   SSE5E_66, SSE5E_F2, SSE5E_F3, SSE5E_NO,
249   SSE5F_66, SSE5F_F2, SSE5F_F3, SSE5F_NO,
250   SSE60_66,
251   SSE61_66,
252   SSE62_66,
253   SSE63_66,
254   SSE64_66,
255   SSE65_66,
256   SSE66_66,
257   SSE67_66,
258   SSE68_66,
259   SSE69_66,
260   SSE6A_66,
261   SSE6B_66,
262   SSE6C_66,
263   SSE6D_66,
264   SSE6F_66, SSE6F_F2, SSE6F_F3,
265   SSE70_66, SSE70_F2, SSE70_F3,
266   SSE71_66,
267   SSE72_66,
268   SSE73_66,
269   SSE74_66,
270   SSE75_66,
271   SSE76_66,
272   SSE78_66, SSE78_F2, SSE78_F3, SSE78_NO,
273   SSE79_66, SSE79_F2, SSE79_F3, SSE79_NO,
274   SSE7A_66, SSE7A_F2, SSE7A_F3,
275   SSE7B_66, SSE7B_F2, SSE7B_F3,
276                       SSE7E_F3,
277   SSE7F_66,
278   SSE90_66,                     SSE90_NO,
279   SSE91_66,                     SSE91_NO,
280                                 SSE92_NO,
281   SSE93_66, SSE93_F2,           SSE93_NO,
282   SSE98_66,                     SSE98_NO,
283   SSE99_66,                     SSE99_NO,
284   SSEC2_66, SSEC2_F2, SSEC2_F3, SSEC2_NO,
285   SSEC4_66,
286   SSEC5_66,
287   SSEC6_66,                     SSEC6_NO,
288   SSED1_66,
289   SSED2_66,
290   SSED3_66,
291   SSED4_66,
292   SSED5_66,
293   SSED8_66,
294   SSED9_66,
295   SSEDA_66,
296   SSEDB_66,
297   SSEDC_66,
298   SSEDD_66,
299   SSEDE_66,
300   SSEDF_66,
301   SSEE0_66,
302   SSEE1_66,
303   SSEE2_66,
304   SSEE3_66,
305   SSEE4_66,
306   SSEE5_66,
307   SSEE6_66, SSEE6_F2, SSEE6_F3,
308   SSEE7_66,
309   SSEE8_66,
310   SSEE9_66,
311   SSEEA_66,
312   SSEEB_66,
313   SSEEC_66,
314   SSEED_66,
315   SSEEE_66,
316   SSEEF_66,
317   SSEF1_66,
318   SSEF2_66,
319   SSEF3_66,
320   SSEF4_66,
321   SSEF5_66,
322   SSEF6_66,
323   SSEF8_66,
324   SSEF9_66,
325   SSEFA_66,
326   SSEFB_66,
327   SSEFC_66,
328   SSEFD_66,
329   SSEFE_66,
330 };
331 /** END_DYNINST_TABLE_DEF */
332
333 // SSE BIS
334 /** START_DYNINST_TABLE_DEF(sse_bis_table, SSEB, YES) */
335 enum {
336 SSEB00 = 0, SSEB01, SSEB02, SSEB03, SSEB04, SSEB05, SSEB06, SSEB07,
337     SSEB08, SSEB09,     SSEB0A, SSEB0B, SSEB0C, SSEB0D, SSEB0E, SSEB0F,
338     SSEB10, SSEB11, SSEB12, SSEB13, SSEB14, SSEB15, SSEB16, SSEB17,
339     SSEB18, SSEB19, SSEB1A, SSEB1B, SSEB1C, SSEB1D, SSEB1E, SSEB1F,
340         SSEB20, SSEB21, SSEB22, SSEB23, SSEB24, SSEB25, SSEB26, SSEB27,
341         SSEB28, SSEB29, SSEB2A, SSEB2B, SSEB2C, SSEB2D, SSEB2E, SSEB2F,
342         SSEB30, SSEB31, SSEB32, SSEB33, SSEB34, SSEB35, SSEB36, SSEB37,
343         SSEB38, SSEB39, SSEB3A, SSEB3B, SSEB3C, SSEB3D, SSEB3E, SSEB3F,
344         SSEB40, SSEB41, SSEB42, SSEB43, SSEB44, SSEB45, SSEB46, SSEB47,
345                                     SSEB4C, SSEB4D, SSEB4E, SSEB4F,
346     SSEB58, SSEB59, SSEB5A,
347                                             SSEB65, SSEB66,
348                                             SSEB75, SSEB76, SSEB77,
349     SSEB78, SSEB79,                 SSEB7C, SSEB7D, SSEB7E, SSEB7F,
350                             SSEB83,
351     SSEB88, SSEB89,         SSEB8B, SSEB8C, SSEB8D, SSEB8E,
352     SSEB90, SSEB91, SSEB92, SSEB93,
353                                                     SSEB96, SSEB97,
354     SSEB98, SSEB99, SSEB9A, SSEB9B, SSEB9C, SSEB9D, SSEB9E, SSEB9F,
355     SSEBA0, SSEBA1, SSEBA2, SSEBA3,                 SSEBA6, SSEBA7,
356     SSEBA8, SSEBA9, SSEBAA, SSEBAB, SSEBAC, SSEBAD, SSEBAE, SSEBAF,
357                                     SSEBB4, SSEBB5, SSEBB6, SSEBB7,
358     SSEBB8, SSEBB9, SSEBBA, SSEBBB, SSEBBC, SSEBBD, SSEBBE, SSEBBF,
359                                     SSEBC4,         SSEBC6, SSEBC7,
360     SSEBC8,         SSEBCA, SSEBCB, SSEBCC, SSEBCD,
361                             SSEBDB, SSEBDC, SSEBDD, SSEBDE, SSEBDF,
362     SSEBF0, SSEBF1, SSEBF2,                 SSEBF5, SSEBF6, SSEBF7
363 };
364 /** END_DYNINST_TABLE_DEF */
365
366
367 // SSEB rows: not, F3, 66, F2, 66&F2
368 // SSE BIS VEX mult table
369 /** START_DYNINST_TABLE_DEF(sse_bis_vex_table, SSEB, YES) */
370 enum { /** AUTOGENERATED */
371     SSEB00_66 = 0,
372     SSEB01_66,
373     SSEB02_66,
374     SSEB03_66,
375     SSEB04_66,
376     SSEB05_66,
377     SSEB06_66,
378     SSEB07_66,
379     SSEB0B_66,
380     SSEB0C_66,
381     SSEB0D_66,
382     SSEB10_66,              SSEB10_F3,
383     SSEB11_66,              SSEB11_F3,
384     SSEB12_66,              SSEB12_F3,
385     SSEB13_66,              SSEB13_F3,
386     SSEB14_66,              SSEB14_F3,
387     SSEB15_66,              SSEB15_F3,
388     SSEB16_66,
389     SSEB18_66,
390     SSEB19_66,
391     SSEB1A_66,
392     SSEB1C_66,
393     SSEB1D_66,
394     SSEB1E_66,
395     SSEB1F_66,
396     SSEB20_66,              SSEB20_F3,
397     SSEB21_66,              SSEB21_F3,
398     SSEB22_66,              SSEB22_F3,
399     SSEB23_66,              SSEB23_F3,
400     SSEB24_66,              SSEB24_F3,
401     SSEB25_66,              SSEB25_F3,
402     SSEB26_F3,
403     SSEB27_66,              SSEB27_F3,
404     SSEB28_66,              SSEB28_F3,
405     SSEB29_66,              SSEB29_F3,
406     SSEB2A_66,              SSEB2A_F3,
407     SSEB2B_66,
408     SSEB30_66,              SSEB30_F3,
409     SSEB31_66,              SSEB31_F3,
410     SSEB32_66,              SSEB32_F3,
411     SSEB33_66,              SSEB33_F3,
412     SSEB34_66,              SSEB34_F3,
413     SSEB35_66,              SSEB35_F3,
414     SSEB36_66,
415     SSEB37_66,
416     SSEB38_66,              SSEB38_F3,
417     SSEB39_66,              SSEB39_F3,
418     SSEB3A_66,
419     SSEB3B_66,
420     SSEB3C_66,
421     SSEB3D_66,
422     SSEB3E_66,
423     SSEB3F_66,
424     SSEB40_66,
425     SSEB42_66,
426     SSEB43_66,
427     SSEB44_66,
428     SSEB45_66,
429     SSEB46_66,
430     SSEB47_66,
431     SSEB4C_66,
432     SSEB4D_66,
433     SSEB4E_66,
434     SSEB4F_66,
435     SSEB65_66,
436     SSEB66_66,
437     SSEB75_66,
438     SSEB76_66,
439     SSEB77_66,
440     SSEB7C_66,
441     SSEB7D_66,
442     SSEB7E_66,
443     SSEB7F_66,
444     SSEB83_66,
445     SSEB88_66,
446     SSEB89_66,
447     SSEB8B_66,
448     SSEB8C_66,
449     SSEB8D_66,
450     SSEB8E_66,
451     SSEB90_66,
452     SSEB91_66,
453     SSEB92_66,
454     SSEB93_66,
455     SSEB96_66,
456     SSEB97_66,
457     SSEB98_66,
458     SSEB99_66,
459     SSEB9A_66,
460     SSEB9B_66,
461     SSEB9C_66,
462     SSEB9D_66,
463     SSEB9E_66,
464     SSEB9F_66,
465     SSEBA0_66,
466     SSEBA1_66,
467     SSEBA2_66,
468     SSEBA3_66,
469     SSEBA6_66,
470     SSEBA7_66,
471     SSEBA8_66,
472     SSEBA9_66,
473     SSEBAA_66,
474     SSEBAB_66,
475     SSEBAC_66,
476     SSEBAD_66,
477     SSEBAE_66,
478     SSEBAF_66,
479     SSEBB4_66,
480     SSEBB5_66,
481     SSEBB6_66,
482     SSEBB7_66,
483     SSEBB8_66,
484     SSEBB9_66,
485     SSEBBA_66,
486     SSEBBB_66,
487     SSEBBC_66,
488     SSEBBD_66,
489     SSEBBE_66,
490     SSEBBF_66,
491     SSEBC4_66,
492     SSEBC6_66,
493     SSEBC7_66,
494     SSEBC8_66,
495     SSEBCA_66,
496     SSEBCB_66,
497     SSEBCC_66,
498     SSEBCD_66,
499     SSEBDB_66,
500     SSEBDC_66,
501     SSEBDD_66,
502     SSEBDE_66,
503     SSEBDF_66,
504                                      SSEBF2_NO,
505                SSEBF5_F2, SSEBF5_F3, SSEBF5_NO,
506                SSEBF6_F2, SSEBF6_F3,
507     SSEBF7_66, SSEBF7_F2, SSEBF7_F3,  SSEBF7_NO
508 };
509 /** END_DYNINST_TABLE_DEF */
510
511
512 // SSE TER 
513 /** START_DYNINST_TABLE_DEF(sse_ter_table, SSET, NO) */
514 enum {
515 SSET00 = 0, SSET01, SSET02, SSET03, SSET04, SSET05, SSET06,
516     SSET08, SSET09, SSET0A, SSET0B, SSET0C, SSET0D, SSET0E, SSET0F,
517                                         SSET14, SSET15, SSET16, SSET17,
518         SSET18, SSET19, SSET1A, SSET1B,         SSET1D, SSET1E, SSET1F,
519         SSET20, SSET21, SSET22, SSET23,         SSET25, SSET26, SSET27,
520     SSET30, SSET31, SSET32, SSET33,
521     SSET38, SSET39, SSET3A, SSET3B,                 SSET3E, SSET3F,
522         SSET40, SSET41, SSET42,         SSET44,         SSET46,
523                     SSET4A, SSET4B, SSET4C,
524     SSET50, SSET51,                 SSET54, SSET55, SSET56, SSET57,
525         SSET60, SSET61, SSET62, SSET63,                 SSET66, SSET67,
526             SSET69,
527                                                             SSETDF,
528     SSETF0
529 };
530 /** END_DYNINST_TABLE_DEF */
531
532 // SSET rows:  not, 66, F2
533 // SSE TER VEX Mult
534 /** START_DYNINST_TABLE_DEF(sse_vex_ter_table, SSET, NO) */
535 enum { /** AUTOGENERATED */
536   SSET00_66 = 0,
537   SSET01_66,
538   SSET03_66,
539   SSET04_66,
540   SSET05_66,
541   SSET08_66,
542   SSET09_66,
543   SSET0A_66,
544   SSET0B_66,
545   SSET0C_66,
546   SSET0F_66,
547   SSET14_66,
548   SSET16_66,
549   SSET17_66,
550   SSET18_66,
551   SSET19_66,
552   SSET1A_66,
553   SSET1B_66,
554   SSET1D_66,
555   SSET1E_66,
556   SSET1F_66,
557   SSET20_66,
558   SSET21_66,
559   SSET22_66,
560   SSET23_66,
561   SSET25_66,
562   SSET26_66,
563   SSET27_66,
564   SSET30_66,
565   SSET31_66,
566   SSET32_66,
567   SSET33_66,
568   SSET38_66,
569   SSET39_66,
570   SSET3A_66,
571   SSET3B_66,
572   SSET3E_66,
573   SSET3F_66,
574   SSET42_66,
575   SSET44_66,
576   SSET4A_66,
577   SSET4B_66,
578   SSET4C_66,
579   SSET50_66,
580   SSET51_66,
581   SSET54_66,
582   SSET55_66,
583   SSET56_66,
584   SSET57_66,
585   SSET66_66,
586   SSET67_66,
587   SSET69_66,
588   SSETDF_66,
589   SSETF0_F2
590 };
591
592
593 /* FMA4 rows */
594 enum {
595 FMA46A,
596 FMA46B,
597 FMA46D,
598 FMA46F,
599 FMA479,
600 FMA47B
601 };
602 /** END_DYNINST_TABLE_DEF */
603
604 // SSE groups
605 /** START_DYNINST_TABLE_DEF(sse_grp_map, G, NO) */
606 enum {
607   G12SSE010B = 0, G12SSE100B, G12SSE110B,
608   G13SSE010B, G13SSE100B, G13SSE110B,
609   G14SSE010B, G14SSE011B, G14SSE110B, G14SSE111B,
610 };
611 /** END_DYNINST_TABLE_DEF */
612
613 enum {
614     GrpD8=0, GrpD9, GrpDA, GrpDB, GrpDC, GrpDD, GrpDE, GrpDF
615 };
616
617 // VEX table
618 /** START_DYNINST_TABLE_DEF(vexl_table, VEXL, NO) */
619 enum {
620 VEXL00 = 0
621 };
622 /** END_DYNINST_TABLE_DEF */
623
624 /* Vex instructions that need extra decoding with the W bit */
625 /** START_DYNINST_TABLE_DEF(vex_w_table, VEXW, NO) */
626 enum {
627 VEXW00 = 0, VEXW01, VEXW02, VEXW03, VEXW04, VEXW05, VEXW06, VEXW07,
628   VEXW08, VEXW09, VEXW0A, VEXW0B, VEXW0C, VEXW0D, VEXW0E, VEXW0F,
629   VEXW10, VEXW11, VEXW12, VEXW13, VEXW14, VEXW15, VEXW16, VEXW17,
630   VEXW18, VEXW19, VEXW1A, VEXW1B, VEXW1C, VEXW1D, VEXW1E, VEXW1F,
631   VEXW20, VEXW21, VEXW22, VEXW23, VEXW24, VEXW25, VEXW26, VEXW27,
632   VEXW28, VEXW29, VEXW2A, VEXW2B, VEXW2C, VEXW2D, VEXW2E, VEXW2F,
633   VEXW30, VEXW31, VEXW32, VEXW33, VEXW34, VEXW35, VEXW36, VEXW37,
634   VEXW38, VEXW39, VEXW3A, VEXW3B, VEXW3C, VEXW3D, VEXW3E, VEXW3F,
635   VEXW40, VEXW41, VEXW42, VEXW43, VEXW44, VEXW45, VEXW46, VEXW47,
636   VEXW48, VEXW49, VEXW4A, VEXW4B, VEXW4C, VEXW4D, VEXW4E, VEXW4F,
637   VEXW50, VEXW51, VEXW52, VEXW53, VEXW54, VEXW55, VEXW56, VEXW57,
638   VEXW58, VEXW59, VEXW5A, VEXW5B, VEXW5C, VEXW5D, VEXW5E, VEXW5F,
639   VEXW60, VEXW61, VEXW62, VEXW63, VEXW64, VEXW65, VEXW66, VEXW67,
640   VEXW68, VEXW69, VEXW6A, VEXW6B, VEXW6C, VEXW6D, VEXW6E, VEXW6F,
641   VEXW70, VEXW71, VEXW72, VEXW73, VEXW74, VEXW75, VEXW76, VEXW77,
642   VEXW78, VEXW79, VEXW7A, VEXW7B, VEXW7C, VEXW7D, VEXW7E, VEXW7F,
643   VEXW80, VEXW81, VEXW82, VEXW83, VEXW84, VEXW85, VEXW86, VEXW87,
644   VEXW88, VEXW89, VEXW8A, VEXW8B, VEXW8C, VEXW8D, VEXW8E, VEXW8F,
645   VEXW90, VEXW91, VEXW92, VEXW93, VEXW94, VEXW95, VEXW96
646 };
647 /** END_DYNINST_TABLE_DEF */
648
649
650 #define VEXW_MAX VEXW96
651
652 /* XOP8 instructions that use xop.w as selector */
653 enum{
654 XOP8_A2,
655 XOP8_A3
656 };
657
658 /* XOP9 instructions that use xop.w as selector */
659 enum {
660 XOP9_9A
661 };
662
663 /* SIMD op conversion table */
664 static int vex3_simdop_convert[3][4] = {
665   {0, 2,  1, 3},
666   {0, 2,  1, 3},
667   {0, 1, -1, 2}
668 };
669
670 /**
671  * Operand descriptors:
672  *
673  * These are used to describe the addressing mode and the size of
674  * the operand.
675  */
676
677 #define Zz   { 0, 0 }
678 #define ImplImm { am_ImplImm, op_b }
679 #define Ap   { am_A, op_p }
680 #define Bv   { am_B, op_v}
681 #define Cd   { am_C, op_d }
682 #define Dd   { am_D, op_d }
683 #define Eb   { am_E, op_b }
684 #define Ed   { am_E, op_d }
685 #define Ef   { am_E, op_f }
686 #define Efd  { am_E, op_dbl }
687 #define Ep   { am_E, op_p }
688 #define Ev   { am_E, op_v }
689 #define Ew   { am_E, op_w }
690 #define Ey       { am_E, op_y }
691 #define Fv   { am_F, op_v }
692 #define Gb   { am_G, op_b }
693 #define Gd   { am_G, op_d }
694 #define Gv   { am_G, op_v }
695 #define Gw   { am_G, op_w }
696 #define Gf   { am_G, op_f }
697 #define Gfd  { am_G, op_dbl }
698 #define Hps  { am_H, op_ps }
699 #define Hpd  { am_H, op_pd }
700 #define Hss  { am_H, op_ss }
701 #define Hsd  { am_H, op_sd }
702 #define Hdq  { am_H, op_dq }
703 #define Hqq  { am_H, op_qq }
704 #define HK   { am_HK, op_b }
705 #define Ib   { am_I, op_b }
706 #define IK   { am_I, op_b }
707 #define Iv   { am_I, op_v }
708 #define Iw   { am_I, op_w }
709 #define Iz   { am_I, op_z }
710 #define Jb   { am_J, op_b }
711 #define Jv   { am_J, op_v }
712 #define Jz   { am_J, op_z }
713 #define Lb   { am_L, op_b }
714 #define Ma   { am_M, op_a }
715 #define Mb   { am_M, op_b }
716 #define Mlea { am_M, op_lea }
717 #define Mp   { am_M, op_p }
718 #define Ms   { am_M, op_s }
719 #define Md   { am_M, op_d }
720 #define Mq   { am_M, op_q }
721 #define Mdq  { am_M, op_dq }
722 #define M512 { am_M, op_512 }
723 #define Mf   { am_M, op_f }
724 #define Mfd  { am_M, op_dbl }
725 #define M14  { am_M, op_14 }
726 #define Mv   { am_M, op_v }
727 #define Nss  { am_N, op_ss }
728 #define Ob   { am_O, op_b }
729 #define Ov   { am_O, op_v }
730 #define Pd   { am_P, op_d }
731 #define Pdq  { am_P, op_dq }
732 #define Ppi  { am_P, op_pi }
733 #define Pq   { am_P, op_q }
734 #define Qdq  { am_Q, op_dq }
735 #define Qd   { am_Q, op_d }
736 #define Qpi  { am_Q, op_pi }
737 #define Qq   { am_Q, op_q }
738 #define Rd   { am_R, op_d }
739 #define RMb  { am_RM, op_b }
740 #define RMw  { am_RM, op_w }
741 #define Td   { am_T, op_d }
742 #define UMd      { am_UM, op_d }
743 #define Ups  { am_U, op_ps }
744 #define Upd  { am_U, op_pd }
745 #define Sw   { am_S, op_w }
746 #define Vd   { am_V, op_d }
747 #define Vdq  { am_V, op_dq }
748 #define Vpd  { am_V, op_pd }
749 #define Vps  { am_V, op_ps }
750 #define Vq   { am_V, op_q }
751 #define Vss  { am_V, op_ss }
752 #define Vsd  { am_V, op_sd }
753 #define VK   { am_VK, op_b }
754 #define Wdq  { am_W, op_dq }
755 #define Wpd  { am_W, op_pd }
756 #define Wqq  { am_W, op_qq }
757 #define Wps  { am_W, op_ps }
758 #define Wq   { am_W, op_q }
759 #define Wb   { am_W, op_b }
760 #define Ww   { am_W, op_w }
761 #define Wd   { am_W, op_d }
762 #define Ws   { am_W, op_s }
763 #define Wsd  { am_W, op_sd }
764 #define Wss  { am_W, op_ss }
765 #define WK   { am_WK, op_ps }
766 #define Xb   { am_X, op_b }
767 #define Xv   { am_X, op_v }
768 #define Yb   { am_Y, op_b }
769 #define Yv   { am_Y, op_v }
770 #define STHb { am_stackH, op_b }
771 #define STPb { am_stackP, op_b }
772 #define STHv { am_stackH, op_v }
773 #define STPv { am_stackP, op_v }
774 #define STHw { am_stackH, op_w }
775 #define STPw { am_stackP, op_w }
776 #define STHd { am_stackH, op_d }
777 #define STPd { am_stackP, op_d }
778 #define STHa { am_stackH, op_allgprs }
779 #define STPa { am_stackP, op_allgprs }
780
781 #define STKb { am_stack, op_b }
782 #define STKv { am_stack, op_v }
783 #define STKw { am_stack, op_w }
784 #define STKd { am_stack, op_d }
785 #define STKa { am_stack, op_allgprs }
786
787
788 #define GPRS { am_allgprs, op_allgprs }
789
790 #define AH   { am_reg, x86::iah }
791 #define AX   { am_reg, x86::iax }
792 #define BH   { am_reg, x86::ibh }
793 #define CH   { am_reg, x86::ich }
794 #define DH   { am_reg, x86::idh }
795 #define AL   { am_reg, x86::ial }
796 #define BL   { am_reg, x86::ibl }
797 #define CL   { am_reg, x86::icl }
798 #define CS   { am_reg, x86::ics }
799 #define DL   { am_reg, x86::idl }
800 #define DX   { am_reg, x86::idx }
801 #define eAX  { am_reg, x86::ieax }
802 #define eBX  { am_reg, x86::iebx }
803 #define eCX  { am_reg, x86::iecx }
804 #define eDX  { am_reg, x86::iedx }
805 #define EAX  { am_reg, x86::ieax }
806 #define EBX  { am_reg, x86::iebx }
807 #define ECX  { am_reg, x86::iecx }
808 #define EDX  { am_reg, x86::iedx }
809 #define DS   { am_reg, x86::ids }
810 #define ES   { am_reg, x86::ies }
811 #define FS   { am_reg, x86::ifs }
812 #define GS   { am_reg, x86::igs }
813 #define SS   { am_reg, x86::iss }
814 #define eSP  { am_reg, x86::iesp }
815 #define eBP  { am_reg, x86::iebp }
816 #define eSI  { am_reg, x86::iesi }
817 #define eDI  { am_reg, x86::iedi }
818 #define ESP  { am_reg, x86::iesp }
819 #define EBP  { am_reg, x86::iebp }
820 #define ESI  { am_reg, x86::iesi }
821 #define EDI  { am_reg, x86::iedi }
822 #define ECXEBX { am_tworeghack, op_ecxebx }
823 #define EDXEAX { am_tworeghack, op_edxeax }
824 #define rAX  { am_reg, x86::ieax }
825 #define rBX  { am_reg, x86::iebx }
826 #define rCX  { am_reg, x86::iecx }
827 #define rDX  { am_reg, x86::iedx }
828 #define rSP  { am_reg, x86::iesp }
829 #define rBP  { am_reg, x86::iebp }
830 #define rSI  { am_reg, x86::iesi }
831 #define rDI  { am_reg, x86::iedi }
832 #define ST0  { am_reg, x86::ist0 }
833 #define ST1  { am_reg, x86::ist1 }
834 #define ST2  { am_reg, x86::ist2 }
835 #define ST3  { am_reg, x86::ist3 }
836 #define ST4  { am_reg, x86::ist4 }
837 #define ST5  { am_reg, x86::ist5 }
838 #define ST6  { am_reg, x86::ist6 }
839 #define ST7  { am_reg, x86::ist7 }
840 #define FPOS 17
841
842 enum {
843   fNT=1,   // non-temporal
844   fPREFETCHNT,
845   fPREFETCHT0,
846   fPREFETCHT1,
847   fPREFETCHT2,
848   fPREFETCHAMDE,
849   fPREFETCHAMDW,
850   fCALL,
851   fNEARRET,
852   fFARRET,
853   fIRET,
854   fENTER,
855   fLEAVE,
856   fXLAT,
857   fIO,
858   fSEGDESC,
859   fCOND,
860   fCMPXCH,
861   fCMPXCH8,
862   fINDIRCALL,
863   fINDIRJUMP,
864   fFXSAVE,
865   fFXRSTOR,
866   fCLFLUSH,
867   fREP,   // only rep prefix allowed: ins, movs, outs, lods, stos
868   fSCAS,
869   fCMPS
870 };
871
872 COMMON_EXPORT dyn_hash_map<entryID, std::string> entryNames_IAPI = map_list_of
873   (e_aaa, "aaa")
874   (e_aad, "aad")
875   (e_aam, "aam")
876   (e_aas, "aas")
877   (e_adc, "adc")
878   (e_add, "add")
879   (e_addpd, "addpd")
880   (e_addps, "addps")
881   (e_addsd, "addsd")
882   (e_addss, "addss")
883   (e_addsubpd, "addsubpd")
884   (e_addsubps, "addsubps")
885   (e_aesenc, "aesenc")
886   (e_aesenclast, "aesenclast")
887   (e_aesdec, "aesdec")
888   (e_aesdeclast, "aesdeclast")
889   (e_aeskeygenassist, "aeskeygenassist")
890   (e_aesimc, "aesimc")
891   (e_pclmullqlqdq, "pclmullqlqdq")
892   (e_and, "and")
893   (e_andnpd, "andnpd")
894   (e_andnps, "andnps")
895   (e_andpd, "andpd")
896   (e_andps, "andps")
897   (e_arpl, "arpl")
898   (e_blendpd,"blendpd")
899   (e_blendps, "blendps")
900   (e_blendvpd, "blendvpd")
901   (e_blendvps, "blendvps")
902   (e_bound, "bound")
903   (e_bsf, "bsf")
904   (e_bsr, "bsr")
905   (e_bswap, "bswap")
906   (e_bt, "bt")
907   (e_btc, "btc")
908   (e_btr, "btr")
909   (e_bts, "bts")
910   (e_call, "call")
911   (e_cbw, "cbw")
912   (e_cdq, "cdq")
913   (e_clc, "clc")
914   (e_cld, "cld")
915   (e_clflush, "clflush")
916   (e_cli, "cli")
917   (e_clts, "clts")
918   (e_cmc, "cmc")
919   (e_cmovbe, "cmovbe")
920   (e_cmove, "cmove")
921   (e_cmovnae, "cmovnae")
922   (e_cmovnb, "cmovnb")
923   (e_cmovnbe, "cmovnbe")
924   (e_cmovne, "cmovne")
925   (e_cmovng, "cmovng")
926   (e_cmovnge, "cmovnge")
927   (e_cmovnl, "cmovnl")
928   (e_cmovno, "cmovno")
929   (e_cmovns, "cmovns")
930   (e_cmovo, "cmovo")
931   (e_cmovpe, "cmovpe")
932   (e_cmovpo, "cmovpo")
933   (e_cmovs, "cmovs")
934   (e_cmp, "cmp")
935   (e_cmppd, "cmppd")
936   (e_cmpps, "cmpps")
937   (e_cmpsb, "cmpsb")
938   (e_cmpsd, "cmpsd")
939   (e_cmpsd_sse, "cmpsd")
940   (e_cmpss, "cmpss")
941   (e_cmpsw, "cmpsw")
942   (e_cmpxch, "cmpxch")
943   (e_cmpxch8b, "cmpxch8b")
944   (e_comisd, "comisd")
945   (e_comiss, "comiss")
946   (e_cpuid, "cpuid")
947   (e_crc32, "crc32")
948   (e_cvtdq2pd, "cvtdq2pd")
949   (e_cvtdq2ps, "cvtdq2ps")
950   (e_cvtpd2dq, "cvtpd2dq")
951   (e_cvtpd2pi, "cvtpd2pi")
952   (e_cvtpd2ps, "cvtpd2ps")
953   (e_cvtpi2pd, "cvtpi2pd")
954   (e_cvtpi2ps, "cvtpi2ps")
955   (e_cvtps2dq, "cvtps2dq")
956   (e_cvtps2pd, "cvtps2pd")
957   (e_cvtps2pi, "cvtps2pi")
958   (e_cvtsd2si, "cvtsd2si")
959   (e_cvtsd2ss, "cvtsd2ss")
960   (e_cvtsi2sd, "cvtsi2sd")
961   (e_cvtsi2ss, "cvtsi2ss")
962   (e_cvtss2sd, "cvtss2sd")
963   (e_cvtss2si, "cvtss2si")
964   (e_cvttpd2dq, "cvttpd2dq")
965   (e_cvttpd2pi, "cvttpd2pi")
966   (e_cvttps2dq, "cvttps2dq")
967   (e_cvttps2pi, "cvttps2pi")
968   (e_cvttsd2si, "cvttsd2si")
969   (e_cvttss2si, "cvttss2si")
970   (e_cwd, "cwd")
971   (e_cwde, "cwde")
972   (e_daa, "daa")
973   (e_das, "das")
974   (e_dec, "dec")
975   (e_div, "div")
976   (e_divpd, "divpd")
977   (e_divps, "divps")
978   (e_divsd, "divsd")
979   (e_divss, "divss")
980   (e_dppd, "dppd")
981   (e_vdppd, "vdppd")
982   (e_dpps, "dpps")
983   (e_emms, "emms")
984   (e_enter, "enter")
985   (e_extractps, "extractps")
986   (e_extrq, "extrq")
987   (e_fadd, "fadd")
988   (e_faddp, "faddp")
989  (e_f2xm1, "f2xm1")
990   (e_fbld, "fbld")
991   (e_fbstp, "fbstp")
992  (e_fchs, "fchs")
993  (e_fcmovb, "fcmovb")
994  (e_fcmovbe, "fcmovbe")
995  (e_fcmove, "fcmove")
996  (e_fcmovne, "fcmovne")
997  (e_fcmovu, "fcmovu")
998  (e_fcmovnu, "fcmovnu")
999  (e_fcmovnb, "fcmovnb")
1000  (e_fcmovnbe, "fcmovnbe")
1001   (e_fcom, "fcom")
1002   (e_fcomi, "fcomi")
1003   (e_fcomip, "fcomip")
1004   (e_fcomp, "fcomp")
1005   (e_fcompp, "fcompp")
1006   (e_fdiv, "fdiv")
1007   (e_fdivp, "fdivp")
1008   (e_fdivr, "fdivr")
1009   (e_fdivrp, "fdivrp")
1010   (e_femms, "femms")
1011  (e_ffree, "ffree")
1012  (e_ffreep, "ffreep")
1013   (e_fiadd, "fiadd")
1014   (e_ficom, "ficom")
1015   (e_ficomp, "ficomp")
1016   (e_fidiv, "fidiv")
1017   (e_fidivr, "fidivr")
1018   (e_fild, "fild")
1019   (e_fimul, "fimul")
1020   (e_fist, "fist")
1021   (e_fistp, "fistp")
1022   (e_fisttp, "fisttp")
1023   (e_fisub, "fisub")
1024   (e_fisubr, "fisubr")
1025   (e_fld, "fld")
1026  (e_fld1, "fld1")
1027   (e_fldcw, "fldcw")
1028   (e_fldenv, "fldenv")
1029   (e_fmul, "fmul")
1030   (e_fmulp, "fmulp")
1031   (e_fnop, "fnop")
1032  (e_fprem, "fprem")
1033   (e_frstor, "frstor")
1034   (e_fsave, "fsave")
1035   (e_fst, "fst")
1036   (e_fstcw, "fstcw")
1037   (e_fstenv, "fstenv")
1038   (e_fstp, "fstp")
1039   (e_fstsw, "fstsw")
1040   (e_fsub, "fsub")
1041   (e_fsubp, "fsubp")
1042   (e_fsubr, "fsubr")
1043   (e_fsubrp, "fsubrp")
1044   (e_fucom, "fucom")
1045   (e_fucomp, "fucomp")
1046   (e_fucomi, "fucomi")
1047   (e_fucomip, "fucomip")
1048   (e_fucompp, "fucompp")
1049  (e_fxch, "fxch")
1050   (e_fxrstor, "fxrstor")
1051   (e_fxsave, "fxsave")
1052   (e_getsec, "getsec")
1053   (e_xbegin, "xbegin")
1054   (e_xabort, "xabort")
1055   (e_xrstors, "xrstors")
1056   (e_haddpd, "haddpd")
1057   (e_haddps, "haddps")
1058   (e_hlt, "hlt")
1059   (e_hsubpd, "hsubpd")
1060   (e_hsubps, "hsubps")
1061   (e_idiv, "idiv")
1062   (e_imul, "imul")
1063   (e_in, "in")
1064   (e_inc, "inc")
1065   (e_insb, "insb")
1066   (e_insd, "insd")
1067   (e_insertps, "insertps")
1068   (e_insertq, "insertq")
1069   (e_insw, "insw")
1070   (e_int, "int")
1071   (e_int3, "int 3")
1072   (e_int1, "int1")
1073   (e_int80, "int 80")
1074   (e_into, "into")
1075   (e_invd, "invd")
1076   (e_invlpg, "invlpg")
1077   (e_iret, "iret")
1078   (e_jb, "jb")
1079   (e_jb_jnaej_j, "jb")
1080   (e_jbe, "jbe")
1081   (e_jcxz_jec, "jcxz")
1082   (e_jl, "jl")
1083   (e_jle, "jle")
1084   (e_jmp, "jmp")
1085   (e_jnb, "jnb")
1086   (e_jnb_jae_j, "jnb")
1087   (e_jnbe, "jnbe")
1088   (e_jnl, "jnl")
1089   (e_jnle, "jnle")
1090   (e_jno, "jno")
1091   (e_jnp, "jnp")
1092   (e_jns, "jns")
1093   (e_jnz, "jnz")
1094   (e_jo, "jo")
1095   (e_jp, "jp")
1096   (e_js, "js")
1097   (e_jz, "jz")
1098   (e_lahf, "lahf")
1099   (e_lar, "lar")
1100   (e_ldmxcsr, "ldmxcsr")
1101   (e_lds, "lds")
1102   (e_lddqu, "lddqu")
1103   (e_lea, "lea")
1104   (e_leave, "leave")
1105   (e_les, "les")
1106   (e_lfence, "lfence")
1107   (e_lfs, "lfs")
1108   (e_lgdt, "lgdt")
1109   (e_lgs, "lgs")
1110   (e_lidt, "lidt")
1111   (e_lldt, "lldt")
1112   (e_lmsw, "lmsw")
1113   (e_lodsb, "lodsb")
1114   (e_lodsd, "lodsd")
1115   (e_lodsw, "lodsw")
1116   (e_loop, "loop")
1117   (e_loope, "loope")
1118   (e_loopn, "loopn")
1119   (e_lsl, "lsl")
1120   (e_lss, "lss")
1121   (e_ltr, "ltr")
1122   (e_maskmovdqu, "maskmovdqu")
1123   (e_maskmovq, "maskmovq")
1124   (e_maxpd, "maxpd")
1125   (e_maxps, "maxps")
1126   (e_maxsd, "maxsd")
1127   (e_maxss, "maxss")
1128   (e_mfence, "mfence")
1129   (e_minpd, "minpd")
1130   (e_minps, "minps")
1131   (e_minsd, "minsd")
1132   (e_minss, "minss")
1133   (e_mmxud, "mmxud")
1134   (e_mov, "mov")
1135   (e_movapd, "movapd")
1136   (e_movaps, "movaps")
1137   (e_movbe, "movbe")
1138   (e_movd, "movd")
1139   (e_movddup, "movddup")
1140   (e_movdq2q, "movdq2q")
1141   (e_movdqa, "movdqa")
1142   (e_movdqu, "movdqu")
1143   (e_movhpd, "movhpd")
1144   (e_movhps, "movhps")
1145   (e_movhps_movlhps, "movhps/movlhps")
1146   (e_movlpd, "movlpd")
1147   (e_movlps, "movlps")
1148   (e_movlps_movhlps, "movlps/movhlps")
1149   (e_movmskpd, "movmskpd")
1150   (e_movmskps, "movmskps")
1151   (e_movntdq, "movntdq")
1152   (e_movntdqa, "movntdqa")
1153   (e_movnti, "movnti")
1154   (e_movntpd, "movntpd")
1155   (e_movntps, "movntps")
1156   (e_movntq, "movntq")
1157   (e_movq, "movq")
1158   (e_movq2dq, "movq2dq")
1159   (e_movsb, "movsb")
1160   (e_movsd, "movsd")
1161   (e_movsd_sse, "movsd")
1162   (e_movshdup, "movshdup")
1163   (e_movsldup, "movsldup")
1164   (e_movslq, "movslq")
1165   (e_movss, "movss")
1166   (e_movsw, "movsw")
1167   (e_movsx, "movsx")
1168   (e_movsxd, "movsxd")
1169   (e_movupd, "movupd")
1170   (e_movups, "movups")
1171   (e_movzx, "movzx")
1172   (e_mpsadbw, "mpsadbw")
1173   (e_mul, "mul")
1174   (e_mulpd, "mulpd")
1175   (e_mulps, "mulps")
1176   (e_mulsd, "mulsd")
1177   (e_mulss, "mulss")
1178   (e_neg, "neg")
1179   (e_nop, "nop")
1180   (e_not, "not")
1181   (e_or, "or")
1182   (e_orpd, "orpd")
1183   (e_orps, "orps")
1184   (e_out, "out")
1185   (e_outsb, "outsb")
1186   (e_outsd, "outsd")
1187   (e_outsw, "outsw")
1188   (e_pabsb, "pabsb")
1189   (e_pabsd, "pabsd")
1190   (e_pabsw, "pabsw")
1191   (e_packssdw, "packssdw")
1192   (e_packsswb, "packsswb")
1193   (e_packusdw, "packusdw")
1194   (e_packuswb, "packuswb")
1195   (e_paddb, "paddb")
1196   (e_paddd, "paddd")
1197   (e_paddq, "paddq")
1198   (e_paddsb, "paddsb")
1199   (e_paddsw, "paddsw")
1200   (e_paddusb, "paddusb")
1201   (e_paddusw, "paddusw")
1202   (e_paddw, "paddw")
1203   (e_palignr, "palignr")
1204   (e_pand, "pand")
1205   (e_pandn, "pandn")
1206   (e_pavgb, "pavgb")
1207   (e_pavgw, "pavgw")
1208   (e_pblendvb, "pblendvb")
1209   (e_pblendw, "pblendw")
1210   (e_pcmpeqb, "pcmpeqb")
1211   (e_pcmpeqd, "pcmpeqd")
1212   (e_pcmpeqq, "pcmpeqq")
1213   (e_pcmpeqw, "pcmpeqw")
1214   (e_pcmpestri, "pcmpestri")
1215   (e_pcmpestrm, "pcmpestrm")
1216   (e_pcmpgdt, "pcmpgdt")
1217   (e_pcmpgtb, "pcmpgtb")
1218   (e_pcmpgtq, "pcmpgtq")
1219   (e_pcmpgtw, "pcmpgtw")
1220   (e_pcmpistri, "pcmpistri")
1221   (e_pcmpistrm, "pcmpistrm")
1222   (e_pextrb, "pextrb")
1223   (e_pextrd_pextrq, "pextrd/pextrq")
1224   (e_pextrw, "pextrw")
1225   (e_phaddd, "phaddd")
1226   (e_phaddsw, "phaddsw")
1227   (e_phaddw, "phaddw")
1228   (e_phminposuw, "phminposuw")
1229   (e_phsubd, "phsubd")
1230   (e_phsubsw, "phsubsw")
1231   (e_phsubw, "phsubw")
1232   (e_phsubsw, "phsubsw")
1233   (e_pinsrb, "pinsrb")
1234   (e_pinsrd_pinsrq, "pinsrd/pinsrq")
1235   (e_pinsrw, "pinsrw")
1236   (e_pmaddubsw, "pmaddubsw")
1237   (e_pmaddwd, "pmaddwd")
1238   (e_pmaxsb, "pmaxsb")
1239   (e_pmaxsd, "pmaxsd")
1240   (e_pmaxsw, "pmaxsw")
1241   (e_pmaxub, "pmaxub")
1242   (e_pmaxud, "pmaxud")
1243   (e_pmaxuw, "pmaxuw")
1244   (e_pminsb, "pminsb")
1245   (e_pminsd, "pminsd")
1246   (e_pminsw, "pminsw")
1247   (e_pminub, "pminub")
1248   (e_pminud, "pminud")
1249   (e_pminuw, "pminuw")
1250   (e_pmovmskb, "pmovmskb")
1251   (e_pmovsxbd, "pmovsxbd")
1252   (e_pmovsxbq, "pmovsxbq")
1253   (e_pmovsxbw, "pmovsxbw")
1254   (e_pmovsxdq, "pmovsxdq")
1255   (e_pmovsxwd, "pmovsxwd")
1256   (e_pmovsxwq, "pmovsxwq")
1257   (e_pmovzxbd, "pmovzxbd")
1258   (e_pmovzxbq, "pmovzxbq")
1259   (e_pmovzxbw, "pmovzxbw")
1260   (e_pmovzxdq, "pmovzxdq")
1261   (e_pmovzxwd, "pmovzxwd")
1262   (e_pmovzxwq, "pmovzxwq")
1263   (e_pmuldq, "pmuldq")
1264   (e_pmulhrsw, "pmulhrsw")
1265   (e_pmulhuw, "pmulhuw")
1266   (e_pmulhw, "pmulhw")
1267   (e_pmullw, "pmullw")
1268   (e_pmulld, "pmulld")
1269   (e_pmuludq, "pmuludq")
1270   (e_pop, "pop")
1271   (e_popa, "popa")
1272   (e_popad, "popad")
1273   (e_popcnt, "popcnt")
1274   (e_popf, "popf")
1275   (e_popfd, "popfd")
1276   (e_por, "por")
1277   (e_prefetch, "prefetch")
1278   (e_prefetchNTA, "prefetchNTA")
1279   (e_prefetchT0, "prefetchT0")
1280   (e_prefetchT1, "prefetchT1")
1281   (e_prefetchT2, "prefetchT2")
1282   (e_prefetch_w, "prefetch(w)")
1283   (e_prefetchw, "prefetchw")
1284   (e_prefetchwt1, "prefetchwt1")
1285   (e_psadbw, "psadbw")
1286   (e_pshufb, "pshufb")
1287   (e_pshufd, "pshufd")
1288   (e_pshufhw, "pshufhw")
1289   (e_pshuflw, "pshuflw")
1290   (e_pshufw, "pshufw")
1291   (e_psignb, "psignb")
1292   (e_psignd, "psignd")
1293   (e_psignw, "psignw")
1294   (e_pslld, "pslld")
1295   (e_pslldq, "pslldq")
1296   (e_psllq, "psllq")
1297   (e_psllw, "psllw")
1298   (e_psrad, "psrad")
1299   (e_psraw, "psraw")
1300   (e_psrld, "psrld")
1301   (e_psrldq, "psrldq")
1302   (e_psrlq, "psrlq")
1303   (e_psrlw, "psrlw")
1304   (e_psubb, "psubb")
1305   (e_psubd, "psubd")
1306   (e_psubsb, "psubsb")
1307   (e_psubsw, "psubsw")
1308   (e_psubusb, "psubusb")
1309   (e_psubusw, "psubusw")
1310   (e_psubw, "psubw")
1311   (e_ptest, "ptest")
1312   (e_punpckhbw, "punpckhbw")
1313   (e_punpckhdq, "punpckhdq")
1314   (e_punpckhqd, "punpckhqd")
1315   (e_punpckhwd, "punpckhwd")
1316   (e_punpcklbw, "punpcklbw")
1317   (e_punpcklqd, "punpcklqd")
1318   (e_punpcklqld, "punpcklqld")
1319   (e_punpcklwd, "punpcklwd")
1320   (e_push, "push")
1321   (e_pusha, "pusha")
1322   (e_pushad, "pushad")
1323   (e_pushf, "pushf")
1324   (e_pushfd, "pushfd")
1325   (e_pxor, "pxor")
1326   (e_rcl, "rcl")
1327   (e_rcpps, "rcpps")
1328   (e_rcpss, "rcpss")
1329   (e_rcr, "rcr")
1330   (e_rdmsr, "rdmsr")
1331   (e_rdpmc, "rdpmc")
1332   (e_rdtsc, "rdtsc")
1333   (e_rdrand, "rdrand")
1334   (e_ret_far, "ret far")
1335   (e_ret_near, "ret near")
1336   (e_rol, "rol")
1337   (e_ror, "ror")
1338   (e_roundpd, "roundpd")
1339   (e_roundps, "roundps")
1340   (e_roundsd, "roundsd")
1341   (e_roundss, "roundss")
1342   (e_rsm, "rsm")
1343   (e_rsqrtps, "rsqrtps")
1344   (e_rsqrtss, "rsqrtss")
1345   (e_sahf, "sahf")
1346   (e_salc, "salc")
1347   (e_sar, "sar")
1348   (e_sbb, "sbb")
1349   (e_scasb, "scasb")
1350   (e_scasd, "scasd")
1351   (e_scasw, "scasw")
1352   (e_setb, "setb")
1353   (e_setbe, "setbe")
1354   (e_setl, "setl")
1355   (e_setle, "setle")
1356   (e_setnb, "setnb")
1357   (e_setnbe, "setnbe")
1358   (e_setnl, "setnl")
1359   (e_setnle, "setnle")
1360   (e_setno, "setno")
1361   (e_setnp, "setnp")
1362   (e_setns, "setns")
1363   (e_setnz, "setnz")
1364   (e_seto, "seto")
1365   (e_setp, "setp")
1366   (e_sets, "sets")
1367   (e_setz, "setz")
1368   (e_sfence, "sfence")
1369   (e_sgdt, "sgdt")
1370   (e_shl_sal, "shl/sal")
1371   (e_shld, "shld")
1372   (e_shr, "shr")
1373   (e_shrd, "shrd")
1374   (e_shufpd, "shufpd")
1375   (e_shufps, "shufps")
1376   (e_sha1rnds4, "sha1rnds4")
1377   (e_sha1nexte, "sha1nexte")
1378   (e_sha1msg1, "sha1msg1")
1379   (e_sha1msg2, "sha1msg2")
1380   (e_sha256rnds2, "sha256rnds2")
1381   (e_sha256msg1, "sha256msg1")
1382   (e_sha256msg2, "sha256msg2")
1383   (e_shlx, "shlx")
1384   (e_sarx, "sarx")
1385   (e_prefetchwt1, "prefetchwt1")
1386   (e_clflushopt, "clflushopt")
1387   (e_clwb, "clwb")
1388   (e_pcommit, "pcommit")
1389   (e_sidt, "sidt")
1390   (e_sldt, "sldt")
1391   (e_smsw, "smsw")
1392   (e_sqrtpd, "sqrtpd")
1393   (e_sqrtps, "sqrtps")
1394   (e_sqrtsd, "sqrtsd")
1395   (e_sqrtss, "sqrtss")
1396   (e_stc, "stc")
1397   (e_std, "std")
1398   (e_sti, "sti")
1399   (e_stmxcsr, "stmxcsr")
1400   (e_stosb, "stosb")
1401   (e_stosd, "stosd")
1402   (e_stosw, "stosw")
1403   (e_str, "str")
1404   (e_sub, "sub")
1405   (e_subpd, "subpd")
1406   (e_subps, "subps")
1407   (e_subsd, "subsd")
1408   (e_subss, "subss")
1409   (e_syscall, "syscall")
1410   (e_sysenter, "sysenter")
1411   (e_sysexit, "sysexit")
1412   (e_sysret, "sysret")
1413   (e_test, "test")
1414   (e_ucomisd, "ucomisd")
1415   (e_ucomiss, "ucomiss")
1416   (e_ud2, "ud2")
1417   (e_ud2grp10, "ud2grp10")
1418   (e_unpckhpd, "unpckhpd")
1419   (e_unpckhps, "unpckhps")
1420   (e_unpcklpd, "unpcklpd")
1421   (e_unpcklps, "unpcklps")
1422   (e_verr, "verr")
1423   (e_verw, "verw")
1424   (e_wait, "wait")
1425   (e_wbinvd, "wbinvd")
1426   (e_wrmsr, "wrmsr")
1427   (e_xadd, "xadd")
1428   (e_xchg, "xchg")
1429   (e_xlat, "xlat")
1430   (e_xor, "xor")
1431   (e_xorpd, "xorpd")
1432   (e_xorps, "xorps")
1433   (e_vaesenc, "vaesenc")
1434   (e_vaesenclast, "vaesenclast")
1435   (e_vaesdec, "vaesdec")
1436   (e_vaesdeclast, "vaesdeclast")
1437   (e_vaeskeygenassist, "vaeskeygenassist")
1438   (e_vaesimc, "vaesimc")
1439   (e_vpclmullqlqdq, "vpclmullqlqdq")
1440   (e_vpperm, "e_vpperm")
1441   (e_vmpsadbw, "vmpsadbw") 
1442   (e_vmwrite, "vmwrite") 
1443   (e_vmread, "vmread") 
1444   (e_vphaddw, "vphaddw")
1445   (e_vphaddd, "vphaddd")
1446   (e_vphaddsw, "vpaddsw")
1447   (e_vphsubw, "vphsubw")
1448   (e_vphsubd, "vphsubd")
1449   (e_vpmovb2m, "vpmovb2m")
1450   (e_vpmacsdd, "vpmacsdd")
1451   (e_vpmaddubsw, "vpmaddubsw")
1452   (e_vpmaddwd, "vpmaddwd")
1453   (e_vpmovm2d, "vpmovm2d")
1454   (e_vpmovmskb, "vpmovmskb")
1455   (e_vpmovm2b, "vpmovm2b")
1456   (e_andn, "andn")
1457   (e_bextr, "bextr")
1458   (e_blsi, "blsi")
1459   (e_blsmsk, "blsmsk")
1460   (e_blsr, "blsr")
1461   (e_bzhi, "bzhi")
1462   (e_lzcnt, "lzcnt")
1463   (e_mulx, "mulx")
1464   (e_pdep, "pdep")
1465   (e_pext, "pext")
1466   (e_rorx, "rorx")
1467   (e_sarx, "sarx")
1468   (e_shlx, "shlx")
1469   (e_shrx, "shrx")
1470   (e_tzcnt, "tzcnt")
1471   (e_vaddpd, "vaddpd")
1472   (e_vaddps, "vaddps")
1473   (e_vaddsd, "vaddsd")
1474   (e_vaddss, "vaddss")
1475   (e_vandnpd, "vandnpd")
1476   (e_vandnps, "vandnps")
1477   (e_vandpd, "vandpd")
1478   (e_vandps, "vandps")
1479   (e_valignd, "valignd")
1480   (e_valignq, "valignq")
1481   (e_vbroadcastf128, "vbroadcastf128")
1482   (e_vbroadcasti128, "vbroadcasti128")
1483   (e_vbroadcastsd, "vbroadcastsd")
1484   (e_vbroadcastss, "vbroadcastss")
1485   (e_vblendmps, "vblendmps")
1486   (e_vblendmpd, "vblendmpd")
1487   (e_vblendps, "vblendps")
1488   (e_vblendvpd, "vblendpd")
1489   (e_vblendvps, "vblendvps")
1490   (e_vblendvpd, "vblendvpd")
1491   (e_vpblendmb, "vpblendmb")
1492   (e_vpblendmw, "vpblendmw")
1493   (e_vpblendvb, "vpblendvb")
1494   (e_vcmppd, "vcmppd")
1495   (e_vcmpps, "vcmpps")
1496   (e_vcmpsd, "vcmpsd")
1497   (e_vcmpss, "vcmpss")
1498   (e_vcomisd, "vcomisd")
1499   (e_vcomiss, "vcomiss")
1500   (e_vcvtudq2pd, "vcvtudq2pd")
1501   (e_vcvtudq2ps, "vcvtudq2ps")
1502   (e_vcvtps2uqq, "vcvtps2uqq")
1503   (e_vcvtpd2qq, "vcvtpd2qq")
1504   (e_vcvtdq2pd, "vcvtdq2pd")
1505   (e_vcvtdq2ps, "vcvtdq2ps")
1506   (e_vcvtpd2dq, "vcvtpd2dq")
1507   (e_vcvtpd2ps, "vcvtpd2ps")
1508   (e_vcvtph2ps, "vcvtph2ps")
1509   (e_vcvtps2dq, "vcvtps2dq")
1510   (e_vcvtps2pd, "vcvtps2pd")
1511   (e_vcvtps2ph, "vcvtps2ph")
1512   (e_vcvtsd2si, "vcvtsd2si")
1513   (e_vcvtsd2ss, "vcvtsd2ss")
1514   (e_vcvtsi2sd, "vcvtsi2sd")
1515   (e_vcvtsi2ss, "vcvtsi2ss")
1516   (e_vcvtss2sd, "vcvtss2sd")
1517   (e_vcvtss2si, "vcvtss2si")
1518   (e_vcvttpd2udq, "vcvttpd2udq")
1519   (e_vcvttpd2uqq, "vcvttpd2uqq")
1520   (e_vcvttpd2qq, "vcvttpd2qq")
1521   (e_vcvttpd2dq, "vcvttpd2dq")
1522   (e_vcvttps2dq, "vcvttps2dq")
1523   (e_vcvttsd2si, "vcvttsd2si")
1524   (e_vcvttss2si, "vcvttss2si")
1525   (e_vcvtpd2udq, "vcvtpd2udq")
1526   (e_vcvtpd2uqq, "vcvtpd2uqq")
1527   (e_vdivpd, "vdivpd")
1528   (e_vdivps, "vdivps")
1529   (e_vdivsd, "vdivsd")
1530   (e_vdivss, "vdivss")
1531   (e_vexpandpd, "vexpandpd")
1532   (e_vexpandps, "vexpandps")
1533   (e_vextractf128, "vextractf128")
1534   (e_vextracti128, "vextracti128")
1535   (e_vextractf32x4, "vextractf32x4")
1536   (e_vextractf64x2, "vextractf64x2")
1537   (e_vextractf32x8, "vextractf32x8")
1538   (e_vextractf64x4, "vextractf64x4")
1539   (e_vextracti32x4, "vextracti32x4")
1540   (e_vextracti64x2, "vextracti64x2")
1541   (e_vextracti32x8, "vextracti32x8")
1542   (e_vextracti64x4, "vextracti64x4")
1543   (e_vextractps, "vextractps")
1544   (e_vexp2pd, "vexp2pd")
1545   (e_vexp2ps, "vexp2ps")
1546   (e_vroundpd, "vroundpd")
1547   (e_vroundps, "vroundps")
1548   (e_vroundsd, "vroundsd")
1549   (e_vroundss, "vroundss")
1550   (e_vrcp28pd, "vrcp28pd")
1551   (e_vrcp28sd, "vrcp28sd")
1552   (e_vrcp28ps, "vrcp28ps")
1553   (e_vrcp28ss, "vrcp28ss")
1554   (e_vrsqrt28pd, "vrsqrt28pd")
1555   (e_vrsqrt28sd, "vrsqrt28sd")
1556   (e_vrsqrt28ps, "vrsqrt28ps")
1557   (e_vrsqrt28ss, "vrsqrt28ss")
1558   (e_vfixupimmpd, "vfixupimmpd")
1559   (e_vfixupimmps, "vfixupimmps")
1560   (e_vfixupimmsd, "vfixupimmsd")
1561   (e_vfixupimmss, "vfixupimmss")
1562   (e_vfmaddpd, "vfmaddpd")
1563   (e_vfmaddps, "vfmaddps")
1564   (e_vfmaddsd, "vfmaddsd")
1565   (e_vfmaddss, "vfmaddss")
1566   (e_vfmadd132pd, "vfmadd132pd")
1567   (e_vfmadd132ps, "vfmadd132ps")
1568   (e_vfmadd132sd, "vfmadd132sd")
1569   (e_vfmadd132ss, "vfmadd132ss")
1570   (e_vfmadd213pd, "vfmadd213pd")
1571   (e_vfmadd213ps, "vfmadd213ps")
1572   (e_vfmadd213sd, "vfmadd213sd")
1573   (e_vfmadd213ss, "vfmadd213ss")
1574   (e_vfmadd231pd, "vfmadd231pd")
1575   (e_vfmadd231ps, "vfmadd231ps")
1576   (e_vfmadd231sd, "vfmadd231sd")
1577   (e_vfmadd231ss, "vfmadd231ss")
1578   (e_vfmsubpd, "vfmsubpd")
1579   (e_vfmsubsd, "vfmsubsd")
1580   (e_vfmaddsub132pd, "vfmaddsub132pd")
1581   (e_vfmaddsub132ps, "vfmaddsub132ps")
1582   (e_vfmaddsub213pd, "vfmaddsub213pd")
1583   (e_vfmaddsub213ps, "vfmaddsub213ps")
1584   (e_vfmaddsub231pd, "vfmaddsub231pd")
1585   (e_vfmaddsub231ps, "vfmaddsub231ps")
1586   (e_vfpclassps, "vfpclassps")
1587   (e_vfpclasspd, "vfpclasspd")
1588   (e_vfpclassss, "vfpclassss")
1589   (e_vfpclasssd, "vfpclasssd")
1590   (e_vfmsub132pd, "vfmsub132pd")
1591   (e_vfmsub132ps, "vfmsub132ps")
1592   (e_vfmsub132sd, "vfmsub132sd")
1593   (e_vfmsub132ss, "vfmsub132ss")
1594   (e_vfmsub213pd, "vfmsub213pd")
1595   (e_vfmsub213ps, "vfmsub213ps")
1596   (e_vfmsub213sd, "vfmsub213sd")
1597   (e_vfmsub213ss, "vfmsub213ss")
1598   (e_vfmsub231pd, "vfmsub231pd")
1599   (e_vfmsub231ps, "vfmsub231ps")
1600   (e_vfmsub231sd, "vfmsub231sd")
1601   (e_vfmsub231ss, "vfmsub231ss")
1602   (e_vfmsubadd132pd, "vfmsubadd132pd")
1603   (e_vfmsubadd132ps, "vfmsubadd132ps")
1604   (e_vfmsubadd213pd, "vfmsubadd213pd")
1605   (e_vfmsubadd213ps, "vfmsubadd213ps")
1606   (e_vfmsubadd231pd, "vfmsubadd231pd")
1607   (e_vfmsubadd231ps, "vfmsubadd231ps")
1608   (e_vfnmaddpd, "vfnmaddpd")
1609   (e_vfnmaddsd, "vfnmaddsd")
1610   (e_vfnmadd132pd, "vfnmadd132pd")
1611   (e_vfnmadd132ps, "vfnmadd132ps")
1612   (e_vfnmadd132sd, "vfnmadd132sd")
1613   (e_vfnmadd132ss, "vfnmadd132ss")
1614   (e_vfnmadd213pd, "vfnmadd213pd")
1615   (e_vfnmadd213ps, "vfnmadd213ps")
1616   (e_vfnmadd213sd, "vfnmadd213sd")
1617   (e_vfnmadd213ss, "vfnmadd213ss")
1618   (e_vfnmadd231pd, "vfnmadd231pd")
1619   (e_vfnmadd231ps, "vfnmadd231ps")
1620   (e_vfnmadd231sd, "vfnmadd231sd")
1621   (e_vfnmadd231ss, "vfnmadd231ss")
1622   (e_vfnmsub132pd, "vfnmsub132pd")
1623   (e_vfnmsub132ps, "vfnmsub132ps")
1624   (e_vfnmsub132sd, "vfnmsub132sd")
1625   (e_vfnmsub132ss, "vfnmsub132ss")
1626   (e_vfnmsub213pd, "vfnmsub213pd")
1627   (e_vfnmsub213ps, "vfnmsub213ps")
1628   (e_vfnmsub213sd, "vfnmsub213sd")
1629   (e_vfnmsub213ss, "vfnmsub213ss")
1630   (e_vfnmsub231pd, "vfnmsub231pd")
1631   (e_vfnmsub231ps, "vfnmsub231ps")
1632   (e_vfnmsub231sd, "vfnmsub231sd")
1633   (e_vfnmsub231ss, "vfnmsub231ss")
1634   (e_vgatherpf0dps, "vgatherpf0dps")
1635   (e_vgatherpf0dpd, "vgatherpf0dpd")
1636   (e_vgatherpf1qps ,"vgatherpf1qps")
1637   (e_vgatherpf1dpd ,"vgatherpf1dpd")
1638   (e_vgatherpf0qps ,"vgatherpf0qps")
1639   (e_vscatterpf0dps ,"vscatterpf0dps")
1640   (e_vscatterpf0qpd ,"vscatterpf0qpd")
1641   (e_vscatterpf1qps ,"vscatterpf1qps")
1642   (e_vscatterpf1qpd ,"vscatterpf1qpd")
1643   (e_vgatherdpd, "vgatherdpd")
1644   (e_vgatherdps, "vgatherdps")
1645   (e_vgatherqpd, "vgatherqpd")
1646   (e_vgatherqps, "vgatherqps")
1647   (e_vgetexpps, "vgetexpps")
1648   (e_vgetexppd, "vgetexppd")
1649   (e_vgetexpss, "vgetexpss")
1650   (e_vgetexpsd, "vgetexpsd")
1651   (e_vgetmantps, "vgetmantps")
1652   (e_vgetmantpd, "vgetmantpd")
1653   (e_vgetmantss, "vgetmantss")
1654   (e_vgetmantsd, "vgetmantsd")
1655   (e_vinsertf128, "vinsertf128")
1656   (e_vinserti128, "vinserti128")
1657   (e_vinsertps, "vinsertps")
1658   (e_vinsertf32x4, "vinsertf32x4")
1659   (e_vinsertf64x2, "vinsertf64x2")
1660   (e_vinsertf32x8, "vinsertf32x8")
1661   (e_vinsertf64x4, "vinsertf64x4")
1662   (e_vinserti32x4, "vinserti32x4")
1663   (e_vinserti64x2, "vinserti64x2")
1664   (e_vinserti32x8, "vinserti32x8")
1665   (e_vinserti64x4, "vinserti64x4")
1666   (e_vmaskmovpd, "vmaskmovpd")
1667   (e_vmaskmovps, "vmaskmovps")
1668   (e_vmaxpd, "vmaxpd")
1669   (e_vmaxps, "vmaxps")
1670   (e_vmaxsd, "vmaxsd")
1671   (e_vmaxss, "vmaxss")
1672   (e_vminpd, "vminpd")
1673   (e_vminps, "vminps")
1674   (e_vminsd, "vminsd")
1675   (e_vminss, "vminss")
1676   (e_vmovapd, "vmovapd")
1677   (e_vmovaps, "vmovaps")
1678   (e_vmovddup, "vmovddup")
1679   (e_vmovdqa, "vmovdqa")
1680   (e_vmovdqa32, "vmovdqa32")
1681   (e_vmovdqa64, "vmovdqa64")
1682   (e_vmovdqu32, "vmovdqu32")
1683   (e_vmovdqu64, "vmovdqu64")
1684   (e_vmovdqu, "vmovdqu")
1685   (e_vmovdqu8, "vmovdqu8")
1686   (e_vmovdqu16, "vmovdqu16")
1687   (e_vmovhlps, "vmovhlps")
1688   (e_vmovhpd, "vmovhpd")
1689   (e_vmovhps, "vmovhps")
1690   (e_vmovlhps, "vmovlhps")
1691   (e_vmovlpd, "vmovlpd")
1692   (e_vmovlps, "vmovlps")
1693   (e_vmovntps, "vmovntps")
1694   (e_vmovq, "vmovq")
1695   (e_vmovsd, "vmovsd")
1696   (e_vmovshdup, "vmovshdup")
1697   (e_vmovsldup, "vmovsldup")
1698   (e_vmovss, "vmovss")
1699   (e_vmovupd, "vmovupd")
1700   (e_vmovups, "vmovups")
1701   (e_vmulpd, "vmulpd")
1702   (e_vmulps, "vmulps")
1703   (e_vmulsd, "vmulsd")
1704   (e_vmulss, "vmulss")
1705   (e_vorpd, "vorpd")
1706   (e_vorps, "vorps")
1707   (e_vpabsb, "vpabsb")
1708   (e_vpabsd, "vpabsd")
1709   (e_vpabsw, "vpabsw")
1710   (e_vpackssdw, "vpackssdw")
1711   (e_vpacksswb, "vpacksswb")
1712   (e_vpackusdw, "vpackusdw")
1713   (e_vpackuswb, "vpackuswb")
1714   (e_vpaddb, "vpaddb")
1715   (e_vpaddd, "vpaddd")
1716   (e_vpaddq, "vpaddq")
1717   (e_vpaddsb, "vpaddsb")
1718   (e_vpaddsw, "vpaddsw")
1719   (e_vpaddusb, "vpaddusb")
1720   (e_vpaddusw, "vpaddusw")
1721   (e_vpaddw, "vpaddw")
1722   (e_vpalignr, "vpalignr")
1723   (e_vpand, "vpand")
1724   (e_vpandn, "vpandn")
1725   (e_vpandd, "vpandd")
1726   (e_vpandq, "vpandq")
1727   (e_vpandnd, "vpandnd")
1728   (e_vpandnq, "vpandnq")
1729   (e_vpavgb, "vpavgb")
1730   (e_vpavgw, "vpavgw")
1731   (e_vpblendd, "vpblendd")
1732   (e_vpbroadcastb, "vpbroadcastb")
1733   (e_vpbroadcastd, "vpbroadcastd")
1734   (e_vpbroadcastq, "vpbroadcastq")
1735   (e_vpbroadcastw, "vpbroadcastw")
1736   (e_vpcmov, "vpcmov")
1737   (e_vpcmpub, "vpcmpub")
1738   (e_vpcmpb, "vpcmpb")
1739   (e_vpcmpequd, "vpcmpequd")
1740   (e_vpcmpeqb, "vpcmpeqb")
1741   (e_vpcmpeqd, "vpcmpeqd")
1742   (e_vpcmpeqq, "vpcmpeqq")
1743   (e_vpcmpeqw, "vpcmpeqw")
1744   (e_vpcmpgtb, "vpcmpgtb")
1745   (e_vpcmpgtd, "vpcmpgtd")
1746   (e_vpcmpgtq, "vpcmpgtq")
1747   (e_vpcmpgtw, "vpcmpgtw")
1748   (e_vpcomd, "vpcmod")
1749   (e_vpcompressd, "vpcompressd")
1750   (e_vpcompressq, "vpcompressq")
1751   (e_vpconflictd, "vpconflictd")
1752   (e_vpconflictq, "vpconflictq")
1753   (e_vperm2f128, "vperm2f128")
1754   (e_vperm2i128, "vperm2i128")
1755   (e_vpermd, "vpermd")
1756   (e_vpermilpd, "vpermilpd")
1757   (e_vpermilps, "vpermilps")
1758   (e_vpermi2b, "vpermi2b")
1759   (e_vpermi2w, "vpermi2w")
1760   (e_vpermi2d, "vpermi2d")
1761   (e_vpermi2q, "vpermi2q")
1762   (e_vpermi2ps, "vpermi2ps")
1763   (e_vpermi2pd, "vpermi2pd")
1764   (e_vpermt2b, "vpermt2b")
1765   (e_vpermt2w, "vpermt2w")
1766   (e_vpermt2d, "vpermt2d")
1767   (e_vpermt2q, "vpermt2q")
1768   (e_vpermt2ps, "vpermt2ps")
1769   (e_vpermt2pd, "vpermt2pd")
1770   (e_vpermpd, "vpermpd")
1771   (e_vpermps, "vpermps")
1772   (e_vpermq, "vpermq")
1773   (e_vpermb, "vpermb")
1774   (e_vpermw, "vpermw")
1775   (e_vpextrb, "vpextrb")
1776   (e_vpextrd, "vpextrd")
1777   (e_vpextrq, "vpextrq")
1778   (e_vpextrw, "vpextrw")
1779   (e_vpexpandd, "vpexpandd")
1780   (e_vpexpandq, "vpexpandq")
1781   (e_vplzcntd, "vplzcntd")
1782   (e_vplzcntq, "vplzcntq")
1783   (e_vpgatherdd, "vpgatherdd")
1784   (e_vpgatherdq, "vpgatherdq")
1785   (e_vpgatherqd, "vpgatherqd")
1786   (e_vpgatherqq, "vpgatherqq")
1787   (e_vpinsrb, "vpinsrb")
1788   (e_vpinsrd, "vpinsrd")
1789   (e_vpinsrq, "vpinsrq")
1790   (e_vpinsrw, "vpinsrw")
1791   (e_vpmaddubsw, "vpmaddubsw")
1792   (e_vpmaddwd, "vpmaddwd")
1793   (e_vpmaskmovd, "vpmaskmovd")
1794   (e_vpmaskmovq, "vpmaskmovq")
1795   (e_vpmaxsq, "vpmaxsq")
1796   (e_vpmaxuq, "vpmaxuq")
1797   (e_vpmaxsb, "vpmaxsb")
1798   (e_vpmaxsd, "vpmaxsd")
1799   (e_vpmaxsw, "vpmaxsw")
1800   (e_vpmaxub, "vpmaxub")
1801   (e_vpmaxud, "vpmaxud")
1802   (e_vpmaxuw, "vpmaxuw")
1803   (e_vpminsq, "vpminsq")
1804   (e_vpminuq, "vpminuq")
1805   (e_vpminsb, "vpminsb")
1806   (e_vpminsd, "vpminsd")
1807   (e_vpminsw, "vpminsw")
1808   (e_vpminub, "vpminub")
1809   (e_vpminud, "vpminud")
1810   (e_vpminuw, "vpminuw")
1811   (e_vpmovsdb, "vpmovsdb")
1812   (e_vpmovsdw, "vpmovsdw")
1813   (e_vpmovsqb, "vpmovsqb")
1814   (e_vpmovsqd, "vpmovsqd")
1815   (e_vpmovsqw, "vpmovsqw")
1816   (e_vpmovswb, "vpmovswb")
1817   (e_vpmovsxbd, "vpmovsxbd")
1818   (e_vpmovsxbq, "vpmovsxbq")
1819   (e_vpmovsxbw, "vpmovsxbw")
1820   (e_vpmovsxdq, "vpmovsxdq")
1821   (e_vpmovsxwd, "vpmovsxwd")
1822   (e_vpmovsxwq, "vpmovsxwq")
1823   (e_vpmovzxbd, "vpmovzxbd")
1824   (e_vpmovzxbq, "vpmovzxbq")
1825   (e_vpmovzxbw, "vpmovzxbw")
1826   (e_vpmovzxdq, "vpmovzxdq")
1827   (e_vpmovzxwd, "vpmovzxwd")
1828   (e_vpmovzxwq, "vpmovzxwq")
1829   (e_vpmuldq, "vpmuldq")
1830   (e_vpmulhrsw, "vpmulhrsw")
1831   (e_vpmulhuw, "vpmulhuw")
1832   (e_vpmulhw, "vpmulhw")
1833   (e_vpmulld, "vpmulld")
1834   (e_vpmullw, "vpmullw")
1835   (e_vpmuludq, "vpmuludq")
1836   (e_vpor, "vpor")
1837   (e_vpord, "vpord")
1838   (e_vporq, "vporq")
1839   (e_vprolvd, "vporlvd")
1840   (e_vprolvq, "vporlvq")
1841   (e_vprold, "vprold")
1842   (e_vprolq, "vprolq")
1843   (e_vprorvd, "vprorvd")
1844   (e_vprorvq, "vprorvq")
1845   (e_vprord, "vprord")
1846   (e_vprorq, "vprorq")
1847   (e_vrsqrt14ps, "vrsqrt14ps")
1848   (e_vrsqrt14pd, "vrsqrt14pd")
1849   (e_vrsqrt14ss, "vrsqrt14ss")
1850   (e_vrsqrt14sd, "vrsqrt14sd")
1851   (e_vscatterdps, "vscatterdps")
1852   (e_vscatterdpd, "vscatterdpd")
1853   (e_vscatterqps, "vscatterqps")
1854   (e_vscatterqpd, "vscatterqpd")
1855   (e_vpscatterdd, "vpscatterdd")
1856   (e_vpscatterdq, "vpscatterdq")
1857   (e_vpscatterqd, "vpscatterqd")
1858   (e_vpscatterqq, "vpscatterqq")
1859   (e_vpsadbw, "vpsadbw")
1860   (e_vpshad, "vpshad")
1861   (e_vpshufb, "vpshufb")
1862   (e_vpshufd, "vpshufd")
1863   (e_vpshufhw, "vpshufhw")
1864   (e_vpshuflw, "vpshuflw")
1865   (e_vpslldq, "vpslldq")
1866   (e_vpslld, "vpslld")
1867   (e_vpsllq, "vpsllq")
1868   (e_vpsllvd, "vpsllvd")
1869   (e_vpsllvq, "vpsllvq")
1870   (e_vpsllw, "vpsllw")
1871   (e_vpsrad, "vpsrad")
1872   (e_vpsravd, "vpsravd")
1873   (e_vpsraw, "vpsraw")
1874   (e_vpsrldq, "vpsrldq")
1875   (e_vpsrld, "vpsrld")
1876   (e_vpsrlq, "vpsrlq")
1877   (e_vpsrlvd, "vpsrlvd")
1878   (e_vpsrlvq, "vprlvq")
1879   (e_vpsrlvq, "vpsrlvq")
1880   (e_vpsrlw, "vpsrlw")
1881   (e_vpsubb, "vpsubb")
1882   (e_vpsubd, "vpsubd")
1883   (e_vpsubq, "vpsubq")
1884   (e_vpsubsb, "vpsubsb")
1885   (e_vpsubsw, "vpsubsw")
1886   (e_vpsubusb, "vpsubusb")
1887   (e_vpsubusw, "vpsubusw")
1888   (e_vpsubw, "vpsubw")
1889   (e_vptestmd, "vptestmd")
1890   (e_vptestnmd, "vptestnmd")
1891   (e_vptestnmb, "vptestnmb")
1892   (e_vpternlogd, "vpternlogd")
1893   (e_vpternlogq, "vpternlogq")
1894   (e_vpunpckhbw, "vpunpckhbw")
1895   (e_vpunpckhdq, "vpunpckhdq")
1896   (e_vpunpckhqdq, "vpunpckhqdq")
1897   (e_vpunpckhwd, "vpunpckhwd")
1898   (e_vpunpcklbw, "vpunpcklbw")
1899   (e_vpunpckldq, "vpunpckldq")
1900   (e_vpunpcklqdq, "vpunpcklqdq")
1901   (e_vpunpcklwd, "vpunpcklwd")
1902   (e_vpxord, "vpxord")
1903   (e_vpxorq, "vpxorq")
1904   (e_vrangeps, "vrangeps")
1905   (e_vrangepd, "vrangepd")
1906   (e_vrangess, "vrangess")
1907   (e_vrangesd, "vrangesd")
1908   (e_vrcp14ps, "vrcp14ps")
1909   (e_vrcp14pd, "vrcp14pd")
1910   (e_vrcp14ss, "vrcp14ss")
1911   (e_vrcp14sd, "vrcp14sd")
1912   (e_vreduceps, "vreduceps")
1913   (e_vreducepd, "vreducepd")
1914   (e_vreducess, "vreducess")
1915   (e_vreducesd, "vreducesd")
1916   (e_vpxor, "vpxor")
1917   (e_vshufpd, "vshufpd")
1918   (e_vshufps, "vshufps")
1919   (e_vshuff32x4, "vshuff32x4")
1920   (e_vshuff64x2, "vshuff64x2")
1921   (e_vsqrtpd, "vsqrtpd")
1922   (e_vsqrtps, "vsqrtps")
1923   (e_vsqrtsd, "vsqrtsd")
1924   (e_vsqrtss, "vsqrtss")
1925   (e_vsubpd, "vsubpd")
1926   (e_vsubps, "vsubps")
1927   (e_vsubsd, "vsubsd")
1928   (e_vsubss, "vsubss")
1929   (e_vtestpd, "vtestpd")
1930   (e_vtestps, "vtestps")
1931   (e_vucomisd, "vucomisd")
1932   (e_vucomiss, "vucomiss")
1933   (e_vunpckhpd, "vunpckhpd")
1934   (e_vunpckhps, "vunpckhps")
1935   (e_vunpcklpd, "vunpcklpd")
1936   (e_vunpcklps, "vunpcklps")
1937   (e_vxorpd, "vxorpd")
1938   (e_vxorps, "vxorps")
1939   (e_vzeroall, "vzeroall")
1940   (e_vzeroupper, "vzeroupper")
1941   (e_kandb, "kandb")
1942   (e_kandd, "kandd")
1943   (e_kandw, "kandw")
1944   (e_kandq, "kandq")
1945   (e_kandnb, "kandnb")
1946   (e_kandnd, "kandnd")
1947   (e_kandnw, "kandnw")
1948   (e_kandnq, "kandnq")
1949   (e_knotb, "knotb")
1950   (e_knotd, "knotd")
1951   (e_knotw, "knotw")
1952   (e_knotq, "knotq")
1953   (e_korb, "korb")
1954   (e_kord, "kord")
1955   (e_korw, "korw")
1956   (e_korq, "korq")
1957   (e_kxnorb, "kxnorb")
1958   (e_kxnord, "kxnord")
1959   (e_kxnorw, "kxnorw")
1960   (e_kxnorq, "kxnorq")
1961   (e_kxorb, "kxorb")
1962   (e_kxord, "kxord")
1963   (e_kxorw, "kxorw")
1964   (e_kxorq, "kxorq")
1965   (e_kaddb, "kaddb")
1966   (e_kaddd, "kaddd")
1967   (e_kaddw, "kaddw")
1968   (e_kaddq, "kaddq")
1969   (e_kshiftlw, "kshiftlw")
1970   (e_kshiftlb, "kshiftlb")
1971   (e_kshiftlq, "kshiftlq")
1972   (e_kshiftld, "kshiftld")
1973   (e_kshiftrw, "kshiftrw")
1974   (e_kshiftrb, "kshiftrb")
1975   (e_kshiftrq, "kshiftrq")
1976   (e_kshiftrd, "kshiftrd")
1977   (e_kunpckbw, "kunpckbw")
1978   (e_kunpckwd, "kunpckwd")
1979   (e_kunpckdq, "kunpckdq")
1980   (e_kmovb, "kmovb")
1981   (e_kmovd, "kmovd")
1982   (e_kmovw, "kmovw")
1983   (e_kmovq, "kmovq")
1984   (e_kortestb, "kortestb")
1985   (e_kortestd, "kortestd")
1986   (e_kortestw, "kortestw")
1987   (e_kortestq, "kortestq")
1988   (e_ktestb, "ktestb")
1989   (e_ktestd, "ktestd")
1990   (e_ktestw, "ktestw")
1991   (e_ktestq, "ktestq")
1992   (e_vcmppd, "vcmppd")
1993   (e_vcmpps, "vcmpps")
1994   (e_vcmpsd, "vcmpsd")
1995   (e_vcmpss, "vcmpss")
1996   (e_vmovntpd, "vmovntpd")
1997   (e_vcvttsd2usi, "vcvttsd2usi")
1998   (e_vcvttss2usi, "vcvttss2usi")
1999   (e_vcvtsd2usi, "vcvtsd2usi")
2000   (e_vcvtss2usi, "vcvtss2usi")
2001   (e_vcvtusi2sd, "vcvtusi2sd")
2002   (e_vcvtusi2ss, "vcvtusi2ss")
2003   (e_vmovntdq, "vmovntdq")
2004   (e_vpsrlvw, "vpsrlvw")
2005   (e_vpmovuswb, "vpmovuswb")
2006   (e_vpsravw, "vpsravw")
2007   (e_vpsravq, "vpsravq")
2008   (e_vpmovusdb, "vpmovusdb")
2009   (e_vpsllvw, "vpsllvw")
2010   (e_vpmovusqb, "vpmovusqb")
2011   (e_vpmovusdw, "vpmovusdw")
2012   (e_vpmovusqw, "vpmovusqw")
2013   (e_vpmovusqd, "vpmovusqd")
2014   (e_vbroadcastf32x4, "vbroadcastf32x4")
2015   (e_vpabsq, "vpabsq")
2016   (e_vmovntdqa, "vmovntdqa")
2017   (e_vpbroadcastmb2q, "vpbroadcastmb2q")
2018   (e_vpmovwb, "vpmovwb")
2019   (e_vpmovdb, "vpmovdb")
2020   (e_vpmovqb, "vpmovqb")
2021   (e_vpmovdw, "vpmovdw")
2022   (e_vpmovqw, "vpmovqw")
2023   (e_vpmovqd, "vpmovqd")
2024   (e_vpmultishiftqb, "vpmultishiftqb")
2025   (e_vpmadd52luq, "vpmadd52luq")
2026   (e_vpmadd52huq, "vpmadd52huq")
2027   (e_vrndscaleps, "vrndscaleps")
2028   (e_vrndscalepd, "vrndscalepd")
2029   (e_vrndscaless, "vrndscaless")
2030   (e_vrndscalesd, "vrndscalesd")
2031   (e_vdbpsadbw, "vdbpsadbw")
2032   (e_vphsubsw, "vphsubsw")
2033
2034 /* What are these? */
2035  (e_vpmovswb, "vpmovswb")
2036  (e_vpmovsdb, "vpmovsdb")
2037  (e_vpmovsqb, "vpmovsqb")
2038  (e_vpmovsdw, "vpmovsdw")
2039  (e_vpmovsqw, "vpmovsqw")
2040  (e_vpmovsqd, "vpmovsqd")
2041
2042  (e_fp_generic, "[FIXME: GENERIC FPU INSN]")
2043  (e_3dnow_generic, "[FIXME: GENERIC 3DNow INSN]")
2044  (e_No_Entry, "No_Entry")
2045         ;
2046
2047 dyn_hash_map<prefixEntryID, std::string> prefixEntryNames_IAPI = map_list_of
2048   (prefix_rep, "REP")
2049   (prefix_repnz, "REPNZ")
2050         ;
2051
2052 dyn_hash_map<entryID, flagInfo> ia32_instruction::flagTable;
2053
2054
2055 COMMON_EXPORT dyn_hash_map<entryID, flagInfo> const& ia32_instruction::getFlagTable()
2056 {
2057   static std::once_flag flagTableInit;
2058   std::call_once(flagTableInit, [&]() {
2059     initFlagTable(flagTable);
2060     ANNOTATE_HAPPENS_BEFORE(&flagTableInit);
2061   });
2062   ANNOTATE_HAPPENS_AFTER(&flagTableInit);
2063   return flagTable;
2064 }
2065   
2066 void ia32_instruction::initFlagTable(dyn_hash_map<entryID, flagInfo>& flagTable)
2067 {
2068   static const vector<Dyninst::MachRegister> standardFlags = list_of(x86::of)(x86::sf)(x86::zf)(x86::af)(x86::pf)(x86::cf);
2069
2070   flagTable[e_aaa] = flagInfo(list_of(x86::af), standardFlags);
2071   flagTable[e_aad] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
2072   flagTable[e_aam] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
2073   flagTable[e_aas] = flagInfo(list_of(x86::af), standardFlags);
2074   flagTable[e_adc] = flagInfo(list_of(x86::cf), standardFlags);
2075   flagTable[e_add] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
2076   flagTable[e_and] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
2077   flagTable[e_arpl] = flagInfo(vector<Dyninst::MachRegister>(), list_of(x86::zf));
2078   flagTable[e_bsf] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
2079   flagTable[e_bsr] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
2080   flagTable[e_bt] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
2081   flagTable[e_bts] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
2082   flagTable[e_btr] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
2083   flagTable[e_btc] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
2084   flagTable[e_clc] = flagInfo(vector<Dyninst::MachRegister>(), list_of(x86::cf));
2085   flagTable[e_cld] = flagInfo(vector<Dyninst::MachRegister>(), list_of(x86::df));
2086   flagTable[e_cli] = flagInfo(vector<Dyninst::MachRegister>(), list_of(x86::if_));
2087   flagTable[e_cmc] = flagInfo(vector<Dyninst::MachRegister>(), list_of(x86::cf));
2088   flagTable[e_cmovbe] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
2089   flagTable[e_cmove] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
2090   flagTable[e_cmovnae] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
2091   flagTable[e_cmovnb] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
2092   flagTable[e_cmovnbe] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
2093   flagTable[e_cmovne] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
2094   flagTable[e_cmovng] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
2095   flagTable[e_cmovnge] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
2096   flagTable[e_cmovnl] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
2097   flagTable[e_cmovno] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
2098   flagTable[e_cmovns] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
2099   flagTable[e_cmovo] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
2100   flagTable[e_cmovpe] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
2101   flagTable[e_cmovpo] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
2102   flagTable[e_cmovs] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
2103   flagTable[e_cmp] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
2104   flagTable[e_cmpsb] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
2105   flagTable[e_cmpsd] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
2106   flagTable[e_cmpss] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
2107   flagTable[e_cmpsw] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
2108   flagTable[e_cmpxch] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
2109   flagTable[e_cmpxch8b] = flagInfo(vector<Dyninst::MachRegister>(), list_of(x86::zf));
2110   flagTable[e_comisd] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
2111   flagTable[e_comiss] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
2112   flagTable[e_daa] = flagInfo(list_of(x86::af)(x86::cf), standardFlags);
2113   flagTable[e_das] = flagInfo(list_of(x86::af)(x86::cf), standardFlags);
2114   flagTable[e_dec] = flagInfo(vector<Dyninst::MachRegister>(), list_of(x86::of)(x86::sf)(x86::zf)(x86::af)(x86::pf));
2115   flagTable[e_div] = flagInfo(list_of(x86::af)(x86::cf), standardFlags);
2116   // TODO: FCMOVcc (not in our entry table) (reads zf/pf/cf)
2117   // TODO: FCOMI/FCOMIP/FUCOMI/FUCOMIP (writes/zf/pf/cf)
2118   flagTable[e_idiv] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
2119   flagTable[e_imul] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
2120   flagTable[e_inc] = flagInfo(vector<Dyninst::MachRegister>(), list_of(x86::of)(x86::sf)(x86::zf)(x86::af)(x86::pf));
2121   flagTable[e_insb] = flagInfo(list_of(x86::df), vector<Dyninst::MachRegister>());
2122   flagTable[e_insw] = flagInfo(list_of(x86::df), vector<Dyninst::MachRegister>());
2123   flagTable[e_insd] = flagInfo(list_of(x86::df), vector<Dyninst::MachRegister>());
2124   flagTable[e_int] = flagInfo(vector<Dyninst::MachRegister>(), list_of(x86::tf)(x86::nt_));
2125   flagTable[e_int3] = flagInfo(vector<Dyninst::MachRegister>(), list_of(x86::tf)(x86::nt_));
2126   flagTable[e_int80] = flagInfo(vector<Dyninst::MachRegister>(), list_of(x86::tf)(x86::nt_));
2127   flagTable[e_into] = flagInfo(list_of(x86::of), list_of(x86::tf)(x86::nt_));
2128   flagTable[e_ucomisd] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
2129   flagTable[e_ucomiss] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
2130   flagTable[e_iret] = flagInfo(list_of(x86::nt_),
2131 list_of(x86::of)(x86::sf)(x86::zf)(x86::af)(x86::pf)(x86::cf)(x86::tf)(x86::if_)(x86::df));
2132   flagTable[e_jb] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
2133   flagTable[e_jb_jnaej_j] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
2134   flagTable[e_jbe] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
2135   flagTable[e_jl] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
2136   flagTable[e_jle] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
2137   flagTable[e_jnb] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
2138   flagTable[e_jnb_jae_j] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
2139   flagTable[e_jnbe] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
2140   flagTable[e_jnl] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
2141   flagTable[e_jnle] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
2142   flagTable[e_jno] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
2143   flagTable[e_jnp] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
2144   flagTable[e_jns] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
2145   flagTable[e_jnz] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
2146   flagTable[e_jo] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
2147   flagTable[e_jp] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
2148   flagTable[e_js] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
2149   flagTable[e_jz] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
2150   flagTable[e_lar] = flagInfo(vector<Dyninst::MachRegister>(), list_of(x86::zf));
2151   flagTable[e_lodsb] = flagInfo(list_of(x86::df), vector<Dyninst::MachRegister>());
2152   flagTable[e_lodsd] = flagInfo(list_of(x86::df), vector<Dyninst::MachRegister>());
2153   flagTable[e_lodsw] = flagInfo(list_of(x86::df), vector<Dyninst::MachRegister>());
2154   flagTable[e_loope] = flagInfo(list_of(x86::zf), vector<Dyninst::MachRegister>());
2155   flagTable[e_loopn] = flagInfo(list_of(x86::zf), vector<Dyninst::MachRegister>());
2156   flagTable[e_lsl] = flagInfo(vector<Dyninst::MachRegister>(), list_of(x86::zf));
2157   // I'd expect that mov control/debug/test gets handled when we do operand analysis
2158   // If it doesn't, fix later
2159   flagTable[e_mul] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
2160   flagTable[e_neg] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
2161   flagTable[e_or] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
2162   flagTable[e_outsb] = flagInfo(list_of(x86::df), vector<Dyninst::MachRegister>());
2163   flagTable[e_outsw] = flagInfo(list_of(x86::df), vector<Dyninst::MachRegister>());
2164   flagTable[e_outsd] = flagInfo(list_of(x86::df), vector<Dyninst::MachRegister>());
2165   flagTable[e_popf] = flagInfo(vector<Dyninst::MachRegister>(),
2166 list_of(x86::of)(x86::sf)(x86::zf)(x86::af)(x86::pf)(x86::cf)(x86::tf)(x86::if_)(x86::df)(x86::nt_));
2167   flagTable[e_popfd] = flagInfo(vector<Dyninst::MachRegister>(),
2168 list_of(x86::of)(x86::sf)(x86::zf)(x86::af)(x86::pf)(x86::cf)(x86::tf)(x86::if_)(x86::df)(x86::nt_));
2169   flagTable[e_rcl] = flagInfo(list_of(x86::cf), list_of(x86::of)(x86::cf));
2170   flagTable[e_rcr] = flagInfo(list_of(x86::cf), list_of(x86::of)(x86::cf));
2171   flagTable[e_rol] = flagInfo(list_of(x86::cf), list_of(x86::of)(x86::cf));
2172   flagTable[e_ror] = flagInfo(list_of(x86::cf), list_of(x86::of)(x86::cf));
2173   flagTable[e_rsm] = flagInfo(vector<Dyninst::MachRegister>(),
2174 list_of(x86::of)(x86::sf)(x86::zf)(x86::af)(x86::pf)(x86::cf)(x86::tf)(x86::if_)(x86::df)(x86::nt_)(x86::rf));
2175   flagTable[e_sahf] = flagInfo(list_of(x86::sf)(x86::zf)(x86::af)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
2176   flagTable[e_sar] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
2177   flagTable[e_shr] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
2178   flagTable[e_salc] = flagInfo(list_of(x86::cf), vector<Dyninst::MachRegister>());
2179   flagTable[e_sbb] = flagInfo(list_of(x86::cf), standardFlags);
2180   flagTable[e_setb] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
2181   flagTable[e_setbe] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
2182   flagTable[e_setl] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
2183   flagTable[e_setle] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
2184   flagTable[e_setnb] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
2185   flagTable[e_setnbe] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
2186   flagTable[e_setnl] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
2187   flagTable[e_setnle] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
2188   flagTable[e_setno] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
2189   flagTable[e_setnp] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
2190   flagTable[e_setns] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
2191   flagTable[e_setnz] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
2192   flagTable[e_seto] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
2193   flagTable[e_setp] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
2194   flagTable[e_sets] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
2195   flagTable[e_setz] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
2196   flagTable[e_shld] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
2197   flagTable[e_shrd] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
2198   flagTable[e_shl_sal] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
2199   flagTable[e_stc] = flagInfo(vector<Dyninst::MachRegister>(), list_of(x86::cf));
2200   flagTable[e_std] = flagInfo(vector<Dyninst::MachRegister>(), list_of(x86::df));
2201   flagTable[e_sti] = flagInfo(vector<Dyninst::MachRegister>(), list_of(x86::if_));
2202   flagTable[e_stosb] = flagInfo(list_of(x86::df), vector<Dyninst::MachRegister>());
2203   flagTable[e_stosd] = flagInfo(list_of(x86::df), vector<Dyninst::MachRegister>());
2204   flagTable[e_stosw] = flagInfo(list_of(x86::df), vector<Dyninst::MachRegister>());
2205   flagTable[e_sub] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
2206   flagTable[e_test] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
2207   flagTable[e_verr] = flagInfo(vector<Dyninst::MachRegister>(), list_of(x86::zf));
2208   flagTable[e_verw] = flagInfo(vector<Dyninst::MachRegister>(), list_of(x86::zf));
2209   flagTable[e_xadd] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
2210   flagTable[e_xor] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
2211   flagTable[e_scasb] = flagInfo(list_of(x86::df), standardFlags);
2212   flagTable[e_scasw] = flagInfo(list_of(x86::df), standardFlags);
2213   flagTable[e_scasd] = flagInfo(list_of(x86::df), standardFlags);
2214   flagTable[e_pcmpestri] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
2215   flagTable[e_pcmpestrm] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
2216   flagTable[e_pcmpistri] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
2217   flagTable[e_pcmpistrm] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
2218   flagTable[e_popcnt] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::af)(x86::cf)(x86::pf), vector<Dyninst::MachRegister>());
2219   flagTable[e_ptest] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
2220
2221 //  flagTable[e_ptest] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::af)(x86::cf)(x86::pf), vector<Dyninst::MachRegister>());
2222 }
2223
2224 bool ia32_entry::flagsUsed(std::set<MachRegister>& flagsRead, std::set<MachRegister>& flagsWritten, ia32_locations* locs)
2225 {
2226   dyn_hash_map<entryID, flagInfo>::const_iterator found = ia32_instruction::getFlagTable().find(getID(locs));
2227   if(found == ia32_instruction::getFlagTable().end())
2228   {
2229     return false;
2230   }
2231   // No entries for something that touches no flags, so always return true if we had an entry
2232
2233   copy((found->second).readFlags.begin(), (found->second).readFlags.end(), inserter(flagsRead, flagsRead.begin()));
2234   copy((found->second).writtenFlags.begin(), (found->second).writtenFlags.end(), inserter(flagsWritten,flagsWritten.begin()));
2235   return true;
2236 }
2237
2238
2239
2240 // Modded table entry for push/pop, daa, das, aaa, aas, insb/w/d, outsb/w/d, xchg, cbw
2241 // les, lds, aam, aad, loop(z/nz), cmpxch, lss, mul, imul, div, idiv, cmpxch8, [ld/st]mxcsr
2242 // clflush, prefetch*
2243
2244
2245 /**
2246  * This is generally the first table in the decoding process. The row selected here
2247  * is just based on the current byte we are looking at in the instruction. This
2248  * table contains a lot of the really basic and most common x86 instructions.
2249  */
2250 static ia32_entry oneByteMap[256] = {
2251   /* 00 */
2252   { e_add,  t_done, 0, true, { Eb, Gb, Zz }, 0, s1RW2R, 0 },
2253   { e_add,  t_done, 0, true, { Ev, Gv, Zz }, 0, s1RW2R, 0 },
2254   { e_add,  t_done, 0, true, { Gb, Eb, Zz }, 0, s1RW2R, 0 },
2255   { e_add,  t_done, 0, true, { Gv, Ev, Zz }, 0, s1RW2R, 0 },
2256   { e_add,  t_done, 0, false, { AL, Ib, Zz }, 0, s1RW2R, 0 },
2257   { e_add,  t_done, 0, false, { eAX, Iz, Zz }, 0, s1RW2R, 0 },
2258   { e_push, t_done, 0, false, { ES, eSP, Zz }, 0, s1R2RW, s2I }, // Semantics rewritten to ignore stack "operand"
2259   { e_pop,  t_done, 0, false, { ES, eSP, Zz }, 0, s1W2RW, s2I },
2260   /* 08 */
2261   { e_or,   t_done, 0, true, { Eb, Gb, Zz }, 0, s1RW2R, 0},
2262   { e_or,   t_done, 0, true, { Ev, Gv, Zz }, 0, s1RW2R, 0 },
2263   { e_or,   t_done, 0, true, { Gb, Eb, Zz }, 0, s1RW2R, 0 },
2264   { e_or,   t_done, 0, true, { Gv, Ev, Zz }, 0, s1RW2R, 0 },
2265   { e_or,   t_done, 0, false, { AL, Ib, Zz }, 0, s1RW2R, 0 },
2266   { e_or,   t_done, 0, false, { rAX, Iz, Zz }, 0, s1RW2R, 0 },
2267   { e_push, t_done, 0, false, { CS, eSP, Zz }, 0, s1R2RW, s2I },
2268   { e_No_Entry,      t_twoB, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
2269   /* 10 */
2270   { e_adc,  t_done, 0, true, { Eb, Gb, Zz }, 0, s1RW2R, 0 },
2271   { e_adc,  t_done, 0, true, { Ev, Gv, Zz }, 0, s1RW2R, 0 },
2272   { e_adc,  t_done, 0, true, { Gb, Eb, Zz }, 0, s1RW2R, 0 },
2273   { e_adc,  t_done, 0, true, { Gv, Ev, Zz }, 0, s1RW2R, 0 },
2274   { e_adc,  t_done, 0, false, { AL, Ib, Zz }, 0, s1RW2R, 0 },
2275   { e_adc,  t_done, 0, false, { rAX, Iz, Zz }, 0, s1RW2R, 0 },
2276   { e_push, t_done, 0, false, { SS, eSP, Zz }, 0, s1R2RW, s2I },
2277   { e_pop,  t_done, 0, false, { SS, eSP, Zz }, 0, s1W2RW, s2I },
2278   /* 18 */
2279   { e_sbb,  t_done, 0, true, { Eb, Gb, Zz }, 0, s1RW2R, 0 },
2280   { e_sbb,  t_done, 0, true, { Ev, Gv, Zz }, 0, s1RW2R, 0 },
2281   { e_sbb,  t_done, 0, true, { Gb, Eb, Zz }, 0, s1RW2R, 0 },
2282   { e_sbb,  t_done, 0, true, { Gv, Ev, Zz }, 0, s1RW2R, 0 },
2283   { e_sbb,  t_done, 0, false, { AL, Ib, Zz }, 0, s1RW2R, 0 },
2284   { e_sbb,  t_done, 0, false, { rAX, Iz, Zz }, 0, s1RW2R, 0 },
2285   { e_push, t_done, 0, false, { DS, eSP, Zz }, 0, s1R2RW, s2I },
2286   { e_pop , t_done, 0, false, { DS, eSP, Zz }, 0, s1W2RW, s2I },
2287   /* 20 */
2288   { e_and, t_done, 0, true, { Eb, Gb, Zz }, 0, s1RW2R, 0 },
2289   { e_and, t_done, 0, true, { Ev, Gv, Zz }, 0, s1RW2R, 0 },
2290   { e_and, t_done, 0, true, { Gb, Eb, Zz }, 0, s1RW2R, 0 },
2291   { e_and, t_done, 0, true, { Gv, Ev, Zz }, 0, s1RW2R, 0 },
2292   { e_and, t_done, 0, false, { AL, Ib, Zz }, 0, s1RW2R, 0 },
2293   { e_and, t_done, 0, false, { rAX, Iz, Zz }, 0, s1RW2R, 0 },
2294   { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 }, // PREFIX_SEG_OVR
2295   { e_daa, t_done, 0, false, { AL, Zz, Zz }, 0, s1RW, s1I },
2296   /* 28 */
2297   { e_sub, t_done, 0, true, { Eb, Gb, Zz }, 0, s1RW2R, 0 },
2298   { e_sub, t_done, 0, true, { Ev, Gv, Zz }, 0, s1RW2R, 0 },
2299   { e_sub, t_done, 0, true, { Gb, Eb, Zz }, 0, s1RW2R, 0 },
2300   { e_sub, t_done, 0, true, { Gv, Ev, Zz }, 0, s1RW2R, 0 },
2301   { e_sub, t_done, 0, false, { AL, Ib, Zz }, 0, s1RW2R, 0 },
2302   { e_sub, t_done, 0, false, { rAX, Iz, Zz }, 0, s1RW2R, 0 },
2303   { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 }, // PREFIX_SEG_OVR
2304   { e_das , t_done, 0, false, { AL, Zz, Zz }, 0, s1RW, s1I },
2305   /* 30 */
2306   { e_xor, t_done, 0, true, { Eb, Gb, Zz }, 0, s1RW2R, 0 },
2307   { e_xor, t_done, 0, true, { Ev, Gv, Zz }, 0, s1RW2R, 0 },
2308   { e_xor, t_done, 0, true, { Gb, Eb, Zz }, 0, s1RW2R, 0 },
2309   { e_xor, t_done, 0, true, { Gv, Ev, Zz }, 0, s1RW2R, 0 },
2310   { e_xor, t_done, 0, false, { AL, Ib, Zz }, 0, s1RW2R, 0 },
2311   { e_xor, t_done, 0, false, { rAX, Iz, Zz }, 0, s1RW2R, 0 },
2312   { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 }, // PREFIX_SEG_OVR
2313   { e_aaa, t_done, 0, false, { AX, Zz, Zz }, 0, s1RW, s1I },
2314   /* 38 */
2315   { e_cmp, t_done, 0, true, { Eb, Gb, Zz }, 0, s1R2R, 0 },
2316   { e_cmp, t_done, 0, true, { Ev, Gv, Zz }, 0, s1R2R, 0 },
2317   { e_cmp, t_done, 0, true, { Gb, Eb, Zz }, 0, s1R2R, 0 },
2318   { e_cmp, t_done, 0, true, { Gv, Ev, Zz }, 0, s1R2R, 0 },
2319   { e_cmp, t_done, 0, false, { AL, Ib, Zz }, 0, s1R2R, 0 },
2320   { e_cmp, t_done, 0, false, { rAX, Iz, Zz }, 0, s1R2R, 0 },
2321   { e_No_Entry,     t_ill,  0, false, { Zz, Zz, Zz }, 0, 0, 0 }, // PREFIX_SEG_OVR
2322   { e_aas, t_done, 0, false, { AX, Zz, Zz }, 0, s1RW, s1I },
2323   /* 40 */
2324   { e_inc, t_done, 0, false, { eAX, Zz, Zz }, 0, s1RW, 0 },
2325   { e_inc, t_done, 0, false, { eCX, Zz, Zz }, 0, s1RW, 0 },
2326   { e_inc, t_done, 0, false, { eDX, Zz, Zz }, 0, s1RW, 0 },
2327   { e_inc, t_done, 0, false, { eBX, Zz, Zz }, 0, s1RW, 0 },
2328   { e_inc, t_done, 0, false, { eSP, Zz, Zz }, 0, s1RW, 0 },
2329   { e_inc, t_done, 0, false, { eBP, Zz, Zz }, 0, s1RW, 0 },
2330   { e_inc, t_done, 0, false, { eSI, Zz, Zz }, 0, s1RW, 0 },
2331   { e_inc, t_done, 0, false, { eDI, Zz, Zz }, 0, s1RW, 0 },
2332   /* 48 */
2333   { e_dec, t_done, 0, false, { eAX, Zz, Zz }, 0, s1RW, 0 },
2334   { e_dec, t_done, 0, false, { eCX, Zz, Zz }, 0, s1RW, 0 },
2335   { e_dec, t_done, 0, false, { eDX, Zz, Zz }, 0, s1RW, 0 },
2336   { e_dec, t_done, 0, false, { eBX, Zz, Zz }, 0, s1RW, 0 },
2337   { e_dec, t_done, 0, false, { eSP, Zz, Zz }, 0, s1RW, 0 },
2338   { e_dec, t_done, 0, false, { eBP, Zz, Zz }, 0, s1RW, 0 },
2339   { e_dec, t_done, 0, false, { eSI, Zz, Zz }, 0, s1RW, 0 },
2340   { e_dec, t_done, 0, false, { eDI, Zz, Zz }, 0, s1RW, 0 },
2341   /* 50 */
2342   { e_push, t_done, 0, false, { rAX, eSP, Zz }, 0, s1R2RW, s2I },
2343   { e_push, t_done, 0, false, { rCX, eSP, Zz }, 0, s1R2RW, s2I },
2344   { e_push, t_done, 0, false, { rDX, eSP, Zz }, 0, s1R2RW, s2I },
2345   { e_push, t_done, 0, false, { rBX, eSP, Zz }, 0, s1R2RW, s2I },
2346   { e_push, t_done, 0, false, { rSP, eSP, Zz }, 0, s1R2RW, s2I },
2347   { e_push, t_done, 0, false, { rBP, eSP, Zz }, 0, s1R2RW, s2I },
2348   { e_push, t_done, 0, false, { rSI, eSP, Zz }, 0, s1R2RW, s2I },
2349   { e_push, t_done, 0, false, { rDI, eSP, Zz }, 0, s1R2RW, s2I },
2350   /* 58 */
2351   { e_pop, t_done, 0, false, { rAX, eSP, Zz }, 0, s1W2RW, s2I },
2352   { e_pop, t_done, 0, false, { rCX, eSP, Zz }, 0, s1W2RW, s2I },
2353   { e_pop, t_done, 0, false, { rDX, eSP, Zz }, 0, s1W2RW, s2I },
2354   { e_pop, t_done, 0, false, { rBX, eSP, Zz }, 0, s1W2RW, s2I },
2355   { e_pop, t_done, 0, false, { rSP, eSP, Zz }, 0, s1W2RW, s2I },
2356   { e_pop, t_done, 0, false, { rBP, eSP, Zz }, 0, s1W2RW, s2I },
2357   { e_pop, t_done, 0, false, { rSI, eSP, Zz }, 0, s1W2RW, s2I },
2358   { e_pop, t_done, 0, false, { rDI, eSP, Zz }, 0, s1W2RW, s2I },
2359   /* 60 */
2360   { e_pushad, t_done, 0, false, { GPRS, eSP, Zz }, 0, s1R2RW, s2I },
2361   { e_popad,  t_done, 0, false, { GPRS, eSP, Zz }, 0, s1W2RW, s2I },
2362   { e_bound, t_done, 0, true, { Gv, Ma, Zz }, 0, s1R2R, 0 }, // or VEX
2363   { e_arpl, t_done, 0, true, { Ew, Gw, Zz }, 0, s1R2R, 0 }, /* No REX */
2364   { e_No_Entry,          t_ill,  0, false, { Zz, Zz, Zz }, 0, 0, 0 }, // PREFIX_SEG_OVR
2365   { e_No_Entry,          t_ill,  0, false, { Zz, Zz, Zz }, 0, 0, 0 }, // PREFIX_SEG_OVR
2366   { e_No_Entry,          t_ill,  2, false, { Zz, Zz, Zz }, 0, 0, 0 }, /* operand size prefix (PREFIX_OPR_SZ) (depricated: prefixedSSE)*/
2367   { e_No_Entry,          t_ill,  0, false, { Zz, Zz, Zz }, 0, 0, 0 }, /* address size prefix (PREFIX_ADDR_SZ)*/
2368   /* 68 */
2369   { e_push,    t_done, 0, false, { Iz, eSP, Zz }, 0, s1R2RW, s2I },
2370   { e_imul,    t_done, 0, true, { Gv, Ev, Iz }, 0, s1W2R3R, 0 },
2371   { e_push,    t_done, 0, false, { Ib, eSP, Zz }, 0, s1R2RW, s2I },
2372   { e_imul,    t_done, 0, true, { Gv, Ev, Ib }, 0, s1W2R3R, 0 },
2373   { e_insb,    t_done, 0, false, { Yb, DX, Zz }, 0, s1W2R | (fREP << FPOS), 0 }, // (e)SI/DI changed
2374   { e_insd,  t_done, 0, false, { Yv, DX, Zz }, 0, s1W2R | (fREP << FPOS), 0 },
2375   { e_outsb,   t_done, 0, false, { DX, Xb, Zz }, 0, s1W2R | (fREP << FPOS), 0 },
2376   { e_outsd, t_done, 0, false, { DX, Xv, Zz }, 0, s1W2R | (fREP << FPOS), 0 },
2377   /* 70 */
2378   { e_jo,         t_done, 0, false, { Jb, Zz, Zz }, (IS_JCC | REL_B), s1R, 0 },
2379   { e_jno,        t_done, 0, false, { Jb, Zz, Zz }, (IS_JCC | REL_B), s1R, 0 },
2380   { e_jb_jnaej_j, t_done, 0, false, { Jb, Zz, Zz }, (IS_JCC | REL_B), s1R, 0 },
2381   { e_jnb_jae_j,  t_done, 0, false, { Jb, Zz, Zz }, (IS_JCC | REL_B), s1R, 0 },
2382   { e_jz,         t_done, 0, false, { Jb, Zz, Zz }, (IS_JCC | REL_B), s1R, 0 },
2383   { e_jnz,        t_done, 0, false, { Jb, Zz, Zz }, (IS_JCC | REL_B), s1R, 0 },
2384   { e_jbe,        t_done, 0, false, { Jb, Zz, Zz }, (IS_JCC | REL_B), s1R, 0 },
2385   { e_jnbe,       t_done, 0, false, { Jb, Zz, Zz }, (IS_JCC | REL_B), s1R, 0 },
2386   /* 78 */
2387   { e_js,   t_done, 0, false, { Jb, Zz, Zz }, (IS_JCC | REL_B), s1R, 0 },
2388   { e_jns,  t_done, 0, false, { Jb, Zz, Zz }, (IS_JCC | REL_B), s1R, 0 },
2389   { e_jp,   t_done, 0, false, { Jb, Zz, Zz }, (IS_JCC | REL_B), s1R, 0 },
2390   { e_jnp,  t_done, 0, false, { Jb, Zz, Zz }, (IS_JCC | REL_B), s1R, 0 },
2391   { e_jl,   t_done, 0, false, { Jb, Zz, Zz }, (IS_JCC | REL_B), s1R, 0 },
2392   { e_jnl,  t_done, 0, false, { Jb, Zz, Zz }, (IS_JCC | REL_B), s1R, 0 },
2393   { e_jle,  t_done, 0, false, { Jb, Zz, Zz }, (IS_JCC | REL_B), s1R, 0 },
2394   { e_jnle, t_done, 0, false, { Jb, Zz, Zz }, (IS_JCC | REL_B), s1R, 0 },
2395   /* 80 */
2396   { e_No_Entry, t_grp, Grp1a, true, { Zz, Zz, Zz }, 0, 0, 0 },
2397   { e_No_Entry, t_grp, Grp1b, true, { Zz, Zz, Zz }, 0, 0, 0 },
2398   { e_No_Entry, t_grp, Grp1c, true, { Zz, Zz, Zz }, 0, 0, 0 }, // book says Grp1 however;sandpile.org agrees.
2399   { e_No_Entry, t_grp, Grp1d, true, { Zz, Zz, Zz }, 0, 0, 0 },
2400   { e_test, t_done, 0, true, { Eb, Gb, Zz }, 0, s1R2R, 0 },
2401   { e_test, t_done, 0, true, { Ev, Gv, Zz }, 0, s1R2R, 0 },
2402   { e_xchg, t_done, 0, true, { Eb, Gb, Zz }, 0, s1RW2RW, 0 },
2403   { e_xchg, t_done, 0, true, { Ev, Gv, Zz }, 0, s1RW2RW, 0 },
2404   /* 88 */
2405   { e_mov, t_done, 0, true, { Eb, Gb, Zz }, 0, s1W2R, 0 },
2406   { e_mov, t_done, 0, true, { Ev, Gv, Zz }, 0, s1W2R, 0 },
2407   { e_mov, t_done, 0, true, { Gb, Eb, Zz }, 0, s1W2R, 0 },
2408   { e_mov, t_done, 0, true, { Gv, Ev, Zz }, 0, s1W2R, 0 },
2409   { e_mov, t_done, 0, true, { Ew, Sw, Zz }, 0, s1W2R, 0 },
2410   { e_lea, t_done, 0, true, { Gv, Mlea, Zz }, IS_NOP, s1W2R, 0 }, // this is just M in the book
2411                                                         // AFAICT the 2nd operand is not accessed
2412   { e_mov, t_done, 0, true, { Sw, Ew, Zz }, 0, s1W2R, 0 },
2413   { e_pop, t_done, 0, true, { Ev, eSP, Zz }, 0, s1W2RW, s2I }, // or VEX XOP
2414   /* 90 */
2415   { e_nop,  t_done, 0, false, { Zz, Zz, Zz }, IS_NOP, sNONE, 0 }, // actually xchg eax,eax
2416   { e_xchg, t_done, 0, false, { rCX, rAX, Zz }, 0, s1RW2RW, 0 },
2417   { e_xchg, t_done, 0, false, { rDX, rAX, Zz }, 0, s1RW2RW, 0 },
2418   { e_xchg, t_done, 0, false, { rBX, rAX, Zz }, 0, s1RW2RW, 0 },
2419   { e_xchg, t_done, 0, false, { rSP, rAX, Zz }, 0, s1RW2RW, 0 },
2420   { e_xchg, t_done, 0, false, { rBP, rAX, Zz }, 0, s1RW2RW, 0 },
2421   { e_xchg, t_done, 0, false, { rSI, rAX, Zz }, 0, s1RW2RW, 0 },
2422   { e_xchg, t_done, 0, false, { rDI, rAX, Zz }, 0, s1RW2RW, 0 },
2423   /* 98 */
2424   { e_cwde, t_done, 0, false, { eAX, Zz, Zz }, 0, s1RW, s1I },
2425   { e_cdq,  t_done, 0, false, { eDX, eAX, Zz }, 0, s1W2R, s1I },
2426   { e_call,     t_done, 0, false, { Ap, Zz, Zz }, IS_CALL | PTR_WX, s1R, 0 },
2427   { e_wait,     t_done, 0, false, { Zz, Zz, Zz }, 0, sNONE, 0 },
2428   { e_pushfd, t_done, 0, false, { Fv, rSP, Zz }, 0, s1R2RW, s2I },
2429   { e_popfd,  t_done, 0, false, { Fv, rSP, Zz }, 0, s1W2RW, s2I },
2430   { e_sahf,     t_done, 0, false, { Zz, Zz, Zz }, 0, 0, 0 }, // FIXME Intel
2431   { e_lahf,     t_done, 0, false, { Zz, Zz, Zz }, 0, 0, 0 }, // FIXME Intel
2432   /* A0 */
2433   { e_mov,   t_done, 0, false, { AL, Ob, Zz },  0, s1W2R, 0 },
2434   { e_mov,   t_done, 0, false, { rAX, Ov, Zz }, 0, s1W2R, 0 },
2435   { e_mov,   t_done, 0, false, { Ob, AL, Zz },  0, s1W2R, 0 },
2436   { e_mov,   t_done, 0, false, { Ov, rAX, Zz }, 0, s1W2R, 0 },
2437   // XXX: Xv is source, Yv is destination for movs, so they're swapped!
2438   { e_movsb, t_done, 0, false, { Yb, Xb, Zz },  0, s1W2R | (fREP << FPOS), 0 }, // (e)SI/DI changed
2439   { e_movsd, t_done, 0, false, { Yv, Xv, Zz }, 0, s1W2R | (fREP << FPOS), 0 },
2440   { e_cmpsb, t_done, 0, false, { Xb, Yb, Zz },  0, s1R2R | (fCMPS << FPOS), 0 },
2441   { e_cmpsw, t_done, 0, false, { Xv, Yv, Zz },  0, s1R2R | (fCMPS << FPOS), 0 },
2442   /* A8 */
2443   { e_test,     t_done, 0, false, { AL, Ib, Zz },  0, s1R2R, 0 },
2444   { e_test,     t_done, 0, false, { rAX, Iz, Zz }, 0, s1R2R, 0 },
2445   { e_stosb,    t_done, 0, false, { Yb, AL, Zz },  0, s1W2R | (fREP << FPOS), 0 },
2446   { e_stosd,  t_done, 0, false, { Yv, rAX, Zz }, 0, s1W2R | (fREP << FPOS), 0 },
2447   { e_lodsb,    t_done, 0, false, { AL, Xb, Zz },  0, s1W2R | (fREP << FPOS), 0 },
2448   { e_lodsd,    t_done, 0, false, { rAX, Xv, Zz }, 0, s1W2R | (fREP << FPOS), 0 },
2449   { e_scasb,    t_done, 0, false, { AL, Yb, Zz },  0, s1R2R | (fSCAS << FPOS), 0 },
2450   { e_scasd,  t_done, 0, false, { rAX, Yv, Zz }, 0, s1R2R | (fSCAS << FPOS), 0 },
2451   /* B0 */
2452   { e_mov, t_done, 0, false, { AL, Ib, Zz }, 0, s1W2R, 0 },
2453   { e_mov, t_done, 0, false, { CL, Ib, Zz }, 0, s1W2R, 0 },
2454   { e_mov, t_done, 0, false, { DL, Ib, Zz }, 0, s1W2R, 0 },
2455   { e_mov, t_done, 0, false, { BL, Ib, Zz }, 0, s1W2R, 0 },
2456   { e_mov, t_done, 0, false, { AH, Ib, Zz }, 0, s1W2R, 0 },
2457   { e_mov, t_done, 0, false, { CH, Ib, Zz }, 0, s1W2R, 0 },
2458   { e_mov, t_done, 0, false, { DH, Ib, Zz }, 0, s1W2R, 0 },
2459   { e_mov, t_done, 0, false, { BH, Ib, Zz }, 0, s1W2R, 0 },
2460   /* B8 */
2461   { e_mov, t_done, 0, false, { rAX, Iv, Zz }, 0, s1W2R, 0 },
2462   { e_mov, t_done, 0, false, { rCX, Iv, Zz }, 0, s1W2R, 0 },
2463   { e_mov, t_done, 0, false, { rDX, Iv, Zz }, 0, s1W2R, 0 },
2464   { e_mov, t_done, 0, false, { rBX, Iv, Zz }, 0, s1W2R, 0 },
2465   { e_mov, t_done, 0, false, { rSP, Iv, Zz }, 0, s1W2R, 0 },
2466   { e_mov, t_done, 0, false, { rBP, Iv, Zz }, 0, s1W2R, 0 },
2467   { e_mov, t_done, 0, false, { rSI, Iv, Zz }, 0, s1W2R, 0 },
2468   { e_mov, t_done, 0, false, { rDI, Iv, Zz }, 0, s1W2R, 0 },
2469   /* C0 */
2470   { e_No_Entry, t_grp, Grp2, true, { Eb, Ib, Zz }, 0, s1RW2R, 0 },
2471   { e_No_Entry, t_grp, Grp2, true, { Ev, Ib, Zz }, 0, s1RW2R, 0 },
2472   { e_ret_near, t_done, 0, false, { Iw, Zz, Zz }, (IS_RET | IS_RETC), s1R | (fNEARRET << FPOS), s1I },
2473   { e_ret_near, t_done, 0, false, { Zz, Zz, Zz }, (IS_RET), fNEARRET << FPOS, s1I },
2474   { e_les,      t_done, 0, true, { ES, Gv, Mp }, 0, s1W2W3R, 0 }, // or VEX
2475   { e_lds,      t_done, 0, true, { DS, Gv, Mp }, 0, s1W2W3R, 0 }, // or VEX
2476   { e_No_Entry, t_grp, Grp11, true, { Eb, Ib, Zz }, 0, s1W2R, 0 },
2477   { e_No_Entry, t_grp, Grp11, true, { Ev, Iz, Zz }, 0, s1W2R, 0 },
2478   /* C8 */
2479   { e_enter,   t_done, 0, false, { Iw, Ib, Zz }, 0, s1R2R | (fENTER << FPOS), 0 },
2480   { e_leave,   t_done, 0, false, { Zz, Zz, Zz }, 0, fLEAVE << FPOS, 0 },
2481   { e_ret_far, t_done, 0, false, { Iw, Zz, Zz }, (IS_RETF | IS_RETC), s1R | (fFARRET << FPOS), s1I },
2482   { e_ret_far, t_done, 0, false, { Zz, Zz, Zz }, (IS_RETF), fFARRET << FPOS, s1I },
2483   { e_int3,   t_done, 0, false, { Zz, Zz, Zz }, 0, sNONE, 0 },
2484   { e_int,     t_done, 0, false, { Ib, Zz, Zz }, 0, s1R, 0 },
2485   { e_into,    t_done, 0, false, { Zz, Zz, Zz }, 0, sNONE, 0 },
2486   { e_iret,    t_done, 0, false, { Zz, Zz, Zz }, (IS_RET), fIRET << FPOS, 0 },
2487   /* D0 */
2488   { e_No_Entry, t_grp, Grp2, true, { Eb, ImplImm, Zz }, 0, s1RW2R, 0 }, // const1
2489   { e_No_Entry, t_grp, Grp2, true, { Ev, ImplImm, Zz }, 0, s1RW2R, 0 }, // --"--
2490   { e_No_Entry, t_grp, Grp2, true, { Eb, CL, Zz }, 0, s1RW2R, 0 },
2491   { e_No_Entry, t_grp, Grp2, true, { Ev, CL, Zz }, 0, s1RW2R, 0 },
2492   { e_aam,  t_done, 0, false, { AX, Ib, Zz }, 0, s1RW2R, s1I | s2I },
2493   { e_aad,  t_done, 0, false, { AX, Ib, Zz }, 0, s1RW2R, s1I | s2I },
2494   { e_salc, t_done, 0, false, { Zz, Zz, Zz }, 0, sNONE, 0 }, // undocumeted
2495   { e_xlat, t_done, 0, false, { Zz, Zz, Zz }, 0, fXLAT << FPOS, 0 }, // scream
2496   /* D8 */
2497   { e_No_Entry, t_coprocEsc, GrpD8, true, { Zz, Zz, Zz }, 0, 0, 0 },
2498   { e_No_Entry, t_coprocEsc, GrpD9, true, { Zz, Zz, Zz }, 0, 0, 0 },
2499   { e_No_Entry, t_coprocEsc, GrpDA, true, { Zz, Zz, Zz }, 0, 0, 0 },
2500   { e_No_Entry, t_coprocEsc, GrpDB, true, { Zz, Zz, Zz }, 0, 0, 0 },
2501   { e_No_Entry, t_coprocEsc, GrpDC, true, { Zz, Zz, Zz }, 0, 0, 0 },
2502   { e_No_Entry, t_coprocEsc, GrpDD, true, { Zz, Zz, Zz }, 0, 0, 0 },
2503   { e_No_Entry, t_coprocEsc, GrpDE, true, { Zz, Zz, Zz }, 0, 0, 0 },
2504   { e_No_Entry, t_coprocEsc, GrpDF, true, { Zz, Zz, Zz }, 0, 0, 0 },
2505   /* E0 */
2506   { e_loopn,    t_done, 0, false, { Jb, eCX, Zz }, (IS_JCC | REL_B), s1R2R, 0 },
2507   { e_loope,    t_done, 0, false, { Jb, eCX, Zz }, (IS_JCC | REL_B), s1R2R, 0 },
2508   { e_loop,     t_done, 0, false, { Jb, eCX, Zz }, (IS_JCC | REL_B), s1R2R, 0 },
2509   { e_jcxz_jec, t_done, 0, false, { Jb, eCX, Zz }, (IS_JCC | REL_B), s1R2R, 0 },
2510   { e_in,       t_done, 0, false, { AL, Ib, Zz }, 0, s1W2R | (fIO << FPOS), 0 },
2511   { e_in,       t_done, 0, false, { eAX, Ib, Zz }, 0, s1W2R | (fIO << FPOS), 0 },
2512   { e_out,      t_done, 0, false, { Ib, AL, Zz }, 0, s1W2R | (fIO << FPOS), 0 },
2513   { e_out,      t_done, 0, false, { Ib, eAX, Zz }, 0, s1W2R | (fIO << FPOS), 0 },
2514   /* E8 */
2515   { e_call, t_done, 0, false, { Jz, Zz, Zz }, (IS_CALL | REL_X), s1R | (fCALL << FPOS), 0 },
2516   { e_jmp,  t_done, 0, false, { Jz, Zz, Zz }, (IS_JUMP | REL_X), s1R, 0 },
2517   { e_jmp,  t_done, 0, false, { Ap, Zz, Zz }, (IS_JUMP | PTR_WX), s1R, 0 },
2518   { e_jmp,  t_done, 0, false, { Jb, Zz, Zz }, (IS_JUMP | REL_B), s1R, 0 },
2519   { e_in,   t_done, 0, false, { AL, DX, Zz }, 0, s1W2R | (fIO << FPOS), 0 },
2520   { e_in,   t_done, 0, false, { eAX, DX, Zz }, 0, s1W2R | (fIO << FPOS), 0 },
2521   { e_out,  t_done, 0, false, { DX, AL, Zz }, 0, s1W2R | (fIO << FPOS), 0 },
2522   { e_out,  t_done, 0, false, { DX, eAX, Zz }, 0, s1W2R | (fIO << FPOS), 0 },
2523   /* F0 */
2524   { e_No_Entry,      t_ill,  0, false, { Zz, Zz, Zz }, 0, 0, 0 }, // PREFIX_INSTR
2525   { e_int1, t_done, 0, false, { Zz, Zz, Zz }, 0, sNONE, 0 }, // undocumented
2526   { e_No_Entry, t_ill, 3, false, { Zz, Zz, Zz }, 0, 0, 0 }, /* depricated: prefixedSSE */
2527   { e_No_Entry, t_ill, 1, false, { Zz, Zz, Zz }, 0, 0, 0 }, /* depricated: prefixedSSE */
2528   { e_hlt,  t_done, 0, false, { Zz, Zz, Zz }, PRVLGD, sNONE, 0 },
2529   { e_cmc,  t_done, 0, false, { Zz, Zz, Zz }, 0, sNONE, 0 },
2530   { e_No_Entry, t_grp, Grp3a, true, { Zz, Zz, Zz }, 0, sNONE, 0 },
2531   { e_No_Entry, t_grp, Grp3b, true, { Zz, Zz, Zz }, 0, sNONE, 0 },
2532   /* F8 */
2533   { e_clc, t_done, 0, false, { Zz, Zz, Zz }, 0, sNONE, 0 },
2534   { e_stc, t_done, 0, false, { Zz, Zz, Zz }, 0, sNONE, 0 },
2535   { e_cli, t_done, 0, false, { Zz, Zz, Zz }, 0, sNONE, 0 },
2536   { e_sti, t_done, 0, false, { Zz, Zz, Zz }, 0, sNONE, 0 },
2537   { e_cld, t_done, 0, false, { Zz, Zz, Zz }, 0, sNONE, 0 },
2538   { e_std, t_done, 0, false, { Zz, Zz, Zz }, 0, sNONE, 0 },
2539   { e_No_Entry, t_grp, Grp4, true, { Zz, Zz, Zz }, 0, sNONE, 0 },
2540   { e_No_Entry, t_grp, Grp5, true, { Zz, Zz, Zz }, 0, sNONE, 0 }
2541 };
2542
2543
2544 /**
2545  * This table is for two byte instructions. The index for this table is
2546  * always the current byte. Decoding can continue into the group map, the
2547  * sse map or one of the three byte maps. It can also continue into the
2548  * sse/vex multiplexing table if there is an SSE and VEX version of the
2549  * same instruction.
2550  */
2551 static ia32_entry twoByteMap[256] = {
2552   /* 00 */
2553   // Syscall/sysret are somewhat hacked
2554   // Syscall on amd64 will also read CS/SS for where to call in 32-bit mode
2555   { e_No_Entry, t_grp, Grp6, true, { Zz, Zz, Zz }, 0, 0, 0 },
2556   { e_No_Entry, t_grp, Grp7, false, { Zz, Zz, Zz }, 0, 0, 0 },
2557   { e_lar,        t_done, 0, true, { Gv, Ew, Zz }, 0, s1W2R | (fSEGDESC << FPOS), 0 },
2558   { e_lsl,        t_done, 0, true, { Gv, Ew, Zz }, 0, s1W2R | (fSEGDESC << FPOS), 0 },
2559   { e_No_Entry,    t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
2560   { e_syscall,    t_done, 0, false, { eCX, Zz, Zz }, 0, s1W, 0 }, // AMD: writes return address to eCX; for liveness, treat as hammering all
2561   { e_clts,       t_done, 0, false, { Zz, Zz, Zz }, 0, sNONE, 0 },
2562   { e_sysret,     t_done, 0, false, { eCX, Zz, Zz }, 0, s1R, 0 }, // AMD; reads return address from eCX; unlikely to occur in Dyninst use cases but we'll be paranoid
2563   /* 08 */
2564   { e_invd,   t_done, 0, false, { Zz, Zz, Zz }, 0, sNONE, 0 }, // only in priviledge 0, so ignored
2565   { e_wbinvd, t_done, 0, false, { Zz, Zz, Zz }, 0, sNONE, 0 }, // idem
2566   { e_No_Entry,        t_ill,  0, false, { Zz, Zz, Zz }, 0, 0, 0 },
2567   { e_ud2,    t_done,  0, 0, { Zz, Zz, Zz }, 0, 0, 0 },
2568   { e_No_Entry,        t_ill,  0, 0, { Zz, Zz, Zz }, 0, 0, 0 },
2569   { e_prefetch_w, t_grp, GrpAMD, true, { Zz, Zz, Zz }, 0, 0, 0 },    // AMD prefetch group
2570   { e_femms,       t_done,  0, false, { Zz, Zz, Zz }, 0, sNONE, 0 },  // AMD specific
2571   // semantic is bogus for the 1st operand - but correct for the 2nd,
2572   // which is the only one that can be a memory operand :)
2573   // fixing the 1st operand requires an extra table for the 3dnow instructions...
2574   { e_No_Entry,             t_3dnow, 0, true,  { Pq, Qq, Zz }, 0, s1RW2R, 0 }, // AMD 3DNow! suffixes
2575   /* 10 */
2576   { e_No_Entry, t_sse, SSE10, true, { Zz, Zz, Zz }, 0, 0, 0 },
2577   { e_No_Entry, t_sse, SSE11, true, { Zz, Zz, Zz }, 0, 0, 0 },
2578   { e_No_Entry, t_sse, SSE12, true, { Zz, Zz, Zz }, 0, 0, 0 },
2579   { e_No_Entry, t_sse, SSE13, true, { Zz, Zz, Zz }, 0, 0, 0 },
2580   { e_No_Entry, t_sse, SSE14, true, { Zz, Zz, Zz }, 0, 0, 0 },
2581   { e_No_Entry, t_sse, SSE15, true, { Zz, Zz, Zz }, 0, 0, 0 },
2582   { e_No_Entry, t_sse, SSE16, true, { Zz, Zz, Zz }, 0, 0, 0 },
2583   { e_No_Entry, t_sse, SSE17, true, { Zz, Zz, Zz }, 0, 0, 0 },
2584   /* 18 */
2585   { e_No_Entry, t_grp, Grp16, 0, { Zz, Zz, Zz }, 0, 0, 0 },
2586   { e_nop, t_done, 0, true, { Ev, Zz, Zz }, IS_NOP, 0, 0 }, // 19-1F according to sandpile and AMD are NOPs with an Ev operand
2587   { e_nop, t_done, 0, true, { Ev, Zz, Zz }, IS_NOP, 0, 0 }, // Can we go out on a limb that the 'operand' of a NOP is never read?
2588   { e_nop, t_done, 0, true, { Ev, Zz, Zz }, IS_NOP, 0, 0 }, // I think we can...so nullary operand semantics, but consume the
2589   { e_nop, t_done, 0, true, { Ev, Zz, Zz }, IS_NOP, 0, 0 }, // mod/rm byte operand.
2590   { e_nop, t_done, 0, true, { Ev, Zz, Zz }, IS_NOP, 0, 0 }, // -- BW 1/08
2591   { e_nop, t_done, 0, true, { Ev, Zz, Zz }, IS_NOP, 0, 0 },
2592   { e_nop, t_done, 0, true, { Ev, Zz, Zz }, IS_NOP, 0, 0 },
2593   /* 20 */
2594   { e_mov, t_done, 0, true, { Rd, Cd, Zz }, 0, s1W2R, 0 },
2595   { e_mov, t_done, 0, true, { Rd, Dd, Zz }, 0, s1W2R, 0 },
2596   { e_mov, t_done, 0, true, { Cd, Rd, Zz }, 0, s1W2R, 0 },
2597   { e_mov, t_done, 0, true, { Dd, Rd, Zz }, 0, s1W2R, 0 },
2598   { e_mov, t_done, 0, true, { Rd, Td, Zz }, 0, s1W2R, 0 }, // actually a SSE5A
2599   { e_No_Entry,     t_ill,  0, 0, { Zz, Zz, Zz }, 0, 0, 0 }, // SSE5A
2600   { e_mov, t_done, 0, true, { Td, Rd, Zz }, 0, s1W2R, 0 },
2601   { e_No_Entry,     t_ill,  0, 0, { Zz, Zz, Zz }, 0, 0, 0 },
2602   /* 28 */
2603   { e_No_Entry, t_sse, SSE28, true, { Zz, Zz, Zz }, 0, 0, 0 },
2604   { e_No_Entry, t_sse, SSE29, true, { Zz, Zz, Zz }, 0, 0, 0 },
2605   { e_No_Entry, t_sse, SSE2A, true, { Zz, Zz, Zz }, 0, 0, 0 },
2606   { e_No_Entry, t_sse, SSE2B, true, { Zz, Zz, Zz }, 0, 0, 0 },
2607   { e_No_Entry, t_sse, SSE2C, true, { Zz, Zz, Zz }, 0, 0, 0 },
2608   { e_No_Entry, t_sse, SSE2D, true, { Zz, Zz, Zz }, 0, 0, 0 },
2609   { e_No_Entry, t_sse, SSE2E, true, { Zz, Zz, Zz }, 0, 0, 0 },
2610   { e_No_Entry, t_sse, SSE2F, true, { Zz, Zz, Zz }, 0, 0, 0 },
2611   /* 30 */
2612   { e_wrmsr, t_done, 0, false, { rAX, rDX, rCX }, 0, s1R2R3R, 0 },
2613   { e_rdtsc, t_done, 0, false, { rAX, rDX, Zz }, 0, s1W2W3R, s1I | s2I },
2614   { e_rdmsr, t_done, 0, false, { rAX, rDX, rCX }, 0, s1W2W3R, 0 },
2615   { e_rdpmc, t_done, 0, false, { rAX, rDX, rCX }, 0, s1W2W3R, 0 },
2616   { e_sysenter, t_done, 0, false, { Zz, Zz, Zz }, 0, sNONE, 0 }, // XXX: fixme for kernel work
2617   { e_sysexit,  t_done, 0, false, { Zz, Zz, Zz }, 0, sNONE, 0 }, // XXX: fixme for kernel work
2618   { e_No_Entry, t_ill, 0, 0, { Zz, Zz, Zz }, 0, 0, 0 },
2619   { e_getsec, t_done, 0, false, { Zz, Zz, Zz }, 0 , sNONE, 0 },
2620   /* 38 */
2621   { e_No_Entry, t_threeB, 0, 0, { Zz, Zz, Zz }, 0, 0, 0 }, //3-Byte escape (Book Table A-4)
2622   { e_No_Entry, t_ill, 0, 0, { Zz, Zz, Zz }, 0 ,0, 0 },
2623   { e_No_Entry, t_threeB2, 0, 0, { Zz, Zz, Zz }, 0, 0, 0 }, //3-Byte escape (Book Table A-5)
2624   { e_No_Entry, t_ill, 0, 0, { Zz, Zz, Zz }, 0 ,0, 0 },
2625   { e_No_Entry, t_ill, 0, 0, { Zz, Zz, Zz }, 0 ,0, 0 },
2626   { e_No_Entry, t_ill, 0, 0, { Zz, Zz, Zz }, 0 ,0, 0 },
2627   { e_No_Entry, t_ill, 0, 0, { Zz, Zz, Zz }, 0 ,0, 0 },
2628   { e_No_Entry, t_ill, 0, 0, { Zz, Zz, Zz }, 0 ,0, 0 },
2629   /* 40 */
2630   { e_cmovo,   t_done, 0, true, { Gv, Ev, Zz }, 0, s1RW2R | (fCOND << FPOS), 0 },
2631   { e_No_Entry,  t_sse_vex_mult, SSEVEX41, false, { Zz, Zz, Zz }, 0, 0, 0 },
2632   { e_No_Entry,  t_sse_vex_mult, SSEVEX42, false, { Zz, Zz, Zz }, 0, 0, 0 },
2633   { e_cmovnb,  t_done, 0, true, { Gv, Ev, Zz }, 0, s1RW2R | (fCOND << FPOS), 0 },
2634   { e_No_Entry,  t_sse_vex_mult, SSEVEX44, false, { Zz, Zz, Zz }, 0, 0, 0 },
2635   { e_No_Entry,  t_sse_vex_mult, SSEVEX45, false, { Zz, Zz, Zz }, 0, 0, 0 },
2636   { e_No_Entry,  t_sse_vex_mult, SSEVEX46, false, { Zz, Zz, Zz }, 0, 0, 0 },
2637   { e_No_Entry,  t_sse_vex_mult, SSEVEX47, false, { Zz, Zz, Zz }, 0, 0, 0 },
2638   /* 48 */
2639   { e_cmovs,   t_done, 0, true, { Gv, Ev, Zz }, 0, s1RW2R | (fCOND << FPOS), 0 },
2640   { e_cmovns,  t_done, 0, true, { Gv, Ev, Zz }, 0, s1RW2R | (fCOND << FPOS), 0 },
2641   { e_No_Entry,  t_sse_vex_mult, SSEVEX4A, false, { Zz, Zz, Zz }, 0, 0, 0 },
2642   { e_No_Entry,  t_sse_vex_mult, SSEVEX4B, false, { Zz, Zz, Zz }, 0, 0, 0 },
2643   { e_cmovnge, t_done, 0, true, { Gv, Ev, Zz }, 0, s1RW2R | (fCOND << FPOS), 0 },
2644   { e_cmovnl,  t_done, 0, true, { Gv, Ev, Zz }, 0, s1RW2R | (fCOND << FPOS), 0 },
2645   { e_cmovng,  t_done, 0, true, { Gv, Ev, Zz }, 0, s1RW2R | (fCOND << FPOS), 0 },
2646   { e_cmovnl,  t_done, 0, true, { Gv, Ev, Zz }, 0, s1RW2R | (fCOND << FPOS), 0 },
2647   /* 50 */
2648   { e_No_Entry, t_sse, SSE50, true, { Zz, Zz, Zz }, 0, 0, 0 },
2649   { e_No_Entry, t_sse, SSE51, true, { Zz, Zz, Zz }, 0, 0, 0 },
2650   { e_No_Entry, t_sse, SSE52, true, { Zz, Zz, Zz }, 0, 0, 0 },
2651   { e_No_Entry, t_sse, SSE53, true, { Zz, Zz, Zz }, 0, 0, 0 },
2652   { e_No_Entry, t_sse, SSE54, true, { Zz, Zz, Zz }, 0, 0, 0 },
2653   { e_No_Entry, t_sse, SSE55, true, { Zz, Zz, Zz }, 0, 0, 0 },
2654   { e_No_Entry, t_sse, SSE56, true, { Zz, Zz, Zz }, 0, 0, 0 },
2655   { e_No_Entry, t_sse, SSE57, true, { Zz, Zz, Zz }, 0, 0, 0 },
2656   /* 58 */
2657   { e_No_Entry, t_sse, SSE58, true, { Zz, Zz, Zz }, 0, 0, 0 },
2658   { e_No_Entry, t_sse, SSE59, true, { Zz, Zz, Zz }, 0, 0, 0 },
2659   { e_No_Entry, t_sse, SSE5A, true, { Zz, Zz, Zz }, 0, 0, 0 },
2660   { e_No_Entry, t_sse, SSE5B, true, { Zz, Zz, Zz }, 0, 0, 0 },
2661   { e_No_Entry, t_sse, SSE5C, true, { Zz, Zz, Zz }, 0, 0, 0 },
2662   { e_No_Entry, t_sse, SSE5D, true, { Zz, Zz, Zz }, 0, 0, 0 },
2663   { e_No_Entry, t_sse, SSE5E, true, { Zz, Zz, Zz }, 0, 0, 0 },
2664   { e_No_Entry, t_sse, SSE5F, true, { Zz, Zz, Zz }, 0, 0, 0 },
2665   /* 60 */
2666   { e_No_Entry, t_sse, SSE60, true, { Zz, Zz, Zz }, 0, 0, 0 },
2667   { e_No_Entry, t_sse, SSE61, true, { Zz, Zz, Zz }, 0, 0, 0 },
2668   { e_No_Entry, t_sse, SSE62, true, { Zz, Zz, Zz }, 0, 0, 0 },
2669   { e_No_Entry, t_sse, SSE63, true, { Zz, Zz, Zz }, 0, 0, 0 },
2670   { e_No_Entry, t_sse, SSE64, true, { Zz, Zz, Zz }, 0, 0, 0 },
2671   { e_No_Entry, t_sse, SSE65, true, { Zz, Zz, Zz }, 0, 0, 0 },
2672   { e_No_Entry, t_sse, SSE66, true, { Zz, Zz, Zz }, 0, 0, 0 },
2673   { e_No_Entry, t_sse, SSE67, true, { Zz, Zz, Zz }, 0, 0, 0 },
2674   /* 68 */
2675   { e_No_Entry, t_sse, SSE68, true, { Zz, Zz, Zz }, 0, 0, 0 },
2676   { e_No_Entry, t_sse, SSE69, true, { Zz, Zz, Zz }, 0, 0, 0 },
2677   { e_No_Entry, t_sse, SSE6A, true, { Zz, Zz, Zz }, 0, 0, 0 },
2678   { e_No_Entry, t_sse, SSE6B, true, { Zz, Zz, Zz }, 0, 0, 0 },
2679   { e_No_Entry, t_sse, SSE6C, true, { Zz, Zz, Zz }, 0, 0, 0 },
2680   { e_No_Entry, t_sse, SSE6D, true, { Zz, Zz, Zz }, 0, 0, 0 },
2681   { e_No_Entry, t_sse, SSE6E, true, { Zz, Zz, Zz }, 0, 0, 0 },
2682   { e_No_Entry, t_sse, SSE6F, true, { Zz, Zz, Zz }, 0, 0, 0 },
2683   /* 70 */
2684   { e_No_Entry, t_sse, SSE70, true, { Zz, Zz, Zz }, 0, 0, 0 },
2685   { e_No_Entry, t_grp, Grp12, false, { Zz, Zz, Zz }, 0, 0, 0 },
2686   { e_No_Entry, t_grp, Grp13, false, { Zz, Zz, Zz }, 0, 0, 0 },
2687   { e_No_Entry, t_sse_vex_mult, SSEVEX73, false, { Zz, Zz, Zz }, 0, 0, 0 },
2688   { e_No_Entry, t_sse, SSE74, true, { Zz, Zz, Zz }, 0, 0, 0 },
2689   { e_No_Entry, t_sse, SSE75, true, { Zz, Zz, Zz }, 0, 0, 0 },
2690   { e_No_Entry, t_sse, SSE76, true, { Zz, Zz, Zz }, 0, 0, 0 },
2691   { e_No_Entry, t_sse, SSE77, false, { Zz, Zz, Zz }, 0, 0, 0 },
2692   /* 78 */
2693   { e_No_Entry, t_sse, SSE78, 0, { Zz, Zz, Zz }, 0, 0, 0 },
2694   { e_No_Entry, t_sse, SSE79, 0, { Zz, Zz, Zz }, 0, 0, 0 },
2695   { e_No_Entry, t_sse, SSE7A, 0, { Zz, Zz, Zz }, 0, 0, 0 },
2696   { e_No_Entry, t_sse, SSE7B, 0, { Zz, Zz, Zz }, 0, 0, 0 },
2697   { e_No_Entry, t_sse, SSE7C, 0, { Zz, Zz, Zz }, 0, 0, 0 },
2698   { e_No_Entry, t_sse, SSE7D, 0, { Zz, Zz, Zz }, 0, 0, 0 },
2699   { e_No_Entry, t_sse, SSE7E, 0, { Zz, Zz, Zz }, 0, 0, 0 },
2700   { e_No_Entry, t_sse, SSE7F, 0, { Zz, Zz, Zz }, 0, 0, 0 },
2701   /* 80 */
2702   { e_jo,   t_done, 0, false, { Jz, Zz, Zz }, (IS_JCC | REL_X), s1R | (fCOND << FPOS), 0 },
2703   { e_jno,  t_done, 0, false, { Jz, Zz, Zz }, (IS_JCC | REL_X), s1R | (fCOND << FPOS), 0 },
2704   { e_jb,   t_done, 0, false, { Jz, Zz, Zz }, (IS_JCC | REL_X), s1R | (fCOND << FPOS), 0 },
2705   { e_jnb,  t_done, 0, false, { Jz, Zz, Zz }, (IS_JCC | REL_X), s1R | (fCOND << FPOS), 0 },
2706   { e_jz,   t_done, 0, false, { Jz, Zz, Zz }, (IS_JCC | REL_X), s1R | (fCOND << FPOS), 0 },
2707   { e_jnz,  t_done, 0, false, { Jz, Zz, Zz }, (IS_JCC | REL_X), s1R | (fCOND << FPOS), 0 },
2708   { e_jbe,  t_done, 0, false, { Jz, Zz, Zz }, (IS_JCC | REL_X), s1R | (fCOND << FPOS), 0 },
2709   { e_jnbe, t_done, 0, false, { Jz, Zz, Zz }, (IS_JCC | REL_X), s1R | (fCOND << FPOS), 0 },
2710   /* 88 */
2711   { e_js,   t_done, 0, false, { Jz, Zz, Zz }, (IS_JCC | REL_X), s1R | (fCOND << FPOS), 0 },
2712   { e_jns,  t_done, 0, false, { Jz, Zz, Zz }, (IS_JCC | REL_X), s1R | (fCOND << FPOS), 0 },
2713   { e_jp,   t_done, 0, false, { Jz, Zz, Zz }, (IS_JCC | REL_X), s1R | (fCOND << FPOS), 0 },
2714   { e_jnp,  t_done, 0, false, { Jz, Zz, Zz }, (IS_JCC | REL_X), s1R | (fCOND << FPOS), 0 },
2715   { e_jl,   t_done, 0, false, { Jz, Zz, Zz }, (IS_JCC | REL_X), s1R | (fCOND << FPOS), 0 },
2716   { e_jnl,  t_done, 0, false, { Jz, Zz, Zz }, (IS_JCC | REL_X), s1R | (fCOND << FPOS), 0 },
2717   { e_jle,  t_done, 0, false, { Jz, Zz, Zz }, (IS_JCC | REL_X), s1R | (fCOND << FPOS), 0 },
2718   { e_jnle, t_done, 0, false, { Jz, Zz, Zz }, (IS_JCC | REL_X), s1R | (fCOND << FPOS), 0 },
2719   /* 90 */
2720   { e_No_Entry,  t_sse_vex_mult, SSEVEX90, false, { Zz, Zz, Zz }, 0, 0, 0 },
2721   { e_No_Entry,  t_sse_vex_mult, SSEVEX91, false, { Zz, Zz, Zz }, 0, 0, 0 },
2722   { e_No_Entry,  t_sse_vex_mult, SSEVEX92, false, { Zz, Zz, Zz }, 0, 0, 0 },
2723   { e_No_Entry,  t_sse_vex_mult, SSEVEX93, false, { Zz, Zz, Zz }, 0, 0, 0 },
2724   { e_setz,   t_done, 0, true, { Eb, Zz, Zz }, 0, s1W | (fCOND << FPOS), 0 },
2725   { e_setnz,  t_done, 0, true, { Eb, Zz, Zz }, 0, s1W | (fCOND << FPOS), 0 },
2726   { e_setbe,  t_done, 0, true, { Eb, Zz, Zz }, 0, s1W | (fCOND << FPOS), 0 },
2727   { e_setnbe, t_done, 0, true, { Eb, Zz, Zz }, 0, s1W | (fCOND << FPOS), 0 },
2728   /* 98 */
2729   { e_No_Entry,  t_sse_vex_mult, SSEVEX98, false, { Zz, Zz, Zz }, 0, 0, 0 },
2730   { e_No_Entry,  t_sse_vex_mult, SSEVEX99, false, { Zz, Zz, Zz }, 0, 0, 0 },
2731   { e_setp,   t_done, 0, true, { Eb, Zz, Zz }, 0, s1W | (fCOND << FPOS), 0 },
2732   { e_setnp,  t_done, 0, true, { Eb, Zz, Zz }, 0, s1W | (fCOND << FPOS), 0 },
2733   { e_setl,   t_done, 0, true, { Eb, Zz, Zz }, 0, s1W | (fCOND << FPOS), 0 },
2734   { e_setnl,  t_done, 0, true, { Eb, Zz, Zz }, 0, s1W | (fCOND << FPOS), 0 },
2735   { e_setle,  t_done, 0, true, { Eb, Zz, Zz }, 0, s1W | (fCOND << FPOS), 0 },
2736   { e_setnle, t_done, 0, true, { Eb, Zz, Zz }, 0, s1W | (fCOND << FPOS), 0 },
2737   /* A0 */
2738   { e_push,   t_done, 0, false, { FS, eSP, Zz }, 0, s1R2RW, s2I },
2739   { e_pop,    t_done, 0, false, { FS, eSP, Zz }, 0, s1W2RW, s2I },
2740   { e_cpuid,  t_done, 0, false, { Zz, Zz, Zz }, 0, sNONE, 0 },
2741   { e_bt,     t_done, 0, true, { Ev, Gv, Zz }, 0, s1R2R, 0 },
2742   { e_shld,   t_done, 0, true, { Ev, Gv, Ib }, 0, s1RW2R3R, 0 },
2743   { e_shld,   t_done, 0, true, { Ev, Gv, CL }, 0, s1RW2R3R, 0 },
2744   { e_No_Entry, t_ill, 0, 0, { Zz, Zz, Zz }, 0, 0, 0 },
2745   { e_No_Entry, t_ill, 0, 0, { Zz, Zz, Zz }, 0, 0, 0 },
2746   /* A8 */
2747   { e_push, t_done, 0, false, { GS, eSP, Zz }, 0, s1R2RW, s2I },
2748   { e_pop,  t_done, 0, false, { GS, eSP, Zz }, 0, s1W2RW, s2I },
2749   { e_rsm,  t_done, 0, false, { Zz, Zz, Zz }, 0, sNONE, 0 },
2750   { e_bts,  t_done, 0, true, { Ev, Gv, Zz }, 0, s1RW2R, 0 },
2751   { e_shrd, t_done, 0, true, { Ev, Gv, Ib }, 0, s1RW2R3R, 0 },
2752   { e_shrd, t_done, 0, true, { Ev, Gv, CL }, 0, s1RW2R3R, 0 },
2753   { e_No_Entry, t_grp, Grp15, 0, { Zz, Zz, Zz }, 0, 0, 0 },
2754   { e_imul, t_done, 0, true, { Gv, Ev, Zz }, 0, s1RW2R, 0 },
2755   /* B0 */
2756   // Assuming this is used with LOCK prefix, the destination gets a write anyway
2757   // This is not the case without lock prefix, but I ignore that case
2758   // Also, given that the 3rd operand is a register I ignore that it may be written
2759   { e_cmpxch, t_done, 0, true, { Eb, Gb, AL }, 0, s1RW2R3R | (fCMPXCH << FPOS), s2I },
2760   { e_cmpxch, t_done, 0, true, { Ev, Gv, eAX }, 0, s1RW2R3R | (fCMPXCH << FPOS), s2I },
2761   { e_lss, t_done, 0, true, { SS, Gv, Mp }, 0, s1W2W3R, 0 },
2762   { e_btr, t_done, 0, true, { Ev, Gv, Zz }, 0, s1RW2R, 0 },
2763   { e_lfs, t_done, 0, true, { FS, Gv, Mp }, 0, s1W2W3R, 0 },
2764   { e_lgs, t_done, 0, true, { GS, Gv, Mp }, 0, s1W2W3R, 0 },
2765   { e_movzx, t_done, 0, true, { Gv, Eb, Zz }, 0, s1W2R, 0 },
2766   { e_movzx, t_done, 0, true, { Gv, Ew, Zz }, 0, s1W2R, 0 },
2767   /* B8 */
2768   { e_No_Entry, t_sse, SSEB8, 0, { Zz, Zz, Zz }, 0, 0, 0 },
2769   { e_ud2grp10, t_ill, 0, 0, { Zz, Zz, Zz }, 0, sNONE, 0 },
2770   { e_No_Entry, t_grp, Grp8, true, { Zz, Zz, Zz }, 0, 0, 0 },
2771   { e_btc, t_done, 0, true, { Ev, Gv, Zz }, 0, s1RW2R, 0 },
2772   { e_bsf, t_done, 0, true, { Gv, Ev, Zz }, 0, s1W2R, 0 },
2773   { e_No_Entry, t_sse, SSEBD, 0, { Zz, Zz, Zz }, 0, 0, 0 },
2774   { e_movsx, t_done, 0, true, { Gv, Eb, Zz }, 0, s1W2R, 0 },
2775   { e_movsx, t_done, 0, true, { Gv, Ew, Zz }, 0, s1W2R, 0 },
2776   /* C0 */
2777   { e_xadd, t_done, 0, true, { Eb, Gb, Zz }, 0, s1RW2RW, 0 },
2778   { e_xadd, t_done, 0, true, { Ev, Gv, Zz }, 0, s1RW2RW, 0 },
2779   { e_No_Entry, t_sse, SSEC2, true, { Zz, Zz, Zz }, 0, 0, 0 },
2780   { e_movnti , t_done, 0, true, { Ev, Gv, Zz }, 0, s1W2R | (fNT << FPOS), 0 },
2781   { e_No_Entry, t_sse, SSEC4, true, { Zz, Zz, Zz }, 0, 0, 0 },
2782   { e_No_Entry, t_sse, SSEC5, true, { Zz, Zz, Zz }, 0, 0, 0 },
2783   { e_No_Entry, t_sse, SSEC6, true, { Zz, Zz, Zz }, 0, 0, 0 },
2784   { e_No_Entry, t_grp, Grp9,  true, { Zz, Zz, Zz }, 0, 0, 0 },
2785   /* C8 */
2786   { e_bswap, t_done, 0, false, { EAX, Zz, Zz }, 0, s1RW, 0 },
2787   { e_bswap, t_done, 0, false, { ECX, Zz, Zz }, 0, s1RW, 0 },
2788   { e_bswap, t_done, 0, false, { EDX, Zz, Zz }, 0, s1RW, 0 },
2789   { e_bswap, t_done, 0, false, { EBX, Zz, Zz }, 0, s1RW, 0 },
2790   { e_bswap, t_done, 0, false, { ESP, Zz, Zz }, 0, s1RW, 0 },
2791   { e_bswap, t_done, 0, false, { EBP, Zz, Zz }, 0, s1RW, 0 },
2792   { e_bswap, t_done, 0, false, { ESI, Zz, Zz }, 0, s1RW, 0 },
2793   { e_bswap, t_done, 0, false, { EDI, Zz, Zz }, 0, s1RW, 0 },
2794   /* D0 */
2795   { e_No_Entry, t_sse, SSED0, false, { Zz, Zz, Zz }, 0, 0, 0 },
2796   { e_No_Entry, t_sse, SSED1, true, { Zz, Zz, Zz }, 0, 0, 0 },
2797   { e_No_Entry, t_sse, SSED2, true, { Zz, Zz, Zz }, 0, 0, 0 },
2798   { e_No_Entry, t_sse, SSED3, true, { Zz, Zz, Zz }, 0, 0, 0 },
2799   { e_No_Entry, t_sse, SSED4, true, { Zz, Zz, Zz }, 0, 0, 0 },
2800   { e_No_Entry, t_sse, SSED5, true, { Zz, Zz, Zz }, 0, 0, 0 },
2801   { e_No_Entry, t_sse, SSED6, true, { Zz, Zz, Zz }, 0, 0, 0 },
2802   { e_No_Entry, t_sse, SSED7, true, { Zz, Zz, Zz }, 0, 0, 0 },
2803   /* D8 */
2804   { e_No_Entry, t_sse, SSED8, true, { Zz, Zz, Zz }, 0, 0, 0 },
2805   { e_No_Entry, t_sse, SSED9, true, { Zz, Zz, Zz }, 0, 0, 0 },
2806   { e_No_Entry, t_sse, SSEDA, true, { Zz, Zz, Zz }, 0, 0, 0 },
2807   { e_No_Entry, t_sse, SSEDB, true, { Zz, Zz, Zz }, 0, 0, 0 },
2808   { e_No_Entry, t_sse, SSEDC, true, { Zz, Zz, Zz }, 0, 0, 0 },
2809   { e_No_Entry, t_sse, SSEDD, true, { Zz, Zz, Zz }, 0, 0, 0 },
2810   { e_No_Entry, t_sse, SSEDE, true, { Zz, Zz, Zz }, 0, 0, 0 },
2811   { e_No_Entry, t_sse, SSEDF, true, { Zz, Zz, Zz }, 0, 0, 0 },
2812   /* E0 */
2813   { e_No_Entry, t_sse, SSEE0, true, { Zz, Zz, Zz }, 0, 0, 0 },
2814   { e_No_Entry, t_sse, SSEE1, true, { Zz, Zz, Zz }, 0, 0, 0 },
2815   { e_No_Entry, t_sse, SSEE2, true, { Zz, Zz, Zz }, 0, 0, 0 },
2816   { e_No_Entry, t_sse, SSEE3, true, { Zz, Zz, Zz }, 0, 0, 0 },
2817   { e_No_Entry, t_sse, SSEE4, true, { Zz, Zz, Zz }, 0, 0, 0 },
2818   { e_No_Entry, t_sse, SSEE5, true, { Zz, Zz, Zz }, 0, 0, 0 },
2819   { e_No_Entry, t_sse, SSEE6, true, { Zz, Zz, Zz }, 0, 0, 0 },
2820   { e_No_Entry, t_sse, SSEE7, true, { Zz, Zz, Zz }, 0, 0, 0 },
2821   /* E8 */
2822   { e_No_Entry, t_sse, SSEE8, true, { Zz, Zz, Zz }, 0, 0, 0 },
2823   { e_No_Entry, t_sse, SSEE9, true, { Zz, Zz, Zz }, 0, 0, 0 },
2824   { e_No_Entry, t_sse, SSEEA, true, { Zz, Zz, Zz }, 0, 0, 0 },
2825   { e_No_Entry, t_sse, SSEEB, true, { Zz, Zz, Zz }, 0, 0, 0 },
2826   { e_No_Entry, t_sse, SSEEC, true, { Zz, Zz, Zz }, 0, 0, 0 },
2827   { e_No_Entry, t_sse, SSEED, true, { Zz, Zz, Zz }, 0, 0, 0 },
2828   { e_No_Entry, t_sse, SSEEE, true, { Zz, Zz, Zz }, 0, 0, 0 },
2829   { e_No_Entry, t_sse, SSEEF, true, { Zz, Zz, Zz }, 0, 0, 0 },
2830   /* F0 */
2831   { e_No_Entry, t_sse, SSEF0, false, { Zz, Zz, Zz }, 0, 0, 0 },
2832   { e_No_Entry, t_sse, SSEF1, true, { Zz, Zz, Zz }, 0, 0, 0 },
2833   { e_No_Entry, t_sse, SSEF2, true, { Zz, Zz, Zz }, 0, 0, 0 },
2834   { e_No_Entry, t_sse, SSEF3, true, { Zz, Zz, Zz }, 0, 0, 0 },
2835   { e_No_Entry, t_sse, SSEF4, true, { Zz, Zz, Zz }, 0, 0, 0 },
2836   { e_No_Entry, t_sse, SSEF5, true, { Zz, Zz, Zz }, 0, 0, 0 },
2837   { e_No_Entry, t_sse, SSEF6, true, { Zz, Zz, Zz }, 0, 0, 0 },
2838   { e_No_Entry, t_sse, SSEF7, true, { Zz, Zz, Zz }, 0, 0, 0 },
2839   /* F8 */
2840   { e_No_Entry, t_sse, SSEF8, true, { Zz, Zz, Zz }, 0, 0, 0 },
2841   { e_No_Entry, t_sse, SSEF9, true, { Zz, Zz, Zz }, 0, 0, 0 },
2842   { e_No_Entry, t_sse, SSEFA, true, { Zz, Zz, Zz }, 0, 0, 0 },
2843   { e_No_Entry, t_sse, SSEFB, true, { Zz, Zz, Zz }, 0, 0, 0 },
2844   { e_No_Entry, t_sse, SSEFC, true, { Zz, Zz, Zz }, 0, 0, 0 },
2845   { e_No_Entry, t_sse, SSEFD, true, { Zz, Zz, Zz }, 0, 0, 0 },
2846   { e_No_Entry, t_sse, SSEFE, true, { Zz, Zz, Zz }, 0, 0, 0 },
2847   { e_No_Entry, t_sse, SSEFF, false, { Zz, Zz, Zz }, 0, 0, 0 }
2848 };
2849
2850 /**
2851  * This table is very similar to the twoByteMap. This table just holds
2852  * three byte instructions. Decoding can progress through this table
2853  * into sseMapBis if the current instruction is an SSE instruction.
2854  * If the current instruction also has an SSE and VEX version, decoding
2855  * can progress into the sseMapBisMult table.
2856  */
2857 static ia32_entry threeByteMap[256] = {
2858                 /* 00 */
2859                 { e_No_Entry, t_sse_bis, SSEB00, true, { Zz, Zz, Zz }, 0, 0, 0 },
2860                 { e_No_Entry, t_sse_bis, SSEB01, true, { Zz, Zz, Zz }, 0, 0, 0 },
2861                 { e_No_Entry, t_sse_bis, SSEB02, true, { Zz, Zz, Zz }, 0, 0, 0 },
2862                 { e_No_Entry, t_sse_bis, SSEB03, true, { Zz, Zz, Zz }, 0, 0, 0 },
2863                 { e_No_Entry, t_sse_bis, SSEB04, true, { Zz, Zz, Zz }, 0, 0, 0 },
2864                 { e_No_Entry, t_sse_bis, SSEB05, true, { Zz, Zz, Zz }, 0, 0, 0 },
2865                 { e_No_Entry, t_sse_bis, SSEB06, true, { Zz, Zz, Zz }, 0, 0, 0 },
2866                 { e_No_Entry, t_sse_bis, SSEB07, true, { Zz, Zz, Zz }, 0, 0, 0 },
2867                 /* 08*/
2868                 { e_No_Entry, t_sse_bis, SSEB08, true, { Zz, Zz, Zz }, 0, 0, 0 },
2869                 { e_No_Entry, t_sse_bis, SSEB09, true, { Zz, Zz, Zz }, 0, 0, 0 },
2870                 { e_No_Entry, t_sse_bis, SSEB0A, true, { Zz, Zz, Zz }, 0, 0, 0 },
2871                 { e_No_Entry, t_sse_bis, SSEB0B, true, { Zz, Zz, Zz }, 0, 0, 0 },
2872                 { e_No_Entry, t_sse_bis, SSEB0C, false, { Zz, Zz, Zz }, 0, 0, 0 },
2873                 { e_No_Entry, t_sse_bis, SSEB0D, false, { Zz, Zz, Zz }, 0, 0, 0 },
2874                 { e_No_Entry, t_sse_bis, SSEB0E, false, { Zz, Zz, Zz }, 0, 0, 0 },
2875                 { e_No_Entry, t_sse_bis, SSEB0F, false, { Zz, Zz, Zz }, 0, 0, 0 },
2876                 /* 10 */
2877                 { e_No_Entry, t_sse_bis, SSEB10, true, { Zz, Zz, Zz }, 0, 0, 0 },
2878                 { e_No_Entry, t_sse_bis, SSEB11, true, { Zz, Zz, Zz }, 0, 0, 0 },
2879         { e_No_Entry, t_sse_bis, SSEB12, true, { Zz, Zz, Zz }, 0, 0, 0 },
2880                 { e_No_Entry, t_sse_bis, SSEB13, false, { Zz, Zz, Zz }, 0, 0, 0 },
2881                 { e_No_Entry, t_sse_bis, SSEB14, true, { Zz, Zz, Zz }, 0, 0, 0 },
2882                 { e_No_Entry, t_sse_bis, SSEB15, true, { Zz, Zz, Zz }, 0, 0, 0 },
2883                 { e_No_Entry, t_sse_bis, SSEB16, false, { Zz, Zz, Zz }, 0, 0, 0 },
2884                 { e_No_Entry, t_sse_bis, SSEB17, true, { Zz, Zz, Zz }, 0, 0, 0 },
2885                 /* 18 */
2886                 { e_No_Entry, t_sse_bis, SSEB18, false, { Zz, Zz, Zz }, 0, 0, 0 },
2887                 { e_No_Entry, t_sse_bis, SSEB19, false, { Zz, Zz, Zz }, 0, 0, 0 },
2888                 { e_No_Entry, t_sse_bis, SSEB1A, false, { Zz, Zz, Zz }, 0, 0, 0 },
2889                 { e_No_Entry, t_sse_bis, SSEB1B, false, { Zz, Zz, Zz }, 0, 0, 0 },
2890                 { e_No_Entry, t_sse_bis, SSEB1C, true, { Zz, Zz, Zz }, 0, 0, 0 },
2891                 { e_No_Entry, t_sse_bis, SSEB1D, true, { Zz, Zz, Zz }, 0, 0, 0 },
2892                 { e_No_Entry, t_sse_bis, SSEB1E, true, { Zz, Zz, Zz }, 0, 0, 0 },
2893                 { e_No_Entry, t_sse_bis, SSEB1F, true, { Zz, Zz, Zz }, 0, 0, 0 },
2894                 /* 20 */
2895                 { e_No_Entry, t_sse_bis, SSEB20, true, { Zz, Zz, Zz }, 0, 0, 0 },
2896                 { e_No_Entry, t_sse_bis, SSEB21, true, { Zz, Zz, Zz }, 0, 0, 0 },
2897                 { e_No_Entry, t_sse_bis, SSEB22, true, { Zz, Zz, Zz }, 0, 0, 0 },
2898                 { e_No_Entry, t_sse_bis, SSEB23, true, { Zz, Zz, Zz }, 0, 0, 0 },
2899                 { e_No_Entry, t_sse_bis, SSEB24, true, { Zz, Zz, Zz }, 0, 0, 0 },
2900                 { e_No_Entry, t_sse_bis, SSEB25, true, { Zz, Zz, Zz }, 0, 0, 0 },
2901                 { e_No_Entry, t_sse_bis, SSEB26, true, { Zz, Zz, Zz }, 0, 0, 0 },
2902                 { e_No_Entry, t_sse_bis, SSEB27, true, { Zz, Zz, Zz }, 0, 0, 0 },
2903                 /* 28 */
2904                 { e_No_Entry, t_sse_bis, SSEB28, true, { Zz, Zz, Zz }, 0, 0, 0 },
2905                 { e_No_Entry, t_sse_bis, SSEB29, true, { Zz, Zz, Zz }, 0, 0, 0 },
2906                 { e_No_Entry, t_sse_bis, SSEB2A, true, { Zz, Zz, Zz }, 0, 0, 0 },
2907                 { e_No_Entry, t_sse_bis, SSEB2B, true, { Zz, Zz, Zz }, 0, 0, 0 },
2908                 { e_No_Entry, t_sse_bis, SSEB2C, false, { Zz, Zz, Zz }, 0, 0, 0 },
2909                 { e_No_Entry, t_sse_bis, SSEB2D, false, { Zz, Zz, Zz }, 0, 0, 0 },
2910                 { e_No_Entry, t_sse_bis, SSEB2E, false, { Zz, Zz, Zz }, 0, 0, 0 },
2911                 { e_No_Entry, t_sse_bis, SSEB2F, false, { Zz, Zz, Zz }, 0, 0, 0 },
2912                 /* 30 */
2913                 { e_No_Entry, t_sse_bis, SSEB30, true, { Zz, Zz, Zz }, 0, 0, 0 },
2914                 { e_No_Entry, t_sse_bis, SSEB31, true, { Zz, Zz, Zz }, 0, 0, 0 },
2915                 { e_No_Entry, t_sse_bis, SSEB32, true, { Zz, Zz, Zz }, 0, 0, 0 },
2916                 { e_No_Entry, t_sse_bis, SSEB33, true, { Zz, Zz, Zz }, 0, 0, 0 },
2917                 { e_No_Entry, t_sse_bis, SSEB34, true, { Zz, Zz, Zz }, 0, 0, 0 },
2918                 { e_No_Entry, t_sse_bis, SSEB35, true, { Zz, Zz, Zz }, 0, 0, 0 },
2919                 { e_No_Entry, t_sse_bis, SSEB36, false, { Zz, Zz, Zz }, 0, 0, 0 },
2920                 { e_No_Entry, t_sse_bis, SSEB37, true, { Zz, Zz, Zz }, 0, 0, 0 },
2921                 /* 38 */
2922                 { e_No_Entry, t_sse_bis, SSEB38, true, { Zz, Zz, Zz }, 0, 0, 0 },
2923                 { e_No_Entry, t_sse_bis, SSEB39, true, { Zz, Zz, Zz }, 0, 0, 0 },
2924                 { e_No_Entry, t_sse_bis, SSEB3A, true, { Zz, Zz, Zz }, 0, 0, 0 },
2925                 { e_No_Entry, t_sse_bis, SSEB3B, true, { Zz, Zz, Zz }, 0, 0, 0 },
2926                 { e_No_Entry, t_sse_bis, SSEB3C, true, { Zz, Zz, Zz }, 0, 0, 0 },
2927                 { e_No_Entry, t_sse_bis, SSEB3D, true, { Zz, Zz, Zz }, 0, 0, 0 },
2928                 { e_No_Entry, t_sse_bis, SSEB3E, true, { Zz, Zz, Zz }, 0, 0, 0 },
2929                 { e_No_Entry, t_sse_bis, SSEB3F, true, { Zz, Zz, Zz }, 0, 0, 0 },
2930                 /* 40 */
2931                 { e_No_Entry, t_sse_bis, SSEB40, true, { Zz, Zz, Zz }, 0, 0, 0 },
2932                 { e_No_Entry, t_sse_bis, SSEB41, true, { Zz, Zz, Zz }, 0, 0, 0 },
2933                 { e_No_Entry, t_sse_bis, SSEB42, true, { Zz, Zz, Zz }, 0, 0, 0 },
2934                 { e_No_Entry, t_sse_bis, SSEB43, true, { Zz, Zz, Zz }, 0, 0, 0 },
2935                 { e_No_Entry, t_sse_bis, SSEB44, true, { Zz, Zz, Zz }, 0, 0, 0 },
2936                 { e_No_Entry, t_sse_bis, SSEB45, false, { Zz, Zz, Zz }, 0, 0, 0 },
2937                 { e_No_Entry, t_sse_bis, SSEB46, false, { Zz, Zz, Zz }, 0, 0, 0 },
2938                 { e_No_Entry, t_sse_bis, SSEB47, false, { Zz, Zz, Zz }, 0, 0, 0 },
2939                 /* 48 */
2940                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
2941                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
2942                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
2943                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
2944                 { e_No_Entry, t_sse_bis, SSEB4C, false, { Zz, Zz, Zz }, 0, 0, 0 },
2945                 { e_No_Entry, t_sse_bis, SSEB4D, false, { Zz, Zz, Zz }, 0, 0, 0 },
2946                 { e_No_Entry, t_sse_bis, SSEB4E, false, { Zz, Zz, Zz }, 0, 0, 0 },
2947                 { e_No_Entry, t_sse_bis, SSEB4F, false, { Zz, Zz, Zz }, 0, 0, 0 },
2948                 /* 50 */
2949                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
2950                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
2951                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
2952                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
2953                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
2954                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
2955                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
2956                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
2957                 /* 58 */
2958                 { e_No_Entry, t_sse_bis, SSEB58, false, { Zz, Zz, Zz }, 0, 0, 0 },
2959                 { e_No_Entry, t_sse_bis, SSEB59, false, { Zz, Zz, Zz }, 0, 0, 0 },
2960                 { e_No_Entry, t_sse_bis, SSEB5A, false, { Zz, Zz, Zz }, 0, 0, 0 },
2961                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
2962                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
2963                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
2964                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
2965                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
2966                 /* 65 */
2967                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
2968                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
2969                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
2970                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
2971                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
2972                 { e_No_Entry, t_sse_bis, SSEB65, false, { Zz, Zz, Zz }, 0, 0, 0 },
2973                 { e_No_Entry, t_sse_bis, SSEB66, false, { Zz, Zz, Zz }, 0, 0, 0 },
2974                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
2975                 /* 68 */
2976                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
2977                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
2978                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
2979                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
2980                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
2981                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
2982                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
2983                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
2984                 /* 70 */
2985                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
2986                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
2987                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
2988                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
2989                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
2990                 { e_No_Entry, t_sse_bis, SSEB75, false, { Zz, Zz, Zz }, 0, 0, 0 },
2991                 { e_No_Entry, t_sse_bis, SSEB76, false, { Zz, Zz, Zz }, 0, 0, 0 },
2992                 { e_No_Entry, t_sse_bis, SSEB77, false, { Zz, Zz, Zz }, 0, 0, 0 },
2993                 /* 78 */
2994                 { e_No_Entry, t_sse_bis, SSEB78, false, { Zz, Zz, Zz }, 0, 0, 0 },
2995                 { e_No_Entry, t_sse_bis, SSEB79, false, { Zz, Zz, Zz }, 0, 0, 0 },
2996                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
2997                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
2998                 { e_No_Entry, t_sse_bis, SSEB7C, false, { Zz, Zz, Zz }, 0, 0, 0 },
2999                 { e_No_Entry, t_sse_bis, SSEB7D, false, { Zz, Zz, Zz }, 0, 0, 0 },
3000                 { e_No_Entry, t_sse_bis, SSEB7E, false, { Zz, Zz, Zz }, 0, 0, 0 },
3001                 { e_No_Entry, t_sse_bis, SSEB7F, false, { Zz, Zz, Zz }, 0, 0, 0 },
3002                 /* 80 */
3003                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3004                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3005                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3006                 { e_No_Entry, t_sse_bis, SSEB83, false, { Zz, Zz, Zz }, 0, 0, 0 },
3007                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3008                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3009                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3010                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3011                 /* 88 */
3012                 { e_No_Entry, t_sse_bis, SSEB88, false, { Zz, Zz, Zz }, 0, 0, 0 },
3013                 { e_No_Entry, t_sse_bis, SSEB89, false, { Zz, Zz, Zz }, 0, 0, 0 },
3014                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3015                 { e_No_Entry, t_sse_bis, SSEB8B, false, { Zz, Zz, Zz }, 0, 0, 0 },
3016                 { e_No_Entry, t_sse_bis, SSEB8C, false, { Zz, Zz, Zz }, 0, 0, 0 },
3017                 { e_No_Entry, t_sse_bis, SSEB8D, false, { Zz, Zz, Zz }, 0, 0, 0 },
3018                 { e_No_Entry, t_sse_bis, SSEB8E, false, { Zz, Zz, Zz }, 0, 0, 0 },
3019                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3020                 /* 90 */
3021                 { e_No_Entry, t_sse_bis, SSEB90, false, { Zz, Zz, Zz }, 0, 0, 0 },
3022                 { e_No_Entry, t_sse_bis, SSEB91, false, { Zz, Zz, Zz }, 0, 0, 0 },
3023                 { e_No_Entry, t_sse_bis, SSEB92, false, { Zz, Zz, Zz }, 0, 0, 0 },
3024                 { e_No_Entry, t_sse_bis, SSEB93, false, { Zz, Zz, Zz }, 0, 0, 0 },
3025                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3026                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3027                 { e_No_Entry, t_sse_bis, SSEB96, false, { Zz, Zz, Zz }, 0, 0, 0 },
3028                 { e_No_Entry, t_sse_bis, SSEB97, false, { Zz, Zz, Zz }, 0, 0, 0 },
3029                 /* 98 */
3030                 { e_No_Entry, t_sse_bis, SSEB98, false, { Zz, Zz, Zz }, 0, 0, 0 },
3031                 { e_No_Entry, t_sse_bis, SSEB99, false, { Zz, Zz, Zz }, 0, 0, 0 },
3032                 { e_No_Entry, t_sse_bis, SSEB9A, false, { Zz, Zz, Zz }, 0, 0, 0 },
3033                 { e_No_Entry, t_sse_bis, SSEB9B, false, { Zz, Zz, Zz }, 0, 0, 0 },
3034                 { e_No_Entry, t_sse_bis, SSEB9C, false, { Zz, Zz, Zz }, 0, 0, 0 },
3035                 { e_No_Entry, t_sse_bis, SSEB9D, false, { Zz, Zz, Zz }, 0, 0, 0 },
3036                 { e_No_Entry, t_sse_bis, SSEB9E, false, { Zz, Zz, Zz }, 0, 0, 0 },
3037                 { e_No_Entry, t_sse_bis, SSEB9F, false, { Zz, Zz, Zz }, 0, 0, 0 },
3038                 /* A0 */
3039                 { e_No_Entry, t_sse_bis, SSEBA0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3040                 { e_No_Entry, t_sse_bis, SSEBA1, false, { Zz, Zz, Zz }, 0, 0, 0 },
3041                 { e_No_Entry, t_sse_bis, SSEBA2, false, { Zz, Zz, Zz }, 0, 0, 0 },
3042                 { e_No_Entry, t_sse_bis, SSEBA3, false, { Zz, Zz, Zz }, 0, 0, 0 },
3043                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3044                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3045                 { e_No_Entry, t_sse_bis, SSEBA6, false, { Zz, Zz, Zz }, 0, 0, 0 },
3046                 { e_No_Entry, t_sse_bis, SSEBA7, false, { Zz, Zz, Zz }, 0, 0, 0 },
3047                 /* A8 */
3048                 { e_No_Entry, t_sse_bis, SSEBA8, false, { Zz, Zz, Zz }, 0, 0, 0 },
3049                 { e_No_Entry, t_sse_bis, SSEBA9, false, { Zz, Zz, Zz }, 0, 0, 0 },
3050                 { e_No_Entry, t_sse_bis, SSEBAA, false, { Zz, Zz, Zz }, 0, 0, 0 },
3051                 { e_No_Entry, t_sse_bis, SSEBAB, false, { Zz, Zz, Zz }, 0, 0, 0 },
3052                 { e_No_Entry, t_sse_bis, SSEBAC, false, { Zz, Zz, Zz }, 0, 0, 0 },
3053                 { e_No_Entry, t_sse_bis, SSEBAD, false, { Zz, Zz, Zz }, 0, 0, 0 },
3054                 { e_No_Entry, t_sse_bis, SSEBAE, false, { Zz, Zz, Zz }, 0, 0, 0 },
3055                 { e_No_Entry, t_sse_bis, SSEBAF, false, { Zz, Zz, Zz }, 0, 0, 0 },
3056                 /* B0 */
3057                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3058                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3059                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3060                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3061                 { e_No_Entry, t_sse_bis, SSEBB4, false, { Zz, Zz, Zz }, 0, 0, 0 },
3062                 { e_No_Entry, t_sse_bis, SSEBB5, false, { Zz, Zz, Zz }, 0, 0, 0 },
3063                 { e_No_Entry, t_sse_bis, SSEBB6, false, { Zz, Zz, Zz }, 0, 0, 0 },
3064                 { e_No_Entry, t_sse_bis, SSEBB7, false, { Zz, Zz, Zz }, 0, 0, 0 },
3065                 /* B8 */
3066                 { e_No_Entry, t_sse_bis, SSEBB8, false, { Zz, Zz, Zz }, 0, 0, 0 },
3067                 { e_No_Entry, t_sse_bis, SSEBB9, false, { Zz, Zz, Zz }, 0, 0, 0 },
3068                 { e_No_Entry, t_sse_bis, SSEBBA, false, { Zz, Zz, Zz }, 0, 0, 0 },
3069                 { e_No_Entry, t_sse_bis, SSEBBB, false, { Zz, Zz, Zz }, 0, 0, 0 },
3070                 { e_No_Entry, t_sse_bis, SSEBBC, false, { Zz, Zz, Zz }, 0, 0, 0 },
3071                 { e_No_Entry, t_sse_bis, SSEBBD, false, { Zz, Zz, Zz }, 0, 0, 0 },
3072                 { e_No_Entry, t_sse_bis, SSEBBE, false, { Zz, Zz, Zz }, 0, 0, 0 },
3073                 { e_No_Entry, t_sse_bis, SSEBBF, false, { Zz, Zz, Zz }, 0, 0, 0 },
3074                 /* C0 */
3075                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3076                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3077                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3078                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3079                 { e_No_Entry, t_sse_bis, SSEBC4, false, { Zz, Zz, Zz }, 0, 0, 0 },
3080                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3081                 { e_No_Entry, t_sse_bis, SSEBC6, false, { Zz, Zz, Zz }, 0, 0, 0 },
3082                 { e_No_Entry, t_sse_bis, SSEBC7, false, { Zz, Zz, Zz }, 0, 0, 0 },
3083                 /* C8 */
3084                 { e_No_Entry, t_sse_bis, SSEBC8, false, { Zz, Zz, Zz }, 0, 0, 0 },
3085                 { e_sha1msg1, t_done, 0, true, { Wps, Vps, Zz }, 0, s1RW2R, 0 },
3086                 { e_No_Entry, t_sse_bis, SSEBCA, false, { Zz, Zz, Zz }, 0, 0, 0 },
3087                 { e_No_Entry, t_sse_bis, SSEBCB, false, { Zz, Zz, Zz }, 0, 0, 0 },
3088                 { e_No_Entry, t_sse_bis, SSEBCC, false, { Zz, Zz, Zz }, 0, 0, 0 },
3089                 { e_No_Entry, t_sse_bis, SSEBCD, false, { Zz, Zz, Zz }, 0, 0, 0 },
3090                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3091                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3092                 /* D0 */
3093                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3094                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3095                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3096                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3097                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3098                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3099                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3100                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3101                 /* D8 */
3102                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3103                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3104                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3105                 { e_No_Entry, t_sse_bis, SSEBDB, false, { Zz, Zz, Zz }, 0, 0, 0 },
3106                 { e_No_Entry, t_sse_bis, SSEBDC, false, { Zz, Zz, Zz }, 0, 0, 0 },
3107                 { e_No_Entry, t_sse_bis, SSEBDD, false, { Zz, Zz, Zz }, 0, 0, 0 },
3108                 { e_No_Entry, t_sse_bis, SSEBDE, false, { Zz, Zz, Zz }, 0, 0, 0 },
3109                 { e_No_Entry, t_sse_bis, SSEBDF, false, { Zz, Zz, Zz }, 0, 0, 0 },
3110                 /* E0 */
3111                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3112                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3113                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3114                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3115                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3116                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3117                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3118                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3119                 /* E8 */
3120                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3121                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3122                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3123                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3124                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3125                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3126                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3127                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3128                 /* F0 */
3129                 { e_No_Entry, t_sse_bis, SSEBF0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3130                 { e_No_Entry, t_sse_bis, SSEBF1, true, { Zz, Zz, Zz }, 0, 0, 0 },
3131                 { e_No_Entry, t_sse_bis, SSEBF2, true, { Zz, Zz, Zz }, 0, 0, 0 },
3132         { e_No_Entry, t_grp, Grp17, true, { Zz, Zz, Zz }, 0, 0, 0 },
3133                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3134                 { e_No_Entry, t_sse_bis, SSEBF5, true, { Zz, Zz, Zz }, 0, 0, 0 },
3135                 { e_No_Entry, t_sse_bis, SSEBF6, true, { Zz, Zz, Zz }, 0, 0, 0 },
3136                 { e_No_Entry, t_sse_bis, SSEBF7, true, { Zz, Zz, Zz }, 0, 0, 0 },
3137                 /* F8 */
3138                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3139                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3140                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3141                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3142                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3143                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3144                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3145                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 }
3146 };
3147
3148 /**
3149  * This table is very similar to the twoByteMap. This table just holds
3150  * three byte instructions. Decoding can progress through this table
3151  * into sseMapBis if the current instruction is an SSE instruction.
3152  * If the current instruction also has an SSE and VEX version, decoding
3153  * can progress into the sseMapBisMult table.
3154  */
3155
3156 static ia32_entry threeByteMap2[256] = {
3157                 /* 00 */
3158                 { e_No_Entry, t_sse_ter, SSET00, false, { Zz, Zz, Zz }, 0, 0, 0 },
3159                 { e_No_Entry, t_sse_ter, SSET01, false, { Zz, Zz, Zz }, 0, 0, 0 },
3160                 { e_No_Entry, t_sse_ter, SSET02, false, { Zz, Zz, Zz }, 0, 0, 0 },
3161                 { e_No_Entry, t_sse_ter, SSET03, false, { Zz, Zz, Zz }, 0, 0, 0 },
3162                 { e_No_Entry, t_sse_ter, SSET04, false, { Zz, Zz, Zz }, 0, 0, 0 },
3163                 { e_No_Entry, t_sse_ter, SSET05, false, { Zz, Zz, Zz }, 0, 0, 0 },
3164                 { e_No_Entry, t_sse_ter, SSET06, false, { Zz, Zz, Zz }, 0, 0, 0 },
3165                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3166                 /* 08 */
3167                 { e_No_Entry, t_sse_ter, SSET08, true, { Zz, Zz, Zz }, 0, 0, 0 },
3168                 { e_No_Entry, t_sse_ter, SSET09, true, { Zz, Zz, Zz }, 0, 0, 0 },
3169                 { e_No_Entry, t_sse_ter, SSET0A, true, { Zz, Zz, Zz }, 0, 0, 0 },
3170                 { e_No_Entry, t_sse_ter, SSET0B, true, { Zz, Zz, Zz }, 0, 0, 0 },
3171                 { e_No_Entry, t_sse_ter, SSET0C, true, { Zz, Zz, Zz }, 0, 0, 0 },
3172                 { e_No_Entry, t_sse_ter, SSET0D, true, { Zz, Zz, Zz }, 0, 0, 0 },
3173                 { e_No_Entry, t_sse_ter, SSET0E, true, { Zz, Zz, Zz }, 0, 0, 0 },
3174                 { e_No_Entry, t_sse_ter, SSET0F, true, { Zz, Zz, Zz }, 0, 0, 0 },
3175                 /* 10 */
3176                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3177                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3178                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3179                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3180                 { e_No_Entry, t_sse_ter, SSET14, true, { Zz, Zz, Zz }, 0, 0, 0 },
3181                 { e_No_Entry, t_sse_ter, SSET15, true, { Zz, Zz, Zz }, 0, 0, 0 },
3182                 { e_No_Entry, t_sse_ter, SSET16, true, { Zz, Zz, Zz }, 0, 0, 0 },
3183                 { e_No_Entry, t_sse_ter, SSET17, true, { Zz, Zz, Zz }, 0, 0, 0 },
3184                 /* 18 */
3185                 { e_No_Entry, t_sse_ter, SSET18, true, { Zz, Zz, Zz }, 0, 0, 0 },
3186                 { e_No_Entry, t_sse_ter, SSET19, false, { Zz, Zz, Zz }, 0, 0, 0 },
3187                 { e_No_Entry, t_sse_ter, SSET1A, false, { Zz, Zz, Zz }, 0, 0, 0 },
3188                 { e_No_Entry, t_sse_ter, SSET1B, false, { Zz, Zz, Zz }, 0, 0, 0 },
3189                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3190                 { e_No_Entry, t_sse_ter, SSET1D, false, { Zz, Zz, Zz }, 0, 0, 0 },
3191                 { e_No_Entry, t_sse_ter, SSET1E, false, { Zz, Zz, Zz }, 0, 0, 0 },
3192                 { e_No_Entry, t_sse_ter, SSET1F, false, { Zz, Zz, Zz }, 0, 0, 0 },
3193                 /* 20 */
3194                 { e_No_Entry, t_sse_ter, SSET20, true, { Zz, Zz, Zz }, 0, 0, 0 },
3195                 { e_No_Entry, t_sse_ter, SSET21, true, { Zz, Zz, Zz }, 0, 0, 0 },
3196                 { e_No_Entry, t_sse_ter, SSET22, true, { Zz, Zz, Zz }, 0, 0, 0 },
3197                 { e_No_Entry, t_sse_ter, SSET23, true, { Zz, Zz, Zz }, 0, 0, 0 },
3198                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3199                 { e_No_Entry, t_sse_ter, SSET25, true, { Zz, Zz, Zz }, 0, 0, 0 },
3200                 { e_No_Entry, t_sse_ter, SSET26, true, { Zz, Zz, Zz }, 0, 0, 0 },
3201                 { e_No_Entry, t_sse_ter, SSET27, true, { Zz, Zz, Zz }, 0, 0, 0 },
3202                 /* 28 */
3203                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3204                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3205                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3206                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3207                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3208                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3209                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3210                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3211                 /* 30 */
3212                 { e_No_Entry, t_sse_ter, SSET30, false, { Zz, Zz, Zz }, 0, 0, 0 },
3213                 { e_No_Entry, t_sse_ter, SSET31, false, { Zz, Zz, Zz }, 0, 0, 0 },
3214                 { e_No_Entry, t_sse_ter, SSET32, false, { Zz, Zz, Zz }, 0, 0, 0 },
3215                 { e_No_Entry, t_sse_ter, SSET33, false, { Zz, Zz, Zz }, 0, 0, 0 },
3216                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3217                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3218                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3219                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3220                 /* 38 */
3221                 { e_No_Entry, t_sse_ter, SSET38, false, { Zz, Zz, Zz }, 0, 0, 0 },
3222                 { e_No_Entry, t_sse_ter, SSET39, false, { Zz, Zz, Zz }, 0, 0, 0 },
3223                 { e_No_Entry, t_sse_ter, SSET3A, false, { Zz, Zz, Zz }, 0, 0, 0 },
3224                 { e_No_Entry, t_sse_ter, SSET3B, false, { Zz, Zz, Zz }, 0, 0, 0 },
3225                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3226                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3227                 { e_No_Entry, t_sse_ter, SSET3E, false, { Zz, Zz, Zz }, 0, 0, 0 },
3228                 { e_No_Entry, t_sse_ter, SSET3F, false, { Zz, Zz, Zz }, 0, 0, 0 },
3229                 /* 40 */
3230                 { e_No_Entry, t_sse_ter, SSET40, true, { Zz, Zz, Zz }, 0, 0, 0 },
3231                 { e_No_Entry, t_sse_ter, SSET41, true, { Zz, Zz, Zz }, 0, 0, 0 },
3232                 { e_No_Entry, t_sse_ter, SSET42, true, { Zz, Zz, Zz }, 0, 0, 0 },
3233                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3234                 { e_No_Entry, t_sse_ter, SSET44, true, { Zz, Zz, Zz }, 0, 0, 0 },
3235                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3236                 { e_No_Entry, t_sse_ter, SSET46, false, { Zz, Zz, Zz }, 0, 0, 0 },
3237                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3238                 /* 48 */
3239                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3240                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3241                 { e_No_Entry, t_sse_ter, SSET4A, false, { Zz, Zz, Zz }, 0, 0, 0 },
3242                 { e_No_Entry, t_sse_ter, SSET4B, false, { Zz, Zz, Zz }, 0, 0, 0 },
3243                 { e_No_Entry, t_sse_ter, SSET4C, false, { Zz, Zz, Zz }, 0, 0, 0 },
3244                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3245                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3246                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3247                 /* 50 */
3248                 { e_No_Entry, t_sse_ter, SSET50, false, { Zz, Zz, Zz }, 0, 0, 0 },
3249                 { e_No_Entry, t_sse_ter, SSET51, false, { Zz, Zz, Zz }, 0, 0, 0 },
3250                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3251                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3252                 { e_No_Entry, t_sse_ter, SSET54, false, { Zz, Zz, Zz }, 0, 0, 0 },
3253                 { e_No_Entry, t_sse_ter, SSET55, false, { Zz, Zz, Zz }, 0, 0, 0 },
3254                 { e_No_Entry, t_sse_ter, SSET56, false, { Zz, Zz, Zz }, 0, 0, 0 },
3255                 { e_No_Entry, t_sse_ter, SSET57, false, { Zz, Zz, Zz }, 0, 0, 0 },
3256                 /* 58 */
3257                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3258                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3259                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3260                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3261                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3262                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3263                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3264                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3265                 /* 60 */
3266                 { e_No_Entry, t_sse_ter, SSET60, true, { Zz, Zz, Zz }, 0, 0, 0 },
3267                 { e_No_Entry, t_sse_ter, SSET61, true, { Zz, Zz, Zz }, 0, 0, 0 },
3268                 { e_No_Entry, t_sse_ter, SSET62, true, { Zz, Zz, Zz }, 0, 0, 0 },
3269                 { e_No_Entry, t_sse_ter, SSET63, true, { Zz, Zz, Zz }, 0, 0, 0 },
3270                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3271                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3272                 { e_No_Entry, t_sse_ter, SSET66, true, { Zz, Zz, Zz }, 0, 0, 0 },
3273                 { e_No_Entry, t_sse_ter, SSET67, true, { Zz, Zz, Zz }, 0, 0, 0 },
3274                 /* 68 */
3275                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3276                 { e_No_Entry, t_sse_ter, SSET69, false, { Zz, Zz, Zz }, 0, 0, 0 },
3277                 { e_No_Entry, t_fma4, FMA46A, false, { Zz, Zz, Zz }, 0, 0, 0 },
3278                 { e_No_Entry, t_fma4, FMA46B, false, { Zz, Zz, Zz }, 0, 0, 0 },
3279                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3280                 { e_No_Entry, t_fma4, FMA46D, false, { Zz, Zz, Zz }, 0, 0, 0 },
3281                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3282                 { e_No_Entry, t_fma4, FMA46F, false, { Zz, Zz, Zz }, 0, 0, 0 },
3283                 /* 70 */
3284                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3285                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3286                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3287                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3288                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3289                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3290                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3291                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3292                 /* 78 */
3293                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3294                 { e_No_Entry, t_fma4, FMA479, false, { Zz, Zz, Zz }, 0, 0, 0 },
3295                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3296                 { e_No_Entry, t_fma4, FMA47B, false, { Zz, Zz, Zz }, 0, 0, 0 },
3297                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3298                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3299                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3300                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3301                 /* 80 */
3302                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3303                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3304                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3305                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3306                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3307                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3308                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3309                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3310                 /* 88 */
3311                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3312                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3313                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3314                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3315                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3316                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3317                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3318                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3319                 /* 90 */
3320                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3321                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3322                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3323                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3324                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3325                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3326                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3327                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3328                 /* 98 */
3329                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3330                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3331                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3332                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3333                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3334                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3335                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3336                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3337                 /* A0 */
3338                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3339                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3340                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3341                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3342                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3343                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3344                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3345                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3346                 /* A8 */
3347                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3348                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3349                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3350                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3351                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3352                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3353                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3354                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3355                 /* B0 */
3356                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3357                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3358                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3359                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3360                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3361                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3362                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3363                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3364                 /* B8 */
3365                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3366                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3367                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3368                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3369                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3370                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3371                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3372                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3373                 /* C0 */
3374                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3375                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3376                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3377                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3378                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3379                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3380                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3381                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3382                 /* C8 */
3383                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3384                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3385                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3386                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3387                 { e_sha1rnds4, t_done, 0, true, { Wps, Vps, Ib }, 0, s1RW2R3R, 0 },
3388                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3389                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3390                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3391                 /* D0 */
3392                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3393                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3394                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3395                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3396                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3397                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3398                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3399                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3400                 /* D8 */
3401                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3402                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3403                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3404                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3405                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3406                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3407                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3408                 { e_No_Entry, t_sse_ter, SSETDF, false, { Zz, Zz, Zz }, 0, 0, 0 },
3409                 /* E0 */
3410                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3411                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3412                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3413                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3414                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3415                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3416                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3417                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3418                 /* E8 */
3419                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3420                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3421                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3422                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3423                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3424                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3425                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3426                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3427                 /* F0 */
3428                 { e_No_Entry, t_sse_ter, SSETF0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3429                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3430                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3431                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3432                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3433                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3434                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3435                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3436                 /* F8 */
3437                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3438                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3439                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3440                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3441                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3442                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3443                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
3444                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 }
3445 };
3446
3447 static ia32_entry fpuMap[][2][8] = {
3448 {
3449     { // D8
3450         { e_fadd,  t_done, 0, true, { ST0, Ef, Zz }, 0, s1RW2R, s1I },
3451         { e_fmul,  t_done, 0, true, { ST0, Ef, Zz }, 0, s1RW2R, s1I },
3452         { e_fcom,  t_done, 0, true, { ST0, Ef, Zz }, 0, s1RW2R, s1I },
3453         { e_fcomp, t_done, 0, true, { ST0, Ef, Zz }, 0, s1RW2R, s1I }, // stack pop
3454         { e_fsub,  t_done, 0, true, { ST0, Ef, Zz }, 0, s1RW2R, s1I },
3455         { e_fsubr, t_done, 0, true, { ST0, Ef, Zz }, 0, s1RW2R, s1I },
3456         { e_fdiv,  t_done, 0, true, { ST0, Ef, Zz }, 0, s1RW2R, s1I },
3457         { e_fdivr, t_done, 0, true, { ST0, Ef, Zz }, 0, s1RW2R, s1I }
3458     },
3459     { // D8 -- IMPORTANT NOTE: the C0-FF tables in the book are interleaved from how they
3460         // need to appear here (and for all FPU insns).  i.e. book rows 0, 4, 1, 5, 2, 6, 3, 7 are table rows
3461         // 0, 1, 2, 3, 4, 5, 6, 7.
3462         { e_fadd,  t_done, 0, true, { ST0, Ef, Zz }, 0, s1RW2R, s1I },
3463         { e_fmul,  t_done, 0, true, { ST0, Ef, Zz }, 0, s1RW2R, s1I },
3464         { e_fcom,  t_done, 0, true, { ST0, Ef, Zz }, 0, s1RW2R, s1I },
3465         { e_fcomp, t_done, 0, true, { ST0, Ef, Zz }, 0, s1RW2R, s1I }, // stack pop
3466         { e_fsub,  t_done, 0, true, { ST0, Ef, Zz }, 0, s1RW2R, s1I },
3467         { e_fsubr, t_done, 0, true, { ST0, Ef, Zz }, 0, s1RW2R, s1I },
3468         { e_fdiv,  t_done, 0, true, { ST0, Ef, Zz }, 0, s1RW2R, s1I },
3469         { e_fdivr, t_done, 0, true, { ST0, Ef, Zz }, 0, s1RW2R, s1I }
3470     },
3471 },
3472 {
3473     { // D9 
3474         { e_fld,    t_done, 0, true, { ST0, Ef, Zz }, 0, s1W2R, 0 }, // stack push
3475         { e_fnop,   t_done, 0, true, { Zz,  Zz, Zz }, 0, sNONE, 0 },
3476         { e_fst,    t_done, 0, true, { Ef, ST0, Zz }, 0, s1W2R, 0 },
3477         { e_fstp,   t_done, 0, true, { Ef, ST0, Zz }, 0, s1W2R, 0 }, // stack pop
3478         { e_fldenv, t_done, 0, true, { M14, Zz, Zz }, 0, s1R, 0 },
3479         { e_fldcw,  t_done, 0, true, { Ew,  Zz, Zz }, 0, s1R, 0 },
3480         { e_fstenv, t_done, 0, true, { M14, Zz, Zz }, 0, s1W, 0 },
3481         { e_fstcw,  t_done, 0, true, { Ew,  Zz, Zz }, 0, s1W, 0 }
3482     },
3483     { // D9 
3484         { e_fld,    t_done, 0, true, { ST0, Ef, Zz }, 0, s1W2R, 0 }, // stack push
3485         { e_fxch, t_done, 0, true, { ST0, Ef, Zz }, 0, s1RW2RW, 0 },
3486         { e_fnop,   t_done, 0, true, { Zz,  Zz, Zz }, 0, sNONE, 0 },
3487         { e_fstp,  t_done, 0, true, { Ef,  ST0, Zz }, 0, sNONE, 0 },
3488         { e_fchs,    t_done, 0, true, { ST0, Zz, Zz }, 0, s1RW, 0 }, // FIXME: using first of group as placeholder
3489         { e_fld1, t_done, 0, true, { ST0, Zz, Zz }, 0, s1RW, 0 }, // FIXME: using first of group
3490         { e_f2xm1,   t_done, 0, true, { ST0, Zz, Zz }, 0, s1RW, 0 }, // FIXME: using first of group as placeholder
3491         { e_fprem,  t_done, 0, true, { ST0, ST1, Zz }, 0, s1RW2R, 0 } // FIXME: using first of group
3492     },
3493 },
3494 {
3495     { // DA 
3496         { e_fiadd,  t_done, 0, true, { ST0, Ev, Zz }, 0, s1RW2R, s1I },
3497         { e_fimul,  t_done, 0, true, { ST0, Ev, Zz }, 0, s1RW2R, s1I },
3498         { e_ficom,  t_done, 0, true, { ST0, Ev, Zz }, 0, s1RW2R, s1I },
3499         { e_ficomp, t_done, 0, true, { ST0, Ev, Zz }, 0, s1RW2R, s1I }, // stack pop
3500         { e_fisub,  t_done, 0, true, { ST0, Ev, Zz }, 0, s1RW2R, s1I },
3501         { e_fisubr, t_done, 0, true, { ST0, Ev, Zz }, 0, s1RW2R, s1I },
3502         { e_fidiv,  t_done, 0, true, { ST0, Ev, Zz }, 0, s1RW2R, s1I },
3503         { e_fidivr, t_done, 0, true, { ST0, Ev, Zz }, 0, s1RW2R, s1I }
3504     },
3505     { // DA
3506         { e_fcmovb,  t_done, 0, true, { ST0, Ef, Zz }, 0, s1RW2R, s1I },
3507         { e_fcmove,  t_done, 0, true, { ST0, Ef, Zz }, 0, s1RW2R, s1I },
3508         { e_fcmovbe, t_done, 0, true, { ST0, Ef, Zz }, 0, s1RW2R, s1I },
3509         { e_fcmovu, t_done, 0, true,  { ST0, Ef, Zz }, 0, s1RW2R, s1I },
3510         { e_No_Entry,  t_done, 0, true, { Zz, Zz, Zz }, 0, sNONE, 0 },
3511         { e_fucompp,  t_done, 0, true, { ST0, ST1, Zz }, 0, s1RW2RW, s1I }, // double pop
3512         { e_No_Entry,  t_done, 0, true, { Zz, Zz, Zz }, 0, sNONE, 0 },
3513         { e_No_Entry,  t_done, 0, true, { Zz, Zz, Zz }, 0, sNONE, 0 }
3514     },
3515 },
3516 {
3517     { // DB 
3518       { e_fild,   t_done, 0, true, { ST0, Ev, Zz }, 0, s1W2R, 0 },
3519       { e_fisttp, t_done, 0, true, { Ev, ST0, Zz }, 0, s1W2R, 0 }, //stack pop
3520       { e_fist,   t_done, 0, true, { Ev, ST0, Zz }, 0, s1W2R, 0 },
3521       { e_fistp,  t_done, 0, true, { Ev, ST0, Zz }, 0, s1W2R, 0 }, // stack pop
3522       { e_No_Entry,  t_done, 0, true, { Zz, Zz, Zz }, 0, sNONE, 0 },
3523       { e_fld,    t_done, 0, true, { ST0, Ef, Zz }, 0, s1W2R, 0 },
3524       { e_No_Entry,  t_done, 0, true, { Zz, Zz, Zz }, 0, sNONE, 0 },
3525       { e_fstp,   t_done, 0, true, { Ef, ST0, Zz }, 0, s1W2R, 0 }
3526     },
3527     { // DB
3528         { e_fcmovnb,  t_done, 0, true, { ST0, Ef, Zz }, 0, s1RW2R, 0 },
3529         { e_fcmovne,  t_done, 0, true, { ST0, Ef, Zz }, 0, s1RW2R, 0 },
3530         { e_fcmovnbe, t_done, 0, true, { ST0, Ef, Zz }, 0, s1RW2R, 0 },
3531         { e_fcmovnu,  t_done, 0, true, { ST0, Ef, Zz }, 0, s1RW2R, 0 },
3532         { e_fp_generic,  t_done, 0, true, { Zz, Zz, Zz }, 0, sNONE, 0 }, // FIXME: needs FCLEX and FINIT in group
3533         { e_fucomi,  t_done, 0, true, { ST0, Ef, Zz }, 0, s1RW2R, 0 },
3534         { e_fcomi,  t_done, 0, true, { ST0, Ef, Zz }, 0, s1RW2R, 0 },
3535         { e_No_Entry,  t_done, 0, true, { Zz, Zz, Zz }, 0, sNONE, 0 },
3536     },
3537 },
3538 {
3539     { // DC
3540         { e_fadd,  t_done, 0, true, { ST0, Efd, Zz }, 0, s1RW2R, s1I },
3541         { e_fmul,  t_done, 0, true, { ST0, Efd, Zz }, 0, s1RW2R, s1I },
3542         { e_fcom,  t_done, 0, true, { ST0, Efd, Zz }, 0, s1RW2R, s1I },
3543         { e_fcomp, t_done, 0, true, { ST0, Efd, Zz }, 0, s1RW2R, s1I }, // stack pop
3544         { e_fsub,  t_done, 0, true, { ST0, Efd, Zz }, 0, s1RW2R, s1I },
3545         { e_fsubr, t_done, 0, true, { ST0, Efd, Zz }, 0, s1RW2R, s1I },
3546         { e_fdiv,  t_done, 0, true, { ST0, Efd, Zz }, 0, s1RW2R, s1I },
3547         { e_fdivr, t_done, 0, true, { ST0, Efd, Zz }, 0, s1RW2R, s1I }
3548     },
3549     { // DC
3550         { e_fadd,  t_done, 0, true, { Efd, ST0, Zz }, 0, s1RW2R, 0 },
3551         { e_fmul,  t_done, 0, true, { Efd, ST0, Zz }, 0, s1RW2R, 0 },
3552         { e_fcom,  t_done, 0, true, { Efd, ST0, Zz }, 0, s1RW2R, 0 },
3553         { e_fcomp,  t_done, 0, true, { ST0, Efd, Zz }, 0, s1RW2R, 0 },
3554         { e_fsubr,  t_done, 0, true, { Efd, ST0, Zz }, 0, s1RW2R, 0 },
3555         { e_fsub,  t_done, 0, true, { Efd, ST0, Zz }, 0, s1RW2R, 0 },
3556         { e_fdivr,  t_done, 0, true, { Efd, ST0, Zz }, 0, s1RW2R, 0 },
3557         { e_fdiv,  t_done, 0, true, { Efd, ST0, Zz }, 0, s1RW2R, 0 }
3558     },
3559 },
3560 {
3561     { // DD TODO semantics check
3562         { e_fld,    t_done, 0, true, { ST0, Efd, Zz }, 0, s1W2R, 0 },
3563         { e_fisttp, t_done, 0, true, { Mq, ST0, Zz }, 0, s1W2R, 0 },
3564         { e_fst,    t_done, 0, true, { Efd, ST0, Zz }, 0, s1W2R, 0 },
3565         { e_fstp,   t_done, 0, true, { Efd, ST0, Zz }, 0, s1W2R, 0 }, // stack pop
3566         { e_frstor, t_done, 0, true, { M512, Zz, Zz }, 0, s1R, 0 },
3567         { e_fucomp, t_done, 0, true, { ST0, Efd, Zz }, 0, s1R2R, 0 }, // stack pop
3568         { e_fsave,  t_done, 0, true, { M512, Zz, Zz }, 0, s1W, 0 },
3569         { e_fstsw,  t_done, 0, true, { Ew, Zz, Zz }, 0, s1W, 0 }
3570     },
3571     { // DD TODO semantics check
3572         { e_ffree,    t_done, 0, true, { Efd, Zz, Zz }, 0, s1W, 0 },
3573         { e_fxch,  t_done, 0, true, { ST0, Ef, Zz }, 0, s1RW2RW, 0 },
3574         { e_fst, t_done, 0, true, { Efd, ST0, Zz }, 0, s1W2R, 0 },
3575         { e_fstp, t_done, 0, true, { Efd, ST0, Zz }, 0, s1W2RW, 0 },
3576         { e_fucom,    t_done, 0, true, { ST0, Efd, Zz }, 0, s1R2R, 0 },
3577         { e_fucomp,    t_done, 0, true, { ST0, Efd, Zz }, 0, s1RW2R, 0 },
3578         { e_No_Entry,  t_done, 0, true, { Zz, Zz, Zz }, 0, sNONE, 0 },
3579         { e_No_Entry,  t_done, 0, true, { Zz, Zz, Zz }, 0, sNONE, 0 },
3580     },
3581 },
3582 {    
3583     { // DE 
3584         { e_fiadd,  t_done, 0, true, { ST0, Ev, Zz }, 0, s1RW2R, 0 },
3585         { e_fimul,  t_done, 0, true, { ST0, Ev, Zz }, 0, s1RW2R, 0 },
3586         { e_ficom,  t_done, 0, true, { ST0, Ev, Zz }, 0, s1RW2R, 0 },
3587         { e_ficomp, t_done, 0, true, { ST0, Ev, Zz }, 0, s1RW2R, 0 }, // stack pop
3588         { e_fisub,  t_done, 0, true, { ST0, Ev, Zz }, 0, s1RW2R, 0 },
3589         { e_fisubr, t_done, 0, true, { ST0, Ev, Zz }, 0, s1RW2R, 0 },
3590         { e_fidiv,  t_done, 0, true, { ST0, Ev, Zz }, 0, s1RW2R, 0 },
3591         { e_fidivr, t_done, 0, true, { ST0, Ev, Zz }, 0, s1RW2R, 0 }
3592     },
3593     { // DE
3594         { e_faddp,  t_done, 0, true, { Ef, ST0, Zz }, 0, s1RW2R, 0 },
3595         { e_fmulp,  t_done, 0, true, { Ef, ST0, Zz }, 0, s1RW2R, 0 },
3596         { e_fcomp,  t_done, 0, true, { ST0, Ef, Zz }, 0, s1RW2R, 0 },
3597         { e_fcompp, t_done, 0, true, { ST0, Ef, Zz }, 0, s1RW2R, 0 },
3598         { e_fsubrp,  t_done, 0, true, { Ef, ST0, Zz }, 0, s1RW2R, 0 },
3599         { e_fsubp,  t_done, 0, true, { Ef, ST0, Zz }, 0, s1RW2R, 0 },
3600         { e_fdivrp, t_done, 0, true, { Ef, ST0, Zz }, 0, s1RW2R, 0 }, // stack pop
3601         { e_fdivp, t_done, 0, true, { Ef, ST0, Zz }, 0, s1RW2R, 0 }
3602     },
3603 },
3604 {
3605     { // DF TODO semantics/operand sizes
3606         { e_fild,   t_done, 0, true, { ST0, Ew, Zz }, 0, s1W2R, 0 },
3607         { e_fisttp, t_done, 0, true, { Ew, ST0, Zz }, 0, s1W2R, 0 },
3608         { e_fist,   t_done, 0, true, { Ew, ST0, Zz }, 0, s1W2R, 0 },
3609         { e_fistp,  t_done, 0, true, { Ew, ST0, Zz }, 0, s1W2R, 0 }, // stack pop
3610         { e_fbld,   t_done, 0, true, { ST0, Mq, Zz }, 0, s1W2R, 0 }, // BCD 80 bit
3611         { e_fild,   t_done, 0, true, { ST0, Ev, Zz }, 0, s1W2R, 0 },
3612         { e_fbstp,  t_done, 0, true, { Mq, ST0, Zz }, 0, s1RW2R, 0 },// BCD 80 bit
3613         { e_fistp,  t_done, 0, true, { Ev, ST0, Zz }, 0, s1W2R, 0 }
3614     },
3615     { // DF TODO semantics/operand sizes
3616         { e_ffreep,  t_done, 0, true, { Ef, Zz, Zz }, 0, sNONE, 0 },
3617         { e_fxch,  t_done, 0, true, { ST0, Ef, Zz }, 0, s1RW2RW, 0 },
3618         { e_fstp,  t_done, 0, true, { Ef, ST0, Zz }, 0, sNONE, 0 },
3619         { e_fstp,  t_done, 0, true, { Ef, ST0, Zz }, 0, sNONE, 0 },
3620         { e_fstsw,   t_done, 0, true, { AX, Zz, Zz }, 0, s1W, 0 },
3621         { e_fucomip,  t_done, 0, true, { ST0, Ef, Zz }, 0, s1RW2R, 0 }, // stack pop
3622         { e_fcomip,  t_done, 0, true, { ST0, Ef, Zz }, 0, s1RW2R, 0 }, // stack pop
3623         { e_No_Entry,  t_done, 0, true, { Zz, Zz, Zz }, 0, sNONE, 0 },
3624     }
3625 }
3626 };
3627
3628 /**
3629  * This is one of the more complicated tables. Each row in this table has
3630  * multiple entries. The row that is selected is based off of the previous
3631  * table the decoder was in. The current byte is broken down as a ModR/M byte.
3632  * Here is a quick overview of how a ModR/M byte is broken down:
3633  *
3634  * +-----+-------+-------+
3635  * | 8 7 | 6 5 4 | 3 2 1 |
3636  * +-----+-------+-------+
3637  * Mod   Reg     R/M
3638  *
3639  *
3640  * We only care about the `Reg` part of the ModR/M byte. This value is used as
3641  * the indexer for this table. For example, if you have a byte `0x3F`:
3642  *
3643  *
3644  * Value in Hex: 0x3F
3645  * Value in Bin: 0 0 1 1 1 1 1 1
3646  * Reg bits:         1 1 1
3647  * Reg value: 7
3648  *
3649  *
3650  * Therefore we can see that we should choose entry 7 in this row (for this example).
3651  *
3652  */
3653 static ia32_entry groupMap[][8] = {
3654   { /* group 1a */
3655     { e_add, t_done, 0, true, { Eb, Ib, Zz }, 0, s1RW2R, 0 },
3656     { e_or,  t_done, 0, true, { Eb, Ib, Zz }, 0, s1RW2R, 0 },
3657     { e_adc, t_done, 0, true, { Eb, Ib, Zz }, 0, s1RW2R, 0 },
3658     { e_sbb, t_done, 0, true, { Eb, Ib, Zz }, 0, s1RW2R, 0 },
3659     { e_and, t_done, 0, true, { Eb, Ib, Zz }, 0, s1RW2R, 0 },
3660     { e_sub, t_done, 0, true, { Eb, Ib, Zz }, 0, s1RW2R, 0 },
3661     { e_xor, t_done, 0, true, { Eb, Ib, Zz }, 0, s1RW2R, 0 },
3662     { e_cmp, t_done, 0, true, { Eb, Ib, Zz }, 0, s1R2R, 0 },
3663   },
3664   { /* group 1b */
3665     { e_add, t_done, 0, true, { Ev, Iz, Zz }, 0, s1RW2R, 0 },
3666     { e_or,  t_done, 0, true, { Ev, Iz, Zz }, 0, s1RW2R, 0 },
3667     { e_adc, t_done, 0, true, { Ev, Iz, Zz }, 0, s1RW2R, 0 },
3668     { e_sbb, t_done, 0, true, { Ev, Iz, Zz }, 0, s1RW2R, 0 },
3669     { e_and, t_done, 0, true, { Ev, Iz, Zz }, 0, s1RW2R, 0 },
3670     { e_sub, t_done, 0, true, { Ev, Iz, Zz }, 0, s1RW2R, 0 },
3671     { e_xor, t_done, 0, true, { Ev, Iz, Zz }, 0, s1RW2R, 0 },
3672     { e_cmp, t_done, 0, true, { Ev, Iz, Zz }, 0, s1R2R, 0 },
3673   },
3674   { /* group 1c */
3675     { e_add, t_done, 0, true, { Eb, Ib, Zz }, 0, s1RW2R, 0 },
3676     { e_or,  t_done, 0, true, { Eb, Ib, Zz }, 0, s1RW2R, 0 },
3677     { e_adc, t_done, 0, true, { Eb, Ib, Zz }, 0, s1RW2R, 0 },
3678     { e_sbb, t_done, 0, true, { Eb, Ib, Zz }, 0, s1RW2R, 0 },
3679     { e_and, t_done, 0, true, { Eb, Ib, Zz }, 0, s1RW2R, 0 },
3680     { e_sub, t_done, 0, true, { Eb, Ib, Zz }, 0, s1RW2R, 0 },
3681     { e_xor, t_done, 0, true, { Eb, Ib, Zz }, 0, s1RW2R, 0 },
3682     { e_cmp, t_done, 0, true, { Eb, Ib, Zz }, 0, s1R2R, 0 },
3683   },
3684   { /* group 1d */
3685     { e_add, t_done, 0, true, { Ev, Ib, Zz }, 0, s1RW2R, 0 },
3686     { e_or,  t_done, 0, true, { Ev, Ib, Zz }, 0, s1RW2R, 0 },
3687     { e_adc, t_done, 0, true, { Ev, Ib, Zz }, 0, s1RW2R, 0 },
3688     { e_sbb, t_done, 0, true, { Ev, Ib, Zz }, 0, s1RW2R, 0 },
3689     { e_and, t_done, 0, true, { Ev, Ib, Zz }, 0, s1RW2R, 0 },
3690     { e_sub, t_done, 0, true, { Ev, Ib, Zz }, 0, s1RW2R, 0 },
3691     { e_xor, t_done, 0, true, { Ev, Ib, Zz }, 0, s1RW2R, 0 },
3692     { e_cmp, t_done, 0, true, { Ev, Ib, Zz }, 0, s1R2R, 0 },
3693   },
3694
3695
3696  {  /* group 2 - only opcode is defined here, 
3697        operands are defined in the one or two byte maps above */
3698   { e_rol, t_done, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3699   { e_ror, t_done, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3700   { e_rcl, t_done, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3701   { e_rcr, t_done, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3702   { e_shl_sal, t_done, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3703   { e_shr, t_done, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3704   { e_shl_sal, t_done, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3705   { e_sar, t_done, 0, true, { Zz, Zz, Zz }, 0, 0, 0 }
3706  },
3707
3708  { /* group 3a - operands are defined here */
3709   { e_test, t_done, 0, true, { Eb, Ib, Zz }, 0, s1R2R, 0 },
3710   { e_test, t_done, 0, true, { Eb, Ib, Zz }, 0, s1R2R, 0 }, // book swears this is illegal, sandpile claims it's an aliased TEST
3711   { e_not,  t_done, 0, true, { Eb, Zz, Zz }, 0, s1RW, 0 },
3712   { e_neg,  t_done, 0, true, { Eb, Zz, Zz }, 0, s1RW, 0 },
3713   { e_mul,  t_done, 0, true, { AX, AL, Eb }, 0, s1W2R3R, 0 },
3714   { e_imul, t_done, 0, true, { AX, AL, Eb }, 0, s1W2R3R, 0 },
3715   { e_div,  t_done, 0, true, { AX, AL, Eb }, 0, s1RW2R3R, s1I },
3716   { e_idiv, t_done, 0, true, { AX, AL, Eb }, 0, s1RW2R3R, s1I }
3717  },
3718
3719  { /* group 3b - operands are defined here */
3720   { e_test, t_done, 0, true, { Ev, Iz, Zz }, 0, s1R2R, 0 },
3721   { e_test, t_done, 0, true, { Ev, Iz, Zz }, 0, s1R2R, 0 }, // book swears this is illegal, sandpile claims it's an aliased TEST
3722   { e_not,  t_done, 0, true, { Ev, Zz, Zz }, 0, s1RW, 0 },
3723   { e_neg,  t_done, 0, true, { Ev, Zz, Zz }, 0, s1RW, 0 },
3724   { e_mul,  t_done, 0, true, { eDX, eAX, Ev }, 0, s1W2RW3R, 0 },
3725   { e_imul, t_done, 0, true, { eDX, eAX, Ev }, 0, s1W2RW3R, 0 },
3726   { e_div,  t_done, 0, true, { eDX, eAX, Ev }, 0, s1RW2RW3R, s1I },
3727   { e_idiv, t_done, 0, true, { eDX, eAX, Ev }, 0, s1RW2RW3R, s1I }
3728  },
3729
3730  { /* group 4 - operands are defined here */
3731   { e_inc, t_done, 0, true, { Eb, Zz, Zz }, 0, s1RW, 0 },
3732   { e_dec, t_done, 0, true, { Eb, Zz, Zz }, 0, s1RW, 0 },
3733   { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3734   { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3735   { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3736   { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3737   { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3738   { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3739  },
3740
3741  { /* group 5 - operands are defined here */
3742   { e_inc,  t_done, 0, true, { Ev, Zz, Zz }, 0, s1RW, 0 },
3743   { e_dec,  t_done, 0, true, { Ev, Zz, Zz }, 0, s1RW, 0 },
3744   { e_call, t_done, 0, true, { Ev, Zz, Zz }, (IS_CALL | INDIR), s1R | (fINDIRCALL << FPOS), 0 },
3745   { e_call, t_done, 0, true, { Ep, Zz, Zz }, (IS_CALL | INDIR), s1R | (fINDIRCALL << FPOS), 0 },
3746   { e_jmp,  t_done, 0, true, { Ev, Zz, Zz }, (IS_JUMP | INDIR), s1R | (fINDIRJUMP << FPOS), 0 },
3747   { e_jmp,  t_done, 0, true, { Ep, Zz, Zz }, (IS_JUMP | INDIR), s1R | (fINDIRJUMP << FPOS), 0 },
3748   { e_push, t_done, 0, true, { Ev, eSP, Zz }, 0, s1R2RW, s2I },
3749   { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3750  },
3751
3752  { /* group 6 - operands are defined here */
3753    // these need to be fixed for kernel mode accesses
3754   { e_sldt, t_done, 0, true, { Ew, Zz, Zz }, 0, s1W, 0 },
3755   { e_str,  t_done, 0, true, { Ew, Zz, Zz }, 0, s1W, 0 },
3756   { e_lldt, t_done, 0, true, { Ew, Zz, Zz }, 0, s1R, 0 },
3757   { e_ltr,  t_done, 0, true, { Ew, Zz, Zz }, 0, s1R, 0 },
3758   { e_verr, t_done, 0, true, { Ew, Zz, Zz }, 0, s1R, 0 },
3759   { e_verw, t_done, 0, true, { Ew, Zz, Zz }, 0, s1R, 0 },
3760   { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3761   { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3762  },
3763
3764  { /* group 7 - operands are defined here */
3765    // idem
3766   { e_sgdt, t_done, 0, true, { Ms, Zz, Zz }, 0, s1W, 0 },
3767   { e_sidt, t_done, 0, true, { Ms, Zz, Zz }, 0, s1W, 0 },
3768   { e_lgdt, t_done, 0, true, { Ms, Zz, Zz }, 0, s1R, 0 },
3769   { e_lidt, t_done, 0, true, { Ms, Zz, Zz }, 0, s1R, 0 },
3770   { e_smsw, t_done, 0, true, { Ew, Zz, Zz }, 0, s1W, 0 },
3771   { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3772   { e_lmsw, t_done, 0, true, { Ew, Zz, Zz }, 0, s1R, 0 },
3773   { e_invlpg, t_done, 0, true, { Zz, Zz, Zz }, 0, sNONE, 0 }, // 64-bit: swapgs also uses this encoding (w/ mod=11)
3774  },
3775
3776  { /* group 8 - only opcode is defined here, 
3777      operands are defined in the one or two byte maps below */
3778   { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3779   { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3780   { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3781   { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3782   { e_bt,  t_done, 0, true, { Ev, Ib, Zz }, 0, s1R2R, 0 },
3783   { e_bts, t_done, 0, true, { Ev, Ib, Zz }, 0, s1RW2R, 0 },
3784   { e_btr, t_done, 0, true, { Ev, Ib, Zz }, 0, s1RW2R, 0 },
3785   { e_btc, t_done, 0, true, { Ev, Ib, Zz }, 0, s1RW2R, 0 },
3786  },
3787
3788  { /* group 9 - operands are defined here */
3789   { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3790   // see comments for cmpxch
3791   { e_cmpxch8b, t_done, 0, true, { EDXEAX, Mq, ECXEBX }, 0, s1RW2RW3R | (fCMPXCH8 << FPOS), s2I },
3792   { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3793   { e_xrstors, t_done, 0, true, { Wps, Zz, Zz }, 0, 0, 0 },
3794   { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3795   { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3796   { e_rdrand, t_done, 0, true, { Ev, Zz, Zz }, 0, s1W, 0 },
3797   { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 }
3798  },
3799
3800  /* group 10 is all illegal */
3801
3802  { /* group 11, opcodes defined in one byte map */
3803    { e_mov, t_done, 0, true, { Ev, Gv, Zz }, 0, s1W2R, 0 },
3804    { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3805    { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3806    { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3807    { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3808    { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3809    { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3810    { e_xbegin, t_done, 0, false, { Jz, Zz, Zz }, 0, s1R, 0 },
3811  }
3812
3813 };
3814
3815
3816 /**
3817  * This table is very similar to `groupMap`. Each row in this table actually
3818  * has 2 sub rows which contain 8 entries. The row that is selected is based
3819  * off of the previous table the decoder was in. The current byte is broken
3820  * down as a ModR/M byte. Here is a quick overview of how a ModR/M byte is
3821  * broken down:
3822  *
3823  *
3824  * +-----+-------+-------+
3825  * | 8 7 | 6 5 4 | 3 2 1 |
3826  * +-----+-------+-------+
3827  *  Mod   Reg     R/M
3828  *
3829  *
3830  * We care about two things now: the `Mod` and the `Reg`. If the `Mod` is all
3831  * 1's, then we will use the 2nd sub row. Otherwise we will use the first sub
3832  * row (sub rows here contain 8 entries each). Then the entry is selected based
3833  * off of the `Reg` value, just like the `groupMap` table. Here is our example
3834  * again of using `0x3F` as our ModR/M
3835  *
3836  *
3837  *
3838  *  Value in Hex: 0x3F
3839  *  Value in Bin: 0 0 1 1 1 1 1 1
3840  *  Reg bits:         1 1 1
3841  *  Mod bits:     0 0
3842  *  Reg value: 7
3843  *  Mod value: 0
3844  *
3845  *
3846  * Therefore we will use the first sub row, and select the 7th entry in that sub
3847  * row. If `Mod` would have been all 1's, we would have selected the second sub
3848  * row. **Note: all values of mod should map to the first sub row except for
3849  * 3 (0b11)**
3850  *
3851  */
3852 static ia32_entry groupMap2[][2][8] = {
3853   { /* group 12 */
3854     {
3855       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3856       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3857       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3858       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3859       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3860       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3861       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3862       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3863     },
3864     {
3865       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3866       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3867       { e_No_Entry, t_grpsse, G12SSE010B, true, { Zz, Zz, Zz }, 0, 0, 0 },
3868       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3869       { e_No_Entry, t_grpsse, G12SSE100B, true, { Zz, Zz, Zz }, 0, 0, 0 },
3870       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3871       { e_No_Entry, t_grpsse, G12SSE110B, true, { Zz, Zz, Zz }, 0, 0, 0 },
3872       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3873     }
3874   },
3875   { /* group 13 */
3876     {
3877       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3878       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3879       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3880       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3881       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3882       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3883       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3884       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3885     },
3886     {
3887       { e_No_Entry, t_sse, SSE72, true, { Zz, Zz, Zz }, 0, 0, 0 },
3888       { e_No_Entry, t_sse, SSE72, true, { Zz, Zz, Zz }, 0, 0, 0 },
3889       { e_No_Entry, t_grpsse, G13SSE010B, true, { Zz, Zz, Zz }, 0, 0, 0 },
3890       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3891       { e_No_Entry, t_grpsse, G13SSE100B, true, { Zz, Zz, Zz }, 0, 0, 0 },
3892       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3893       { e_No_Entry, t_grpsse, G13SSE110B, true, { Zz, Zz, Zz }, 0, 0, 0 },
3894       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3895     }
3896   },
3897   { /* group 14 */
3898     {
3899       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3900       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3901       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3902       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3903       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3904       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3905       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3906       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3907     },
3908     {
3909       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3910       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3911       { e_No_Entry, t_grpsse, G14SSE010B, true, { Zz, Zz, Zz }, 0, 0, 0 },
3912       { e_No_Entry, t_grpsse, G14SSE011B, true, { Zz, Zz, Zz }, 0, 0, 0 },
3913       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3914       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3915       { e_No_Entry, t_grpsse, G14SSE110B, true, { Zz, Zz, Zz }, 0, 0, 0 },
3916       { e_No_Entry, t_grpsse, G14SSE111B, true, { Zz, Zz, Zz }, 0, 0, 0 },
3917     }
3918   },
3919   { /* group 15 */
3920     {
3921       { e_fxsave,  t_done, 0, true, { M512, Zz, Zz }, 0, s1W | (fFXSAVE << FPOS), 0 },
3922       { e_fxrstor, t_done, 0, true, { M512, Zz, Zz }, 0, s1R | (fFXRSTOR << FPOS), 0 },
3923       { e_ldmxcsr, t_done, 0, true, { Md, Zz, Zz }, 0, s1R, 0 },
3924       { e_stmxcsr, t_done, 0, true, { Md, Zz, Zz }, 0, s1W, 0 },
3925       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3926       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3927       { e_clwb, t_done, 0, true, { Mb, Zz, Zz }, 0, s1W | (fCLFLUSH << FPOS), 0 },
3928       { e_clflush, t_done, 0, true, { Mb, Zz, Zz }, 0, s1W | (fCLFLUSH << FPOS), 0 },
3929     },
3930     {
3931       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3932       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3933       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3934       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3935       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3936       { e_lfence, t_done, 0, true, { Zz, Zz, Zz }, 0, sNONE, 0 },
3937       { e_mfence, t_done, 0, true, { Zz, Zz, Zz }, 0, sNONE, 0 },
3938       { e_sfence, t_done, 0, true, { Zz, Zz, Zz }, 0, sNONE, 0 },
3939     }
3940   },
3941   { /* group 16 */
3942     {
3943       { e_prefetchNTA, t_done, 0, true, { Mb, Zz, Zz }, 0, s1R | (fPREFETCHNT << FPOS), 0 },
3944       { e_prefetchT0,  t_done, 0, true, { Mb, Zz, Zz }, 0, s1R | (fPREFETCHT0 << FPOS), 0 },
3945       { e_prefetchT1,  t_done, 0, true, { Mb, Zz, Zz }, 0, s1R | (fPREFETCHT1 << FPOS), 0 },
3946       { e_prefetchT2,  t_done, 0, true, { Mb, Zz, Zz }, 0, s1R | (fPREFETCHT1 << FPOS), 0 },
3947       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3948       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3949       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3950       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3951     },
3952     {
3953       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3954       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3955       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3956       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3957       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3958       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3959       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3960       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3961     }
3962   },
3963   { /* group 17 */
3964     {
3965       { e_extrq, t_done, 0, true, { Vdq, Ib, Ib }, 0, s1RW2R3R, 0 },
3966       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3967       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3968       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3969       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3970       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3971       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3972       { e_No_Entry, t_sse_mult, SSE78_66, true, { Zz, Zz, Zz }, 0, 0, 0 },
3973     },
3974     {
3975       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3976       { e_blsr, t_done, 0, true, { Bv, Ev, Zz }, 0, s1W2R, 0 },
3977       { e_blsmsk, t_done, 0, true, { Bv, Ev, Zz }, 0, s1W2R, 0 },
3978       { e_blsi, t_done, 0, true, { Bv, Ev, Zz }, 0, s1W2R, 0 },
3979       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3980       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3981       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3982       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3983     }
3984   },
3985   { /* AMD prefetch group */
3986     {
3987       { e_prefetch,   t_done, 0, true, { Mb, Zz, Zz }, 0, s1R | (fPREFETCHAMDE << FPOS), 0 },
3988       { e_prefetchw,  t_done, 0, true, { Mb, Zz, Zz }, 0, s1R | (fPREFETCHAMDW << FPOS), 0 },
3989       { e_prefetchwt1,  t_done, 0, true, { Mb, Zz, Zz }, 0, s1R | (fPREFETCHAMDW << FPOS), 0 },
3990       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 }, // this is reserved, not illegal, ugh...
3991       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 }, // this is reserved, not illegal, ugh...
3992       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 }, // this is reserved, not illegal, ugh...
3993       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 }, // this is reserved, not illegal, ugh...
3994       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 }, // this is reserved, not illegal, ugh...
3995     },
3996     {
3997       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3998       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
3999       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
4000       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
4001       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
4002       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
4003       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
4004       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0, 0 },
4005     }
4006   }
4007 };
4008
4009 /**
4010  * The purpose of this table is to allow our decoder to differentiate between
4011  * looking at an SSE instruction or a VEX instruction. For certain instructions,
4012  * there are SSE and VEX versions of the same instruction. Having a VEX prefix
4013  * on the instruction instead of an SSE prefix means that we have to make a
4014  * different decoding decision.
4015  *
4016  * Each row in this table has multiple entries. The entry that is selected is
4017  * based on the prefix of the instruction. If the instruction has only an SSE
4018  * prefix, entry 0th is selected. If the instruction has a VEX2 prefix, then
4019  * the 1st entry is selected. If the instruction has a VEX3 prefix, then the
4020  * 2nd entry is selected. Finally, if the instruction has an EVEX prefix, the
4021  * 3rd entry is selected.
4022  */
4023 /** START_DYNINST_TABLE_VERIFICATION(sse_vex_mult_table) */
4024 static ia32_entry sseVexMult[][4] = {
4025     { /* SSEVEX41 */
4026         { e_cmovno,  t_done, 0, true, { Gv, Ev, Zz }, 0, s1RW2R | (fCOND << FPOS), 0 },
4027         { e_No_Entry, t_sse, SSE41, false, { Zz, Zz, Zz }, 0, 0, 0 },
4028         { e_No_Entry, t_sse, SSE41, false, { Zz, Zz, Zz }, 0, 0, 0 },
4029         { e_No_Entry, t_sse, SSE41, false, { Zz, Zz, Zz }, 0, 0, 0 },
4030     }, { /* SSEVEX42 */
4031         { e_cmovnae, t_done, 0, true, { Gv, Ev, Zz }, 0, s1RW2R | (fCOND << FPOS), 0 },
4032         { e_No_Entry, t_sse, SSE42, false, { Zz, Zz, Zz }, 0, 0, 0 },
4033         { e_No_Entry, t_sse, SSE42, false, { Zz, Zz, Zz }, 0, 0, 0 },
4034         { e_No_Entry, t_sse, SSE42, false, { Zz, Zz, Zz }, 0, 0, 0 },
4035     }, { /* SSEVEX44 */
4036         { e_cmove,   t_done, 0, true, { Gv, Ev, Zz }, 0, s1RW2R | (fCOND << FPOS), 0 },
4037         { e_No_Entry, t_sse, SSE44, false, { Zz, Zz, Zz }, 0, 0, 0 },
4038         { e_No_Entry, t_sse, SSE44, false, { Zz, Zz, Zz }, 0, 0, 0 },
4039         { e_No_Entry, t_sse, SSE44, false, { Zz, Zz, Zz }, 0, 0, 0 },
4040     }, { /* SSEVEX45 */
4041         { e_cmovne,  t_done, 0, true, { Gv, Ev, Zz }, 0, s1RW2R | (fCOND << FPOS), 0 },
4042         { e_No_Entry, t_sse, SSE45, false, { Zz, Zz, Zz }, 0, 0, 0 },
4043         { e_No_Entry, t_sse, SSE45, false, { Zz, Zz, Zz }, 0, 0, 0 },
4044         { e_No_Entry, t_sse, SSE45, false, { Zz, Zz, Zz }, 0, 0, 0 },
4045     }, { /* SSEVEX46 */
4046         { e_cmovbe,  t_done, 0, true, { Gv, Ev, Zz }, 0, s1RW2R | (fCOND << FPOS), 0 },
4047         { e_No_Entry, t_sse, SSE46, false, { Zz, Zz, Zz }, 0, 0, 0 },
4048         { e_No_Entry, t_sse, SSE46, false, { Zz, Zz, Zz }, 0, 0, 0 },
4049         { e_No_Entry, t_sse, SSE46, false, { Zz, Zz, Zz }, 0, 0, 0 },
4050     }, { /* SSEVEX47 */
4051         { e_cmovnbe, t_done, 0, true, { Gv, Ev, Zz }, 0, s1RW2R | (fCOND << FPOS), 0 },
4052         { e_No_Entry, t_sse, SSE47, false, { Zz, Zz, Zz }, 0, 0, 0 },
4053         { e_No_Entry, t_sse, SSE47, false, { Zz, Zz, Zz }, 0, 0, 0 },
4054         { e_No_Entry, t_sse, SSE47, false, { Zz, Zz, Zz }, 0, 0, 0 },
4055     }, { /* SSEVEX4A */
4056         { e_cmovpe,  t_done, 0, true, { Gv, Ev, Zz }, 0, s1RW2R | (fCOND << FPOS), 0 },
4057         { e_No_Entry, t_sse, SSE4A, false, { Zz, Zz, Zz }, 0, 0, 0 },
4058         { e_No_Entry, t_sse, SSE4A, false, { Zz, Zz, Zz }, 0, 0, 0 },
4059         { e_No_Entry, t_sse, SSE4A, false, { Zz, Zz, Zz }, 0, 0, 0 },
4060     }, { /* SSEVEX4B */
4061         { e_cmovpo,  t_done, 0, true, { Gv, Ev, Zz }, 0, s1RW2R | (fCOND << FPOS), 0 },
4062         { e_No_Entry, t_sse, SSE4B, false, { Zz, Zz, Zz }, 0, 0, 0 },
4063         { e_No_Entry, t_sse, SSE4B, false, { Zz, Zz, Zz }, 0, 0, 0 },
4064         { e_No_Entry, t_sse, SSE4B, false, { Zz, Zz, Zz }, 0, 0, 0 },
4065     }, { /* SSEVEX73 */
4066         { e_No_Entry, t_grp, Grp14, false, { Zz, Zz, Zz }, 0, 0, 0 },
4067         { e_No_Entry, t_sse, SSE73, false, { Zz, Zz, Zz }, 0, 0, 0 },
4068         { e_No_Entry, t_sse, SSE73, false, { Zz, Zz, Zz }, 0, 0, 0 },
4069         { e_No_Entry, t_sse, SSE73, false, { Zz, Zz, Zz }, 0, 0, 0 },
4070     }, { /* SSEVEX78 */
4071         { e_No_Entry, t_grp, Grp17, false, { Zz, Zz, Zz }, 0, 0, 0 },
4072         { e_No_Entry, t_sse_mult, SSE78_66, false, { Zz, Zz, Zz }, 0, 0, 0 },
4073         { e_No_Entry, t_sse_mult, SSE78_66, false, { Zz, Zz, Zz }, 0, 0, 0 },
4074         { e_No_Entry, t_sse_mult, SSE78_66, false, { Zz, Zz, Zz }, 0, 0, 0 }
4075     }, { /* SSEVEX90 */
4076         { e_seto,   t_done, 0, true, { Eb, Zz, Zz }, 0, s1W | (fCOND << FPOS), 0 },
4077         { e_No_Entry, t_sse, SSE90, false, { Zz, Zz, Zz }, 0, 0, 0 },
4078         { e_No_Entry, t_sse, SSE90, false, { Zz, Zz, Zz }, 0, 0, 0 },
4079         { e_No_Entry, t_sse, SSE90, false, { Zz, Zz, Zz }, 0, 0, 0 }
4080     }, { /* SSEVEX91 */
4081         { e_setno,  t_done, 0, true, { Eb, Zz, Zz }, 0, s1W | (fCOND << FPOS), 0 },
4082         { e_No_Entry, t_sse, SSE91, false, { Zz, Zz, Zz }, 0, 0, 0 },
4083         { e_No_Entry, t_sse, SSE91, false, { Zz, Zz, Zz }, 0, 0, 0 },
4084         { e_No_Entry, t_sse, SSE91, false, { Zz, Zz, Zz }, 0, 0, 0 }
4085     }, { /* SSEVEX92 */
4086         { e_setb,   t_done, 0, true, { Eb, Zz, Zz }, 0, s1W | (fCOND << FPOS), 0 },
4087         { e_No_Entry, t_sse, SSE92, false, { Zz, Zz, Zz }, 0, 0, 0 },
4088         { e_No_Entry, t_sse, SSE92, false, { Zz, Zz, Zz }, 0, 0, 0 },
4089         { e_No_Entry, t_sse, SSE92, false, { Zz, Zz, Zz }, 0, 0, 0 }
4090     }, { /* SSEVEX93 */
4091         { e_setnb,  t_done, 0, true, { Eb, Zz, Zz }, 0, s1W | (fCOND << FPOS), 0 },
4092         { e_No_Entry, t_sse, SSE93, false, { Zz, Zz, Zz }, 0, 0, 0 },
4093         { e_No_Entry, t_sse, SSE93, false, { Zz, Zz, Zz }, 0, 0, 0 },
4094         { e_No_Entry, t_sse, SSE93, false, { Zz, Zz, Zz }, 0, 0, 0 }
4095     }, { /* SSEVEX98 */
4096         { e_sets,   t_done, 0, true, { Eb, Zz, Zz }, 0, s1W | (fCOND << FPOS), 0 },
4097         { e_No_Entry, t_sse, SSE98, false, { Zz, Zz, Zz }, 0, 0, 0 },
4098         { e_No_Entry, t_sse, SSE98, false, { Zz, Zz, Zz }, 0, 0, 0 },
4099         { e_No_Entry, t_sse, SSE98, false, { Zz, Zz, Zz }, 0, 0, 0 }
4100     }, { /* SSEVEX99 */
4101         { e_setns,  t_done, 0, true, { Eb, Zz, Zz }, 0, s1W | (fCOND << FPOS), 0 },
4102         { e_No_Entry, t_sse, SSE99, false, { Zz, Zz, Zz }, 0, 0, 0 },
4103         { e_No_Entry, t_sse, SSE99, false, { Zz, Zz, Zz }, 0, 0, 0 },
4104         { e_No_Entry, t_sse, SSE99, false, { Zz, Zz, Zz }, 0, 0, 0 }
4105     }
4106 };
4107 /* END_DYNINST_TABLE_VERIFICATION */
4108
4109 /* rows are not, F3, 66, F2 prefixed in this order (see book) */
4110 /** START_DYNINST_TABLE_VERIFICATION(sse_table) */
4111 static ia32_entry sseMap[][4] = {
4112   { /* SSE10 */
4113     { e_movups, t_sse_mult, SSE10_NO, true, { Vps, Wps, Zz }, 0, s1W2R, 0 },
4114     { e_movss,  t_sse_mult, SSE10_F3, true, { Vss, Wss, Zz }, 0, s1W2R, 0 },
4115     { e_movupd, t_sse_mult, SSE10_66, true, { Vpd, Wpd, Zz }, 0, s1W2R, 0 },
4116     { e_movsd_sse, t_sse_mult, SSE10_F2, true, { Vsd, Wsd, Zz }, 0, s1W2R, 0 },
4117   },
4118   { /* SSE11 */
4119     { e_movups, t_done, 0, true, { Wps, Vps, Zz }, 0, s1W2R, 0 },
4120     { e_movss,  t_done, 0, true, { Wss, Vss, Zz }, 0, s1W2R, 0 },
4121     { e_movupd, t_done, 0, true, { Wpd, Vpd, Zz }, 0, s1W2R, 0 },
4122     { e_movsd_sse,  t_done, 0, true, { Wsd, Vsd, Zz }, 0, s1W2R, 0 }, // Book is wrong, this is a W/V
4123   },
4124   { /* SSE12 */
4125     { e_movlps_movhlps, t_sse_mult, SSE12_NO, true, { Wq, Vq, Zz }, 0, s1W2R, 0 }, // FIXME: wierd 1st op
4126     { e_movsldup, t_sse_mult, SSE12_F3, true, { Vdq, Wdq, Zz }, 0, s1W2R, 0 },
4127     { e_movlpd, t_done, 0, true, { Vq, Ws, Zz }, 0, s1W2R, 0 },
4128     { e_movddup, t_sse_mult, SSE12_F2, true, { Vdq, Wq, Zz }, 0, s1W2R, 0 },
4129   },
4130   { /* SSE13 */
4131     { e_movlps, t_sse_mult, SSE13_NO, true, { Vq, Wq, Zz }, 0, s1W2R, 0 },
4132     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4133     { e_movlpd, t_sse_mult, SSE13_66, true, { Vq, Wq, Zz }, 0, s1W2R, 0 },
4134     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4135   },
4136   { /* SSE14 */
4137     { e_unpcklps, t_sse_mult, SSE14_NO, true, { Vps, Wq, Zz }, 0, s1RW2R, 0 },
4138     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4139     { e_unpcklpd, t_sse_mult, SSE14_66, true, { Vpd, Wq, Zz }, 0, s1RW2R, 0 },
4140     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4141   },
4142   { /* SSE15 */
4143     { e_unpckhps, t_sse_mult, SSE15_NO, true, { Vps, Wq, Zz }, 0, s1RW2R, 0 },
4144     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4145     { e_unpckhpd, t_sse_mult, SSE15_66, true, { Vpd, Wq, Zz }, 0, s1RW2R, 0 },
4146     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4147   },
4148   { /* SSE16 */
4149     { e_movhps_movlhps, t_sse_mult, SSE16_NO, true, { Vq, Wq, Zz }, 0, s1W2R, 0 }, // FIXME: wierd 2nd op
4150     { e_movshdup, t_sse_mult, SSE16_F3, true, { Vdq, Wdq, Zz }, 0, s1W2R, 0 },
4151     { e_movhpd, t_sse_mult, SSE16_66, true, { Vq, Wq, Zz }, 0, s1W2R, 0 },
4152     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4153   },
4154   { /* SSE17 */
4155     { e_movhps, t_done, 0, true, { Wq, Vq, Zz }, 0, s1W2R, 0 },
4156     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4157     { e_movhpd, t_done, 0, true, { Wq, Vq, Zz }, 0, s1W2R, 0 },
4158     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4159   },
4160   { /* SSE28 */
4161     { e_movaps, t_sse_mult, SSE28_NO, true, { Vps, Wps, Zz }, 0, s1W2R, 0 },
4162     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4163     { e_movapd, t_sse_mult, SSE28_66, true, { Vpd, Wpd, Zz }, 0, s1W2R, 0 },
4164     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4165   },
4166   { /* SSE29 */
4167     { e_movaps, t_done, 0, true, { Wps, Vps, Zz }, 0, s1W2R, 0 },
4168     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4169     { e_movapd, t_done, 0, true, { Wpd, Vpd, Zz }, 0, s1W2R, 0 },
4170     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4171   },
4172   { /* SSE2A */
4173     { e_cvtpi2ps, t_done, 0, true, { Vps, Qq, Zz }, 0, s1W2R, 0 },
4174     { e_cvtsi2ss, t_sse_mult, SSE2A_F3, true, { Vss, Ev, Zz }, 0, s1W2R, 0 },
4175     { e_cvtpi2pd, t_done, 0, true, { Vpd, Qdq, Zz }, 0, s1W2R, 0 },
4176     { e_cvtsi2sd, t_sse_mult, SSE2A_F2, true, { Vsd, Ev, Zz }, 0, s1W2R, 0 },
4177   },
4178   { /* SSE2B */
4179     { e_movntps, t_sse_mult, SSE2B_NO, true, { Wps, Vps, Zz }, 0, s1W2R | (fNT << FPOS), 0 },
4180     { e_movntss, t_done, 0, true, { Md, Vd, Zz }, 0, s1W2R | (fNT << FPOS), 0 },
4181     { e_movntpd, t_sse_mult, SSE2B_66, true, { Wpd, Vpd, Zz }, 0, s1W2R | (fNT << FPOS), 0 }, // bug in book
4182     { e_movntsd, t_done, 0, true, { Wq, Vq, Zz }, 0, s1W2R | (fNT << FPOS), 0 },
4183   },
4184   { /* SSE2C */
4185     { e_cvttps2pi, t_done, 0, true, { Qq, Wps, Zz }, 0, s1W2R, 0 },
4186     { e_cvttss2si, t_sse_mult, SSE2C_F3, true, { Gv, Wss, Zz }, 0, s1W2R, 0 },
4187     { e_cvttpd2pi, t_done, 0, true, { Qdq, Wpd, Zz }, 0, s1W2R, 0 },
4188     { e_cvttsd2si, t_sse_mult, SSE2C_F2, true, { Gv, Wsd, Zz }, 0, s1W2R, 0 },
4189   },
4190   { /* SSE2D */
4191     { e_cvtps2pi, t_done, 0, true, { Qq, Wps, Zz }, 0, s1W2R, 0 },
4192     { e_cvtss2si, t_sse_mult, SSE2D_F3, true, { Gv, Wss, Zz }, 0, s1W2R, 0 },
4193     { e_cvtpd2pi, t_done, 0, true, { Qdq, Wpd, Zz }, 0, s1W2R, 0 },
4194     { e_cvtsd2si, t_sse_mult, SSE2D_F2, true, { Gv, Wsd, Zz }, 0, s1W2R, 0 },
4195   },
4196   { /* SSE2E */
4197     { e_ucomiss, t_sse_mult, SSE2E_NO, true, { Vss, Wss, Zz }, 0, s1R2R, 0 },
4198     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4199     { e_ucomisd, t_sse_mult, SSE2E_66, true, { Vsd, Wsd, Zz }, 0, s1R2R, 0 },
4200     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4201   },
4202   { /* SSE2F */
4203     { e_comiss, t_sse_mult, SSE2F_NO, true, { Vps, Wps, Zz }, 0, s1R2R, 0 },
4204     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4205     { e_comisd, t_sse_mult, SSE2F_66, true, { Vsd, Wsd, Zz }, 0, s1R2R, 0 },
4206     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4207   },
4208   { /* SSE41 */
4209     { e_No_Entry, t_sse_mult, SSE41_NO, false, { Zz, Zz, Zz }, 0, 0, 0 },
4210     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4211     { e_No_Entry, t_sse_mult, SSE41_66, false, { Zz, Zz, Zz }, 0, 0, 0 },
4212     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4213   },
4214   { /* SSE42 */
4215     { e_No_Entry, t_sse_mult, SSE42_NO, false, { Zz, Zz, Zz }, 0, 0, 0 },
4216     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4217     { e_No_Entry, t_sse_mult, SSE42_66, false, { Zz, Zz, Zz }, 0, 0, 0 },
4218     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4219   },
4220   { /* SSE44 */
4221     { e_No_Entry, t_sse_mult, SSE44_NO, false, { Zz, Zz, Zz }, 0, 0, 0 },
4222     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4223     { e_No_Entry, t_sse_mult, SSE44_66, false, { Zz, Zz, Zz }, 0, 0, 0 },
4224     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4225   },
4226   { /* SSE45 */
4227     { e_No_Entry, t_sse_mult, SSE45_NO, false, { Zz, Zz, Zz }, 0, 0, 0 },
4228     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4229     { e_No_Entry, t_sse_mult, SSE45_66, false, { Zz, Zz, Zz }, 0, 0, 0 },
4230     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4231   },
4232   { /* SSE46 */
4233     { e_No_Entry, t_sse_mult, SSE46_NO, false, { Zz, Zz, Zz }, 0, 0, 0 },
4234     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4235     { e_No_Entry, t_sse_mult, SSE46_66, false, { Zz, Zz, Zz }, 0, 0, 0 },
4236     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4237   },
4238   { /* SSE47 */
4239     { e_No_Entry, t_sse_mult, SSE47_NO, false, { Zz, Zz, Zz }, 0, 0, 0 },
4240     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4241     { e_No_Entry, t_sse_mult, SSE47_66, false, { Zz, Zz, Zz }, 0, 0, 0 },
4242     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4243   },
4244   { /* SSE4A */
4245     { e_No_Entry, t_sse_mult, SSE4A_NO, false, { Zz, Zz, Zz }, 0, 0, 0 },
4246     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4247     { e_No_Entry, t_sse_mult, SSE4A_66, false, { Zz, Zz, Zz }, 0, 0, 0 },
4248     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4249   },
4250   { /* SSE4B */
4251     { e_No_Entry, t_sse_mult, SSE4B_NO, false, { Zz, Zz, Zz }, 0, 0, 0 },
4252     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4253     { e_No_Entry, t_sse_mult, SSE4B_66, false, { Zz, Zz, Zz }, 0, 0, 0 },
4254     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4255   },
4256   { /* SSE50 */
4257     { e_movmskps, t_done, 0, true, { Ed, Vps, Zz }, 0, s1W2R, 0 },
4258     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4259     { e_movmskpd, t_done, 0, true, { Ed, Vpd, Zz }, 0, s1W2R, 0 },
4260     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4261   },
4262   { /* SSE51 */
4263     { e_sqrtps, t_sse_mult, SSE51_NO, true, { Vps, Wps, Zz }, 0, s1W2R, 0 },
4264     { e_sqrtss, t_sse_mult, SSE51_F3, true, { Vss, Wss, Zz }, 0, s1W2R, 0 },
4265     { e_sqrtpd, t_sse_mult, SSE51_66, true, { Vpd, Wpd, Zz }, 0, s1W2R, 0 },
4266     { e_sqrtsd, t_sse_mult, SSE51_F2, true, { Vsd, Wsd, Zz }, 0, s1W2R, 0 },
4267   },
4268   { /* SSE52 */
4269     { e_rsqrtps, t_done, 0, true, { Vps, Wps, Zz }, 0, s1W2R, 0 },
4270     { e_rsqrtss, t_done, 0, true, { Vss, Wss, Zz }, 0, s1W2R, 0 },
4271     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4272     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4273   },
4274   { /* SSE53 */
4275     { e_rcpps, t_done, 0, true, { Vps, Wps, Zz }, 0, s1W2R, 0 },
4276     { e_rcpss, t_done, 0, true, { Vss, Wss, Zz }, 0, s1W2R, 0 },
4277     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4278     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4279   },
4280   { /* SSE54 */
4281     { e_andps, t_sse_mult, SSE54_NO, true, { Vps, Wps, Zz }, 0, s1RW2R, 0 },
4282     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4283     { e_andpd, t_sse_mult, SSE54_66, true, { Vpd, Wpd, Zz }, 0, s1RW2R, 0 },
4284     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4285   },
4286   { /* SSE55 */
4287     { e_andnps, t_sse_mult, SSE55_NO, true, { Vps, Wps, Zz }, 0, s1RW2R, 0 },
4288     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4289     { e_andnpd, t_sse_mult, SSE55_66, true, { Vpd, Wpd, Zz }, 0, s1RW2R, 0 },
4290     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4291   },
4292   { /* SSE56 */
4293     { e_orps, t_sse_mult, SSE56_NO, true, { Vps, Wps, Zz }, 0, s1RW2R, 0 },
4294     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4295     { e_orpd, t_sse_mult, SSE56_66, true, { Vpd, Wpd, Zz }, 0, s1RW2R, 0 },
4296     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4297   },
4298   { /* SSE57 */
4299     { e_xorps, t_sse_mult, SSE57_NO, true, { Vps, Wps, Zz }, 0, s1RW2R, 0 },
4300     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4301     { e_xorpd, t_sse_mult, SSE57_66, true, { Vpd, Wpd, Zz }, 0, s1RW2R, 0 },
4302     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4303   },
4304   { /* SSE58 */
4305     { e_addps, t_sse_mult, SSE58_NO, true, { Vps, Wps, Zz }, 0, s1RW2R, 0 },
4306     { e_addss, t_sse_mult, SSE58_F3, true, { Vss, Wss, Zz }, 0, s1RW2R, 0 },
4307     { e_addpd, t_sse_mult, SSE58_66, true, { Vpd, Wpd, Zz }, 0, s1RW2R, 0 },
4308     { e_addsd, t_sse_mult, SSE58_F2, true, { Vsd, Wsd, Zz }, 0, s1RW2R, 0 },
4309   },
4310   { /* SSE59 */
4311     { e_mulps, t_sse_mult, SSE59_NO, true, { Vps, Wps, Zz }, 0, s1RW2R, 0 },
4312     { e_mulss, t_sse_mult, SSE59_F3, true, { Vss, Wss, Zz }, 0, s1RW2R, 0 },
4313     { e_mulpd, t_sse_mult, SSE59_66, true, { Vpd, Wpd, Zz }, 0, s1RW2R, 0 },
4314     { e_mulsd, t_sse_mult, SSE59_F2, true, { Vsd, Wsd, Zz }, 0, s1RW2R, 0 },
4315   },
4316   { /* SSE5A */
4317     { e_cvtps2pd, t_sse_mult, SSE5A_NO, true, { Vpd, Wps, Zz }, 0, s1W2R, 0 },
4318     { e_cvtss2sd, t_sse_mult, SSE5A_F3, true, { Vss, Wss, Zz }, 0, s1W2R, 0 },
4319     { e_cvtpd2ps, t_sse_mult, SSE5A_66, true, { Vps, Wpd, Zz }, 0, s1W2R, 0 }, // FIXME: book bug ???
4320     { e_cvtsd2ss, t_sse_mult, SSE5A_F2, true, { Vsd, Wsd, Zz }, 0, s1W2R, 0 },
4321   },
4322   { /* SSE5B */
4323     { e_cvtdq2ps, t_sse_mult, SSE5B_NO, true, { Vps, Wdq, Zz }, 0, s1W2R, 0 },
4324     { e_cvttps2dq, t_sse_mult, SSE5B_F3, true, { Vdq, Wps, Zz }, 0, s1W2R, 0 }, // book has this/next swapped!!!
4325     { e_cvtps2dq, t_sse_mult, SSE5B_66, true, { Vdq, Wps, Zz }, 0, s1W2R, 0 },  // FIXME: book bug ???
4326     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4327   },
4328   { /* SSE5C */
4329     { e_subps, t_sse_mult, SSE5C_NO, true, { Vps, Wps, Zz }, 0, s1RW2R, 0 },
4330     { e_subss, t_sse_mult, SSE5C_F3, true, { Vss, Wss, Zz }, 0, s1RW2R, 0 },
4331     { e_subpd, t_sse_mult, SSE5C_66, true, { Vpd, Wpd, Zz }, 0, s1RW2R, 0 },
4332     { e_subsd, t_sse_mult, SSE5C_F2, true, { Vsd, Wsd, Zz }, 0, s1RW2R, 0 },
4333   },
4334   { /* SSE5D */
4335     { e_minps, t_sse_mult, SSE5D_NO, true, { Vps, Wps, Zz }, 0, s1RW2R, 0 },
4336     { e_minss, t_sse_mult, SSE5D_F3, true, { Vss, Wss, Zz }, 0, s1RW2R, 0 },
4337     { e_minpd, t_sse_mult, SSE5D_66, true, { Vpd, Wpd, Zz }, 0, s1RW2R, 0 },
4338     { e_minsd, t_sse_mult, SSE5D_F2, true, { Vsd, Wsd, Zz }, 0, s1RW2R, 0 },
4339   },
4340   { /* SSE5E */
4341     { e_divps, t_sse_mult, SSE5E_NO, true, { Vps, Wps, Zz }, 0, s1RW2R, 0 },
4342     { e_divss, t_sse_mult, SSE5E_F3, true, { Vss, Wss, Zz }, 0, s1RW2R, 0 },
4343     { e_divpd, t_sse_mult, SSE5E_66, true, { Vpd, Wpd, Zz }, 0, s1RW2R, 0 },
4344     { e_divsd, t_sse_mult, SSE5E_F2, true, { Vsd, Wsd, Zz }, 0, s1RW2R, 0 },
4345   },
4346   { /* SSE5F */
4347     { e_maxps, t_sse_mult, SSE5F_NO, true, { Vps, Wps, Zz }, 0, s1RW2R, 0 },
4348     { e_maxss, t_sse_mult, SSE5F_F3, true, { Vss, Wss, Zz }, 0, s1RW2R, 0 },
4349     { e_maxpd, t_sse_mult, SSE5F_66, true, { Vpd, Wpd, Zz }, 0, s1RW2R, 0 },
4350     { e_maxsd, t_sse_mult, SSE5F_F2, true, { Vsd, Wsd, Zz }, 0, s1RW2R, 0 },
4351   },
4352   { /* SSE60 */
4353     { e_punpcklbw, t_done, 0, true, { Pq, Qd, Zz }, 0, s1RW2R, 0 },
4354     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4355     { e_punpcklbw, t_sse_mult, SSE60_66, true, { Vdq, Wdq, Zz }, 0, s1RW2R, 0 },
4356     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4357   },
4358   { /* SSE61 */
4359     { e_punpcklwd, t_done, 0, true, { Pq, Qd, Zz }, 0, s1RW2R, 0 },
4360     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4361     { e_punpcklwd, t_sse_mult, SSE61_66, true, { Vdq, Wdq, Zz }, 0, s1RW2R, 0 },
4362     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4363   },
4364   { /* SSE62 */
4365     { e_punpcklqd, t_done, 0, true, { Pq, Qd, Zz }, 0, s1RW2R, 0 },
4366     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4367     { e_punpcklqd, t_sse_mult, SSE62_66, true, { Vdq, Wdq, Zz }, 0, s1RW2R, 0 },
4368     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4369   },
4370   { /* SSE63 */
4371     { e_packsswb, t_done, 0, true, { Pq, Qq, Zz }, 0, s1RW2R, 0 },
4372     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4373     { e_packsswb, t_sse_mult, SSE63_66, true, { Vdq, Wdq, Zz }, 0, s1RW2R, 0 },
4374     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4375   },
4376   { /* SSE64 */
4377     { e_pcmpgtb, t_done, 0, true, { Pq, Qq, Zz }, 0, s1R2R, 0 },
4378     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4379     { e_pcmpgtb, t_sse_mult, SSE64_66, true, { Vdq, Wdq, Zz }, 0, s1R2R, 0 },
4380     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4381   },
4382   { /* SSE65 */
4383     { e_pcmpgtw, t_done, 0, true, { Pq, Qq, Zz }, 0, s1R2R, 0 },
4384     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4385     { e_pcmpgtw, t_sse_mult, SSE65_66, true, { Vdq, Wdq, Zz }, 0, s1R2R, 0 },
4386     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4387   },
4388   { /* SSE66 */
4389     { e_pcmpgdt, t_done, 0, true, { Pq, Qq, Zz }, 0, s1R2R, 0 },
4390     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4391     { e_pcmpgdt, t_sse_mult, SSE66_66, true, { Vdq, Wdq, Zz }, 0, s1R2R, 0 },
4392     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4393   },
4394   { /* SSE67 */
4395     { e_packuswb, t_done, 0, true, { Pq, Qq, Zz }, 0, s1RW2R, 0 },
4396     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4397     { e_packuswb, t_sse_mult, SSE67_66, true, { Vdq, Wdq, Zz }, 0, s1RW2R, 0 },
4398     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4399   },
4400   { /* SSE68 */
4401     { e_punpckhbw, t_done, 0, true, { Pq, Qq, Zz }, 0, s1RW2R, 0 },
4402     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4403     { e_punpckhbw, t_sse_mult, SSE68_66, true, { Pdq, Qdq, Zz }, 0, s1RW2R, 0 },
4404     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4405   },
4406   { /* SSE69 */
4407     { e_punpckhwd, t_done, 0, true, { Pq, Qq, Zz }, 0, s1RW2R, 0 },
4408     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4409     { e_punpckhwd, t_sse_mult, SSE69_66, true, { Pdq, Qdq, Zz }, 0, s1RW2R, 0 },
4410     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4411   },
4412   { /* SSE6A */
4413     { e_punpckhdq, t_done, 0, true, { Pq, Qq, Zz }, 0, s1RW2R, 0 },
4414     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4415     { e_punpckhdq, t_sse_mult, SSE6A_66, true, { Pdq, Qdq, Zz }, 0, s1RW2R, 0 },
4416     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4417   },
4418   { /* SSE6B */
4419     { e_packssdw, t_done, 0, true, { Pq, Qq, Zz }, 0, s1RW2R, 0 },
4420     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4421     { e_packssdw, t_sse_mult, SSE6B_66, true, { Pdq, Qdq, Zz }, 0, s1RW2R, 0 },
4422     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4423   },
4424   { /* SSE6C */
4425     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4426     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4427     { e_punpcklqld, t_sse_mult, SSE6C_66, true, { Vdq, Wdq, Zz }, 0, s1RW2R, 0 },
4428     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4429   },
4430   { /* SSE6D */
4431     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4432     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4433     { e_punpckhqd, t_sse_mult, SSE6D_66, true, { Vdq, Wdq, Zz }, 0, s1RW2R, 0 },
4434     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4435   },
4436   { /* SSE6E */
4437     { e_movd, t_done, 0, true, { Pd, Ev, Zz }, 0, s1W2R, 0 },
4438     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4439     { e_movd, t_done, 0, true, { Vdq, Ev, Zz }, 0, s1W2R, 0 },
4440     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4441   },
4442   { /* SSE6F */
4443     { e_movq, t_done, 0, true, { Pq, Qq, Zz }, 0, s1W2R, 0 },
4444     { e_movdqu, t_sse_mult, SSE6F_F3, true, { Vdq, Wdq, Zz }, 0, s1W2R, 0 }, // book has this/next swapped!!!
4445     { e_movdqa, t_sse_mult, SSE6F_66, true, { Vdq, Wdq, Zz }, 0, s1W2R, 0 },
4446     { e_No_Entry, t_sse_mult, SSE6F_F2, false, { Zz, Zz, Zz }, 0, 0, 0 }
4447   },
4448   { /* SSE70 */
4449     { e_pshufw, t_done, 0, true, { Pq, Qq, Ib }, 0, s1W2R3R, 0 },
4450     { e_pshufhw, t_sse_mult, SSE70_F3, true, { Vdq, Wdq, Ib }, 0, s1W2R3R, 0 }, // book has this/next swapped!!!
4451     { e_pshufd, t_sse_mult, SSE70_66, true, { Vdq, Wdq, Ib }, 0, s1W2R3R, 0 },
4452     { e_pshuflw, t_sse_mult, SSE70_F2, true, { Vdq, Wdq, Ib }, 0, s1W2R3R, 0 },
4453   },
4454   { /* SSE71 */
4455     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4456     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4457     { e_No_Entry, t_sse_mult, SSE71_66, false, { Zz, Zz, Zz }, 0, 0, 0 },
4458     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4459   },
4460   { /* SSE72 */
4461     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4462     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4463     { e_No_Entry, t_sse_mult, SSE72_66, false, { Zz, Zz, Zz }, 0, 0, 0 },
4464     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4465   },
4466   { /* SSE73 */
4467     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4468     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4469     { e_No_Entry, t_sse_mult, SSE73_66, false, { Zz, Zz, Zz }, 0, 0, 0 },
4470     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4471   },
4472   { /* SSE74 */
4473     { e_pcmpeqb, t_done, 0, true, { Pq, Qq, Zz }, 0, s1R2R, 0 },
4474     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4475     { e_pcmpeqb, t_sse_mult, SSE74_66, true, { Vdq, Wdq, Zz }, 0, s1R2R, 0 },
4476     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4477   },
4478   { /* SSE75 */
4479     { e_pcmpeqw, t_done, 0, true, { Pq, Qq, Zz }, 0, s1R2R, 0 },
4480     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4481     { e_pcmpeqw, t_sse_mult, SSE75_66, true, { Vdq, Wdq, Zz }, 0, s1R2R, 0 },
4482     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4483   },
4484   { /* SSE76 */
4485     { e_pcmpeqd, t_done, 0, true, { Pq, Qq, Zz }, 0, s1R2R, 0 },
4486     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },
4487     { e_pcmpeqd, t_sse_mult, SSE76_66, true, { Vdq, Wdq, Zz }, 0, s1R2R, 0 },
4488     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0, 0 },