Dyninst can now recognize about 50 VEX instructions
[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 using namespace std;
61 using namespace boost::assign;
62
63 namespace NS_x86 {
64
65 unsigned int swapBytesIfNeeded(unsigned int i)
66 {
67     return i;
68 }
69
70 // groups
71 enum {
72   Grp1a=0, Grp1b, Grp1c, Grp1d, Grp2, Grp3a, Grp3b, Grp4, Grp5, Grp6, Grp7,
73   Grp8, Grp9, Grp11, Grp12, Grp13, Grp14, Grp15, Grp16, Grp17, GrpAMD
74 };
75
76 // SSE
77 enum {
78   SSE10=0, SSE11, SSE12, SSE13, SSE14, SSE15, SSE16, SSE17,
79   SSE28, SSE29, SSE2A, SSE2B, SSE2C, SSE2D, SSE2E, SSE2F,
80   SSE50, SSE51, SSE52, SSE53, SSE54, SSE55, SSE56, SSE57,
81   SSE58, SSE59, SSE5A, SSE5B, SSE5C, SSE5D, SSE5E, SSE5F,
82   SSE60, SSE61, SSE62, SSE63, SSE64, SSE65, SSE66, SSE67,
83   SSE68, SSE69, SSE6A, SSE6B, SSE6C, SSE6D, SSE6E, SSE6F,
84   SSE70, SSE74, SSE75, SSE76,
85   SSE78, SSE79, SSE7C, SSE7D, SSE7E, SSE7F,
86   SSEB8,
87   SSEC2, SSEC4, SSEC5, SSEC6,
88   SSED0, SSED1, SSED2, SSED3, SSED4, SSED5, SSED6, SSED7,
89   SSED8, SSED9, SSEDA, SSEDB, SSEDC, SSEDD, SSEDE, SSEDF,
90   SSEE0, SSEE1, SSEE2, SSEE3, SSEE4, SSEE5, SSEE6, SSEE7,
91   SSEE8, SSEE9, SSEEA, SSEEB, SSEEC, SSEED, SSEEE, SSEEF,
92   SSEF0, SSEF1, SSEF2, SSEF3, SSEF4, SSEF5, SSEF6, SSEF7,
93   SSEF8, SSEF9, SSEFA, SSEFB, SSEFC, SSEFD, SSEFE, SSEFF
94 };
95
96 // SSE BIS
97 enum {
98         SSEB00=0, SSEB01, SSEB02, SSEB03, SSEB04, SSEB05, SSEB06, SSEB07,
99         SSEB08, SSEB09, SSEB0A, SSEB0B,
100         SSEB10, SSEB14, SSEB15, SSEB17,
101         SSEB18, SSEB19, SSEB1A, SSEB1B, SSEB1C, SSEB1D, SSEB1E,
102         SSEB20, SSEB21, SSEB22, SSEB23, SSEB24, SSEB25, 
103         SSEB28, SSEB29, SSEB2A, SSEB2B,
104         SSEB30, SSEB31, SSEB32, SSEB33, SSEB34, SSEB35, SSEB37,
105         SSEB38, SSEB39, SSEB3A, SSEB3B, SSEB3C, SSEB3D, SSEB3E, SSEB3F,
106         SSEB40, SSEB41,
107         SSEBF0, SSEBF1
108 };
109
110 // SSE TER 
111 enum {
112         SSET08=0, SSET09,
113         SSET0A, SSET0B, SSET0C, SSET0D, SSET0E, SSET0F,
114         SSET14, SSET15, SSET16, SSET17,
115         SSET18, SSET19,
116         SSET20, SSET21, SSET22,
117         SSET40, SSET41, SSET42,
118         SSET60, SSET61, SSET62, SSET63
119 };
120
121 // SSE groups
122 enum {
123   G12SSE010B=0, G12SSE100B, G12SSE110B,
124   G13SSE010B, G13SSE100B, G13SSE110B,
125   G14SSE010B, G14SSE011B, G14SSE110B, G14SSE111B,
126 };
127
128 enum {
129     GrpD8=0, GrpD9, GrpDA, GrpDB, GrpDC, GrpDD, GrpDE, GrpDF
130 };
131
132 #define Zz   { 0, 0 }
133 #define ImplImm { am_ImplImm, op_b }
134 #define Ap   { am_A, op_p }
135 #define Cd   { am_C, op_d }
136 #define Dd   { am_D, op_d }
137 #define Eb   { am_E, op_b }
138 #define Ed   { am_E, op_d }
139 #define Ef   { am_E, op_f }
140 #define Efd  { am_E, op_dbl }
141 #define Ep   { am_E, op_p }
142 #define Ev   { am_E, op_v }
143 #define Ew   { am_E, op_w }
144 #define Ey       { am_E, op_y }
145 #define Fv   { am_F, op_v }
146 #define Gb   { am_G, op_b }
147 #define Gd   { am_G, op_d }
148 #define Gv   { am_G, op_v }
149 #define Gw   { am_G, op_w }
150 #define Gf   { am_G, op_f }
151 #define Gfd  { am_G, op_dbl }
152 #define Ib   { am_I, op_b }
153 #define Iv   { am_I, op_v }
154 #define Iw   { am_I, op_w }
155 #define Iz   { am_I, op_z }
156 #define Jb   { am_J, op_b }
157 #define Jv   { am_J, op_v }
158 #define Jz   { am_J, op_z }
159 #define Ma   { am_M, op_a }
160 #define Mb   { am_M, op_b }
161 #define Mlea { am_M, op_lea }
162 #define Mp   { am_M, op_p }
163 #define Ms   { am_M, op_s }
164 #define Md   { am_M, op_d }
165 #define Mq   { am_M, op_q }
166 #define Mdq   { am_M, op_dq }
167 #define M512 { am_M, op_512 }
168 #define Mf   { am_M, op_f }
169 #define Mfd  { am_M, op_dbl }
170 #define M14  { am_M, op_14 }
171 #define Ob   { am_O, op_b }
172 #define Ov   { am_O, op_v }
173 #define Pd   { am_P, op_d }
174 #define Pdq  { am_P, op_dq }
175 #define Ppi  { am_P, op_pi }
176 #define Pq   { am_P, op_q }
177 #define Qdq  { am_Q, op_dq }
178 #define Qd   { am_Q, op_d }
179 #define Qpi  { am_Q, op_pi }
180 #define Qq   { am_Q, op_q }
181 #define Rd   { am_R, op_d }
182 #define RMb  { am_RM, op_b }
183 #define RMw  { am_RM, op_w }
184 #define Td   { am_T, op_d }
185 #define UMd      { am_UM, op_d }
186 #define Sw   { am_S, op_w }
187 #define Vd   { am_V, op_d }
188 #define Vdq  { am_V, op_dq }
189 #define Vpd  { am_V, op_pd }
190 #define Vps  { am_V, op_ps }
191 #define Vq   { am_V, op_q }
192 #define VRq  { am_VR, op_q }
193 #define VRdq { am_VR, op_dq }
194 #define Vss  { am_V, op_ss }
195 #define Vsd  { am_V, op_sd }
196 #define Wdq  { am_W, op_dq }
197 #define Wpd  { am_W, op_pd }
198 #define Wps  { am_W, op_ps }
199 #define Wq   { am_W, op_q }
200 #define Ws   { am_W, op_s }
201 #define Wsd  { am_W, op_sd }
202 #define Wss  { am_W, op_ss }
203 #define Xb   { am_X, op_b }
204 #define Xv   { am_X, op_v }
205 #define Yb   { am_Y, op_b }
206 #define Yv   { am_Y, op_v }
207 #define STHb { am_stackH, op_b }
208 #define STPb { am_stackP, op_b }
209 #define STHv { am_stackH, op_v }
210 #define STPv { am_stackP, op_v }
211 #define STHw { am_stackH, op_w }
212 #define STPw { am_stackP, op_w }
213 #define STHd { am_stackH, op_d }
214 #define STPd { am_stackP, op_d }
215 #define STHa { am_stackH, op_allgprs }
216 #define STPa { am_stackP, op_allgprs }
217
218 #define STKb { am_stack, op_b }
219 #define STKv { am_stack, op_v }
220 #define STKw { am_stack, op_w }
221 #define STKd { am_stack, op_d }
222 #define STKa { am_stack, op_allgprs }
223
224
225 #define GPRS { am_allgprs, op_allgprs }
226
227 #define AH  { am_reg, x86::iah }
228 #define AX  { am_reg, x86::iax }
229 #define BH  { am_reg, x86::ibh }
230 #define CH  { am_reg, x86::ich }
231 #define DH  { am_reg, x86::idh }
232 #define AL  { am_reg, x86::ial }
233 #define BL  { am_reg, x86::ibl }
234 #define CL  { am_reg, x86::icl }
235 #define CS  { am_reg, x86::ics }
236 #define DL  { am_reg, x86::idl }
237 #define DX  { am_reg, x86::idx }
238 #define eAX { am_reg, x86::ieax }
239 #define eBX { am_reg, x86::iebx }
240 #define eCX { am_reg, x86::iecx }
241 #define eDX { am_reg, x86::iedx }
242 #define EAX { am_reg, x86::ieax }
243 #define EBX { am_reg, x86::iebx }
244 #define ECX { am_reg, x86::iecx }
245 #define EDX { am_reg, x86::iedx }
246 #define DS  { am_reg, x86::ids }
247 #define ES  { am_reg, x86::ies }
248 #define FS  { am_reg, x86::ifs }
249 #define GS  { am_reg, x86::igs }
250 #define SS  { am_reg, x86::iss }
251 #define eSP { am_reg, x86::iesp }
252 #define eBP { am_reg, x86::iebp }
253 #define eSI { am_reg, x86::iesi }
254 #define eDI { am_reg, x86::iedi }
255 #define ESP { am_reg, x86::iesp }
256 #define EBP { am_reg, x86::iebp }
257 #define ESI { am_reg, x86::iesi }
258 #define EDI { am_reg, x86::iedi }
259 #define ECXEBX { am_tworeghack, op_ecxebx }
260 #define EDXEAX { am_tworeghack, op_edxeax }
261 #define rAX { am_reg, x86_64::irax }
262 #define rBX { am_reg, x86_64::irbx }
263 #define rCX { am_reg, x86_64::ircx }
264 #define rDX { am_reg, x86_64::irdx }
265 #define rSP { am_reg, x86_64::irsp }
266 #define rBP { am_reg, x86_64::irbp }
267 #define rSI { am_reg, x86_64::irsi }
268 #define rDI { am_reg, x86_64::irdi }
269 #define ST0 { am_reg, x86::ist0 }
270 #define ST1 { am_reg, x86::ist1 }
271 #define ST2 { am_reg, x86::ist2 }
272 #define ST3 { am_reg, x86::ist3 }
273 #define ST4 { am_reg, x86::ist4 }
274 #define ST5 { am_reg, x86::ist5 }
275 #define ST6 { am_reg, x86::ist6 }
276 #define ST7 { am_reg, x86::ist7 }
277 #define FPOS 17
278
279 enum {
280   fNT=1,   // non-temporal
281   fPREFETCHNT,
282   fPREFETCHT0,
283   fPREFETCHT1,
284   fPREFETCHT2,
285   fPREFETCHAMDE,
286   fPREFETCHAMDW,
287   fCALL,
288   fNEARRET,
289   fFARRET,
290   fIRET,
291   fENTER,
292   fLEAVE,
293   fXLAT,
294   fIO,
295   fSEGDESC,
296   fCOND,
297   fCMPXCH,
298   fCMPXCH8,
299   fINDIRCALL,
300   fINDIRJUMP,
301   fFXSAVE,
302   fFXRSTOR,
303   fCLFLUSH,
304   fREP,   // only rep prefix allowed: ins, movs, outs, lods, stos
305   fSCAS,
306   fCMPS
307 };
308
309 COMMON_EXPORT dyn_hash_map<entryID, std::string> entryNames_IAPI = map_list_of
310   (e_aaa, "aaa")
311   (e_aad, "aad")
312   (e_aam, "aam")
313   (e_aas, "aas")
314   (e_adc, "adc")
315   (e_add, "add")
316   (e_addpd, "addpd")
317   (e_addps, "addps")
318   (e_addsd, "addsd")
319   (e_addss, "addss")
320   (e_addsubpd, "addsubpd")
321   (e_addsubps, "addsubps")
322   (e_and, "and")
323   (e_andnpd, "andnpd")
324   (e_andnps, "andnps")
325   (e_andpd, "andpd")
326   (e_andps, "andps")
327   (e_arpl, "arpl")
328   (e_blendpd,"blendpd")
329   (e_blendps, "blendps")
330   (e_blendvpd, "blendvpd")
331   (e_blendvps, "blendvps")
332   (e_bound, "bound")
333   (e_bsf, "bsf")
334   (e_bsr, "bsr")
335   (e_bswap, "bswap")
336   (e_bt, "bt")
337   (e_btc, "btc")
338   (e_btr, "btr")
339   (e_bts, "bts")
340   (e_call, "call")
341   (e_cbw, "cbw")
342   (e_cdq, "cdq")
343   (e_clc, "clc")
344   (e_cld, "cld")
345   (e_clflush, "clflush")
346   (e_cli, "cli")
347   (e_clts, "clts")
348   (e_cmc, "cmc")
349   (e_cmovbe, "cmovbe")
350   (e_cmove, "cmove")
351   (e_cmovnae, "cmovnae")
352   (e_cmovnb, "cmovnb")
353   (e_cmovnbe, "cmovnbe")
354   (e_cmovne, "cmovne")
355   (e_cmovng, "cmovng")
356   (e_cmovnge, "cmovnge")
357   (e_cmovnl, "cmovnl")
358   (e_cmovno, "cmovno")
359   (e_cmovns, "cmovns")
360   (e_cmovo, "cmovo")
361   (e_cmovpe, "cmovpe")
362   (e_cmovpo, "cmovpo")
363   (e_cmovs, "cmovs")
364   (e_cmp, "cmp")
365   (e_cmppd, "cmppd")
366   (e_cmpps, "cmpps")
367   (e_cmpsb, "cmpsb")
368   (e_cmpsd, "cmpsd")
369   (e_cmpsd_sse, "cmpsd")
370   (e_cmpss, "cmpss")
371   (e_cmpsw, "cmpsw")
372   (e_cmpxch, "cmpxch")
373   (e_cmpxch8b, "cmpxch8b")
374   (e_comisd, "comisd")
375   (e_comiss, "comiss")
376   (e_cpuid, "cpuid")
377   (e_crc32, "crc32")
378   (e_cvtdq2pd, "cvtdq2pd")
379   (e_cvtdq2ps, "cvtdq2ps")
380   (e_cvtpd2dq, "cvtpd2dq")
381   (e_cvtpd2pi, "cvtpd2pi")
382   (e_cvtpd2ps, "cvtpd2ps")
383   (e_cvtpi2pd, "cvtpi2pd")
384   (e_cvtpi2ps, "cvtpi2ps")
385   (e_cvtps2dq, "cvtps2dq")
386   (e_cvtps2pd, "cvtps2pd")
387   (e_cvtps2pi, "cvtps2pi")
388   (e_cvtsd2si, "cvtsd2si")
389   (e_cvtsd2ss, "cvtsd2ss")
390   (e_cvtsi2sd, "cvtsi2sd")
391   (e_cvtsi2ss, "cvtsi2ss")
392   (e_cvtss2sd, "cvtss2sd")
393   (e_cvtss2si, "cvtss2si")
394   (e_cvttpd2dq, "cvttpd2dq")
395   (e_cvttpd2pi, "cvttpd2pi")
396   (e_cvttps2dq, "cvttps2dq")
397   (e_cvttps2pi, "cvttps2pi")
398   (e_cvttsd2si, "cvttsd2si")
399   (e_cvttss2si, "cvttss2si")
400   (e_cwd, "cwd")
401   (e_cwde, "cwde")
402   (e_daa, "daa")
403   (e_das, "das")
404   (e_dec, "dec")
405   (e_div, "div")
406   (e_divpd, "divpd")
407   (e_divps, "divps")
408   (e_divsd, "divsd")
409   (e_divss, "divss")
410   (e_dppd, "dppd")
411   (e_dpps, "dpps")
412   (e_emms, "emms")
413   (e_enter, "enter")
414   (e_extractps, "extractps")
415   (e_extrq, "extrq")
416   (e_fadd, "fadd")
417   (e_faddp, "faddp")
418   (e_fbld, "fbld")
419   (e_fbstp, "fbstp")
420   (e_fcom, "fcom")
421   (e_fcomp, "fcomp")
422   (e_fdiv, "fdiv")
423   (e_fdivr, "fdivr")
424   (e_femms, "femms")
425   (e_fiadd, "fiadd")
426   (e_ficom, "ficom")
427   (e_ficomp, "ficomp")
428   (e_fidiv, "fidiv")
429   (e_fidivr, "fidivr")
430   (e_fild, "fild")
431   (e_fimul, "fimul")
432   (e_fist, "fist")
433   (e_fistp, "fistp")
434   (e_fisttp, "fisttp")
435   (e_fisub, "fisub")
436   (e_fisubr, "fisubr")
437   (e_fld, "fld")
438   (e_fldcw, "fldcw")
439   (e_fldenv, "fldenv")
440   (e_fmul, "fmul")
441   (e_fnop, "fnop")
442   (e_frstor, "frstor")
443   (e_fsave, "fsave")
444   (e_fst, "fst")
445   (e_fstcw, "fstcw")
446   (e_fstenv, "fstenv")
447   (e_fstp, "fstp")
448   (e_fstsw, "fstsw")
449   (e_fsub, "fsub")
450   (e_fsubr, "fsubr")
451   (e_fucomp, "fucomp")
452   (e_fucompp, "fucompp")
453   (e_fxrstor, "fxrstor")
454   (e_fxsave, "fxsave")
455   (e_haddpd, "haddpd")
456   (e_haddps, "haddps")
457   (e_hlt, "hlt")
458   (e_hsubpd, "hsubpd")
459   (e_hsubps, "hsubps")
460   (e_idiv, "idiv")
461   (e_imul, "imul")
462   (e_in, "in")
463   (e_inc, "inc")
464   (e_insb, "insb")
465   (e_insd, "insd")
466   (e_insertps, "insertps")
467   (e_insertq, "insertq")
468   (e_insw, "insw")
469   (e_int, "int")
470   (e_int3, "int 3")
471   (e_int1, "int1")
472   (e_int80, "int 80")
473   (e_into, "into")
474   (e_invd, "invd")
475   (e_invlpg, "invlpg")
476   (e_iret, "iret")
477   (e_jb, "jb")
478   (e_jb_jnaej_j, "jb/jnaej/j")
479   (e_jbe, "jbe")
480   (e_jcxz_jec, "jcxz/jec")
481   (e_jl, "jl")
482   (e_jle, "jle")
483   (e_jmp, "jmp")
484   (e_jnb, "jnb")
485   (e_jnb_jae_j, "jnb/jae/j")
486   (e_jnbe, "jnbe")
487   (e_jnl, "jnl")
488   (e_jnle, "jnle")
489   (e_jno, "jno")
490   (e_jnp, "jnp")
491   (e_jns, "jns")
492   (e_jnz, "jnz")
493   (e_jo, "jo")
494   (e_jp, "jp")
495   (e_js, "js")
496   (e_jz, "jz")
497   (e_lahf, "lahf")
498   (e_lar, "lar")
499   (e_ldmxcsr, "ldmxcsr")
500   (e_lds, "lds")
501   (e_lddqu, "lddqu")
502   (e_lea, "lea")
503   (e_leave, "leave")
504   (e_les, "les")
505   (e_lfence, "lfence")
506   (e_lfs, "lfs")
507   (e_lgdt, "lgdt")
508   (e_lgs, "lgs")
509   (e_lidt, "lidt")
510   (e_lldt, "lldt")
511   (e_lmsw, "lmsw")
512   (e_lodsb, "lodsb")
513   (e_lodsd, "lodsd")
514   (e_lodsw, "lodsw")
515   (e_loop, "loop")
516   (e_loope, "loope")
517   (e_loopn, "loopn")
518   (e_lsl, "lsl")
519   (e_lss, "lss")
520   (e_ltr, "ltr")
521   (e_maskmovdqu, "maskmovdqu")
522   (e_maskmovq, "maskmovq")
523   (e_maxpd, "maxpd")
524   (e_maxps, "maxps")
525   (e_maxsd, "maxsd")
526   (e_maxss, "maxss")
527   (e_mfence, "mfence")
528   (e_minpd, "minpd")
529   (e_minps, "minps")
530   (e_minsd, "minsd")
531   (e_minss, "minss")
532   (e_mmxud, "mmxud")
533   (e_mov, "mov")
534   (e_movapd, "movapd")
535   (e_movaps, "movaps")
536   (e_movd, "movd")
537   (e_movddup, "movddup")
538   (e_movdq2q, "movdq2q")
539   (e_movdqa, "movdqa")
540   (e_movdqu, "movdqu")
541   (e_movhpd, "movhpd")
542   (e_movhps, "movhps")
543   (e_movhps_movlhps, "movhps/movlhps")
544   (e_movlpd, "movlpd")
545   (e_movlps, "movlps")
546   (e_movlps_movhlps, "movlps/movhlps")
547   (e_movmskpd, "movmskpd")
548   (e_movmskps, "movmskps")
549   (e_movntdq, "movntdq")
550   (e_movntdqa, "movntdqa")
551   (e_movnti, "movnti")
552   (e_movntpd, "movntpd")
553   (e_movntps, "movntps")
554   (e_movntq, "movntq")
555   (e_movq, "movq")
556   (e_movq2dq, "movq2dq")
557   (e_movsb, "movsb")
558   (e_movsd, "movsd")
559   (e_movsd_sse, "movsd")
560   (e_movshdup, "movshdup")
561   (e_movsldup, "movsldup")
562   (e_movss, "movss")
563   (e_movsw, "movsw")
564   (e_movsx, "movsx")
565   (e_movsxd, "movsxd")
566   (e_movupd, "movupd")
567   (e_movups, "movups")
568   (e_movzx, "movzx")
569   (e_mpsadbw, "mpsadbw")
570   (e_mul, "mul")
571   (e_mulpd, "mulpd")
572   (e_mulps, "mulps")
573   (e_mulsd, "mulsd")
574   (e_mulss, "mulss")
575   (e_neg, "neg")
576   (e_nop, "nop")
577   (e_not, "not")
578   (e_or, "or")
579   (e_orpd, "orpd")
580   (e_orps, "orps")
581   (e_out, "out")
582   (e_outsb, "outsb")
583   (e_outsd, "outsd")
584   (e_outsw, "outsw")
585   (e_pabsb, "pabsb")
586   (e_pabsd, "pabsd")
587   (e_pabsw, "pabsw")
588   (e_packssdw, "packssdw")
589   (e_packsswb, "packsswb")
590   (e_packusdw, "packusdw")
591   (e_packuswb, "packuswb")
592   (e_paddb, "paddb")
593   (e_paddd, "paddd")
594   (e_paddq, "paddq")
595   (e_paddsb, "paddsb")
596   (e_paddsw, "paddsw")
597   (e_paddusb, "paddusb")
598   (e_paddusw, "paddusw")
599   (e_paddw, "paddw")
600   (e_palignr, "palignr")
601   (e_pand, "pand")
602   (e_pandn, "pandn")
603   (e_pavgb, "pavgb")
604   (e_pavgw, "pavgw")
605   (e_pblendvb, "pblendvb")
606   (e_pblendw, "pblendw")
607   (e_pcmpeqb, "pcmpeqb")
608   (e_pcmpeqd, "pcmpeqd")
609   (e_pcmpeqq, "pcmpeqq")
610   (e_pcmpeqw, "pcmpeqw")
611   (e_pcmpestri, "pcmpestri")
612   (e_pcmpestrm, "pcmpestrm")
613   (e_pcmpgdt, "pcmpgdt")
614   (e_pcmpgtb, "pcmpgtb")
615   (e_pcmpgtq, "pcmpgtq")
616   (e_pcmpgtw, "pcmpgtw")
617   (e_pcmpistri, "pcmpistri")
618   (e_pcmpistrm, "pcmpistrm")
619   (e_pextrb, "pextrb")
620   (e_pextrd_pextrq, "pextrd/pextrq")
621   (e_pextrw, "pextrw")
622   (e_phaddd, "phaddd")
623   (e_phaddsw, "phaddsw")
624   (e_phaddw, "phaddw")
625   (e_phminposuw, "phminposuw")
626   (e_phsubd, "phsubd")
627   (e_phsubsw, "phsubsw")
628   (e_phsubw, "phsubw")
629   (e_pinsrb, "pinsrb")
630   (e_pinsrd_pinsrq, "pinsrd/pinsrq")
631   (e_pinsrw, "pinsrw")
632   (e_pmaddubsw, "pmaddubsw")
633   (e_pmaddwd, "pmaddwd")
634   (e_pmaxsb, "pmaxsb")
635   (e_pmaxsd, "pmaxsd")
636   (e_pmaxsw, "pmaxsw")
637   (e_pmaxub, "pmaxub")
638   (e_pmaxud, "pmaxud")
639   (e_pmaxuw, "pmaxuw")
640   (e_pminsb, "pminsb")
641   (e_pminsd, "pminsd")
642   (e_pminsw, "pminsw")
643   (e_pminub, "pminub")
644   (e_pminud, "pminud")
645   (e_pminuw, "pminuw")
646   (e_pmovmskb, "pmovmskb")
647   (e_pmovsxbd, "pmovsxbd")
648   (e_pmovsxbq, "pmovsxbq")
649   (e_pmovsxbw, "pmovsxbw")
650   (e_pmovsxdq, "pmovsxdq")
651   (e_pmovsxwd, "pmovsxwd")
652   (e_pmovsxwq, "pmovsxwq")
653   (e_pmovzxbd, "pmovzxbd")
654   (e_pmovzxbq, "pmovzxbq")
655   (e_pmovzxbw, "pmovzxbw")
656   (e_pmovzxdq, "pmovzxdq")
657   (e_pmovzxwd, "pmovzxwd")
658   (e_pmovzxwq, "pmovzxwq")
659   (e_pmuldq, "pmuldq")
660   (e_pmulhrsw, "pmulhrsw")
661   (e_pmulhuw, "pmulhuw")
662   (e_pmulhw, "pmulhw")
663   (e_pmullw, "pmullw")
664   (e_pmulld, "pmulld")
665   (e_pmuludq, "pmuludq")
666   (e_pop, "pop")
667   (e_popa, "popa")
668   (e_popad, "popad")
669   (e_popcnt, "popcnt")
670   (e_popf, "popf")
671   (e_popfd, "popfd")
672   (e_por, "por")
673   (e_prefetch, "prefetch")
674   (e_prefetchNTA, "prefetchNTA")
675   (e_prefetchT0, "prefetchT0")
676   (e_prefetchT1, "prefetchT1")
677   (e_prefetchT2, "prefetchT2")
678   (e_prefetch_w, "prefetch(w)")
679   (e_prefetchw, "prefetchw")
680   (e_psadbw, "psadbw")
681   (e_pshufb, "pshufb")
682   (e_pshufd, "pshufd")
683   (e_pshufhw, "pshufhw")
684   (e_pshuflw, "pshuflw")
685   (e_pshufw, "pshufw")
686   (e_psignb, "psignb")
687   (e_psignd, "psignd")
688   (e_psignw, "psignw")
689   (e_pslld, "pslld")
690   (e_pslldq, "pslldq")
691   (e_psllq, "psllq")
692   (e_psllw, "psllw")
693   (e_psrad, "psrad")
694   (e_psraw, "psraw")
695   (e_psrld, "psrld")
696   (e_psrldq, "psrldq")
697   (e_psrlq, "psrlq")
698   (e_psrlw, "psrlw")
699   (e_psubb, "psubb")
700   (e_psubd, "psubd")
701   (e_psubsb, "psubsb")
702   (e_psubsw, "psubsw")
703   (e_psubusb, "psubusb")
704   (e_psubusw, "psubusw")
705   (e_psubw, "psubw")
706   (e_ptest, "ptest")
707   (e_punpckhbw, "punpckhbw")
708   (e_punpckhdq, "punpckhdq")
709   (e_punpckhqd, "punpckhqd")
710   (e_punpckhwd, "punpckhwd")
711   (e_punpcklbw, "punpcklbw")
712   (e_punpcklqd, "punpcklqd")
713   (e_punpcklqld, "punpcklqld")
714   (e_punpcklwd, "punpcklwd")
715   (e_push, "push")
716   (e_pusha, "pusha")
717   (e_pushad, "pushad")
718   (e_pushf, "pushf")
719   (e_pushfd, "pushfd")
720   (e_pxor, "pxor")
721   (e_rcl, "rcl")
722   (e_rcpps, "rcpps")
723   (e_rcpss, "rcpss")
724   (e_rcr, "rcr")
725   (e_rdmsr, "rdmsr")
726   (e_rdpmc, "rdpmc")
727   (e_rdtsc, "rdtsc")
728   (e_ret_far, "ret far")
729   (e_ret_near, "ret near")
730   (e_rol, "rol")
731   (e_ror, "ror")
732   (e_roundpd, "roundpd")
733   (e_roundps, "roundps")
734   (e_roundsd, "roundsd")
735   (e_roundss, "roundss")
736   (e_rsm, "rsm")
737   (e_rsqrtps, "rsqrtps")
738   (e_rsqrtss, "rsqrtss")
739   (e_sahf, "sahf")
740   (e_salc, "salc")
741   (e_sar, "sar")
742   (e_sbb, "sbb")
743   (e_scasb, "scasb")
744   (e_scasd, "scasd")
745   (e_scasw, "scasw")
746   (e_setb, "setb")
747   (e_setbe, "setbe")
748   (e_setl, "setl")
749   (e_setle, "setle")
750   (e_setnb, "setnb")
751   (e_setnbe, "setnbe")
752   (e_setnl, "setnl")
753   (e_setnle, "setnle")
754   (e_setno, "setno")
755   (e_setnp, "setnp")
756   (e_setns, "setns")
757   (e_setnz, "setnz")
758   (e_seto, "seto")
759   (e_setp, "setp")
760   (e_sets, "sets")
761   (e_setz, "setz")
762   (e_sfence, "sfence")
763   (e_sgdt, "sgdt")
764   (e_shl_sal, "shl/sal")
765   (e_shld, "shld")
766   (e_shr, "shr")
767   (e_shrd, "shrd")
768   (e_shufpd, "shufpd")
769   (e_shufps, "shufps")
770   (e_sidt, "sidt")
771   (e_sldt, "sldt")
772   (e_smsw, "smsw")
773   (e_sqrtpd, "sqrtpd")
774   (e_sqrtps, "sqrtps")
775   (e_sqrtsd, "sqrtsd")
776   (e_sqrtss, "sqrtss")
777   (e_stc, "stc")
778   (e_std, "std")
779   (e_sti, "sti")
780   (e_stmxcsr, "stmxcsr")
781   (e_stosb, "stosb")
782   (e_stosd, "stosd")
783   (e_stosw, "stosw")
784   (e_str, "str")
785   (e_sub, "sub")
786   (e_subpd, "subpd")
787   (e_subps, "subps")
788   (e_subsd, "subsd")
789   (e_subss, "subss")
790   (e_syscall, "syscall")
791   (e_sysenter, "sysenter")
792   (e_sysexit, "sysexit")
793   (e_sysret, "sysret")
794   (e_test, "test")
795   (e_ucomisd, "ucomisd")
796   (e_ucomiss, "ucomiss")
797   (e_ud2, "ud2")
798   (e_ud2grp10, "ud2grp10")
799   (e_unpckhpd, "unpckhpd")
800   (e_unpckhps, "unpckhps")
801   (e_unpcklpd, "unpcklpd")
802   (e_unpcklps, "unpcklps")
803   (e_verr, "verr")
804   (e_verw, "verw")
805   (e_wait, "wait")
806   (e_wbinvd, "wbinvd")
807   (e_wrmsr, "wrmsr")
808   (e_xadd, "xadd")
809   (e_xchg, "xchg")
810   (e_xlat, "xlat")
811   (e_xor, "xor")
812   (e_xorpd, "xorpd")
813   (e_xorps, "xorps")
814  (e_vinsertf128, "vinsertf128")
815  (e_vextractf128, "vextractf128")
816  (e_vbroadcastss, "vbroadcastss")
817  (e_vbroadcastsd, "vbroadcastsd")
818  (e_vbroadcastf, "vbroadcastf")
819  (e_vpmovswb, "vpmovswb")
820  (e_vpmovsdb, "vpmovsdb")
821  (e_vpmovsqb, "vpmovsqb")
822  (e_vpmovsdw, "vpmovsdw")
823  (e_vpmovsqw, "vpmovsqw")
824  (e_vpmovsqd, "vpmovsqd")
825
826  (e_vzeroall, "vzeroall")
827  (e_vzeroupper, "vzeroupper")
828  (e_vcvtph2ps, "vcvtph2ps")
829  (e_vcvtps2ph, "vcvtps2ph")
830
831  (e_vbroadcastf128, "vbroadcastf128")
832  (e_vfmadd132pd, "vfmadd132pd")
833  (e_vfmadd213pd, "vfmadd213pd")
834  (e_vfmadd231pd, "vfmadd231pd")
835  (e_vfmadd132ps, "vfmadd132ps")
836  (e_vfmadd213ps, "vfmadd213ps")
837  (e_vfmadd231ps, "vfmadd231ps")
838  (e_vfmadd132sd, "vfmadd132sd")
839  (e_vfmadd213sd, "vfmadd213sd")
840  (e_vfmadd231sd, "vfmadd231sd")
841  (e_vfmadd132ss, "vfmadd132ss")
842  (e_vfmadd213ss, "vfmadd213ss")
843  (e_vfmadd231ss, "vfmadd231ss")
844  (e_vfmaddsub132pd, "vfmaddsub132pd")
845  (e_vfmaddsub213pd, "vfmaddsub213pd")
846  (e_vfmaddsub231pd, "vfmaddsub231pd")
847  (e_vfmaddsub132ps, "vfmaddsub132ps")
848  (e_vfmaddsub213ps, "vfmaddsub213ps")
849  (e_vfmaddsub231ps, "vfmaddsub231ps")
850  (e_vfmsubadd132pd, "vfmsubadd132pd")
851  (e_vfmsubadd213pd, "vfmsubadd213pd")
852  (e_vfmsubadd231pd, "vfmsubadd231pd")
853  (e_vfmsubadd132ps, "vfmsubadd132ps")
854  (e_vfmsubadd213ps, "vfmsubadd213ps")
855  (e_vfmsubadd231ps, "vfmsubadd231ps")
856  (e_vfmsub132pd, "vfmsub132pd")
857  (e_vfmsub213pd, "vfmsub213pd")
858  (e_vfmsub231pd, "vfmsub231pd")
859  (e_vfmsub132ps, "vfmsub132ps")
860  (e_vfmsub213ps, "vfmsub213ps")
861  (e_vfmsub231ps, "vfmsub231ps")
862  (e_vfmsub132sd, "vfmsub132sd")
863  (e_vfmsub213sd, "vfmsub213sd")
864  (e_vfmsub231sd, "vfmsub231sd")
865  (e_vfmsub132ss, "vfmsub132ss")
866  (e_vfmsub213ss, "vfmsub213ss")
867  (e_vfmsub231ss, "vfmsub231ss")
868  (e_vfnmadd132pd, "vfnmadd132pd")
869  (e_vfnmadd213pd, "vfnmadd213pd")
870  (e_vfnmadd231pd, "vfnmadd231pd")
871  (e_vfnmadd132ps, "vfnmadd132ps")
872  (e_vfnmadd213ps, "vfnmadd213ps")
873  (e_vfnmadd231ps, "vfnmadd231ps")
874  (e_vfnmadd132sd, "vfnmadd132sd")
875  (e_vfnmadd213sd, "vfnmadd213sd")
876  (e_vfnmadd231sd, "vfnmadd231sd")
877  (e_vfnmadd132ss, "vfnmadd132ss")
878  (e_vfnmadd213ss, "vfnmadd213ss")
879  (e_vfnmadd231ss, "vfnmadd231ss")
880  (e_vfnmsub132pd, "vfnmsub132pd")
881  (e_vfnmsub213pd, "vfnmsub213pd")
882  (e_vfnmsub231pd, "vfnmsub231pd")
883  (e_vfnmsub132ps, "vfnmsub132ps")
884  (e_vfnmsub213ps, "vfnmsub213ps")
885  (e_vfnmsub231ps, "vfnmsub231ps")
886  (e_vfnmsub132sd, "vfnmsub132sd")
887  (e_vfnmsub213sd, "vfnmsub213sd")
888  (e_vfnmsub231sd, "vfnmsub231sd")
889  (e_vfnmsub132ss, "vfnmsub132ss")
890  (e_vfnmsub213ss, "vfnmsub213ss")
891  (e_vfnmsub231ss, "vfnmsub231ss")
892  (e_vmaskmovps, "vmaskmovps")
893  (e_vmaskmovpd, "vmaskmovpd")
894  (e_vtestps, "vtestps")
895  (e_vtestpd, "vtestpd")
896
897  (e_vextracti128, "vextracti128")
898  (e_fp_generic, "[FIXME: GENERIC FPU INSN]")
899  (e_3dnow_generic, "[FIXME: GENERIC 3DNow INSN]")
900  (e_No_Entry, "No_Entry")
901         ;
902
903 dyn_hash_map<prefixEntryID, std::string> prefixEntryNames_IAPI = map_list_of
904   (prefix_rep, "REP")
905   (prefix_repnz, "REPNZ")
906         ;
907
908 COMMON_EXPORT dyn_hash_map<entryID, flagInfo> const& ia32_instruction::getFlagTable()
909 {
910   static dyn_hash_map<entryID, flagInfo> flagTable;
911   if(flagTable.empty()) 
912   {
913     ia32_instruction::initFlagTable(flagTable);
914   }
915   return flagTable;
916 }
917   
918 void ia32_instruction::initFlagTable(dyn_hash_map<entryID, flagInfo>& flagTable)
919 {
920   static const vector<Dyninst::MachRegister> standardFlags = list_of(x86::of)(x86::sf)(x86::zf)(x86::af)(x86::pf)(x86::cf);
921
922   flagTable[e_aaa] = flagInfo(list_of(x86::af), standardFlags);
923   flagTable[e_aad] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
924   flagTable[e_aam] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
925   flagTable[e_aas] = flagInfo(list_of(x86::af), standardFlags);
926   flagTable[e_adc] = flagInfo(list_of(x86::cf), standardFlags);
927   flagTable[e_add] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
928   flagTable[e_and] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
929   flagTable[e_arpl] = flagInfo(vector<Dyninst::MachRegister>(), list_of(x86::zf));
930   flagTable[e_bsf] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
931   flagTable[e_bsr] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
932   flagTable[e_bt] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
933   flagTable[e_bts] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
934   flagTable[e_btr] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
935   flagTable[e_btc] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
936   flagTable[e_clc] = flagInfo(vector<Dyninst::MachRegister>(), list_of(x86::cf));
937   flagTable[e_cld] = flagInfo(vector<Dyninst::MachRegister>(), list_of(x86::df));
938   flagTable[e_cli] = flagInfo(vector<Dyninst::MachRegister>(), list_of(x86::if_));
939   flagTable[e_cmc] = flagInfo(vector<Dyninst::MachRegister>(), list_of(x86::cf));
940   flagTable[e_cmovbe] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
941   flagTable[e_cmove] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
942   flagTable[e_cmovnae] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
943   flagTable[e_cmovnb] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
944   flagTable[e_cmovnbe] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
945   flagTable[e_cmovne] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
946   flagTable[e_cmovng] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
947   flagTable[e_cmovnge] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
948   flagTable[e_cmovnl] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
949   flagTable[e_cmovno] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
950   flagTable[e_cmovns] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
951   flagTable[e_cmovo] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
952   flagTable[e_cmovpe] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
953   flagTable[e_cmovpo] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
954   flagTable[e_cmovs] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
955   flagTable[e_cmp] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
956   flagTable[e_cmpsb] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
957   flagTable[e_cmpsd] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
958   flagTable[e_cmpss] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
959   flagTable[e_cmpsw] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
960   flagTable[e_cmpxch] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
961   flagTable[e_cmpxch8b] = flagInfo(vector<Dyninst::MachRegister>(), list_of(x86::zf));
962   flagTable[e_comisd] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
963   flagTable[e_comiss] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
964   flagTable[e_daa] = flagInfo(list_of(x86::af)(x86::cf), standardFlags);
965   flagTable[e_das] = flagInfo(list_of(x86::af)(x86::cf), standardFlags);
966   flagTable[e_dec] = flagInfo(vector<Dyninst::MachRegister>(), list_of(x86::of)(x86::sf)(x86::zf)(x86::af)(x86::pf));
967   flagTable[e_div] = flagInfo(list_of(x86::af)(x86::cf), standardFlags);
968   // TODO: FCMOVcc (not in our entry table) (reads zf/pf/cf)
969   // TODO: FCOMI/FCOMIP/FUCOMI/FUCOMIP (writes/zf/pf/cf)
970   flagTable[e_idiv] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
971   flagTable[e_imul] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
972   flagTable[e_inc] = flagInfo(vector<Dyninst::MachRegister>(), list_of(x86::of)(x86::sf)(x86::zf)(x86::af)(x86::pf));
973   flagTable[e_insb] = flagInfo(list_of(x86::df), vector<Dyninst::MachRegister>());
974   flagTable[e_insw] = flagInfo(list_of(x86::df), vector<Dyninst::MachRegister>());
975   flagTable[e_insd] = flagInfo(list_of(x86::df), vector<Dyninst::MachRegister>());
976   flagTable[e_int] = flagInfo(vector<Dyninst::MachRegister>(), list_of(x86::tf)(x86::nt_));
977   flagTable[e_int3] = flagInfo(vector<Dyninst::MachRegister>(), list_of(x86::tf)(x86::nt_));
978   flagTable[e_int80] = flagInfo(vector<Dyninst::MachRegister>(), list_of(x86::tf)(x86::nt_));
979   flagTable[e_into] = flagInfo(list_of(x86::of), list_of(x86::tf)(x86::nt_));
980   flagTable[e_ucomisd] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
981   flagTable[e_ucomiss] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
982   flagTable[e_iret] = flagInfo(list_of(x86::nt_),
983 list_of(x86::of)(x86::sf)(x86::zf)(x86::af)(x86::pf)(x86::cf)(x86::tf)(x86::if_)(x86::df));
984   flagTable[e_jb] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
985   flagTable[e_jb_jnaej_j] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
986   flagTable[e_jbe] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
987   flagTable[e_jl] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
988   flagTable[e_jle] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
989   flagTable[e_jnb] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
990   flagTable[e_jnb_jae_j] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
991   flagTable[e_jnbe] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
992   flagTable[e_jnl] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
993   flagTable[e_jnle] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
994   flagTable[e_jno] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
995   flagTable[e_jnp] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
996   flagTable[e_jns] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
997   flagTable[e_jnz] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
998   flagTable[e_jo] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
999   flagTable[e_jp] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
1000   flagTable[e_js] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
1001   flagTable[e_jz] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
1002   flagTable[e_lar] = flagInfo(vector<Dyninst::MachRegister>(), list_of(x86::zf));
1003   flagTable[e_lodsb] = flagInfo(list_of(x86::df), vector<Dyninst::MachRegister>());
1004   flagTable[e_lodsd] = flagInfo(list_of(x86::df), vector<Dyninst::MachRegister>());
1005   flagTable[e_lodsw] = flagInfo(list_of(x86::df), vector<Dyninst::MachRegister>());
1006   flagTable[e_loope] = flagInfo(list_of(x86::zf), vector<Dyninst::MachRegister>());
1007   flagTable[e_loopn] = flagInfo(list_of(x86::zf), vector<Dyninst::MachRegister>());
1008   flagTable[e_lsl] = flagInfo(vector<Dyninst::MachRegister>(), list_of(x86::zf));
1009   // I'd expect that mov control/debug/test gets handled when we do operand analysis
1010   // If it doesn't, fix later
1011   flagTable[e_mul] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
1012   flagTable[e_neg] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
1013   flagTable[e_or] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
1014   flagTable[e_outsb] = flagInfo(list_of(x86::df), vector<Dyninst::MachRegister>());
1015   flagTable[e_outsw] = flagInfo(list_of(x86::df), vector<Dyninst::MachRegister>());
1016   flagTable[e_outsd] = flagInfo(list_of(x86::df), vector<Dyninst::MachRegister>());
1017   flagTable[e_popf] = flagInfo(vector<Dyninst::MachRegister>(),
1018 list_of(x86::of)(x86::sf)(x86::zf)(x86::af)(x86::pf)(x86::cf)(x86::tf)(x86::if_)(x86::df)(x86::nt_));
1019   flagTable[e_popfd] = flagInfo(vector<Dyninst::MachRegister>(),
1020 list_of(x86::of)(x86::sf)(x86::zf)(x86::af)(x86::pf)(x86::cf)(x86::tf)(x86::if_)(x86::df)(x86::nt_));
1021   flagTable[e_rcl] = flagInfo(list_of(x86::cf), list_of(x86::of)(x86::cf));
1022   flagTable[e_rcr] = flagInfo(list_of(x86::cf), list_of(x86::of)(x86::cf));
1023   flagTable[e_rol] = flagInfo(list_of(x86::cf), list_of(x86::of)(x86::cf));
1024   flagTable[e_ror] = flagInfo(list_of(x86::cf), list_of(x86::of)(x86::cf));
1025   flagTable[e_rsm] = flagInfo(vector<Dyninst::MachRegister>(),
1026 list_of(x86::of)(x86::sf)(x86::zf)(x86::af)(x86::pf)(x86::cf)(x86::tf)(x86::if_)(x86::df)(x86::nt_)(x86::rf));
1027   flagTable[e_sahf] = flagInfo(list_of(x86::sf)(x86::zf)(x86::af)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
1028   flagTable[e_sar] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
1029   flagTable[e_shr] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
1030   flagTable[e_salc] = flagInfo(list_of(x86::cf), vector<Dyninst::MachRegister>());
1031   flagTable[e_sbb] = flagInfo(list_of(x86::cf), standardFlags);
1032   flagTable[e_setb] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
1033   flagTable[e_setbe] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
1034   flagTable[e_setl] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
1035   flagTable[e_setle] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
1036   flagTable[e_setnb] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
1037   flagTable[e_setnbe] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
1038   flagTable[e_setnl] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
1039   flagTable[e_setnle] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
1040   flagTable[e_setno] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
1041   flagTable[e_setnp] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
1042   flagTable[e_setns] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
1043   flagTable[e_setnz] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
1044   flagTable[e_seto] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
1045   flagTable[e_setp] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
1046   flagTable[e_sets] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
1047   flagTable[e_setz] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::pf)(x86::cf), vector<Dyninst::MachRegister>());
1048   flagTable[e_shld] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
1049   flagTable[e_shrd] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
1050   flagTable[e_shl_sal] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
1051   flagTable[e_stc] = flagInfo(vector<Dyninst::MachRegister>(), list_of(x86::cf));
1052   flagTable[e_std] = flagInfo(vector<Dyninst::MachRegister>(), list_of(x86::df));
1053   flagTable[e_sti] = flagInfo(vector<Dyninst::MachRegister>(), list_of(x86::if_));
1054   flagTable[e_stosb] = flagInfo(list_of(x86::df), vector<Dyninst::MachRegister>());
1055   flagTable[e_stosd] = flagInfo(list_of(x86::df), vector<Dyninst::MachRegister>());
1056   flagTable[e_stosw] = flagInfo(list_of(x86::df), vector<Dyninst::MachRegister>());
1057   flagTable[e_sub] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
1058   flagTable[e_test] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
1059   flagTable[e_verr] = flagInfo(vector<Dyninst::MachRegister>(), list_of(x86::zf));
1060   flagTable[e_verw] = flagInfo(vector<Dyninst::MachRegister>(), list_of(x86::zf));
1061   flagTable[e_xadd] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
1062   flagTable[e_xor] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
1063   flagTable[e_scasb] = flagInfo(list_of(x86::df), standardFlags);
1064   flagTable[e_scasw] = flagInfo(list_of(x86::df), standardFlags);
1065   flagTable[e_scasd] = flagInfo(list_of(x86::df), standardFlags);
1066   flagTable[e_pcmpestri] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
1067   flagTable[e_pcmpestrm] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
1068   flagTable[e_pcmpistri] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
1069   flagTable[e_pcmpistrm] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
1070   flagTable[e_popcnt] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::af)(x86::cf)(x86::pf), vector<Dyninst::MachRegister>());
1071   flagTable[e_ptest] = flagInfo(vector<Dyninst::MachRegister>(), standardFlags);
1072
1073 //  flagTable[e_ptest] = flagInfo(list_of(x86::of)(x86::sf)(x86::zf)(x86::af)(x86::cf)(x86::pf), vector<Dyninst::MachRegister>());
1074 }
1075
1076 bool ia32_entry::flagsUsed(std::set<MachRegister>& flagsRead, std::set<MachRegister>& flagsWritten, ia32_locations* locs)
1077 {
1078   dyn_hash_map<entryID, flagInfo>::const_iterator found = ia32_instruction::getFlagTable().find(getID(locs));
1079   if(found == ia32_instruction::getFlagTable().end())
1080   {
1081     return false;
1082   }
1083   // No entries for something that touches no flags, so always return true if we had an entry
1084
1085   copy((found->second).readFlags.begin(), (found->second).readFlags.end(), inserter(flagsRead, flagsRead.begin()));
1086   copy((found->second).writtenFlags.begin(), (found->second).writtenFlags.end(), inserter(flagsWritten,flagsWritten.begin()));
1087   return true;
1088 }
1089
1090
1091
1092 // Modded table entry for push/pop, daa, das, aaa, aas, insb/w/d, outsb/w/d, xchg, cbw
1093 // les, lds, aam, aad, loop(z/nz), cmpxch, lss, mul, imul, div, idiv, cmpxch8, [ld/st]mxcsr
1094 // clflush, prefetch*
1095
1096
1097 // oneByteMap: one byte opcode map
1098 static ia32_entry oneByteMap[256] = {
1099   /* 00 */
1100   { e_add,  t_done, 0, true, { Eb, Gb, Zz }, 0, s1RW2R },
1101   { e_add,  t_done, 0, true, { Ev, Gv, Zz }, 0, s1RW2R },
1102   { e_add,  t_done, 0, true, { Gb, Eb, Zz }, 0, s1RW2R },
1103   { e_add,  t_done, 0, true, { Gv, Ev, Zz }, 0, s1RW2R },
1104   { e_add,  t_done, 0, false, { AL, Ib, Zz }, 0, s1RW2R },
1105   { e_add,  t_done, 0, false, { eAX, Iz, Zz }, 0, s1RW2R },
1106   { e_push, t_done, 0, false, { ES, eSP, Zz }, 0, s1R2RW }, // Semantics rewritten to ignore stack "operand"
1107   { e_pop,  t_done, 0, false, { ES, eSP, Zz }, 0, s1W2RW },
1108   /* 08 */
1109   { e_or,   t_done, 0, 
1110 true, { Eb, Gb, Zz }, 0, s1RW2R },
1111   { e_or,   t_done, 0, true, { Ev, Gv, Zz }, 0, s1RW2R },
1112   { e_or,   t_done, 0, true, { Gb, Eb, Zz }, 0, s1RW2R },
1113   { e_or,   t_done, 0, true, { Gv, Ev, Zz }, 0, s1RW2R },
1114   { e_or,   t_done, 0, false, { AL, Ib, Zz }, 0, s1RW2R },
1115   { e_or,   t_done, 0, false, { eAX, Iz, Zz }, 0, s1RW2R },
1116   { e_push, t_done, 0, false, { CS, eSP, Zz }, 0, s1R2RW },
1117   { e_No_Entry,      t_twoB, 0, false, { Zz, Zz, Zz }, 0, 0 },
1118   /* 10 */
1119   { e_adc,  t_done, 0, true, { Eb, Gb, Zz }, 0, s1RW2R },
1120   { e_adc,  t_done, 0, true, { Ev, Gv, Zz }, 0, s1RW2R },
1121   { e_adc,  t_done, 0, true, { Gb, Eb, Zz }, 0, s1RW2R },
1122   { e_adc,  t_done, 0, true, { Gv, Ev, Zz }, 0, s1RW2R },
1123   { e_adc,  t_done, 0, false, { AL, Ib, Zz }, 0, s1RW2R },
1124   { e_adc,  t_done, 0, false, { eAX, Iz, Zz }, 0, s1RW2R },
1125   { e_push, t_done, 0, false, { SS, eSP, Zz }, 0, s1R2RW },
1126   { e_pop,  t_done, 0, false, { SS, eSP, Zz }, 0, s1W2RW },
1127   /* 18 */
1128   { e_sbb,  t_done, 0, true, { Eb, Gb, Zz }, 0, s1RW2R },
1129   { e_sbb,  t_done, 0, true, { Ev, Gv, Zz }, 0, s1RW2R },
1130   { e_sbb,  t_done, 0, true, { Gb, Eb, Zz }, 0, s1RW2R },
1131   { e_sbb,  t_done, 0, true, { Gv, Ev, Zz }, 0, s1RW2R },
1132   { e_sbb,  t_done, 0, false, { AL, Ib, Zz }, 0, s1RW2R },
1133   { e_sbb,  t_done, 0, false, { eAX, Iz, Zz }, 0, s1RW2R },
1134   { e_push, t_done, 0, false, { DS, eSP, Zz }, 0, s1R2RW },
1135   { e_pop , t_done, 0, false, { DS, eSP, Zz }, 0, s1W2RW },
1136   /* 20 */
1137   { e_and, t_done, 0, true, { Eb, Gb, Zz }, 0, s1RW2R },
1138   { e_and, t_done, 0, true, { Ev, Gv, Zz }, 0, s1RW2R },
1139   { e_and, t_done, 0, true, { Gb, Eb, Zz }, 0, s1RW2R },
1140   { e_and, t_done, 0, true, { Gv, Ev, Zz }, 0, s1RW2R },
1141   { e_and, t_done, 0, false, { AL, Ib, Zz }, 0, s1RW2R },
1142   { e_and, t_done, 0, false, { eAX, Iz, Zz }, 0, s1RW2R },
1143   { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 }, // PREFIX_SEG_OVR
1144   { e_daa, t_done, 0, false, { AL, Zz, Zz }, 0, s1RW },
1145   /* 28 */
1146   { e_sub, t_done, 0, true, { Eb, Gb, Zz }, 0, s1RW2R },
1147   { e_sub, t_done, 0, true, { Ev, Gv, Zz }, 0, s1RW2R },
1148   { e_sub, t_done, 0, true, { Gb, Eb, Zz }, 0, s1RW2R },
1149   { e_sub, t_done, 0, true, { Gv, Ev, Zz }, 0, s1RW2R },
1150   { e_sub, t_done, 0, false, { AL, Ib, Zz }, 0, s1RW2R },
1151   { e_sub, t_done, 0, false, { eAX, Iz, Zz }, 0, s1RW2R },
1152   { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 }, // PREFIX_SEG_OVR
1153   { e_das , t_done, 0, false, { AL, Zz, Zz }, 0, s1RW },
1154   /* 30 */
1155   { e_xor, t_done, 0, true, { Eb, Gb, Zz }, 0, s1RW2R },
1156   { e_xor, t_done, 0, true, { Ev, Gv, Zz }, 0, s1RW2R },
1157   { e_xor, t_done, 0, true, { Gb, Eb, Zz }, 0, s1RW2R },
1158   { e_xor, t_done, 0, true, { Gv, Ev, Zz }, 0, s1RW2R },
1159   { e_xor, t_done, 0, false, { AL, Ib, Zz }, 0, s1RW2R },
1160   { e_xor, t_done, 0, false, { eAX, Iz, Zz }, 0, s1RW2R },
1161   { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 }, // PREFIX_SEG_OVR
1162   { e_aaa, t_done, 0, false, { AX, Zz, Zz }, 0, s1RW },
1163   /* 38 */
1164   { e_cmp, t_done, 0, true, { Eb, Gb, Zz }, 0, s1R2R },
1165   { e_cmp, t_done, 0, true, { Ev, Gv, Zz }, 0, s1R2R },
1166   { e_cmp, t_done, 0, true, { Gb, Eb, Zz }, 0, s1R2R },
1167   { e_cmp, t_done, 0, true, { Gv, Ev, Zz }, 0, s1R2R },
1168   { e_cmp, t_done, 0, false, { AL, Ib, Zz }, 0, s1R2R },
1169   { e_cmp, t_done, 0, false, { eAX, Iz, Zz }, 0, s1R2R },
1170   { e_No_Entry,     t_ill,  0, false, { Zz, Zz, Zz }, 0, 0 }, // PREFIX_SEG_OVR
1171   { e_aas, t_done, 0, false, { AX, Zz, Zz }, 0, s1RW },
1172   /* 40 */
1173   { e_inc, t_done, 0, false, { eAX, Zz, Zz }, 0, s1RW },
1174   { e_inc, t_done, 0, false, { eCX, Zz, Zz }, 0, s1RW },
1175   { e_inc, t_done, 0, false, { eDX, Zz, Zz }, 0, s1RW },
1176   { e_inc, t_done, 0, false, { eBX, Zz, Zz }, 0, s1RW },
1177   { e_inc, t_done, 0, false, { eSP, Zz, Zz }, 0, s1RW },
1178   { e_inc, t_done, 0, false, { eBP, Zz, Zz }, 0, s1RW },
1179   { e_inc, t_done, 0, false, { eSI, Zz, Zz }, 0, s1RW },
1180   { e_inc, t_done, 0, false, { eDI, Zz, Zz }, 0, s1RW },
1181   /* 48 */
1182   { e_dec, t_done, 0, false, { eAX, Zz, Zz }, 0, s1RW },
1183   { e_dec, t_done, 0, false, { eCX, Zz, Zz }, 0, s1RW },
1184   { e_dec, t_done, 0, false, { eDX, Zz, Zz }, 0, s1RW },
1185   { e_dec, t_done, 0, false, { eBX, Zz, Zz }, 0, s1RW },
1186   { e_dec, t_done, 0, false, { eSP, Zz, Zz }, 0, s1RW },
1187   { e_dec, t_done, 0, false, { eBP, Zz, Zz }, 0, s1RW },
1188   { e_dec, t_done, 0, false, { eSI, Zz, Zz }, 0, s1RW },
1189   { e_dec, t_done, 0, false, { eDI, Zz, Zz }, 0, s1RW },
1190   /* 50 */
1191   { e_push, t_done, 0, false, { rAX, eSP, Zz }, 0, s1R2RW },
1192   { e_push, t_done, 0, false, { rCX, eSP, Zz }, 0, s1R2RW },
1193   { e_push, t_done, 0, false, { rDX, eSP, Zz }, 0, s1R2RW },
1194   { e_push, t_done, 0, false, { rBX, eSP, Zz }, 0, s1R2RW },
1195   { e_push, t_done, 0, false, { rSP, eSP, Zz }, 0, s1R2RW },
1196   { e_push, t_done, 0, false, { rBP, eSP, Zz }, 0, s1R2RW },
1197   { e_push, t_done, 0, false, { rSI, eSP, Zz }, 0, s1R2RW },
1198   { e_push, t_done, 0, false, { rDI, eSP, Zz }, 0, s1R2RW },
1199   /* 58 */
1200   { e_pop, t_done, 0, false, { rAX, eSP, Zz }, 0, s1W2RW },
1201   { e_pop, t_done, 0, false, { rCX, eSP, Zz }, 0, s1W2RW },
1202   { e_pop, t_done, 0, false, { rDX, eSP, Zz }, 0, s1W2RW },
1203   { e_pop, t_done, 0, false, { rBX, eSP, Zz }, 0, s1W2RW },
1204   { e_pop, t_done, 0, false, { rSP, eSP, Zz }, 0, s1W2RW },
1205   { e_pop, t_done, 0, false, { rBP, eSP, Zz }, 0, s1W2RW },
1206   { e_pop, t_done, 0, false, { rSI, eSP, Zz }, 0, s1W2RW },
1207   { e_pop, t_done, 0, false, { rDI, eSP, Zz }, 0, s1W2RW },
1208   /* 60 */
1209   { e_pushad, t_done, 0, false, { GPRS, eSP, Zz }, 0, s1R2RW },
1210   { e_popad,  t_done, 0, false, { GPRS, eSP, Zz }, 0, s1W2RW },
1211   { e_bound,    t_done, 0, true, { Gv, Ma, Zz }, 0, s1R2R }, // or VEX
1212   { e_arpl,     t_done, 0, true, { Ew, Gw, Zz }, 0, s1R2R },
1213   { e_No_Entry,          t_ill,  0, false, { Zz, Zz, Zz }, 0, 0 }, // PREFIX_SEG_OVR
1214   { e_No_Entry,          t_ill,  0, false, { Zz, Zz, Zz }, 0, 0 }, // PREFIX_SEG_OVR
1215   { e_No_Entry,   t_prefixedSSE, 2, false, { Zz, Zz, Zz }, 0, 0 }, /* operand size prefix (PREFIX_OPR_SZ)*/
1216   { e_No_Entry,          t_ill,  0, false, { Zz, Zz, Zz }, 0, 0 }, /* address size prefix (PREFIX_ADDR_SZ)*/
1217   /* 68 */
1218   { e_push,    t_done, 0, false, { Iz, eSP, Zz }, 0, s1R2RW },
1219   { e_imul,    t_done, 0, true, { Gv, Ev, Iz }, 0, s1W2R3R },
1220   { e_push,    t_done, 0, false, { Ib, eSP, Zz }, 0, s1R2RW },
1221   { e_imul,    t_done, 0, true, { Gv, Ev, Ib }, 0, s1W2R3R },
1222   { e_insb,    t_done, 0, false, { Yb, DX, Zz }, 0, s1W2R | (fREP << FPOS) }, // (e)SI/DI changed
1223   { e_insd,  t_done, 0, false, { Yv, DX, Zz }, 0, s1W2R | (fREP << FPOS) },
1224   { e_outsb,   t_done, 0, false, { DX, Xb, Zz }, 0, s1W2R | (fREP << FPOS) },
1225   { e_outsd, t_done, 0, false, { DX, Xv, Zz }, 0, s1W2R | (fREP << FPOS) },
1226   /* 70 */
1227   { e_jo,         t_done, 0, false, { Jb, Zz, Zz }, (IS_JCC | REL_B), s1R },
1228   { e_jno,        t_done, 0, false, { Jb, Zz, Zz }, (IS_JCC | REL_B), s1R },
1229   { e_jb_jnaej_j, t_done, 0, false, { Jb, Zz, Zz }, (IS_JCC | REL_B), s1R },
1230   { e_jnb_jae_j,  t_done, 0, false, { Jb, Zz, Zz }, (IS_JCC | REL_B), s1R },
1231   { e_jz,         t_done, 0, false, { Jb, Zz, Zz }, (IS_JCC | REL_B), s1R },
1232   { e_jnz,        t_done, 0, false, { Jb, Zz, Zz }, (IS_JCC | REL_B), s1R },
1233   { e_jbe,        t_done, 0, false, { Jb, Zz, Zz }, (IS_JCC | REL_B), s1R },
1234   { e_jnbe,       t_done, 0, false, { Jb, Zz, Zz }, (IS_JCC | REL_B), s1R },
1235   /* 78 */
1236   { e_js,   t_done, 0, false, { Jb, Zz, Zz }, (IS_JCC | REL_B), s1R },
1237   { e_jns,  t_done, 0, false, { Jb, Zz, Zz }, (IS_JCC | REL_B), s1R },
1238   { e_jp,   t_done, 0, false, { Jb, Zz, Zz }, (IS_JCC | REL_B), s1R },
1239   { e_jnp,  t_done, 0, false, { Jb, Zz, Zz }, (IS_JCC | REL_B), s1R },
1240   { e_jl,   t_done, 0, false, { Jb, Zz, Zz }, (IS_JCC | REL_B), s1R },
1241   { e_jnl,  t_done, 0, false, { Jb, Zz, Zz }, (IS_JCC | REL_B), s1R },
1242   { e_jle,  t_done, 0, false, { Jb, Zz, Zz }, (IS_JCC | REL_B), s1R },
1243   { e_jnle, t_done, 0, false, { Jb, Zz, Zz }, (IS_JCC | REL_B), s1R },
1244   /* 80 */
1245   { e_No_Entry, t_grp, Grp1a, true, { Zz, Zz, Zz }, 0, 0 },
1246   { e_No_Entry, t_grp, Grp1b, true, { Zz, Zz, Zz }, 0, 0 },
1247   { e_No_Entry, t_grp, Grp1c, true, { Zz, Zz, Zz }, 0, 0 }, // book says Grp1 however;sandpile.org agrees.
1248   { e_No_Entry, t_grp, Grp1d, true, { Zz, Zz, Zz }, 0, 0 },
1249   { e_test, t_done, 0, true, { Eb, Gb, Zz }, 0, s1R2R },
1250   { e_test, t_done, 0, true, { Ev, Gv, Zz }, 0, s1R2R },
1251   { e_xchg, t_done, 0, true, { Eb, Gb, Zz }, 0, s1RW2RW },
1252   { e_xchg, t_done, 0, true, { Ev, Gv, Zz }, 0, s1RW2RW },
1253   /* 88 */
1254   { e_mov, t_done, 0, true, { Eb, Gb, Zz }, 0, s1W2R },
1255   { e_mov, t_done, 0, true, { Ev, Gv, Zz }, 0, s1W2R },
1256   { e_mov, t_done, 0, true, { Gb, Eb, Zz }, 0, s1W2R },
1257   { e_mov, t_done, 0, true, { Gv, Ev, Zz }, 0, s1W2R },
1258   { e_mov, t_done, 0, true, { Ew, Sw, Zz }, 0, s1W2R },
1259   { e_lea, t_done, 0, true, { Gv, Mlea, Zz }, IS_NOP, s1W2R }, // this is just M in the book
1260                                                         // AFAICT the 2nd operand is not accessed
1261   { e_mov, t_done, 0, true, { Sw, Ew, Zz }, 0, s1W2R },
1262   { e_pop, t_done, 0, true, { Ev, eSP, Zz }, 0, s1W2RW }, // or VEX XOP
1263   /* 90 */
1264   { e_nop,  t_done, 0, false, { Zz, Zz, Zz }, IS_NOP, sNONE }, // actually xchg eax,eax
1265   { e_xchg, t_done, 0, false, { eCX, eAX, Zz }, 0, s1RW2RW },
1266   { e_xchg, t_done, 0, false, { eDX, eAX, Zz }, 0, s1RW2RW },
1267   { e_xchg, t_done, 0, false, { eBX, eAX, Zz }, 0, s1RW2RW },
1268   { e_xchg, t_done, 0, false, { eSP, eAX, Zz }, 0, s1RW2RW },
1269   { e_xchg, t_done, 0, false, { eBP, eAX, Zz }, 0, s1RW2RW },
1270   { e_xchg, t_done, 0, false, { eSI, eAX, Zz }, 0, s1RW2RW },
1271   { e_xchg, t_done, 0, false, { eDI, eAX, Zz }, 0, s1RW2RW },
1272   /* 98 */
1273   { e_cwde, t_done, 0, false, { eAX, Zz, Zz }, 0, s1RW },
1274   { e_cdq,  t_done, 0, false, { eDX, eAX, Zz }, 0, s1W2R },
1275   { e_call,     t_done, 0, false, { Ap, Zz, Zz }, IS_CALL | PTR_WX, s1R },
1276   { e_wait,     t_done, 0, false, { Zz, Zz, Zz }, 0, sNONE },
1277   { e_pushfd, t_done, 0, false, { Fv, eSP, Zz }, 0, s1R2RW },
1278   { e_popfd,  t_done, 0, false, { Fv, eSP, Zz }, 0, s1W2RW },
1279   { e_sahf,     t_done, 0, false, { Zz, Zz, Zz }, 0, 0 }, // FIXME Intel
1280   { e_lahf,     t_done, 0, false, { Zz, Zz, Zz }, 0, 0 }, // FIXME Intel
1281   /* A0 */
1282   { e_mov,   t_done, 0, false, { AL, Ob, Zz },  0, s1W2R },
1283   { e_mov,   t_done, 0, false, { eAX, Ov, Zz }, 0, s1W2R },
1284   { e_mov,   t_done, 0, false, { Ob, AL, Zz },  0, s1W2R },
1285   { e_mov,   t_done, 0, false, { Ov, eAX, Zz }, 0, s1W2R },
1286   // XXX: Xv is source, Yv is destination for movs, so they're swapped!
1287   { e_movsb, t_done, 0, false, { Yb, Xb, Zz },  0, s1W2R | (fREP << FPOS) }, // (e)SI/DI changed
1288   { e_movsd, t_done, 0, false, { Yv, Xv, Zz }, 0, s1W2R | (fREP << FPOS) },
1289   { e_cmpsb, t_done, 0, false, { Xb, Yb, Zz },  0, s1R2R | (fCMPS << FPOS) },
1290   { e_cmpsw, t_done, 0, false, { Xv, Yv, Zz },  0, s1R2R | (fCMPS << FPOS) },
1291   /* A8 */
1292   { e_test,     t_done, 0, false, { AL, Ib, Zz },  0, s1R2R },
1293   { e_test,     t_done, 0, false, { eAX, Iz, Zz }, 0, s1R2R },
1294   { e_stosb,    t_done, 0, false, { Yb, AL, Zz },  0, s1W2R | (fREP << FPOS) },
1295   { e_stosd,  t_done, 0, false, { Yv, eAX, Zz }, 0, s1W2R | (fREP << FPOS) },
1296   { e_lodsb,    t_done, 0, false, { AL, Xb, Zz },  0, s1W2R | (fREP << FPOS) },
1297   { e_lodsd,    t_done, 0, false, { eAX, Xv, Zz }, 0, s1W2R | (fREP << FPOS) },
1298   { e_scasb,    t_done, 0, false, { AL, Yb, Zz },  0, s1R2R | (fSCAS << FPOS) },
1299   { e_scasd,  t_done, 0, false, { eAX, Yv, Zz }, 0, s1R2R | (fSCAS << FPOS) },
1300   /* B0 */
1301   { e_mov, t_done, 0, false, { AL, Ib, Zz }, 0, s1W2R },
1302   { e_mov, t_done, 0, false, { CL, Ib, Zz }, 0, s1W2R },
1303   { e_mov, t_done, 0, false, { DL, Ib, Zz }, 0, s1W2R },
1304   { e_mov, t_done, 0, false, { BL, Ib, Zz }, 0, s1W2R },
1305   { e_mov, t_done, 0, false, { AH, Ib, Zz }, 0, s1W2R },
1306   { e_mov, t_done, 0, false, { CH, Ib, Zz }, 0, s1W2R },
1307   { e_mov, t_done, 0, false, { DH, Ib, Zz }, 0, s1W2R },
1308   { e_mov, t_done, 0, false, { BH, Ib, Zz }, 0, s1W2R },
1309   /* B8 */
1310   { e_mov, t_done, 0, false, { eAX, Iv, Zz }, 0, s1W2R },
1311   { e_mov, t_done, 0, false, { eCX, Iv, Zz }, 0, s1W2R },
1312   { e_mov, t_done, 0, false, { eDX, Iv, Zz }, 0, s1W2R },
1313   { e_mov, t_done, 0, false, { eBX, Iv, Zz }, 0, s1W2R },
1314   { e_mov, t_done, 0, false, { eSP, Iv, Zz }, 0, s1W2R },
1315   { e_mov, t_done, 0, false, { eBP, Iv, Zz }, 0, s1W2R },
1316   { e_mov, t_done, 0, false, { eSI, Iv, Zz }, 0, s1W2R },
1317   { e_mov, t_done, 0, false, { eDI, Iv, Zz }, 0, s1W2R },
1318   /* C0 */
1319   { e_No_Entry, t_grp, Grp2, true, { Eb, Ib, Zz }, 0, s1RW2R },
1320   { e_No_Entry, t_grp, Grp2, true, { Ev, Ib, Zz }, 0, s1RW2R },
1321   { e_ret_near, t_done, 0, false, { Iw, Zz, Zz }, (IS_RET | IS_RETC), s1R | (fNEARRET << FPOS) },
1322   { e_ret_near, t_done, 0, false, { Zz, Zz, Zz }, (IS_RET), fNEARRET << FPOS },
1323   { e_les,      t_done, 0, true, { ES, Gv, Mp }, 0, s1W2W3R }, // or VEX
1324   { e_lds,      t_done, 0, true, { DS, Gv, Mp }, 0, s1W2W3R }, // Or VEX
1325   { e_No_Entry, t_grp, Grp11, true, { Eb, Ib, Zz }, 0, s1W2R },
1326   { e_No_Entry, t_grp, Grp11, true, { Ev, Iz, Zz }, 0, s1W2R },
1327   /* C8 */
1328   { e_enter,   t_done, 0, false, { Iw, Ib, Zz }, 0, s1R2R | (fENTER << FPOS) },
1329   { e_leave,   t_done, 0, false, { Zz, Zz, Zz }, 0, fLEAVE << FPOS },
1330   { e_ret_far, t_done, 0, false, { Iw, Zz, Zz }, (IS_RETF | IS_RETC), s1R | (fFARRET << FPOS) },
1331   { e_ret_far, t_done, 0, false, { Zz, Zz, Zz }, (IS_RETF), fFARRET << FPOS },
1332   { e_int3,   t_done, 0, false, { Zz, Zz, Zz }, 0, sNONE },
1333   { e_int,     t_done, 0, false, { Ib, Zz, Zz }, 0, s1R },
1334   { e_into,    t_done, 0, false, { Zz, Zz, Zz }, 0, sNONE },
1335   { e_iret,    t_done, 0, false, { Zz, Zz, Zz }, (IS_RET), fIRET << FPOS},
1336   /* D0 */
1337   { e_No_Entry, t_grp, Grp2, true, { Eb, ImplImm, Zz }, 0, s1RW2R }, // const1
1338   { e_No_Entry, t_grp, Grp2, true, { Ev, ImplImm, Zz }, 0, s1RW2R }, // --"--
1339   { e_No_Entry, t_grp, Grp2, true, { Eb, CL, Zz }, 0, s1RW2R },
1340   { e_No_Entry, t_grp, Grp2, true, { Ev, CL, Zz }, 0, s1RW2R },
1341   { e_aam,  t_done, 0, false, { AX, Ib, Zz }, 0, s1RW2R },
1342   { e_aad,  t_done, 0, false, { AX, Ib, Zz }, 0, s1RW2R },
1343   { e_salc, t_done, 0, false, { Zz, Zz, Zz }, 0, sNONE }, // undocumeted
1344   { e_xlat, t_done, 0, false, { Zz, Zz, Zz }, 0, fXLAT << FPOS }, // scream
1345   /* D8 */
1346   { e_No_Entry, t_coprocEsc, GrpD8, true, { Zz, Zz, Zz }, 0, 0 },
1347   { e_No_Entry, t_coprocEsc, GrpD9, true, { Zz, Zz, Zz }, 0, 0 },
1348   { e_No_Entry, t_coprocEsc, GrpDA, true, { Zz, Zz, Zz }, 0, 0 },
1349   { e_No_Entry, t_coprocEsc, GrpDB, true, { Zz, Zz, Zz }, 0, 0 },
1350   { e_No_Entry, t_coprocEsc, GrpDC, true, { Zz, Zz, Zz }, 0, 0 },
1351   { e_No_Entry, t_coprocEsc, GrpDD, true, { Zz, Zz, Zz }, 0, 0 },
1352   { e_No_Entry, t_coprocEsc, GrpDE, true, { Zz, Zz, Zz }, 0, 0 },
1353   { e_No_Entry, t_coprocEsc, GrpDF, true, { Zz, Zz, Zz }, 0, 0 },
1354   /* E0 */
1355   { e_loopn,    t_done, 0, false, { Jb, eCX, Zz }, (IS_JCC | REL_B), s1R2R }, 
1356   { e_loope,    t_done, 0, false, { Jb, eCX, Zz }, (IS_JCC | REL_B), s1R2R },
1357   { e_loop,     t_done, 0, false, { Jb, eCX, Zz }, (IS_JCC | REL_B), s1R2R },
1358   { e_jcxz_jec, t_done, 0, false, { Jb, eCX, Zz }, (IS_JCC | REL_B), s1R2R },
1359   { e_in,       t_done, 0, false, { AL, Ib, Zz }, 0, s1W2R | (fIO << FPOS) },
1360   { e_in,       t_done, 0, false, { eAX, Ib, Zz }, 0, s1W2R | (fIO << FPOS) },
1361   { e_out,      t_done, 0, false, { Ib, AL, Zz }, 0, s1W2R | (fIO << FPOS) },
1362   { e_out,      t_done, 0, false, { Ib, eAX, Zz }, 0, s1W2R | (fIO << FPOS) },
1363   /* E8 */
1364   { e_call, t_done, 0, false, { Jz, Zz, Zz }, (IS_CALL | REL_X), s1R | (fCALL << FPOS) },
1365   { e_jmp,  t_done, 0, false, { Jz, Zz, Zz }, (IS_JUMP | REL_X), s1R },
1366   { e_jmp,  t_done, 0, false, { Ap, Zz, Zz }, (IS_JUMP | PTR_WX), s1R },
1367   { e_jmp,  t_done, 0, false, { Jb, Zz, Zz }, (IS_JUMP | REL_B), s1R },
1368   { e_in,   t_done, 0, false, { AL, DX, Zz }, 0, s1W2R | (fIO << FPOS) },
1369   { e_in,   t_done, 0, false, { eAX, DX, Zz }, 0, s1W2R | (fIO << FPOS) },
1370   { e_out,  t_done, 0, false, { DX, AL, Zz }, 0, s1W2R | (fIO << FPOS) },
1371   { e_out,  t_done, 0, false, { DX, eAX, Zz }, 0, s1W2R | (fIO << FPOS) },
1372   /* F0 */
1373   { e_No_Entry,      t_ill,  0, false, { Zz, Zz, Zz }, 0, 0 }, // PREFIX_INSTR
1374   { e_int1, t_done, 0, false, { Zz, Zz, Zz }, 0, sNONE }, // undocumented
1375   { e_No_Entry, t_prefixedSSE, 3, false, { Zz, Zz, Zz }, 0, 0 },
1376   { e_No_Entry, t_prefixedSSE, 1, false, { Zz, Zz, Zz }, 0, 0 },
1377   { e_hlt,  t_done, 0, false, { Zz, Zz, Zz }, PRVLGD, sNONE },
1378   { e_cmc,  t_done, 0, false, { Zz, Zz, Zz }, 0, sNONE },
1379   { e_No_Entry, t_grp, Grp3a, true, { Zz, Zz, Zz }, 0, sNONE },
1380   { e_No_Entry, t_grp, Grp3b, true, { Zz, Zz, Zz }, 0, sNONE },
1381   /* F8 */
1382   { e_clc, t_done, 0, false, { Zz, Zz, Zz }, 0, sNONE },
1383   { e_stc, t_done, 0, false, { Zz, Zz, Zz }, 0, sNONE },
1384   { e_cli, t_done, 0, false, { Zz, Zz, Zz }, 0, sNONE },
1385   { e_sti, t_done, 0, false, { Zz, Zz, Zz }, 0, sNONE },
1386   { e_cld, t_done, 0, false, { Zz, Zz, Zz }, 0, sNONE },
1387   { e_std, t_done, 0, false, { Zz, Zz, Zz }, 0, sNONE },
1388   { e_No_Entry, t_grp, Grp4, true, { Zz, Zz, Zz }, 0, sNONE },
1389   { e_No_Entry, t_grp, Grp5, true, { Zz, Zz, Zz }, 0, sNONE }
1390 };
1391
1392
1393 // twoByteMap: two byte opcode instructions (first byte is 0x0F)
1394 static ia32_entry twoByteMap[256] = {
1395   /* 00 */
1396   // Syscall/sysret are somewhat hacked
1397   // Syscall on amd64 will also read CS/SS for where to call in 32-bit mode
1398   { e_No_Entry, t_grp, Grp6, true, { Zz, Zz, Zz }, 0, 0 },
1399   { e_No_Entry, t_grp, Grp7, false, { Zz, Zz, Zz }, 0, 0 },
1400   { e_lar,        t_done, 0, true, { Gv, Ew, Zz }, 0, s1W2R | (fSEGDESC << FPOS) },
1401   { e_lsl,        t_done, 0, true, { Gv, Ew, Zz }, 0, s1W2R | (fSEGDESC << FPOS) },
1402   { e_No_Entry,    t_ill, 0, false, { Zz, Zz, Zz }, 0, 0},
1403   { e_syscall,    t_done, 0, false, { eCX, Zz, Zz }, 0, s1W }, // AMD: writes return address to eCX; for liveness, treat as hammering all
1404   { e_clts,       t_done, 0, false, { Zz, Zz, Zz }, 0, sNONE },
1405   { 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
1406   /* 08 */
1407   { e_invd,   t_done, 0, false, { Zz, Zz, Zz }, 0, sNONE }, // only in priviledge 0, so ignored
1408   { e_wbinvd, t_done, 0, false, { Zz, Zz, Zz }, 0, sNONE }, // idem
1409   { e_No_Entry,        t_ill,  0, false, { Zz, Zz, Zz }, 0, 0 },
1410   { e_ud2,    t_ill,  0, 0, { Zz, Zz, Zz }, 0, 0 },
1411   { e_No_Entry,        t_ill,  0, 0, { Zz, Zz, Zz }, 0, 0 },
1412   { e_prefetch_w, t_grp, GrpAMD, true, { Zz, Zz, Zz }, 0, 0 },    // AMD prefetch group
1413   { e_femms,       t_done,  0, false, { Zz, Zz, Zz }, 0, sNONE },  // AMD specific
1414   // semantic is bogus for the 1st operand - but correct for the 2nd,
1415   // which is the only one that can be a memory operand :)
1416   // fixing the 1st operand requires an extra table for the 3dnow instructions...
1417   { e_No_Entry,             t_3dnow, 0, true,  { Pq, Qq, Zz }, 0, s1RW2R }, // AMD 3DNow! suffixes
1418   /* 10 */
1419   { e_No_Entry, t_sse, SSE10, true, { Zz, Zz, Zz }, 0, 0 },
1420   { e_No_Entry, t_sse, SSE11, true, { Zz, Zz, Zz }, 0, 0 },
1421   { e_No_Entry, t_sse, SSE12, true, { Zz, Zz, Zz }, 0, 0 },
1422   { e_No_Entry, t_sse, SSE13, true, { Zz, Zz, Zz }, 0, 0 },
1423   { e_No_Entry, t_sse, SSE14, true, { Zz, Zz, Zz }, 0, 0 },
1424   { e_No_Entry, t_sse, SSE15, true, { Zz, Zz, Zz }, 0, 0 },
1425   { e_No_Entry, t_sse, SSE16, true, { Zz, Zz, Zz }, 0, 0 },
1426   { e_No_Entry, t_sse, SSE17, true, { Zz, Zz, Zz }, 0, 0 },
1427   /* 18 */
1428   { e_No_Entry, t_grp, Grp16, 0, { Zz, Zz, Zz }, 0, 0 },
1429   { 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
1430   { 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?
1431   { e_nop, t_done, 0, true, { Ev, Zz, Zz }, IS_NOP, 0 }, // I think we can...so nullary operand semantics, but consume the
1432   { e_nop, t_done, 0, true, { Ev, Zz, Zz }, IS_NOP, 0 }, // mod/rm byte operand.
1433   { e_nop, t_done, 0, true, { Ev, Zz, Zz }, IS_NOP, 0 }, // -- BW 1/08
1434   { e_nop, t_done, 0, true, { Ev, Zz, Zz }, IS_NOP, 0 },
1435   { e_nop, t_done, 0, true, { Ev, Zz, Zz }, IS_NOP, 0 },
1436   /* 20 */
1437   { e_mov, t_done, 0, true, { Rd, Cd, Zz }, 0, s1W2R },
1438   { e_mov, t_done, 0, true, { Rd, Dd, Zz }, 0, s1W2R },
1439   { e_mov, t_done, 0, true, { Cd, Rd, Zz }, 0, s1W2R },
1440   { e_mov, t_done, 0, true, { Dd, Rd, Zz }, 0, s1W2R },
1441   { e_mov, t_done, 0, true, { Rd, Td, Zz }, 0, s1W2R }, // actually a SSE5A
1442   { e_No_Entry,     t_ill,  0, 0, { Zz, Zz, Zz }, 0, 0 }, // SSE5A
1443   { e_mov, t_done, 0, true, { Td, Rd, Zz }, 0, s1W2R },
1444   { e_No_Entry,     t_ill,  0, 0, { Zz, Zz, Zz }, 0, 0 },
1445   /* 28 */
1446   { e_No_Entry, t_sse, SSE28, true, { Zz, Zz, Zz }, 0, 0 },
1447   { e_No_Entry, t_sse, SSE29, true, { Zz, Zz, Zz }, 0, 0 },
1448   { e_No_Entry, t_sse, SSE2A, true, { Zz, Zz, Zz }, 0, 0 },
1449   { e_No_Entry, t_sse, SSE2B, true, { Zz, Zz, Zz }, 0, 0 },
1450   { e_No_Entry, t_sse, SSE2C, true, { Zz, Zz, Zz }, 0, 0 },
1451   { e_No_Entry, t_sse, SSE2D, true, { Zz, Zz, Zz }, 0, 0 },
1452   { e_No_Entry, t_sse, SSE2E, true, { Zz, Zz, Zz }, 0, 0 },
1453   { e_No_Entry, t_sse, SSE2F, true, { Zz, Zz, Zz }, 0, 0 },
1454   /* 30 */
1455   { e_wrmsr, t_done, 0, false, { rAX, rDX, rCX }, 0, s1R2R3R },
1456   { e_rdtsc, t_done, 0, false, { rAX, rDX, Zz }, 0, s1W2W3R },
1457   { e_rdmsr, t_done, 0, false, { rAX, rDX, rCX }, 0, s1W2W3R },
1458   { e_rdpmc, t_done, 0, false, { rAX, rDX, rCX }, 0, s1W2W3R },
1459   { e_sysenter, t_done, 0, false, { Zz, Zz, Zz }, 0, sNONE }, // XXX: fixme for kernel work
1460   { e_sysexit,  t_done, 0, false, { Zz, Zz, Zz }, 0, sNONE }, // XXX: fixme for kernel work
1461   { e_No_Entry, t_ill, 0, 0, { Zz, Zz, Zz }, 0, 0 }, 
1462   { e_No_Entry, t_ill, 0, 0, { Zz, Zz, Zz }, 0 ,0 },
1463   /* 38 */
1464   { e_No_Entry, t_threeB, 0, 0, { Zz, Zz, Zz }, 0, 0 }, //3-Byte escape (Book Table A-4)
1465   { e_No_Entry, t_ill, 0, 0, { Zz, Zz, Zz }, 0 ,0 },
1466   { e_No_Entry, t_threeB2, 0, 0, { Zz, Zz, Zz }, 0, 0 }, //3-Byte escape (Book Table A-5)
1467   { e_No_Entry, t_ill, 0, 0, { Zz, Zz, Zz }, 0 ,0 },
1468   { e_No_Entry, t_ill, 0, 0, { Zz, Zz, Zz }, 0 ,0 },
1469   { e_No_Entry, t_ill, 0, 0, { Zz, Zz, Zz }, 0 ,0 },
1470   { e_No_Entry, t_ill, 0, 0, { Zz, Zz, Zz }, 0 ,0 },
1471   { e_No_Entry, t_ill, 0, 0, { Zz, Zz, Zz }, 0 ,0 },
1472   /* 40 */
1473   { e_cmovo,   t_done, 0, true, { Gv, Ev, Zz }, 0, s1RW2R | (fCOND << FPOS) },
1474   { e_cmovno,  t_done, 0, true, { Gv, Ev, Zz }, 0, s1RW2R | (fCOND << FPOS) },
1475   { e_cmovnae, t_done, 0, true, { Gv, Ev, Zz }, 0, s1RW2R | (fCOND << FPOS) },
1476   { e_cmovnb,  t_done, 0, true, { Gv, Ev, Zz }, 0, s1RW2R | (fCOND << FPOS) },
1477   { e_cmove,   t_done, 0, true, { Gv, Ev, Zz }, 0, s1RW2R | (fCOND << FPOS) },
1478   { e_cmovne,  t_done, 0, true, { Gv, Ev, Zz }, 0, s1RW2R | (fCOND << FPOS) },
1479   { e_cmovbe,  t_done, 0, true, { Gv, Ev, Zz }, 0, s1RW2R | (fCOND << FPOS) },
1480   { e_cmovnbe, t_done, 0, true, { Gv, Ev, Zz }, 0, s1RW2R | (fCOND << FPOS) },
1481   /* 48 */
1482   { e_cmovs,   t_done, 0, true, { Gv, Ev, Zz }, 0, s1RW2R | (fCOND << FPOS) },
1483   { e_cmovns,  t_done, 0, true, { Gv, Ev, Zz }, 0, s1RW2R | (fCOND << FPOS) },
1484   { e_cmovpe,  t_done, 0, true, { Gv, Ev, Zz }, 0, s1RW2R | (fCOND << FPOS) },
1485   { e_cmovpo,  t_done, 0, true, { Gv, Ev, Zz }, 0, s1RW2R | (fCOND << FPOS) },
1486   { e_cmovnge, t_done, 0, true, { Gv, Ev, Zz }, 0, s1RW2R | (fCOND << FPOS) },
1487   { e_cmovnl,  t_done, 0, true, { Gv, Ev, Zz }, 0, s1RW2R | (fCOND << FPOS) },
1488   { e_cmovng,  t_done, 0, true, { Gv, Ev, Zz }, 0, s1RW2R | (fCOND << FPOS) },
1489   { e_cmovnl,  t_done, 0, true, { Gv, Ev, Zz }, 0, s1RW2R | (fCOND << FPOS) },
1490   /* 50 */
1491   { e_No_Entry, t_sse, SSE50, true, { Zz, Zz, Zz }, 0, 0 },
1492   { e_No_Entry, t_sse, SSE51, true, { Zz, Zz, Zz }, 0, 0 },
1493   { e_No_Entry, t_sse, SSE52, true, { Zz, Zz, Zz }, 0, 0 },
1494   { e_No_Entry, t_sse, SSE53, true, { Zz, Zz, Zz }, 0, 0 },
1495   { e_No_Entry, t_sse, SSE54, true, { Zz, Zz, Zz }, 0, 0 },
1496   { e_No_Entry, t_sse, SSE55, true, { Zz, Zz, Zz }, 0, 0 },
1497   { e_No_Entry, t_sse, SSE56, true, { Zz, Zz, Zz }, 0, 0 },
1498   { e_No_Entry, t_sse, SSE57, true, { Zz, Zz, Zz }, 0, 0 },
1499   /* 58 */
1500   { e_No_Entry, t_sse, SSE58, true, { Zz, Zz, Zz }, 0, 0 },
1501   { e_No_Entry, t_sse, SSE59, true, { Zz, Zz, Zz }, 0, 0 },
1502   { e_No_Entry, t_sse, SSE5A, true, { Zz, Zz, Zz }, 0, 0 },
1503   { e_No_Entry, t_sse, SSE5B, true, { Zz, Zz, Zz }, 0, 0 },
1504   { e_No_Entry, t_sse, SSE5C, true, { Zz, Zz, Zz }, 0, 0 },
1505   { e_No_Entry, t_sse, SSE5D, true, { Zz, Zz, Zz }, 0, 0 },
1506   { e_No_Entry, t_sse, SSE5E, true, { Zz, Zz, Zz }, 0, 0 },
1507   { e_No_Entry, t_sse, SSE5F, true, { Zz, Zz, Zz }, 0, 0 },
1508   /* 60 */
1509   { e_No_Entry, t_sse, SSE60, true, { Zz, Zz, Zz }, 0, 0 },
1510   { e_No_Entry, t_sse, SSE61, true, { Zz, Zz, Zz }, 0, 0 },
1511   { e_No_Entry, t_sse, SSE62, true, { Zz, Zz, Zz }, 0, 0 },
1512   { e_No_Entry, t_sse, SSE63, true, { Zz, Zz, Zz }, 0, 0 },
1513   { e_No_Entry, t_sse, SSE64, true, { Zz, Zz, Zz }, 0, 0 },
1514   { e_No_Entry, t_sse, SSE65, true, { Zz, Zz, Zz }, 0, 0 },
1515   { e_No_Entry, t_sse, SSE66, true, { Zz, Zz, Zz }, 0, 0 },
1516   { e_No_Entry, t_sse, SSE67, true, { Zz, Zz, Zz }, 0, 0 },
1517   /* 68 */
1518   { e_No_Entry, t_sse, SSE68, true, { Zz, Zz, Zz }, 0, 0 },
1519   { e_No_Entry, t_sse, SSE69, true, { Zz, Zz, Zz }, 0, 0 },
1520   { e_No_Entry, t_sse, SSE6A, true, { Zz, Zz, Zz }, 0, 0 },
1521   { e_No_Entry, t_sse, SSE6B, true, { Zz, Zz, Zz }, 0, 0 },
1522   { e_No_Entry, t_sse, SSE6C, true, { Zz, Zz, Zz }, 0, 0 },
1523   { e_No_Entry, t_sse, SSE6D, true, { Zz, Zz, Zz }, 0, 0 },
1524   { e_No_Entry, t_sse, SSE6E, true, { Zz, Zz, Zz }, 0, 0 },
1525   { e_No_Entry, t_sse, SSE6F, true, { Zz, Zz, Zz }, 0, 0 },
1526   /* 70 */
1527   { e_No_Entry, t_sse, SSE70, true, { Zz, Zz, Zz }, 0, 0 },
1528   { e_No_Entry, t_grp, Grp12, false, { Zz, Zz, Zz }, 0, 0 },
1529   { e_No_Entry, t_grp, Grp13, false, { Zz, Zz, Zz }, 0, 0 },
1530   { e_No_Entry, t_grp, Grp14, false, { Zz, Zz, Zz }, 0, 0 },
1531   { e_No_Entry, t_sse, SSE74, true, { Zz, Zz, Zz }, 0, 0 },
1532   { e_No_Entry, t_sse, SSE75, true, { Zz, Zz, Zz }, 0, 0 },
1533   { e_No_Entry, t_sse, SSE76, true, { Zz, Zz, Zz }, 0, 0 },
1534   { e_vzeroall, t_done, 0, false, { Zz, Zz, Zz }, 0, sNONE },
1535   /* 78 */
1536   { e_No_Entry, t_sse, SSE78, 0, { Zz, Zz, Zz }, 0, 0 },
1537   { e_No_Entry, t_sse, SSE79, 0, { Zz, Zz, Zz }, 0, 0 },
1538   { e_No_Entry, t_ill, 0, 0, { Zz, Zz, Zz }, 0, 0 }, // SSE5A will go in 7A and 7B when it comes out
1539   { e_No_Entry, t_ill, 0, 0, { Zz, Zz, Zz }, 0, 0 },
1540   { e_No_Entry, t_sse, SSE7C, 0, { Zz, Zz, Zz }, 0, 0 },
1541   { e_No_Entry, t_sse, SSE7D, 0, { Zz, Zz, Zz }, 0, 0 },
1542   { e_No_Entry, t_sse, SSE7E, 0, { Zz, Zz, Zz }, 0, 0 },
1543   { e_No_Entry, t_sse, SSE7F, 0, { Zz, Zz, Zz }, 0, 0 },
1544   /* 80 */
1545   { e_jo,   t_done, 0, false, { Jz, Zz, Zz }, (IS_JCC | REL_X), s1R | (fCOND << FPOS) },
1546   { e_jno,  t_done, 0, false, { Jz, Zz, Zz }, (IS_JCC | REL_X), s1R | (fCOND << FPOS) },
1547   { e_jb,   t_done, 0, false, { Jz, Zz, Zz }, (IS_JCC | REL_X), s1R | (fCOND << FPOS) },
1548   { e_jnb,  t_done, 0, false, { Jz, Zz, Zz }, (IS_JCC | REL_X), s1R | (fCOND << FPOS) },
1549   { e_jz,   t_done, 0, false, { Jz, Zz, Zz }, (IS_JCC | REL_X), s1R | (fCOND << FPOS) },
1550   { e_jnz,  t_done, 0, false, { Jz, Zz, Zz }, (IS_JCC | REL_X), s1R | (fCOND << FPOS) },
1551   { e_jbe,  t_done, 0, false, { Jz, Zz, Zz }, (IS_JCC | REL_X), s1R | (fCOND << FPOS) },
1552   { e_jnbe, t_done, 0, false, { Jz, Zz, Zz }, (IS_JCC | REL_X), s1R | (fCOND << FPOS) },
1553   /* 88 */
1554   { e_js,   t_done, 0, false, { Jz, Zz, Zz }, (IS_JCC | REL_X), s1R | (fCOND << FPOS) },
1555   { e_jns,  t_done, 0, false, { Jz, Zz, Zz }, (IS_JCC | REL_X), s1R | (fCOND << FPOS) },
1556   { e_jp,   t_done, 0, false, { Jz, Zz, Zz }, (IS_JCC | REL_X), s1R | (fCOND << FPOS) },
1557   { e_jnp,  t_done, 0, false, { Jz, Zz, Zz }, (IS_JCC | REL_X), s1R | (fCOND << FPOS) },
1558   { e_jl,   t_done, 0, false, { Jz, Zz, Zz }, (IS_JCC | REL_X), s1R | (fCOND << FPOS) },
1559   { e_jnl,  t_done, 0, false, { Jz, Zz, Zz }, (IS_JCC | REL_X), s1R | (fCOND << FPOS) },
1560   { e_jle,  t_done, 0, false, { Jz, Zz, Zz }, (IS_JCC | REL_X), s1R | (fCOND << FPOS) },
1561   { e_jnle, t_done, 0, false, { Jz, Zz, Zz }, (IS_JCC | REL_X), s1R | (fCOND << FPOS) },
1562   /* 90 */
1563   { e_seto,   t_done, 0, true, { Eb, Zz, Zz }, 0, s1W | (fCOND << FPOS) },
1564   { e_setno,  t_done, 0, true, { Eb, Zz, Zz }, 0, s1W | (fCOND << FPOS) },
1565   { e_setb,   t_done, 0, true, { Eb, Zz, Zz }, 0, s1W | (fCOND << FPOS) },
1566   { e_setnb,  t_done, 0, true, { Eb, Zz, Zz }, 0, s1W | (fCOND << FPOS) },
1567   { e_setz,   t_done, 0, true, { Eb, Zz, Zz }, 0, s1W | (fCOND << FPOS) },
1568   { e_setnz,  t_done, 0, true, { Eb, Zz, Zz }, 0, s1W | (fCOND << FPOS) },
1569   { e_setbe,  t_done, 0, true, { Eb, Zz, Zz }, 0, s1W | (fCOND << FPOS) },
1570   { e_setnbe, t_done, 0, true, { Eb, Zz, Zz }, 0, s1W | (fCOND << FPOS) },
1571   /* 98 */
1572   { e_sets,   t_done, 0, true, { Eb, Zz, Zz }, 0, s1W | (fCOND << FPOS) },
1573   { e_setns,  t_done, 0, true, { Eb, Zz, Zz }, 0, s1W | (fCOND << FPOS) },
1574   { e_setp,   t_done, 0, true, { Eb, Zz, Zz }, 0, s1W | (fCOND << FPOS) },
1575   { e_setnp,  t_done, 0, true, { Eb, Zz, Zz }, 0, s1W | (fCOND << FPOS) },
1576   { e_setl,   t_done, 0, true, { Eb, Zz, Zz }, 0, s1W | (fCOND << FPOS) },
1577   { e_setnl,  t_done, 0, true, { Eb, Zz, Zz }, 0, s1W | (fCOND << FPOS) },
1578   { e_setle,  t_done, 0, true, { Eb, Zz, Zz }, 0, s1W | (fCOND << FPOS) },
1579   { e_setnle, t_done, 0, true, { Eb, Zz, Zz }, 0, s1W | (fCOND << FPOS) },
1580   /* A0 */
1581   { e_push,   t_done, 0, false, { FS, eSP, Zz }, 0, s1R2RW },
1582   { e_pop,    t_done, 0, false, { FS, eSP, Zz }, 0, s1W2RW },
1583   { e_cpuid,  t_done, 0, false, { Zz, Zz, Zz }, 0, sNONE },
1584   { e_bt,     t_done, 0, true, { Ev, Gv, Zz }, 0, s1R2R },
1585   { e_shld,   t_done, 0, true, { Ev, Gv, Ib }, 0, s1RW2R3R },
1586   { e_shld,   t_done, 0, true, { Ev, Gv, CL }, 0, s1RW2R3R },
1587   { e_No_Entry, t_ill, 0, 0, { Zz, Zz, Zz }, 0, 0 }, 
1588   { e_No_Entry, t_ill, 0, 0, { Zz, Zz, Zz }, 0, 0 },
1589   /* A8 */
1590   { e_push, t_done, 0, false, { GS, eSP, Zz }, 0, s1R2RW },
1591   { e_pop,  t_done, 0, false, { GS, eSP, Zz }, 0, s1W2RW },
1592   { e_rsm,  t_done, 0, false, { Zz, Zz, Zz }, 0, sNONE },
1593   { e_bts,  t_done, 0, true, { Ev, Gv, Zz }, 0, s1RW2R },
1594   { e_shrd, t_done, 0, true, { Ev, Gv, Ib }, 0, s1RW2R3R },
1595   { e_shrd, t_done, 0, true, { Ev, Gv, CL }, 0, s1RW2R3R },
1596   { e_No_Entry, t_grp, Grp15, 0, { Zz, Zz, Zz }, 0, 0 }, 
1597   { e_imul, t_done, 0, true, { Gv, Ev, Zz }, 0, s1RW2R },
1598   /* B0 */
1599   // Assuming this is used with LOCK prefix, the destination gets a write anyway
1600   // This is not the case without lock prefix, but I ignore that case
1601   // Also, given that the 3rd operand is a register I ignore that it may be written
1602   { e_cmpxch, t_done, 0, true, { Eb, Gb, AL }, 0, s1RW2R3R | (fCMPXCH << FPOS) },
1603   { e_cmpxch, t_done, 0, true, { Ev, Gv, eAX }, 0, s1RW2R3R | (fCMPXCH << FPOS) },
1604   { e_lss, t_done, 0, true, { SS, Gv, Mp }, 0, s1W2W3R },
1605   { e_btr, t_done, 0, true, { Ev, Gv, Zz }, 0, s1RW2R },
1606   { e_lfs, t_done, 0, true, { FS, Gv, Mp }, 0, s1W2W3R },
1607   { e_lgs, t_done, 0, true, { GS, Gv, Mp }, 0, s1W2W3R },
1608   { e_movzx, t_done, 0, true, { Gv, Eb, Zz }, 0, s1W2R },
1609   { e_movzx, t_done, 0, true, { Gv, Ew, Zz }, 0, s1W2R },
1610   /* B8 */
1611   { e_No_Entry, t_sse, SSEB8, 0, { Zz, Zz, Zz }, 0, 0 },
1612   { e_ud2grp10, t_ill, 0, 0, { Zz, Zz, Zz }, 0, sNONE },
1613   { e_No_Entry, t_grp, Grp8, true, { Zz, Zz, Zz }, 0, 0 },
1614   { e_btc, t_done, 0, true, { Ev, Gv, Zz }, 0, s1RW2R },
1615   { e_bsf, t_done, 0, true, { Gv, Ev, Zz }, 0, s1W2R },
1616   { e_bsr, t_done, 0, true, { Gv, Ev, Zz }, 0, s1W2R },
1617   { e_movsx, t_done, 0, true, { Gv, Eb, Zz }, 0, s1W2R },
1618   { e_movsx, t_done, 0, true, { Gv, Ew, Zz }, 0, s1W2R },
1619   /* C0 */
1620   { e_xadd, t_done, 0, true, { Eb, Gb, Zz }, 0, s1RW2RW },
1621   { e_xadd, t_done, 0, true, { Ev, Gv, Zz }, 0, s1RW2RW },
1622   { e_No_Entry, t_sse, SSEC2, true, { Zz, Zz, Zz }, 0, 0 },
1623   { e_movnti , t_done, 0, true, { Ev, Gv, Zz }, 0, s1W2R | (fNT << FPOS) },
1624   { e_No_Entry, t_sse, SSEC4, true, { Zz, Zz, Zz }, 0, 0 },
1625   { e_No_Entry, t_sse, SSEC5, true, { Zz, Zz, Zz }, 0, 0 },
1626   { e_No_Entry, t_sse, SSEC6, true, { Zz, Zz, Zz }, 0, 0 },
1627   { e_No_Entry, t_grp, Grp9,  true, { Zz, Zz, Zz }, 0, 0 },
1628   /* C8 */
1629   { e_bswap, t_done, 0, false, { EAX, Zz, Zz }, 0, s1RW }, 
1630   { e_bswap, t_done, 0, false, { ECX, Zz, Zz }, 0, s1RW },
1631   { e_bswap, t_done, 0, false, { EDX, Zz, Zz }, 0, s1RW }, 
1632   { e_bswap, t_done, 0, false, { EBX, Zz, Zz }, 0, s1RW }, 
1633   { e_bswap, t_done, 0, false, { ESP, Zz, Zz }, 0, s1RW },
1634   { e_bswap, t_done, 0, false, { EBP, Zz, Zz }, 0, s1RW }, 
1635   { e_bswap, t_done, 0, false, { ESI, Zz, Zz }, 0, s1RW }, 
1636   { e_bswap, t_done, 0, false, { EDI, Zz, Zz }, 0, s1RW }, 
1637   /* D0 */
1638   { e_No_Entry, t_sse, SSED0, false, { Zz, Zz, Zz }, 0, 0 },
1639   { e_No_Entry, t_sse, SSED1, true, { Zz, Zz, Zz }, 0, 0 },
1640   { e_No_Entry, t_sse, SSED2, true, { Zz, Zz, Zz }, 0, 0 },
1641   { e_No_Entry, t_sse, SSED3, true, { Zz, Zz, Zz }, 0, 0 },
1642   { e_No_Entry, t_sse, SSED4, true, { Zz, Zz, Zz }, 0, 0 },
1643   { e_No_Entry, t_sse, SSED5, true, { Zz, Zz, Zz }, 0, 0 },
1644   { e_No_Entry, t_sse, SSED6, true, { Zz, Zz, Zz }, 0, 0 },
1645   { e_No_Entry, t_sse, SSED7, true, { Zz, Zz, Zz }, 0, 0 },
1646   /* D8 */
1647   { e_No_Entry, t_sse, SSED8, true, { Zz, Zz, Zz }, 0, 0 },
1648   { e_No_Entry, t_sse, SSED9, true, { Zz, Zz, Zz }, 0, 0 },
1649   { e_No_Entry, t_sse, SSEDA, true, { Zz, Zz, Zz }, 0, 0 },
1650   { e_No_Entry, t_sse, SSEDB, true, { Zz, Zz, Zz }, 0, 0 },
1651   { e_No_Entry, t_sse, SSEDC, true, { Zz, Zz, Zz }, 0, 0 },
1652   { e_No_Entry, t_sse, SSEDD, true, { Zz, Zz, Zz }, 0, 0 },
1653   { e_No_Entry, t_sse, SSEDE, true, { Zz, Zz, Zz }, 0, 0 },
1654   { e_No_Entry, t_sse, SSEDF, true, { Zz, Zz, Zz }, 0, 0 },
1655   /* E0 */
1656   { e_No_Entry, t_sse, SSEE0, true, { Zz, Zz, Zz }, 0, 0 },
1657   { e_No_Entry, t_sse, SSEE1, true, { Zz, Zz, Zz }, 0, 0 },
1658   { e_No_Entry, t_sse, SSEE2, true, { Zz, Zz, Zz }, 0, 0 },
1659   { e_No_Entry, t_sse, SSEE3, true, { Zz, Zz, Zz }, 0, 0 },
1660   { e_No_Entry, t_sse, SSEE4, true, { Zz, Zz, Zz }, 0, 0 },
1661   { e_No_Entry, t_sse, SSEE5, true, { Zz, Zz, Zz }, 0, 0 },
1662   { e_No_Entry, t_sse, SSEE6, true, { Zz, Zz, Zz }, 0, 0 },
1663   { e_No_Entry, t_sse, SSEE7, true, { Zz, Zz, Zz }, 0, 0 },
1664   /* E8 */
1665   { e_No_Entry, t_sse, SSEE8, true, { Zz, Zz, Zz }, 0, 0 },
1666   { e_No_Entry, t_sse, SSEE9, true, { Zz, Zz, Zz }, 0, 0 },
1667   { e_No_Entry, t_sse, SSEEA, true, { Zz, Zz, Zz }, 0, 0 },
1668   { e_No_Entry, t_sse, SSEEB, true, { Zz, Zz, Zz }, 0, 0 },
1669   { e_No_Entry, t_sse, SSEEC, true, { Zz, Zz, Zz }, 0, 0 },
1670   { e_No_Entry, t_sse, SSEED, true, { Zz, Zz, Zz }, 0, 0 },
1671   { e_No_Entry, t_sse, SSEEE, true, { Zz, Zz, Zz }, 0, 0 },
1672   { e_No_Entry, t_sse, SSEEF, true, { Zz, Zz, Zz }, 0, 0 },
1673   /* F0 */
1674   { e_No_Entry, t_sse, SSEF0, false, { Zz, Zz, Zz }, 0, 0 },
1675   { e_No_Entry, t_sse, SSEF1, true, { Zz, Zz, Zz }, 0, 0 },
1676   { e_No_Entry, t_sse, SSEF2, true, { Zz, Zz, Zz }, 0, 0 },
1677   { e_No_Entry, t_sse, SSEF3, true, { Zz, Zz, Zz }, 0, 0 },
1678   { e_No_Entry, t_sse, SSEF4, true, { Zz, Zz, Zz }, 0, 0 },
1679   { e_No_Entry, t_sse, SSEF5, true, { Zz, Zz, Zz }, 0, 0 },
1680   { e_No_Entry, t_sse, SSEF6, true, { Zz, Zz, Zz }, 0, 0 },
1681   { e_No_Entry, t_sse, SSEF7, true, { Zz, Zz, Zz }, 0, 0 },
1682   /* F8 */
1683   { e_No_Entry, t_sse, SSEF8, true, { Zz, Zz, Zz }, 0, 0 },
1684   { e_No_Entry, t_sse, SSEF9, true, { Zz, Zz, Zz }, 0, 0 },
1685   { e_No_Entry, t_sse, SSEFA, true, { Zz, Zz, Zz }, 0, 0 },
1686   { e_No_Entry, t_sse, SSEFB, true, { Zz, Zz, Zz }, 0, 0 },
1687   { e_No_Entry, t_sse, SSEFC, true, { Zz, Zz, Zz }, 0, 0 },
1688   { e_No_Entry, t_sse, SSEFD, true, { Zz, Zz, Zz }, 0, 0 },
1689   { e_No_Entry, t_sse, SSEFE, true, { Zz, Zz, Zz }, 0, 0 },
1690   { e_No_Entry, t_sse, SSEFF, false, { Zz, Zz, Zz }, 0, 0 }
1691 };
1692
1693 static ia32_entry threeByteMap[256] = {
1694                 /* 00 */
1695                 { e_No_Entry, t_sse_bis, SSEB00, true, { Zz, Zz, Zz }, 0, 0 },
1696                 { e_No_Entry, t_sse_bis, SSEB01, true, { Zz, Zz, Zz }, 0, 0 },
1697                 { e_No_Entry, t_sse_bis, SSEB02, true, { Zz, Zz, Zz }, 0, 0 },
1698                 { e_No_Entry, t_sse_bis, SSEB03, true, { Zz, Zz, Zz }, 0, 0 },
1699                 { e_No_Entry, t_sse_bis, SSEB04, true, { Zz, Zz, Zz }, 0, 0 },
1700                 { e_No_Entry, t_sse_bis, SSEB05, true, { Zz, Zz, Zz }, 0, 0 },
1701                 { e_No_Entry, t_sse_bis, SSEB06, true, { Zz, Zz, Zz }, 0, 0 },
1702                 { e_No_Entry, t_sse_bis, SSEB07, true, { Zz, Zz, Zz }, 0, 0 },
1703                 /* 08*/
1704                 { e_No_Entry, t_sse_bis, SSEB08, true, { Zz, Zz, Zz }, 0, 0 },
1705                 { e_No_Entry, t_sse_bis, SSEB09, true, { Zz, Zz, Zz }, 0, 0 },
1706                 { e_No_Entry, t_sse_bis, SSEB0A, true, { Zz, Zz, Zz }, 0, 0 },
1707                 { e_No_Entry, t_sse_bis, SSEB0B, true, { Zz, Zz, Zz }, 0, 0 },
1708                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1709                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1710                 { e_vtestps, t_done, 0, false, { Zz, Zz, Zz }, 0, sNONE },
1711                 { e_vtestpd, t_done, 0, false, { Zz, Zz, Zz }, 0, sNONE },
1712                 /* 10 */
1713                 { e_No_Entry, t_sse_bis, SSEB10, true, { Zz, Zz, Zz }, 0, 0 },
1714                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1715                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1716                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1717                 { e_No_Entry, t_sse_bis, SSEB14, true, { Zz, Zz, Zz }, 0, 0 },
1718                 { e_No_Entry, t_sse_bis, SSEB15, true, { Zz, Zz, Zz }, 0, 0 },
1719                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1720                 { e_No_Entry, t_sse_bis, SSEB17, true, { Zz, Zz, Zz }, 0, 0 },
1721                 /* 18 */
1722                 { e_No_Entry, t_sse_bis, SSEB18, true, { Zz, Zz, Zz }, 0, 0 },
1723                 { e_No_Entry, t_sse_bis, SSEB19, true, { Zz, Zz, Zz }, 0, 0 },
1724                 { e_No_Entry, t_sse_bis, SSEB1A, false, { Zz, Zz, Zz }, 0, 0 },
1725                 { e_No_Entry, t_sse_bis, SSEB1B, false, { Zz, Zz, Zz }, 0, 0 },
1726                 { e_No_Entry, t_sse_bis, SSEB1C, true, { Zz, Zz, Zz }, 0, 0 },
1727                 { e_No_Entry, t_sse_bis, SSEB1D, true, { Zz, Zz, Zz }, 0, 0 },
1728                 { e_No_Entry, t_sse_bis, SSEB1E, true, { Zz, Zz, Zz }, 0, 0 },
1729                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1730                 /* 20 */
1731                 { e_No_Entry, t_sse_bis, SSEB20, true, { Zz, Zz, Zz }, 0, 0 },
1732                 { e_No_Entry, t_sse_bis, SSEB21, true, { Zz, Zz, Zz }, 0, 0 },
1733                 { e_No_Entry, t_sse_bis, SSEB22, true, { Zz, Zz, Zz }, 0, 0 },
1734                 { e_No_Entry, t_sse_bis, SSEB23, true, { Zz, Zz, Zz }, 0, 0 },
1735                 { e_No_Entry, t_sse_bis, SSEB24, true, { Zz, Zz, Zz }, 0, 0 },
1736                 { e_No_Entry, t_sse_bis, SSEB25, true, { Zz, Zz, Zz }, 0, 0 },
1737                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1738                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1739                 /* 28 */
1740                 { e_No_Entry, t_sse_bis, SSEB28, true, { Zz, Zz, Zz }, 0, 0 },
1741                 { e_No_Entry, t_sse_bis, SSEB29, true, { Zz, Zz, Zz }, 0, 0 },
1742                 { e_No_Entry, t_sse_bis, SSEB2A, true, { Zz, Zz, Zz }, 0, 0 },
1743                 { e_No_Entry, t_sse_bis, SSEB2B, true, { Zz, Zz, Zz }, 0, 0 },
1744                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1745                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1746                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1747                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1748                 /* 30 */
1749                 { e_No_Entry, t_sse_bis, SSEB30, true, { Zz, Zz, Zz }, 0, 0 },
1750                 { e_No_Entry, t_sse_bis, SSEB31, true, { Zz, Zz, Zz }, 0, 0 },
1751                 { e_No_Entry, t_sse_bis, SSEB32, true, { Zz, Zz, Zz }, 0, 0 },
1752                 { e_No_Entry, t_sse_bis, SSEB33, true, { Zz, Zz, Zz }, 0, 0 },
1753                 { e_No_Entry, t_sse_bis, SSEB34, true, { Zz, Zz, Zz }, 0, 0 },
1754                 { e_No_Entry, t_sse_bis, SSEB35, true, { Zz, Zz, Zz }, 0, 0 },
1755                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1756                 { e_No_Entry, t_sse_bis, SSEB37, true, { Zz, Zz, Zz }, 0, 0 },
1757                 /* 38 */
1758                 { e_No_Entry, t_sse_bis, SSEB38, true, { Zz, Zz, Zz }, 0, 0 },
1759                 { e_No_Entry, t_sse_bis, SSEB39, true, { Zz, Zz, Zz }, 0, 0 },
1760                 { e_No_Entry, t_sse_bis, SSEB3A, true, { Zz, Zz, Zz }, 0, 0 },
1761                 { e_No_Entry, t_sse_bis, SSEB3B, true, { Zz, Zz, Zz }, 0, 0 },
1762                 { e_No_Entry, t_sse_bis, SSEB3C, true, { Zz, Zz, Zz }, 0, 0 },
1763                 { e_No_Entry, t_sse_bis, SSEB3D, true, { Zz, Zz, Zz }, 0, 0 },
1764                 { e_No_Entry, t_sse_bis, SSEB3E, true, { Zz, Zz, Zz }, 0, 0 },
1765                 { e_No_Entry, t_sse_bis, SSEB3F, true, { Zz, Zz, Zz }, 0, 0 },
1766                 /* 40 */
1767                 { e_No_Entry, t_sse_bis, SSEB40, true, { Zz, Zz, Zz }, 0, 0 },
1768                 { e_No_Entry, t_sse_bis, SSEB41, true, { Zz, Zz, Zz }, 0, 0 },
1769                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1770                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1771                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1772                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1773                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1774                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1775                 /* 48 */
1776                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1777                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1778                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1779                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1780                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1781                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1782                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1783                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1784                 /* 50 */
1785                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1786                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1787                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1788                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1789                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1790                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1791                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1792                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1793                 /* 58 */
1794                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1795                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1796                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1797                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1798                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1799                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1800                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1801                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1802                 /* 60 */
1803                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1804                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1805                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1806                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1807                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1808                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1809                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1810                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1811                 /* 68 */
1812                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1813                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1814                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1815                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1816                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1817                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1818                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1819                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1820                 /* 70 */
1821                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1822                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1823                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1824                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1825                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1826                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1827                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1828                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1829                 /* 78 */
1830                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1831                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1832                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1833                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1834                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1835                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1836                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1837                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1838                 /* 80 */
1839                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1840                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1841                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1842                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1843                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1844                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1845                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1846                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1847                 /* 88 */
1848                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1849                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1850                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1851                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1852                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1853                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1854                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1855                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1856                 /* 90 */
1857                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1858                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1859                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1860                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1861                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1862                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1863                 { e_vfmaddsub132pd, t_done, 0, false, { Zz, Zz, Zz }, 0, sNONE },
1864                 { e_vfmsubadd132pd, t_done, 0, false, { Zz, Zz, Zz }, 0, sNONE },
1865                 /* 98 */
1866                 { e_vfmadd132pd, t_done, 0, false, { Zz, Zz, Zz }, 0, sNONE },
1867                 { e_vfmadd132sd, t_done, 0, false, { Zz, Zz, Zz }, 0, sNONE },
1868                 { e_vfmsub132pd, t_done, 0, false, { Zz, Zz, Zz }, 0, sNONE },
1869                 { e_vfmsub132sd, t_done, 0, false, { Zz, Zz, Zz }, 0, sNONE },
1870                 { e_vfnmadd132pd, t_done, 0, false, { Zz, Zz, Zz }, 0, sNONE },
1871                 { e_vfnmadd132sd, t_done, 0, false, { Zz, Zz, Zz }, 0, sNONE },
1872                 { e_vfnmsub132pd, t_done, 0, false, { Zz, Zz, Zz }, 0, sNONE },
1873                 { e_vfnmsub132sd, t_done, 0, false, { Zz, Zz, Zz }, 0, sNONE },
1874                 /* A0 */
1875                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1876                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1877                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1878                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1879                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1880                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1881                 { e_vfmaddsub213pd, t_done, 0, false, { Zz, Zz, Zz }, 0, sNONE },
1882                 { e_vfmsubadd213pd, t_done, 0, false, { Zz, Zz, Zz }, 0, sNONE },
1883                 /* A8 */
1884                 { e_vfmadd213pd, t_done, 0, false, { Zz, Zz, Zz }, 0, sNONE },
1885                 { e_vfmadd213sd, t_done, 0, false, { Zz, Zz, Zz }, 0, sNONE },
1886                 { e_vfmsub213pd, t_done, 0, false, { Zz, Zz, Zz }, 0, sNONE },
1887                 { e_vfmsub213sd, t_done, 0, false, { Zz, Zz, Zz }, 0, sNONE },
1888                 { e_vfnmadd213pd, t_done, 0, false, { Zz, Zz, Zz }, 0, sNONE },
1889                 { e_vfnmadd213sd, t_done, 0, false, { Zz, Zz, Zz }, 0, sNONE },
1890                 { e_vfnmsub213pd, t_done, 0, false, { Zz, Zz, Zz }, 0, sNONE },
1891                 { e_vfnmsub213sd, t_done, 0, false, { Zz, Zz, Zz }, 0, sNONE },
1892                 /* B0 */
1893                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1894                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1895                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1896                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1897                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1898                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1899                 { e_vfmaddsub231pd, t_done, 0, false, { Zz, Zz, Zz }, 0, sNONE },
1900                 { e_vfmsubadd231pd, t_done, 0, false, { Zz, Zz, Zz }, 0, sNONE },       
1901                 /* B8 */
1902                 { e_vfmadd231pd, t_done, 0, false, { Zz, Zz, Zz }, 0, sNONE },
1903                 { e_vfmadd231sd, t_done, 0, false, { Zz, Zz, Zz }, 0, sNONE },
1904                 { e_vfmsub231pd, t_done, 0, false, { Zz, Zz, Zz }, 0, sNONE },
1905                 { e_vfmsub231sd, t_done, 0, false, { Zz, Zz, Zz }, 0, sNONE },
1906                 { e_vfnmadd231pd, t_done, 0, false, { Zz, Zz, Zz }, 0, sNONE },
1907                 { e_vfnmadd231sd, t_done, 0, false, { Zz, Zz, Zz }, 0, sNONE },
1908                 { e_vfnmsub231pd, t_done, 0, false, { Zz, Zz, Zz }, 0, sNONE },
1909                 { e_vfnmsub231sd, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1910                 /* C0 */
1911                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1912                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1913                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1914                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1915                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1916                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1917                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1918                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1919                 /* C8 */
1920                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1921                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1922                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1923                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1924                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1925                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1926                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1927                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1928                 /* D0 */
1929                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1930                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1931                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1932                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1933                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1934                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1935                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1936                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1937                 /* D8 */
1938                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1939                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1940                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1941                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1942                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1943                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1944                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1945                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1946                 /* E0 */
1947                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1948                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1949                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1950                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1951                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1952                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1953                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1954                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1955                 /* E8 */
1956                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1957                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1958                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1959                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1960                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1961                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1962                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1963                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1964                 /* F0 */
1965                 { e_No_Entry, t_sse_bis, SSEBF0, true, { Zz, Zz, Zz }, 0, 0 },
1966                 { e_No_Entry, t_sse_bis, SSEBF1, true, { Zz, Zz, Zz }, 0, 0 },
1967                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1968                 { e_No_Entry, t_grp, Grp17, true, { Zz, Zz, Zz }, 0, 0 },
1969                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1970                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1971                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1972                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1973                 /* F8 */
1974                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1975                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1976                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1977                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1978                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1979                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1980                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1981                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 }
1982 };
1983
1984 static ia32_entry threeByteMap2[256] = {
1985                 /* 00 */
1986                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1987                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1988                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1989                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1990                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1991                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1992                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1993                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
1994                 /* 08*/
1995                 { e_No_Entry, t_sse_ter, SSET08, true, { Zz, Zz, Zz }, 0, 0 },
1996                 { e_No_Entry, t_sse_ter, SSET09, true, { Zz, Zz, Zz }, 0, 0 },
1997                 { e_No_Entry, t_sse_ter, SSET0A, true, { Zz, Zz, Zz }, 0, 0 },
1998                 { e_No_Entry, t_sse_ter, SSET0B, true, { Zz, Zz, Zz }, 0, 0 },
1999                 { e_No_Entry, t_sse_ter, SSET0C, true, { Zz, Zz, Zz }, 0, 0 },
2000                 { e_No_Entry, t_sse_ter, SSET0D, true, { Zz, Zz, Zz }, 0, 0 },
2001                 { e_No_Entry, t_sse_ter, SSET0E, true, { Zz, Zz, Zz }, 0, 0 },
2002                 { e_No_Entry, t_sse_ter, SSET0F, true, { Zz, Zz, Zz }, 0, 0 },
2003                 /* 10 */
2004                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2005                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2006                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2007                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2008                 { e_No_Entry, t_sse_ter, SSET14, true, { Zz, Zz, Zz }, 0, 0 },
2009                 { e_No_Entry, t_sse_ter, SSET15, true, { Zz, Zz, Zz }, 0, 0 },
2010                 { e_No_Entry, t_sse_ter, SSET16, true, { Zz, Zz, Zz }, 0, 0 },
2011                 { e_No_Entry, t_sse_ter, SSET17, true, { Zz, Zz, Zz }, 0, 0 },
2012                 /* 18 */
2013                 { e_No_Entry, t_sse_ter, SSET18, true, { Zz, Zz, Zz }, 0, 0 },
2014                 { e_No_Entry, t_sse_ter, SSET19, true, { Zz, Zz, Zz }, 0, 0 },
2015                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2016                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2017                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2018                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2019                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2020                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2021                 /* 20 */
2022                 { e_No_Entry, t_sse_ter, SSET20, true, { Zz, Zz, Zz }, 0, 0 },
2023                 { e_No_Entry, t_sse_ter, SSET21, true, { Zz, Zz, Zz }, 0, 0 },
2024                 { e_No_Entry, t_sse_ter, SSET22, true, { Zz, Zz, Zz }, 0, 0 },
2025                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2026                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2027                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2028                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2029                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2030                 /* 28 */
2031                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2032                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2033                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2034                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2035                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2036                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2037                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2038                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2039                 /* 30 */
2040                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2041                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2042                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2043                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2044                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2045                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2046                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2047                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2048                 /* 38 */
2049                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2050                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2051                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2052                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2053                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2054                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2055                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2056                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2057                 /* 40 */
2058                 { e_No_Entry, t_sse_ter, SSET40, true, { Zz, Zz, Zz }, 0, 0 },
2059                 { e_No_Entry, t_sse_ter, SSET41, true, { Zz, Zz, Zz }, 0, 0 },
2060                 { e_No_Entry, t_sse_ter, SSET42, true, { Zz, Zz, Zz }, 0, 0 },
2061                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2062                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2063                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2064                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2065                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2066                 /* 48 */
2067                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2068                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2069                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2070                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2071                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2072                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2073                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2074                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2075                 /* 50 */
2076                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2077                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2078                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2079                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2080                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2081                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2082                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2083                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2084                 /* 58 */
2085                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2086                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2087                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2088                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2089                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2090                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2091                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2092                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2093                 /* 60 */
2094                 { e_No_Entry, t_sse_ter, SSET60, true, { Zz, Zz, Zz }, 0, 0 },
2095                 { e_No_Entry, t_sse_ter, SSET61, true, { Zz, Zz, Zz }, 0, 0 },
2096                 { e_No_Entry, t_sse_ter, SSET62, true, { Zz, Zz, Zz }, 0, 0 },
2097                 { e_No_Entry, t_sse_ter, SSET63, true, { Zz, Zz, Zz }, 0, 0 },
2098                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2099                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2100                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2101                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2102                 /* 68 */
2103                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2104                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2105                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2106                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2107                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2108                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2109                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2110                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2111                 /* 70 */
2112                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2113                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2114                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2115                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2116                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2117                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2118                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2119                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2120                 /* 78 */
2121                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2122                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2123                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2124                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2125                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2126                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2127                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2128                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2129                 /* 80 */
2130                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2131                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2132                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2133                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2134                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2135                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2136                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2137                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2138                 /* 88 */
2139                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2140                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2141                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2142                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2143                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2144                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2145                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2146                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2147                 /* 90 */
2148                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2149                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2150                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2151                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2152                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2153                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2154                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2155                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2156                 /* 98 */
2157                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2158                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2159                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2160                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2161                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2162                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2163                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2164                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2165                 /* A0 */
2166                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2167                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2168                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2169                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2170                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2171                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2172                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2173                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2174                 /* A8 */
2175                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2176                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2177                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2178                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2179                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2180                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2181                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2182                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2183                 /* B0 */
2184                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2185                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2186                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2187                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2188                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2189                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2190                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2191                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },  
2192                 /* B8 */
2193                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2194                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2195                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2196                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2197                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2198                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2199                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2200                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2201                 /* C0 */
2202                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2203                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2204                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2205                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2206                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2207                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2208                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2209                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2210                 /* C8 */
2211                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2212                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2213                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2214                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2215                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2216                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2217                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2218                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2219                 /* D0 */
2220                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2221                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2222                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2223                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2224                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2225                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2226                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2227                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2228                 /* D8 */
2229                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2230                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2231                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2232                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2233                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2234                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2235                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2236                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2237                 /* E0 */
2238                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2239                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2240                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2241                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2242                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2243                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2244                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2245                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2246                 /* E8 */
2247                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2248                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2249                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2250                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2251                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2252                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2253                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2254                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2255                 /* F0 */
2256                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2257                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2258                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2259                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2260                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2261                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2262                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2263                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2264                 /* F8 */
2265                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2266                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2267                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2268                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2269                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2270                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2271                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2272                 { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 }
2273 };
2274
2275 static ia32_entry fpuMap[][2][8] = {
2276 {
2277     { // D8
2278         { e_fadd,  t_done, 0, true, { ST0, Ef, Zz }, 0, s1RW2R },
2279         { e_fmul,  t_done, 0, true, { ST0, Ef, Zz }, 0, s1RW2R },
2280         { e_fcom,  t_done, 0, true, { ST0, Ef, Zz }, 0, s1RW2R },
2281         { e_fcomp, t_done, 0, true, { ST0, Ef, Zz }, 0, s1RW2R }, // stack pop
2282         { e_fsub,  t_done, 0, true, { ST0, Ef, Zz }, 0, s1RW2R },
2283         { e_fsubr, t_done, 0, true, { ST0, Ef, Zz }, 0, s1RW2R },
2284         { e_fdiv,  t_done, 0, true, { ST0, Ef, Zz }, 0, s1RW2R },
2285         { e_fdivr, t_done, 0, true, { ST0, Ef, Zz }, 0, s1RW2R }
2286     },
2287     { // D8 -- IMPORTANT NOTE: the C0-FF tables in the book are interleaved from how they
2288         // need to appear here (and for all FPU insns).  i.e. book rows 0, 4, 1, 5, 2, 6, 3, 7 are table rows
2289         // 0, 1, 2, 3, 4, 5, 6, 7.
2290         { e_fadd,  t_done, 0, true, { ST0, Ef, Zz }, 0, s1RW2R },
2291         { e_fmul,  t_done, 0, true, { ST0, Ef, Zz }, 0, s1RW2R },
2292         { e_fcom,  t_done, 0, true, { ST0, Ef, Zz }, 0, s1RW2R },
2293         { e_fcomp, t_done, 0, true, { ST0, Ef, Zz }, 0, s1RW2R }, // stack pop
2294         { e_fsub,  t_done, 0, true, { ST0, Ef, Zz }, 0, s1RW2R },
2295         { e_fsubr, t_done, 0, true, { ST0, Ef, Zz }, 0, s1RW2R },
2296         { e_fdiv,  t_done, 0, true, { ST0, Ef, Zz }, 0, s1RW2R },
2297         { e_fdivr, t_done, 0, true, { ST0, Ef, Zz }, 0, s1RW2R }
2298     },
2299 },
2300 {
2301     { // D9 
2302         { e_fld,    t_done, 0, true, { ST0, Ef, Zz }, 0, s1W2R }, // stack push
2303         { e_fnop,   t_done, 0, true, { Zz,  Zz, Zz }, 0, sNONE },
2304         { e_fst,    t_done, 0, true, { Ef, ST0, Zz }, 0, s1W2R },
2305         { e_fstp,   t_done, 0, true, { Ef, ST0, Zz }, 0, s1W2R }, // stack pop
2306         { e_fldenv, t_done, 0, true, { M14, Zz, Zz }, 0, s1R },
2307         { e_fldcw,  t_done, 0, true, { Ew,  Zz, Zz }, 0, s1R },
2308         { e_fstenv, t_done, 0, true, { M14, Zz, Zz }, 0, s1W },
2309         { e_fstcw,  t_done, 0, true, { Ew,  Zz, Zz }, 0, s1W }
2310     },
2311     { // D9 
2312         { e_fld,    t_done, 0, true, { ST0, Ef, Zz }, 0, s1W2R }, // stack push
2313         { e_fxch, t_done, 0, true, { ST0, Ef, Zz }, 0, s1RW2RW },
2314         { e_fnop,   t_done, 0, true, { Zz,  Zz, Zz }, 0, sNONE },
2315         { e_No_Entry,  t_done, 0, true, { Zz,  Zz, Zz }, 0, sNONE },
2316         { e_fchs,    t_done, 0, true, { ST0, Zz, Zz }, 0, s1RW }, // FIXME: using first of group as placeholder
2317         { e_fld1, t_done, 0, true, { ST0, Zz, Zz }, 0, s1RW }, // FIXME: using first of group
2318         { e_f2xm1,   t_done, 0, true, { ST0, ST1, Zz }, 0, s1RW2R }, // FIXME: using first of group as placeholder
2319         { e_fprem,  t_done, 0, true, { ST0, ST1, Zz }, 0, s1RW2R } // FIXME: using first of group
2320     },
2321 },
2322 {
2323     { // DA 
2324         { e_fiadd,  t_done, 0, true, { ST0, Ev, Zz }, 0, s1RW2R },
2325         { e_fimul,  t_done, 0, true, { ST0, Ev, Zz }, 0, s1RW2R },
2326         { e_ficom,  t_done, 0, true, { ST0, Ev, Zz }, 0, s1RW2R },
2327         { e_ficomp, t_done, 0, true, { ST0, Ev, Zz }, 0, s1RW2R }, // stack pop
2328         { e_fisub,  t_done, 0, true, { ST0, Ev, Zz }, 0, s1RW2R },
2329         { e_fisubr, t_done, 0, true, { ST0, Ev, Zz }, 0, s1RW2R },
2330         { e_fidiv,  t_done, 0, true, { ST0, Ev, Zz }, 0, s1RW2R },
2331         { e_fidivr, t_done, 0, true, { ST0, Ev, Zz }, 0, s1RW2R }
2332     },
2333     { // DA
2334         { e_fcmovb,  t_done, 0, true, { ST0, Ef, Zz }, 0, s1RW2R },
2335         { e_fcmove,  t_done, 0, true, { ST0, Ef, Zz }, 0, s1RW2R },
2336         { e_fcmovbe, t_done, 0, true, { ST0, Ef, Zz }, 0, s1RW2R },
2337         { e_fcmovu, t_done, 0, true,  { ST0, Ef, Zz }, 0, s1RW2R },
2338         { e_No_Entry,  t_done, 0, true, { Zz, Zz, Zz }, 0, sNONE },
2339         { e_fucompp,  t_done, 0, true, { ST0, ST1, Zz }, 0, s1RW2RW }, // double pop
2340         { e_No_Entry,  t_done, 0, true, { Zz, Zz, Zz }, 0, sNONE },
2341         { e_No_Entry,  t_done, 0, true, { Zz, Zz, Zz }, 0, sNONE },
2342     },
2343 },
2344 {
2345     { // DB 
2346       { e_fild,   t_done, 0, true, { ST0, Ev, Zz }, 0, s1W2R },
2347       { e_fisttp, t_done, 0, true, { Ev, ST0, Zz }, 0, s1W2R }, //stack pop
2348       { e_fist,   t_done, 0, true, { Ev, ST0, Zz }, 0, s1W2R },
2349       { e_fistp,  t_done, 0, true, { Ev, ST0, Zz }, 0, s1W2R }, // stack pop
2350       { e_No_Entry,  t_done, 0, true, { Zz, Zz, Zz }, 0, sNONE },
2351       { e_fld,    t_done, 0, true, { ST0, Ef, Zz }, 0, s1W2R },
2352       { e_No_Entry,  t_done, 0, true, { Zz, Zz, Zz }, 0, sNONE },
2353       { e_fstp,   t_done, 0, true, { Ef, ST0, Zz }, 0, s1W2R }
2354     },
2355     { // DB
2356         { e_fcmovnb,  t_done, 0, true, { ST0, Ef, Zz }, 0, s1RW2R },
2357         { e_fcmovne,  t_done, 0, true, { ST0, Ef, Zz }, 0, s1RW2R },
2358         { e_fcmovnbe, t_done, 0, true, { ST0, Ef, Zz }, 0, s1RW2R },
2359         { e_fcmovnu,  t_done, 0, true, { ST0, Ef, Zz }, 0, s1RW2R },
2360         { e_fp_generic,  t_done, 0, true, { Zz, Zz, Zz }, 0, sNONE }, // FIXME: needs FCLEX and FINIT in group
2361         { e_fucomi,  t_done, 0, true, { ST0, Ef, Zz }, 0, s1RW2R },
2362         { e_fcomi,  t_done, 0, true, { ST0, Ef, Zz }, 0, s1RW2R },
2363         { e_No_Entry,  t_done, 0, true, { Zz, Zz, Zz }, 0, sNONE },
2364     },
2365 },
2366 {
2367     { // DC
2368         { e_fadd,  t_done, 0, true, { ST0, Efd, Zz }, 0, s1RW2R },
2369         { e_fmul,  t_done, 0, true, { ST0, Efd, Zz }, 0, s1RW2R },
2370         { e_fcom,  t_done, 0, true, { ST0, Efd, Zz }, 0, s1RW2R },
2371         { e_fcomp, t_done, 0, true, { ST0, Efd, Zz }, 0, s1RW2R }, // stack pop
2372         { e_fsub,  t_done, 0, true, { ST0, Efd, Zz }, 0, s1RW2R },
2373         { e_fsubr, t_done, 0, true, { ST0, Efd, Zz }, 0, s1RW2R },
2374         { e_fdiv,  t_done, 0, true, { ST0, Efd, Zz }, 0, s1RW2R },
2375         { e_fdivr, t_done, 0, true, { ST0, Efd, Zz }, 0, s1RW2R }
2376     },
2377     { // DC
2378         { e_fadd,  t_done, 0, true, { ST0, Efd, Zz }, 0, s1RW2R },
2379         { e_fmul,  t_done, 0, true, { ST0, Efd, Zz }, 0, s1RW2R },
2380         { e_No_Entry,  t_done, 0, true, { Zz, Zz, Zz }, 0, sNONE },
2381         { e_No_Entry,  t_done, 0, true, { Zz, Zz, Zz }, 0, sNONE },
2382         { e_fsubr,  t_done, 0, true, { ST0, Efd, Zz }, 0, s1RW2R },
2383         { e_fsub,  t_done, 0, true, { ST0, Efd, Zz }, 0, s1RW2R },
2384         { e_fdivr,  t_done, 0, true, { ST0, Efd, Zz }, 0, s1RW2R },
2385         { e_fdiv,  t_done, 0, true, { ST0, Efd, Zz }, 0, s1RW2R },
2386     },
2387 },
2388 {
2389     { // DD TODO semantics check
2390         { e_fld,    t_done, 0, true, { ST0, Efd, Zz }, 0, s1W2R },
2391         { e_fisttp, t_done, 0, true, { Mq, ST0, Zz }, 0, s1W2R },
2392         { e_fst,    t_done, 0, true, { Efd, ST0, Zz }, 0, s1W2R },
2393         { e_fstp,   t_done, 0, true, { Efd, ST0, Zz }, 0, s1W2R }, // stack pop
2394         { e_frstor, t_done, 0, true, { M512, Zz, Zz }, 0, s1R },
2395         { e_fucomp, t_done, 0, true, { ST0, Efd, Zz }, 0, s1R2R }, // stack pop
2396         { e_fsave,  t_done, 0, true, { M512, Zz, Zz }, 0, s1W },
2397         { e_fstsw,  t_done, 0, true, { Ew, Zz, Zz }, 0, s1W }
2398     },
2399     { // DD TODO semantics check
2400         { e_ffree,    t_done, 0, true, { Efd, Zz, Zz }, 0, s1W },
2401         { e_No_Entry,  t_done, 0, true, { Zz, Zz, Zz }, 0, sNONE },
2402         { e_fst, t_done, 0, true, { Efd, ST0, Zz }, 0, s1W2R },
2403         { e_fstp, t_done, 0, true, { Efd, ST0, Zz }, 0, s1W2RW },
2404         { e_fucom,    t_done, 0, true, { ST0, Efd, Zz }, 0, s1R2R },
2405         { e_fucomp,    t_done, 0, true, { ST0, Efd, Zz }, 0, s1RW2R },
2406         { e_No_Entry,  t_done, 0, true, { Zz, Zz, Zz }, 0, sNONE },
2407         { e_No_Entry,  t_done, 0, true, { Zz, Zz, Zz }, 0, sNONE },
2408     },
2409 },
2410 {    
2411     { // DE 
2412         { e_fiadd,  t_done, 0, true, { ST0, Ev, Zz }, 0, s1RW2R },
2413         { e_fimul,  t_done, 0, true, { ST0, Ev, Zz }, 0, s1RW2R },
2414         { e_ficom,  t_done, 0, true, { ST0, Ev, Zz }, 0, s1RW2R },
2415         { e_ficomp, t_done, 0, true, { ST0, Ev, Zz }, 0, s1RW2R }, // stack pop
2416         { e_fisub,  t_done, 0, true, { ST0, Ev, Zz }, 0, s1RW2R },
2417         { e_fisubr, t_done, 0, true, { ST0, Ev, Zz }, 0, s1RW2R },
2418         { e_fidiv,  t_done, 0, true, { ST0, Ev, Zz }, 0, s1RW2R },
2419         { e_fidivr, t_done, 0, true, { ST0, Ev, Zz }, 0, s1RW2R }
2420     },
2421     { // DE
2422         { e_faddp,  t_done, 0, true, { ST0, Ef, Zz }, 0, s1RW2R },
2423         { e_fmulp,  t_done, 0, true, { ST0, Ef, Zz }, 0, s1RW2R },
2424         { e_No_Entry,  t_done, 0, true, { Zz, Zz, Zz }, 0, sNONE },
2425         { e_fcompp, t_done, 0, true, { ST0, ST1, Zz }, 0, s1RW2R },
2426         { e_fsubrp,  t_done, 0, true, { ST0, Ef, Zz }, 0, s1RW2R },
2427         { e_fsubp,  t_done, 0, true, { ST0, Ef, Zz }, 0, s1RW2R },
2428         { e_fdivrp, t_done, 0, true, { ST0, Ef, Zz }, 0, s1RW2R }, // stack pop
2429         { e_fdivp, t_done, 0, true, { ST0, Ef, Zz }, 0, s1RW2R }
2430     },
2431 },
2432 {
2433     { // DF TODO semantics/operand sizes
2434         { e_fild,   t_done, 0, true, { ST0, Ew, Zz }, 0, s1W2R },
2435         { e_fisttp, t_done, 0, true, { Ew, ST0, Zz }, 0, s1W2R },
2436         { e_fist,   t_done, 0, true, { Ew, ST0, Zz }, 0, s1W2R },
2437         { e_fistp,  t_done, 0, true, { Ew, ST0, Zz }, 0, s1W2R }, // stack pop
2438         { e_fbld,   t_done, 0, true, { ST0, Mq, Zz }, 0, s1W2R }, // BCD 80 bit
2439         { e_fild,   t_done, 0, true, { ST0, Ev, Zz }, 0, s1W2R },
2440         { e_fbstp,  t_done, 0, true, { Mq, ST0, Zz }, 0, s1RW2R },// BCD 80 bit
2441         { e_fistp,  t_done, 0, true, { Ev, ST0, Zz }, 0, s1W2R }
2442     },
2443     { // DF TODO semantics/operand sizes
2444         { e_No_Entry,  t_done, 0, true, { Zz, Zz, Zz }, 0, sNONE },
2445         { e_No_Entry,  t_done, 0, true, { Zz, Zz, Zz }, 0, sNONE },
2446         { e_No_Entry,  t_done, 0, true, { Zz, Zz, Zz }, 0, sNONE },
2447         { e_No_Entry,  t_done, 0, true, { Zz, Zz, Zz }, 0, sNONE },
2448         { e_fstsw,   t_done, 0, true, { AX, Zz, Zz }, 0, s1W },
2449         { e_fucomip,  t_done, 0, true, { ST0, Ef, Zz }, 0, s1RW2R }, // stack pop
2450         { e_fcomip,  t_done, 0, true, { ST0, Ef, Zz }, 0, s1RW2R }, // stack pop
2451         { e_No_Entry,  t_done, 0, true, { Zz, Zz, Zz }, 0, sNONE },
2452     }
2453 }
2454 };
2455
2456 static ia32_entry groupMap[][8] = {
2457   { /* group 1a */
2458     { e_add, t_done, 0, true, { Eb, Ib, Zz }, 0, s1RW2R },
2459     { e_or,  t_done, 0, true, { Eb, Ib, Zz }, 0, s1RW2R },
2460     { e_adc, t_done, 0, true, { Eb, Ib, Zz }, 0, s1RW2R },
2461     { e_sbb, t_done, 0, true, { Eb, Ib, Zz }, 0, s1RW2R },
2462     { e_and, t_done, 0, true, { Eb, Ib, Zz }, 0, s1RW2R },
2463     { e_sub, t_done, 0, true, { Eb, Ib, Zz }, 0, s1RW2R },
2464     { e_xor, t_done, 0, true, { Eb, Ib, Zz }, 0, s1RW2R },
2465     { e_cmp, t_done, 0, true, { Eb, Ib, Zz }, 0, s1R2R },
2466   },
2467   { /* group 1b */
2468     { e_add, t_done, 0, true, { Ev, Iz, Zz }, 0, s1RW2R },
2469     { e_or,  t_done, 0, true, { Ev, Iz, Zz }, 0, s1RW2R },
2470     { e_adc, t_done, 0, true, { Ev, Iz, Zz }, 0, s1RW2R },
2471     { e_sbb, t_done, 0, true, { Ev, Iz, Zz }, 0, s1RW2R },
2472     { e_and, t_done, 0, true, { Ev, Iz, Zz }, 0, s1RW2R },
2473     { e_sub, t_done, 0, true, { Ev, Iz, Zz }, 0, s1RW2R },
2474     { e_xor, t_done, 0, true, { Ev, Iz, Zz }, 0, s1RW2R },
2475     { e_cmp, t_done, 0, true, { Ev, Iz, Zz }, 0, s1R2R },
2476   },
2477   { /* group 1c */
2478     { e_add, t_done, 0, true, { Eb, Ib, Zz }, 0, s1RW2R },
2479     { e_or,  t_done, 0, true, { Eb, Ib, Zz }, 0, s1RW2R },
2480     { e_adc, t_done, 0, true, { Eb, Ib, Zz }, 0, s1RW2R },
2481     { e_sbb, t_done, 0, true, { Eb, Ib, Zz }, 0, s1RW2R },
2482     { e_and, t_done, 0, true, { Eb, Ib, Zz }, 0, s1RW2R },
2483     { e_sub, t_done, 0, true, { Eb, Ib, Zz }, 0, s1RW2R },
2484     { e_xor, t_done, 0, true, { Eb, Ib, Zz }, 0, s1RW2R },
2485     { e_cmp, t_done, 0, true, { Eb, Ib, Zz }, 0, s1R2R },
2486   },
2487   { /* group 1d */
2488     { e_add, t_done, 0, true, { Ev, Ib, Zz }, 0, s1RW2R },
2489     { e_or,  t_done, 0, true, { Ev, Ib, Zz }, 0, s1RW2R },
2490     { e_adc, t_done, 0, true, { Ev, Ib, Zz }, 0, s1RW2R },
2491     { e_sbb, t_done, 0, true, { Ev, Ib, Zz }, 0, s1RW2R },
2492     { e_and, t_done, 0, true, { Ev, Ib, Zz }, 0, s1RW2R },
2493     { e_sub, t_done, 0, true, { Ev, Ib, Zz }, 0, s1RW2R },
2494     { e_xor, t_done, 0, true, { Ev, Ib, Zz }, 0, s1RW2R },
2495     { e_cmp, t_done, 0, true, { Ev, Ib, Zz }, 0, s1R2R },
2496   },
2497
2498
2499  {  /* group 2 - only opcode is defined here, 
2500        operands are defined in the one or two byte maps above */
2501   { e_rol, t_done, 0, true, { Zz, Zz, Zz }, 0, 0 },
2502   { e_ror, t_done, 0, true, { Zz, Zz, Zz }, 0, 0 },
2503   { e_rcl, t_done, 0, true, { Zz, Zz, Zz }, 0, 0 },
2504   { e_rcr, t_done, 0, true, { Zz, Zz, Zz }, 0, 0 },
2505   { e_shl_sal, t_done, 0, true, { Zz, Zz, Zz }, 0, 0 },
2506   { e_shr, t_done, 0, true, { Zz, Zz, Zz }, 0, 0 },
2507   { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2508   { e_sar, t_done, 0, true, { Zz, Zz, Zz }, 0, 0 }
2509  },
2510
2511  { /* group 3a - operands are defined here */
2512   { e_test, t_done, 0, true, { Eb, Ib, Zz }, 0, s1R2R },
2513   { e_test, t_done, 0, true, { Eb, Ib, Zz }, 0, s1R2R }, // book swears this is illegal, sandpile claims it's an aliased TEST
2514   { e_not,  t_done, 0, true, { Eb, Zz, Zz }, 0, s1RW },
2515   { e_neg,  t_done, 0, true, { Eb, Zz, Zz }, 0, s1RW },
2516   { e_mul,  t_done, 0, true, { AX, AL, Eb }, 0, s1W2R3R },
2517   { e_imul, t_done, 0, true, { AX, AL, Eb }, 0, s1W2R3R },
2518   { e_div,  t_done, 0, true, { AX, AL, Eb }, 0, s1RW2R3R },
2519   { e_idiv, t_done, 0, true, { AX, AL, Eb }, 0, s1RW2R3R }
2520  },
2521
2522  { /* group 3b - operands are defined here */
2523   { e_test, t_done, 0, true, { Ev, Iz, Zz }, 0, s1R2R },
2524   { e_test, t_done, 0, true, { Ev, Iz, Zz }, 0, s1R2R }, // book swears this is illegal, sandpile claims it's an aliased TEST
2525   { e_not,  t_done, 0, true, { Ev, Zz, Zz }, 0, s1RW },
2526   { e_neg,  t_done, 0, true, { Ev, Zz, Zz }, 0, s1RW },
2527   { e_mul,  t_done, 0, true, { eDX, eAX, Ev }, 0, s1W2RW3R },
2528   { e_imul, t_done, 0, true, { eDX, eAX, Ev }, 0, s1W2RW3R },
2529   { e_div,  t_done, 0, true, { eDX, eAX, Ev }, 0, s1RW2RW3R },
2530   { e_idiv, t_done, 0, true, { eDX, eAX, Ev }, 0, s1RW2RW3R }
2531  },
2532
2533  { /* group 4 - operands are defined here */
2534   { e_inc, t_done, 0, true, { Eb, Zz, Zz }, 0, s1RW },
2535   { e_dec, t_done, 0, true, { Eb, Zz, Zz }, 0, s1RW },
2536   { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2537   { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2538   { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2539   { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2540   { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2541   { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2542  },
2543
2544  { /* group 5 - operands are defined here */
2545   { e_inc,  t_done, 0, true, { Ev, Zz, Zz }, 0, s1RW },
2546   { e_dec,  t_done, 0, true, { Ev, Zz, Zz }, 0, s1RW },
2547   { e_call, t_done, 0, true, { Ev, Zz, Zz }, (IS_CALL | INDIR), s1R | (fINDIRCALL << FPOS) },
2548   { e_call, t_done, 0, true, { Ep, Zz, Zz }, (IS_CALL | INDIR), s1R | (fINDIRCALL << FPOS) },
2549   { e_jmp,  t_done, 0, true, { Ev, Zz, Zz }, (IS_JUMP | INDIR), s1R | (fINDIRJUMP << FPOS) },
2550   { e_jmp,  t_done, 0, true, { Ep, Zz, Zz }, (IS_JUMP | INDIR), s1R | (fINDIRJUMP << FPOS) },
2551   { e_push, t_done, 0, true, { Ev, eSP, Zz }, 0, s1R2RW },
2552   { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2553  },
2554
2555  { /* group 6 - operands are defined here */
2556    // these need to be fixed for kernel mode accesses
2557   { e_sldt, t_done, 0, true, { Ew, Zz, Zz }, 0, s1W },
2558   { e_str,  t_done, 0, true, { Ew, Zz, Zz }, 0, s1W },
2559   { e_lldt, t_done, 0, true, { Ew, Zz, Zz }, 0, s1R },
2560   { e_ltr,  t_done, 0, true, { Ew, Zz, Zz }, 0, s1R },
2561   { e_verr, t_done, 0, true, { Ew, Zz, Zz }, 0, s1R },
2562   { e_verw, t_done, 0, true, { Ew, Zz, Zz }, 0, s1R },
2563   { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2564   { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2565  },
2566
2567  { /* group 7 - operands are defined here */
2568    // idem
2569   { e_sgdt, t_done, 0, true, { Ms, Zz, Zz }, 0, s1W },
2570   { e_sidt, t_done, 0, true, { Ms, Zz, Zz }, 0, s1W },
2571   { e_lgdt, t_done, 0, true, { Ms, Zz, Zz }, 0, s1R },
2572   { e_lidt, t_done, 0, true, { Ms, Zz, Zz }, 0, s1R },
2573   { e_smsw, t_done, 0, true, { Ew, Zz, Zz }, 0, s1W },
2574   { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2575   { e_lmsw, t_done, 0, true, { Ew, Zz, Zz }, 0, s1R },
2576   { e_invlpg, t_done, 0, true, { Zz, Zz, Zz }, 0, sNONE }, // 64-bit: swapgs also uses this encoding (w/ mod=11)
2577  },
2578
2579  { /* group 8 - only opcode is defined here, 
2580      operands are defined in the one or two byte maps below */
2581   { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2582   { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2583   { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2584   { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2585   { e_bt,  t_done, 0, true, { Ev, Ib, Zz }, 0, s1R2R },
2586   { e_bts, t_done, 0, true, { Ev, Ib, Zz }, 0, s1RW2R },
2587   { e_btr, t_done, 0, true, { Ev, Ib, Zz }, 0, s1RW2R },
2588   { e_btc, t_done, 0, true, { Ev, Ib, Zz }, 0, s1RW2R },
2589  },
2590
2591  { /* group 9 - operands are defined here */
2592   { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2593   // see comments for cmpxch
2594   { e_cmpxch8b, t_done, 0, true, { EDXEAX, Mq, ECXEBX }, 0, s1RW2RW3R | (fCMPXCH8 << FPOS) },
2595   { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2596   { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2597   { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2598   { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2599   { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2600   { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 }
2601  },
2602
2603  /* group 10 is all illegal */
2604
2605  { /* group 11, opcodes defined in one byte map */
2606    { e_mov, t_done, 0, true, { Zz, Zz, Zz }, 0, sNONE },
2607    { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2608    { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2609    { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2610    { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2611    { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2612    { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2613    { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2614  }
2615
2616 };
2617
2618
2619 // Groups 12-16 are split by mod={mem,11}. Some spill over into SSE groups!
2620 // Notation: G12SSE010B = group 12, SSE, reg=010; B means mod=11
2621 // Use A if Intel decides to put SSE instructions for mod=mem
2622 static ia32_entry groupMap2[][2][8] = {
2623   { /* group 12 */
2624     {
2625       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2626       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2627       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2628       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2629       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2630       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2631       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2632       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2633     },
2634     {
2635       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2636       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2637       { e_No_Entry, t_grpsse, G12SSE010B, true, { Zz, Zz, Zz }, 0, 0 },
2638       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2639       { e_No_Entry, t_grpsse, G12SSE100B, true, { Zz, Zz, Zz }, 0, 0 },
2640       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2641       { e_No_Entry, t_grpsse, G12SSE110B, true, { Zz, Zz, Zz }, 0, 0 },
2642       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2643     }
2644   },
2645   { /* group 13 */
2646     {
2647       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2648       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2649       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2650       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2651       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2652       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2653       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2654       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2655     },
2656     {
2657       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2658       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2659       { e_No_Entry, t_grpsse, G13SSE010B, true, { Zz, Zz, Zz }, 0, 0 },
2660       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2661       { e_No_Entry, t_grpsse, G13SSE100B, true, { Zz, Zz, Zz }, 0, 0 },
2662       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2663       { e_No_Entry, t_grpsse, G13SSE110B, true, { Zz, Zz, Zz }, 0, 0 },
2664       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2665     }
2666   },
2667   { /* group 14 */
2668     {
2669       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2670       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2671       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2672       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2673       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2674       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2675       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2676       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2677     },
2678     {
2679       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2680       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2681       { e_No_Entry, t_grpsse, G14SSE010B, true, { Zz, Zz, Zz }, 0, 0 },
2682       { e_No_Entry, t_grpsse, G14SSE011B, true, { Zz, Zz, Zz }, 0, 0 },
2683       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2684       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2685       { e_No_Entry, t_grpsse, G14SSE110B, true, { Zz, Zz, Zz }, 0, 0 },
2686       { e_No_Entry, t_grpsse, G14SSE111B, true, { Zz, Zz, Zz }, 0, 0 },
2687     }
2688   },
2689   { /* group 15 */
2690     {
2691       { e_fxsave,  t_done, 0, true, { M512, Zz, Zz }, 0, s1W | (fFXSAVE << FPOS) },
2692       { e_fxrstor, t_done, 0, true, { M512, Zz, Zz }, 0, s1R | (fFXRSTOR << FPOS) },
2693       { e_ldmxcsr, t_done, 0, true, { Md, Zz, Zz }, 0, s1R },
2694       { e_stmxcsr, t_done, 0, true, { Md, Zz, Zz }, 0, s1W },
2695       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2696       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2697       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2698       { e_clflush, t_done, 0, true, { Mb, Zz, Zz }, 0, s1W | (fCLFLUSH << FPOS) },
2699     },
2700     {
2701       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2702       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2703       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2704       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2705       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2706       { e_lfence, t_done, 0, true, { Zz, Zz, Zz }, 0, sNONE },
2707       { e_mfence, t_done, 0, true, { Zz, Zz, Zz }, 0, sNONE },
2708       { e_sfence, t_done, 0, true, { Zz, Zz, Zz }, 0, sNONE },
2709     }
2710   },
2711   { /* group 16 */
2712     {
2713       { e_prefetchNTA, t_done, 0, true, { Mb, Zz, Zz }, 0, s1R | (fPREFETCHNT << FPOS) },
2714       { e_prefetchT0,  t_done, 0, true, { Mb, Zz, Zz }, 0, s1R | (fPREFETCHT0 << FPOS) },
2715       { e_prefetchT1,  t_done, 0, true, { Mb, Zz, Zz }, 0, s1R | (fPREFETCHT1 << FPOS) },
2716       { e_prefetchT2,  t_done, 0, true, { Mb, Zz, Zz }, 0, s1R | (fPREFETCHT1 << FPOS) },
2717       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2718       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2719       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2720       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2721     },
2722     {
2723       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2724       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2725       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2726       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2727       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2728       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2729       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2730       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2731     }
2732   },
2733   { /* group 17 */
2734     {
2735       { e_extrq, t_done, 0, true, { Vdq, Ib, Ib }, 0, s1RW2R3R },
2736       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2737       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2738       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2739       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2740       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2741       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2742       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2743     },
2744     {
2745       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2746       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2747       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2748       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2749       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2750       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2751       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2752       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2753     }
2754   },
2755   { /* AMD prefetch group */
2756     {
2757       { e_prefetch,   t_done, 0, true, { Mb, Zz, Zz }, 0, s1R | (fPREFETCHAMDE << FPOS) },
2758       { e_prefetchw,  t_done, 0, true, { Mb, Zz, Zz }, 0, s1R | (fPREFETCHAMDW << FPOS) },
2759       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 }, // this is reserved, not illegal, ugh...
2760       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 }, // this is reserved, not illegal, ugh...
2761       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 }, // this is reserved, not illegal, ugh...
2762       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 }, // this is reserved, not illegal, ugh...
2763       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 }, // this is reserved, not illegal, ugh...
2764       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 }, // this is reserved, not illegal, ugh...
2765     },
2766     {
2767       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2768       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2769       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2770       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2771       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2772       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2773       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2774       { e_No_Entry, t_ill, 0, true, { Zz, Zz, Zz }, 0, 0 },
2775     }
2776   }
2777
2778
2779 };
2780
2781 /* rows are not, F3, 66, F2 prefixed in this order (see book) */
2782 static ia32_entry sseMap[][4] = {
2783   { /* SSE10 */
2784     { e_movups, t_done, 0, true, { Vps, Wps, Zz }, 0, s1W2R },
2785     { e_movss,  t_done, 0, true, { Vss, Wss, Zz }, 0, s1W2R },
2786     { e_movupd, t_done, 0, true, { Vpd, Wpd, Zz }, 0, s1W2R },
2787     { e_movsd_sse,  t_done, 0, true, { Vsd, Wsd, Zz }, 0, s1W2R },
2788   },
2789   { /* SSE11 */
2790     { e_movups, t_done, 0, true, { Wps, Vps, Zz }, 0, s1W2R },
2791     { e_movss,  t_done, 0, true, { Wss, Vss, Zz }, 0, s1W2R },
2792     { e_movupd, t_done, 0, true, { Wpd, Vpd, Zz }, 0, s1W2R },
2793     { e_movsd_sse,  t_done, 0, true, { Wsd, Vsd, Zz }, 0, s1W2R }, // Book is wrong, this is a W/V
2794   },
2795   { /* SSE12 */
2796     { e_movlps_movhlps, t_done, 0, true, { Wq, Vq, Zz }, 0, s1W2R }, // FIXME: wierd 1st op
2797     { e_movsldup, t_done, 0, true, { Vdq, Wdq, Zz }, 0, s1W2R },
2798     { e_movlpd, t_done, 0, true, { Vq, Ws, Zz }, 0, s1W2R },
2799     { e_movddup, t_done, 0, true, { Vdq, Wq, Zz }, 0, s1W2R },
2800   },
2801   { /* SSE13 */
2802     { e_movlps, t_done, 0, true, { Vq, Wq, Zz }, 0, s1W2R },
2803     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2804     { e_movlpd, t_done, 0, true, { Vq, Wq, Zz }, 0, s1W2R },
2805     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2806   },
2807   { /* SSE14 */
2808     { e_unpcklps, t_done, 0, true, { Vps, Wq, Zz }, 0, s1RW2R },
2809     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2810     { e_unpcklpd, t_done, 0, true, { Vpd, Wq, Zz }, 0, s1RW2R },
2811     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2812   },
2813   { /* SSE15 */
2814     { e_unpckhps, t_done, 0, true, { Vps, Wq, Zz }, 0, s1RW2R },
2815     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2816     { e_unpckhpd, t_done, 0, true, { Vpd, Wq, Zz }, 0, s1RW2R },
2817     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2818   },
2819   { /* SSE16 */
2820     { e_movhps_movlhps, t_done, 0, true, { Vq, Wq, Zz }, 0, s1W2R }, // FIXME: wierd 2nd op
2821     { e_movshdup, t_done, 0, true, { Vdq, Wdq, Zz }, 0, s1W2R },
2822     { e_movhpd, t_done, 0, true, { Vq, Wq, Zz }, 0, s1W2R },
2823     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2824   },
2825   { /* SSE17 */
2826     { e_movhps, t_done, 0, true, { Wq, Vq, Zz }, 0, s1W2R },
2827     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2828     { e_movhpd, t_done, 0, true, { Wq, Vq, Zz }, 0, s1W2R },
2829     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2830   },
2831   { /* SSE28 */
2832     { e_movaps, t_done, 0, true, { Vps, Wps, Zz }, 0, s1W2R },
2833     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2834     { e_movapd, t_done, 0, true, { Vpd, Wpd, Zz }, 0, s1W2R },
2835     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2836   },
2837   { /* SSE29 */
2838     { e_movaps, t_done, 0, true, { Wps, Vps, Zz }, 0, s1W2R },
2839     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2840     { e_movapd, t_done, 0, true, { Wpd, Vpd, Zz }, 0, s1W2R },
2841     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2842   },
2843   { /* SSE2A */
2844     { e_cvtpi2ps, t_done, 0, true, { Vps, Qq, Zz }, 0, s1W2R },
2845     { e_cvtsi2ss, t_done, 0, true, { Vss, Ev, Zz }, 0, s1W2R },
2846     { e_cvtpi2pd, t_done, 0, true, { Vpd, Qdq, Zz }, 0, s1W2R },
2847     { e_cvtsi2sd, t_done, 0, true, { Vsd, Ev, Zz }, 0, s1W2R },
2848   },
2849   { /* SSE2B */
2850     { e_movntps, t_done, 0, true, { Wps, Vps, Zz }, 0, s1W2R | (fNT << FPOS) },
2851     { e_movntss, t_done, 0, true, { Md, Vd, Zz }, 0, s1W2R | (fNT << FPOS) },
2852     { e_movntpd, t_done, 0, true, { Wpd, Vpd, Zz }, 0, s1W2R | (fNT << FPOS) }, // bug in book
2853     { e_movntsd, t_done, 0, true, { Wq, Vq, Zz }, 0, s1W2R | (fNT << FPOS) },
2854   },
2855   { /* SSE2C */
2856     { e_cvttps2pi, t_done, 0, true, { Qq, Wps, Zz }, 0, s1W2R },
2857     { e_cvttss2si, t_done, 0, true, { Gv, Wss, Zz }, 0, s1W2R },
2858     { e_cvttpd2pi, t_done, 0, true, { Qdq, Wpd, Zz }, 0, s1W2R },
2859     { e_cvttsd2si, t_done, 0, true, { Gv, Wsd, Zz }, 0, s1W2R },
2860   },
2861   { /* SSE2D */
2862     { e_cvtps2pi, t_done, 0, true, { Qq, Wps, Zz }, 0, s1W2R },
2863     { e_cvtss2si, t_done, 0, true, { Gv, Wss, Zz }, 0, s1W2R },
2864     { e_cvtpd2pi, t_done, 0, true, { Qdq, Wpd, Zz }, 0, s1W2R },
2865     { e_cvtsd2si, t_done, 0, true, { Gv, Wsd, Zz }, 0, s1W2R },
2866   },
2867   { /* SSE2E */
2868     { e_ucomiss, t_done, 0, true, { Vss, Wss, Zz }, 0, s1R2R },
2869     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2870     { e_ucomisd, t_done, 0, true, { Vsd, Wsd, Zz }, 0, s1R2R },
2871     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2872   },
2873   { /* SSE2F */
2874     { e_comiss, t_done, 0, true, { Vps, Wps, Zz }, 0, s1R2R },
2875     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2876     { e_comisd, t_done, 0, true, { Vsd, Wsd, Zz }, 0, s1R2R },
2877     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2878   },
2879   { /* SSE50 */
2880     { e_movmskps, t_done, 0, true, { Ed, Vps, Zz }, 0, s1W2R },
2881     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2882     { e_movmskpd, t_done, 0, true, { Ed, Vpd, Zz }, 0, s1W2R },
2883     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2884   },
2885   { /* SSE51 */
2886     { e_sqrtps, t_done, 0, true, { Vps, Wps, Zz }, 0, s1W2R },
2887     { e_sqrtss, t_done, 0, true, { Vss, Wss, Zz }, 0, s1W2R },
2888     { e_sqrtpd, t_done, 0, true, { Vpd, Wpd, Zz }, 0, s1W2R },
2889     { e_sqrtsd, t_done, 0, true, { Vsd, Wsd, Zz }, 0, s1W2R },
2890   },
2891   { /* SSE52 */
2892     { e_rsqrtps, t_done, 0, true, { Vps, Wps, Zz }, 0, s1W2R },
2893     { e_rsqrtss, t_done, 0, true, { Vss, Wss, Zz }, 0, s1W2R },
2894     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2895     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2896   },
2897   { /* SSE53 */
2898     { e_rcpps, t_done, 0, true, { Vps, Wps, Zz }, 0, s1W2R },
2899     { e_rcpss, t_done, 0, true, { Vss, Wss, Zz }, 0, s1W2R },
2900     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2901     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2902   },
2903   { /* SSE54 */
2904     { e_andps, t_done, 0, true, { Vps, Wps, Zz }, 0, s1RW2R },
2905     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2906     { e_andpd, t_done, 0, true, { Vpd, Wpd, Zz }, 0, s1RW2R },
2907     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2908   },
2909   { /* SSE55 */
2910     { e_andnps, t_done, 0, true, { Vps, Wps, Zz }, 0, s1RW2R },
2911     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2912     { e_andnpd, t_done, 0, true, { Vpd, Wpd, Zz }, 0, s1RW2R },
2913     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2914   },
2915   { /* SSE56 */
2916     { e_orps, t_done, 0, true, { Vps, Wps, Zz }, 0, s1RW2R },
2917     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2918     { e_orpd, t_done, 0, true, { Vpd, Wpd, Zz }, 0, s1RW2R },
2919     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2920   },
2921   { /* SSE57 */
2922     { e_xorps, t_done, 0, true, { Vps, Wps, Zz }, 0, s1RW2R },
2923     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2924     { e_xorpd, t_done, 0, true, { Vpd, Wpd, Zz }, 0, s1RW2R },
2925     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2926   },
2927   { /* SSE58 */
2928     { e_addps, t_done, 0, true, { Vps, Wps, Zz }, 0, s1RW2R },
2929     { e_addss, t_done, 0, true, { Vss, Wss, Zz }, 0, s1RW2R },
2930     { e_addpd, t_done, 0, true, { Vpd, Wpd, Zz }, 0, s1RW2R },
2931     { e_addsd, t_done, 0, true, { Vsd, Wsd, Zz }, 0, s1RW2R },
2932   },
2933   { /* SSE59 */
2934     { e_mulps, t_done, 0, true, { Vps, Wps, Zz }, 0, s1RW2R },
2935     { e_mulss, t_done, 0, true, { Vss, Wss, Zz }, 0, s1RW2R },
2936     { e_mulpd, t_done, 0, true, { Vpd, Wpd, Zz }, 0, s1RW2R },
2937     { e_mulsd, t_done, 0, true, { Vsd, Wsd, Zz }, 0, s1RW2R },
2938   },
2939   { /* SSE5A */
2940     { e_cvtps2pd, t_done, 0, true, { Vpd, Wps, Zz }, 0, s1W2R },
2941     { e_cvtss2sd, t_done, 0, true, { Vss, Wss, Zz }, 0, s1W2R },
2942     { e_cvtpd2ps, t_done, 0, true, { Vps, Wpd, Zz }, 0, s1W2R }, // FIXME: book bug ???
2943     { e_cvtsd2ss, t_done, 0, true, { Vsd, Wsd, Zz }, 0, s1W2R },
2944   },
2945   { /* SSE5B */
2946     { e_cvtdq2ps, t_done, 0, true, { Vps, Wdq, Zz }, 0, s1W2R },
2947     { e_cvttps2dq, t_done, 0, true, { Vdq, Wps, Zz }, 0, s1W2R }, // book has this/next swapped!!! 
2948     { e_cvtps2dq, t_done, 0, true, { Vdq, Wps, Zz }, 0, s1W2R },  // FIXME: book bug ???
2949     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2950   },
2951   { /* SSE5C */
2952     { e_subps, t_done, 0, true, { Vps, Wps, Zz }, 0, s1RW2R },
2953     { e_subss, t_done, 0, true, { Vss, Wss, Zz }, 0, s1RW2R },
2954     { e_subpd, t_done, 0, true, { Vpd, Wpd, Zz }, 0, s1RW2R },
2955     { e_subsd, t_done, 0, true, { Vsd, Wsd, Zz }, 0, s1RW2R },
2956   },
2957   { /* SSE5D */
2958     { e_minps, t_done, 0, true, { Vps, Wps, Zz }, 0, s1RW2R },
2959     { e_minss, t_done, 0, true, { Vss, Wss, Zz }, 0, s1RW2R },
2960     { e_minpd, t_done, 0, true, { Vpd, Wpd, Zz }, 0, s1RW2R },
2961     { e_minsd, t_done, 0, true, { Vsd, Wsd, Zz }, 0, s1RW2R },
2962   },
2963   { /* SSE5E */
2964     { e_divps, t_done, 0, true, { Vps, Wps, Zz }, 0, s1RW2R },
2965     { e_divss, t_done, 0, true, { Vss, Wss, Zz }, 0, s1RW2R },
2966     { e_divpd, t_done, 0, true, { Vpd, Wpd, Zz }, 0, s1RW2R },
2967     { e_divsd, t_done, 0, true, { Vsd, Wsd, Zz }, 0, s1RW2R },
2968   },
2969   { /* SSE5F */
2970     { e_maxps, t_done, 0, true, { Vps, Wps, Zz }, 0, s1RW2R },
2971     { e_maxss, t_done, 0, true, { Vss, Wss, Zz }, 0, s1RW2R },
2972     { e_maxpd, t_done, 0, true, { Vpd, Wpd, Zz }, 0, s1RW2R },
2973     { e_maxsd, t_done, 0, true, { Vsd, Wsd, Zz }, 0, s1RW2R },
2974   },
2975   { /* SSE60 */
2976     { e_punpcklbw, t_done, 0, true, { Pq, Qd, Zz }, 0, s1RW2R },
2977     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2978     { e_punpcklbw, t_done, 0, true, { Vdq, Wdq, Zz }, 0, s1RW2R },
2979     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2980   },
2981   { /* SSE61 */
2982     { e_punpcklwd, t_done, 0, true, { Pq, Qd, Zz }, 0, s1RW2R },
2983     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2984     { e_punpcklwd, t_done, 0, true, { Vdq, Wdq, Zz }, 0, s1RW2R },
2985     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2986   },
2987   { /* SSE62 */
2988     { e_punpcklqd, t_done, 0, true, { Pq, Qd, Zz }, 0, s1RW2R },
2989     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2990     { e_punpcklqd, t_done, 0, true, { Vdq, Wdq, Zz }, 0, s1RW2R },
2991     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2992   },
2993   { /* SSE63 */
2994     { e_packsswb, t_done, 0, true, { Pq, Qq, Zz }, 0, s1RW2R },
2995     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2996     { e_packsswb, t_done, 0, true, { Vdq, Wdq, Zz }, 0, s1RW2R },
2997     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
2998   },
2999   { /* SSE64 */
3000     { e_pcmpgtb, t_done, 0, true, { Pq, Qq, Zz }, 0, s1R2R },
3001     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
3002     { e_pcmpgtb, t_done, 0, true, { Vdq, Wdq, Zz }, 0, s1R2R },
3003     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
3004   },
3005   { /* SSE65 */
3006     { e_pcmpgtw, t_done, 0, true, { Pq, Qq, Zz }, 0, s1R2R },
3007     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
3008     { e_pcmpgtw, t_done, 0, true, { Vdq, Wdq, Zz }, 0, s1R2R },
3009     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
3010   },
3011   { /* SSE66 */
3012     { e_pcmpgdt, t_done, 0, true, { Pq, Qq, Zz }, 0, s1R2R },
3013     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
3014     { e_pcmpgdt, t_done, 0, true, { Vdq, Wdq, Zz }, 0, s1R2R },
3015     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
3016   },
3017   { /* SSE67 */
3018     { e_packuswb, t_done, 0, true, { Pq, Qq, Zz }, 0, s1RW2R },
3019     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
3020     { e_packuswb, t_done, 0, true, { Vdq, Wdq, Zz }, 0, s1RW2R },
3021     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
3022   },
3023   { /* SSE68 */
3024     { e_punpckhbw, t_done, 0, true, { Pq, Qq, Zz }, 0, s1RW2R },
3025     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
3026     { e_punpckhbw, t_done, 0, true, { Pdq, Qdq, Zz }, 0, s1RW2R },
3027     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
3028   },
3029   { /* SSE69 */
3030     { e_punpckhwd, t_done, 0, true, { Pq, Qq, Zz }, 0, s1RW2R },
3031     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
3032     { e_punpckhwd, t_done, 0, true, { Pdq, Qdq, Zz }, 0, s1RW2R },
3033     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
3034   },
3035   { /* SSE6A */
3036     { e_punpckhdq, t_done, 0, true, { Pq, Qq, Zz }, 0, s1RW2R },
3037     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
3038     { e_punpckhdq, t_done, 0, true, { Pdq, Qdq, Zz }, 0, s1RW2R },
3039     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
3040   },
3041   { /* SSE6B */
3042     { e_packssdw, t_done, 0, true, { Pq, Qq, Zz }, 0, s1RW2R },
3043     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
3044     { e_packssdw, t_done, 0, true, { Pdq, Qdq, Zz }, 0, s1RW2R },
3045     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
3046   },
3047   { /* SSE6C */
3048     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
3049     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
3050     { e_punpcklqld, t_done, 0, true, { Vdq, Wdq, Zz }, 0, s1RW2R },
3051     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
3052   },
3053   { /* SSE6D */
3054     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
3055     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
3056     { e_punpckhqd, t_done, 0, true, { Vdq, Wdq, Zz }, 0, s1RW2R },
3057     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
3058   },
3059   { /* SSE6E */
3060     { e_movd, t_done, 0, true, { Pd, Ev, Zz }, 0, s1W2R },
3061     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
3062     { e_movd, t_done, 0, true, { Vdq, Ev, Zz }, 0, s1W2R },
3063     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
3064   },
3065   { /* SSE6F */
3066     { e_movq, t_done, 0, true, { Pq, Qq, Zz }, 0, s1W2R },
3067     { e_movdqu, t_done, 0, true, { Vdq, Wdq, Zz }, 0, s1W2R }, // book has this/next swapped!!!
3068     { e_movdqa, t_done, 0, true, { Vdq, Wdq, Zz }, 0, s1W2R },
3069     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
3070   },
3071   { /* SSE70 */
3072     { e_pshufw, t_done, 0, true, { Pq, Qq, Ib }, 0, s1W2R3R },
3073     { e_pshufhw, t_done, 0, true, { Vdq, Wdq, Ib }, 0, s1W2R3R }, // book has this/next swapped!!!
3074     { e_pshufd, t_done, 0, true, { Vdq, Wdq, Ib }, 0, s1W2R3R },
3075     { e_pshuflw, t_done, 0, true, { Vdq, Wdq, Ib }, 0, s1W2R3R },
3076   },
3077   { /* SSE74 */
3078     { e_pcmpeqb, t_done, 0, true, { Pq, Qq, Zz }, 0, s1R2R },
3079     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
3080     { e_pcmpeqb, t_done, 0, true, { Vdq, Wdq, Zz }, 0, s1R2R },
3081     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
3082   },
3083   { /* SSE75 */
3084     { e_pcmpeqw, t_done, 0, true, { Pq, Qq, Zz }, 0, s1R2R },
3085     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
3086     { e_pcmpeqw, t_done, 0, true, { Vdq, Wdq, Zz }, 0, s1R2R },
3087     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
3088   },
3089   { /* SSE76 */
3090     { e_pcmpeqd, t_done, 0, true, { Pq, Qq, Zz }, 0, s1R2R },
3091     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
3092     { e_pcmpeqd, t_done, 0, true, { Vdq, Wdq, Zz }, 0, s1R2R },
3093     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
3094   },
3095   { /* SSE78 */
3096     { e_vmread, t_done, 0, true, { Ed, Gd, Zz }, 0, 0 },
3097     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
3098     { e_No_Entry, t_grp, Grp17, false, { Zz, Zz, Zz }, 0, 0 },
3099     { e_insertq, t_done, 0, true, {Vdq, VRq, Iw}, 0, s1RW2R3R}, // This is actually 2 8-bit immediates, treat as 1 16-bit for decode
3100   },
3101   { /* SSE79 */
3102     { e_vmwrite, t_done, 0, true, { Ed, Gd, Zz }, 0, 0 },
3103     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
3104     { e_extrq, t_done, 0, true, {Vdq, VRq, Zz}, 0, s1RW2R},
3105     { e_insertq, t_done, 0, true, {Vdq, VRdq, Zz}, 0, s1RW2R},
3106   },
3107   { /* SSE7C */
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_haddpd, t_done, 0, true, { Vpd, Wpd, Zz }, 0, s1RW2R },
3111     { e_haddps, t_done, 0, true, { Vps, Wps, Zz }, 0, s1RW2R },
3112   },
3113   { /* SSE7D */
3114     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
3115     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
3116     { e_hsubpd, t_done, 0, true, { Vpd, Wpd, Zz }, 0, s1RW2R },
3117     { e_hsubps, t_done, 0, true, { Vps, Wps, Zz }, 0, s1RW2R },
3118   },
3119   { /* SSE7E */
3120     { e_movd, t_done, 0, true, { Ev, Pd, Zz }, 0, s1W2R },
3121     { e_movq, t_done, 0, true, { Vq, Wq, Zz }, 0, s1W2R }, // book has this and next swapped!!!
3122     { e_movd, t_done, 0, true, { Ev, Vdq, Zz }, 0, s1W2R },
3123     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
3124   },
3125   { /* SSE7F */
3126     { e_movq, t_done, 0, true, { Qq, Pq, Zz }, 0, s1W2R },
3127     { e_movdqu, t_done, 0, true, { Wdq, Vdq, Zz }, 0, s1W2R }, // book has this and next swapped!!!
3128     { e_movdqa, t_done, 0, true, { Wdq, Vdq, Zz }, 0, s1W2R },
3129     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
3130   },
3131   { /* SSEB8 */
3132     { e_jmpe, t_done, 0, false, { Jz, Zz, Zz }, 0, s1R },
3133     { e_popcnt, t_done, 0, true, { Gv, Ev, Zz }, 0, s1W2R },
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   },
3137   { /* SSEC2 */
3138     { e_cmpps, t_done, 0, true, { Vps, Wps, Ib }, 0, s1RW2R3R }, // comparison writes to dest!
3139     { e_cmpss, t_done, 0, true, { Vss, Wss, Ib }, 0, s1RW2R3R },
3140     { e_cmppd, t_done, 0, true, { Vpd, Wpd, Ib }, 0, s1RW2R3R },
3141     { e_cmpsd_sse, t_done, 0, true, { Vsd, Wsd, Ib }, 0, s1RW2R3R },
3142   },
3143   { /* SSEC4 */
3144     { e_pinsrw, t_done, 0, true, { Pq, Ed, Ib }, 0, s1RW2R3R },
3145     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
3146     { e_pinsrw, t_done, 0, true, { Vdq, Ed, Ib }, 0, s1RW2R3R },
3147     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
3148   },
3149   { /* SSEC5 */
3150     { e_pextrw, t_done, 0, true, { Gd, Pq, Ib }, 0, s1W2R3R },
3151     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
3152     { e_pextrw, t_done, 0, true, { Gd, Vdq, Ib }, 0, s1W2R3R },
3153     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
3154   },
3155   { /* SSEC6 */
3156     { e_shufps, t_done, 0, true, { Vps, Wps, Ib }, 0, s1RW2R3R },
3157     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
3158     { e_shufpd, t_done, 0, true, { Vpd, Wpd, Ib }, 0, s1RW2R3R },
3159     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
3160   },
3161   { /* SSED0 */
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_addsubpd, t_done, 0, true, { Vdq, Wdq, Zz }, 0, s1RW2R },
3165     { e_addsubps, t_done, 0, true, { Vdq, Wdq, Zz }, 0, s1RW2R },
3166   },
3167   { /* SSED1 */
3168     { e_psrlw, t_done, 0, true, { Pq, Qq, Zz }, 0, s1RW2R },
3169     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
3170     { e_psrlw, t_done, 0, true, { Vdq, Wdq, Zz }, 0, s1RW2R },
3171     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
3172   },
3173   { /* SSED2 */
3174     { e_psrld, t_done, 0, true, { Pq, Qq, Zz }, 0, s1RW2R },
3175     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
3176     { e_psrld, t_done, 0, true, { Vdq, Wdq, Zz }, 0, s1RW2R },
3177     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
3178   },
3179   { /* SSED3 */
3180     { e_psrlq, t_done, 0, true, { Pq, Qq, Zz }, 0, s1RW2R },
3181     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
3182     { e_psrlq, t_done, 0, true, { Vdq, Wdq, Zz }, 0, s1RW2R },
3183     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
3184   },
3185   { /* SSED4 */
3186     { e_paddq, t_done, 0, true, { Pq, Qq, Zz }, 0, s1RW2R },
3187     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
3188     { e_paddq, t_done, 0, true, { Vdq, Wdq, Zz }, 0, s1RW2R },
3189     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
3190   },
3191   { /* SSED5 */
3192     { e_pmullw, t_done, 0, true, { Pq, Qq, Zz }, 0, s1RW2R },
3193     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
3194     { e_pmullw, t_done, 0, true, { Vdq, Wdq, Zz }, 0, s1RW2R },
3195     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
3196   },
3197   { /* SSED6 */
3198     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
3199     { e_movq2dq, t_done, 0, true, { Vdq, Qq, Zz }, 0, s1W2R }, // lines jumbled in book
3200     { e_movq, t_done, 0, true, { Wq, Vq, Zz }, 0, s1W2R },
3201     { e_movdq2q, t_done, 0, true, { Pq, Wq, Zz }, 0, s1W2R },
3202   },
3203   { /* SSED7 */
3204     { e_pmovmskb, t_done, 0, true, { Gd, Pq, Zz }, 0, s1W2R },
3205     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
3206     { e_pmovmskb, t_done, 0, true, { Gd, Vdq, Zz }, 0, s1W2R },
3207     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
3208   },
3209   { /* SSED8 */
3210     { e_psubusb, t_done, 0, true, { Pq, Qq, Zz }, 0, s1RW2R },
3211     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
3212     { e_psubusb, t_done, 0, true, { Vdq, Wdq, Zz }, 0, s1RW2R },
3213     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
3214   },
3215   { /* SSED9 */
3216     { e_psubusw, t_done, 0, true, { Pq, Qq, Zz }, 0, s1RW2R },
3217     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
3218     { e_psubusw, t_done, 0, true, { Vdq, Wdq, Zz }, 0, s1RW2R },
3219     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
3220   },
3221   { /* SSEDA */
3222     { e_pminub, t_done, 0, true, { Pq, Qq, Zz }, 0, s1RW2R },
3223     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
3224     { e_pminub, t_done, 0, true, { Vdq, Wdq, Zz }, 0, s1RW2R },
3225     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
3226   },
3227   { /* SSEDB */
3228     { e_pand, t_done, 0, true, { Pq, Qq, Zz }, 0, s1RW2R },
3229     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
3230     { e_pand, t_done, 0, true, { Vdq, Wdq, Zz }, 0, s1RW2R },
3231     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
3232   },
3233   { /* SSEDC */
3234     { e_paddusb, t_done, 0, true, { Pq, Qq, Zz }, 0, s1RW2R },
3235     { e_No_Entry, t_ill, 0, false, { Zz, Zz, Zz }, 0, 0 },
3236     { e_paddusb, t_done, 0, true, { Vdq, Wdq, Zz }, 0,