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