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