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