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