- added instructions how to update the online documentation
[bochs-mirror.git] / cpu / fetchdecode64.cc
blobc8960990c8af7bbb09ce2140fd14fb47a8cfa273
1 /////////////////////////////////////////////////////////////////////////
2 // $Id: fetchdecode64.cc,v 1.220 2008/09/16 19:20:02 sshwarts Exp $
3 /////////////////////////////////////////////////////////////////////////
4 //
5 // Copyright (C) 2001 MandrakeSoft S.A.
6 //
7 // MandrakeSoft S.A.
8 // 43, rue d'Aboukir
9 // 75002 Paris - France
10 // http://www.linux-mandrake.com/
11 // http://www.mandrakesoft.com/
13 // This library is free software; you can redistribute it and/or
14 // modify it under the terms of the GNU Lesser General Public
15 // License as published by the Free Software Foundation; either
16 // version 2 of the License, or (at your option) any later version.
18 // This library is distributed in the hope that it will be useful,
19 // but WITHOUT ANY WARRANTY; without even the implied warranty of
20 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21 // Lesser General Public License for more details.
23 // You should have received a copy of the GNU Lesser General Public
24 // License along with this library; if not, write to the Free Software
25 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
27 /////////////////////////////////////////////////////////////////////////
29 #define NEED_CPU_REG_SHORTCUTS 1
30 #include "bochs.h"
31 #include "cpu.h"
32 #define LOG_THIS BX_CPU_THIS_PTR
34 #if BX_SUPPORT_X86_64
36 ///////////////////////////
37 // prefix bytes
38 // opcode bytes
39 // modrm/sib
40 // address displacement
41 // immediate constant
42 ///////////////////////////
44 // The table for 64-bit is slightly different from the
45 // table for 32-bit due to undefined opcodes, which
46 // were valid in 32-bit mode
48 #define X 0 /* undefined opcode */
50 static const Bit8u BxOpcodeHasModrm64[512] = {
51 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
52 /* ------------------------------- */
53 /* 00 */ 1,1,1,1,0,0,X,X,1,1,1,1,0,0,X,X,
54 /* 10 */ 1,1,1,1,0,0,X,X,1,1,1,1,0,0,X,X,
55 /* 20 */ 1,1,1,1,0,0,X,X,1,1,1,1,0,0,X,X,
56 /* 30 */ 1,1,1,1,0,0,X,X,1,1,1,1,0,0,X,X,
57 /* 40 */ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
58 /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
59 /* 60 */ X,X,X,1,X,X,X,X,0,1,0,1,0,0,0,0,
60 /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
61 /* 80 */ 1,1,X,1,1,1,1,1,1,1,1,1,1,1,1,1,
62 /* 90 */ 0,0,0,0,0,0,0,0,0,0,X,0,0,0,0,0,
63 /* A0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
64 /* B0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
65 /* C0 */ 1,1,0,0,X,X,1,1,0,0,0,0,0,0,X,0,
66 /* D0 */ 1,1,1,1,X,X,X,0,1,1,1,1,1,1,1,1,
67 /* E0 */ 0,0,0,0,0,0,0,0,0,0,X,0,0,0,0,0,
68 /* F0 */ X,0,X,X,0,0,1,1,0,0,0,0,0,0,1,1,
69 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
70 /* ------------------------------- */
71 1,1,1,1,X,0,0,0,0,0,X,0,X,1,0,1, /* 0F 00 */
72 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 0F 10 */
73 1,1,1,1,X,X,X,X,1,1,1,1,1,1,1,1, /* 0F 20 */
74 0,0,0,0,X,X,X,X,1,X,1,X,X,X,X,X, /* 0F 30 */
75 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 0F 40 */
76 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 0F 50 */
77 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 0F 60 */
78 1,1,1,1,1,1,1,0,X,X,X,X,1,1,1,1, /* 0F 70 */
79 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0F 80 */
80 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 0F 90 */
81 0,0,0,1,1,1,X,X,0,0,0,1,1,1,1,1, /* 0F A0 */
82 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 0F B0 */
83 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* 0F C0 */
84 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 0F D0 */
85 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 0F E0 */
86 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,X /* 0F F0 */
87 /* ------------------------------- */
88 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
91 #undef X
93 /* *********** */
94 // LOCK PREFIX //
95 /* *********** */
98 * The LOCK prefix can be prepended only to the following instructions
99 * and only to those forms of the instructions where the destination
100 * operand is a memory operand: ADD, ADC, AND, BTC, BTR, BTS, CMPXCHG,
101 * CMPXCH8B, DEC, INC, NEG, NOT, OR, SBB, SUB, XOR, XADD, and XCHG. If
102 * the LOCK prefix is used with one of these instructions and the source
103 * operand is a memory operand, an undefined opcode exception (#UD) will
104 * be generated. An undefined opcode exception will also be generated if
105 * the LOCK prefix is used with any instruction not in the above list.
106 * The XCHG instruction always asserts the LOCK# signal regardless of the
107 * presence or absence of the LOCK prefix.
110 // Segment override prefixes
111 // -------------------------
112 // In 64-bit mode the CS, DS, ES, and SS segment overrides are ignored.
114 // decoding instructions; accessing seg reg's by index
115 static unsigned sreg_mod01or10_rm32[16] = {
116 BX_SEG_REG_DS,
117 BX_SEG_REG_DS,
118 BX_SEG_REG_DS,
119 BX_SEG_REG_DS,
120 BX_SEG_REG_NULL, // escape to SIB-byte
121 BX_SEG_REG_SS,
122 BX_SEG_REG_DS,
123 BX_SEG_REG_DS,
124 BX_SEG_REG_DS,
125 BX_SEG_REG_DS,
126 BX_SEG_REG_DS,
127 BX_SEG_REG_DS,
128 BX_SEG_REG_NULL, // escape to SIB-byte
129 BX_SEG_REG_DS,
130 BX_SEG_REG_DS,
131 BX_SEG_REG_DS,
134 static unsigned sreg_mod0_base32[16] = {
135 BX_SEG_REG_DS,
136 BX_SEG_REG_DS,
137 BX_SEG_REG_DS,
138 BX_SEG_REG_DS,
139 BX_SEG_REG_SS,
140 BX_SEG_REG_DS,
141 BX_SEG_REG_DS,
142 BX_SEG_REG_DS,
143 BX_SEG_REG_DS,
144 BX_SEG_REG_DS,
145 BX_SEG_REG_DS,
146 BX_SEG_REG_DS,
147 BX_SEG_REG_DS,
148 BX_SEG_REG_DS,
149 BX_SEG_REG_DS,
150 BX_SEG_REG_DS
153 static unsigned sreg_mod1or2_base32[16] = {
154 BX_SEG_REG_DS,
155 BX_SEG_REG_DS,
156 BX_SEG_REG_DS,
157 BX_SEG_REG_DS,
158 BX_SEG_REG_SS,
159 BX_SEG_REG_SS,
160 BX_SEG_REG_DS,
161 BX_SEG_REG_DS,
162 BX_SEG_REG_DS,
163 BX_SEG_REG_DS,
164 BX_SEG_REG_DS,
165 BX_SEG_REG_DS,
166 BX_SEG_REG_DS,
167 BX_SEG_REG_DS,
168 BX_SEG_REG_DS,
169 BX_SEG_REG_DS
172 // common fetchdecode32/64 opcode tables
173 #include "fetchdecode.h"
175 // table of all Bochs opcodes
176 extern struct bxIAOpcodeTable BxOpcodesTable[];
178 // 512 entries for 16bit operand size
179 // 512 entries for 32bit operand size
180 // 512 entries for 64bit operand size
182 static const BxOpcodeInfo_t BxOpcodeInfo64R[512*3] = {
183 // 512 entries for 16bit operand size
184 /* 00 /wr */ { BxArithDstRM, BX_IA_ADD_GbEbR },
185 /* 01 /wr */ { BxArithDstRM, BX_IA_ADD_GwEwR },
186 /* 02 /wr */ { 0, BX_IA_ADD_GbEbR },
187 /* 03 /wr */ { 0, BX_IA_ADD_GwEwR },
188 /* 04 /wr */ { BxImmediate_Ib, BX_IA_ADD_ALIb },
189 /* 05 /wr */ { BxImmediate_Iw, BX_IA_ADD_AXIw },
190 /* 06 /wr */ { 0, BX_IA_ERROR },
191 /* 07 /wr */ { 0, BX_IA_ERROR },
192 /* 08 /wr */ { BxArithDstRM, BX_IA_OR_GbEbR },
193 /* 09 /wr */ { BxArithDstRM, BX_IA_OR_GwEwR },
194 /* 0A /wr */ { 0, BX_IA_OR_GbEbR },
195 /* 0B /wr */ { 0, BX_IA_OR_GwEwR },
196 /* 0C /wr */ { BxImmediate_Ib, BX_IA_OR_ALIb },
197 /* 0D /wr */ { BxImmediate_Iw, BX_IA_OR_AXIw },
198 /* 0E /wr */ { 0, BX_IA_ERROR },
199 /* 0F /wr */ { 0, BX_IA_ERROR }, // 2-byte escape
200 /* 10 /wr */ { BxArithDstRM, BX_IA_ADC_GbEbR },
201 /* 11 /wr */ { BxArithDstRM, BX_IA_ADC_GwEwR },
202 /* 12 /wr */ { 0, BX_IA_ADC_GbEbR },
203 /* 13 /wr */ { 0, BX_IA_ADC_GwEwR },
204 /* 14 /wr */ { BxImmediate_Ib, BX_IA_ADC_ALIb },
205 /* 15 /wr */ { BxImmediate_Iw, BX_IA_ADC_AXIw },
206 /* 16 /wr */ { 0, BX_IA_ERROR },
207 /* 17 /wr */ { 0, BX_IA_ERROR },
208 /* 18 /wr */ { BxArithDstRM, BX_IA_SBB_GbEbR },
209 /* 19 /wr */ { BxArithDstRM, BX_IA_SBB_GwEwR },
210 /* 1A /wr */ { 0, BX_IA_SBB_GbEbR },
211 /* 1B /wr */ { 0, BX_IA_SBB_GwEwR },
212 /* 1C /wr */ { BxImmediate_Ib, BX_IA_SBB_ALIb },
213 /* 1D /wr */ { BxImmediate_Iw, BX_IA_SBB_AXIw },
214 /* 1E /wr */ { 0, BX_IA_ERROR },
215 /* 1F /wr */ { 0, BX_IA_ERROR },
216 /* 20 /wr */ { BxArithDstRM, BX_IA_AND_GbEbR },
217 /* 21 /wr */ { BxArithDstRM, BX_IA_AND_GwEwR },
218 /* 22 /wr */ { 0, BX_IA_AND_GbEbR },
219 /* 23 /wr */ { 0, BX_IA_AND_GwEwR },
220 /* 24 /wr */ { BxImmediate_Ib, BX_IA_AND_ALIb },
221 /* 25 /wr */ { BxImmediate_Iw, BX_IA_AND_AXIw },
222 /* 26 /wr */ { 0, BX_IA_ERROR }, // ES:
223 /* 27 /wr */ { 0, BX_IA_ERROR },
224 /* 28 /wr */ { BxArithDstRM, BX_IA_SUB_GbEbR },
225 /* 29 /wr */ { BxArithDstRM, BX_IA_SUB_GwEwR },
226 /* 2A /wr */ { 0, BX_IA_SUB_GbEbR },
227 /* 2B /wr */ { 0, BX_IA_SUB_GwEwR },
228 /* 2C /wr */ { BxImmediate_Ib, BX_IA_SUB_ALIb },
229 /* 2D /wr */ { BxImmediate_Iw, BX_IA_SUB_AXIw },
230 /* 2E /wr */ { 0, BX_IA_ERROR }, // CS:
231 /* 2F /wr */ { 0, BX_IA_ERROR },
232 /* 30 /wr */ { BxArithDstRM, BX_IA_XOR_GbEbR },
233 /* 31 /wr */ { BxArithDstRM, BX_IA_XOR_GwEwR },
234 /* 32 /wr */ { 0, BX_IA_XOR_GbEbR },
235 /* 33 /wr */ { 0, BX_IA_XOR_GwEwR },
236 /* 34 /wr */ { BxImmediate_Ib, BX_IA_XOR_ALIb },
237 /* 35 /wr */ { BxImmediate_Iw, BX_IA_XOR_AXIw },
238 /* 36 /wr */ { 0, BX_IA_ERROR }, // SS:
239 /* 37 /wr */ { 0, BX_IA_ERROR },
240 /* 38 /wr */ { BxArithDstRM, BX_IA_CMP_GbEbR },
241 /* 39 /wr */ { BxArithDstRM, BX_IA_CMP_GwEwR },
242 /* 3A /wr */ { 0, BX_IA_CMP_GbEbR },
243 /* 3B /wr */ { 0, BX_IA_CMP_GwEwR },
244 /* 3C /wr */ { BxImmediate_Ib, BX_IA_CMP_ALIb },
245 /* 3D /wr */ { BxImmediate_Iw, BX_IA_CMP_AXIw },
246 /* 3E /wr */ { 0, BX_IA_ERROR }, // DS:
247 /* 3F /wr */ { 0, BX_IA_ERROR },
248 /* 40 /wr */ { 0, BX_IA_ERROR }, // REX:
249 /* 41 /wr */ { 0, BX_IA_ERROR }, // REX:
250 /* 42 /wr */ { 0, BX_IA_ERROR }, // REX:
251 /* 43 /wr */ { 0, BX_IA_ERROR }, // REX:
252 /* 44 /wr */ { 0, BX_IA_ERROR }, // REX:
253 /* 45 /wr */ { 0, BX_IA_ERROR }, // REX:
254 /* 46 /wr */ { 0, BX_IA_ERROR }, // REX:
255 /* 47 /wr */ { 0, BX_IA_ERROR }, // REX:
256 /* 48 /wr */ { 0, BX_IA_ERROR }, // REX:
257 /* 49 /wr */ { 0, BX_IA_ERROR }, // REX:
258 /* 4A /wr */ { 0, BX_IA_ERROR }, // REX:
259 /* 4B /wr */ { 0, BX_IA_ERROR }, // REX:
260 /* 4C /wr */ { 0, BX_IA_ERROR }, // REX:
261 /* 4D /wr */ { 0, BX_IA_ERROR }, // REX:
262 /* 4E /wr */ { 0, BX_IA_ERROR }, // REX:
263 /* 4F /wr */ { 0, BX_IA_ERROR }, // REX:
264 /* 50 /wr */ { 0, BX_IA_PUSH_RX },
265 /* 51 /wr */ { 0, BX_IA_PUSH_RX },
266 /* 52 /wr */ { 0, BX_IA_PUSH_RX },
267 /* 53 /wr */ { 0, BX_IA_PUSH_RX },
268 /* 54 /wr */ { 0, BX_IA_PUSH_RX },
269 /* 55 /wr */ { 0, BX_IA_PUSH_RX },
270 /* 56 /wr */ { 0, BX_IA_PUSH_RX },
271 /* 57 /wr */ { 0, BX_IA_PUSH_RX },
272 /* 58 /wr */ { 0, BX_IA_POP_RX },
273 /* 59 /wr */ { 0, BX_IA_POP_RX },
274 /* 5A /wr */ { 0, BX_IA_POP_RX },
275 /* 5B /wr */ { 0, BX_IA_POP_RX },
276 /* 5C /wr */ { 0, BX_IA_POP_RX },
277 /* 5D /wr */ { 0, BX_IA_POP_RX },
278 /* 5E /wr */ { 0, BX_IA_POP_RX },
279 /* 5F /wr */ { 0, BX_IA_POP_RX },
280 /* 60 /wr */ { 0, BX_IA_ERROR },
281 /* 61 /wr */ { 0, BX_IA_ERROR },
282 /* 62 /wr */ { 0, BX_IA_ERROR },
283 /* 63 /wr */ { 0, BX_IA_MOV_GwEwR }, // MOVSX_GwEw
284 /* 64 /wr */ { 0, BX_IA_ERROR }, // FS:
285 /* 65 /wr */ { 0, BX_IA_ERROR }, // GS:
286 /* 66 /wr */ { 0, BX_IA_ERROR }, // OS:
287 /* 67 /wr */ { 0, BX_IA_ERROR }, // AS:
288 /* 68 /wr */ { BxImmediate_Iw, BX_IA_PUSH_Iw },
289 /* 69 /wr */ { BxImmediate_Iw, BX_IA_IMUL_GwEwIwR },
290 /* 6A /wr */ { BxImmediate_Ib_SE, BX_IA_PUSH_Iw },
291 /* 6B /wr */ { BxImmediate_Ib_SE, BX_IA_IMUL_GwEwIwR },
292 /* 6C /wr */ { 0, BX_IA_REP_INSB_YbDX },
293 /* 6D /wr */ { 0, BX_IA_REP_INSW_YwDX },
294 /* 6E /wr */ { 0, BX_IA_REP_OUTSB_DXXb },
295 /* 6F /wr */ { 0, BX_IA_REP_OUTSW_DXXw },
296 /* 70 /wr */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JO_Jq },
297 /* 71 /wr */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JNO_Jq },
298 /* 72 /wr */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JB_Jq },
299 /* 73 /wr */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JNB_Jq },
300 /* 74 /wr */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JZ_Jq },
301 /* 75 /wr */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JNZ_Jq },
302 /* 76 /wr */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JBE_Jq },
303 /* 77 /wr */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JNBE_Jq },
304 /* 78 /wr */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JS_Jq },
305 /* 79 /wr */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JNS_Jq },
306 /* 7A /wr */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JP_Jq },
307 /* 7B /wr */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JNP_Jq },
308 /* 7C /wr */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JL_Jq },
309 /* 7D /wr */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JNL_Jq },
310 /* 7E /wr */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JLE_Jq },
311 /* 7F /wr */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JNLE_Jq },
312 /* 80 /wr */ { BxGroup1 | BxImmediate_Ib, BX_IA_ERROR, BxOpcodeInfoG1EbIbR },
313 /* 81 /wr */ { BxGroup1 | BxImmediate_Iw, BX_IA_ERROR, BxOpcodeInfoG1EwR },
314 /* 82 /wr */ { 0, BX_IA_ERROR },
315 /* 83 /wr */ { BxGroup1 | BxImmediate_Ib_SE, BX_IA_ERROR, BxOpcodeInfoG1EwR },
316 /* 84 /wr */ { 0, BX_IA_TEST_EbGbR },
317 /* 85 /wr */ { 0, BX_IA_TEST_EwGwR },
318 /* 86 /wr */ { 0, BX_IA_XCHG_EbGbR },
319 /* 87 /wr */ { 0, BX_IA_XCHG_EwGwR },
320 /* 88 /wr */ { BxArithDstRM, BX_IA_MOV_GbEbR },
321 /* 89 /wr */ { BxArithDstRM, BX_IA_MOV_GwEwR },
322 /* 8A /wr */ { 0, BX_IA_MOV_GbEbR },
323 /* 8B /wr */ { 0, BX_IA_MOV_GwEwR },
324 /* 8C /wr */ { 0, BX_IA_MOV_EwSwR },
325 /* 8D /wr */ { 0, BX_IA_ERROR }, // LEA
326 /* 8E /wr */ { 0, BX_IA_MOV_SwEw },
327 /* 8F /wr */ { BxGroup1A, BX_IA_ERROR, BxOpcodeInfoG1AEwR },
328 /* 90 /wr */ { 0, BX_IA_XCHG_RXAX }, // handles XCHG R8w, AX
329 /* 91 /wr */ { 0, BX_IA_XCHG_RXAX },
330 /* 92 /wr */ { 0, BX_IA_XCHG_RXAX },
331 /* 93 /wr */ { 0, BX_IA_XCHG_RXAX },
332 /* 94 /wr */ { 0, BX_IA_XCHG_RXAX },
333 /* 95 /wr */ { 0, BX_IA_XCHG_RXAX },
334 /* 96 /wr */ { 0, BX_IA_XCHG_RXAX },
335 /* 97 /wr */ { 0, BX_IA_XCHG_RXAX },
336 /* 98 /wr */ { 0, BX_IA_CBW },
337 /* 99 /wr */ { 0, BX_IA_CWD },
338 /* 9A /wr */ { 0, BX_IA_ERROR },
339 /* 9B /wr */ { 0, BX_IA_FWAIT },
340 /* 9C /wr */ { 0, BX_IA_PUSHF_Fw },
341 /* 9D /wr */ { 0, BX_IA_POPF_Fw },
342 /* 9E /wr */ { 0, BX_IA_SAHF },
343 /* 9F /wr */ { 0, BX_IA_LAHF },
344 /* A0 /wr */ { BxImmediate_O, BX_IA_MOV_ALOq },
345 /* A1 /wr */ { BxImmediate_O, BX_IA_MOV_AXOq },
346 /* A2 /wr */ { BxImmediate_O, BX_IA_MOV_OqAL },
347 /* A3 /wr */ { BxImmediate_O, BX_IA_MOV_OqAX },
348 /* A4 /wr */ { 0, BX_IA_REP_MOVSB_XbYb },
349 /* A5 /wr */ { 0, BX_IA_REP_MOVSW_XwYw },
350 /* A6 /wr */ { 0, BX_IA_REP_CMPSB_XbYb },
351 /* A7 /wr */ { 0, BX_IA_REP_CMPSW_XwYw },
352 /* A8 /wr */ { BxImmediate_Ib, BX_IA_TEST_ALIb },
353 /* A9 /wr */ { BxImmediate_Iw, BX_IA_TEST_AXIw },
354 /* AA /wr */ { 0, BX_IA_REP_STOSB_YbAL },
355 /* AB /wr */ { 0, BX_IA_REP_STOSW_YwAX },
356 /* AC /wr */ { 0, BX_IA_REP_LODSB_ALXb },
357 /* AD /wr */ { 0, BX_IA_REP_LODSW_AXXw },
358 /* AE /wr */ { 0, BX_IA_REP_SCASB_ALXb },
359 /* AF /wr */ { 0, BX_IA_REP_SCASW_AXXw },
360 /* B0 /wr */ { BxImmediate_Ib, BX_IA_MOV_RLIb },
361 /* B1 /wr */ { BxImmediate_Ib, BX_IA_MOV_RLIb },
362 /* B2 /wr */ { BxImmediate_Ib, BX_IA_MOV_RLIb },
363 /* B3 /wr */ { BxImmediate_Ib, BX_IA_MOV_RLIb },
364 /* B4 /wr */ { BxImmediate_Ib, BX_IA_MOV_RLIb },
365 /* B5 /wr */ { BxImmediate_Ib, BX_IA_MOV_RLIb },
366 /* B6 /wr */ { BxImmediate_Ib, BX_IA_MOV_RLIb },
367 /* B7 /wr */ { BxImmediate_Ib, BX_IA_MOV_RLIb },
368 /* B8 /wr */ { BxImmediate_Iw, BX_IA_MOV_RXIw },
369 /* B9 /wr */ { BxImmediate_Iw, BX_IA_MOV_RXIw },
370 /* BA /wr */ { BxImmediate_Iw, BX_IA_MOV_RXIw },
371 /* BB /wr */ { BxImmediate_Iw, BX_IA_MOV_RXIw },
372 /* BC /wr */ { BxImmediate_Iw, BX_IA_MOV_RXIw },
373 /* BD /wr */ { BxImmediate_Iw, BX_IA_MOV_RXIw },
374 /* BE /wr */ { BxImmediate_Iw, BX_IA_MOV_RXIw },
375 /* BF /wr */ { BxImmediate_Iw, BX_IA_MOV_RXIw },
376 /* C0 /wr */ { BxGroup2 | BxImmediate_Ib, BX_IA_ERROR, BxOpcodeInfoG2Eb },
377 /* C1 /wr */ { BxGroup2 | BxImmediate_Ib, BX_IA_ERROR, BxOpcodeInfoG2Ew },
378 /* C2 /wr */ { BxImmediate_Iw | BxTraceEnd, BX_IA_RETnear64_Iw },
379 /* C3 /wr */ { BxTraceEnd, BX_IA_RETnear64 },
380 /* C4 /wr */ { 0, BX_IA_ERROR },
381 /* C5 /wr */ { 0, BX_IA_ERROR },
382 /* C6 /wr */ { BxGroup11, BX_IA_ERROR, BxOpcodeInfoG11EbR },
383 /* C7 /wr */ { BxGroup11, BX_IA_ERROR, BxOpcodeInfoG11EwR },
384 /* C8 /wr */ { BxImmediate_IwIb, BX_IA_ENTER64_IwIb },
385 /* C9 /wr */ { 0, BX_IA_LEAVE64 },
386 /* CA /wr */ { BxImmediate_Iw | BxTraceEnd, BX_IA_RETfar16_Iw },
387 /* CB /wr */ { BxTraceEnd, BX_IA_RETfar16 },
388 /* CC /wr */ { BxTraceEnd, BX_IA_INT3 },
389 /* CD /wr */ { BxImmediate_Ib | BxTraceEnd, BX_IA_INT_Ib },
390 /* CE /wr */ { 0, BX_IA_ERROR },
391 /* CF /wr */ { BxTraceEnd, BX_IA_IRET64 },
392 /* D0 /wr */ { BxGroup2 | BxImmediate_I1, BX_IA_ERROR, BxOpcodeInfoG2Eb },
393 /* D1 /wr */ { BxGroup2 | BxImmediate_I1, BX_IA_ERROR, BxOpcodeInfoG2Ew },
394 /* D2 /wr */ { BxGroup2, BX_IA_ERROR, BxOpcodeInfoG2Eb },
395 /* D3 /wr */ { BxGroup2, BX_IA_ERROR, BxOpcodeInfoG2Ew },
396 /* D4 /wr */ { 0, BX_IA_ERROR },
397 /* D5 /wr */ { 0, BX_IA_ERROR },
398 /* D6 /wr */ { 0, BX_IA_ERROR },
399 /* D7 /wr */ { 0, BX_IA_XLAT },
400 /* D8 /wr */ { BxFPEscape, BX_IA_ERROR, BxOpcodeInfo_FloatingPointD8 },
401 /* D9 /wr */ { BxFPEscape, BX_IA_ERROR, BxOpcodeInfo_FloatingPointD9 },
402 /* DA /wr */ { BxFPEscape, BX_IA_ERROR, BxOpcodeInfo_FloatingPointDA },
403 /* DB /wr */ { BxFPEscape, BX_IA_ERROR, BxOpcodeInfo_FloatingPointDB },
404 /* DC /wr */ { BxFPEscape, BX_IA_ERROR, BxOpcodeInfo_FloatingPointDC },
405 /* DD /wr */ { BxFPEscape, BX_IA_ERROR, BxOpcodeInfo_FloatingPointDD },
406 /* DE /wr */ { BxFPEscape, BX_IA_ERROR, BxOpcodeInfo_FloatingPointDE },
407 /* DF /wr */ { BxFPEscape, BX_IA_ERROR, BxOpcodeInfo_FloatingPointDF },
408 /* E0 /wr */ { BxImmediate_BrOff8 | BxTraceEnd, BX_IA_LOOPNE64_Jb },
409 /* E1 /wr */ { BxImmediate_BrOff8 | BxTraceEnd, BX_IA_LOOPE64_Jb },
410 /* E2 /wr */ { BxImmediate_BrOff8 | BxTraceEnd, BX_IA_LOOP64_Jb },
411 /* E3 /wr */ { BxImmediate_BrOff8 | BxTraceEnd, BX_IA_JRCXZ_Jb },
412 /* E4 /wr */ { BxImmediate_Ib, BX_IA_IN_ALIb },
413 /* E5 /wr */ { BxImmediate_Ib, BX_IA_IN_AXIb },
414 /* E6 /wr */ { BxImmediate_Ib, BX_IA_OUT_IbAL },
415 /* E7 /wr */ { BxImmediate_Ib, BX_IA_OUT_IbAX },
416 /* E8 /wr */ { BxImmediate_BrOff32 | BxTraceEnd, BX_IA_CALL_Jq },
417 /* E9 /wr */ { BxImmediate_BrOff32 | BxTraceEnd, BX_IA_JMP_Jq },
418 /* EA /wr */ { 0, BX_IA_ERROR },
419 /* EB /wr */ { BxImmediate_BrOff8 | BxTraceEnd, BX_IA_JMP_Jq },
420 /* EC /wr */ { 0, BX_IA_IN_ALDX },
421 /* ED /wr */ { 0, BX_IA_IN_AXDX },
422 /* EE /wr */ { 0, BX_IA_OUT_DXAL },
423 /* EF /wr */ { 0, BX_IA_OUT_DXAX },
424 /* F0 /wr */ { 0, BX_IA_ERROR }, // LOCK
425 /* F1 /wr */ { BxTraceEnd, BX_IA_INT1 },
426 /* F2 /wr */ { 0, BX_IA_ERROR }, // REPNE/REPNZ
427 /* F3 /wr */ { 0, BX_IA_ERROR }, // REP, REPE/REPZ
428 /* F4 /wr */ { BxTraceEnd, BX_IA_HLT },
429 /* F5 /wr */ { 0, BX_IA_CMC },
430 /* F6 /wr */ { BxGroup3, BX_IA_ERROR, BxOpcodeInfoG3EbR },
431 /* F7 /wr */ { BxGroup3, BX_IA_ERROR, BxOpcodeInfoG3EwR },
432 /* F8 /wr */ { 0, BX_IA_CLC },
433 /* F9 /wr */ { 0, BX_IA_STC },
434 /* FA /wr */ { 0, BX_IA_CLI },
435 /* FB /wr */ { 0, BX_IA_STI },
436 /* FC /wr */ { 0, BX_IA_CLD },
437 /* FD /wr */ { 0, BX_IA_STD },
438 /* FE /wr */ { BxGroup4, BX_IA_ERROR, BxOpcodeInfoG4R },
439 /* FF /wr */ { BxGroup5, BX_IA_ERROR, BxOpcodeInfo64G5wR },
441 /* 0F 00 /wr */ { BxGroup6, BX_IA_ERROR, BxOpcodeInfoG6 },
442 /* 0F 01 /wr */ { BxGroup7, BX_IA_ERROR, BxOpcodeInfo64G7R },
443 /* 0F 02 /wr */ { 0, BX_IA_LAR_GvEw },
444 /* 0F 03 /wr */ { 0, BX_IA_LSL_GvEw },
445 /* 0F 04 /wr */ { 0, BX_IA_ERROR },
446 /* 0F 05 /wr */ { BxTraceEnd, BX_IA_SYSCALL },
447 /* 0F 06 /wr */ { 0, BX_IA_CLTS },
448 /* 0F 07 /wr */ { BxTraceEnd, BX_IA_SYSRET },
449 /* 0F 08 /wr */ { BxTraceEnd, BX_IA_INVD },
450 /* 0F 09 /wr */ { BxTraceEnd, BX_IA_WBINVD },
451 /* 0F 0A /wr */ { 0, BX_IA_ERROR },
452 /* 0F 0B /wr */ { BxTraceEnd, BX_IA_UD2A },
453 /* 0F 0C /wr */ { 0, BX_IA_ERROR },
454 /* 0F 0D /wr */ { 0, BX_IA_NOP }, // 3DNow! PREFETCH on AMD, NOP on Intel
455 /* 0F 0E /wr */ { 0, BX_IA_FEMMS }, // 3DNow! FEMMS
456 #if BX_SUPPORT_3DNOW
457 /* 0F 0F /wr */ { BxImmediate_Ib, BX_IA_ERROR, Bx3DNowOpcodeInfo },
458 #else
459 /* 0F 0F /wr */ { 0, BX_IA_ERROR },
460 #endif
461 /* 0F 10 /wr */ { BxPrefixSSE, BX_IA_MOVUPS_VpsWps, BxOpcodeGroupSSE_0f10 },
462 /* 0F 11 /wr */ { BxPrefixSSE, BX_IA_MOVUPS_WpsVps, BxOpcodeGroupSSE_0f11 },
463 /* 0F 12 /wr */ { BxPrefixSSE, BX_IA_MOVLPS_VpsMq, BxOpcodeGroupSSE_0f12 },
464 /* 0F 13 /wr */ { 0, BX_IA_ERROR }, // MOVLPS/PD SSE group
465 /* 0F 14 /wr */ { BxPrefixSSE, BX_IA_UNPCKLPS_VpsWdq, BxOpcodeGroupSSE_0f14 },
466 /* 0F 15 /wr */ { BxPrefixSSE, BX_IA_UNPCKHPS_VpsWdq, BxOpcodeGroupSSE_0f15 },
467 /* 0F 16 /wr */ { BxPrefixSSE, BX_IA_MOVHPS_VpsMq, BxOpcodeGroupSSE_0f16 },
468 /* 0F 17 /wr */ { 0, BX_IA_ERROR }, // MOHLPS/PD SSE group
469 /* 0F 18 /wr */ { 0, BX_IA_NOP }, // PREFETCH HINT
470 /* 0F 19 /wr */ { 0, BX_IA_NOP }, // multi-byte NOP
471 /* 0F 1A /wr */ { 0, BX_IA_NOP }, // multi-byte NOP
472 /* 0F 1B /wr */ { 0, BX_IA_NOP }, // multi-byte NOP
473 /* 0F 1C /wr */ { 0, BX_IA_NOP }, // multi-byte NOP
474 /* 0F 1D /wr */ { 0, BX_IA_NOP }, // multi-byte NOP
475 /* 0F 1E /wr */ { 0, BX_IA_NOP }, // multi-byte NOP
476 /* 0F 1F /wr */ { 0, BX_IA_NOP }, // multi-byte NOP
477 /* 0F 20 /wr */ { 0, BX_IA_MOV_RqCq },
478 /* 0F 21 /wr */ { 0, BX_IA_MOV_RqDq },
479 /* 0F 22 /wr */ { BxTraceEnd, BX_IA_MOV_CqRq },
480 /* 0F 23 /wr */ { BxTraceEnd, BX_IA_MOV_DqRq },
481 /* 0F 24 /wr */ { 0, BX_IA_ERROR },
482 /* 0F 25 /wr */ { 0, BX_IA_ERROR },
483 /* 0F 26 /wr */ { 0, BX_IA_ERROR },
484 /* 0F 27 /wr */ { 0, BX_IA_ERROR },
485 /* 0F 28 /wr */ { BxPrefixSSE, BX_IA_MOVAPS_VpsWps, BxOpcodeGroupSSE_0f28 },
486 /* 0F 29 /wr */ { BxPrefixSSE, BX_IA_MOVAPS_WpsVps, BxOpcodeGroupSSE_0f29 },
487 /* 0F 2A /wr */ { BxPrefixSSE, BX_IA_CVTPI2PS_VpsQq, BxOpcodeGroupSSE_0f2a },
488 /* 0F 2B /wr */ { 0, BX_IA_ERROR }, // MOVNTPS/PD/SS/SD
489 /* 0F 2C /wr */ { BxPrefixSSE, BX_IA_CVTTPS2PI_PqWps, BxOpcodeGroupSSE_0f2c },
490 /* 0F 2D /wr */ { BxPrefixSSE, BX_IA_CVTPS2PI_PqWps, BxOpcodeGroupSSE_0f2d },
491 /* 0F 2E /wr */ { BxPrefixSSE, BX_IA_UCOMISS_VssWss, BxOpcodeGroupSSE_0f2e },
492 /* 0F 2F /wr */ { BxPrefixSSE, BX_IA_COMISS_VpsWps, BxOpcodeGroupSSE_0f2f },
493 /* 0F 30 /wr */ { 0, BX_IA_WRMSR },
494 /* 0F 31 /wr */ { 0, BX_IA_RDTSC },
495 /* 0F 32 /wr */ { 0, BX_IA_RDMSR },
496 /* 0F 33 /wr */ { 0, BX_IA_RDPMC },
497 /* 0F 34 /wr */ { 0, BX_IA_SYSENTER },
498 /* 0F 35 /wr */ { 0, BX_IA_SYSEXIT },
499 /* 0F 36 /wr */ { 0, BX_IA_ERROR },
500 /* 0F 37 /wr */ { 0, BX_IA_ERROR },
501 #if (BX_SUPPORT_SSE >= 4) || (BX_SUPPORT_SSE >= 3 && BX_SUPPORT_SSE_EXTENSION > 0)
502 /* 0F 38 /wr */ { Bx3ByteOp, BX_IA_ERROR, BxOpcode3ByteTable0f38 }, // 3-byte escape
503 #else
504 /* 0F 38 /wr */ { 0, BX_IA_ERROR },
505 #endif
506 /* 0F 39 /wr */ { 0, BX_IA_ERROR },
507 #if (BX_SUPPORT_SSE >= 4) || (BX_SUPPORT_SSE >= 3 && BX_SUPPORT_SSE_EXTENSION > 0)
508 /* 0F 3A /wr */ { Bx3ByteOp, BX_IA_ERROR, BxOpcode3ByteTable0f3a }, // 3-byte escape
509 #else
510 /* 0F 3A /wr */ { 0, BX_IA_ERROR },
511 #endif
512 /* 0F 3B /wr */ { 0, BX_IA_ERROR },
513 /* 0F 3C /wr */ { 0, BX_IA_ERROR },
514 /* 0F 3D /wr */ { 0, BX_IA_ERROR },
515 /* 0F 3E /wr */ { 0, BX_IA_ERROR },
516 /* 0F 3F /wr */ { 0, BX_IA_ERROR },
517 /* 0F 40 /wr */ { 0, BX_IA_CMOVO_GwEwR },
518 /* 0F 41 /wr */ { 0, BX_IA_CMOVNO_GwEwR },
519 /* 0F 42 /wr */ { 0, BX_IA_CMOVB_GwEwR },
520 /* 0F 43 /wr */ { 0, BX_IA_CMOVNB_GwEwR },
521 /* 0F 44 /wr */ { 0, BX_IA_CMOVZ_GwEwR },
522 /* 0F 45 /wr */ { 0, BX_IA_CMOVNZ_GwEwR },
523 /* 0F 46 /wr */ { 0, BX_IA_CMOVBE_GwEwR },
524 /* 0F 47 /wr */ { 0, BX_IA_CMOVNBE_GwEwR },
525 /* 0F 48 /wr */ { 0, BX_IA_CMOVS_GwEwR },
526 /* 0F 49 /wr */ { 0, BX_IA_CMOVNS_GwEwR },
527 /* 0F 4A /wr */ { 0, BX_IA_CMOVP_GwEwR },
528 /* 0F 4B /wr */ { 0, BX_IA_CMOVNP_GwEwR },
529 /* 0F 4C /wr */ { 0, BX_IA_CMOVL_GwEwR },
530 /* 0F 4D /wr */ { 0, BX_IA_CMOVNL_GwEwR },
531 /* 0F 4E /wr */ { 0, BX_IA_CMOVLE_GwEwR },
532 /* 0F 4F /wr */ { 0, BX_IA_CMOVNLE_GwEwR },
533 /* 0F 50 /wr */ { BxPrefixSSE, BX_IA_MOVMSKPS_GdVRps, BxOpcodeGroupSSE_0f50 },
534 /* 0F 51 /wr */ { BxPrefixSSE, BX_IA_SQRTPS_VpsWps, BxOpcodeGroupSSE_0f51 },
535 /* 0F 52 /wr */ { BxPrefixSSE, BX_IA_RSQRTPS_VpsWps, BxOpcodeGroupSSE_0f52 },
536 /* 0F 53 /wr */ { BxPrefixSSE, BX_IA_RCPPS_VpsWps, BxOpcodeGroupSSE_0f53 },
537 /* 0F 54 /wr */ { BxPrefixSSE, BX_IA_ANDPS_VpsWps, BxOpcodeGroupSSE_0f54 },
538 /* 0F 55 /wr */ { BxPrefixSSE, BX_IA_ANDNPS_VpsWps, BxOpcodeGroupSSE_0f55 },
539 /* 0F 56 /wr */ { BxPrefixSSE, BX_IA_ORPS_VpsWps, BxOpcodeGroupSSE_0f56 },
540 /* 0F 57 /wr */ { BxPrefixSSE, BX_IA_XORPS_VpsWps, BxOpcodeGroupSSE_0f57 },
541 /* 0F 58 /wr */ { BxPrefixSSE, BX_IA_ADDPS_VpsWps, BxOpcodeGroupSSE_0f58 },
542 /* 0F 59 /wr */ { BxPrefixSSE, BX_IA_MULPS_VpsWps, BxOpcodeGroupSSE_0f59 },
543 /* 0F 5A /wr */ { BxPrefixSSE, BX_IA_CVTPS2PD_VpsWps, BxOpcodeGroupSSE_0f5a },
544 /* 0F 5B /wr */ { BxPrefixSSE, BX_IA_CVTDQ2PS_VpsWdq, BxOpcodeGroupSSE_0f5b },
545 /* 0F 5C /wr */ { BxPrefixSSE, BX_IA_SUBPS_VpsWps, BxOpcodeGroupSSE_0f5c },
546 /* 0F 5D /wr */ { BxPrefixSSE, BX_IA_MINPS_VpsWps, BxOpcodeGroupSSE_0f5d },
547 /* 0F 5E /wr */ { BxPrefixSSE, BX_IA_DIVPS_VpsWps, BxOpcodeGroupSSE_0f5e },
548 /* 0F 5F /wr */ { BxPrefixSSE, BX_IA_MAXPS_VpsWps, BxOpcodeGroupSSE_0f5f },
549 /* 0F 60 /wr */ { BxPrefixSSE, BX_IA_PUNPCKLBW_PqQd, BxOpcodeGroupSSE_0f60 },
550 /* 0F 61 /wr */ { BxPrefixSSE, BX_IA_PUNPCKLWD_PqQd, BxOpcodeGroupSSE_0f61 },
551 /* 0F 62 /wr */ { BxPrefixSSE, BX_IA_PUNPCKLDQ_PqQd, BxOpcodeGroupSSE_0f62 },
552 /* 0F 63 /wr */ { BxPrefixSSE, BX_IA_PACKSSWB_PqQq, BxOpcodeGroupSSE_0f63 },
553 /* 0F 64 /wr */ { BxPrefixSSE, BX_IA_PCMPGTB_PqQq, BxOpcodeGroupSSE_0f64 },
554 /* 0F 65 /wr */ { BxPrefixSSE, BX_IA_PCMPGTW_PqQq, BxOpcodeGroupSSE_0f65 },
555 /* 0F 66 /wr */ { BxPrefixSSE, BX_IA_PCMPGTD_PqQq, BxOpcodeGroupSSE_0f66 },
556 /* 0F 67 /wr */ { BxPrefixSSE, BX_IA_PACKUSWB_PqQq, BxOpcodeGroupSSE_0f67 },
557 /* 0F 68 /wr */ { BxPrefixSSE, BX_IA_PUNPCKHBW_PqQq, BxOpcodeGroupSSE_0f68 },
558 /* 0F 69 /wr */ { BxPrefixSSE, BX_IA_PUNPCKHWD_PqQq, BxOpcodeGroupSSE_0f69 },
559 /* 0F 6A /wr */ { BxPrefixSSE, BX_IA_PUNPCKHDQ_PqQq, BxOpcodeGroupSSE_0f6a },
560 /* 0F 6B /wr */ { BxPrefixSSE, BX_IA_PACKSSDW_PqQq, BxOpcodeGroupSSE_0f6b },
561 /* 0F 6C /wr */ { BxPrefixSSE, BX_IA_ERROR, BxOpcodeGroupSSE_0f6c },
562 /* 0F 6D /wr */ { BxPrefixSSE, BX_IA_ERROR, BxOpcodeGroupSSE_0f6d },
563 /* 0F 6E /wr */ { BxPrefixSSE, BX_IA_MOVD_PqEd, BxOpcodeGroupSSE_0f6e },
564 /* 0F 6F /wr */ { BxPrefixSSE, BX_IA_MOVQ_PqQq, BxOpcodeGroupSSE_0f6f },
565 /* 0F 70 /wr */ { BxPrefixSSE | BxImmediate_Ib, BX_IA_PSHUFW_PqQqIb, BxOpcodeGroupSSE_0f70 },
566 /* 0F 71 /wr */ { BxGroup12, BX_IA_ERROR, BxOpcodeInfoG12R },
567 /* 0F 72 /wr */ { BxGroup13, BX_IA_ERROR, BxOpcodeInfoG13R },
568 /* 0F 73 /wr */ { BxGroup14, BX_IA_ERROR, BxOpcodeInfoG14R },
569 /* 0F 74 /wr */ { BxPrefixSSE, BX_IA_PCMPEQB_PqQq, BxOpcodeGroupSSE_0f74 },
570 /* 0F 75 /wr */ { BxPrefixSSE, BX_IA_PCMPEQW_PqQq, BxOpcodeGroupSSE_0f75 },
571 /* 0F 76 /wr */ { BxPrefixSSE, BX_IA_PCMPEQD_PqQq, BxOpcodeGroupSSE_0f76 },
572 /* 0F 77 /wr */ { BxPrefixSSE, BX_IA_EMMS, BxOpcodeGroupSSE_ERR },
573 /* 0F 78 /wr */ { 0, BX_IA_ERROR },
574 /* 0F 79 /wr */ { 0, BX_IA_ERROR },
575 /* 0F 7A /wr */ { 0, BX_IA_ERROR },
576 /* 0F 7B /wr */ { 0, BX_IA_ERROR },
577 /* 0F 7C /wr */ { BxPrefixSSE, BX_IA_ERROR, BxOpcodeGroupSSE_0f7c },
578 /* 0F 7D /wr */ { BxPrefixSSE, BX_IA_ERROR, BxOpcodeGroupSSE_0f7d },
579 /* 0F 7E /wr */ { BxPrefixSSE, BX_IA_MOVD_EdPd, BxOpcodeGroupSSE_0f7e },
580 /* 0F 7F /wr */ { BxPrefixSSE, BX_IA_MOVQ_QqPq, BxOpcodeGroupSSE_0f7f },
581 /* 0F 80 /wr */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JO_Jq },
582 /* 0F 81 /wr */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JNO_Jq },
583 /* 0F 82 /wr */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JB_Jq },
584 /* 0F 83 /wr */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JNB_Jq },
585 /* 0F 84 /wr */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JZ_Jq },
586 /* 0F 85 /wr */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JNZ_Jq },
587 /* 0F 86 /wr */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JBE_Jq },
588 /* 0F 87 /wr */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JNBE_Jq },
589 /* 0F 88 /wr */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JS_Jq },
590 /* 0F 89 /wr */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JNS_Jq },
591 /* 0F 8A /wr */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JP_Jq },
592 /* 0F 8B /wr */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JNP_Jq },
593 /* 0F 8C /wr */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JL_Jq },
594 /* 0F 8D /wr */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JNL_Jq },
595 /* 0F 8E /wr */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JLE_Jq },
596 /* 0F 8F /wr */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JNLE_Jq },
597 /* 0F 90 /wr */ { 0, BX_IA_SETO_EbR },
598 /* 0F 91 /wr */ { 0, BX_IA_SETNO_EbR },
599 /* 0F 92 /wr */ { 0, BX_IA_SETB_EbR },
600 /* 0F 93 /wr */ { 0, BX_IA_SETNB_EbR },
601 /* 0F 94 /wr */ { 0, BX_IA_SETZ_EbR },
602 /* 0F 95 /wr */ { 0, BX_IA_SETNZ_EbR },
603 /* 0F 96 /wr */ { 0, BX_IA_SETBE_EbR },
604 /* 0F 97 /wr */ { 0, BX_IA_SETNBE_EbR },
605 /* 0F 98 /wr */ { 0, BX_IA_SETS_EbR },
606 /* 0F 99 /wr */ { 0, BX_IA_SETNS_EbR },
607 /* 0F 9A /wr */ { 0, BX_IA_SETP_EbR },
608 /* 0F 9B /wr */ { 0, BX_IA_SETNP_EbR },
609 /* 0F 9C /wr */ { 0, BX_IA_SETL_EbR },
610 /* 0F 9D /wr */ { 0, BX_IA_SETNL_EbR },
611 /* 0F 9E /wr */ { 0, BX_IA_SETLE_EbR },
612 /* 0F 9F /wr */ { 0, BX_IA_SETNLE_EbR },
613 /* 0F A0 /wr */ { 0, BX_IA_PUSH16_FS },
614 /* 0F A1 /wr */ { 0, BX_IA_POP16_FS },
615 /* 0F A2 /wr */ { 0, BX_IA_CPUID },
616 /* 0F A3 /wr */ { 0, BX_IA_BT_EwGwR },
617 /* 0F A4 /wr */ { BxImmediate_Ib, BX_IA_SHLD_EwGwR },
618 /* 0F A5 /wr */ { 0, BX_IA_SHLD_EwGwR },
619 /* 0F A6 /wr */ { 0, BX_IA_ERROR },
620 /* 0F A7 /wr */ { 0, BX_IA_ERROR },
621 /* 0F A8 /wr */ { 0, BX_IA_PUSH16_GS },
622 /* 0F A9 /wr */ { 0, BX_IA_POP16_GS },
623 /* 0F AA /wr */ { BxTraceEnd, BX_IA_RSM },
624 /* 0F AB /wr */ { 0, BX_IA_BTS_EwGwR },
625 /* 0F AC /wr */ { BxImmediate_Ib, BX_IA_SHRD_EwGwR },
626 /* 0F AD /wr */ { 0, BX_IA_SHRD_EwGwR },
627 /* 0F AE /wr */ { BxGroup15, BX_IA_ERROR, BxOpcodeInfoG15R },
628 /* 0F AF /wr */ { 0, BX_IA_IMUL_GwEwR },
629 /* 0F B0 /wr */ { 0, BX_IA_CMPXCHG_EbGbR },
630 /* 0F B1 /wr */ { 0, BX_IA_CMPXCHG_EwGwR },
631 /* 0F B2 /wr */ { 0, BX_IA_ERROR }, // LSS
632 /* 0F B3 /wr */ { 0, BX_IA_BTR_EwGwR },
633 /* 0F B4 /wr */ { 0, BX_IA_ERROR }, // LFS
634 /* 0F B5 /wr */ { 0, BX_IA_ERROR }, // LGS
635 /* 0F B6 /wr */ { 0, BX_IA_MOVZX_GwEbR },
636 /* 0F B7 /wr */ { 0, BX_IA_MOV_GwEwR }, // MOVZX_GwEw
637 /* 0F B8 /wr */ { BxPrefixSSE, BX_IA_ERROR, BxOpcodeGroupSSE_0fb8wR },
638 /* 0F B9 /wr */ { BxTraceEnd, BX_IA_UD2B },
639 /* 0F BA /wr */ { BxGroup8, BX_IA_ERROR, BxOpcodeInfoG8EwIbR },
640 /* 0F BB /wr */ { 0, BX_IA_BTC_EwGwR },
641 /* 0F BC /wr */ { 0, BX_IA_BSF_GwEwR },
642 /* 0F BD /wr */ { 0, BX_IA_BSR_GwEwR },
643 /* 0F BE /wr */ { 0, BX_IA_MOVSX_GwEbR },
644 /* 0F BF /wr */ { 0, BX_IA_MOV_GwEwR }, // MOVSX_GwEw
645 /* 0F C0 /wr */ { 0, BX_IA_XADD_EbGbR },
646 /* 0F C1 /wr */ { 0, BX_IA_XADD_EwGwR },
647 /* 0F C2 /wr */ { BxPrefixSSE | BxImmediate_Ib, BX_IA_CMPPS_VpsWpsIb, BxOpcodeGroupSSE_0fc2 },
648 /* 0F C3 /wr */ { 0, BX_IA_ERROR }, // MOVNTI SSE group
649 /* 0F C4 /wr */ { BxPrefixSSE | BxImmediate_Ib, BX_IA_PINSRW_PqEwIb, BxOpcodeGroupSSE_0fc4 },
650 /* 0F C5 /wr */ { BxPrefixSSE | BxImmediate_Ib, BX_IA_PEXTRW_GdPqIb, BxOpcodeGroupSSE_0fc5R },
651 /* 0F C6 /wr */ { BxPrefixSSE | BxImmediate_Ib, BX_IA_SHUFPS_VpsWpsIb, BxOpcodeGroupSSE_0fc6 },
652 /* 0F C7 /wr */ { 0, BX_IA_ERROR }, // CMPXCHG8B G9 group
653 /* 0F C8 /wr */ { 0, BX_IA_BSWAP_ERX },
654 /* 0F C9 /wr */ { 0, BX_IA_BSWAP_ERX },
655 /* 0F CA /wr */ { 0, BX_IA_BSWAP_ERX },
656 /* 0F CB /wr */ { 0, BX_IA_BSWAP_ERX },
657 /* 0F CC /wr */ { 0, BX_IA_BSWAP_ERX },
658 /* 0F CD /wr */ { 0, BX_IA_BSWAP_ERX },
659 /* 0F CE /wr */ { 0, BX_IA_BSWAP_ERX },
660 /* 0F CF /wr */ { 0, BX_IA_BSWAP_ERX },
661 /* 0F D0 /wr */ { BxPrefixSSE, BX_IA_ERROR, BxOpcodeGroupSSE_0fd0 },
662 /* 0F D1 /wr */ { BxPrefixSSE, BX_IA_PSRLW_PqQq, BxOpcodeGroupSSE_0fd1 },
663 /* 0F D2 /wr */ { BxPrefixSSE, BX_IA_PSRLD_PqQq, BxOpcodeGroupSSE_0fd2 },
664 /* 0F D3 /wr */ { BxPrefixSSE, BX_IA_PSRLQ_PqQq, BxOpcodeGroupSSE_0fd3 },
665 /* 0F D4 /wr */ { BxPrefixSSE, BX_IA_PADDQ_PqQq, BxOpcodeGroupSSE_0fd4 },
666 /* 0F D5 /wr */ { BxPrefixSSE, BX_IA_PMULLW_PqQq, BxOpcodeGroupSSE_0fd5 },
667 /* 0F D6 /wr */ { BxPrefixSSE, BX_IA_ERROR, BxOpcodeGroupSSE_0fd6 },
668 /* 0F D7 /wr */ { BxPrefixSSE, BX_IA_PMOVMSKB_GdPRq, BxOpcodeGroupSSE_0fd7 },
669 /* 0F D8 /wr */ { BxPrefixSSE, BX_IA_PSUBUSB_PqQq, BxOpcodeGroupSSE_0fd8 },
670 /* 0F D9 /wr */ { BxPrefixSSE, BX_IA_PSUBUSW_PqQq, BxOpcodeGroupSSE_0fd9 },
671 /* 0F DA /wr */ { BxPrefixSSE, BX_IA_PMINUB_PqQq, BxOpcodeGroupSSE_0fda },
672 /* 0F DB /wr */ { BxPrefixSSE, BX_IA_PAND_PqQq, BxOpcodeGroupSSE_0fdb },
673 /* 0F DC /wr */ { BxPrefixSSE, BX_IA_PADDUSB_PqQq, BxOpcodeGroupSSE_0fdc },
674 /* 0F DD /wr */ { BxPrefixSSE, BX_IA_PADDUSW_PqQq, BxOpcodeGroupSSE_0fdd },
675 /* 0F DE /wr */ { BxPrefixSSE, BX_IA_PMAXUB_PqQq, BxOpcodeGroupSSE_0fde },
676 /* 0F DF /wr */ { BxPrefixSSE, BX_IA_PANDN_PqQq, BxOpcodeGroupSSE_0fdf },
677 /* 0F E0 /wr */ { BxPrefixSSE, BX_IA_PAVGB_PqQq, BxOpcodeGroupSSE_0fe0 },
678 /* 0F E1 /wr */ { BxPrefixSSE, BX_IA_PSRAW_PqQq, BxOpcodeGroupSSE_0fe1 },
679 /* 0F E2 /wr */ { BxPrefixSSE, BX_IA_PSRAD_PqQq, BxOpcodeGroupSSE_0fe2 },
680 /* 0F E3 /wr */ { BxPrefixSSE, BX_IA_PAVGW_PqQq, BxOpcodeGroupSSE_0fe3 },
681 /* 0F E4 /wr */ { BxPrefixSSE, BX_IA_PMULHUW_PqQq, BxOpcodeGroupSSE_0fe4 },
682 /* 0F E5 /wr */ { BxPrefixSSE, BX_IA_PMULHW_PqQq, BxOpcodeGroupSSE_0fe5 },
683 /* 0F E6 /wr */ { BxPrefixSSE, BX_IA_ERROR, BxOpcodeGroupSSE_0fe6 },
684 /* 0F E7 /wr */ { 0, BX_IA_ERROR }, // MOVNTQ/MOVNTDQ SSE group
685 /* 0F E8 /wr */ { BxPrefixSSE, BX_IA_PSUBSB_PqQq, BxOpcodeGroupSSE_0fe8 },
686 /* 0F E9 /wr */ { BxPrefixSSE, BX_IA_PSUBSW_PqQq, BxOpcodeGroupSSE_0fe9 },
687 /* 0F EA /wr */ { BxPrefixSSE, BX_IA_PMINSW_PqQq, BxOpcodeGroupSSE_0fea },
688 /* 0F EB /wr */ { BxPrefixSSE, BX_IA_POR_PqQq, BxOpcodeGroupSSE_0feb },
689 /* 0F EC /wr */ { BxPrefixSSE, BX_IA_PADDSB_PqQq, BxOpcodeGroupSSE_0fec },
690 /* 0F ED /wr */ { BxPrefixSSE, BX_IA_PADDSW_PqQq, BxOpcodeGroupSSE_0fed },
691 /* 0F EE /wr */ { BxPrefixSSE, BX_IA_PMAXSW_PqQq, BxOpcodeGroupSSE_0fee },
692 /* 0F EF /wr */ { BxPrefixSSE, BX_IA_PXOR_PqQq, BxOpcodeGroupSSE_0fef },
693 /* 0F F0 /wr */ { 0, BX_IA_ERROR }, // LDDQU SSE group
694 /* 0F F1 /wr */ { BxPrefixSSE, BX_IA_PSLLW_PqQq, BxOpcodeGroupSSE_0ff1 },
695 /* 0F F2 /wr */ { BxPrefixSSE, BX_IA_PSLLD_PqQq, BxOpcodeGroupSSE_0ff2 },
696 /* 0F F3 /wr */ { BxPrefixSSE, BX_IA_PSLLQ_PqQq, BxOpcodeGroupSSE_0ff3 },
697 /* 0F F4 /wr */ { BxPrefixSSE, BX_IA_PMULUDQ_PqQq, BxOpcodeGroupSSE_0ff4 },
698 /* 0F F5 /wr */ { BxPrefixSSE, BX_IA_PMADDWD_PqQq, BxOpcodeGroupSSE_0ff5 },
699 /* 0F F6 /wr */ { BxPrefixSSE, BX_IA_PSADBW_PqQq, BxOpcodeGroupSSE_0ff6 },
700 /* 0F F7 /wr */ { BxPrefixSSE, BX_IA_MASKMOVQ_PqPRq, BxOpcodeGroupSSE_0ff7R },
701 /* 0F F8 /wr */ { BxPrefixSSE, BX_IA_PSUBB_PqQq, BxOpcodeGroupSSE_0ff8 },
702 /* 0F F9 /wr */ { BxPrefixSSE, BX_IA_PSUBW_PqQq, BxOpcodeGroupSSE_0ff9 },
703 /* 0F FA /wr */ { BxPrefixSSE, BX_IA_PSUBD_PqQq, BxOpcodeGroupSSE_0ffa },
704 /* 0F FB /wr */ { BxPrefixSSE, BX_IA_PSUBQ_PqQq, BxOpcodeGroupSSE_0ffb },
705 /* 0F FC /wr */ { BxPrefixSSE, BX_IA_PADDB_PqQq, BxOpcodeGroupSSE_0ffc },
706 /* 0F FD /wr */ { BxPrefixSSE, BX_IA_PADDW_PqQq, BxOpcodeGroupSSE_0ffd },
707 /* 0F FE /wr */ { BxPrefixSSE, BX_IA_PADDD_PqQq, BxOpcodeGroupSSE_0ffe },
708 /* 0F FF /wr */ { 0, BX_IA_ERROR },
710 // 512 entries for 32bit operand size
711 /* 00 /dr */ { BxArithDstRM, BX_IA_ADD_GbEbR },
712 /* 01 /dr */ { BxArithDstRM, BX_IA_ADD_GdEdR },
713 /* 02 /dr */ { 0, BX_IA_ADD_GbEbR },
714 /* 03 /dr */ { 0, BX_IA_ADD_GdEdR },
715 /* 04 /dr */ { BxImmediate_Ib, BX_IA_ADD_ALIb },
716 /* 05 /dr */ { BxImmediate_Id, BX_IA_ADD_EAXId },
717 /* 06 /dr */ { 0, BX_IA_ERROR },
718 /* 07 /dr */ { 0, BX_IA_ERROR },
719 /* 08 /dr */ { BxArithDstRM, BX_IA_OR_GbEbR },
720 /* 09 /dr */ { BxArithDstRM, BX_IA_OR_GdEdR },
721 /* 0A /dr */ { 0, BX_IA_OR_GbEbR },
722 /* 0B /dr */ { 0, BX_IA_OR_GdEdR },
723 /* 0C /dr */ { BxImmediate_Ib, BX_IA_OR_ALIb },
724 /* 0D /dr */ { BxImmediate_Id, BX_IA_OR_EAXId },
725 /* 0E /dr */ { 0, BX_IA_ERROR },
726 /* 0F /dr */ { 0, BX_IA_ERROR }, // 2-byte escape
727 /* 10 /dr */ { BxArithDstRM, BX_IA_ADC_GbEbR },
728 /* 11 /dr */ { BxArithDstRM, BX_IA_ADC_GdEdR },
729 /* 12 /dr */ { 0, BX_IA_ADC_GbEbR },
730 /* 13 /dr */ { 0, BX_IA_ADC_GdEdR },
731 /* 14 /dr */ { BxImmediate_Ib, BX_IA_ADC_ALIb },
732 /* 15 /dr */ { BxImmediate_Id, BX_IA_ADC_EAXId },
733 /* 16 /dr */ { 0, BX_IA_ERROR },
734 /* 17 /dr */ { 0, BX_IA_ERROR },
735 /* 18 /dr */ { BxArithDstRM, BX_IA_SBB_GbEbR },
736 /* 19 /dr */ { BxArithDstRM, BX_IA_SBB_GdEdR },
737 /* 1A /dr */ { 0, BX_IA_SBB_GbEbR },
738 /* 1B /dr */ { 0, BX_IA_SBB_GdEdR },
739 /* 1C /dr */ { BxImmediate_Ib, BX_IA_SBB_ALIb },
740 /* 1D /dr */ { BxImmediate_Id, BX_IA_SBB_EAXId },
741 /* 1E /dr */ { 0, BX_IA_ERROR },
742 /* 1F /dr */ { 0, BX_IA_ERROR },
743 /* 20 /dr */ { BxArithDstRM, BX_IA_AND_GbEbR },
744 /* 21 /dr */ { BxArithDstRM, BX_IA_AND_GdEdR },
745 /* 22 /dr */ { 0, BX_IA_AND_GbEbR },
746 /* 23 /dr */ { 0, BX_IA_AND_GdEdR },
747 /* 24 /dr */ { BxImmediate_Ib, BX_IA_AND_ALIb },
748 /* 25 /dr */ { BxImmediate_Id, BX_IA_AND_EAXId },
749 /* 26 /dr */ { 0, BX_IA_ERROR }, // ES:
750 /* 27 /dr */ { 0, BX_IA_ERROR },
751 /* 28 /dr */ { BxArithDstRM, BX_IA_SUB_GbEbR },
752 /* 29 /dr */ { BxArithDstRM, BX_IA_SUB_GdEdR },
753 /* 2A /dr */ { 0, BX_IA_SUB_GbEbR },
754 /* 2B /dr */ { 0, BX_IA_SUB_GdEdR },
755 /* 2C /dr */ { BxImmediate_Ib, BX_IA_SUB_ALIb },
756 /* 2D /dr */ { BxImmediate_Id, BX_IA_SUB_EAXId },
757 /* 2E /dr */ { 0, BX_IA_ERROR }, // CS:
758 /* 2F /dr */ { 0, BX_IA_ERROR },
759 /* 30 /dr */ { BxArithDstRM, BX_IA_XOR_GbEbR },
760 /* 31 /dr */ { BxArithDstRM, BX_IA_XOR_GdEdR },
761 /* 32 /dr */ { 0, BX_IA_XOR_GbEbR },
762 /* 33 /dr */ { 0, BX_IA_XOR_GdEdR },
763 /* 34 /dr */ { BxImmediate_Ib, BX_IA_XOR_ALIb },
764 /* 35 /dr */ { BxImmediate_Id, BX_IA_XOR_EAXId },
765 /* 36 /dr */ { 0, BX_IA_ERROR }, // SS:
766 /* 37 /dr */ { 0, BX_IA_ERROR },
767 /* 38 /dr */ { BxArithDstRM, BX_IA_CMP_GbEbR },
768 /* 39 /dr */ { BxArithDstRM, BX_IA_CMP_GdEdR },
769 /* 3A /dr */ { 0, BX_IA_CMP_GbEbR },
770 /* 3B /dr */ { 0, BX_IA_CMP_GdEdR },
771 /* 3C /dr */ { BxImmediate_Ib, BX_IA_CMP_ALIb },
772 /* 3D /dr */ { BxImmediate_Id, BX_IA_CMP_EAXId },
773 /* 3E /dr */ { 0, BX_IA_ERROR }, // DS:
774 /* 3F /dr */ { 0, BX_IA_ERROR },
775 /* 40 /dr */ { 0, BX_IA_ERROR }, // REX:
776 /* 41 /dr */ { 0, BX_IA_ERROR }, // REX:
777 /* 42 /dr */ { 0, BX_IA_ERROR }, // REX:
778 /* 43 /dr */ { 0, BX_IA_ERROR }, // REX:
779 /* 44 /dr */ { 0, BX_IA_ERROR }, // REX:
780 /* 45 /dr */ { 0, BX_IA_ERROR }, // REX:
781 /* 46 /dr */ { 0, BX_IA_ERROR }, // REX:
782 /* 47 /dr */ { 0, BX_IA_ERROR }, // REX:
783 /* 48 /dr */ { 0, BX_IA_ERROR }, // REX:
784 /* 49 /dr */ { 0, BX_IA_ERROR }, // REX:
785 /* 4A /dr */ { 0, BX_IA_ERROR }, // REX:
786 /* 4B /dr */ { 0, BX_IA_ERROR }, // REX:
787 /* 4C /dr */ { 0, BX_IA_ERROR }, // REX:
788 /* 4D /dr */ { 0, BX_IA_ERROR }, // REX:
789 /* 4E /dr */ { 0, BX_IA_ERROR }, // REX:
790 /* 4F /dr */ { 0, BX_IA_ERROR }, // REX:
791 /* 50 /dr */ { 0, BX_IA_PUSH_RRX },
792 /* 51 /dr */ { 0, BX_IA_PUSH_RRX },
793 /* 52 /dr */ { 0, BX_IA_PUSH_RRX },
794 /* 53 /dr */ { 0, BX_IA_PUSH_RRX },
795 /* 54 /dr */ { 0, BX_IA_PUSH_RRX },
796 /* 55 /dr */ { 0, BX_IA_PUSH_RRX },
797 /* 56 /dr */ { 0, BX_IA_PUSH_RRX },
798 /* 57 /dr */ { 0, BX_IA_PUSH_RRX },
799 /* 58 /dr */ { 0, BX_IA_POP_RRX },
800 /* 59 /dr */ { 0, BX_IA_POP_RRX },
801 /* 5A /dr */ { 0, BX_IA_POP_RRX },
802 /* 5B /dr */ { 0, BX_IA_POP_RRX },
803 /* 5C /dr */ { 0, BX_IA_POP_RRX },
804 /* 5D /dr */ { 0, BX_IA_POP_RRX },
805 /* 5E /dr */ { 0, BX_IA_POP_RRX },
806 /* 5F /dr */ { 0, BX_IA_POP_RRX },
807 /* 60 /dr */ { 0, BX_IA_ERROR },
808 /* 61 /dr */ { 0, BX_IA_ERROR },
809 /* 62 /dr */ { 0, BX_IA_ERROR },
810 /* 63 /dr */ { 0, BX_IA_MOV_GdEdR }, // MOVSX_GdEd
811 /* 64 /dr */ { 0, BX_IA_ERROR }, // FS:
812 /* 65 /dr */ { 0, BX_IA_ERROR }, // GS:
813 /* 66 /dr */ { 0, BX_IA_ERROR }, // OS:
814 /* 67 /dr */ { 0, BX_IA_ERROR }, // AS:
815 /* 68 /dr */ { BxImmediate_Id, BX_IA_PUSH64_Id },
816 /* 69 /dr */ { BxImmediate_Id, BX_IA_IMUL_GdEdIdR },
817 /* 6A /dr */ { BxImmediate_Ib_SE, BX_IA_PUSH64_Id },
818 /* 6B /dr */ { BxImmediate_Ib_SE, BX_IA_IMUL_GdEdIdR },
819 /* 6C /dr */ { 0, BX_IA_REP_INSB_YbDX },
820 /* 6D /dr */ { 0, BX_IA_REP_INSD_YdDX },
821 /* 6E /dr */ { 0, BX_IA_REP_OUTSB_DXXb },
822 /* 6F /dr */ { 0, BX_IA_REP_OUTSD_DXXd },
823 /* 70 /dr */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JO_Jq },
824 /* 71 /dr */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JNO_Jq },
825 /* 72 /dr */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JB_Jq },
826 /* 73 /dr */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JNB_Jq },
827 /* 74 /dr */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JZ_Jq },
828 /* 75 /dr */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JNZ_Jq },
829 /* 76 /dr */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JBE_Jq },
830 /* 77 /dr */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JNBE_Jq },
831 /* 78 /dr */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JS_Jq },
832 /* 79 /dr */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JNS_Jq },
833 /* 7A /dr */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JP_Jq },
834 /* 7B /dr */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JNP_Jq },
835 /* 7C /dr */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JL_Jq },
836 /* 7D /dr */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JNL_Jq },
837 /* 7E /dr */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JLE_Jq },
838 /* 7F /dr */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JNLE_Jq },
839 /* 80 /dr */ { BxGroup1 | BxImmediate_Ib, BX_IA_ERROR, BxOpcodeInfoG1EbIbR },
840 /* 81 /dr */ { BxGroup5 | BxImmediate_Id, BX_IA_ERROR, BxOpcodeInfoG1EdR },
841 /* 82 /dr */ { 0, BX_IA_ERROR },
842 /* 83 /dr */ { BxGroup5 | BxImmediate_Ib_SE, BX_IA_ERROR, BxOpcodeInfoG1EdR },
843 /* 84 /dr */ { 0, BX_IA_TEST_EbGbR },
844 /* 85 /dr */ { 0, BX_IA_TEST_EdGdR },
845 /* 86 /dr */ { 0, BX_IA_XCHG_EbGbR },
846 /* 87 /dr */ { 0, BX_IA_XCHG_EdGdR },
847 /* 88 /dr */ { BxArithDstRM, BX_IA_MOV_GbEbR },
848 /* 89 /dr */ { BxArithDstRM, BX_IA_MOV_GdEdR },
849 /* 8A /dr */ { 0, BX_IA_MOV_GbEbR },
850 /* 8B /dr */ { 0, BX_IA_MOV_GdEdR },
851 /* 8C /dr */ { 0, BX_IA_MOV_EwSwR },
852 /* 8D /dr */ { 0, BX_IA_ERROR }, // LEA
853 /* 8E /dr */ { 0, BX_IA_MOV_SwEw },
854 /* 8F /dr */ { BxGroup1A, BX_IA_ERROR, BxOpcodeInfo64G1AEqR },
855 /* 90 /dr */ { 0, BX_IA_XCHG_ERXEAX }, // handles XCHG R8d, EAX
856 /* 91 /dr */ { 0, BX_IA_XCHG_ERXEAX },
857 /* 92 /dr */ { 0, BX_IA_XCHG_ERXEAX },
858 /* 93 /dr */ { 0, BX_IA_XCHG_ERXEAX },
859 /* 94 /dr */ { 0, BX_IA_XCHG_ERXEAX },
860 /* 95 /dr */ { 0, BX_IA_XCHG_ERXEAX },
861 /* 96 /dr */ { 0, BX_IA_XCHG_ERXEAX },
862 /* 97 /dr */ { 0, BX_IA_XCHG_ERXEAX },
863 /* 98 /dr */ { 0, BX_IA_CWDE },
864 /* 99 /dr */ { 0, BX_IA_CDQ },
865 /* 9A /dr */ { 0, BX_IA_ERROR },
866 /* 9B /dr */ { 0, BX_IA_FWAIT },
867 /* 9C /dr */ { 0, BX_IA_PUSHF_Fq },
868 /* 9D /dr */ { 0, BX_IA_POPF_Fq },
869 /* 9E /dr */ { 0, BX_IA_SAHF },
870 /* 9F /dr */ { 0, BX_IA_LAHF },
871 /* A0 /dr */ { BxImmediate_O, BX_IA_MOV_ALOq },
872 /* A1 /dr */ { BxImmediate_O, BX_IA_MOV_EAXOq },
873 /* A2 /dr */ { BxImmediate_O, BX_IA_MOV_OqAL },
874 /* A3 /dr */ { BxImmediate_O, BX_IA_MOV_OqEAX },
875 /* A4 /dr */ { 0, BX_IA_REP_MOVSB_XbYb },
876 /* A5 /dr */ { 0, BX_IA_REP_MOVSD_XdYd },
877 /* A6 /dr */ { 0, BX_IA_REP_CMPSB_XbYb },
878 /* A7 /dr */ { 0, BX_IA_REP_CMPSD_XdYd },
879 /* A8 /dr */ { BxImmediate_Ib, BX_IA_TEST_ALIb },
880 /* A9 /dr */ { BxImmediate_Id, BX_IA_TEST_EAXId },
881 /* AA /dr */ { 0, BX_IA_REP_STOSB_YbAL },
882 /* AB /dr */ { 0, BX_IA_REP_STOSD_YdEAX },
883 /* AC /dr */ { 0, BX_IA_REP_LODSB_ALXb },
884 /* AD /dr */ { 0, BX_IA_REP_LODSD_EAXXd },
885 /* AE /dr */ { 0, BX_IA_REP_SCASB_ALXb },
886 /* AF /dr */ { 0, BX_IA_REP_SCASD_EAXXd },
887 /* B0 /dr */ { BxImmediate_Ib, BX_IA_MOV_RLIb },
888 /* B1 /dr */ { BxImmediate_Ib, BX_IA_MOV_RLIb },
889 /* B2 /dr */ { BxImmediate_Ib, BX_IA_MOV_RLIb },
890 /* B3 /dr */ { BxImmediate_Ib, BX_IA_MOV_RLIb },
891 /* B4 /dr */ { BxImmediate_Ib, BX_IA_MOV_RLIb },
892 /* B5 /dr */ { BxImmediate_Ib, BX_IA_MOV_RLIb },
893 /* B6 /dr */ { BxImmediate_Ib, BX_IA_MOV_RLIb },
894 /* B7 /dr */ { BxImmediate_Ib, BX_IA_MOV_RLIb },
895 /* B8 /dr */ { BxImmediate_Id, BX_IA_MOV_ERXId },
896 /* B9 /dr */ { BxImmediate_Id, BX_IA_MOV_ERXId },
897 /* BA /dr */ { BxImmediate_Id, BX_IA_MOV_ERXId },
898 /* BB /dr */ { BxImmediate_Id, BX_IA_MOV_ERXId },
899 /* BC /dr */ { BxImmediate_Id, BX_IA_MOV_ERXId },
900 /* BD /dr */ { BxImmediate_Id, BX_IA_MOV_ERXId },
901 /* BE /dr */ { BxImmediate_Id, BX_IA_MOV_ERXId },
902 /* BF /dr */ { BxImmediate_Id, BX_IA_MOV_ERXId },
903 /* C0 /dr */ { BxGroup2 | BxImmediate_Ib, BX_IA_ERROR, BxOpcodeInfoG2Eb },
904 /* C1 /dr */ { BxGroup2 | BxImmediate_Ib, BX_IA_ERROR, BxOpcodeInfoG2EdR },
905 /* C2 /dr */ { BxImmediate_Iw | BxTraceEnd, BX_IA_RETnear64_Iw },
906 /* C3 /dr */ { BxTraceEnd, BX_IA_RETnear64 },
907 /* C4 /dr */ { 0, BX_IA_ERROR },
908 /* C5 /dr */ { 0, BX_IA_ERROR },
909 /* C6 /dr */ { BxGroup11, BX_IA_ERROR, BxOpcodeInfoG11EbR },
910 /* C7 /dr */ { BxGroup11, BX_IA_ERROR, BxOpcodeInfoG11EdR },
911 /* C8 /dr */ { BxImmediate_IwIb, BX_IA_ENTER64_IwIb },
912 /* C9 /dr */ { 0, BX_IA_LEAVE64 },
913 /* CA /dr */ { BxImmediate_Iw | BxTraceEnd, BX_IA_RETfar32_Iw },
914 /* CB /dr */ { BxTraceEnd, BX_IA_RETfar32 },
915 /* CC /dr */ { BxTraceEnd, BX_IA_INT3 },
916 /* CD /dr */ { BxImmediate_Ib | BxTraceEnd, BX_IA_INT_Ib },
917 /* CE /dr */ { 0, BX_IA_ERROR },
918 /* CF /dr */ { BxTraceEnd, BX_IA_IRET64 },
919 /* D0 /dr */ { BxGroup2 | BxImmediate_I1, BX_IA_ERROR, BxOpcodeInfoG2Eb },
920 /* D1 /dr */ { BxGroup2 | BxImmediate_I1, BX_IA_ERROR, BxOpcodeInfoG2EdR },
921 /* D2 /dr */ { BxGroup2, BX_IA_ERROR, BxOpcodeInfoG2Eb },
922 /* D3 /dr */ { BxGroup2, BX_IA_ERROR, BxOpcodeInfoG2EdR },
923 /* D4 /dr */ { 0, BX_IA_ERROR },
924 /* D5 /dr */ { 0, BX_IA_ERROR },
925 /* D6 /dr */ { 0, BX_IA_ERROR },
926 /* D7 /dr */ { 0, BX_IA_XLAT },
927 /* D8 /dr */ { BxFPEscape, BX_IA_ERROR, BxOpcodeInfo_FloatingPointD8 },
928 /* D9 /dr */ { BxFPEscape, BX_IA_ERROR, BxOpcodeInfo_FloatingPointD9 },
929 /* DA /dr */ { BxFPEscape, BX_IA_ERROR, BxOpcodeInfo_FloatingPointDA },
930 /* DB /dr */ { BxFPEscape, BX_IA_ERROR, BxOpcodeInfo_FloatingPointDB },
931 /* DC /dr */ { BxFPEscape, BX_IA_ERROR, BxOpcodeInfo_FloatingPointDC },
932 /* DD /dr */ { BxFPEscape, BX_IA_ERROR, BxOpcodeInfo_FloatingPointDD },
933 /* DE /dr */ { BxFPEscape, BX_IA_ERROR, BxOpcodeInfo_FloatingPointDE },
934 /* DF /dr */ { BxFPEscape, BX_IA_ERROR, BxOpcodeInfo_FloatingPointDF },
935 /* E0 /dr */ { BxImmediate_BrOff8 | BxTraceEnd, BX_IA_LOOPNE64_Jb },
936 /* E1 /dr */ { BxImmediate_BrOff8 | BxTraceEnd, BX_IA_LOOPE64_Jb },
937 /* E2 /dr */ { BxImmediate_BrOff8 | BxTraceEnd, BX_IA_LOOP64_Jb },
938 /* E3 /dr */ { BxImmediate_BrOff8 | BxTraceEnd, BX_IA_JRCXZ_Jb },
939 /* E4 /dr */ { BxImmediate_Ib, BX_IA_IN_ALIb },
940 /* E5 /dr */ { BxImmediate_Ib, BX_IA_IN_EAXIb },
941 /* E6 /dr */ { BxImmediate_Ib, BX_IA_OUT_IbAL },
942 /* E7 /dr */ { BxImmediate_Ib, BX_IA_OUT_IbEAX },
943 /* E8 /dr */ { BxImmediate_BrOff32 | BxTraceEnd, BX_IA_CALL_Jq },
944 /* E9 /dr */ { BxImmediate_BrOff32 | BxTraceEnd, BX_IA_JMP_Jq },
945 /* EA /dr */ { 0, BX_IA_ERROR },
946 /* EB /dr */ { BxImmediate_BrOff8 | BxTraceEnd, BX_IA_JMP_Jq },
947 /* EC /dr */ { 0, BX_IA_IN_ALDX },
948 /* ED /dr */ { 0, BX_IA_IN_EAXDX },
949 /* EE /dr */ { 0, BX_IA_OUT_DXAL },
950 /* EF /dr */ { 0, BX_IA_OUT_DXEAX },
951 /* F0 /dr */ { 0, BX_IA_ERROR }, // LOCK:
952 /* F1 /dr */ { BxTraceEnd, BX_IA_INT1 },
953 /* F2 /dr */ { 0, BX_IA_ERROR }, // REPNE/REPNZ
954 /* F3 /dr */ { 0, BX_IA_ERROR }, // REP,REPE/REPZ
955 /* F4 /dr */ { BxTraceEnd, BX_IA_HLT },
956 /* F5 /dr */ { 0, BX_IA_CMC },
957 /* F6 /dr */ { BxGroup3, BX_IA_ERROR, BxOpcodeInfoG3EbR },
958 /* F7 /dr */ { BxGroup3, BX_IA_ERROR, BxOpcodeInfoG3EdR },
959 /* F8 /dr */ { 0, BX_IA_CLC },
960 /* F9 /dr */ { 0, BX_IA_STC },
961 /* FA /dr */ { 0, BX_IA_CLI },
962 /* FB /dr */ { 0, BX_IA_STI },
963 /* FC /dr */ { 0, BX_IA_CLD },
964 /* FD /dr */ { 0, BX_IA_STD },
965 /* FE /dr */ { BxGroup4, BX_IA_ERROR, BxOpcodeInfoG4R },
966 /* FF /dr */ { BxGroup5, BX_IA_ERROR, BxOpcodeInfo64G5dR },
968 /* 0F 00 /dr */ { BxGroup6, BX_IA_ERROR, BxOpcodeInfoG6 },
969 /* 0F 01 /dr */ { BxGroup7, BX_IA_ERROR, BxOpcodeInfo64G7R },
970 /* 0F 02 /dr */ { 0, BX_IA_LAR_GvEw },
971 /* 0F 03 /dr */ { 0, BX_IA_LSL_GvEw },
972 /* 0F 04 /dr */ { 0, BX_IA_ERROR },
973 /* 0F 05 /dr */ { BxTraceEnd, BX_IA_SYSCALL },
974 /* 0F 06 /dr */ { 0, BX_IA_CLTS },
975 /* 0F 07 /dr */ { BxTraceEnd, BX_IA_SYSRET },
976 /* 0F 08 /dr */ { BxTraceEnd, BX_IA_INVD },
977 /* 0F 09 /dr */ { BxTraceEnd, BX_IA_WBINVD },
978 /* 0F 0A /dr */ { 0, BX_IA_ERROR },
979 /* 0F 0B /dr */ { BxTraceEnd, BX_IA_UD2A },
980 /* 0F 0C /dr */ { 0, BX_IA_ERROR },
981 /* 0F 0D /dr */ { 0, BX_IA_NOP }, // 3DNow! PREFETCH on AMD, NOP on Intel
982 /* 0F 0E /dr */ { 0, BX_IA_FEMMS }, // 3DNow! FEMMS
983 #if BX_SUPPORT_3DNOW
984 /* 0F 0F /dr */ { BxImmediate_Ib, BX_IA_ERROR, Bx3DNowOpcodeInfo },
985 #else
986 /* 0F 0F /dr */ { 0, BX_IA_ERROR },
987 #endif
988 /* 0F 10 /dr */ { BxPrefixSSE, BX_IA_MOVUPS_VpsWps, BxOpcodeGroupSSE_0f10 },
989 /* 0F 11 /dr */ { BxPrefixSSE, BX_IA_MOVUPS_WpsVps, BxOpcodeGroupSSE_0f11 },
990 /* 0F 12 /dr */ { BxPrefixSSE, BX_IA_MOVLPS_VpsMq, BxOpcodeGroupSSE_0f12 },
991 /* 0F 13 /dr */ { 0, BX_IA_ERROR }, // MOVLPS/PD SSE group
992 /* 0F 14 /dr */ { BxPrefixSSE, BX_IA_UNPCKLPS_VpsWdq, BxOpcodeGroupSSE_0f14 },
993 /* 0F 15 /dr */ { BxPrefixSSE, BX_IA_UNPCKHPS_VpsWdq, BxOpcodeGroupSSE_0f15 },
994 /* 0F 16 /dr */ { BxPrefixSSE, BX_IA_MOVHPS_VpsMq, BxOpcodeGroupSSE_0f16 },
995 /* 0F 17 /dr */ { 0, BX_IA_ERROR }, // MOHLPS/PD SSE group
996 /* 0F 18 /dr */ { 0, BX_IA_NOP }, // PREFETCH HINT
997 /* 0F 19 /dr */ { 0, BX_IA_NOP }, // multi-byte NOP
998 /* 0F 1A /dr */ { 0, BX_IA_NOP }, // multi-byte NOP
999 /* 0F 1B /dr */ { 0, BX_IA_NOP }, // multi-byte NOP
1000 /* 0F 1C /dr */ { 0, BX_IA_NOP }, // multi-byte NOP
1001 /* 0F 1D /dr */ { 0, BX_IA_NOP }, // multi-byte NOP
1002 /* 0F 1E /dr */ { 0, BX_IA_NOP }, // multi-byte NOP
1003 /* 0F 1F /dr */ { 0, BX_IA_NOP }, // multi-byte NOP
1004 /* 0F 20 /dr */ { 0, BX_IA_MOV_RqCq },
1005 /* 0F 21 /dr */ { 0, BX_IA_MOV_RqDq },
1006 /* 0F 22 /dr */ { BxTraceEnd, BX_IA_MOV_CqRq },
1007 /* 0F 23 /dr */ { BxTraceEnd, BX_IA_MOV_DqRq },
1008 /* 0F 24 /dr */ { 0, BX_IA_ERROR },
1009 /* 0F 25 /dr */ { 0, BX_IA_ERROR },
1010 /* 0F 26 /dr */ { 0, BX_IA_ERROR },
1011 /* 0F 27 /dr */ { 0, BX_IA_ERROR },
1012 /* 0F 28 /dr */ { BxPrefixSSE, BX_IA_MOVAPS_VpsWps, BxOpcodeGroupSSE_0f28 },
1013 /* 0F 29 /dr */ { BxPrefixSSE, BX_IA_MOVAPS_WpsVps, BxOpcodeGroupSSE_0f29 },
1014 /* 0F 2A /dr */ { BxPrefixSSE, BX_IA_CVTPI2PS_VpsQq, BxOpcodeGroupSSE_0f2a },
1015 /* 0F 2B /dr */ { 0, BX_IA_ERROR }, // MOVNTPS/PD/SS/SD
1016 /* 0F 2C /dr */ { BxPrefixSSE, BX_IA_CVTTPS2PI_PqWps, BxOpcodeGroupSSE_0f2c },
1017 /* 0F 2D /dr */ { BxPrefixSSE, BX_IA_CVTPS2PI_PqWps, BxOpcodeGroupSSE_0f2d },
1018 /* 0F 2E /dr */ { BxPrefixSSE, BX_IA_UCOMISS_VssWss, BxOpcodeGroupSSE_0f2e },
1019 /* 0F 2F /dr */ { BxPrefixSSE, BX_IA_COMISS_VpsWps, BxOpcodeGroupSSE_0f2f },
1020 /* 0F 30 /dr */ { 0, BX_IA_WRMSR },
1021 /* 0F 31 /dr */ { 0, BX_IA_RDTSC },
1022 /* 0F 32 /dr */ { 0, BX_IA_RDMSR },
1023 /* 0F 33 /dr */ { 0, BX_IA_RDPMC },
1024 /* 0F 34 /dr */ { 0, BX_IA_SYSENTER },
1025 /* 0F 35 /dr */ { 0, BX_IA_SYSEXIT },
1026 /* 0F 36 /dr */ { 0, BX_IA_ERROR },
1027 /* 0F 37 /dr */ { 0, BX_IA_ERROR },
1028 #if (BX_SUPPORT_SSE >= 4) || (BX_SUPPORT_SSE >= 3 && BX_SUPPORT_SSE_EXTENSION > 0)
1029 /* 0F 38 /dr */ { Bx3ByteOp, BX_IA_ERROR, BxOpcode3ByteTable0f38 }, // 3-byte escape
1030 #else
1031 /* 0F 38 /dr */ { 0, BX_IA_ERROR },
1032 #endif
1033 /* 0F 39 /dr */ { 0, BX_IA_ERROR },
1034 #if (BX_SUPPORT_SSE >= 4) || (BX_SUPPORT_SSE >= 3 && BX_SUPPORT_SSE_EXTENSION > 0)
1035 /* 0F 3A /dr */ { Bx3ByteOp, BX_IA_ERROR, BxOpcode3ByteTable0f3a }, // 3-byte escape
1036 #else
1037 /* 0F 3A /dr */ { 0, BX_IA_ERROR },
1038 #endif
1039 /* 0F 3B /dr */ { 0, BX_IA_ERROR },
1040 /* 0F 3C /dr */ { 0, BX_IA_ERROR },
1041 /* 0F 3D /dr */ { 0, BX_IA_ERROR },
1042 /* 0F 3E /dr */ { 0, BX_IA_ERROR },
1043 /* 0F 3F /dr */ { 0, BX_IA_ERROR },
1044 /* 0F 40 /dr */ { 0, BX_IA_CMOVO_GdEdR },
1045 /* 0F 41 /dr */ { 0, BX_IA_CMOVNO_GdEdR },
1046 /* 0F 42 /dr */ { 0, BX_IA_CMOVB_GdEdR },
1047 /* 0F 43 /dr */ { 0, BX_IA_CMOVNB_GdEdR },
1048 /* 0F 44 /dr */ { 0, BX_IA_CMOVZ_GdEdR },
1049 /* 0F 45 /dr */ { 0, BX_IA_CMOVNZ_GdEdR },
1050 /* 0F 46 /dr */ { 0, BX_IA_CMOVBE_GdEdR },
1051 /* 0F 47 /dr */ { 0, BX_IA_CMOVNBE_GdEdR },
1052 /* 0F 48 /dr */ { 0, BX_IA_CMOVS_GdEdR },
1053 /* 0F 49 /dr */ { 0, BX_IA_CMOVNS_GdEdR },
1054 /* 0F 4A /dr */ { 0, BX_IA_CMOVP_GdEdR },
1055 /* 0F 4B /dr */ { 0, BX_IA_CMOVNP_GdEdR },
1056 /* 0F 4C /dr */ { 0, BX_IA_CMOVL_GdEdR },
1057 /* 0F 4D /dr */ { 0, BX_IA_CMOVNL_GdEdR },
1058 /* 0F 4E /dr */ { 0, BX_IA_CMOVLE_GdEdR },
1059 /* 0F 4F /dr */ { 0, BX_IA_CMOVNLE_GdEdR },
1060 /* 0F 50 /dr */ { BxPrefixSSE, BX_IA_MOVMSKPS_GdVRps, BxOpcodeGroupSSE_0f50 },
1061 /* 0F 51 /dr */ { BxPrefixSSE, BX_IA_SQRTPS_VpsWps, BxOpcodeGroupSSE_0f51 },
1062 /* 0F 52 /dr */ { BxPrefixSSE, BX_IA_RSQRTPS_VpsWps, BxOpcodeGroupSSE_0f52 },
1063 /* 0F 53 /dr */ { BxPrefixSSE, BX_IA_RCPPS_VpsWps, BxOpcodeGroupSSE_0f53 },
1064 /* 0F 54 /dr */ { BxPrefixSSE, BX_IA_ANDPS_VpsWps, BxOpcodeGroupSSE_0f54 },
1065 /* 0F 55 /dr */ { BxPrefixSSE, BX_IA_ANDNPS_VpsWps, BxOpcodeGroupSSE_0f55 },
1066 /* 0F 56 /dr */ { BxPrefixSSE, BX_IA_ORPS_VpsWps, BxOpcodeGroupSSE_0f56 },
1067 /* 0F 57 /dr */ { BxPrefixSSE, BX_IA_XORPS_VpsWps, BxOpcodeGroupSSE_0f57 },
1068 /* 0F 58 /dr */ { BxPrefixSSE, BX_IA_ADDPS_VpsWps, BxOpcodeGroupSSE_0f58 },
1069 /* 0F 59 /dr */ { BxPrefixSSE, BX_IA_MULPS_VpsWps, BxOpcodeGroupSSE_0f59 },
1070 /* 0F 5A /dr */ { BxPrefixSSE, BX_IA_CVTPS2PD_VpsWps, BxOpcodeGroupSSE_0f5a },
1071 /* 0F 5B /dr */ { BxPrefixSSE, BX_IA_CVTDQ2PS_VpsWdq, BxOpcodeGroupSSE_0f5b },
1072 /* 0F 5C /dr */ { BxPrefixSSE, BX_IA_SUBPS_VpsWps, BxOpcodeGroupSSE_0f5c },
1073 /* 0F 5D /dr */ { BxPrefixSSE, BX_IA_MINPS_VpsWps, BxOpcodeGroupSSE_0f5d },
1074 /* 0F 5E /dr */ { BxPrefixSSE, BX_IA_DIVPS_VpsWps, BxOpcodeGroupSSE_0f5e },
1075 /* 0F 5F /dr */ { BxPrefixSSE, BX_IA_MAXPS_VpsWps, BxOpcodeGroupSSE_0f5f },
1076 /* 0F 60 /dr */ { BxPrefixSSE, BX_IA_PUNPCKLBW_PqQd, BxOpcodeGroupSSE_0f60 },
1077 /* 0F 61 /dr */ { BxPrefixSSE, BX_IA_PUNPCKLWD_PqQd, BxOpcodeGroupSSE_0f61 },
1078 /* 0F 62 /dr */ { BxPrefixSSE, BX_IA_PUNPCKLDQ_PqQd, BxOpcodeGroupSSE_0f62 },
1079 /* 0F 63 /dr */ { BxPrefixSSE, BX_IA_PACKSSWB_PqQq, BxOpcodeGroupSSE_0f63 },
1080 /* 0F 64 /dr */ { BxPrefixSSE, BX_IA_PCMPGTB_PqQq, BxOpcodeGroupSSE_0f64 },
1081 /* 0F 65 /dr */ { BxPrefixSSE, BX_IA_PCMPGTW_PqQq, BxOpcodeGroupSSE_0f65 },
1082 /* 0F 66 /dr */ { BxPrefixSSE, BX_IA_PCMPGTD_PqQq, BxOpcodeGroupSSE_0f66 },
1083 /* 0F 67 /dr */ { BxPrefixSSE, BX_IA_PACKUSWB_PqQq, BxOpcodeGroupSSE_0f67 },
1084 /* 0F 68 /dr */ { BxPrefixSSE, BX_IA_PUNPCKHBW_PqQq, BxOpcodeGroupSSE_0f68 },
1085 /* 0F 69 /dr */ { BxPrefixSSE, BX_IA_PUNPCKHWD_PqQq, BxOpcodeGroupSSE_0f69 },
1086 /* 0F 6A /dr */ { BxPrefixSSE, BX_IA_PUNPCKHDQ_PqQq, BxOpcodeGroupSSE_0f6a },
1087 /* 0F 6B /dr */ { BxPrefixSSE, BX_IA_PACKSSDW_PqQq, BxOpcodeGroupSSE_0f6b },
1088 /* 0F 6C /dr */ { BxPrefixSSE, BX_IA_ERROR, BxOpcodeGroupSSE_0f6c },
1089 /* 0F 6D /dr */ { BxPrefixSSE, BX_IA_ERROR, BxOpcodeGroupSSE_0f6d },
1090 /* 0F 6E /dr */ { BxPrefixSSE, BX_IA_MOVD_PqEd, BxOpcodeGroupSSE_0f6e },
1091 /* 0F 6F /dr */ { BxPrefixSSE, BX_IA_MOVQ_PqQq, BxOpcodeGroupSSE_0f6f },
1092 /* 0F 70 /dr */ { BxPrefixSSE | BxImmediate_Ib, BX_IA_PSHUFW_PqQqIb, BxOpcodeGroupSSE_0f70 },
1093 /* 0F 71 /dr */ { BxGroup12, BX_IA_ERROR, BxOpcodeInfoG12R },
1094 /* 0F 72 /dr */ { BxGroup13, BX_IA_ERROR, BxOpcodeInfoG13R },
1095 /* 0F 73 /dr */ { BxGroup14, BX_IA_ERROR, BxOpcodeInfoG14R },
1096 /* 0F 74 /dr */ { BxPrefixSSE, BX_IA_PCMPEQB_PqQq, BxOpcodeGroupSSE_0f74 },
1097 /* 0F 75 /dr */ { BxPrefixSSE, BX_IA_PCMPEQW_PqQq, BxOpcodeGroupSSE_0f75 },
1098 /* 0F 76 /dr */ { BxPrefixSSE, BX_IA_PCMPEQD_PqQq, BxOpcodeGroupSSE_0f76 },
1099 /* 0F 77 /dr */ { BxPrefixSSE, BX_IA_EMMS, BxOpcodeGroupSSE_ERR },
1100 /* 0F 78 /dr */ { 0, BX_IA_ERROR },
1101 /* 0F 79 /dr */ { 0, BX_IA_ERROR },
1102 /* 0F 7A /dr */ { 0, BX_IA_ERROR },
1103 /* 0F 7B /dr */ { 0, BX_IA_ERROR },
1104 /* 0F 7C /dr */ { BxPrefixSSE, BX_IA_ERROR, BxOpcodeGroupSSE_0f7c },
1105 /* 0F 7D /dr */ { BxPrefixSSE, BX_IA_ERROR, BxOpcodeGroupSSE_0f7d },
1106 /* 0F 7E /dr */ { BxPrefixSSE, BX_IA_MOVD_EdPd, BxOpcodeGroupSSE_0f7e },
1107 /* 0F 7F /dr */ { BxPrefixSSE, BX_IA_MOVQ_QqPq, BxOpcodeGroupSSE_0f7f },
1108 /* 0F 80 /dr */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JO_Jq },
1109 /* 0F 81 /dr */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JNO_Jq },
1110 /* 0F 82 /dr */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JB_Jq },
1111 /* 0F 83 /dr */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JNB_Jq },
1112 /* 0F 84 /dr */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JZ_Jq },
1113 /* 0F 85 /dr */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JNZ_Jq },
1114 /* 0F 86 /dr */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JBE_Jq },
1115 /* 0F 87 /dr */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JNBE_Jq },
1116 /* 0F 88 /dr */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JS_Jq },
1117 /* 0F 89 /dr */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JNS_Jq },
1118 /* 0F 8A /dr */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JP_Jq },
1119 /* 0F 8B /dr */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JNP_Jq },
1120 /* 0F 8C /dr */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JL_Jq },
1121 /* 0F 8D /dr */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JNL_Jq },
1122 /* 0F 8E /dr */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JLE_Jq },
1123 /* 0F 8F /dr */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JNLE_Jq },
1124 /* 0F 90 /dr */ { 0, BX_IA_SETO_EbR },
1125 /* 0F 91 /dr */ { 0, BX_IA_SETNO_EbR },
1126 /* 0F 92 /dr */ { 0, BX_IA_SETB_EbR },
1127 /* 0F 93 /dr */ { 0, BX_IA_SETNB_EbR },
1128 /* 0F 94 /dr */ { 0, BX_IA_SETZ_EbR },
1129 /* 0F 95 /dr */ { 0, BX_IA_SETNZ_EbR },
1130 /* 0F 96 /dr */ { 0, BX_IA_SETBE_EbR },
1131 /* 0F 97 /dr */ { 0, BX_IA_SETNBE_EbR },
1132 /* 0F 98 /dr */ { 0, BX_IA_SETS_EbR },
1133 /* 0F 99 /dr */ { 0, BX_IA_SETNS_EbR },
1134 /* 0F 9A /dr */ { 0, BX_IA_SETP_EbR },
1135 /* 0F 9B /dr */ { 0, BX_IA_SETNP_EbR },
1136 /* 0F 9C /dr */ { 0, BX_IA_SETL_EbR },
1137 /* 0F 9D /dr */ { 0, BX_IA_SETNL_EbR },
1138 /* 0F 9E /dr */ { 0, BX_IA_SETLE_EbR },
1139 /* 0F 9F /dr */ { 0, BX_IA_SETNLE_EbR },
1140 /* 0F A0 /dr */ { 0, BX_IA_PUSH64_FS },
1141 /* 0F A1 /dr */ { 0, BX_IA_POP64_FS },
1142 /* 0F A2 /dr */ { 0, BX_IA_CPUID },
1143 /* 0F A3 /dr */ { 0, BX_IA_BT_EdGdR },
1144 /* 0F A4 /dr */ { BxImmediate_Ib, BX_IA_SHLD_EdGdR },
1145 /* 0F A5 /dr */ { 0, BX_IA_SHLD_EdGdR },
1146 /* 0F A6 /dr */ { 0, BX_IA_ERROR },
1147 /* 0F A7 /dr */ { 0, BX_IA_ERROR },
1148 /* 0F A8 /dr */ { 0, BX_IA_PUSH64_GS },
1149 /* 0F A9 /dr */ { 0, BX_IA_POP64_GS },
1150 /* 0F AA /dr */ { BxTraceEnd, BX_IA_RSM },
1151 /* 0F AB /dr */ { 0, BX_IA_BTS_EdGdR },
1152 /* 0F AC /dr */ { BxImmediate_Ib, BX_IA_SHRD_EdGdR },
1153 /* 0F AD /dr */ { 0, BX_IA_SHRD_EdGdR },
1154 /* 0F AE /dr */ { BxGroup15, BX_IA_ERROR, BxOpcodeInfoG15R },
1155 /* 0F AF /dr */ { 0, BX_IA_IMUL_GdEdR },
1156 /* 0F B0 /dr */ { 0, BX_IA_CMPXCHG_EbGbR },
1157 /* 0F B1 /dr */ { 0, BX_IA_CMPXCHG_EdGdR },
1158 /* 0F B2 /dr */ { 0, BX_IA_ERROR }, // LSS
1159 /* 0F B3 /dr */ { 0, BX_IA_BTR_EdGdR },
1160 /* 0F B4 /dr */ { 0, BX_IA_ERROR }, // LFS
1161 /* 0F B5 /dr */ { 0, BX_IA_ERROR }, // LFS
1162 /* 0F B6 /dr */ { 0, BX_IA_MOVZX_GdEbR },
1163 /* 0F B7 /dr */ { 0, BX_IA_MOVZX_GdEwR },
1164 /* 0F B8 /dr */ { BxPrefixSSE, BX_IA_ERROR, BxOpcodeGroupSSE_0fb8dR },
1165 /* 0F B9 /dr */ { BxTraceEnd, BX_IA_UD2B },
1166 /* 0F BA /dr */ { BxGroup8, BX_IA_ERROR, BxOpcodeInfoG8EdIbR },
1167 /* 0F BB /dr */ { 0, BX_IA_BTC_EdGdR },
1168 /* 0F BC /dr */ { 0, BX_IA_BSF_GdEdR },
1169 /* 0F BD /dr */ { 0, BX_IA_BSR_GdEdR },
1170 /* 0F BE /dr */ { 0, BX_IA_MOVSX_GdEbR },
1171 /* 0F BF /dr */ { 0, BX_IA_MOVSX_GdEwR },
1172 /* 0F C0 /dr */ { 0, BX_IA_XADD_EbGbR },
1173 /* 0F C1 /dr */ { 0, BX_IA_XADD_EdGdR },
1174 /* 0F C2 /dr */ { BxPrefixSSE | BxImmediate_Ib, BX_IA_CMPPS_VpsWpsIb, BxOpcodeGroupSSE_0fc2 },
1175 /* 0F C3 /dr */ { 0, BX_IA_ERROR }, // MOVNTI SSE group
1176 /* 0F C4 /dr */ { BxPrefixSSE | BxImmediate_Ib, BX_IA_PINSRW_PqEwIb, BxOpcodeGroupSSE_0fc4 },
1177 /* 0F C5 /dr */ { BxPrefixSSE | BxImmediate_Ib, BX_IA_PEXTRW_GdPqIb, BxOpcodeGroupSSE_0fc5R },
1178 /* 0F C6 /dr */ { BxPrefixSSE | BxImmediate_Ib, BX_IA_SHUFPS_VpsWpsIb, BxOpcodeGroupSSE_0fc6 },
1179 /* 0F C7 /dr */ { 0, BX_IA_ERROR }, // CMPXCHG8B G9 group
1180 /* 0F C8 /dr */ { 0, BX_IA_BSWAP_ERX },
1181 /* 0F C9 /dr */ { 0, BX_IA_BSWAP_ERX },
1182 /* 0F CA /dr */ { 0, BX_IA_BSWAP_ERX },
1183 /* 0F CB /dr */ { 0, BX_IA_BSWAP_ERX },
1184 /* 0F CC /dr */ { 0, BX_IA_BSWAP_ERX },
1185 /* 0F CD /dr */ { 0, BX_IA_BSWAP_ERX },
1186 /* 0F CE /dr */ { 0, BX_IA_BSWAP_ERX },
1187 /* 0F CF /dr */ { 0, BX_IA_BSWAP_ERX },
1188 /* 0F D0 /dr */ { BxPrefixSSE, BX_IA_ERROR, BxOpcodeGroupSSE_0fd0 },
1189 /* 0F D1 /dr */ { BxPrefixSSE, BX_IA_PSRLW_PqQq, BxOpcodeGroupSSE_0fd1 },
1190 /* 0F D2 /dr */ { BxPrefixSSE, BX_IA_PSRLD_PqQq, BxOpcodeGroupSSE_0fd2 },
1191 /* 0F D3 /dr */ { BxPrefixSSE, BX_IA_PSRLQ_PqQq, BxOpcodeGroupSSE_0fd3 },
1192 /* 0F D4 /dr */ { BxPrefixSSE, BX_IA_PADDQ_PqQq, BxOpcodeGroupSSE_0fd4 },
1193 /* 0F D5 /dr */ { BxPrefixSSE, BX_IA_PMULLW_PqQq, BxOpcodeGroupSSE_0fd5 },
1194 /* 0F D6 /dr */ { BxPrefixSSE, BX_IA_ERROR, BxOpcodeGroupSSE_0fd6 },
1195 /* 0F D7 /dr */ { BxPrefixSSE, BX_IA_PMOVMSKB_GdPRq, BxOpcodeGroupSSE_0fd7 },
1196 /* 0F D8 /dr */ { BxPrefixSSE, BX_IA_PSUBUSB_PqQq, BxOpcodeGroupSSE_0fd8 },
1197 /* 0F D9 /dr */ { BxPrefixSSE, BX_IA_PSUBUSW_PqQq, BxOpcodeGroupSSE_0fd9 },
1198 /* 0F DA /dr */ { BxPrefixSSE, BX_IA_PMINUB_PqQq, BxOpcodeGroupSSE_0fda },
1199 /* 0F DB /dr */ { BxPrefixSSE, BX_IA_PAND_PqQq, BxOpcodeGroupSSE_0fdb },
1200 /* 0F DC /dr */ { BxPrefixSSE, BX_IA_PADDUSB_PqQq, BxOpcodeGroupSSE_0fdc },
1201 /* 0F DD /dr */ { BxPrefixSSE, BX_IA_PADDUSW_PqQq, BxOpcodeGroupSSE_0fdd },
1202 /* 0F DE /dr */ { BxPrefixSSE, BX_IA_PMAXUB_PqQq, BxOpcodeGroupSSE_0fde },
1203 /* 0F DF /dr */ { BxPrefixSSE, BX_IA_PANDN_PqQq, BxOpcodeGroupSSE_0fdf },
1204 /* 0F E0 /dr */ { BxPrefixSSE, BX_IA_PAVGB_PqQq, BxOpcodeGroupSSE_0fe0 },
1205 /* 0F E1 /dr */ { BxPrefixSSE, BX_IA_PSRAW_PqQq, BxOpcodeGroupSSE_0fe1 },
1206 /* 0F E2 /dr */ { BxPrefixSSE, BX_IA_PSRAD_PqQq, BxOpcodeGroupSSE_0fe2 },
1207 /* 0F E3 /dr */ { BxPrefixSSE, BX_IA_PAVGW_PqQq, BxOpcodeGroupSSE_0fe3 },
1208 /* 0F E4 /dr */ { BxPrefixSSE, BX_IA_PMULHUW_PqQq, BxOpcodeGroupSSE_0fe4 },
1209 /* 0F E5 /dr */ { BxPrefixSSE, BX_IA_PMULHW_PqQq, BxOpcodeGroupSSE_0fe5 },
1210 /* 0F E6 /dr */ { BxPrefixSSE, BX_IA_ERROR, BxOpcodeGroupSSE_0fe6 },
1211 /* 0F E7 /dr */ { 0, BX_IA_ERROR }, // MOVNTQ/MOVNTDQ SSE group
1212 /* 0F E8 /dr */ { BxPrefixSSE, BX_IA_PSUBSB_PqQq, BxOpcodeGroupSSE_0fe8 },
1213 /* 0F E9 /dr */ { BxPrefixSSE, BX_IA_PSUBSW_PqQq, BxOpcodeGroupSSE_0fe9 },
1214 /* 0F EA /dr */ { BxPrefixSSE, BX_IA_PMINSW_PqQq, BxOpcodeGroupSSE_0fea },
1215 /* 0F EB /dr */ { BxPrefixSSE, BX_IA_POR_PqQq, BxOpcodeGroupSSE_0feb },
1216 /* 0F EC /dr */ { BxPrefixSSE, BX_IA_PADDSB_PqQq, BxOpcodeGroupSSE_0fec },
1217 /* 0F ED /dr */ { BxPrefixSSE, BX_IA_PADDSW_PqQq, BxOpcodeGroupSSE_0fed },
1218 /* 0F EE /dr */ { BxPrefixSSE, BX_IA_PMAXSW_PqQq, BxOpcodeGroupSSE_0fee },
1219 /* 0F EF /dr */ { BxPrefixSSE, BX_IA_PXOR_PqQq, BxOpcodeGroupSSE_0fef },
1220 /* 0F F0 /dr */ { 0, BX_IA_ERROR }, // LDDQU SSE group
1221 /* 0F F1 /dr */ { BxPrefixSSE, BX_IA_PSLLW_PqQq, BxOpcodeGroupSSE_0ff1 },
1222 /* 0F F2 /dr */ { BxPrefixSSE, BX_IA_PSLLD_PqQq, BxOpcodeGroupSSE_0ff2 },
1223 /* 0F F3 /dr */ { BxPrefixSSE, BX_IA_PSLLQ_PqQq, BxOpcodeGroupSSE_0ff3 },
1224 /* 0F F4 /dr */ { BxPrefixSSE, BX_IA_PMULUDQ_PqQq, BxOpcodeGroupSSE_0ff4 },
1225 /* 0F F5 /dr */ { BxPrefixSSE, BX_IA_PMADDWD_PqQq, BxOpcodeGroupSSE_0ff5 },
1226 /* 0F F6 /dr */ { BxPrefixSSE, BX_IA_PSADBW_PqQq, BxOpcodeGroupSSE_0ff6 },
1227 /* 0F F7 /dr */ { BxPrefixSSE, BX_IA_MASKMOVQ_PqPRq, BxOpcodeGroupSSE_0ff7R },
1228 /* 0F F8 /dr */ { BxPrefixSSE, BX_IA_PSUBB_PqQq, BxOpcodeGroupSSE_0ff8 },
1229 /* 0F F9 /dr */ { BxPrefixSSE, BX_IA_PSUBW_PqQq, BxOpcodeGroupSSE_0ff9 },
1230 /* 0F FA /dr */ { BxPrefixSSE, BX_IA_PSUBD_PqQq, BxOpcodeGroupSSE_0ffa },
1231 /* 0F FB /dr */ { BxPrefixSSE, BX_IA_PSUBQ_PqQq, BxOpcodeGroupSSE_0ffb },
1232 /* 0F FC /dr */ { BxPrefixSSE, BX_IA_PADDB_PqQq, BxOpcodeGroupSSE_0ffc },
1233 /* 0F FD /dr */ { BxPrefixSSE, BX_IA_PADDW_PqQq, BxOpcodeGroupSSE_0ffd },
1234 /* 0F FE /dr */ { BxPrefixSSE, BX_IA_PADDD_PqQq, BxOpcodeGroupSSE_0ffe },
1235 /* 0F FF /dr */ { 0, BX_IA_ERROR },
1237 // 512 entries for 64bit operand size
1238 /* 00 /qr */ { BxArithDstRM, BX_IA_ADD_GbEbR },
1239 /* 01 /qr */ { BxArithDstRM, BX_IA_ADD_GqEqR },
1240 /* 02 /qr */ { 0, BX_IA_ADD_GbEbR },
1241 /* 03 /qr */ { 0, BX_IA_ADD_GqEqR },
1242 /* 04 /qr */ { BxImmediate_Ib, BX_IA_ADD_ALIb },
1243 /* 05 /qr */ { BxImmediate_Id, BX_IA_ADD_RAXId },
1244 /* 06 /qr */ { 0, BX_IA_ERROR },
1245 /* 07 /qr */ { 0, BX_IA_ERROR },
1246 /* 08 /qr */ { BxArithDstRM, BX_IA_OR_GbEbR },
1247 /* 09 /qr */ { BxArithDstRM, BX_IA_OR_GqEqR },
1248 /* 0A /qr */ { 0, BX_IA_OR_GbEbR },
1249 /* 0B /qr */ { 0, BX_IA_OR_GqEqR },
1250 /* 0C /qr */ { BxImmediate_Ib, BX_IA_OR_ALIb },
1251 /* 0D /qr */ { BxImmediate_Id, BX_IA_OR_RAXId },
1252 /* 0E /qr */ { 0, BX_IA_ERROR },
1253 /* 0F /qr */ { 0, BX_IA_ERROR }, // 2-byte escape
1254 /* 10 /qr */ { BxArithDstRM, BX_IA_ADC_GbEbR },
1255 /* 11 /qr */ { BxArithDstRM, BX_IA_ADC_GqEqR },
1256 /* 12 /qr */ { 0, BX_IA_ADC_GbEbR },
1257 /* 13 /qr */ { 0, BX_IA_ADC_GqEqR },
1258 /* 14 /qr */ { BxImmediate_Ib, BX_IA_ADC_ALIb },
1259 /* 15 /qr */ { BxImmediate_Id, BX_IA_ADC_RAXId },
1260 /* 16 /qr */ { 0, BX_IA_ERROR },
1261 /* 17 /qr */ { 0, BX_IA_ERROR },
1262 /* 18 /qr */ { BxArithDstRM, BX_IA_SBB_GbEbR },
1263 /* 19 /qr */ { BxArithDstRM, BX_IA_SBB_GqEqR },
1264 /* 1A /qr */ { 0, BX_IA_SBB_GbEbR },
1265 /* 1B /qr */ { 0, BX_IA_SBB_GqEqR },
1266 /* 1C /qr */ { BxImmediate_Ib, BX_IA_SBB_ALIb },
1267 /* 1D /qr */ { BxImmediate_Id, BX_IA_SBB_RAXId },
1268 /* 1E /qr */ { 0, BX_IA_ERROR },
1269 /* 1F /qr */ { 0, BX_IA_ERROR },
1270 /* 20 /qr */ { BxArithDstRM, BX_IA_AND_GbEbR },
1271 /* 21 /qr */ { BxArithDstRM, BX_IA_AND_GqEqR },
1272 /* 22 /qr */ { 0, BX_IA_AND_GbEbR },
1273 /* 23 /qr */ { 0, BX_IA_AND_GqEqR },
1274 /* 24 /qr */ { BxImmediate_Ib, BX_IA_AND_ALIb },
1275 /* 25 /qr */ { BxImmediate_Id, BX_IA_AND_RAXId },
1276 /* 26 /qr */ { 0, BX_IA_ERROR }, // ES:
1277 /* 27 /qr */ { 0, BX_IA_ERROR },
1278 /* 28 /qr */ { BxArithDstRM, BX_IA_SUB_GbEbR },
1279 /* 29 /qr */ { BxArithDstRM, BX_IA_SUB_GqEqR },
1280 /* 2A /qr */ { 0, BX_IA_SUB_GbEbR },
1281 /* 2B /qr */ { 0, BX_IA_SUB_GqEqR },
1282 /* 2C /qr */ { BxImmediate_Ib, BX_IA_SUB_ALIb },
1283 /* 2D /qr */ { BxImmediate_Id, BX_IA_SUB_RAXId },
1284 /* 2E /qr */ { 0, BX_IA_ERROR }, // CS:
1285 /* 2F /qr */ { 0, BX_IA_ERROR },
1286 /* 30 /qr */ { BxArithDstRM, BX_IA_XOR_GbEbR },
1287 /* 31 /qr */ { BxArithDstRM, BX_IA_XOR_GqEqR },
1288 /* 32 /qr */ { 0, BX_IA_XOR_GbEbR },
1289 /* 33 /qr */ { 0, BX_IA_XOR_GqEqR },
1290 /* 34 /qr */ { BxImmediate_Ib, BX_IA_XOR_ALIb },
1291 /* 35 /qr */ { BxImmediate_Id, BX_IA_XOR_RAXId },
1292 /* 36 /qr */ { 0, BX_IA_ERROR }, // SS:
1293 /* 37 /qr */ { 0, BX_IA_ERROR },
1294 /* 38 /qr */ { BxArithDstRM, BX_IA_CMP_GbEbR },
1295 /* 39 /qr */ { BxArithDstRM, BX_IA_CMP_GqEqR },
1296 /* 3A /qr */ { 0, BX_IA_CMP_GbEbR },
1297 /* 3B /qr */ { 0, BX_IA_CMP_GqEqR },
1298 /* 3C /qr */ { BxImmediate_Ib, BX_IA_CMP_ALIb },
1299 /* 3D /qr */ { BxImmediate_Id, BX_IA_CMP_RAXId },
1300 /* 3E /qr */ { 0, BX_IA_ERROR }, // DS:
1301 /* 3F /qr */ { 0, BX_IA_ERROR },
1302 /* 40 /qr */ { 0, BX_IA_ERROR }, // REX:
1303 /* 41 /qr */ { 0, BX_IA_ERROR }, // REX:
1304 /* 42 /qr */ { 0, BX_IA_ERROR }, // REX:
1305 /* 43 /qr */ { 0, BX_IA_ERROR }, // REX:
1306 /* 44 /qr */ { 0, BX_IA_ERROR }, // REX:
1307 /* 45 /qr */ { 0, BX_IA_ERROR }, // REX:
1308 /* 46 /qr */ { 0, BX_IA_ERROR }, // REX:
1309 /* 47 /qr */ { 0, BX_IA_ERROR }, // REX:
1310 /* 48 /qr */ { 0, BX_IA_ERROR }, // REX:
1311 /* 49 /qr */ { 0, BX_IA_ERROR }, // REX:
1312 /* 4A /qr */ { 0, BX_IA_ERROR }, // REX:
1313 /* 4B /qr */ { 0, BX_IA_ERROR }, // REX:
1314 /* 4C /qr */ { 0, BX_IA_ERROR }, // REX:
1315 /* 4D /qr */ { 0, BX_IA_ERROR }, // REX:
1316 /* 4E /qr */ { 0, BX_IA_ERROR }, // REX:
1317 /* 4F /qr */ { 0, BX_IA_ERROR }, // REX:
1318 /* 50 /qr */ { 0, BX_IA_PUSH_RRX },
1319 /* 51 /qr */ { 0, BX_IA_PUSH_RRX },
1320 /* 52 /qr */ { 0, BX_IA_PUSH_RRX },
1321 /* 53 /qr */ { 0, BX_IA_PUSH_RRX },
1322 /* 54 /qr */ { 0, BX_IA_PUSH_RRX },
1323 /* 55 /qr */ { 0, BX_IA_PUSH_RRX },
1324 /* 56 /qr */ { 0, BX_IA_PUSH_RRX },
1325 /* 57 /qr */ { 0, BX_IA_PUSH_RRX },
1326 /* 58 /qr */ { 0, BX_IA_POP_RRX },
1327 /* 59 /qr */ { 0, BX_IA_POP_RRX },
1328 /* 5A /qr */ { 0, BX_IA_POP_RRX },
1329 /* 5B /qr */ { 0, BX_IA_POP_RRX },
1330 /* 5C /qr */ { 0, BX_IA_POP_RRX },
1331 /* 5D /qr */ { 0, BX_IA_POP_RRX },
1332 /* 5E /qr */ { 0, BX_IA_POP_RRX },
1333 /* 5F /qr */ { 0, BX_IA_POP_RRX },
1334 /* 60 /qr */ { 0, BX_IA_ERROR },
1335 /* 61 /qr */ { 0, BX_IA_ERROR },
1336 /* 62 /qr */ { 0, BX_IA_ERROR },
1337 /* 63 /qr */ { 0, BX_IA_MOVSX_GqEdR },
1338 /* 64 /qr */ { 0, BX_IA_ERROR }, // FS:
1339 /* 65 /qr */ { 0, BX_IA_ERROR }, // GS:
1340 /* 66 /qr */ { 0, BX_IA_ERROR }, // OS:
1341 /* 67 /qr */ { 0, BX_IA_ERROR }, // AS:
1342 /* 68 /qr */ { BxImmediate_Id, BX_IA_PUSH64_Id },
1343 /* 69 /qr */ { BxImmediate_Id, BX_IA_IMUL_GqEqIdR },
1344 /* 6A /qr */ { BxImmediate_Ib_SE, BX_IA_PUSH64_Id },
1345 /* 6B /qr */ { BxImmediate_Ib_SE, BX_IA_IMUL_GqEqIdR },
1346 /* 6C /qr */ { 0, BX_IA_REP_INSB_YbDX },
1347 /* 6D /qr */ { 0, BX_IA_REP_INSD_YdDX },
1348 /* 6E /qr */ { 0, BX_IA_REP_OUTSB_DXXb },
1349 /* 6F /qr */ { 0, BX_IA_REP_OUTSD_DXXd },
1350 /* 70 /qr */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JO_Jq },
1351 /* 71 /qr */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JNO_Jq },
1352 /* 72 /qr */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JB_Jq },
1353 /* 73 /qr */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JNB_Jq },
1354 /* 74 /qr */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JZ_Jq },
1355 /* 75 /qr */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JNZ_Jq },
1356 /* 76 /qr */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JBE_Jq },
1357 /* 77 /qr */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JNBE_Jq },
1358 /* 78 /qr */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JS_Jq },
1359 /* 79 /qr */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JNS_Jq },
1360 /* 7A /qr */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JP_Jq },
1361 /* 7B /qr */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JNP_Jq },
1362 /* 7C /qr */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JL_Jq },
1363 /* 7D /qr */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JNL_Jq },
1364 /* 7E /qr */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JLE_Jq },
1365 /* 7F /qr */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JNLE_Jq },
1366 /* 80 /qr */ { BxGroup1 | BxImmediate_Ib, BX_IA_ERROR, BxOpcodeInfoG1EbIbR },
1367 /* 81 /qr */ { BxGroup1 | BxImmediate_Id, BX_IA_ERROR, BxOpcodeInfo64G1EqR },
1368 /* 82 /qr */ { 0, BX_IA_ERROR },
1369 /* 83 /qr */ { BxGroup1 | BxImmediate_Ib_SE, BX_IA_ERROR, BxOpcodeInfo64G1EqR },
1370 /* 84 /qr */ { 0, BX_IA_TEST_EbGbR },
1371 /* 85 /qr */ { 0, BX_IA_TEST_EqGqR },
1372 /* 86 /qr */ { 0, BX_IA_XCHG_EbGbR },
1373 /* 87 /qr */ { 0, BX_IA_XCHG_EqGqR },
1374 /* 88 /qr */ { BxArithDstRM, BX_IA_MOV_GbEbR },
1375 /* 89 /qr */ { BxArithDstRM, BX_IA_MOV_GqEqR },
1376 /* 8A /qr */ { 0, BX_IA_MOV_GbEbR },
1377 /* 8B /qr */ { 0, BX_IA_MOV_GqEqR },
1378 /* 8C /qr */ { 0, BX_IA_MOV_EwSwR },
1379 /* 8D /qr */ { 0, BX_IA_ERROR }, // LEA
1380 /* 8E /qr */ { 0, BX_IA_MOV_SwEw },
1381 /* 8F /qr */ { BxGroup1A, BX_IA_ERROR, BxOpcodeInfo64G1AEqR },
1382 /* 90 /qr */ { 0, BX_IA_XCHG_RRXRAX }, // handles XCHG R8, RAX
1383 /* 91 /qr */ { 0, BX_IA_XCHG_RRXRAX },
1384 /* 92 /qr */ { 0, BX_IA_XCHG_RRXRAX },
1385 /* 93 /qr */ { 0, BX_IA_XCHG_RRXRAX },
1386 /* 94 /qr */ { 0, BX_IA_XCHG_RRXRAX },
1387 /* 95 /qr */ { 0, BX_IA_XCHG_RRXRAX },
1388 /* 96 /qr */ { 0, BX_IA_XCHG_RRXRAX },
1389 /* 97 /qr */ { 0, BX_IA_XCHG_RRXRAX },
1390 /* 98 /qr */ { 0, BX_IA_CDQE },
1391 /* 99 /qr */ { 0, BX_IA_CQO },
1392 /* 9A /qr */ { 0, BX_IA_ERROR },
1393 /* 9B /qr */ { 0, BX_IA_FWAIT },
1394 /* 9C /qr */ { 0, BX_IA_PUSHF_Fq },
1395 /* 9D /qr */ { 0, BX_IA_POPF_Fq },
1396 /* 9E /qr */ { 0, BX_IA_SAHF },
1397 /* 9F /qr */ { 0, BX_IA_LAHF },
1398 /* A0 /qr */ { BxImmediate_O, BX_IA_MOV_ALOq },
1399 /* A1 /qr */ { BxImmediate_O, BX_IA_MOV_RAXOq },
1400 /* A2 /qr */ { BxImmediate_O, BX_IA_MOV_OqAL },
1401 /* A3 /qr */ { BxImmediate_O, BX_IA_MOV_OqRAX },
1402 /* A4 /qr */ { 0, BX_IA_REP_MOVSB_XbYb },
1403 /* A5 /qr */ { 0, BX_IA_REP_MOVSQ_XqYq },
1404 /* A6 /qr */ { 0, BX_IA_REP_CMPSB_XbYb },
1405 /* A7 /qr */ { 0, BX_IA_REP_CMPSQ_XqYq },
1406 /* A8 /qr */ { BxImmediate_Ib, BX_IA_TEST_ALIb },
1407 /* A9 /qr */ { BxImmediate_Id, BX_IA_TEST_RAXId },
1408 /* AA /qr */ { 0, BX_IA_REP_STOSB_YbAL },
1409 /* AB /qr */ { 0, BX_IA_REP_STOSQ_YqRAX },
1410 /* AC /qr */ { 0, BX_IA_REP_LODSB_ALXb },
1411 /* AD /qr */ { 0, BX_IA_REP_LODSQ_RAXXq },
1412 /* AE /qr */ { 0, BX_IA_REP_SCASB_ALXb },
1413 /* AF /qr */ { 0, BX_IA_REP_SCASQ_RAXXq },
1414 /* B0 /qr */ { BxImmediate_Ib, BX_IA_MOV_RLIb },
1415 /* B1 /qr */ { BxImmediate_Ib, BX_IA_MOV_RLIb },
1416 /* B2 /qr */ { BxImmediate_Ib, BX_IA_MOV_RLIb },
1417 /* B3 /qr */ { BxImmediate_Ib, BX_IA_MOV_RLIb },
1418 /* B4 /qr */ { BxImmediate_Ib, BX_IA_MOV_RLIb },
1419 /* B5 /qr */ { BxImmediate_Ib, BX_IA_MOV_RLIb },
1420 /* B6 /qr */ { BxImmediate_Ib, BX_IA_MOV_RLIb },
1421 /* B7 /qr */ { BxImmediate_Ib, BX_IA_MOV_RLIb },
1422 /* B8 /qr */ { BxImmediate_Iq, BX_IA_MOV_RRXIq },
1423 /* B9 /qr */ { BxImmediate_Iq, BX_IA_MOV_RRXIq },
1424 /* BA /qr */ { BxImmediate_Iq, BX_IA_MOV_RRXIq },
1425 /* BB /qr */ { BxImmediate_Iq, BX_IA_MOV_RRXIq },
1426 /* BC /qr */ { BxImmediate_Iq, BX_IA_MOV_RRXIq },
1427 /* BD /qr */ { BxImmediate_Iq, BX_IA_MOV_RRXIq },
1428 /* BE /qr */ { BxImmediate_Iq, BX_IA_MOV_RRXIq },
1429 /* BF /qr */ { BxImmediate_Iq, BX_IA_MOV_RRXIq },
1430 /* C0 /qr */ { BxGroup2 | BxImmediate_Ib, BX_IA_ERROR, BxOpcodeInfoG2Eb },
1431 /* C1 /qr */ { BxGroup2 | BxImmediate_Ib, BX_IA_ERROR, BxOpcodeInfo64G2EqR },
1432 /* C2 /qr */ { BxImmediate_Iw | BxTraceEnd, BX_IA_RETnear64_Iw },
1433 /* C3 /qr */ { BxTraceEnd, BX_IA_RETnear64 },
1434 /* C4 /qr */ { 0, BX_IA_ERROR },
1435 /* C5 /qr */ { 0, BX_IA_ERROR },
1436 /* C6 /qr */ { BxGroup11, BX_IA_ERROR, BxOpcodeInfoG11EbR },
1437 /* C7 /qr */ { BxGroup11, BX_IA_ERROR, BxOpcodeInfo64G11EqR },
1438 /* C8 /qr */ { BxImmediate_IwIb, BX_IA_ENTER64_IwIb },
1439 /* C9 /qr */ { 0, BX_IA_LEAVE64 },
1440 /* CA /qr */ { BxImmediate_Iw | BxTraceEnd, BX_IA_RETfar64_Iw },
1441 /* CB /qr */ { BxTraceEnd, BX_IA_RETfar64 },
1442 /* CC /qr */ { BxTraceEnd, BX_IA_INT3 },
1443 /* CD /qr */ { BxImmediate_Ib | BxTraceEnd, BX_IA_INT_Ib },
1444 /* CE /qr */ { 0, BX_IA_ERROR },
1445 /* CF /qr */ { BxTraceEnd, BX_IA_IRET64 },
1446 /* D0 /qr */ { BxGroup2 | BxImmediate_I1, BX_IA_ERROR, BxOpcodeInfoG2Eb },
1447 /* D1 /qr */ { BxGroup2 | BxImmediate_I1, BX_IA_ERROR, BxOpcodeInfo64G2EqR },
1448 /* D2 /qr */ { BxGroup2, BX_IA_ERROR, BxOpcodeInfoG2Eb },
1449 /* D3 /qr */ { BxGroup2, BX_IA_ERROR, BxOpcodeInfo64G2EqR },
1450 /* D4 /qr */ { 0, BX_IA_ERROR },
1451 /* D5 /qr */ { 0, BX_IA_ERROR },
1452 /* D6 /qr */ { 0, BX_IA_ERROR },
1453 /* D7 /qr */ { 0, BX_IA_XLAT },
1454 /* D8 /qr */ { BxFPEscape, BX_IA_ERROR, BxOpcodeInfo_FloatingPointD8 },
1455 /* D9 /qr */ { BxFPEscape, BX_IA_ERROR, BxOpcodeInfo_FloatingPointD9 },
1456 /* DA /qr */ { BxFPEscape, BX_IA_ERROR, BxOpcodeInfo_FloatingPointDA },
1457 /* DB /qr */ { BxFPEscape, BX_IA_ERROR, BxOpcodeInfo_FloatingPointDB },
1458 /* DC /qr */ { BxFPEscape, BX_IA_ERROR, BxOpcodeInfo_FloatingPointDC },
1459 /* DD /qr */ { BxFPEscape, BX_IA_ERROR, BxOpcodeInfo_FloatingPointDD },
1460 /* DE /qr */ { BxFPEscape, BX_IA_ERROR, BxOpcodeInfo_FloatingPointDE },
1461 /* DF /qr */ { BxFPEscape, BX_IA_ERROR, BxOpcodeInfo_FloatingPointDF },
1462 /* E0 /qr */ { BxImmediate_BrOff8 | BxTraceEnd, BX_IA_LOOPNE64_Jb },
1463 /* E1 /qr */ { BxImmediate_BrOff8 | BxTraceEnd, BX_IA_LOOPE64_Jb },
1464 /* E2 /qr */ { BxImmediate_BrOff8 | BxTraceEnd, BX_IA_LOOP64_Jb },
1465 /* E3 /qr */ { BxImmediate_BrOff8 | BxTraceEnd, BX_IA_JRCXZ_Jb },
1466 /* E4 /qr */ { BxImmediate_Ib, BX_IA_IN_ALIb },
1467 /* E5 /qr */ { BxImmediate_Ib, BX_IA_IN_EAXIb },
1468 /* E6 /qr */ { BxImmediate_Ib, BX_IA_OUT_IbAL },
1469 /* E7 /qr */ { BxImmediate_Ib, BX_IA_OUT_IbEAX },
1470 /* E8 /qr */ { BxImmediate_BrOff32 | BxTraceEnd, BX_IA_CALL_Jq },
1471 /* E9 /qr */ { BxImmediate_BrOff32 | BxTraceEnd, BX_IA_JMP_Jq },
1472 /* EA /qr */ { 0, BX_IA_ERROR },
1473 /* EB /qr */ { BxImmediate_BrOff8 | BxTraceEnd, BX_IA_JMP_Jq },
1474 /* EC /qr */ { 0, BX_IA_IN_ALDX },
1475 /* ED /qr */ { 0, BX_IA_IN_EAXDX },
1476 /* EE /qr */ { 0, BX_IA_OUT_DXAL },
1477 /* EF /qr */ { 0, BX_IA_OUT_DXEAX },
1478 /* F0 /qr */ { 0, BX_IA_ERROR }, // LOCK:
1479 /* F1 /qr */ { BxTraceEnd, BX_IA_INT1 },
1480 /* F2 /qr */ { 0, BX_IA_ERROR }, // REPNE/REPNZ
1481 /* F3 /qr */ { 0, BX_IA_ERROR }, // REP,REPE/REPZ
1482 /* F4 /qr */ { BxTraceEnd, BX_IA_HLT },
1483 /* F5 /qr */ { 0, BX_IA_CMC },
1484 /* F6 /qr */ { BxGroup3, BX_IA_ERROR, BxOpcodeInfoG3EbR },
1485 /* F7 /qr */ { BxGroup3, BX_IA_ERROR, BxOpcodeInfo64G3EqR },
1486 /* F8 /qr */ { 0, BX_IA_CLC },
1487 /* F9 /qr */ { 0, BX_IA_STC },
1488 /* FA /qr */ { 0, BX_IA_CLI },
1489 /* FB /qr */ { 0, BX_IA_STI },
1490 /* FC /qr */ { 0, BX_IA_CLD },
1491 /* FD /qr */ { 0, BX_IA_STD },
1492 /* FE /qr */ { BxGroup4, BX_IA_ERROR, BxOpcodeInfoG4R },
1493 /* FF /qr */ { BxGroup5, BX_IA_ERROR, BxOpcodeInfo64G5qR },
1495 /* 0F 00 /qr */ { BxGroup6, BX_IA_ERROR, BxOpcodeInfoG6 },
1496 /* 0F 01 /qr */ { BxGroup7, BX_IA_ERROR, BxOpcodeInfo64G7R },
1497 /* 0F 02 /qr */ { 0, BX_IA_LAR_GvEw },
1498 /* 0F 03 /qr */ { 0, BX_IA_LSL_GvEw },
1499 /* 0F 04 /qr */ { 0, BX_IA_ERROR },
1500 /* 0F 05 /qr */ { BxTraceEnd, BX_IA_SYSCALL },
1501 /* 0F 06 /qr */ { 0, BX_IA_CLTS },
1502 /* 0F 07 /qr */ { BxTraceEnd, BX_IA_SYSRET },
1503 /* 0F 08 /qr */ { BxTraceEnd, BX_IA_INVD },
1504 /* 0F 09 /qr */ { BxTraceEnd, BX_IA_WBINVD },
1505 /* 0F 0A /qr */ { 0, BX_IA_ERROR },
1506 /* 0F 0B /qr */ { BxTraceEnd, BX_IA_UD2A },
1507 /* 0F 0C /qr */ { 0, BX_IA_ERROR },
1508 /* 0F 0D /qr */ { 0, BX_IA_NOP }, // 3DNow! PREFETCH on AMD, NOP on Intel
1509 /* 0F 0E /qr */ { 0, BX_IA_FEMMS }, // 3DNow! FEMMS
1510 #if BX_SUPPORT_3DNOW
1511 /* 0F 0F /qr */ { BxImmediate_Ib, BX_IA_ERROR, Bx3DNowOpcodeInfo },
1512 #else
1513 /* 0F 0F /qr */ { 0, BX_IA_ERROR },
1514 #endif
1515 /* 0F 10 /qr */ { BxPrefixSSE, BX_IA_MOVUPS_VpsWps, BxOpcodeGroupSSE_0f10 },
1516 /* 0F 11 /qr */ { BxPrefixSSE, BX_IA_MOVUPS_WpsVps, BxOpcodeGroupSSE_0f11 },
1517 /* 0F 12 /qr */ { BxPrefixSSE, BX_IA_MOVLPS_VpsMq, BxOpcodeGroupSSE_0f12 },
1518 /* 0F 13 /qr */ { 0, BX_IA_ERROR }, // MOVLPS/PD SSE group
1519 /* 0F 14 /qr */ { BxPrefixSSE, BX_IA_UNPCKLPS_VpsWdq, BxOpcodeGroupSSE_0f14 },
1520 /* 0F 15 /qr */ { BxPrefixSSE, BX_IA_UNPCKHPS_VpsWdq, BxOpcodeGroupSSE_0f15 },
1521 /* 0F 16 /qr */ { BxPrefixSSE, BX_IA_MOVHPS_VpsMq, BxOpcodeGroupSSE_0f16 },
1522 /* 0F 17 /qr */ { 0, BX_IA_ERROR }, // MOHLPS/PD SSE group
1523 /* 0F 18 /qr */ { 0, BX_IA_NOP }, // PREFETCH HINT
1524 /* 0F 19 /qr */ { 0, BX_IA_NOP }, // multi-byte NOP
1525 /* 0F 1A /qr */ { 0, BX_IA_NOP }, // multi-byte NOP
1526 /* 0F 1B /qr */ { 0, BX_IA_NOP }, // multi-byte NOP
1527 /* 0F 1C /qr */ { 0, BX_IA_NOP }, // multi-byte NOP
1528 /* 0F 1D /qr */ { 0, BX_IA_NOP }, // multi-byte NOP
1529 /* 0F 1E /qr */ { 0, BX_IA_NOP }, // multi-byte NOP
1530 /* 0F 1F /qr */ { 0, BX_IA_NOP }, // multi-byte NOP
1531 /* 0F 20 /qr */ { 0, BX_IA_MOV_RqCq },
1532 /* 0F 21 /qr */ { 0, BX_IA_MOV_RqDq },
1533 /* 0F 22 /qr */ { BxTraceEnd, BX_IA_MOV_CqRq },
1534 /* 0F 23 /qr */ { BxTraceEnd, BX_IA_MOV_DqRq },
1535 /* 0F 24 /qr */ { 0, BX_IA_ERROR },
1536 /* 0F 25 /qr */ { 0, BX_IA_ERROR },
1537 /* 0F 26 /qr */ { 0, BX_IA_ERROR },
1538 /* 0F 27 /qr */ { 0, BX_IA_ERROR },
1539 /* 0F 28 /qr */ { BxPrefixSSE, BX_IA_MOVAPS_VpsWps, BxOpcodeGroupSSE_0f28 },
1540 /* 0F 29 /qr */ { BxPrefixSSE, BX_IA_MOVAPS_WpsVps, BxOpcodeGroupSSE_0f29 },
1541 /* 0F 2A /qr */ { BxPrefixSSE, BX_IA_CVTPI2PS_VpsQq, BxOpcodeGroupSSE_0f2a },
1542 /* 0F 2B /qr */ { 0, BX_IA_ERROR }, // MOVNTPS/PD/SS/SD
1543 /* 0F 2C /qr */ { BxPrefixSSE, BX_IA_CVTTPS2PI_PqWps, BxOpcodeGroupSSE_0f2c },
1544 /* 0F 2D /qr */ { BxPrefixSSE, BX_IA_CVTPS2PI_PqWps, BxOpcodeGroupSSE_0f2d },
1545 /* 0F 2E /qr */ { BxPrefixSSE, BX_IA_UCOMISS_VssWss, BxOpcodeGroupSSE_0f2e },
1546 /* 0F 2F /qr */ { BxPrefixSSE, BX_IA_COMISS_VpsWps, BxOpcodeGroupSSE_0f2f },
1547 /* 0F 30 /qr */ { 0, BX_IA_WRMSR },
1548 /* 0F 31 /qr */ { 0, BX_IA_RDTSC },
1549 /* 0F 32 /qr */ { 0, BX_IA_RDMSR },
1550 /* 0F 33 /qr */ { 0, BX_IA_RDPMC },
1551 /* 0F 34 /qr */ { 0, BX_IA_SYSENTER },
1552 /* 0F 35 /qr */ { 0, BX_IA_SYSEXIT },
1553 /* 0F 36 /qr */ { 0, BX_IA_ERROR },
1554 /* 0F 37 /qr */ { 0, BX_IA_ERROR },
1555 #if (BX_SUPPORT_SSE >= 4) || (BX_SUPPORT_SSE >= 3 && BX_SUPPORT_SSE_EXTENSION > 0)
1556 /* 0F 38 /qr */ { Bx3ByteOp, BX_IA_ERROR, BxOpcode3ByteTable0f38 }, // 3-byte escape
1557 #else
1558 /* 0F 38 /qr */ { 0, BX_IA_ERROR },
1559 #endif
1560 /* 0F 39 /qr */ { 0, BX_IA_ERROR },
1561 #if (BX_SUPPORT_SSE >= 4) || (BX_SUPPORT_SSE >= 3 && BX_SUPPORT_SSE_EXTENSION > 0)
1562 /* 0F 3A /qr */ { Bx3ByteOp, BX_IA_ERROR, BxOpcode3ByteTable0f3a }, // 3-byte escape
1563 #else
1564 /* 0F 3A /qr */ { 0, BX_IA_ERROR },
1565 #endif
1566 /* 0F 3B /qr */ { 0, BX_IA_ERROR },
1567 /* 0F 3C /qr */ { 0, BX_IA_ERROR },
1568 /* 0F 3D /qr */ { 0, BX_IA_ERROR },
1569 /* 0F 3E /qr */ { 0, BX_IA_ERROR },
1570 /* 0F 3F /qr */ { 0, BX_IA_ERROR },
1571 /* 0F 40 /qr */ { 0, BX_IA_CMOVO_GqEqR },
1572 /* 0F 41 /qr */ { 0, BX_IA_CMOVNO_GqEqR },
1573 /* 0F 42 /qr */ { 0, BX_IA_CMOVB_GqEqR },
1574 /* 0F 43 /qr */ { 0, BX_IA_CMOVNB_GqEqR },
1575 /* 0F 44 /qr */ { 0, BX_IA_CMOVZ_GqEqR },
1576 /* 0F 45 /qr */ { 0, BX_IA_CMOVNZ_GqEqR },
1577 /* 0F 46 /qr */ { 0, BX_IA_CMOVBE_GqEqR },
1578 /* 0F 47 /qr */ { 0, BX_IA_CMOVNBE_GqEqR },
1579 /* 0F 48 /qr */ { 0, BX_IA_CMOVS_GqEqR },
1580 /* 0F 49 /qr */ { 0, BX_IA_CMOVNS_GqEqR },
1581 /* 0F 4A /qr */ { 0, BX_IA_CMOVP_GqEqR },
1582 /* 0F 4B /qr */ { 0, BX_IA_CMOVNP_GqEqR },
1583 /* 0F 4C /qr */ { 0, BX_IA_CMOVL_GqEqR },
1584 /* 0F 4D /qr */ { 0, BX_IA_CMOVNL_GqEqR },
1585 /* 0F 4E /qr */ { 0, BX_IA_CMOVLE_GqEqR },
1586 /* 0F 4F /qr */ { 0, BX_IA_CMOVNLE_GqEqR },
1587 /* 0F 50 /qr */ { BxPrefixSSE, BX_IA_MOVMSKPS_GdVRps, BxOpcodeGroupSSE_0f50 },
1588 /* 0F 51 /qr */ { BxPrefixSSE, BX_IA_SQRTPS_VpsWps, BxOpcodeGroupSSE_0f51 },
1589 /* 0F 52 /qr */ { BxPrefixSSE, BX_IA_RSQRTPS_VpsWps, BxOpcodeGroupSSE_0f52 },
1590 /* 0F 53 /qr */ { BxPrefixSSE, BX_IA_RCPPS_VpsWps, BxOpcodeGroupSSE_0f53 },
1591 /* 0F 54 /qr */ { BxPrefixSSE, BX_IA_ANDPS_VpsWps, BxOpcodeGroupSSE_0f54 },
1592 /* 0F 55 /qr */ { BxPrefixSSE, BX_IA_ANDNPS_VpsWps, BxOpcodeGroupSSE_0f55 },
1593 /* 0F 56 /qr */ { BxPrefixSSE, BX_IA_ORPS_VpsWps, BxOpcodeGroupSSE_0f56 },
1594 /* 0F 57 /qr */ { BxPrefixSSE, BX_IA_XORPS_VpsWps, BxOpcodeGroupSSE_0f57 },
1595 /* 0F 58 /qr */ { BxPrefixSSE, BX_IA_ADDPS_VpsWps, BxOpcodeGroupSSE_0f58 },
1596 /* 0F 59 /qr */ { BxPrefixSSE, BX_IA_MULPS_VpsWps, BxOpcodeGroupSSE_0f59 },
1597 /* 0F 5A /qr */ { BxPrefixSSE, BX_IA_CVTPS2PD_VpsWps, BxOpcodeGroupSSE_0f5a },
1598 /* 0F 5B /qr */ { BxPrefixSSE, BX_IA_CVTDQ2PS_VpsWdq, BxOpcodeGroupSSE_0f5b },
1599 /* 0F 5C /qr */ { BxPrefixSSE, BX_IA_SUBPS_VpsWps, BxOpcodeGroupSSE_0f5c },
1600 /* 0F 5D /qr */ { BxPrefixSSE, BX_IA_MINPS_VpsWps, BxOpcodeGroupSSE_0f5d },
1601 /* 0F 5E /qr */ { BxPrefixSSE, BX_IA_DIVPS_VpsWps, BxOpcodeGroupSSE_0f5e },
1602 /* 0F 5F /qr */ { BxPrefixSSE, BX_IA_MAXPS_VpsWps, BxOpcodeGroupSSE_0f5f },
1603 /* 0F 60 /qr */ { BxPrefixSSE, BX_IA_PUNPCKLBW_PqQd, BxOpcodeGroupSSE_0f60 },
1604 /* 0F 61 /qr */ { BxPrefixSSE, BX_IA_PUNPCKLWD_PqQd, BxOpcodeGroupSSE_0f61 },
1605 /* 0F 62 /qr */ { BxPrefixSSE, BX_IA_PUNPCKLDQ_PqQd, BxOpcodeGroupSSE_0f62 },
1606 /* 0F 63 /qr */ { BxPrefixSSE, BX_IA_PACKSSWB_PqQq, BxOpcodeGroupSSE_0f63 },
1607 /* 0F 64 /qr */ { BxPrefixSSE, BX_IA_PCMPGTB_PqQq, BxOpcodeGroupSSE_0f64 },
1608 /* 0F 65 /qr */ { BxPrefixSSE, BX_IA_PCMPGTW_PqQq, BxOpcodeGroupSSE_0f65 },
1609 /* 0F 66 /qr */ { BxPrefixSSE, BX_IA_PCMPGTD_PqQq, BxOpcodeGroupSSE_0f66 },
1610 /* 0F 67 /qr */ { BxPrefixSSE, BX_IA_PACKUSWB_PqQq, BxOpcodeGroupSSE_0f67 },
1611 /* 0F 68 /qr */ { BxPrefixSSE, BX_IA_PUNPCKHBW_PqQq, BxOpcodeGroupSSE_0f68 },
1612 /* 0F 69 /qr */ { BxPrefixSSE, BX_IA_PUNPCKHWD_PqQq, BxOpcodeGroupSSE_0f69 },
1613 /* 0F 6A /qr */ { BxPrefixSSE, BX_IA_PUNPCKHDQ_PqQq, BxOpcodeGroupSSE_0f6a },
1614 /* 0F 6B /qr */ { BxPrefixSSE, BX_IA_PACKSSDW_PqQq, BxOpcodeGroupSSE_0f6b },
1615 /* 0F 6C /qr */ { BxPrefixSSE, BX_IA_ERROR, BxOpcodeGroupSSE_0f6c },
1616 /* 0F 6D /qr */ { BxPrefixSSE, BX_IA_ERROR, BxOpcodeGroupSSE_0f6d },
1617 /* 0F 6E /qr */ { BxPrefixSSE, BX_IA_MOVQ_PqEq, BxOpcodeGroupSSE_0f6eQ },
1618 /* 0F 6F /qr */ { BxPrefixSSE, BX_IA_MOVQ_PqQq, BxOpcodeGroupSSE_0f6f },
1619 /* 0F 70 /qr */ { BxPrefixSSE | BxImmediate_Ib, BX_IA_PSHUFW_PqQqIb, BxOpcodeGroupSSE_0f70 },
1620 /* 0F 71 /qr */ { BxGroup12, BX_IA_ERROR, BxOpcodeInfoG12R },
1621 /* 0F 72 /qr */ { BxGroup13, BX_IA_ERROR, BxOpcodeInfoG13R },
1622 /* 0F 73 /qr */ { BxGroup14, BX_IA_ERROR, BxOpcodeInfoG14R },
1623 /* 0F 74 /qr */ { BxPrefixSSE, BX_IA_PCMPEQB_PqQq, BxOpcodeGroupSSE_0f74 },
1624 /* 0F 75 /qr */ { BxPrefixSSE, BX_IA_PCMPEQW_PqQq, BxOpcodeGroupSSE_0f75 },
1625 /* 0F 76 /qr */ { BxPrefixSSE, BX_IA_PCMPEQD_PqQq, BxOpcodeGroupSSE_0f76 },
1626 /* 0F 77 /qr */ { BxPrefixSSE, BX_IA_EMMS, BxOpcodeGroupSSE_ERR },
1627 /* 0F 78 /qr */ { 0, BX_IA_ERROR },
1628 /* 0F 79 /qr */ { 0, BX_IA_ERROR },
1629 /* 0F 7A /qr */ { 0, BX_IA_ERROR },
1630 /* 0F 7B /qr */ { 0, BX_IA_ERROR },
1631 /* 0F 7C /qr */ { BxPrefixSSE, BX_IA_ERROR, BxOpcodeGroupSSE_0f7c },
1632 /* 0F 7D /qr */ { BxPrefixSSE, BX_IA_ERROR, BxOpcodeGroupSSE_0f7d },
1633 /* 0F 7E /qr */ { BxPrefixSSE, BX_IA_MOVQ_EqPq, BxOpcodeGroupSSE_0f7eQ },
1634 /* 0F 7F /qr */ { BxPrefixSSE, BX_IA_MOVQ_QqPq, BxOpcodeGroupSSE_0f7f },
1635 /* 0F 80 /qr */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JO_Jq },
1636 /* 0F 81 /qr */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JNO_Jq },
1637 /* 0F 82 /qr */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JB_Jq },
1638 /* 0F 83 /qr */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JNB_Jq },
1639 /* 0F 84 /qr */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JZ_Jq },
1640 /* 0F 85 /qr */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JNZ_Jq },
1641 /* 0F 86 /qr */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JBE_Jq },
1642 /* 0F 87 /qr */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JNBE_Jq },
1643 /* 0F 88 /qr */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JS_Jq },
1644 /* 0F 89 /qr */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JNS_Jq },
1645 /* 0F 8A /qr */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JP_Jq },
1646 /* 0F 8B /qr */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JNP_Jq },
1647 /* 0F 8C /qr */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JL_Jq },
1648 /* 0F 8D /qr */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JNL_Jq },
1649 /* 0F 8E /qr */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JLE_Jq },
1650 /* 0F 8F /qr */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JNLE_Jq },
1651 /* 0F 90 /qr */ { 0, BX_IA_SETO_EbR },
1652 /* 0F 91 /qr */ { 0, BX_IA_SETNO_EbR },
1653 /* 0F 92 /qr */ { 0, BX_IA_SETB_EbR },
1654 /* 0F 93 /qr */ { 0, BX_IA_SETNB_EbR },
1655 /* 0F 94 /qr */ { 0, BX_IA_SETZ_EbR },
1656 /* 0F 95 /qr */ { 0, BX_IA_SETNZ_EbR },
1657 /* 0F 96 /qr */ { 0, BX_IA_SETBE_EbR },
1658 /* 0F 97 /qr */ { 0, BX_IA_SETNBE_EbR },
1659 /* 0F 98 /qr */ { 0, BX_IA_SETS_EbR },
1660 /* 0F 99 /qr */ { 0, BX_IA_SETNS_EbR },
1661 /* 0F 9A /qr */ { 0, BX_IA_SETP_EbR },
1662 /* 0F 9B /qr */ { 0, BX_IA_SETNP_EbR },
1663 /* 0F 9C /qr */ { 0, BX_IA_SETL_EbR },
1664 /* 0F 9D /qr */ { 0, BX_IA_SETNL_EbR },
1665 /* 0F 9E /qr */ { 0, BX_IA_SETLE_EbR },
1666 /* 0F 9F /qr */ { 0, BX_IA_SETNLE_EbR },
1667 /* 0F A0 /qr */ { 0, BX_IA_PUSH64_FS },
1668 /* 0F A1 /qr */ { 0, BX_IA_POP64_FS },
1669 /* 0F A2 /qr */ { 0, BX_IA_CPUID },
1670 /* 0F A3 /qr */ { 0, BX_IA_BT_EqGqR },
1671 /* 0F A4 /qr */ { BxImmediate_Ib, BX_IA_SHLD_EqGqR },
1672 /* 0F A5 /qr */ { 0, BX_IA_SHLD_EqGqR },
1673 /* 0F A6 /qr */ { 0, BX_IA_ERROR },
1674 /* 0F A7 /qr */ { 0, BX_IA_ERROR },
1675 /* 0F A8 /qr */ { 0, BX_IA_PUSH64_GS },
1676 /* 0F A9 /qr */ { 0, BX_IA_POP64_GS },
1677 /* 0F AA /qr */ { BxTraceEnd, BX_IA_RSM },
1678 /* 0F AB /qr */ { 0, BX_IA_BTS_EqGqR },
1679 /* 0F AC /qr */ { BxImmediate_Ib, BX_IA_SHRD_EqGqR },
1680 /* 0F AD /qr */ { 0, BX_IA_SHRD_EqGqR },
1681 /* 0F AE /qr */ { BxGroup15, BX_IA_ERROR, BxOpcodeInfoG15R },
1682 /* 0F AF /qr */ { 0, BX_IA_IMUL_GqEqR },
1683 /* 0F B0 /qr */ { 0, BX_IA_CMPXCHG_EbGbR },
1684 /* 0F B1 /qr */ { 0, BX_IA_CMPXCHG_EqGqR },
1685 /* 0F B2 /qr */ { 0, BX_IA_ERROR }, // LSS
1686 /* 0F B3 /qr */ { 0, BX_IA_BTR_EqGqR },
1687 /* 0F B4 /qr */ { 0, BX_IA_ERROR }, // LFS
1688 /* 0F B5 /qr */ { 0, BX_IA_ERROR }, // LGS
1689 /* 0F B6 /qr */ { 0, BX_IA_MOVZX_GqEbR },
1690 /* 0F B7 /qr */ { 0, BX_IA_MOVZX_GqEwR },
1691 /* 0F B8 /qr */ { BxPrefixSSE, BX_IA_ERROR, BxOpcodeGroupSSE_0fb8qR },
1692 /* 0F B9 /qr */ { BxTraceEnd, BX_IA_UD2B },
1693 /* 0F BA /qr */ { BxGroup8, BX_IA_ERROR, BxOpcodeInfo64G8EqIbR },
1694 /* 0F BB /qr */ { 0, BX_IA_BTC_EqGqR },
1695 /* 0F BC /qr */ { 0, BX_IA_BSF_GqEqR },
1696 /* 0F BD /qr */ { 0, BX_IA_BSR_GqEqR },
1697 /* 0F BE /qr */ { 0, BX_IA_MOVSX_GqEbR },
1698 /* 0F BF /qr */ { 0, BX_IA_MOVSX_GqEwR },
1699 /* 0F C0 /qr */ { 0, BX_IA_XADD_EbGbR },
1700 /* 0F C1 /qr */ { 0, BX_IA_XADD_EqGqR },
1701 /* 0F C2 /qr */ { BxPrefixSSE | BxImmediate_Ib, BX_IA_CMPPS_VpsWpsIb, BxOpcodeGroupSSE_0fc2 },
1702 /* 0F C3 /qr */ { 0, BX_IA_ERROR }, // MOVNTI SSE group
1703 /* 0F C4 /qr */ { BxPrefixSSE | BxImmediate_Ib, BX_IA_PINSRW_PqEwIb, BxOpcodeGroupSSE_0fc4 },
1704 /* 0F C5 /qr */ { BxPrefixSSE | BxImmediate_Ib, BX_IA_PEXTRW_GdPqIb, BxOpcodeGroupSSE_0fc5R },
1705 /* 0F C6 /qr */ { BxPrefixSSE | BxImmediate_Ib, BX_IA_SHUFPS_VpsWpsIb, BxOpcodeGroupSSE_0fc6 },
1706 /* 0F C7 /qr */ { 0, BX_IA_ERROR }, // CMPXCHG16B G9 group
1707 /* 0F C8 /qr */ { 0, BX_IA_BSWAP_RRX },
1708 /* 0F C9 /qr */ { 0, BX_IA_BSWAP_RRX },
1709 /* 0F CA /qr */ { 0, BX_IA_BSWAP_RRX },
1710 /* 0F CB /qr */ { 0, BX_IA_BSWAP_RRX },
1711 /* 0F CC /qr */ { 0, BX_IA_BSWAP_RRX },
1712 /* 0F CD /qr */ { 0, BX_IA_BSWAP_RRX },
1713 /* 0F CE /qr */ { 0, BX_IA_BSWAP_RRX },
1714 /* 0F CF /qr */ { 0, BX_IA_BSWAP_RRX },
1715 /* 0F D0 /qr */ { BxPrefixSSE, BX_IA_ERROR, BxOpcodeGroupSSE_0fd0 },
1716 /* 0F D1 /qr */ { BxPrefixSSE, BX_IA_PSRLW_PqQq, BxOpcodeGroupSSE_0fd1 },
1717 /* 0F D2 /qr */ { BxPrefixSSE, BX_IA_PSRLD_PqQq, BxOpcodeGroupSSE_0fd2 },
1718 /* 0F D3 /qr */ { BxPrefixSSE, BX_IA_PSRLQ_PqQq, BxOpcodeGroupSSE_0fd3 },
1719 /* 0F D4 /qr */ { BxPrefixSSE, BX_IA_PADDQ_PqQq, BxOpcodeGroupSSE_0fd4 },
1720 /* 0F D5 /qr */ { BxPrefixSSE, BX_IA_PMULLW_PqQq, BxOpcodeGroupSSE_0fd5 },
1721 /* 0F D6 /qr */ { BxPrefixSSE, BX_IA_ERROR, BxOpcodeGroupSSE_0fd6 },
1722 /* 0F D7 /qr */ { BxPrefixSSE, BX_IA_PMOVMSKB_GdPRq, BxOpcodeGroupSSE_0fd7 },
1723 /* 0F D8 /qr */ { BxPrefixSSE, BX_IA_PSUBUSB_PqQq, BxOpcodeGroupSSE_0fd8 },
1724 /* 0F D9 /qr */ { BxPrefixSSE, BX_IA_PSUBUSW_PqQq, BxOpcodeGroupSSE_0fd9 },
1725 /* 0F DA /qr */ { BxPrefixSSE, BX_IA_PMINUB_PqQq, BxOpcodeGroupSSE_0fda },
1726 /* 0F DB /qr */ { BxPrefixSSE, BX_IA_PAND_PqQq, BxOpcodeGroupSSE_0fdb },
1727 /* 0F DC /qr */ { BxPrefixSSE, BX_IA_PADDUSB_PqQq, BxOpcodeGroupSSE_0fdc },
1728 /* 0F DD /qr */ { BxPrefixSSE, BX_IA_PADDUSW_PqQq, BxOpcodeGroupSSE_0fdd },
1729 /* 0F DE /qr */ { BxPrefixSSE, BX_IA_PMAXUB_PqQq, BxOpcodeGroupSSE_0fde },
1730 /* 0F DF /qr */ { BxPrefixSSE, BX_IA_PANDN_PqQq, BxOpcodeGroupSSE_0fdf },
1731 /* 0F E0 /qr */ { BxPrefixSSE, BX_IA_PAVGB_PqQq, BxOpcodeGroupSSE_0fe0 },
1732 /* 0F E1 /qr */ { BxPrefixSSE, BX_IA_PSRAW_PqQq, BxOpcodeGroupSSE_0fe1 },
1733 /* 0F E2 /qr */ { BxPrefixSSE, BX_IA_PSRAD_PqQq, BxOpcodeGroupSSE_0fe2 },
1734 /* 0F E3 /qr */ { BxPrefixSSE, BX_IA_PAVGW_PqQq, BxOpcodeGroupSSE_0fe3 },
1735 /* 0F E4 /qr */ { BxPrefixSSE, BX_IA_PMULHUW_PqQq, BxOpcodeGroupSSE_0fe4 },
1736 /* 0F E5 /qr */ { BxPrefixSSE, BX_IA_PMULHW_PqQq, BxOpcodeGroupSSE_0fe5 },
1737 /* 0F E6 /qr */ { BxPrefixSSE, BX_IA_ERROR, BxOpcodeGroupSSE_0fe6 },
1738 /* 0F E7 /qr */ { 0, BX_IA_ERROR }, // MOVNTQ/MOVNTDQ SSE group
1739 /* 0F E8 /qr */ { BxPrefixSSE, BX_IA_PSUBSB_PqQq, BxOpcodeGroupSSE_0fe8 },
1740 /* 0F E9 /qr */ { BxPrefixSSE, BX_IA_PSUBSW_PqQq, BxOpcodeGroupSSE_0fe9 },
1741 /* 0F EA /qr */ { BxPrefixSSE, BX_IA_PMINSW_PqQq, BxOpcodeGroupSSE_0fea },
1742 /* 0F EB /qr */ { BxPrefixSSE, BX_IA_POR_PqQq, BxOpcodeGroupSSE_0feb },
1743 /* 0F EC /qr */ { BxPrefixSSE, BX_IA_PADDSB_PqQq, BxOpcodeGroupSSE_0fec },
1744 /* 0F ED /qr */ { BxPrefixSSE, BX_IA_PADDSW_PqQq, BxOpcodeGroupSSE_0fed },
1745 /* 0F EE /qr */ { BxPrefixSSE, BX_IA_PMAXSW_PqQq, BxOpcodeGroupSSE_0fee },
1746 /* 0F EF /qr */ { BxPrefixSSE, BX_IA_PXOR_PqQq, BxOpcodeGroupSSE_0fef },
1747 /* 0F F0 /qr */ { 0, BX_IA_ERROR }, // LDDQU SSE group
1748 /* 0F F1 /qr */ { BxPrefixSSE, BX_IA_PSLLW_PqQq, BxOpcodeGroupSSE_0ff1 },
1749 /* 0F F2 /qr */ { BxPrefixSSE, BX_IA_PSLLD_PqQq, BxOpcodeGroupSSE_0ff2 },
1750 /* 0F F3 /qr */ { BxPrefixSSE, BX_IA_PSLLQ_PqQq, BxOpcodeGroupSSE_0ff3 },
1751 /* 0F F4 /qr */ { BxPrefixSSE, BX_IA_PMULUDQ_PqQq, BxOpcodeGroupSSE_0ff4 },
1752 /* 0F F5 /qr */ { BxPrefixSSE, BX_IA_PMADDWD_PqQq, BxOpcodeGroupSSE_0ff5 },
1753 /* 0F F6 /qr */ { BxPrefixSSE, BX_IA_PSADBW_PqQq, BxOpcodeGroupSSE_0ff6 },
1754 /* 0F F7 /qr */ { BxPrefixSSE, BX_IA_MASKMOVQ_PqPRq, BxOpcodeGroupSSE_0ff7R },
1755 /* 0F F8 /qr */ { BxPrefixSSE, BX_IA_PSUBB_PqQq, BxOpcodeGroupSSE_0ff8 },
1756 /* 0F F9 /qr */ { BxPrefixSSE, BX_IA_PSUBW_PqQq, BxOpcodeGroupSSE_0ff9 },
1757 /* 0F FA /qr */ { BxPrefixSSE, BX_IA_PSUBD_PqQq, BxOpcodeGroupSSE_0ffa },
1758 /* 0F FB /qr */ { BxPrefixSSE, BX_IA_PSUBQ_PqQq, BxOpcodeGroupSSE_0ffb },
1759 /* 0F FC /qr */ { BxPrefixSSE, BX_IA_PADDB_PqQq, BxOpcodeGroupSSE_0ffc },
1760 /* 0F FD /qr */ { BxPrefixSSE, BX_IA_PADDW_PqQq, BxOpcodeGroupSSE_0ffd },
1761 /* 0F FE /qr */ { BxPrefixSSE, BX_IA_PADDD_PqQq, BxOpcodeGroupSSE_0ffe },
1762 /* 0F FF /qr */ { 0, BX_IA_ERROR }
1765 // 512 entries for 16bit operand size
1766 // 512 entries for 32bit operand size
1767 // 512 entries for 64bit operand size
1769 static const BxOpcodeInfo_t BxOpcodeInfo64M[512*3] = {
1770 // 512 entries for 16bit operand size
1771 /* 00 /wm */ { BxLockable, BX_IA_ADD_EbGbM },
1772 /* 01 /wm */ { BxLockable, BX_IA_ADD_EwGwM },
1773 /* 02 /wm */ { 0, BX_IA_ADD_GbEbM },
1774 /* 03 /wm */ { 0, BX_IA_ADD_GwEwM },
1775 /* 04 /wm */ { BxImmediate_Ib, BX_IA_ADD_ALIb },
1776 /* 05 /wm */ { BxImmediate_Iw, BX_IA_ADD_AXIw },
1777 /* 06 /wm */ { 0, BX_IA_ERROR },
1778 /* 07 /wm */ { 0, BX_IA_ERROR },
1779 /* 08 /wm */ { BxLockable, BX_IA_OR_EbGbM },
1780 /* 09 /wm */ { BxLockable, BX_IA_OR_EwGwM },
1781 /* 0A /wm */ { 0, BX_IA_OR_GbEbM },
1782 /* 0B /wm */ { 0, BX_IA_OR_GwEwM },
1783 /* 0C /wm */ { BxImmediate_Ib, BX_IA_OR_ALIb },
1784 /* 0D /wm */ { BxImmediate_Iw, BX_IA_OR_AXIw },
1785 /* 0E /wm */ { 0, BX_IA_ERROR },
1786 /* 0F /wm */ { 0, BX_IA_ERROR }, // 2-byte escape
1787 /* 10 /wm */ { BxLockable, BX_IA_ADC_EbGbM },
1788 /* 11 /wm */ { BxLockable, BX_IA_ADC_EwGwM },
1789 /* 12 /wm */ { 0, BX_IA_ADC_GbEbM },
1790 /* 13 /wm */ { 0, BX_IA_ADC_GwEwM },
1791 /* 14 /wm */ { BxImmediate_Ib, BX_IA_ADC_ALIb },
1792 /* 15 /wm */ { BxImmediate_Iw, BX_IA_ADC_AXIw },
1793 /* 16 /wm */ { 0, BX_IA_ERROR },
1794 /* 17 /wm */ { 0, BX_IA_ERROR },
1795 /* 18 /wm */ { BxLockable, BX_IA_SBB_EbGbM },
1796 /* 19 /wm */ { BxLockable, BX_IA_SBB_EwGwM },
1797 /* 1A /wm */ { 0, BX_IA_SBB_GbEbM },
1798 /* 1B /wm */ { 0, BX_IA_SBB_GwEwM },
1799 /* 1C /wm */ { BxImmediate_Ib, BX_IA_SBB_ALIb },
1800 /* 1D /wm */ { BxImmediate_Iw, BX_IA_SBB_AXIw },
1801 /* 1E /wm */ { 0, BX_IA_ERROR },
1802 /* 1F /wm */ { 0, BX_IA_ERROR },
1803 /* 20 /wm */ { BxLockable, BX_IA_AND_EbGbM },
1804 /* 21 /wm */ { BxLockable, BX_IA_AND_EwGwM },
1805 /* 22 /wm */ { 0, BX_IA_AND_GbEbM },
1806 /* 23 /wm */ { 0, BX_IA_AND_GwEwM },
1807 /* 24 /wm */ { BxImmediate_Ib, BX_IA_AND_ALIb },
1808 /* 25 /wm */ { BxImmediate_Iw, BX_IA_AND_AXIw },
1809 /* 26 /wm */ { 0, BX_IA_ERROR }, // ES:
1810 /* 27 /wm */ { 0, BX_IA_ERROR },
1811 /* 28 /wm */ { BxLockable, BX_IA_SUB_EbGbM },
1812 /* 29 /wm */ { BxLockable, BX_IA_SUB_EwGwM },
1813 /* 2A /wm */ { 0, BX_IA_SUB_GbEbM },
1814 /* 2B /wm */ { 0, BX_IA_SUB_GwEwM },
1815 /* 2C /wm */ { BxImmediate_Ib, BX_IA_SUB_ALIb },
1816 /* 2D /wm */ { BxImmediate_Iw, BX_IA_SUB_AXIw },
1817 /* 2E /wm */ { 0, BX_IA_ERROR }, // CS:
1818 /* 2F /wm */ { 0, BX_IA_ERROR },
1819 /* 30 /wm */ { BxLockable, BX_IA_XOR_EbGbM },
1820 /* 31 /wm */ { BxLockable, BX_IA_XOR_EwGwM },
1821 /* 32 /wm */ { 0, BX_IA_XOR_GbEbM },
1822 /* 33 /wm */ { 0, BX_IA_XOR_GwEwM },
1823 /* 34 /wm */ { BxImmediate_Ib, BX_IA_XOR_ALIb },
1824 /* 35 /wm */ { BxImmediate_Iw, BX_IA_XOR_AXIw },
1825 /* 36 /wm */ { 0, BX_IA_ERROR }, // SS:
1826 /* 37 /wm */ { 0, BX_IA_ERROR },
1827 /* 38 /wm */ { 0, BX_IA_CMP_EbGbM },
1828 /* 39 /wm */ { 0, BX_IA_CMP_EwGwM },
1829 /* 3A /wm */ { 0, BX_IA_CMP_GbEbM },
1830 /* 3B /wm */ { 0, BX_IA_CMP_GwEwM },
1831 /* 3C /wm */ { BxImmediate_Ib, BX_IA_CMP_ALIb },
1832 /* 3D /wm */ { BxImmediate_Iw, BX_IA_CMP_AXIw },
1833 /* 3E /wm */ { 0, BX_IA_ERROR }, // DS:
1834 /* 3F /wm */ { 0, BX_IA_ERROR },
1835 /* 40 /wm */ { 0, BX_IA_ERROR }, // REX:
1836 /* 41 /wm */ { 0, BX_IA_ERROR }, // REX:
1837 /* 42 /wm */ { 0, BX_IA_ERROR }, // REX:
1838 /* 43 /wm */ { 0, BX_IA_ERROR }, // REX:
1839 /* 44 /wm */ { 0, BX_IA_ERROR }, // REX:
1840 /* 45 /wm */ { 0, BX_IA_ERROR }, // REX:
1841 /* 46 /wm */ { 0, BX_IA_ERROR }, // REX:
1842 /* 47 /wm */ { 0, BX_IA_ERROR }, // REX:
1843 /* 48 /wm */ { 0, BX_IA_ERROR }, // REX:
1844 /* 49 /wm */ { 0, BX_IA_ERROR }, // REX:
1845 /* 4A /wm */ { 0, BX_IA_ERROR }, // REX:
1846 /* 4B /wm */ { 0, BX_IA_ERROR }, // REX:
1847 /* 4C /wm */ { 0, BX_IA_ERROR }, // REX:
1848 /* 4D /wm */ { 0, BX_IA_ERROR }, // REX:
1849 /* 4E /wm */ { 0, BX_IA_ERROR }, // REX:
1850 /* 4F /wm */ { 0, BX_IA_ERROR }, // REX:
1851 /* 50 /wm */ { 0, BX_IA_PUSH_RX },
1852 /* 51 /wm */ { 0, BX_IA_PUSH_RX },
1853 /* 52 /wm */ { 0, BX_IA_PUSH_RX },
1854 /* 53 /wm */ { 0, BX_IA_PUSH_RX },
1855 /* 54 /wm */ { 0, BX_IA_PUSH_RX },
1856 /* 55 /wm */ { 0, BX_IA_PUSH_RX },
1857 /* 56 /wm */ { 0, BX_IA_PUSH_RX },
1858 /* 57 /wm */ { 0, BX_IA_PUSH_RX },
1859 /* 58 /wm */ { 0, BX_IA_POP_RX },
1860 /* 59 /wm */ { 0, BX_IA_POP_RX },
1861 /* 5A /wm */ { 0, BX_IA_POP_RX },
1862 /* 5B /wm */ { 0, BX_IA_POP_RX },
1863 /* 5C /wm */ { 0, BX_IA_POP_RX },
1864 /* 5D /wm */ { 0, BX_IA_POP_RX },
1865 /* 5E /wm */ { 0, BX_IA_POP_RX },
1866 /* 5F /wm */ { 0, BX_IA_POP_RX },
1867 /* 60 /wm */ { 0, BX_IA_ERROR },
1868 /* 61 /wm */ { 0, BX_IA_ERROR },
1869 /* 62 /wm */ { 0, BX_IA_ERROR },
1870 /* 63 /wm */ { 0, BX_IA_MOV_GwEwM }, // MOVSX_GwEw
1871 /* 64 /wm */ { 0, BX_IA_ERROR }, // FS:
1872 /* 65 /wm */ { 0, BX_IA_ERROR }, // GS:
1873 /* 66 /wm */ { 0, BX_IA_ERROR }, // OS:
1874 /* 67 /wm */ { 0, BX_IA_ERROR }, // AS:
1875 /* 68 /wm */ { BxImmediate_Iw, BX_IA_PUSH_Iw },
1876 /* 69 /wm */ { BxImmediate_Iw, BX_IA_IMUL_GwEwIwM },
1877 /* 6A /wm */ { BxImmediate_Ib_SE, BX_IA_PUSH_Iw },
1878 /* 6B /wm */ { BxImmediate_Ib_SE, BX_IA_IMUL_GwEwIwM },
1879 /* 6C /wm */ { 0, BX_IA_REP_INSB_YbDX },
1880 /* 6D /wm */ { 0, BX_IA_REP_INSW_YwDX },
1881 /* 6E /wm */ { 0, BX_IA_REP_OUTSB_DXXb },
1882 /* 6F /wm */ { 0, BX_IA_REP_OUTSW_DXXw },
1883 /* 70 /wm */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JO_Jq },
1884 /* 71 /wm */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JNO_Jq },
1885 /* 72 /wm */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JB_Jq },
1886 /* 73 /wm */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JNB_Jq },
1887 /* 74 /wm */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JZ_Jq },
1888 /* 75 /wm */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JNZ_Jq },
1889 /* 76 /wm */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JBE_Jq },
1890 /* 77 /wm */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JNBE_Jq },
1891 /* 78 /wm */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JS_Jq },
1892 /* 79 /wm */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JNS_Jq },
1893 /* 7A /wm */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JP_Jq },
1894 /* 7B /wm */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JNP_Jq },
1895 /* 7C /wm */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JL_Jq },
1896 /* 7D /wm */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JNL_Jq },
1897 /* 7E /wm */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JLE_Jq },
1898 /* 7F /wm */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JNLE_Jq },
1899 /* 80 /wm */ { BxGroup1 | BxImmediate_Ib, BX_IA_ERROR, BxOpcodeInfoG1EbIbM },
1900 /* 81 /wm */ { BxGroup1 | BxImmediate_Iw, BX_IA_ERROR, BxOpcodeInfoG1EwM },
1901 /* 82 /wm */ { 0, BX_IA_ERROR },
1902 /* 83 /wm */ { BxGroup1 | BxImmediate_Ib_SE, BX_IA_ERROR, BxOpcodeInfoG1EwM },
1903 /* 84 /wm */ { 0, BX_IA_TEST_EbGbM },
1904 /* 85 /wm */ { 0, BX_IA_TEST_EwGwM },
1905 /* 86 /wm */ { BxLockable, BX_IA_XCHG_EbGbM },
1906 /* 87 /wm */ { BxLockable, BX_IA_XCHG_EwGwM },
1907 /* 88 /wm */ { 0, BX_IA_MOV_EbGbM },
1908 /* 89 /wm */ { 0, BX_IA_MOV_EwGwM },
1909 /* 8A /wm */ { 0, BX_IA_MOV_GbEbM },
1910 /* 8B /wm */ { 0, BX_IA_MOV_GwEwM },
1911 /* 8C /wm */ { 0, BX_IA_MOV_EwSwM },
1912 /* 8D /wm */ { 0, BX_IA_LEA_GwM },
1913 /* 8E /wm */ { 0, BX_IA_MOV_SwEw },
1914 /* 8F /wm */ { BxGroup1A, BX_IA_ERROR, BxOpcodeInfoG1AEwM },
1915 /* 90 /wm */ { 0, BX_IA_XCHG_RXAX }, // handles XCHG R8w, AX
1916 /* 91 /wm */ { 0, BX_IA_XCHG_RXAX },
1917 /* 92 /wm */ { 0, BX_IA_XCHG_RXAX },
1918 /* 93 /wm */ { 0, BX_IA_XCHG_RXAX },
1919 /* 94 /wm */ { 0, BX_IA_XCHG_RXAX },
1920 /* 95 /wm */ { 0, BX_IA_XCHG_RXAX },
1921 /* 96 /wm */ { 0, BX_IA_XCHG_RXAX },
1922 /* 97 /wm */ { 0, BX_IA_XCHG_RXAX },
1923 /* 98 /wm */ { 0, BX_IA_CBW },
1924 /* 99 /wm */ { 0, BX_IA_CWD },
1925 /* 9A /wm */ { 0, BX_IA_ERROR },
1926 /* 9B /wm */ { 0, BX_IA_FWAIT },
1927 /* 9C /wm */ { 0, BX_IA_PUSHF_Fw },
1928 /* 9D /wm */ { 0, BX_IA_POPF_Fw },
1929 /* 9E /wm */ { 0, BX_IA_SAHF },
1930 /* 9F /wm */ { 0, BX_IA_LAHF },
1931 /* A0 /wm */ { BxImmediate_O, BX_IA_MOV_ALOq },
1932 /* A1 /wm */ { BxImmediate_O, BX_IA_MOV_AXOq },
1933 /* A2 /wm */ { BxImmediate_O, BX_IA_MOV_OqAL },
1934 /* A3 /wm */ { BxImmediate_O, BX_IA_MOV_OqAX },
1935 /* A4 /wm */ { 0, BX_IA_REP_MOVSB_XbYb },
1936 /* A5 /wm */ { 0, BX_IA_REP_MOVSW_XwYw },
1937 /* A6 /wm */ { 0, BX_IA_REP_CMPSB_XbYb },
1938 /* A7 /wm */ { 0, BX_IA_REP_CMPSW_XwYw },
1939 /* A8 /wm */ { BxImmediate_Ib, BX_IA_TEST_ALIb },
1940 /* A9 /wm */ { BxImmediate_Iw, BX_IA_TEST_AXIw },
1941 /* AA /wm */ { 0, BX_IA_REP_STOSB_YbAL },
1942 /* AB /wm */ { 0, BX_IA_REP_STOSW_YwAX },
1943 /* AC /wm */ { 0, BX_IA_REP_LODSB_ALXb },
1944 /* AD /wm */ { 0, BX_IA_REP_LODSW_AXXw },
1945 /* AE /wm */ { 0, BX_IA_REP_SCASB_ALXb },
1946 /* AF /wm */ { 0, BX_IA_REP_SCASW_AXXw },
1947 /* B0 /wm */ { BxImmediate_Ib, BX_IA_MOV_RLIb },
1948 /* B1 /wm */ { BxImmediate_Ib, BX_IA_MOV_RLIb },
1949 /* B2 /wm */ { BxImmediate_Ib, BX_IA_MOV_RLIb },
1950 /* B3 /wm */ { BxImmediate_Ib, BX_IA_MOV_RLIb },
1951 /* B4 /wm */ { BxImmediate_Ib, BX_IA_MOV_RLIb },
1952 /* B5 /wm */ { BxImmediate_Ib, BX_IA_MOV_RLIb },
1953 /* B6 /wm */ { BxImmediate_Ib, BX_IA_MOV_RLIb },
1954 /* B7 /wm */ { BxImmediate_Ib, BX_IA_MOV_RLIb },
1955 /* B8 /wm */ { BxImmediate_Iw, BX_IA_MOV_RXIw },
1956 /* B9 /wm */ { BxImmediate_Iw, BX_IA_MOV_RXIw },
1957 /* BA /wm */ { BxImmediate_Iw, BX_IA_MOV_RXIw },
1958 /* BB /wm */ { BxImmediate_Iw, BX_IA_MOV_RXIw },
1959 /* BC /wm */ { BxImmediate_Iw, BX_IA_MOV_RXIw },
1960 /* BD /wm */ { BxImmediate_Iw, BX_IA_MOV_RXIw },
1961 /* BE /wm */ { BxImmediate_Iw, BX_IA_MOV_RXIw },
1962 /* BF /wm */ { BxImmediate_Iw, BX_IA_MOV_RXIw },
1963 /* C0 /wm */ { BxGroup2 | BxImmediate_Ib, BX_IA_ERROR, BxOpcodeInfoG2Eb },
1964 /* C1 /wm */ { BxGroup2 | BxImmediate_Ib, BX_IA_ERROR, BxOpcodeInfoG2Ew },
1965 /* C2 /wm */ { BxImmediate_Iw | BxTraceEnd, BX_IA_RETnear64_Iw },
1966 /* C3 /wm */ { BxTraceEnd, BX_IA_RETnear64 },
1967 /* C4 /wm */ { 0, BX_IA_ERROR },
1968 /* C5 /wm */ { 0, BX_IA_ERROR },
1969 /* C6 /wm */ { BxGroup11, BX_IA_ERROR, BxOpcodeInfoG11EbM },
1970 /* C7 /wm */ { BxGroup11, BX_IA_ERROR, BxOpcodeInfoG11EwM },
1971 /* C8 /wm */ { BxImmediate_IwIb, BX_IA_ENTER16_IwIb },
1972 /* C9 /wm */ { 0, BX_IA_LEAVE64 },
1973 /* CA /wm */ { BxImmediate_Iw | BxTraceEnd, BX_IA_RETfar16_Iw },
1974 /* CB /wm */ { BxTraceEnd, BX_IA_RETfar16 },
1975 /* CC /wm */ { BxTraceEnd, BX_IA_INT3 },
1976 /* CD /wm */ { BxImmediate_Ib | BxTraceEnd, BX_IA_INT_Ib },
1977 /* CE /wm */ { 0, BX_IA_ERROR },
1978 /* CF /wm */ { BxTraceEnd, BX_IA_IRET64 },
1979 /* D0 /wm */ { BxGroup2 | BxImmediate_I1, BX_IA_ERROR, BxOpcodeInfoG2Eb },
1980 /* D1 /wm */ { BxGroup2 | BxImmediate_I1, BX_IA_ERROR, BxOpcodeInfoG2Ew },
1981 /* D2 /wm */ { BxGroup2, BX_IA_ERROR, BxOpcodeInfoG2Eb },
1982 /* D3 /wm */ { BxGroup2, BX_IA_ERROR, BxOpcodeInfoG2Ew },
1983 /* D4 /wm */ { 0, BX_IA_ERROR },
1984 /* D5 /wm */ { 0, BX_IA_ERROR },
1985 /* D6 /wm */ { 0, BX_IA_ERROR },
1986 /* D7 /wm */ { 0, BX_IA_XLAT },
1987 /* D8 /wm */ { BxGroupFP, BX_IA_ERROR, BxOpcodeInfo_FPGroupD8 },
1988 /* D9 /wm */ { BxGroupFP, BX_IA_ERROR, BxOpcodeInfo_FPGroupD9 },
1989 /* DA /wm */ { BxGroupFP, BX_IA_ERROR, BxOpcodeInfo_FPGroupDA },
1990 /* DB /wm */ { BxGroupFP, BX_IA_ERROR, BxOpcodeInfo_FPGroupDB },
1991 /* DC /wm */ { BxGroupFP, BX_IA_ERROR, BxOpcodeInfo_FPGroupDC },
1992 /* DD /wm */ { BxGroupFP, BX_IA_ERROR, BxOpcodeInfo_FPGroupDD },
1993 /* DE /wm */ { BxGroupFP, BX_IA_ERROR, BxOpcodeInfo_FPGroupDE },
1994 /* DF /wm */ { BxGroupFP, BX_IA_ERROR, BxOpcodeInfo_FPGroupDF },
1995 /* E0 /wm */ { BxImmediate_BrOff8 | BxTraceEnd, BX_IA_LOOPNE64_Jb },
1996 /* E1 /wm */ { BxImmediate_BrOff8 | BxTraceEnd, BX_IA_LOOPE64_Jb },
1997 /* E2 /wm */ { BxImmediate_BrOff8 | BxTraceEnd, BX_IA_LOOP64_Jb },
1998 /* E3 /wm */ { BxImmediate_BrOff8 | BxTraceEnd, BX_IA_JRCXZ_Jb },
1999 /* E4 /wm */ { BxImmediate_Ib, BX_IA_IN_ALIb },
2000 /* E5 /wm */ { BxImmediate_Ib, BX_IA_IN_AXIb },
2001 /* E6 /wm */ { BxImmediate_Ib, BX_IA_OUT_IbAL },
2002 /* E7 /wm */ { BxImmediate_Ib, BX_IA_OUT_IbAX },
2003 /* E8 /wm */ { BxImmediate_BrOff32 | BxTraceEnd, BX_IA_CALL_Jq },
2004 /* E9 /wm */ { BxImmediate_BrOff32 | BxTraceEnd, BX_IA_JMP_Jq },
2005 /* EA /wm */ { 0, BX_IA_ERROR },
2006 /* EB /wm */ { BxImmediate_BrOff8 | BxTraceEnd, BX_IA_JMP_Jq },
2007 /* EC /wm */ { 0, BX_IA_IN_ALDX },
2008 /* ED /wm */ { 0, BX_IA_IN_AXDX },
2009 /* EE /wm */ { 0, BX_IA_OUT_DXAL },
2010 /* EF /wm */ { 0, BX_IA_OUT_DXAX },
2011 /* F0 /wm */ { 0, BX_IA_ERROR }, // LOCK
2012 /* F1 /wm */ { BxTraceEnd, BX_IA_INT1 },
2013 /* F2 /wm */ { 0, BX_IA_ERROR }, // REPNE/REPNZ
2014 /* F3 /wm */ { 0, BX_IA_ERROR }, // REP, REPE/REPZ
2015 /* F4 /wm */ { BxTraceEnd, BX_IA_HLT },
2016 /* F5 /wm */ { 0, BX_IA_CMC },
2017 /* F6 /wm */ { BxGroup3, BX_IA_ERROR, BxOpcodeInfoG3EbM },
2018 /* F7 /wm */ { BxGroup3, BX_IA_ERROR, BxOpcodeInfoG3EwM },
2019 /* F8 /wm */ { 0, BX_IA_CLC },
2020 /* F9 /wm */ { 0, BX_IA_STC },
2021 /* FA /wm */ { 0, BX_IA_CLI },
2022 /* FB /wm */ { 0, BX_IA_STI },
2023 /* FC /wm */ { 0, BX_IA_CLD },
2024 /* FD /wm */ { 0, BX_IA_STD },
2025 /* FE /wm */ { BxGroup4, BX_IA_ERROR, BxOpcodeInfoG4M },
2026 /* FF /wm */ { BxGroup5, BX_IA_ERROR, BxOpcodeInfo64G5wM },
2028 /* 0F 00 /wm */ { BxGroup6, BX_IA_ERROR, BxOpcodeInfoG6 },
2029 /* 0F 01 /wm */ { BxGroup7, BX_IA_ERROR, BxOpcodeInfo64G7M },
2030 /* 0F 02 /wm */ { 0, BX_IA_LAR_GvEw },
2031 /* 0F 03 /wm */ { 0, BX_IA_LSL_GvEw },
2032 /* 0F 04 /wm */ { 0, BX_IA_ERROR },
2033 /* 0F 05 /wm */ { BxTraceEnd, BX_IA_SYSCALL },
2034 /* 0F 06 /wm */ { 0, BX_IA_CLTS },
2035 /* 0F 07 /wm */ { BxTraceEnd, BX_IA_SYSRET },
2036 /* 0F 08 /wm */ { BxTraceEnd, BX_IA_INVD },
2037 /* 0F 09 /wm */ { BxTraceEnd, BX_IA_WBINVD },
2038 /* 0F 0A /wm */ { 0, BX_IA_ERROR },
2039 /* 0F 0B /wm */ { BxTraceEnd, BX_IA_UD2A },
2040 /* 0F 0C /wm */ { 0, BX_IA_ERROR },
2041 /* 0F 0D /wm */ { 0, BX_IA_NOP }, // 3DNow! PREFETCH on AMD, NOP on Intel
2042 /* 0F 0E /wm */ { 0, BX_IA_FEMMS }, // 3DNow! FEMMS
2043 #if BX_SUPPORT_3DNOW
2044 /* 0F 0F /wm */ { BxImmediate_Ib, BX_IA_ERROR, Bx3DNowOpcodeInfo },
2045 #else
2046 /* 0F 0F /wm */ { 0, BX_IA_ERROR },
2047 #endif
2048 /* 0F 10 /wm */ { BxPrefixSSE, BX_IA_MOVUPS_VpsWps, BxOpcodeGroupSSE_0f10 },
2049 /* 0F 11 /wm */ { BxPrefixSSE, BX_IA_MOVUPS_WpsVps, BxOpcodeGroupSSE_0f11 },
2050 /* 0F 12 /wm */ { BxPrefixSSE, BX_IA_MOVLPS_VpsMq, BxOpcodeGroupSSE_0f12 },
2051 /* 0F 13 /wm */ { BxPrefixSSE, BX_IA_MOVLPS_MqVps, BxOpcodeGroupSSE_0f13M },
2052 /* 0F 14 /wm */ { BxPrefixSSE, BX_IA_UNPCKLPS_VpsWdq, BxOpcodeGroupSSE_0f14 },
2053 /* 0F 15 /wm */ { BxPrefixSSE, BX_IA_UNPCKHPS_VpsWdq, BxOpcodeGroupSSE_0f15 },
2054 /* 0F 16 /wm */ { BxPrefixSSE, BX_IA_MOVHPS_VpsMq, BxOpcodeGroupSSE_0f16 },
2055 /* 0F 17 /wm */ { BxPrefixSSE, BX_IA_MOVHPS_MqVps, BxOpcodeGroupSSE_0f17M },
2056 /* 0F 18 /wm */ { 0, BX_IA_PREFETCH }, // opcode group G16, PREFETCH hints
2057 /* 0F 19 /wm */ { 0, BX_IA_NOP }, // multi-byte NOP
2058 /* 0F 1A /wm */ { 0, BX_IA_NOP }, // multi-byte NOP
2059 /* 0F 1B /wm */ { 0, BX_IA_NOP }, // multi-byte NOP
2060 /* 0F 1C /wm */ { 0, BX_IA_NOP }, // multi-byte NOP
2061 /* 0F 1D /wm */ { 0, BX_IA_NOP }, // multi-byte NOP
2062 /* 0F 1E /wm */ { 0, BX_IA_NOP }, // multi-byte NOP
2063 /* 0F 1F /wm */ { 0, BX_IA_NOP }, // multi-byte NOP
2064 /* 0F 20 /wm */ { 0, BX_IA_MOV_RqCq },
2065 /* 0F 21 /wm */ { 0, BX_IA_MOV_RqDq },
2066 /* 0F 22 /wm */ { BxTraceEnd, BX_IA_MOV_CqRq },
2067 /* 0F 23 /wm */ { BxTraceEnd, BX_IA_MOV_DqRq },
2068 /* 0F 24 /wm */ { 0, BX_IA_ERROR },
2069 /* 0F 25 /wm */ { 0, BX_IA_ERROR },
2070 /* 0F 26 /wm */ { 0, BX_IA_ERROR },
2071 /* 0F 27 /wm */ { 0, BX_IA_ERROR },
2072 /* 0F 28 /wm */ { BxPrefixSSE, BX_IA_MOVAPS_VpsWps, BxOpcodeGroupSSE_0f28 },
2073 /* 0F 29 /wm */ { BxPrefixSSE, BX_IA_MOVAPS_WpsVps, BxOpcodeGroupSSE_0f29 },
2074 /* 0F 2A /wm */ { BxPrefixSSE, BX_IA_CVTPI2PS_VpsQq, BxOpcodeGroupSSE_0f2a },
2075 /* 0F 2B /wm */ { BxPrefixSSE, BX_IA_MOVNTPS_MpsVps, BxOpcodeGroupSSE_0f2bM },
2076 /* 0F 2C /wm */ { BxPrefixSSE, BX_IA_CVTTPS2PI_PqWps, BxOpcodeGroupSSE_0f2c },
2077 /* 0F 2D /wm */ { BxPrefixSSE, BX_IA_CVTPS2PI_PqWps, BxOpcodeGroupSSE_0f2d },
2078 /* 0F 2E /wm */ { BxPrefixSSE, BX_IA_UCOMISS_VssWss, BxOpcodeGroupSSE_0f2e },
2079 /* 0F 2F /wm */ { BxPrefixSSE, BX_IA_COMISS_VpsWps, BxOpcodeGroupSSE_0f2f },
2080 /* 0F 30 /wm */ { 0, BX_IA_WRMSR },
2081 /* 0F 31 /wm */ { 0, BX_IA_RDTSC },
2082 /* 0F 32 /wm */ { 0, BX_IA_RDMSR },
2083 /* 0F 33 /wm */ { 0, BX_IA_RDPMC },
2084 /* 0F 34 /wm */ { 0, BX_IA_SYSENTER },
2085 /* 0F 35 /wm */ { 0, BX_IA_SYSEXIT },
2086 /* 0F 36 /wm */ { 0, BX_IA_ERROR },
2087 /* 0F 37 /wm */ { 0, BX_IA_ERROR },
2088 #if (BX_SUPPORT_SSE >= 4) || (BX_SUPPORT_SSE >= 3 && BX_SUPPORT_SSE_EXTENSION > 0)
2089 /* 0F 38 /wm */ { Bx3ByteOp, BX_IA_ERROR, BxOpcode3ByteTable0f38 }, // 3-byte escape
2090 #else
2091 /* 0F 38 /wm */ { 0, BX_IA_ERROR },
2092 #endif
2093 /* 0F 39 /wm */ { 0, BX_IA_ERROR },
2094 #if (BX_SUPPORT_SSE >= 4) || (BX_SUPPORT_SSE >= 3 && BX_SUPPORT_SSE_EXTENSION > 0)
2095 /* 0F 3A /wm */ { Bx3ByteOp, BX_IA_ERROR, BxOpcode3ByteTable0f3a }, // 3-byte escape
2096 #else
2097 /* 0F 3A /wm */ { 0, BX_IA_ERROR },
2098 #endif
2099 /* 0F 3B /wm */ { 0, BX_IA_ERROR },
2100 /* 0F 3C /wm */ { 0, BX_IA_ERROR },
2101 /* 0F 3D /wm */ { 0, BX_IA_ERROR },
2102 /* 0F 3E /wm */ { 0, BX_IA_ERROR },
2103 /* 0F 3F /wm */ { 0, BX_IA_ERROR },
2104 /* 0F 40 /wm */ { 0, BX_IA_CMOVO_GwEwM },
2105 /* 0F 41 /wm */ { 0, BX_IA_CMOVNO_GwEwM },
2106 /* 0F 42 /wm */ { 0, BX_IA_CMOVB_GwEwM },
2107 /* 0F 43 /wm */ { 0, BX_IA_CMOVNB_GwEwM },
2108 /* 0F 44 /wm */ { 0, BX_IA_CMOVZ_GwEwM },
2109 /* 0F 45 /wm */ { 0, BX_IA_CMOVNZ_GwEwM },
2110 /* 0F 46 /wm */ { 0, BX_IA_CMOVBE_GwEwM },
2111 /* 0F 47 /wm */ { 0, BX_IA_CMOVNBE_GwEwM },
2112 /* 0F 48 /wm */ { 0, BX_IA_CMOVS_GwEwM },
2113 /* 0F 49 /wm */ { 0, BX_IA_CMOVNS_GwEwM },
2114 /* 0F 4A /wm */ { 0, BX_IA_CMOVP_GwEwM },
2115 /* 0F 4B /wm */ { 0, BX_IA_CMOVNP_GwEwM },
2116 /* 0F 4C /wm */ { 0, BX_IA_CMOVL_GwEwM },
2117 /* 0F 4D /wm */ { 0, BX_IA_CMOVNL_GwEwM },
2118 /* 0F 4E /wm */ { 0, BX_IA_CMOVLE_GwEwM },
2119 /* 0F 4F /wm */ { 0, BX_IA_CMOVNLE_GwEwM },
2120 /* 0F 50 /wm */ { BxPrefixSSE, BX_IA_MOVMSKPS_GdVRps, BxOpcodeGroupSSE_0f50 },
2121 /* 0F 51 /wm */ { BxPrefixSSE, BX_IA_SQRTPS_VpsWps, BxOpcodeGroupSSE_0f51 },
2122 /* 0F 52 /wm */ { BxPrefixSSE, BX_IA_RSQRTPS_VpsWps, BxOpcodeGroupSSE_0f52 },
2123 /* 0F 53 /wm */ { BxPrefixSSE, BX_IA_RCPPS_VpsWps, BxOpcodeGroupSSE_0f53 },
2124 /* 0F 54 /wm */ { BxPrefixSSE, BX_IA_ANDPS_VpsWps, BxOpcodeGroupSSE_0f54 },
2125 /* 0F 55 /wm */ { BxPrefixSSE, BX_IA_ANDNPS_VpsWps, BxOpcodeGroupSSE_0f55 },
2126 /* 0F 56 /wm */ { BxPrefixSSE, BX_IA_ORPS_VpsWps, BxOpcodeGroupSSE_0f56 },
2127 /* 0F 57 /wm */ { BxPrefixSSE, BX_IA_XORPS_VpsWps, BxOpcodeGroupSSE_0f57 },
2128 /* 0F 58 /wm */ { BxPrefixSSE, BX_IA_ADDPS_VpsWps, BxOpcodeGroupSSE_0f58 },
2129 /* 0F 59 /wm */ { BxPrefixSSE, BX_IA_MULPS_VpsWps, BxOpcodeGroupSSE_0f59 },
2130 /* 0F 5A /wm */ { BxPrefixSSE, BX_IA_CVTPS2PD_VpsWps, BxOpcodeGroupSSE_0f5a },
2131 /* 0F 5B /wm */ { BxPrefixSSE, BX_IA_CVTDQ2PS_VpsWdq, BxOpcodeGroupSSE_0f5b },
2132 /* 0F 5C /wm */ { BxPrefixSSE, BX_IA_SUBPS_VpsWps, BxOpcodeGroupSSE_0f5c },
2133 /* 0F 5D /wm */ { BxPrefixSSE, BX_IA_MINPS_VpsWps, BxOpcodeGroupSSE_0f5d },
2134 /* 0F 5E /wm */ { BxPrefixSSE, BX_IA_DIVPS_VpsWps, BxOpcodeGroupSSE_0f5e },
2135 /* 0F 5F /wm */ { BxPrefixSSE, BX_IA_MAXPS_VpsWps, BxOpcodeGroupSSE_0f5f },
2136 /* 0F 60 /wm */ { BxPrefixSSE, BX_IA_PUNPCKLBW_PqQd, BxOpcodeGroupSSE_0f60 },
2137 /* 0F 61 /wm */ { BxPrefixSSE, BX_IA_PUNPCKLWD_PqQd, BxOpcodeGroupSSE_0f61 },
2138 /* 0F 62 /wm */ { BxPrefixSSE, BX_IA_PUNPCKLDQ_PqQd, BxOpcodeGroupSSE_0f62 },
2139 /* 0F 63 /wm */ { BxPrefixSSE, BX_IA_PACKSSWB_PqQq, BxOpcodeGroupSSE_0f63 },
2140 /* 0F 64 /wm */ { BxPrefixSSE, BX_IA_PCMPGTB_PqQq, BxOpcodeGroupSSE_0f64 },
2141 /* 0F 65 /wm */ { BxPrefixSSE, BX_IA_PCMPGTW_PqQq, BxOpcodeGroupSSE_0f65 },
2142 /* 0F 66 /wm */ { BxPrefixSSE, BX_IA_PCMPGTD_PqQq, BxOpcodeGroupSSE_0f66 },
2143 /* 0F 67 /wm */ { BxPrefixSSE, BX_IA_PACKUSWB_PqQq, BxOpcodeGroupSSE_0f67 },
2144 /* 0F 68 /wm */ { BxPrefixSSE, BX_IA_PUNPCKHBW_PqQq, BxOpcodeGroupSSE_0f68 },
2145 /* 0F 69 /wm */ { BxPrefixSSE, BX_IA_PUNPCKHWD_PqQq, BxOpcodeGroupSSE_0f69 },
2146 /* 0F 6A /wm */ { BxPrefixSSE, BX_IA_PUNPCKHDQ_PqQq, BxOpcodeGroupSSE_0f6a },
2147 /* 0F 6B /wm */ { BxPrefixSSE, BX_IA_PACKSSDW_PqQq, BxOpcodeGroupSSE_0f6b },
2148 /* 0F 6C /wm */ { BxPrefixSSE, BX_IA_ERROR, BxOpcodeGroupSSE_0f6c },
2149 /* 0F 6D /wm */ { BxPrefixSSE, BX_IA_ERROR, BxOpcodeGroupSSE_0f6d },
2150 /* 0F 6E /wm */ { BxPrefixSSE, BX_IA_MOVD_PqEd, BxOpcodeGroupSSE_0f6e },
2151 /* 0F 6F /wm */ { BxPrefixSSE, BX_IA_MOVQ_PqQq, BxOpcodeGroupSSE_0f6f },
2152 /* 0F 70 /wm */ { BxPrefixSSE | BxImmediate_Ib, BX_IA_PSHUFW_PqQqIb, BxOpcodeGroupSSE_0f70 },
2153 /* 0F 71 /wm */ { 0, BX_IA_ERROR }, // SSE Group G12
2154 /* 0F 72 /wm */ { 0, BX_IA_ERROR }, // SSE Group G13
2155 /* 0F 73 /wm */ { 0, BX_IA_ERROR }, // SSE Group G14
2156 /* 0F 74 /wm */ { BxPrefixSSE, BX_IA_PCMPEQB_PqQq, BxOpcodeGroupSSE_0f74 },
2157 /* 0F 75 /wm */ { BxPrefixSSE, BX_IA_PCMPEQW_PqQq, BxOpcodeGroupSSE_0f75 },
2158 /* 0F 76 /wm */ { BxPrefixSSE, BX_IA_PCMPEQD_PqQq, BxOpcodeGroupSSE_0f76 },
2159 /* 0F 77 /wm */ { BxPrefixSSE, BX_IA_EMMS, BxOpcodeGroupSSE_ERR },
2160 /* 0F 78 /wm */ { 0, BX_IA_ERROR },
2161 /* 0F 79 /wm */ { 0, BX_IA_ERROR },
2162 /* 0F 7A /wm */ { 0, BX_IA_ERROR },
2163 /* 0F 7B /wm */ { 0, BX_IA_ERROR },
2164 /* 0F 7C /wm */ { BxPrefixSSE, BX_IA_ERROR, BxOpcodeGroupSSE_0f7c },
2165 /* 0F 7D /wm */ { BxPrefixSSE, BX_IA_ERROR, BxOpcodeGroupSSE_0f7d },
2166 /* 0F 7E /wm */ { BxPrefixSSE, BX_IA_MOVD_EdPd, BxOpcodeGroupSSE_0f7e },
2167 /* 0F 7F /wm */ { BxPrefixSSE, BX_IA_MOVQ_QqPq, BxOpcodeGroupSSE_0f7f },
2168 /* 0F 80 /wm */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JO_Jq },
2169 /* 0F 81 /wm */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JNO_Jq },
2170 /* 0F 82 /wm */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JB_Jq },
2171 /* 0F 83 /wm */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JNB_Jq },
2172 /* 0F 84 /wm */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JZ_Jq },
2173 /* 0F 85 /wm */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JNZ_Jq },
2174 /* 0F 86 /wm */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JBE_Jq },
2175 /* 0F 87 /wm */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JNBE_Jq },
2176 /* 0F 88 /wm */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JS_Jq },
2177 /* 0F 89 /wm */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JNS_Jq },
2178 /* 0F 8A /wm */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JP_Jq },
2179 /* 0F 8B /wm */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JNP_Jq },
2180 /* 0F 8C /wm */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JL_Jq },
2181 /* 0F 8D /wm */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JNL_Jq },
2182 /* 0F 8E /wm */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JLE_Jq },
2183 /* 0F 8F /wm */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JNLE_Jq },
2184 /* 0F 90 /wm */ { 0, BX_IA_SETO_EbM },
2185 /* 0F 91 /wm */ { 0, BX_IA_SETNO_EbM },
2186 /* 0F 92 /wm */ { 0, BX_IA_SETB_EbM },
2187 /* 0F 93 /wm */ { 0, BX_IA_SETNB_EbM },
2188 /* 0F 94 /wm */ { 0, BX_IA_SETZ_EbM },
2189 /* 0F 95 /wm */ { 0, BX_IA_SETNZ_EbM },
2190 /* 0F 96 /wm */ { 0, BX_IA_SETBE_EbM },
2191 /* 0F 97 /wm */ { 0, BX_IA_SETNBE_EbM },
2192 /* 0F 98 /wm */ { 0, BX_IA_SETS_EbM },
2193 /* 0F 99 /wm */ { 0, BX_IA_SETNS_EbM },
2194 /* 0F 9A /wm */ { 0, BX_IA_SETP_EbM },
2195 /* 0F 9B /wm */ { 0, BX_IA_SETNP_EbM },
2196 /* 0F 9C /wm */ { 0, BX_IA_SETL_EbM },
2197 /* 0F 9D /wm */ { 0, BX_IA_SETNL_EbM },
2198 /* 0F 9E /wm */ { 0, BX_IA_SETLE_EbM },
2199 /* 0F 9F /wm */ { 0, BX_IA_SETNLE_EbM },
2200 /* 0F A0 /wm */ { 0, BX_IA_PUSH16_FS },
2201 /* 0F A1 /wm */ { 0, BX_IA_POP16_FS },
2202 /* 0F A2 /wm */ { 0, BX_IA_CPUID },
2203 /* 0F A3 /wm */ { 0, BX_IA_BT_EwGwM },
2204 /* 0F A4 /wm */ { BxImmediate_Ib, BX_IA_SHLD_EwGwM },
2205 /* 0F A5 /wm */ { 0, BX_IA_SHLD_EwGwM },
2206 /* 0F A6 /wm */ { 0, BX_IA_ERROR },
2207 /* 0F A7 /wm */ { 0, BX_IA_ERROR },
2208 /* 0F A8 /wm */ { 0, BX_IA_PUSH16_GS },
2209 /* 0F A9 /wm */ { 0, BX_IA_POP16_GS },
2210 /* 0F AA /wm */ { BxTraceEnd, BX_IA_RSM },
2211 /* 0F AB /wm */ { BxLockable, BX_IA_BTS_EwGwM },
2212 /* 0F AC /wm */ { BxImmediate_Ib, BX_IA_SHRD_EwGwM },
2213 /* 0F AD /wm */ { 0, BX_IA_SHRD_EwGwM },
2214 /* 0F AE /wm */ { BxGroup15, BX_IA_ERROR, BxOpcodeInfoG15M },
2215 /* 0F AF /wm */ { 0, BX_IA_IMUL_GwEwM },
2216 /* 0F B0 /wm */ { BxLockable, BX_IA_CMPXCHG_EbGbM },
2217 /* 0F B1 /wm */ { BxLockable, BX_IA_CMPXCHG_EwGwM },
2218 /* 0F B2 /wm */ { 0, BX_IA_LSS_GwMp },
2219 /* 0F B3 /wm */ { BxLockable, BX_IA_BTR_EwGwM },
2220 /* 0F B4 /wm */ { 0, BX_IA_LFS_GwMp },
2221 /* 0F B5 /wm */ { 0, BX_IA_LGS_GwMp },
2222 /* 0F B6 /wm */ { 0, BX_IA_MOVZX_GwEbM },
2223 /* 0F B7 /wm */ { 0, BX_IA_MOV_GwEwM }, // MOVZX_GwEw
2224 /* 0F B8 /wm */ { BxPrefixSSE, BX_IA_ERROR, BxOpcodeGroupSSE_0fb8wM },
2225 /* 0F B9 /wm */ { BxTraceEnd, BX_IA_UD2B },
2226 /* 0F BA /wm */ { BxGroup8, BX_IA_ERROR, BxOpcodeInfoG8EwIbM },
2227 /* 0F BB /wm */ { BxLockable, BX_IA_BTC_EwGwM },
2228 /* 0F BC /wm */ { 0, BX_IA_BSF_GwEwM },
2229 /* 0F BD /wm */ { 0, BX_IA_BSR_GwEwM },
2230 /* 0F BE /wm */ { 0, BX_IA_MOVSX_GwEbM },
2231 /* 0F BF /wm */ { 0, BX_IA_MOV_GwEwM }, // MOVSX_GwEw
2232 /* 0F C0 /wm */ { BxLockable, BX_IA_XADD_EbGbM },
2233 /* 0F C1 /wm */ { BxLockable, BX_IA_XADD_EwGwM },
2234 /* 0F C2 /wm */ { BxPrefixSSE | BxImmediate_Ib, BX_IA_CMPPS_VpsWpsIb, BxOpcodeGroupSSE_0fc2 },
2235 /* 0F C3 /wm */ { BxPrefixSSE, BX_IA_MOVNTI_MdGd, BxOpcodeGroupSSE_ERR },
2236 /* 0F C4 /wm */ { BxPrefixSSE | BxImmediate_Ib, BX_IA_PINSRW_PqEwIb, BxOpcodeGroupSSE_0fc4 },
2237 /* 0F C5 /wm */ { 0, BX_IA_ERROR }, // PEXTRW SSE group
2238 /* 0F C6 /wm */ { BxPrefixSSE | BxImmediate_Ib, BX_IA_SHUFPS_VpsWpsIb, BxOpcodeGroupSSE_0fc6 },
2239 /* 0F C7 /wm */ { BxGroup9, BX_IA_ERROR, BxOpcodeInfoG9M },
2240 /* 0F C8 /wm */ { 0, BX_IA_BSWAP_ERX },
2241 /* 0F C9 /wm */ { 0, BX_IA_BSWAP_ERX },
2242 /* 0F CA /wm */ { 0, BX_IA_BSWAP_ERX },
2243 /* 0F CB /wm */ { 0, BX_IA_BSWAP_ERX },
2244 /* 0F CC /wm */ { 0, BX_IA_BSWAP_ERX },
2245 /* 0F CD /wm */ { 0, BX_IA_BSWAP_ERX },
2246 /* 0F CE /wm */ { 0, BX_IA_BSWAP_ERX },
2247 /* 0F CF /wm */ { 0, BX_IA_BSWAP_ERX },
2248 /* 0F D0 /wm */ { BxPrefixSSE, BX_IA_ERROR, BxOpcodeGroupSSE_0fd0 },
2249 /* 0F D1 /wm */ { BxPrefixSSE, BX_IA_PSRLW_PqQq, BxOpcodeGroupSSE_0fd1 },
2250 /* 0F D2 /wm */ { BxPrefixSSE, BX_IA_PSRLD_PqQq, BxOpcodeGroupSSE_0fd2 },
2251 /* 0F D3 /wm */ { BxPrefixSSE, BX_IA_PSRLQ_PqQq, BxOpcodeGroupSSE_0fd3 },
2252 /* 0F D4 /wm */ { BxPrefixSSE, BX_IA_PADDQ_PqQq, BxOpcodeGroupSSE_0fd4 },
2253 /* 0F D5 /wm */ { BxPrefixSSE, BX_IA_PMULLW_PqQq, BxOpcodeGroupSSE_0fd5 },
2254 /* 0F D6 /wm */ { BxPrefixSSE, BX_IA_ERROR, BxOpcodeGroupSSE_0fd6 },
2255 /* 0F D7 /wm */ { BxPrefixSSE, BX_IA_PMOVMSKB_GdPRq, BxOpcodeGroupSSE_0fd7 },
2256 /* 0F D8 /wm */ { BxPrefixSSE, BX_IA_PSUBUSB_PqQq, BxOpcodeGroupSSE_0fd8 },
2257 /* 0F D9 /wm */ { BxPrefixSSE, BX_IA_PSUBUSW_PqQq, BxOpcodeGroupSSE_0fd9 },
2258 /* 0F DA /wm */ { BxPrefixSSE, BX_IA_PMINUB_PqQq, BxOpcodeGroupSSE_0fda },
2259 /* 0F DB /wm */ { BxPrefixSSE, BX_IA_PAND_PqQq, BxOpcodeGroupSSE_0fdb },
2260 /* 0F DC /wm */ { BxPrefixSSE, BX_IA_PADDUSB_PqQq, BxOpcodeGroupSSE_0fdc },
2261 /* 0F DD /wm */ { BxPrefixSSE, BX_IA_PADDUSW_PqQq, BxOpcodeGroupSSE_0fdd },
2262 /* 0F DE /wm */ { BxPrefixSSE, BX_IA_PMAXUB_PqQq, BxOpcodeGroupSSE_0fde },
2263 /* 0F DF /wm */ { BxPrefixSSE, BX_IA_PANDN_PqQq, BxOpcodeGroupSSE_0fdf },
2264 /* 0F E0 /wm */ { BxPrefixSSE, BX_IA_PAVGB_PqQq, BxOpcodeGroupSSE_0fe0 },
2265 /* 0F E1 /wm */ { BxPrefixSSE, BX_IA_PSRAW_PqQq, BxOpcodeGroupSSE_0fe1 },
2266 /* 0F E2 /wm */ { BxPrefixSSE, BX_IA_PSRAD_PqQq, BxOpcodeGroupSSE_0fe2 },
2267 /* 0F E3 /wm */ { BxPrefixSSE, BX_IA_PAVGW_PqQq, BxOpcodeGroupSSE_0fe3 },
2268 /* 0F E4 /wm */ { BxPrefixSSE, BX_IA_PMULHUW_PqQq, BxOpcodeGroupSSE_0fe4 },
2269 /* 0F E5 /wm */ { BxPrefixSSE, BX_IA_PMULHW_PqQq, BxOpcodeGroupSSE_0fe5 },
2270 /* 0F E6 /wm */ { BxPrefixSSE, BX_IA_ERROR, BxOpcodeGroupSSE_0fe6 },
2271 /* 0F E7 /wm */ { BxPrefixSSE, BX_IA_MOVNTQ_MqPq, BxOpcodeGroupSSE_0fe7M },
2272 /* 0F E8 /wm */ { BxPrefixSSE, BX_IA_PSUBSB_PqQq, BxOpcodeGroupSSE_0fe8 },
2273 /* 0F E9 /wm */ { BxPrefixSSE, BX_IA_PSUBSW_PqQq, BxOpcodeGroupSSE_0fe9 },
2274 /* 0F EA /wm */ { BxPrefixSSE, BX_IA_PMINSW_PqQq, BxOpcodeGroupSSE_0fea },
2275 /* 0F EB /wm */ { BxPrefixSSE, BX_IA_POR_PqQq, BxOpcodeGroupSSE_0feb },
2276 /* 0F EC /wm */ { BxPrefixSSE, BX_IA_PADDSB_PqQq, BxOpcodeGroupSSE_0fec },
2277 /* 0F ED /wm */ { BxPrefixSSE, BX_IA_PADDSW_PqQq, BxOpcodeGroupSSE_0fed },
2278 /* 0F EE /wm */ { BxPrefixSSE, BX_IA_PMAXSW_PqQq, BxOpcodeGroupSSE_0fee },
2279 /* 0F EF /wm */ { BxPrefixSSE, BX_IA_PXOR_PqQq, BxOpcodeGroupSSE_0fef },
2280 /* 0F F0 /wm */ { BxPrefixSSE, BX_IA_ERROR, BxOpcodeGroupSSE_0ff0M },
2281 /* 0F F1 /wm */ { BxPrefixSSE, BX_IA_PSLLW_PqQq, BxOpcodeGroupSSE_0ff1 },
2282 /* 0F F2 /wm */ { BxPrefixSSE, BX_IA_PSLLD_PqQq, BxOpcodeGroupSSE_0ff2 },
2283 /* 0F F3 /wm */ { BxPrefixSSE, BX_IA_PSLLQ_PqQq, BxOpcodeGroupSSE_0ff3 },
2284 /* 0F F4 /wm */ { BxPrefixSSE, BX_IA_PMULUDQ_PqQq, BxOpcodeGroupSSE_0ff4 },
2285 /* 0F F5 /wm */ { BxPrefixSSE, BX_IA_PMADDWD_PqQq, BxOpcodeGroupSSE_0ff5 },
2286 /* 0F F6 /wm */ { BxPrefixSSE, BX_IA_PSADBW_PqQq, BxOpcodeGroupSSE_0ff6 },
2287 /* 0F F7 /wm */ { 0, BX_IA_ERROR }, // MASKMOV SSE group
2288 /* 0F F8 /wm */ { BxPrefixSSE, BX_IA_PSUBB_PqQq, BxOpcodeGroupSSE_0ff8 },
2289 /* 0F F9 /wm */ { BxPrefixSSE, BX_IA_PSUBW_PqQq, BxOpcodeGroupSSE_0ff9 },
2290 /* 0F FA /wm */ { BxPrefixSSE, BX_IA_PSUBD_PqQq, BxOpcodeGroupSSE_0ffa },
2291 /* 0F FB /wm */ { BxPrefixSSE, BX_IA_PSUBQ_PqQq, BxOpcodeGroupSSE_0ffb },
2292 /* 0F FC /wm */ { BxPrefixSSE, BX_IA_PADDB_PqQq, BxOpcodeGroupSSE_0ffc },
2293 /* 0F FD /wm */ { BxPrefixSSE, BX_IA_PADDW_PqQq, BxOpcodeGroupSSE_0ffd },
2294 /* 0F FE /wm */ { BxPrefixSSE, BX_IA_PADDD_PqQq, BxOpcodeGroupSSE_0ffe },
2295 /* 0F FF /wm */ { 0, BX_IA_ERROR },
2297 // 512 entries for 32bit operand size
2298 /* 00 /dm */ { BxLockable, BX_IA_ADD_EbGbM },
2299 /* 01 /dm */ { BxLockable, BX_IA_ADD_EdGdM },
2300 /* 02 /dm */ { 0, BX_IA_ADD_GbEbM },
2301 /* 03 /dm */ { 0, BX_IA_ADD_GdEdM },
2302 /* 04 /dm */ { BxImmediate_Ib, BX_IA_ADD_ALIb },
2303 /* 05 /dm */ { BxImmediate_Id, BX_IA_ADD_EAXId },
2304 /* 06 /dm */ { 0, BX_IA_ERROR },
2305 /* 07 /dm */ { 0, BX_IA_ERROR },
2306 /* 08 /dm */ { BxLockable, BX_IA_OR_EbGbM },
2307 /* 09 /dm */ { BxLockable, BX_IA_OR_EdGdM },
2308 /* 0A /dm */ { 0, BX_IA_OR_GbEbM },
2309 /* 0B /dm */ { 0, BX_IA_OR_GdEdM },
2310 /* 0C /dm */ { BxImmediate_Ib, BX_IA_OR_ALIb },
2311 /* 0D /dm */ { BxImmediate_Id, BX_IA_OR_EAXId },
2312 /* 0E /dm */ { 0, BX_IA_ERROR },
2313 /* 0F /dm */ { 0, BX_IA_ERROR }, // 2-byte escape
2314 /* 10 /dm */ { BxLockable, BX_IA_ADC_EbGbM },
2315 /* 11 /dm */ { BxLockable, BX_IA_ADC_EdGdM },
2316 /* 12 /dm */ { 0, BX_IA_ADC_GbEbM },
2317 /* 13 /dm */ { 0, BX_IA_ADC_GdEdM },
2318 /* 14 /dm */ { BxImmediate_Ib, BX_IA_ADC_ALIb },
2319 /* 15 /dm */ { BxImmediate_Id, BX_IA_ADC_EAXId },
2320 /* 16 /dm */ { 0, BX_IA_ERROR },
2321 /* 17 /dm */ { 0, BX_IA_ERROR },
2322 /* 18 /dm */ { BxLockable, BX_IA_SBB_EbGbM },
2323 /* 19 /dm */ { BxLockable, BX_IA_SBB_EdGdM },
2324 /* 1A /dm */ { 0, BX_IA_SBB_GbEbM },
2325 /* 1B /dm */ { 0, BX_IA_SBB_GdEdM },
2326 /* 1C /dm */ { BxImmediate_Ib, BX_IA_SBB_ALIb },
2327 /* 1D /dm */ { BxImmediate_Id, BX_IA_SBB_EAXId },
2328 /* 1E /dm */ { 0, BX_IA_ERROR },
2329 /* 1F /dm */ { 0, BX_IA_ERROR },
2330 /* 20 /dm */ { BxLockable, BX_IA_AND_EbGbM },
2331 /* 21 /dm */ { BxLockable, BX_IA_AND_EdGdM },
2332 /* 22 /dm */ { 0, BX_IA_AND_GbEbM },
2333 /* 23 /dm */ { 0, BX_IA_AND_GdEdM },
2334 /* 24 /dm */ { BxImmediate_Ib, BX_IA_AND_ALIb },
2335 /* 25 /dm */ { BxImmediate_Id, BX_IA_AND_EAXId },
2336 /* 26 /dm */ { 0, BX_IA_ERROR }, // ES:
2337 /* 27 /dm */ { 0, BX_IA_ERROR },
2338 /* 28 /dm */ { BxLockable, BX_IA_SUB_EbGbM },
2339 /* 29 /dm */ { BxLockable, BX_IA_SUB_EdGdM },
2340 /* 2A /dm */ { 0, BX_IA_SUB_GbEbM },
2341 /* 2B /dm */ { 0, BX_IA_SUB_GdEdM },
2342 /* 2C /dm */ { BxImmediate_Ib, BX_IA_SUB_ALIb },
2343 /* 2D /dm */ { BxImmediate_Id, BX_IA_SUB_EAXId },
2344 /* 2E /dm */ { 0, BX_IA_ERROR }, // CS:
2345 /* 2F /dm */ { 0, BX_IA_ERROR },
2346 /* 30 /dm */ { BxLockable, BX_IA_XOR_EbGbM },
2347 /* 31 /dm */ { BxLockable, BX_IA_XOR_EdGdM },
2348 /* 32 /dm */ { 0, BX_IA_XOR_GbEbM },
2349 /* 33 /dm */ { 0, BX_IA_XOR_GdEdM },
2350 /* 34 /dm */ { BxImmediate_Ib, BX_IA_XOR_ALIb },
2351 /* 35 /dm */ { BxImmediate_Id, BX_IA_XOR_EAXId },
2352 /* 36 /dm */ { 0, BX_IA_ERROR }, // SS:
2353 /* 37 /dm */ { 0, BX_IA_ERROR },
2354 /* 38 /dm */ { 0, BX_IA_CMP_EbGbM },
2355 /* 39 /dm */ { 0, BX_IA_CMP_EdGdM },
2356 /* 3A /dm */ { 0, BX_IA_CMP_GbEbM },
2357 /* 3B /dm */ { 0, BX_IA_CMP_GdEdM },
2358 /* 3C /dm */ { BxImmediate_Ib, BX_IA_CMP_ALIb },
2359 /* 3D /dm */ { BxImmediate_Id, BX_IA_CMP_EAXId },
2360 /* 3E /dm */ { 0, BX_IA_ERROR }, // DS:
2361 /* 3F /dm */ { 0, BX_IA_ERROR },
2362 /* 40 /dm */ { 0, BX_IA_ERROR }, // REX:
2363 /* 41 /dm */ { 0, BX_IA_ERROR }, // REX:
2364 /* 42 /dm */ { 0, BX_IA_ERROR }, // REX:
2365 /* 43 /dm */ { 0, BX_IA_ERROR }, // REX:
2366 /* 44 /dm */ { 0, BX_IA_ERROR }, // REX:
2367 /* 45 /dm */ { 0, BX_IA_ERROR }, // REX:
2368 /* 46 /dm */ { 0, BX_IA_ERROR }, // REX:
2369 /* 47 /dm */ { 0, BX_IA_ERROR }, // REX:
2370 /* 48 /dm */ { 0, BX_IA_ERROR }, // REX:
2371 /* 49 /dm */ { 0, BX_IA_ERROR }, // REX:
2372 /* 4A /dm */ { 0, BX_IA_ERROR }, // REX:
2373 /* 4B /dm */ { 0, BX_IA_ERROR }, // REX:
2374 /* 4C /dm */ { 0, BX_IA_ERROR }, // REX:
2375 /* 4D /dm */ { 0, BX_IA_ERROR }, // REX:
2376 /* 4E /dm */ { 0, BX_IA_ERROR }, // REX:
2377 /* 4F /dm */ { 0, BX_IA_ERROR }, // REX:
2378 /* 50 /dm */ { 0, BX_IA_PUSH_RRX },
2379 /* 51 /dm */ { 0, BX_IA_PUSH_RRX },
2380 /* 52 /dm */ { 0, BX_IA_PUSH_RRX },
2381 /* 53 /dm */ { 0, BX_IA_PUSH_RRX },
2382 /* 54 /dm */ { 0, BX_IA_PUSH_RRX },
2383 /* 55 /dm */ { 0, BX_IA_PUSH_RRX },
2384 /* 56 /dm */ { 0, BX_IA_PUSH_RRX },
2385 /* 57 /dm */ { 0, BX_IA_PUSH_RRX },
2386 /* 58 /dm */ { 0, BX_IA_POP_RRX },
2387 /* 59 /dm */ { 0, BX_IA_POP_RRX },
2388 /* 5A /dm */ { 0, BX_IA_POP_RRX },
2389 /* 5B /dm */ { 0, BX_IA_POP_RRX },
2390 /* 5C /dm */ { 0, BX_IA_POP_RRX },
2391 /* 5D /dm */ { 0, BX_IA_POP_RRX },
2392 /* 5E /dm */ { 0, BX_IA_POP_RRX },
2393 /* 5F /dm */ { 0, BX_IA_POP_RRX },
2394 /* 60 /dm */ { 0, BX_IA_ERROR },
2395 /* 61 /dm */ { 0, BX_IA_ERROR },
2396 /* 62 /dm */ { 0, BX_IA_ERROR },
2397 /* 63 /dm */ { 0, BX_IA_MOV64_GdEdM }, // MOVSX_GdEd
2398 /* 64 /dm */ { 0, BX_IA_ERROR }, // FS:
2399 /* 65 /dm */ { 0, BX_IA_ERROR }, // GS:
2400 /* 66 /dm */ { 0, BX_IA_ERROR }, // OS:
2401 /* 67 /dm */ { 0, BX_IA_ERROR }, // AS:
2402 /* 68 /dm */ { BxImmediate_Id, BX_IA_PUSH64_Id },
2403 /* 69 /dm */ { BxImmediate_Id, BX_IA_IMUL_GdEdIdM },
2404 /* 6A /dm */ { BxImmediate_Ib_SE, BX_IA_PUSH64_Id },
2405 /* 6B /dm */ { BxImmediate_Ib_SE, BX_IA_IMUL_GdEdIdM },
2406 /* 6C /dm */ { 0, BX_IA_REP_INSB_YbDX },
2407 /* 6D /dm */ { 0, BX_IA_REP_INSD_YdDX },
2408 /* 6E /dm */ { 0, BX_IA_REP_OUTSB_DXXb },
2409 /* 6F /dm */ { 0, BX_IA_REP_OUTSD_DXXd },
2410 /* 70 /dm */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JO_Jq },
2411 /* 71 /dm */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JNO_Jq },
2412 /* 72 /dm */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JB_Jq },
2413 /* 73 /dm */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JNB_Jq },
2414 /* 74 /dm */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JZ_Jq },
2415 /* 75 /dm */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JNZ_Jq },
2416 /* 76 /dm */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JBE_Jq },
2417 /* 77 /dm */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JNBE_Jq },
2418 /* 78 /dm */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JS_Jq },
2419 /* 79 /dm */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JNS_Jq },
2420 /* 7A /dm */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JP_Jq },
2421 /* 7B /dm */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JNP_Jq },
2422 /* 7C /dm */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JL_Jq },
2423 /* 7D /dm */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JNL_Jq },
2424 /* 7E /dm */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JLE_Jq },
2425 /* 7F /dm */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JNLE_Jq },
2426 /* 80 /dm */ { BxGroup1 | BxImmediate_Ib, BX_IA_ERROR, BxOpcodeInfoG1EbIbM },
2427 /* 81 /dm */ { BxGroup1 | BxImmediate_Id, BX_IA_ERROR, BxOpcodeInfoG1EdM },
2428 /* 82 /dm */ { 0, BX_IA_ERROR },
2429 /* 83 /dm */ { BxGroup1 | BxImmediate_Ib_SE, BX_IA_ERROR, BxOpcodeInfoG1EdM },
2430 /* 84 /dm */ { 0, BX_IA_TEST_EbGbM },
2431 /* 85 /dm */ { 0, BX_IA_TEST_EdGdM },
2432 /* 86 /dm */ { BxLockable, BX_IA_XCHG_EbGbM },
2433 /* 87 /dm */ { BxLockable, BX_IA_XCHG_EdGdM },
2434 /* 88 /dm */ { 0, BX_IA_MOV_EbGbM },
2435 /* 89 /dm */ { 0, BX_IA_MOV_EdGdM },
2436 /* 8A /dm */ { 0, BX_IA_MOV_GbEbM },
2437 /* 8B /dm */ { 0, BX_IA_MOV64_GdEdM },
2438 /* 8C /dm */ { 0, BX_IA_MOV_EwSwM },
2439 /* 8D /dm */ { 0, BX_IA_LEA_GdM },
2440 /* 8E /dm */ { 0, BX_IA_MOV_SwEw },
2441 /* 8F /dm */ { BxGroup1A, BX_IA_ERROR, BxOpcodeInfo64G1AEqM },
2442 /* 90 /dm */ { 0, BX_IA_XCHG_ERXEAX }, // handles XCHG R8d, EAX
2443 /* 91 /dm */ { 0, BX_IA_XCHG_ERXEAX },
2444 /* 92 /dm */ { 0, BX_IA_XCHG_ERXEAX },
2445 /* 93 /dm */ { 0, BX_IA_XCHG_ERXEAX },
2446 /* 94 /dm */ { 0, BX_IA_XCHG_ERXEAX },
2447 /* 95 /dm */ { 0, BX_IA_XCHG_ERXEAX },
2448 /* 96 /dm */ { 0, BX_IA_XCHG_ERXEAX },
2449 /* 97 /dm */ { 0, BX_IA_XCHG_ERXEAX },
2450 /* 98 /dm */ { 0, BX_IA_CWDE },
2451 /* 99 /dm */ { 0, BX_IA_CDQ },
2452 /* 9A /dm */ { 0, BX_IA_ERROR },
2453 /* 9B /dm */ { 0, BX_IA_FWAIT },
2454 /* 9C /dm */ { 0, BX_IA_PUSHF_Fq },
2455 /* 9D /dm */ { 0, BX_IA_POPF_Fq },
2456 /* 9E /dm */ { 0, BX_IA_SAHF },
2457 /* 9F /dm */ { 0, BX_IA_LAHF },
2458 /* A0 /dm */ { BxImmediate_O, BX_IA_MOV_ALOq },
2459 /* A1 /dm */ { BxImmediate_O, BX_IA_MOV_EAXOq },
2460 /* A2 /dm */ { BxImmediate_O, BX_IA_MOV_OqAL },
2461 /* A3 /dm */ { BxImmediate_O, BX_IA_MOV_OqEAX },
2462 /* A4 /dm */ { 0, BX_IA_REP_MOVSB_XbYb },
2463 /* A5 /dm */ { 0, BX_IA_REP_MOVSD_XdYd },
2464 /* A6 /dm */ { 0, BX_IA_REP_CMPSB_XbYb },
2465 /* A7 /dm */ { 0, BX_IA_REP_CMPSD_XdYd },
2466 /* A8 /dm */ { BxImmediate_Ib, BX_IA_TEST_ALIb },
2467 /* A9 /dm */ { BxImmediate_Id, BX_IA_TEST_EAXId },
2468 /* AA /dm */ { 0, BX_IA_REP_STOSB_YbAL },
2469 /* AB /dm */ { 0, BX_IA_REP_STOSD_YdEAX },
2470 /* AC /dm */ { 0, BX_IA_REP_LODSB_ALXb },
2471 /* AD /dm */ { 0, BX_IA_REP_LODSD_EAXXd },
2472 /* AE /dm */ { 0, BX_IA_REP_SCASB_ALXb },
2473 /* AF /dm */ { 0, BX_IA_REP_SCASD_EAXXd },
2474 /* B0 /dm */ { BxImmediate_Ib, BX_IA_MOV_RLIb },
2475 /* B1 /dm */ { BxImmediate_Ib, BX_IA_MOV_RLIb },
2476 /* B2 /dm */ { BxImmediate_Ib, BX_IA_MOV_RLIb },
2477 /* B3 /dm */ { BxImmediate_Ib, BX_IA_MOV_RLIb },
2478 /* B4 /dm */ { BxImmediate_Ib, BX_IA_MOV_RLIb },
2479 /* B5 /dm */ { BxImmediate_Ib, BX_IA_MOV_RLIb },
2480 /* B6 /dm */ { BxImmediate_Ib, BX_IA_MOV_RLIb },
2481 /* B7 /dm */ { BxImmediate_Ib, BX_IA_MOV_RLIb },
2482 /* B8 /dm */ { BxImmediate_Id, BX_IA_MOV_ERXId },
2483 /* B9 /dm */ { BxImmediate_Id, BX_IA_MOV_ERXId },
2484 /* BA /dm */ { BxImmediate_Id, BX_IA_MOV_ERXId },
2485 /* BB /dm */ { BxImmediate_Id, BX_IA_MOV_ERXId },
2486 /* BC /dm */ { BxImmediate_Id, BX_IA_MOV_ERXId },
2487 /* BD /dm */ { BxImmediate_Id, BX_IA_MOV_ERXId },
2488 /* BE /dm */ { BxImmediate_Id, BX_IA_MOV_ERXId },
2489 /* BF /dm */ { BxImmediate_Id, BX_IA_MOV_ERXId },
2490 /* C0 /dm */ { BxGroup2 | BxImmediate_Ib, BX_IA_ERROR, BxOpcodeInfoG2Eb },
2491 /* C1 /dm */ { BxGroup2 | BxImmediate_Ib, BX_IA_ERROR, BxOpcodeInfoG2EdM },
2492 /* C2 /dm */ { BxImmediate_Iw | BxTraceEnd, BX_IA_RETnear64_Iw },
2493 /* C3 /dm */ { BxTraceEnd, BX_IA_RETnear64 },
2494 /* C4 /dm */ { 0, BX_IA_ERROR },
2495 /* C5 /dm */ { 0, BX_IA_ERROR },
2496 /* C6 /dm */ { BxGroup11, BX_IA_ERROR, BxOpcodeInfoG11EbM },
2497 /* C7 /dm */ { BxGroup11, BX_IA_ERROR, BxOpcodeInfoG11EdM },
2498 /* C8 /dm */ { BxImmediate_IwIb, BX_IA_ENTER64_IwIb },
2499 /* C9 /dm */ { 0, BX_IA_LEAVE64 },
2500 /* CA /dm */ { BxImmediate_Iw | BxTraceEnd, BX_IA_RETfar32_Iw },
2501 /* CB /dm */ { BxTraceEnd, BX_IA_RETfar32 },
2502 /* CC /dm */ { BxTraceEnd, BX_IA_INT3 },
2503 /* CD /dm */ { BxImmediate_Ib | BxTraceEnd, BX_IA_INT_Ib },
2504 /* CE /dm */ { 0, BX_IA_ERROR },
2505 /* CF /dm */ { BxTraceEnd, BX_IA_IRET64 },
2506 /* D0 /dm */ { BxGroup2 | BxImmediate_I1, BX_IA_ERROR, BxOpcodeInfoG2Eb },
2507 /* D1 /dm */ { BxGroup2 | BxImmediate_I1, BX_IA_ERROR, BxOpcodeInfoG2EdM },
2508 /* D2 /dm */ { BxGroup2, BX_IA_ERROR, BxOpcodeInfoG2Eb },
2509 /* D3 /dm */ { BxGroup2, BX_IA_ERROR, BxOpcodeInfoG2EdM },
2510 /* D4 /dm */ { 0, BX_IA_ERROR },
2511 /* D5 /dm */ { 0, BX_IA_ERROR },
2512 /* D6 /dm */ { 0, BX_IA_ERROR },
2513 /* D7 /dm */ { 0, BX_IA_XLAT },
2514 /* D8 /dm */ { BxGroupFP, BX_IA_ERROR, BxOpcodeInfo_FPGroupD8 },
2515 /* D9 /dm */ { BxGroupFP, BX_IA_ERROR, BxOpcodeInfo_FPGroupD9 },
2516 /* DA /dm */ { BxGroupFP, BX_IA_ERROR, BxOpcodeInfo_FPGroupDA },
2517 /* DB /dm */ { BxGroupFP, BX_IA_ERROR, BxOpcodeInfo_FPGroupDB },
2518 /* DC /dm */ { BxGroupFP, BX_IA_ERROR, BxOpcodeInfo_FPGroupDC },
2519 /* DD /dm */ { BxGroupFP, BX_IA_ERROR, BxOpcodeInfo_FPGroupDD },
2520 /* DE /dm */ { BxGroupFP, BX_IA_ERROR, BxOpcodeInfo_FPGroupDE },
2521 /* DF /dm */ { BxGroupFP, BX_IA_ERROR, BxOpcodeInfo_FPGroupDF },
2522 /* E0 /dm */ { BxImmediate_BrOff8 | BxTraceEnd, BX_IA_LOOPNE64_Jb },
2523 /* E1 /dm */ { BxImmediate_BrOff8 | BxTraceEnd, BX_IA_LOOPE64_Jb },
2524 /* E2 /dm */ { BxImmediate_BrOff8 | BxTraceEnd, BX_IA_LOOP64_Jb },
2525 /* E3 /dm */ { BxImmediate_BrOff8 | BxTraceEnd, BX_IA_JRCXZ_Jb },
2526 /* E4 /dm */ { BxImmediate_Ib, BX_IA_IN_ALIb },
2527 /* E5 /dm */ { BxImmediate_Ib, BX_IA_IN_EAXIb },
2528 /* E6 /dm */ { BxImmediate_Ib, BX_IA_OUT_IbAL },
2529 /* E7 /dm */ { BxImmediate_Ib, BX_IA_OUT_IbEAX },
2530 /* E8 /dm */ { BxImmediate_BrOff32 | BxTraceEnd, BX_IA_CALL_Jq },
2531 /* E9 /dm */ { BxImmediate_BrOff32 | BxTraceEnd, BX_IA_JMP_Jq },
2532 /* EA /dm */ { 0, BX_IA_ERROR },
2533 /* EB /dm */ { BxImmediate_BrOff8 | BxTraceEnd, BX_IA_JMP_Jq },
2534 /* EC /dm */ { 0, BX_IA_IN_ALDX },
2535 /* ED /dm */ { 0, BX_IA_IN_EAXDX },
2536 /* EE /dm */ { 0, BX_IA_OUT_DXAL },
2537 /* EF /dm */ { 0, BX_IA_OUT_DXEAX },
2538 /* F0 /dm */ { 0, BX_IA_ERROR }, // LOCK:
2539 /* F1 /dm */ { BxTraceEnd, BX_IA_INT1 },
2540 /* F2 /dm */ { 0, BX_IA_ERROR }, // REPNE/REPNZ
2541 /* F3 /dm */ { 0, BX_IA_ERROR }, // REP,REPE/REPZ
2542 /* F4 /dm */ { BxTraceEnd, BX_IA_HLT },
2543 /* F5 /dm */ { 0, BX_IA_CMC },
2544 /* F6 /dm */ { BxGroup3, BX_IA_ERROR, BxOpcodeInfoG3EbM },
2545 /* F7 /dm */ { BxGroup3, BX_IA_ERROR, BxOpcodeInfoG3EdM },
2546 /* F8 /dm */ { 0, BX_IA_CLC },
2547 /* F9 /dm */ { 0, BX_IA_STC },
2548 /* FA /dm */ { 0, BX_IA_CLI },
2549 /* FB /dm */ { 0, BX_IA_STI },
2550 /* FC /dm */ { 0, BX_IA_CLD },
2551 /* FD /dm */ { 0, BX_IA_STD },
2552 /* FE /dm */ { BxGroup4, BX_IA_ERROR, BxOpcodeInfoG4M },
2553 /* FF /dm */ { BxGroup5, BX_IA_ERROR, BxOpcodeInfo64G5dM },
2555 /* 0F 00 /dm */ { BxGroup6, BX_IA_ERROR, BxOpcodeInfoG6 },
2556 /* 0F 01 /dm */ { BxGroup7, BX_IA_ERROR, BxOpcodeInfo64G7M },
2557 /* 0F 02 /dm */ { 0, BX_IA_LAR_GvEw },
2558 /* 0F 03 /dm */ { 0, BX_IA_LSL_GvEw },
2559 /* 0F 04 /dm */ { 0, BX_IA_ERROR },
2560 /* 0F 05 /dm */ { BxTraceEnd, BX_IA_SYSCALL },
2561 /* 0F 06 /dm */ { 0, BX_IA_CLTS },
2562 /* 0F 07 /dm */ { BxTraceEnd, BX_IA_SYSRET },
2563 /* 0F 08 /dm */ { BxTraceEnd, BX_IA_INVD },
2564 /* 0F 09 /dm */ { BxTraceEnd, BX_IA_WBINVD },
2565 /* 0F 0A /dm */ { 0, BX_IA_ERROR },
2566 /* 0F 0B /dm */ { BxTraceEnd, BX_IA_UD2A },
2567 /* 0F 0C /dm */ { 0, BX_IA_ERROR },
2568 /* 0F 0D /dm */ { 0, BX_IA_NOP }, // 3DNow! PREFETCH on AMD, NOP on Intel
2569 /* 0F 0E /dm */ { 0, BX_IA_FEMMS }, // 3DNow! FEMMS
2570 #if BX_SUPPORT_3DNOW
2571 /* 0F 0F /dm */ { BxImmediate_Ib, BX_IA_ERROR, Bx3DNowOpcodeInfo },
2572 #else
2573 /* 0F 0F /dm */ { 0, BX_IA_ERROR },
2574 #endif
2575 /* 0F 10 /dm */ { BxPrefixSSE, BX_IA_MOVUPS_VpsWps, BxOpcodeGroupSSE_0f10 },
2576 /* 0F 11 /dm */ { BxPrefixSSE, BX_IA_MOVUPS_WpsVps, BxOpcodeGroupSSE_0f11 },
2577 /* 0F 12 /dm */ { BxPrefixSSE, BX_IA_MOVLPS_VpsMq, BxOpcodeGroupSSE_0f12 },
2578 /* 0F 13 /dm */ { BxPrefixSSE, BX_IA_MOVLPS_MqVps, BxOpcodeGroupSSE_0f13M },
2579 /* 0F 14 /dm */ { BxPrefixSSE, BX_IA_UNPCKLPS_VpsWdq, BxOpcodeGroupSSE_0f14 },
2580 /* 0F 15 /dm */ { BxPrefixSSE, BX_IA_UNPCKHPS_VpsWdq, BxOpcodeGroupSSE_0f15 },
2581 /* 0F 16 /dm */ { BxPrefixSSE, BX_IA_MOVHPS_VpsMq, BxOpcodeGroupSSE_0f16 },
2582 /* 0F 17 /dm */ { BxPrefixSSE, BX_IA_MOVHPS_MqVps, BxOpcodeGroupSSE_0f17M },
2583 /* 0F 18 /dm */ { 0, BX_IA_PREFETCH }, // opcode group G16, PREFETCH hints
2584 /* 0F 19 /dm */ { 0, BX_IA_NOP }, // multi-byte NOP
2585 /* 0F 1A /dm */ { 0, BX_IA_NOP }, // multi-byte NOP
2586 /* 0F 1B /dm */ { 0, BX_IA_NOP }, // multi-byte NOP
2587 /* 0F 1C /dm */ { 0, BX_IA_NOP }, // multi-byte NOP
2588 /* 0F 1D /dm */ { 0, BX_IA_NOP }, // multi-byte NOP
2589 /* 0F 1E /dm */ { 0, BX_IA_NOP }, // multi-byte NOP
2590 /* 0F 1F /dm */ { 0, BX_IA_NOP }, // multi-byte NOP
2591 /* 0F 20 /dm */ { 0, BX_IA_MOV_RqCq },
2592 /* 0F 21 /dm */ { 0, BX_IA_MOV_RqDq },
2593 /* 0F 22 /dm */ { BxTraceEnd, BX_IA_MOV_CqRq },
2594 /* 0F 23 /dm */ { BxTraceEnd, BX_IA_MOV_DqRq },
2595 /* 0F 24 /dm */ { 0, BX_IA_ERROR },
2596 /* 0F 25 /dm */ { 0, BX_IA_ERROR },
2597 /* 0F 26 /dm */ { 0, BX_IA_ERROR },
2598 /* 0F 27 /dm */ { 0, BX_IA_ERROR },
2599 /* 0F 28 /dm */ { BxPrefixSSE, BX_IA_MOVAPS_VpsWps, BxOpcodeGroupSSE_0f28 },
2600 /* 0F 29 /dm */ { BxPrefixSSE, BX_IA_MOVAPS_WpsVps, BxOpcodeGroupSSE_0f29 },
2601 /* 0F 2A /dm */ { BxPrefixSSE, BX_IA_CVTPI2PS_VpsQq, BxOpcodeGroupSSE_0f2a },
2602 /* 0F 2B /dm */ { BxPrefixSSE, BX_IA_MOVNTPS_MpsVps, BxOpcodeGroupSSE_0f2bM },
2603 /* 0F 2C /dm */ { BxPrefixSSE, BX_IA_CVTTPS2PI_PqWps, BxOpcodeGroupSSE_0f2c },
2604 /* 0F 2D /dm */ { BxPrefixSSE, BX_IA_CVTPS2PI_PqWps, BxOpcodeGroupSSE_0f2d },
2605 /* 0F 2E /dm */ { BxPrefixSSE, BX_IA_UCOMISS_VssWss, BxOpcodeGroupSSE_0f2e },
2606 /* 0F 2F /dm */ { BxPrefixSSE, BX_IA_COMISS_VpsWps, BxOpcodeGroupSSE_0f2f },
2607 /* 0F 30 /dm */ { 0, BX_IA_WRMSR },
2608 /* 0F 31 /dm */ { 0, BX_IA_RDTSC },
2609 /* 0F 32 /dm */ { 0, BX_IA_RDMSR },
2610 /* 0F 33 /dm */ { 0, BX_IA_RDPMC },
2611 /* 0F 34 /dm */ { 0, BX_IA_SYSENTER },
2612 /* 0F 35 /dm */ { 0, BX_IA_SYSEXIT },
2613 /* 0F 36 /dm */ { 0, BX_IA_ERROR },
2614 /* 0F 37 /dm */ { 0, BX_IA_ERROR },
2615 #if (BX_SUPPORT_SSE >= 4) || (BX_SUPPORT_SSE >= 3 && BX_SUPPORT_SSE_EXTENSION > 0)
2616 /* 0F 38 /dm */ { Bx3ByteOp, BX_IA_ERROR, BxOpcode3ByteTable0f38 }, // 3-byte escape
2617 #else
2618 /* 0F 38 /dm */ { 0, BX_IA_ERROR },
2619 #endif
2620 /* 0F 39 /dm */ { 0, BX_IA_ERROR },
2621 #if (BX_SUPPORT_SSE >= 4) || (BX_SUPPORT_SSE >= 3 && BX_SUPPORT_SSE_EXTENSION > 0)
2622 /* 0F 3A /dm */ { Bx3ByteOp, BX_IA_ERROR, BxOpcode3ByteTable0f3a }, // 3-byte escape
2623 #else
2624 /* 0F 3A /dm */ { 0, BX_IA_ERROR },
2625 #endif
2626 /* 0F 3B /dm */ { 0, BX_IA_ERROR },
2627 /* 0F 3C /dm */ { 0, BX_IA_ERROR },
2628 /* 0F 3D /dm */ { 0, BX_IA_ERROR },
2629 /* 0F 3E /dm */ { 0, BX_IA_ERROR },
2630 /* 0F 3F /dm */ { 0, BX_IA_ERROR },
2631 /* 0F 40 /dm */ { 0, BX_IA_CMOVO_GdEdM },
2632 /* 0F 41 /dm */ { 0, BX_IA_CMOVNO_GdEdM },
2633 /* 0F 42 /dm */ { 0, BX_IA_CMOVB_GdEdM },
2634 /* 0F 43 /dm */ { 0, BX_IA_CMOVNB_GdEdM },
2635 /* 0F 44 /dm */ { 0, BX_IA_CMOVZ_GdEdM },
2636 /* 0F 45 /dm */ { 0, BX_IA_CMOVNZ_GdEdM },
2637 /* 0F 46 /dm */ { 0, BX_IA_CMOVBE_GdEdM },
2638 /* 0F 47 /dm */ { 0, BX_IA_CMOVNBE_GdEdM },
2639 /* 0F 48 /dm */ { 0, BX_IA_CMOVS_GdEdM },
2640 /* 0F 49 /dm */ { 0, BX_IA_CMOVNS_GdEdM },
2641 /* 0F 4A /dm */ { 0, BX_IA_CMOVP_GdEdM },
2642 /* 0F 4B /dm */ { 0, BX_IA_CMOVNP_GdEdM },
2643 /* 0F 4C /dm */ { 0, BX_IA_CMOVL_GdEdM },
2644 /* 0F 4D /dm */ { 0, BX_IA_CMOVNL_GdEdM },
2645 /* 0F 4E /dm */ { 0, BX_IA_CMOVLE_GdEdM },
2646 /* 0F 4F /dm */ { 0, BX_IA_CMOVNLE_GdEdM },
2647 /* 0F 50 /dm */ { BxPrefixSSE, BX_IA_MOVMSKPS_GdVRps, BxOpcodeGroupSSE_0f50 },
2648 /* 0F 51 /dm */ { BxPrefixSSE, BX_IA_SQRTPS_VpsWps, BxOpcodeGroupSSE_0f51 },
2649 /* 0F 52 /dm */ { BxPrefixSSE, BX_IA_RSQRTPS_VpsWps, BxOpcodeGroupSSE_0f52 },
2650 /* 0F 53 /dm */ { BxPrefixSSE, BX_IA_RCPPS_VpsWps, BxOpcodeGroupSSE_0f53 },
2651 /* 0F 54 /dm */ { BxPrefixSSE, BX_IA_ANDPS_VpsWps, BxOpcodeGroupSSE_0f54 },
2652 /* 0F 55 /dm */ { BxPrefixSSE, BX_IA_ANDNPS_VpsWps, BxOpcodeGroupSSE_0f55 },
2653 /* 0F 56 /dm */ { BxPrefixSSE, BX_IA_ORPS_VpsWps, BxOpcodeGroupSSE_0f56 },
2654 /* 0F 57 /dm */ { BxPrefixSSE, BX_IA_XORPS_VpsWps, BxOpcodeGroupSSE_0f57 },
2655 /* 0F 58 /dm */ { BxPrefixSSE, BX_IA_ADDPS_VpsWps, BxOpcodeGroupSSE_0f58 },
2656 /* 0F 59 /dm */ { BxPrefixSSE, BX_IA_MULPS_VpsWps, BxOpcodeGroupSSE_0f59 },
2657 /* 0F 5A /dm */ { BxPrefixSSE, BX_IA_CVTPS2PD_VpsWps, BxOpcodeGroupSSE_0f5a },
2658 /* 0F 5B /dm */ { BxPrefixSSE, BX_IA_CVTDQ2PS_VpsWdq, BxOpcodeGroupSSE_0f5b },
2659 /* 0F 5C /dm */ { BxPrefixSSE, BX_IA_SUBPS_VpsWps, BxOpcodeGroupSSE_0f5c },
2660 /* 0F 5D /dm */ { BxPrefixSSE, BX_IA_MINPS_VpsWps, BxOpcodeGroupSSE_0f5d },
2661 /* 0F 5E /dm */ { BxPrefixSSE, BX_IA_DIVPS_VpsWps, BxOpcodeGroupSSE_0f5e },
2662 /* 0F 5F /dm */ { BxPrefixSSE, BX_IA_MAXPS_VpsWps, BxOpcodeGroupSSE_0f5f },
2663 /* 0F 60 /dm */ { BxPrefixSSE, BX_IA_PUNPCKLBW_PqQd, BxOpcodeGroupSSE_0f60 },
2664 /* 0F 61 /dm */ { BxPrefixSSE, BX_IA_PUNPCKLWD_PqQd, BxOpcodeGroupSSE_0f61 },
2665 /* 0F 62 /dm */ { BxPrefixSSE, BX_IA_PUNPCKLDQ_PqQd, BxOpcodeGroupSSE_0f62 },
2666 /* 0F 63 /dm */ { BxPrefixSSE, BX_IA_PACKSSWB_PqQq, BxOpcodeGroupSSE_0f63 },
2667 /* 0F 64 /dm */ { BxPrefixSSE, BX_IA_PCMPGTB_PqQq, BxOpcodeGroupSSE_0f64 },
2668 /* 0F 65 /dm */ { BxPrefixSSE, BX_IA_PCMPGTW_PqQq, BxOpcodeGroupSSE_0f65 },
2669 /* 0F 66 /dm */ { BxPrefixSSE, BX_IA_PCMPGTD_PqQq, BxOpcodeGroupSSE_0f66 },
2670 /* 0F 67 /dm */ { BxPrefixSSE, BX_IA_PACKUSWB_PqQq, BxOpcodeGroupSSE_0f67 },
2671 /* 0F 68 /dm */ { BxPrefixSSE, BX_IA_PUNPCKHBW_PqQq, BxOpcodeGroupSSE_0f68 },
2672 /* 0F 69 /dm */ { BxPrefixSSE, BX_IA_PUNPCKHWD_PqQq, BxOpcodeGroupSSE_0f69 },
2673 /* 0F 6A /dm */ { BxPrefixSSE, BX_IA_PUNPCKHDQ_PqQq, BxOpcodeGroupSSE_0f6a },
2674 /* 0F 6B /dm */ { BxPrefixSSE, BX_IA_PACKSSDW_PqQq, BxOpcodeGroupSSE_0f6b },
2675 /* 0F 6C /dm */ { BxPrefixSSE, BX_IA_ERROR, BxOpcodeGroupSSE_0f6c },
2676 /* 0F 6D /dm */ { BxPrefixSSE, BX_IA_ERROR, BxOpcodeGroupSSE_0f6d },
2677 /* 0F 6E /dm */ { BxPrefixSSE, BX_IA_MOVD_PqEd, BxOpcodeGroupSSE_0f6e },
2678 /* 0F 6F /dm */ { BxPrefixSSE, BX_IA_MOVQ_PqQq, BxOpcodeGroupSSE_0f6f },
2679 /* 0F 70 /dm */ { BxPrefixSSE | BxImmediate_Ib, BX_IA_PSHUFW_PqQqIb, BxOpcodeGroupSSE_0f70 },
2680 /* 0F 71 /dm */ { 0, BX_IA_ERROR }, // SSE Group G12
2681 /* 0F 72 /dm */ { 0, BX_IA_ERROR }, // SSE Group G13
2682 /* 0F 73 /dm */ { 0, BX_IA_ERROR }, // SSE Group G14
2683 /* 0F 74 /dm */ { BxPrefixSSE, BX_IA_PCMPEQB_PqQq, BxOpcodeGroupSSE_0f74 },
2684 /* 0F 75 /dm */ { BxPrefixSSE, BX_IA_PCMPEQW_PqQq, BxOpcodeGroupSSE_0f75 },
2685 /* 0F 76 /dm */ { BxPrefixSSE, BX_IA_PCMPEQD_PqQq, BxOpcodeGroupSSE_0f76 },
2686 /* 0F 77 /dm */ { BxPrefixSSE, BX_IA_EMMS, BxOpcodeGroupSSE_ERR },
2687 /* 0F 78 /dm */ { 0, BX_IA_ERROR },
2688 /* 0F 79 /dm */ { 0, BX_IA_ERROR },
2689 /* 0F 7A /dm */ { 0, BX_IA_ERROR },
2690 /* 0F 7B /dm */ { 0, BX_IA_ERROR },
2691 /* 0F 7C /dm */ { BxPrefixSSE, BX_IA_ERROR, BxOpcodeGroupSSE_0f7c },
2692 /* 0F 7D /dm */ { BxPrefixSSE, BX_IA_ERROR, BxOpcodeGroupSSE_0f7d },
2693 /* 0F 7E /dm */ { BxPrefixSSE, BX_IA_MOVD_EdPd, BxOpcodeGroupSSE_0f7e },
2694 /* 0F 7F /dm */ { BxPrefixSSE, BX_IA_MOVQ_QqPq, BxOpcodeGroupSSE_0f7f },
2695 /* 0F 80 /dm */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JO_Jq },
2696 /* 0F 81 /dm */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JNO_Jq },
2697 /* 0F 82 /dm */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JB_Jq },
2698 /* 0F 83 /dm */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JNB_Jq },
2699 /* 0F 84 /dm */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JZ_Jq },
2700 /* 0F 85 /dm */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JNZ_Jq },
2701 /* 0F 86 /dm */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JBE_Jq },
2702 /* 0F 87 /dm */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JNBE_Jq },
2703 /* 0F 88 /dm */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JS_Jq },
2704 /* 0F 89 /dm */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JNS_Jq },
2705 /* 0F 8A /dm */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JP_Jq },
2706 /* 0F 8B /dm */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JNP_Jq },
2707 /* 0F 8C /dm */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JL_Jq },
2708 /* 0F 8D /dm */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JNL_Jq },
2709 /* 0F 8E /dm */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JLE_Jq },
2710 /* 0F 8F /dm */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JNLE_Jq },
2711 /* 0F 90 /dm */ { 0, BX_IA_SETO_EbM },
2712 /* 0F 91 /dm */ { 0, BX_IA_SETNO_EbM },
2713 /* 0F 92 /dm */ { 0, BX_IA_SETB_EbM },
2714 /* 0F 93 /dm */ { 0, BX_IA_SETNB_EbM },
2715 /* 0F 94 /dm */ { 0, BX_IA_SETZ_EbM },
2716 /* 0F 95 /dm */ { 0, BX_IA_SETNZ_EbM },
2717 /* 0F 96 /dm */ { 0, BX_IA_SETBE_EbM },
2718 /* 0F 97 /dm */ { 0, BX_IA_SETNBE_EbM },
2719 /* 0F 98 /dm */ { 0, BX_IA_SETS_EbM },
2720 /* 0F 99 /dm */ { 0, BX_IA_SETNS_EbM },
2721 /* 0F 9A /dm */ { 0, BX_IA_SETP_EbM },
2722 /* 0F 9B /dm */ { 0, BX_IA_SETNP_EbM },
2723 /* 0F 9C /dm */ { 0, BX_IA_SETL_EbM },
2724 /* 0F 9D /dm */ { 0, BX_IA_SETNL_EbM },
2725 /* 0F 9E /dm */ { 0, BX_IA_SETLE_EbM },
2726 /* 0F 9F /dm */ { 0, BX_IA_SETNLE_EbM },
2727 /* 0F A0 /dm */ { 0, BX_IA_PUSH64_FS },
2728 /* 0F A1 /dm */ { 0, BX_IA_POP64_FS },
2729 /* 0F A2 /dm */ { 0, BX_IA_CPUID },
2730 /* 0F A3 /dm */ { 0, BX_IA_BT_EdGdM },
2731 /* 0F A4 /dm */ { BxImmediate_Ib, BX_IA_SHLD_EdGdM },
2732 /* 0F A5 /dm */ { 0, BX_IA_SHLD_EdGdM },
2733 /* 0F A6 /dm */ { 0, BX_IA_ERROR },
2734 /* 0F A7 /dm */ { 0, BX_IA_ERROR },
2735 /* 0F A8 /dm */ { 0, BX_IA_PUSH64_GS },
2736 /* 0F A9 /dm */ { 0, BX_IA_POP64_GS },
2737 /* 0F AA /dm */ { BxTraceEnd, BX_IA_RSM },
2738 /* 0F AB /dm */ { BxLockable, BX_IA_BTS_EdGdM },
2739 /* 0F AC /dm */ { BxImmediate_Ib, BX_IA_SHRD_EdGdM },
2740 /* 0F AD /dm */ { 0, BX_IA_SHRD_EdGdM },
2741 /* 0F AE /dm */ { BxGroup15, BX_IA_ERROR, BxOpcodeInfoG15M },
2742 /* 0F AF /dm */ { 0, BX_IA_IMUL_GdEdM },
2743 /* 0F B0 /dm */ { BxLockable, BX_IA_CMPXCHG_EbGbM },
2744 /* 0F B1 /dm */ { BxLockable, BX_IA_CMPXCHG_EdGdM },
2745 /* 0F B2 /dm */ { 0, BX_IA_LSS_GdMp },
2746 /* 0F B3 /dm */ { BxLockable, BX_IA_BTR_EdGdM },
2747 /* 0F B4 /dm */ { 0, BX_IA_LFS_GdMp },
2748 /* 0F B5 /dm */ { 0, BX_IA_LGS_GdMp },
2749 /* 0F B6 /dm */ { 0, BX_IA_MOVZX_GdEbM },
2750 /* 0F B7 /dm */ { 0, BX_IA_MOVZX_GdEwM },
2751 /* 0F B8 /dm */ { BxPrefixSSE, BX_IA_ERROR, BxOpcodeGroupSSE_0fb8dM },
2752 /* 0F B9 /dm */ { BxTraceEnd, BX_IA_UD2B },
2753 /* 0F BA /dm */ { BxGroup8, BX_IA_ERROR, BxOpcodeInfoG8EdIbM },
2754 /* 0F BB /dm */ { BxLockable, BX_IA_BTC_EdGdM },
2755 /* 0F BC /dm */ { 0, BX_IA_BSF_GdEdM },
2756 /* 0F BD /dm */ { 0, BX_IA_BSR_GdEdM },
2757 /* 0F BE /dm */ { 0, BX_IA_MOVSX_GdEbM },
2758 /* 0F BF /dm */ { 0, BX_IA_MOVSX_GdEwM },
2759 /* 0F C0 /dm */ { BxLockable, BX_IA_XADD_EbGbM },
2760 /* 0F C1 /dm */ { BxLockable, BX_IA_XADD_EdGdM },
2761 /* 0F C2 /dm */ { BxPrefixSSE | BxImmediate_Ib, BX_IA_CMPPS_VpsWpsIb, BxOpcodeGroupSSE_0fc2 },
2762 /* 0F C3 /dm */ { BxPrefixSSE, BX_IA_MOVNTI_MdGd, BxOpcodeGroupSSE_ERR },
2763 /* 0F C4 /dm */ { BxPrefixSSE | BxImmediate_Ib, BX_IA_PINSRW_PqEwIb, BxOpcodeGroupSSE_0fc4 },
2764 /* 0F C5 /dm */ { 0, BX_IA_ERROR }, // PEXTRW SSE group
2765 /* 0F C6 /dm */ { BxPrefixSSE | BxImmediate_Ib, BX_IA_SHUFPS_VpsWpsIb, BxOpcodeGroupSSE_0fc6 },
2766 /* 0F C7 /dm */ { BxGroup9, BX_IA_ERROR, BxOpcodeInfoG9M },
2767 /* 0F C8 /dm */ { 0, BX_IA_BSWAP_ERX },
2768 /* 0F C9 /dm */ { 0, BX_IA_BSWAP_ERX },
2769 /* 0F CA /dm */ { 0, BX_IA_BSWAP_ERX },
2770 /* 0F CB /dm */ { 0, BX_IA_BSWAP_ERX },
2771 /* 0F CC /dm */ { 0, BX_IA_BSWAP_ERX },
2772 /* 0F CD /dm */ { 0, BX_IA_BSWAP_ERX },
2773 /* 0F CE /dm */ { 0, BX_IA_BSWAP_ERX },
2774 /* 0F CF /dm */ { 0, BX_IA_BSWAP_ERX },
2775 /* 0F D0 /dm */ { BxPrefixSSE, BX_IA_ERROR, BxOpcodeGroupSSE_0fd0 },
2776 /* 0F D1 /dm */ { BxPrefixSSE, BX_IA_PSRLW_PqQq, BxOpcodeGroupSSE_0fd1 },
2777 /* 0F D2 /dm */ { BxPrefixSSE, BX_IA_PSRLD_PqQq, BxOpcodeGroupSSE_0fd2 },
2778 /* 0F D3 /dm */ { BxPrefixSSE, BX_IA_PSRLQ_PqQq, BxOpcodeGroupSSE_0fd3 },
2779 /* 0F D4 /dm */ { BxPrefixSSE, BX_IA_PADDQ_PqQq, BxOpcodeGroupSSE_0fd4 },
2780 /* 0F D5 /dm */ { BxPrefixSSE, BX_IA_PMULLW_PqQq, BxOpcodeGroupSSE_0fd5 },
2781 /* 0F D6 /dm */ { BxPrefixSSE, BX_IA_ERROR, BxOpcodeGroupSSE_0fd6 },
2782 /* 0F D7 /dm */ { BxPrefixSSE, BX_IA_PMOVMSKB_GdPRq, BxOpcodeGroupSSE_0fd7 },
2783 /* 0F D8 /dm */ { BxPrefixSSE, BX_IA_PSUBUSB_PqQq, BxOpcodeGroupSSE_0fd8 },
2784 /* 0F D9 /dm */ { BxPrefixSSE, BX_IA_PSUBUSW_PqQq, BxOpcodeGroupSSE_0fd9 },
2785 /* 0F DA /dm */ { BxPrefixSSE, BX_IA_PMINUB_PqQq, BxOpcodeGroupSSE_0fda },
2786 /* 0F DB /dm */ { BxPrefixSSE, BX_IA_PAND_PqQq, BxOpcodeGroupSSE_0fdb },
2787 /* 0F DC /dm */ { BxPrefixSSE, BX_IA_PADDUSB_PqQq, BxOpcodeGroupSSE_0fdc },
2788 /* 0F DD /dm */ { BxPrefixSSE, BX_IA_PADDUSW_PqQq, BxOpcodeGroupSSE_0fdd },
2789 /* 0F DE /dm */ { BxPrefixSSE, BX_IA_PMAXUB_PqQq, BxOpcodeGroupSSE_0fde },
2790 /* 0F DF /dm */ { BxPrefixSSE, BX_IA_PANDN_PqQq, BxOpcodeGroupSSE_0fdf },
2791 /* 0F E0 /dm */ { BxPrefixSSE, BX_IA_PAVGB_PqQq, BxOpcodeGroupSSE_0fe0 },
2792 /* 0F E1 /dm */ { BxPrefixSSE, BX_IA_PSRAW_PqQq, BxOpcodeGroupSSE_0fe1 },
2793 /* 0F E2 /dm */ { BxPrefixSSE, BX_IA_PSRAD_PqQq, BxOpcodeGroupSSE_0fe2 },
2794 /* 0F E3 /dm */ { BxPrefixSSE, BX_IA_PAVGW_PqQq, BxOpcodeGroupSSE_0fe3 },
2795 /* 0F E4 /dm */ { BxPrefixSSE, BX_IA_PMULHUW_PqQq, BxOpcodeGroupSSE_0fe4 },
2796 /* 0F E5 /dm */ { BxPrefixSSE, BX_IA_PMULHW_PqQq, BxOpcodeGroupSSE_0fe5 },
2797 /* 0F E6 /dm */ { BxPrefixSSE, BX_IA_ERROR, BxOpcodeGroupSSE_0fe6 },
2798 /* 0F E7 /dm */ { BxPrefixSSE, BX_IA_MOVNTQ_MqPq, BxOpcodeGroupSSE_0fe7M },
2799 /* 0F E8 /dm */ { BxPrefixSSE, BX_IA_PSUBSB_PqQq, BxOpcodeGroupSSE_0fe8 },
2800 /* 0F E9 /dm */ { BxPrefixSSE, BX_IA_PSUBSW_PqQq, BxOpcodeGroupSSE_0fe9 },
2801 /* 0F EA /dm */ { BxPrefixSSE, BX_IA_PMINSW_PqQq, BxOpcodeGroupSSE_0fea },
2802 /* 0F EB /dm */ { BxPrefixSSE, BX_IA_POR_PqQq, BxOpcodeGroupSSE_0feb },
2803 /* 0F EC /dm */ { BxPrefixSSE, BX_IA_PADDSB_PqQq, BxOpcodeGroupSSE_0fec },
2804 /* 0F ED /dm */ { BxPrefixSSE, BX_IA_PADDSW_PqQq, BxOpcodeGroupSSE_0fed },
2805 /* 0F EE /dm */ { BxPrefixSSE, BX_IA_PMAXSW_PqQq, BxOpcodeGroupSSE_0fee },
2806 /* 0F EF /dm */ { BxPrefixSSE, BX_IA_PXOR_PqQq, BxOpcodeGroupSSE_0fef },
2807 /* 0F F0 /dm */ { BxPrefixSSE, BX_IA_ERROR, BxOpcodeGroupSSE_0ff0M },
2808 /* 0F F1 /dm */ { BxPrefixSSE, BX_IA_PSLLW_PqQq, BxOpcodeGroupSSE_0ff1 },
2809 /* 0F F2 /dm */ { BxPrefixSSE, BX_IA_PSLLD_PqQq, BxOpcodeGroupSSE_0ff2 },
2810 /* 0F F3 /dm */ { BxPrefixSSE, BX_IA_PSLLQ_PqQq, BxOpcodeGroupSSE_0ff3 },
2811 /* 0F F4 /dm */ { BxPrefixSSE, BX_IA_PMULUDQ_PqQq, BxOpcodeGroupSSE_0ff4 },
2812 /* 0F F5 /dm */ { BxPrefixSSE, BX_IA_PMADDWD_PqQq, BxOpcodeGroupSSE_0ff5 },
2813 /* 0F F6 /dm */ { BxPrefixSSE, BX_IA_PSADBW_PqQq, BxOpcodeGroupSSE_0ff6 },
2814 /* 0F F7 /dm */ { 0, BX_IA_ERROR }, // MASKMOV SSE group
2815 /* 0F F8 /dm */ { BxPrefixSSE, BX_IA_PSUBB_PqQq, BxOpcodeGroupSSE_0ff8 },
2816 /* 0F F9 /dm */ { BxPrefixSSE, BX_IA_PSUBW_PqQq, BxOpcodeGroupSSE_0ff9 },
2817 /* 0F FA /dm */ { BxPrefixSSE, BX_IA_PSUBD_PqQq, BxOpcodeGroupSSE_0ffa },
2818 /* 0F FB /dm */ { BxPrefixSSE, BX_IA_PSUBQ_PqQq, BxOpcodeGroupSSE_0ffb },
2819 /* 0F FC /dm */ { BxPrefixSSE, BX_IA_PADDB_PqQq, BxOpcodeGroupSSE_0ffc },
2820 /* 0F FD /dm */ { BxPrefixSSE, BX_IA_PADDW_PqQq, BxOpcodeGroupSSE_0ffd },
2821 /* 0F FE /dm */ { BxPrefixSSE, BX_IA_PADDD_PqQq, BxOpcodeGroupSSE_0ffe },
2822 /* 0F FF /dm */ { 0, BX_IA_ERROR },
2824 // 512 entries for 64bit operand size
2825 /* 00 /qm */ { BxLockable, BX_IA_ADD_EbGbM },
2826 /* 01 /qm */ { BxLockable, BX_IA_ADD_EqGqM },
2827 /* 02 /qm */ { 0, BX_IA_ADD_GbEbM },
2828 /* 03 /qm */ { 0, BX_IA_ADD_GqEqM },
2829 /* 04 /qm */ { BxImmediate_Ib, BX_IA_ADD_ALIb },
2830 /* 05 /qm */ { BxImmediate_Id, BX_IA_ADD_RAXId },
2831 /* 06 /qm */ { 0, BX_IA_ERROR },
2832 /* 07 /qm */ { 0, BX_IA_ERROR },
2833 /* 08 /qm */ { BxLockable, BX_IA_OR_EbGbM },
2834 /* 09 /qm */ { BxLockable, BX_IA_OR_EqGqM },
2835 /* 0A /qm */ { 0, BX_IA_OR_GbEbM },
2836 /* 0B /qm */ { 0, BX_IA_OR_GqEqM },
2837 /* 0C /qm */ { BxImmediate_Ib, BX_IA_OR_ALIb },
2838 /* 0D /qm */ { BxImmediate_Id, BX_IA_OR_RAXId },
2839 /* 0E /qm */ { 0, BX_IA_ERROR },
2840 /* 0F /qm */ { 0, BX_IA_ERROR }, // 2-byte escape
2841 /* 10 /qm */ { BxLockable, BX_IA_ADC_EbGbM },
2842 /* 11 /qm */ { BxLockable, BX_IA_ADC_EqGqM },
2843 /* 12 /qm */ { 0, BX_IA_ADC_GbEbM },
2844 /* 13 /qm */ { 0, BX_IA_ADC_GqEqM },
2845 /* 14 /qm */ { BxImmediate_Ib, BX_IA_ADC_ALIb },
2846 /* 15 /qm */ { BxImmediate_Id, BX_IA_ADC_RAXId },
2847 /* 16 /qm */ { 0, BX_IA_ERROR },
2848 /* 17 /qm */ { 0, BX_IA_ERROR },
2849 /* 18 /qm */ { BxLockable, BX_IA_SBB_EbGbM },
2850 /* 19 /qm */ { BxLockable, BX_IA_SBB_EqGqM },
2851 /* 1A /qm */ { 0, BX_IA_SBB_GbEbM },
2852 /* 1B /qm */ { 0, BX_IA_SBB_GqEqM },
2853 /* 1C /qm */ { BxImmediate_Ib, BX_IA_SBB_ALIb },
2854 /* 1D /qm */ { BxImmediate_Id, BX_IA_SBB_RAXId },
2855 /* 1E /qm */ { 0, BX_IA_ERROR },
2856 /* 1F /qm */ { 0, BX_IA_ERROR },
2857 /* 20 /qm */ { BxLockable, BX_IA_AND_EbGbM },
2858 /* 21 /qm */ { BxLockable, BX_IA_AND_EqGqM },
2859 /* 22 /qm */ { 0, BX_IA_AND_GbEbM },
2860 /* 23 /qm */ { 0, BX_IA_AND_GqEqM },
2861 /* 24 /qm */ { BxImmediate_Ib, BX_IA_AND_ALIb },
2862 /* 25 /qm */ { BxImmediate_Id, BX_IA_AND_RAXId },
2863 /* 26 /qm */ { 0, BX_IA_ERROR }, // ES:
2864 /* 27 /qm */ { 0, BX_IA_ERROR },
2865 /* 28 /qm */ { BxLockable, BX_IA_SUB_EbGbM },
2866 /* 29 /qm */ { BxLockable, BX_IA_SUB_EqGqM },
2867 /* 2A /qm */ { 0, BX_IA_SUB_GbEbM },
2868 /* 2B /qm */ { 0, BX_IA_SUB_GqEqM },
2869 /* 2C /qm */ { BxImmediate_Ib, BX_IA_SUB_ALIb },
2870 /* 2D /qm */ { BxImmediate_Id, BX_IA_SUB_RAXId },
2871 /* 2E /qm */ { 0, BX_IA_ERROR }, // CS:
2872 /* 2F /qm */ { 0, BX_IA_ERROR },
2873 /* 30 /qm */ { BxLockable, BX_IA_XOR_EbGbM },
2874 /* 31 /qm */ { BxLockable, BX_IA_XOR_EqGqM },
2875 /* 32 /qm */ { 0, BX_IA_XOR_GbEbM },
2876 /* 33 /qm */ { 0, BX_IA_XOR_GqEqM },
2877 /* 34 /qm */ { BxImmediate_Ib, BX_IA_XOR_ALIb },
2878 /* 35 /qm */ { BxImmediate_Id, BX_IA_XOR_RAXId },
2879 /* 36 /qm */ { 0, BX_IA_ERROR }, // SS:
2880 /* 37 /qm */ { 0, BX_IA_ERROR },
2881 /* 38 /qm */ { 0, BX_IA_CMP_EbGbM },
2882 /* 39 /qm */ { 0, BX_IA_CMP_EqGqM },
2883 /* 3A /qm */ { 0, BX_IA_CMP_GbEbM },
2884 /* 3B /qm */ { 0, BX_IA_CMP_GqEqM },
2885 /* 3C /qm */ { BxImmediate_Ib, BX_IA_CMP_ALIb },
2886 /* 3D /qm */ { BxImmediate_Id, BX_IA_CMP_RAXId },
2887 /* 3E /qm */ { 0, BX_IA_ERROR }, // DS:
2888 /* 3F /qm */ { 0, BX_IA_ERROR },
2889 /* 40 /qm */ { 0, BX_IA_ERROR }, // REX:
2890 /* 41 /qm */ { 0, BX_IA_ERROR }, // REX:
2891 /* 42 /qm */ { 0, BX_IA_ERROR }, // REX:
2892 /* 43 /qm */ { 0, BX_IA_ERROR }, // REX:
2893 /* 44 /qm */ { 0, BX_IA_ERROR }, // REX:
2894 /* 45 /qm */ { 0, BX_IA_ERROR }, // REX:
2895 /* 46 /qm */ { 0, BX_IA_ERROR }, // REX:
2896 /* 47 /qm */ { 0, BX_IA_ERROR }, // REX:
2897 /* 48 /qm */ { 0, BX_IA_ERROR }, // REX:
2898 /* 49 /qm */ { 0, BX_IA_ERROR }, // REX:
2899 /* 4A /qm */ { 0, BX_IA_ERROR }, // REX:
2900 /* 4B /qm */ { 0, BX_IA_ERROR }, // REX:
2901 /* 4C /qm */ { 0, BX_IA_ERROR }, // REX:
2902 /* 4D /qm */ { 0, BX_IA_ERROR }, // REX:
2903 /* 4E /qm */ { 0, BX_IA_ERROR }, // REX:
2904 /* 4F /qm */ { 0, BX_IA_ERROR }, // REX:
2905 /* 50 /qm */ { 0, BX_IA_PUSH_RRX },
2906 /* 51 /qm */ { 0, BX_IA_PUSH_RRX },
2907 /* 52 /qm */ { 0, BX_IA_PUSH_RRX },
2908 /* 53 /qm */ { 0, BX_IA_PUSH_RRX },
2909 /* 54 /qm */ { 0, BX_IA_PUSH_RRX },
2910 /* 55 /qm */ { 0, BX_IA_PUSH_RRX },
2911 /* 56 /qm */ { 0, BX_IA_PUSH_RRX },
2912 /* 57 /qm */ { 0, BX_IA_PUSH_RRX },
2913 /* 58 /qm */ { 0, BX_IA_POP_RRX },
2914 /* 59 /qm */ { 0, BX_IA_POP_RRX },
2915 /* 5A /qm */ { 0, BX_IA_POP_RRX },
2916 /* 5B /qm */ { 0, BX_IA_POP_RRX },
2917 /* 5C /qm */ { 0, BX_IA_POP_RRX },
2918 /* 5D /qm */ { 0, BX_IA_POP_RRX },
2919 /* 5E /qm */ { 0, BX_IA_POP_RRX },
2920 /* 5F /qm */ { 0, BX_IA_POP_RRX },
2921 /* 60 /qm */ { 0, BX_IA_ERROR },
2922 /* 61 /qm */ { 0, BX_IA_ERROR },
2923 /* 62 /qm */ { 0, BX_IA_ERROR },
2924 /* 63 /qm */ { 0, BX_IA_MOVSX_GqEdM },
2925 /* 64 /qm */ { 0, BX_IA_ERROR }, // FS:
2926 /* 65 /qm */ { 0, BX_IA_ERROR }, // GS:
2927 /* 66 /qm */ { 0, BX_IA_ERROR }, // OS:
2928 /* 67 /qm */ { 0, BX_IA_ERROR }, // AS:
2929 /* 68 /qm */ { BxImmediate_Id, BX_IA_PUSH64_Id },
2930 /* 69 /qm */ { BxImmediate_Id, BX_IA_IMUL_GqEqIdM },
2931 /* 6A /qm */ { BxImmediate_Ib_SE, BX_IA_PUSH64_Id },
2932 /* 6B /qm */ { BxImmediate_Ib_SE, BX_IA_IMUL_GqEqIdM },
2933 /* 6C /qm */ { 0, BX_IA_REP_INSB_YbDX },
2934 /* 6D /qm */ { 0, BX_IA_REP_INSD_YdDX },
2935 /* 6E /qm */ { 0, BX_IA_REP_OUTSB_DXXb },
2936 /* 6F /qm */ { 0, BX_IA_REP_OUTSD_DXXd },
2937 /* 70 /qm */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JO_Jq },
2938 /* 71 /qm */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JNO_Jq },
2939 /* 72 /qm */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JB_Jq },
2940 /* 73 /qm */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JNB_Jq },
2941 /* 74 /qm */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JZ_Jq },
2942 /* 75 /qm */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JNZ_Jq },
2943 /* 76 /qm */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JBE_Jq },
2944 /* 77 /qm */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JNBE_Jq },
2945 /* 78 /qm */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JS_Jq },
2946 /* 79 /qm */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JNS_Jq },
2947 /* 7A /qm */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JP_Jq },
2948 /* 7B /qm */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JNP_Jq },
2949 /* 7C /qm */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JL_Jq },
2950 /* 7D /qm */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JNL_Jq },
2951 /* 7E /qm */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JLE_Jq },
2952 /* 7F /qm */ { BxImmediate_BrOff8 | BxTraceJCC, BX_IA_JNLE_Jq },
2953 /* 80 /qm */ { BxGroup1 | BxImmediate_Ib, BX_IA_ERROR, BxOpcodeInfoG1EbIbM },
2954 /* 81 /qm */ { BxGroup1 | BxImmediate_Id, BX_IA_ERROR, BxOpcodeInfo64G1EqM },
2955 /* 82 /qm */ { 0, BX_IA_ERROR },
2956 /* 83 /qm */ { BxGroup1 | BxImmediate_Ib_SE, BX_IA_ERROR, BxOpcodeInfo64G1EqM },
2957 /* 84 /qm */ { 0, BX_IA_TEST_EbGbM },
2958 /* 85 /qm */ { 0, BX_IA_TEST_EqGqM },
2959 /* 86 /qm */ { BxLockable, BX_IA_XCHG_EbGbM },
2960 /* 87 /qm */ { BxLockable, BX_IA_XCHG_EqGqM },
2961 /* 88 /qm */ { 0, BX_IA_MOV_EbGbM },
2962 /* 89 /qm */ { 0, BX_IA_MOV_EqGqM },
2963 /* 8A /qm */ { 0, BX_IA_MOV_GbEbM },
2964 /* 8B /qm */ { 0, BX_IA_MOV_GqEqM },
2965 /* 8C /qm */ { 0, BX_IA_MOV_EwSwM },
2966 /* 8D /qm */ { 0, BX_IA_LEA_GqM },
2967 /* 8E /qm */ { 0, BX_IA_MOV_SwEw },
2968 /* 8F /qm */ { BxGroup1A, BX_IA_ERROR, BxOpcodeInfo64G1AEqM },
2969 /* 90 /qm */ { 0, BX_IA_XCHG_RRXRAX }, // handles XCHG R8, RAX
2970 /* 91 /qm */ { 0, BX_IA_XCHG_RRXRAX },
2971 /* 92 /qm */ { 0, BX_IA_XCHG_RRXRAX },
2972 /* 93 /qm */ { 0, BX_IA_XCHG_RRXRAX },
2973 /* 94 /qm */ { 0, BX_IA_XCHG_RRXRAX },
2974 /* 95 /qm */ { 0, BX_IA_XCHG_RRXRAX },
2975 /* 96 /qm */ { 0, BX_IA_XCHG_RRXRAX },
2976 /* 97 /qm */ { 0, BX_IA_XCHG_RRXRAX },
2977 /* 98 /qm */ { 0, BX_IA_CDQE },
2978 /* 99 /qm */ { 0, BX_IA_CQO },
2979 /* 9A /qm */ { 0, BX_IA_ERROR },
2980 /* 9B /qm */ { 0, BX_IA_FWAIT },
2981 /* 9C /qm */ { 0, BX_IA_PUSHF_Fq },
2982 /* 9D /qm */ { 0, BX_IA_POPF_Fq },
2983 /* 9E /qm */ { 0, BX_IA_SAHF },
2984 /* 9F /qm */ { 0, BX_IA_LAHF },
2985 /* A0 /qm */ { BxImmediate_O, BX_IA_MOV_ALOq },
2986 /* A1 /qm */ { BxImmediate_O, BX_IA_MOV_RAXOq },
2987 /* A2 /qm */ { BxImmediate_O, BX_IA_MOV_OqAL },
2988 /* A3 /qm */ { BxImmediate_O, BX_IA_MOV_OqRAX },
2989 /* A4 /qm */ { 0, BX_IA_REP_MOVSB_XbYb },
2990 /* A5 /qm */ { 0, BX_IA_REP_MOVSQ_XqYq },
2991 /* A6 /qm */ { 0, BX_IA_REP_CMPSB_XbYb },
2992 /* A7 /qm */ { 0, BX_IA_REP_CMPSQ_XqYq },
2993 /* A8 /qm */ { BxImmediate_Ib, BX_IA_TEST_ALIb },
2994 /* A9 /qm */ { BxImmediate_Id, BX_IA_TEST_RAXId },
2995 /* AA /qm */ { 0, BX_IA_REP_STOSB_YbAL },
2996 /* AB /qm */ { 0, BX_IA_REP_STOSQ_YqRAX },
2997 /* AC /qm */ { 0, BX_IA_REP_LODSB_ALXb },
2998 /* AD /qm */ { 0, BX_IA_REP_LODSQ_RAXXq },
2999 /* AE /qm */ { 0, BX_IA_REP_SCASB_ALXb },
3000 /* AF /qm */ { 0, BX_IA_REP_SCASQ_RAXXq },
3001 /* B0 /qm */ { BxImmediate_Ib, BX_IA_MOV_RLIb },
3002 /* B1 /qm */ { BxImmediate_Ib, BX_IA_MOV_RLIb },
3003 /* B2 /qm */ { BxImmediate_Ib, BX_IA_MOV_RLIb },
3004 /* B3 /qm */ { BxImmediate_Ib, BX_IA_MOV_RLIb },
3005 /* B4 /qm */ { BxImmediate_Ib, BX_IA_MOV_RLIb },
3006 /* B5 /qm */ { BxImmediate_Ib, BX_IA_MOV_RLIb },
3007 /* B6 /qm */ { BxImmediate_Ib, BX_IA_MOV_RLIb },
3008 /* B7 /qm */ { BxImmediate_Ib, BX_IA_MOV_RLIb },
3009 /* B8 /qm */ { BxImmediate_Iq, BX_IA_MOV_RRXIq },
3010 /* B9 /qm */ { BxImmediate_Iq, BX_IA_MOV_RRXIq },
3011 /* BA /qm */ { BxImmediate_Iq, BX_IA_MOV_RRXIq },
3012 /* BB /qm */ { BxImmediate_Iq, BX_IA_MOV_RRXIq },
3013 /* BC /qm */ { BxImmediate_Iq, BX_IA_MOV_RRXIq },
3014 /* BD /qm */ { BxImmediate_Iq, BX_IA_MOV_RRXIq },
3015 /* BE /qm */ { BxImmediate_Iq, BX_IA_MOV_RRXIq },
3016 /* BF /qm */ { BxImmediate_Iq, BX_IA_MOV_RRXIq },
3017 /* C0 /qm */ { BxGroup2 | BxImmediate_Ib, BX_IA_ERROR, BxOpcodeInfoG2Eb },
3018 /* C1 /qm */ { BxGroup2 | BxImmediate_Ib, BX_IA_ERROR, BxOpcodeInfo64G2EqM },
3019 /* C2 /qm */ { BxImmediate_Iw | BxTraceEnd, BX_IA_RETnear64_Iw },
3020 /* C3 /qm */ { BxTraceEnd, BX_IA_RETnear64 },
3021 /* C4 /qm */ { 0, BX_IA_ERROR },
3022 /* C5 /qm */ { 0, BX_IA_ERROR },
3023 /* C6 /qm */ { BxGroup11, BX_IA_ERROR, BxOpcodeInfoG11EbM },
3024 /* C7 /qm */ { BxGroup11, BX_IA_ERROR, BxOpcodeInfo64G11EqM },
3025 /* C8 /qm */ { BxImmediate_IwIb, BX_IA_ENTER64_IwIb },
3026 /* C9 /qm */ { 0, BX_IA_LEAVE64 },
3027 /* CA /qm */ { BxImmediate_Iw | BxTraceEnd, BX_IA_RETfar64_Iw },
3028 /* CB /qm */ { BxTraceEnd, BX_IA_RETfar64 },
3029 /* CC /qm */ { BxTraceEnd, BX_IA_INT3 },
3030 /* CD /qm */ { BxImmediate_Ib | BxTraceEnd, BX_IA_INT_Ib },
3031 /* CE /qm */ { 0, BX_IA_ERROR },
3032 /* CF /qm */ { BxTraceEnd, BX_IA_IRET64 },
3033 /* D0 /qm */ { BxGroup2 | BxImmediate_I1, BX_IA_ERROR, BxOpcodeInfoG2Eb },
3034 /* D1 /qm */ { BxGroup2 | BxImmediate_I1, BX_IA_ERROR, BxOpcodeInfo64G2EqM },
3035 /* D2 /qm */ { BxGroup2, BX_IA_ERROR, BxOpcodeInfoG2Eb },
3036 /* D3 /qm */ { BxGroup2, BX_IA_ERROR, BxOpcodeInfo64G2EqM },
3037 /* D4 /qm */ { 0, BX_IA_ERROR },
3038 /* D5 /qm */ { 0, BX_IA_ERROR },
3039 /* D6 /qm */ { 0, BX_IA_ERROR },
3040 /* D7 /qm */ { 0, BX_IA_XLAT },
3041 /* D8 /qm */ { BxGroupFP, BX_IA_ERROR, BxOpcodeInfo_FPGroupD8 },
3042 /* D9 /qm */ { BxGroupFP, BX_IA_ERROR, BxOpcodeInfo_FPGroupD9 },
3043 /* DA /qm */ { BxGroupFP, BX_IA_ERROR, BxOpcodeInfo_FPGroupDA },
3044 /* DB /qm */ { BxGroupFP, BX_IA_ERROR, BxOpcodeInfo_FPGroupDB },
3045 /* DC /qm */ { BxGroupFP, BX_IA_ERROR, BxOpcodeInfo_FPGroupDC },
3046 /* DD /qm */ { BxGroupFP, BX_IA_ERROR, BxOpcodeInfo_FPGroupDD },
3047 /* DE /qm */ { BxGroupFP, BX_IA_ERROR, BxOpcodeInfo_FPGroupDE },
3048 /* DF /qm */ { BxGroupFP, BX_IA_ERROR, BxOpcodeInfo_FPGroupDF },
3049 /* E0 /qm */ { BxImmediate_BrOff8 | BxTraceEnd, BX_IA_LOOPNE64_Jb },
3050 /* E1 /qm */ { BxImmediate_BrOff8 | BxTraceEnd, BX_IA_LOOPE64_Jb },
3051 /* E2 /qm */ { BxImmediate_BrOff8 | BxTraceEnd, BX_IA_LOOP64_Jb },
3052 /* E3 /qm */ { BxImmediate_BrOff8 | BxTraceEnd, BX_IA_JRCXZ_Jb },
3053 /* E4 /qm */ { BxImmediate_Ib, BX_IA_IN_ALIb },
3054 /* E5 /qm */ { BxImmediate_Ib, BX_IA_IN_EAXIb },
3055 /* E6 /qm */ { BxImmediate_Ib, BX_IA_OUT_IbAL },
3056 /* E7 /qm */ { BxImmediate_Ib, BX_IA_OUT_IbEAX },
3057 /* E8 /qm */ { BxImmediate_BrOff32 | BxTraceEnd, BX_IA_CALL_Jq },
3058 /* E9 /qm */ { BxImmediate_BrOff32 | BxTraceEnd, BX_IA_JMP_Jq },
3059 /* EA /qm */ { 0, BX_IA_ERROR },
3060 /* EB /qm */ { BxImmediate_BrOff8 | BxTraceEnd, BX_IA_JMP_Jq },
3061 /* EC /qm */ { 0, BX_IA_IN_ALDX },
3062 /* ED /qm */ { 0, BX_IA_IN_EAXDX },
3063 /* EE /qm */ { 0, BX_IA_OUT_DXAL },
3064 /* EF /qm */ { 0, BX_IA_OUT_DXEAX },
3065 /* F0 /qm */ { 0, BX_IA_ERROR }, // LOCK:
3066 /* F1 /qm */ { BxTraceEnd, BX_IA_INT1 },
3067 /* F2 /qm */ { 0, BX_IA_ERROR }, // REPNE/REPNZ
3068 /* F3 /qm */ { 0, BX_IA_ERROR }, // REP,REPE/REPZ
3069 /* F4 /qm */ { BxTraceEnd, BX_IA_HLT },
3070 /* F5 /qm */ { 0, BX_IA_CMC },
3071 /* F6 /qm */ { BxGroup3, BX_IA_ERROR, BxOpcodeInfoG3EbM },
3072 /* F7 /qm */ { BxGroup3, BX_IA_ERROR, BxOpcodeInfo64G3EqM },
3073 /* F8 /qm */ { 0, BX_IA_CLC },
3074 /* F9 /qm */ { 0, BX_IA_STC },
3075 /* FA /qm */ { 0, BX_IA_CLI },
3076 /* FB /qm */ { 0, BX_IA_STI },
3077 /* FC /qm */ { 0, BX_IA_CLD },
3078 /* FD /qm */ { 0, BX_IA_STD },
3079 /* FE /qm */ { BxGroup4, BX_IA_ERROR, BxOpcodeInfoG4M },
3080 /* FF /qm */ { BxGroup5, BX_IA_ERROR, BxOpcodeInfo64G5qM },
3082 /* 0F 00 /qm */ { BxGroup6, BX_IA_ERROR, BxOpcodeInfoG6 },
3083 /* 0F 01 /qm */ { BxGroup7, BX_IA_ERROR, BxOpcodeInfo64G7M },
3084 /* 0F 02 /qm */ { 0, BX_IA_LAR_GvEw },
3085 /* 0F 03 /qm */ { 0, BX_IA_LSL_GvEw },
3086 /* 0F 04 /qm */ { 0, BX_IA_ERROR },
3087 /* 0F 05 /qm */ { BxTraceEnd, BX_IA_SYSCALL },
3088 /* 0F 06 /qm */ { 0, BX_IA_CLTS },
3089 /* 0F 07 /qm */ { BxTraceEnd, BX_IA_SYSRET },
3090 /* 0F 08 /qm */ { BxTraceEnd, BX_IA_INVD },
3091 /* 0F 09 /qm */ { BxTraceEnd, BX_IA_WBINVD },
3092 /* 0F 0A /qm */ { 0, BX_IA_ERROR },
3093 /* 0F 0B /qm */ { BxTraceEnd, BX_IA_UD2A },
3094 /* 0F 0C /qm */ { 0, BX_IA_ERROR },
3095 /* 0F 0D /qm */ { 0, BX_IA_NOP }, // 3DNow! PREFETCH on AMD, NOP on Intel
3096 /* 0F 0E /qm */ { 0, BX_IA_FEMMS }, // 3DNow! FEMMS
3097 #if BX_SUPPORT_3DNOW
3098 /* 0F 0F /qm */ { BxImmediate_Ib, BX_IA_ERROR, Bx3DNowOpcodeInfo },
3099 #else
3100 /* 0F 0F /qm */ { 0, BX_IA_ERROR },
3101 #endif
3102 /* 0F 10 /qm */ { BxPrefixSSE, BX_IA_MOVUPS_VpsWps, BxOpcodeGroupSSE_0f10 },
3103 /* 0F 11 /qm */ { BxPrefixSSE, BX_IA_MOVUPS_WpsVps, BxOpcodeGroupSSE_0f11 },
3104 /* 0F 12 /qm */ { BxPrefixSSE, BX_IA_MOVLPS_VpsMq, BxOpcodeGroupSSE_0f12 },
3105 /* 0F 13 /qm */ { BxPrefixSSE, BX_IA_MOVLPS_MqVps, BxOpcodeGroupSSE_0f13M },
3106 /* 0F 14 /qm */ { BxPrefixSSE, BX_IA_UNPCKLPS_VpsWdq, BxOpcodeGroupSSE_0f14 },
3107 /* 0F 15 /qm */ { BxPrefixSSE, BX_IA_UNPCKHPS_VpsWdq, BxOpcodeGroupSSE_0f15 },
3108 /* 0F 16 /qm */ { BxPrefixSSE, BX_IA_MOVHPS_VpsMq, BxOpcodeGroupSSE_0f16 },
3109 /* 0F 17 /qm */ { BxPrefixSSE, BX_IA_MOVHPS_MqVps, BxOpcodeGroupSSE_0f17M },
3110 /* 0F 18 /qm */ { 0, BX_IA_PREFETCH }, // opcode group G16, PREFETCH hints
3111 /* 0F 19 /qm */ { 0, BX_IA_NOP }, // multi-byte NOP
3112 /* 0F 1A /qm */ { 0, BX_IA_NOP }, // multi-byte NOP
3113 /* 0F 1B /qm */ { 0, BX_IA_NOP }, // multi-byte NOP
3114 /* 0F 1C /qm */ { 0, BX_IA_NOP }, // multi-byte NOP
3115 /* 0F 1D /qm */ { 0, BX_IA_NOP }, // multi-byte NOP
3116 /* 0F 1E /qm */ { 0, BX_IA_NOP }, // multi-byte NOP
3117 /* 0F 1F /qm */ { 0, BX_IA_NOP }, // multi-byte NOP
3118 /* 0F 20 /qm */ { 0, BX_IA_MOV_RqCq },
3119 /* 0F 21 /qm */ { 0, BX_IA_MOV_RqDq },
3120 /* 0F 22 /qm */ { BxTraceEnd, BX_IA_MOV_CqRq },
3121 /* 0F 23 /qm */ { BxTraceEnd, BX_IA_MOV_DqRq },
3122 /* 0F 24 /qm */ { 0, BX_IA_ERROR },
3123 /* 0F 25 /qm */ { 0, BX_IA_ERROR },
3124 /* 0F 26 /qm */ { 0, BX_IA_ERROR },
3125 /* 0F 27 /qm */ { 0, BX_IA_ERROR },
3126 /* 0F 28 /qm */ { BxPrefixSSE, BX_IA_MOVAPS_VpsWps, BxOpcodeGroupSSE_0f28 },
3127 /* 0F 29 /qm */ { BxPrefixSSE, BX_IA_MOVAPS_WpsVps, BxOpcodeGroupSSE_0f29 },
3128 /* 0F 2A /qm */ { BxPrefixSSE, BX_IA_CVTPI2PS_VpsQq, BxOpcodeGroupSSE_0f2a },
3129 /* 0F 2B /qm */ { BxPrefixSSE, BX_IA_MOVNTPS_MpsVps, BxOpcodeGroupSSE_0f2bM },
3130 /* 0F 2C /qm */ { BxPrefixSSE, BX_IA_CVTTPS2PI_PqWps, BxOpcodeGroupSSE_0f2c },
3131 /* 0F 2D /qm */ { BxPrefixSSE, BX_IA_CVTPS2PI_PqWps, BxOpcodeGroupSSE_0f2d },
3132 /* 0F 2E /qm */ { BxPrefixSSE, BX_IA_UCOMISS_VssWss, BxOpcodeGroupSSE_0f2e },
3133 /* 0F 2F /qm */ { BxPrefixSSE, BX_IA_COMISS_VpsWps, BxOpcodeGroupSSE_0f2f },
3134 /* 0F 30 /qm */ { 0, BX_IA_WRMSR },
3135 /* 0F 31 /qm */ { 0, BX_IA_RDTSC },
3136 /* 0F 32 /qm */ { 0, BX_IA_RDMSR },
3137 /* 0F 33 /qm */ { 0, BX_IA_RDPMC },
3138 /* 0F 34 /qm */ { 0, BX_IA_SYSENTER },
3139 /* 0F 35 /qm */ { 0, BX_IA_SYSEXIT },
3140 /* 0F 36 /qm */ { 0, BX_IA_ERROR },
3141 /* 0F 37 /qm */ { 0, BX_IA_ERROR },
3142 #if (BX_SUPPORT_SSE >= 4) || (BX_SUPPORT_SSE >= 3 && BX_SUPPORT_SSE_EXTENSION > 0)
3143 /* 0F 38 /qm */ { Bx3ByteOp, BX_IA_ERROR, BxOpcode3ByteTable0f38 }, // 3-byte escape
3144 #else
3145 /* 0F 38 /qm */ { 0, BX_IA_ERROR },
3146 #endif
3147 /* 0F 39 /qm */ { 0, BX_IA_ERROR },
3148 #if (BX_SUPPORT_SSE >= 4) || (BX_SUPPORT_SSE >= 3 && BX_SUPPORT_SSE_EXTENSION > 0)
3149 /* 0F 3A /qm */ { Bx3ByteOp, BX_IA_ERROR, BxOpcode3ByteTable0f3a }, // 3-byte escape
3150 #else
3151 /* 0F 3A /qm */ { 0, BX_IA_ERROR },
3152 #endif
3153 /* 0F 3B /qm */ { 0, BX_IA_ERROR },
3154 /* 0F 3C /qm */ { 0, BX_IA_ERROR },
3155 /* 0F 3D /qm */ { 0, BX_IA_ERROR },
3156 /* 0F 3E /qm */ { 0, BX_IA_ERROR },
3157 /* 0F 3F /qm */ { 0, BX_IA_ERROR },
3158 /* 0F 40 /qm */ { 0, BX_IA_CMOVO_GqEqM },
3159 /* 0F 41 /qm */ { 0, BX_IA_CMOVNO_GqEqM },
3160 /* 0F 42 /qm */ { 0, BX_IA_CMOVB_GqEqM },
3161 /* 0F 43 /qm */ { 0, BX_IA_CMOVNB_GqEqM },
3162 /* 0F 44 /qm */ { 0, BX_IA_CMOVZ_GqEqM },
3163 /* 0F 45 /qm */ { 0, BX_IA_CMOVNZ_GqEqM },
3164 /* 0F 46 /qm */ { 0, BX_IA_CMOVBE_GqEqM },
3165 /* 0F 47 /qm */ { 0, BX_IA_CMOVNBE_GqEqM },
3166 /* 0F 48 /qm */ { 0, BX_IA_CMOVS_GqEqM },
3167 /* 0F 49 /qm */ { 0, BX_IA_CMOVNS_GqEqM },
3168 /* 0F 4A /qm */ { 0, BX_IA_CMOVP_GqEqM },
3169 /* 0F 4B /qm */ { 0, BX_IA_CMOVNP_GqEqM },
3170 /* 0F 4C /qm */ { 0, BX_IA_CMOVL_GqEqM },
3171 /* 0F 4D /qm */ { 0, BX_IA_CMOVNL_GqEqM },
3172 /* 0F 4E /qm */ { 0, BX_IA_CMOVLE_GqEqM },
3173 /* 0F 4F /qm */ { 0, BX_IA_CMOVNLE_GqEqM },
3174 /* 0F 50 /qm */ { BxPrefixSSE, BX_IA_MOVMSKPS_GdVRps, BxOpcodeGroupSSE_0f50 },
3175 /* 0F 51 /qm */ { BxPrefixSSE, BX_IA_SQRTPS_VpsWps, BxOpcodeGroupSSE_0f51 },
3176 /* 0F 52 /qm */ { BxPrefixSSE, BX_IA_RSQRTPS_VpsWps, BxOpcodeGroupSSE_0f52 },
3177 /* 0F 53 /qm */ { BxPrefixSSE, BX_IA_RCPPS_VpsWps, BxOpcodeGroupSSE_0f53 },
3178 /* 0F 54 /qm */ { BxPrefixSSE, BX_IA_ANDPS_VpsWps, BxOpcodeGroupSSE_0f54 },
3179 /* 0F 55 /qm */ { BxPrefixSSE, BX_IA_ANDNPS_VpsWps, BxOpcodeGroupSSE_0f55 },
3180 /* 0F 56 /qm */ { BxPrefixSSE, BX_IA_ORPS_VpsWps, BxOpcodeGroupSSE_0f56 },
3181 /* 0F 57 /qm */ { BxPrefixSSE, BX_IA_XORPS_VpsWps, BxOpcodeGroupSSE_0f57 },
3182 /* 0F 58 /qm */ { BxPrefixSSE, BX_IA_ADDPS_VpsWps, BxOpcodeGroupSSE_0f58 },
3183 /* 0F 59 /qm */ { BxPrefixSSE, BX_IA_MULPS_VpsWps, BxOpcodeGroupSSE_0f59 },
3184 /* 0F 5A /qm */ { BxPrefixSSE, BX_IA_CVTPS2PD_VpsWps, BxOpcodeGroupSSE_0f5a },
3185 /* 0F 5B /qm */ { BxPrefixSSE, BX_IA_CVTDQ2PS_VpsWdq, BxOpcodeGroupSSE_0f5b },
3186 /* 0F 5C /qm */ { BxPrefixSSE, BX_IA_SUBPS_VpsWps, BxOpcodeGroupSSE_0f5c },
3187 /* 0F 5D /qm */ { BxPrefixSSE, BX_IA_MINPS_VpsWps, BxOpcodeGroupSSE_0f5d },
3188 /* 0F 5E /qm */ { BxPrefixSSE, BX_IA_DIVPS_VpsWps, BxOpcodeGroupSSE_0f5e },
3189 /* 0F 5F /qm */ { BxPrefixSSE, BX_IA_MAXPS_VpsWps, BxOpcodeGroupSSE_0f5f },
3190 /* 0F 60 /qm */ { BxPrefixSSE, BX_IA_PUNPCKLBW_PqQd, BxOpcodeGroupSSE_0f60 },
3191 /* 0F 61 /qm */ { BxPrefixSSE, BX_IA_PUNPCKLWD_PqQd, BxOpcodeGroupSSE_0f61 },
3192 /* 0F 62 /qm */ { BxPrefixSSE, BX_IA_PUNPCKLDQ_PqQd, BxOpcodeGroupSSE_0f62 },
3193 /* 0F 63 /qm */ { BxPrefixSSE, BX_IA_PACKSSWB_PqQq, BxOpcodeGroupSSE_0f63 },
3194 /* 0F 64 /qm */ { BxPrefixSSE, BX_IA_PCMPGTB_PqQq, BxOpcodeGroupSSE_0f64 },
3195 /* 0F 65 /qm */ { BxPrefixSSE, BX_IA_PCMPGTW_PqQq, BxOpcodeGroupSSE_0f65 },
3196 /* 0F 66 /qm */ { BxPrefixSSE, BX_IA_PCMPGTD_PqQq, BxOpcodeGroupSSE_0f66 },
3197 /* 0F 67 /qm */ { BxPrefixSSE, BX_IA_PACKUSWB_PqQq, BxOpcodeGroupSSE_0f67 },
3198 /* 0F 68 /qm */ { BxPrefixSSE, BX_IA_PUNPCKHBW_PqQq, BxOpcodeGroupSSE_0f68 },
3199 /* 0F 69 /qm */ { BxPrefixSSE, BX_IA_PUNPCKHWD_PqQq, BxOpcodeGroupSSE_0f69 },
3200 /* 0F 6A /qm */ { BxPrefixSSE, BX_IA_PUNPCKHDQ_PqQq, BxOpcodeGroupSSE_0f6a },
3201 /* 0F 6B /qm */ { BxPrefixSSE, BX_IA_PACKSSDW_PqQq, BxOpcodeGroupSSE_0f6b },
3202 /* 0F 6C /qm */ { BxPrefixSSE, BX_IA_ERROR, BxOpcodeGroupSSE_0f6c },
3203 /* 0F 6D /qm */ { BxPrefixSSE, BX_IA_ERROR, BxOpcodeGroupSSE_0f6d },
3204 /* 0F 6E /qm */ { BxPrefixSSE, BX_IA_MOVQ_PqEq, BxOpcodeGroupSSE_0f6eQ },
3205 /* 0F 6F /qm */ { BxPrefixSSE, BX_IA_MOVQ_PqQq, BxOpcodeGroupSSE_0f6f },
3206 /* 0F 70 /qm */ { BxPrefixSSE | BxImmediate_Ib, BX_IA_PSHUFW_PqQqIb, BxOpcodeGroupSSE_0f70 },
3207 /* 0F 71 /qm */ { 0, BX_IA_ERROR }, // SSE Group G12
3208 /* 0F 72 /qm */ { 0, BX_IA_ERROR }, // SSE Group G13
3209 /* 0F 73 /qm */ { 0, BX_IA_ERROR }, // SSE Group G14
3210 /* 0F 74 /qm */ { BxPrefixSSE, BX_IA_PCMPEQB_PqQq, BxOpcodeGroupSSE_0f74 },
3211 /* 0F 75 /qm */ { BxPrefixSSE, BX_IA_PCMPEQW_PqQq, BxOpcodeGroupSSE_0f75 },
3212 /* 0F 76 /qm */ { BxPrefixSSE, BX_IA_PCMPEQD_PqQq, BxOpcodeGroupSSE_0f76 },
3213 /* 0F 77 /qm */ { BxPrefixSSE, BX_IA_EMMS, BxOpcodeGroupSSE_ERR },
3214 /* 0F 78 /qm */ { 0, BX_IA_ERROR },
3215 /* 0F 79 /qm */ { 0, BX_IA_ERROR },
3216 /* 0F 7A /qm */ { 0, BX_IA_ERROR },
3217 /* 0F 7B /qm */ { 0, BX_IA_ERROR },
3218 /* 0F 7C /qm */ { BxPrefixSSE, BX_IA_ERROR, BxOpcodeGroupSSE_0f7c },
3219 /* 0F 7D /qm */ { BxPrefixSSE, BX_IA_ERROR, BxOpcodeGroupSSE_0f7d },
3220 /* 0F 7E /qm */ { BxPrefixSSE, BX_IA_MOVQ_EqPq, BxOpcodeGroupSSE_0f7eQ },
3221 /* 0F 7F /qm */ { BxPrefixSSE, BX_IA_MOVQ_QqPq, BxOpcodeGroupSSE_0f7f },
3222 /* 0F 80 /qm */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JO_Jq },
3223 /* 0F 81 /qm */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JNO_Jq },
3224 /* 0F 82 /qm */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JB_Jq },
3225 /* 0F 83 /qm */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JNB_Jq },
3226 /* 0F 84 /qm */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JZ_Jq },
3227 /* 0F 85 /qm */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JNZ_Jq },
3228 /* 0F 86 /qm */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JBE_Jq },
3229 /* 0F 87 /qm */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JNBE_Jq },
3230 /* 0F 88 /qm */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JS_Jq },
3231 /* 0F 89 /qm */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JNS_Jq },
3232 /* 0F 8A /qm */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JP_Jq },
3233 /* 0F 8B /qm */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JNP_Jq },
3234 /* 0F 8C /qm */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JL_Jq },
3235 /* 0F 8D /qm */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JNL_Jq },
3236 /* 0F 8E /qm */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JLE_Jq },
3237 /* 0F 8F /qm */ { BxImmediate_BrOff32 | BxTraceJCC, BX_IA_JNLE_Jq },
3238 /* 0F 90 /qm */ { 0, BX_IA_SETO_EbM },
3239 /* 0F 91 /qm */ { 0, BX_IA_SETNO_EbM },
3240 /* 0F 92 /qm */ { 0, BX_IA_SETB_EbM },
3241 /* 0F 93 /qm */ { 0, BX_IA_SETNB_EbM },
3242 /* 0F 94 /qm */ { 0, BX_IA_SETZ_EbM },
3243 /* 0F 95 /qm */ { 0, BX_IA_SETNZ_EbM },
3244 /* 0F 96 /qm */ { 0, BX_IA_SETBE_EbM },
3245 /* 0F 97 /qm */ { 0, BX_IA_SETNBE_EbM },
3246 /* 0F 98 /qm */ { 0, BX_IA_SETS_EbM },
3247 /* 0F 99 /qm */ { 0, BX_IA_SETNS_EbM },
3248 /* 0F 9A /qm */ { 0, BX_IA_SETP_EbM },
3249 /* 0F 9B /qm */ { 0, BX_IA_SETNP_EbM },
3250 /* 0F 9C /qm */ { 0, BX_IA_SETL_EbM },
3251 /* 0F 9D /qm */ { 0, BX_IA_SETNL_EbM },
3252 /* 0F 9E /qm */ { 0, BX_IA_SETLE_EbM },
3253 /* 0F 9F /qm */ { 0, BX_IA_SETNLE_EbM },
3254 /* 0F A0 /qm */ { 0, BX_IA_PUSH64_FS },
3255 /* 0F A1 /qm */ { 0, BX_IA_POP64_FS },
3256 /* 0F A2 /qm */ { 0, BX_IA_CPUID },
3257 /* 0F A3 /qm */ { 0, BX_IA_BT_EqGqM },
3258 /* 0F A4 /qm */ { BxImmediate_Ib, BX_IA_SHLD_EqGqM },
3259 /* 0F A5 /qm */ { 0, BX_IA_SHLD_EqGqM },
3260 /* 0F A6 /qm */ { 0, BX_IA_ERROR },
3261 /* 0F A7 /qm */ { 0, BX_IA_ERROR },
3262 /* 0F A8 /qm */ { 0, BX_IA_PUSH64_GS },
3263 /* 0F A9 /qm */ { 0, BX_IA_POP64_GS },
3264 /* 0F AA /qm */ { BxTraceEnd, BX_IA_RSM },
3265 /* 0F AB /qm */ { BxLockable, BX_IA_BTS_EqGqM },
3266 /* 0F AC /qm */ { BxImmediate_Ib, BX_IA_SHRD_EqGqM },
3267 /* 0F AD /qm */ { 0, BX_IA_SHRD_EqGqM },
3268 /* 0F AE /qm */ { BxGroup15, BX_IA_ERROR, BxOpcodeInfoG15M },
3269 /* 0F AF /qm */ { 0, BX_IA_IMUL_GqEqM },
3270 /* 0F B0 /qm */ { BxLockable, BX_IA_CMPXCHG_EbGbM },
3271 /* 0F B1 /qm */ { BxLockable, BX_IA_CMPXCHG_EqGqM },
3272 /* 0F B2 /qm */ { 0, BX_IA_LSS_GqMp }, // TODO: LSS_GdMp for AMD CPU
3273 /* 0F B3 /qm */ { BxLockable, BX_IA_BTR_EqGqM },
3274 /* 0F B4 /qm */ { 0, BX_IA_LFS_GqMp }, // TODO: LFS_GdMp for AMD CPU
3275 /* 0F B5 /qm */ { 0, BX_IA_LGS_GqMp }, // TODO: LGS_GdMp for AMD CPU
3276 /* 0F B6 /qm */ { 0, BX_IA_MOVZX_GqEbM },
3277 /* 0F B7 /qm */ { 0, BX_IA_MOVZX_GqEwM },
3278 /* 0F B8 /qm */ { BxPrefixSSE, BX_IA_ERROR, BxOpcodeGroupSSE_0fb8qM },
3279 /* 0F B9 /qm */ { BxTraceEnd, BX_IA_UD2B },
3280 /* 0F BA /qm */ { BxGroup8, BX_IA_ERROR, BxOpcodeInfo64G8EqIbM },
3281 /* 0F BB /qm */ { BxLockable, BX_IA_BTC_EqGqM },
3282 /* 0F BC /qm */ { 0, BX_IA_BSF_GqEqM },
3283 /* 0F BD /qm */ { 0, BX_IA_BSR_GqEqM },
3284 /* 0F BE /qm */ { 0, BX_IA_MOVSX_GqEbM },
3285 /* 0F BF /qm */ { 0, BX_IA_MOVSX_GqEwM },
3286 /* 0F C0 /qm */ { BxLockable, BX_IA_XADD_EbGbM },
3287 /* 0F C1 /qm */ { BxLockable, BX_IA_XADD_EqGqM },
3288 /* 0F C2 /qm */ { BxPrefixSSE | BxImmediate_Ib, BX_IA_CMPPS_VpsWpsIb, BxOpcodeGroupSSE_0fc2 },
3289 /* 0F C3 /qm */ { BxPrefixSSE, BX_IA_MOVNTI_MqGq, BxOpcodeGroupSSE_ERR },
3290 /* 0F C4 /qm */ { BxPrefixSSE | BxImmediate_Ib, BX_IA_PINSRW_PqEwIb, BxOpcodeGroupSSE_0fc4 },
3291 /* 0F C5 /qm */ { 0, BX_IA_ERROR }, // PEXTRW SSE group
3292 /* 0F C6 /qm */ { BxPrefixSSE | BxImmediate_Ib, BX_IA_SHUFPS_VpsWpsIb, BxOpcodeGroupSSE_0fc6 },
3293 /* 0F C7 /qm */ { BxGroup9, BX_IA_ERROR, BxOpcodeInfo64G9qM },
3294 /* 0F C8 /qm */ { 0, BX_IA_BSWAP_RRX },
3295 /* 0F C9 /qm */ { 0, BX_IA_BSWAP_RRX },
3296 /* 0F CA /qm */ { 0, BX_IA_BSWAP_RRX },
3297 /* 0F CB /qm */ { 0, BX_IA_BSWAP_RRX },
3298 /* 0F CC /qm */ { 0, BX_IA_BSWAP_RRX },
3299 /* 0F CD /qm */ { 0, BX_IA_BSWAP_RRX },
3300 /* 0F CE /qm */ { 0, BX_IA_BSWAP_RRX },
3301 /* 0F CF /qm */ { 0, BX_IA_BSWAP_RRX },
3302 /* 0F D0 /qm */ { BxPrefixSSE, BX_IA_ERROR, BxOpcodeGroupSSE_0fd0 },
3303 /* 0F D1 /qm */ { BxPrefixSSE, BX_IA_PSRLW_PqQq, BxOpcodeGroupSSE_0fd1 },
3304 /* 0F D2 /qm */ { BxPrefixSSE, BX_IA_PSRLD_PqQq, BxOpcodeGroupSSE_0fd2 },
3305 /* 0F D3 /qm */ { BxPrefixSSE, BX_IA_PSRLQ_PqQq, BxOpcodeGroupSSE_0fd3 },
3306 /* 0F D4 /qm */ { BxPrefixSSE, BX_IA_PADDQ_PqQq, BxOpcodeGroupSSE_0fd4 },
3307 /* 0F D5 /qm */ { BxPrefixSSE, BX_IA_PMULLW_PqQq, BxOpcodeGroupSSE_0fd5 },
3308 /* 0F D6 /qm */ { BxPrefixSSE, BX_IA_ERROR, BxOpcodeGroupSSE_0fd6 },
3309 /* 0F D7 /qm */ { BxPrefixSSE, BX_IA_PMOVMSKB_GdPRq, BxOpcodeGroupSSE_0fd7 },
3310 /* 0F D8 /qm */ { BxPrefixSSE, BX_IA_PSUBUSB_PqQq, BxOpcodeGroupSSE_0fd8 },
3311 /* 0F D9 /qm */ { BxPrefixSSE, BX_IA_PSUBUSW_PqQq, BxOpcodeGroupSSE_0fd9 },
3312 /* 0F DA /qm */ { BxPrefixSSE, BX_IA_PMINUB_PqQq, BxOpcodeGroupSSE_0fda },
3313 /* 0F DB /qm */ { BxPrefixSSE, BX_IA_PAND_PqQq, BxOpcodeGroupSSE_0fdb },
3314 /* 0F DC /qm */ { BxPrefixSSE, BX_IA_PADDUSB_PqQq, BxOpcodeGroupSSE_0fdc },
3315 /* 0F DD /qm */ { BxPrefixSSE, BX_IA_PADDUSW_PqQq, BxOpcodeGroupSSE_0fdd },
3316 /* 0F DE /qm */ { BxPrefixSSE, BX_IA_PMAXUB_PqQq, BxOpcodeGroupSSE_0fde },
3317 /* 0F DF /qm */ { BxPrefixSSE, BX_IA_PANDN_PqQq, BxOpcodeGroupSSE_0fdf },
3318 /* 0F E0 /qm */ { BxPrefixSSE, BX_IA_PAVGB_PqQq, BxOpcodeGroupSSE_0fe0 },
3319 /* 0F E1 /qm */ { BxPrefixSSE, BX_IA_PSRAW_PqQq, BxOpcodeGroupSSE_0fe1 },
3320 /* 0F E2 /qm */ { BxPrefixSSE, BX_IA_PSRAD_PqQq, BxOpcodeGroupSSE_0fe2 },
3321 /* 0F E3 /qm */ { BxPrefixSSE, BX_IA_PAVGW_PqQq, BxOpcodeGroupSSE_0fe3 },
3322 /* 0F E4 /qm */ { BxPrefixSSE, BX_IA_PMULHUW_PqQq, BxOpcodeGroupSSE_0fe4 },
3323 /* 0F E5 /qm */ { BxPrefixSSE, BX_IA_PMULHW_PqQq, BxOpcodeGroupSSE_0fe5 },
3324 /* 0F E6 /qm */ { BxPrefixSSE, BX_IA_ERROR, BxOpcodeGroupSSE_0fe6 },
3325 /* 0F E7 /qm */ { BxPrefixSSE, BX_IA_MOVNTQ_MqPq, BxOpcodeGroupSSE_0fe7M },
3326 /* 0F E8 /qm */ { BxPrefixSSE, BX_IA_PSUBSB_PqQq, BxOpcodeGroupSSE_0fe8 },
3327 /* 0F E9 /qm */ { BxPrefixSSE, BX_IA_PSUBSW_PqQq, BxOpcodeGroupSSE_0fe9 },
3328 /* 0F EA /qm */ { BxPrefixSSE, BX_IA_PMINSW_PqQq, BxOpcodeGroupSSE_0fea },
3329 /* 0F EB /qm */ { BxPrefixSSE, BX_IA_POR_PqQq, BxOpcodeGroupSSE_0feb },
3330 /* 0F EC /qm */ { BxPrefixSSE, BX_IA_PADDSB_PqQq, BxOpcodeGroupSSE_0fec },
3331 /* 0F ED /qm */ { BxPrefixSSE, BX_IA_PADDSW_PqQq, BxOpcodeGroupSSE_0fed },
3332 /* 0F EE /qm */ { BxPrefixSSE, BX_IA_PMAXSW_PqQq, BxOpcodeGroupSSE_0fee },
3333 /* 0F EF /qm */ { BxPrefixSSE, BX_IA_PXOR_PqQq, BxOpcodeGroupSSE_0fef },
3334 /* 0F F0 /qm */ { BxPrefixSSE, BX_IA_ERROR, BxOpcodeGroupSSE_0ff0M },
3335 /* 0F F1 /qm */ { BxPrefixSSE, BX_IA_PSLLW_PqQq, BxOpcodeGroupSSE_0ff1 },
3336 /* 0F F2 /qm */ { BxPrefixSSE, BX_IA_PSLLD_PqQq, BxOpcodeGroupSSE_0ff2 },
3337 /* 0F F3 /qm */ { BxPrefixSSE, BX_IA_PSLLQ_PqQq, BxOpcodeGroupSSE_0ff3 },
3338 /* 0F F4 /qm */ { BxPrefixSSE, BX_IA_PMULUDQ_PqQq, BxOpcodeGroupSSE_0ff4 },
3339 /* 0F F5 /qm */ { BxPrefixSSE, BX_IA_PMADDWD_PqQq, BxOpcodeGroupSSE_0ff5 },
3340 /* 0F F6 /qm */ { BxPrefixSSE, BX_IA_PSADBW_PqQq, BxOpcodeGroupSSE_0ff6 },
3341 /* 0F F7 /qm */ { 0, BX_IA_ERROR }, // MASKMOV SSE group
3342 /* 0F F8 /qm */ { BxPrefixSSE, BX_IA_PSUBB_PqQq, BxOpcodeGroupSSE_0ff8 },
3343 /* 0F F9 /qm */ { BxPrefixSSE, BX_IA_PSUBW_PqQq, BxOpcodeGroupSSE_0ff9 },
3344 /* 0F FA /qm */ { BxPrefixSSE, BX_IA_PSUBD_PqQq, BxOpcodeGroupSSE_0ffa },
3345 /* 0F FB /qm */ { BxPrefixSSE, BX_IA_PSUBQ_PqQq, BxOpcodeGroupSSE_0ffb },
3346 /* 0F FC /qm */ { BxPrefixSSE, BX_IA_PADDB_PqQq, BxOpcodeGroupSSE_0ffc },
3347 /* 0F FD /qm */ { BxPrefixSSE, BX_IA_PADDW_PqQq, BxOpcodeGroupSSE_0ffd },
3348 /* 0F FE /qm */ { BxPrefixSSE, BX_IA_PADDD_PqQq, BxOpcodeGroupSSE_0ffe },
3349 /* 0F FF /qm */ { 0, BX_IA_ERROR }
3352 enum {
3353 BX_RESOLVE32_BASE,
3354 BX_RESOLVE32_BASE_INDEX,
3355 BX_RESOLVE64_BASE,
3356 BX_RESOLVE64_BASE_INDEX,
3357 BX_RESOLVE_NONE
3360 unsigned BX_CPP_AttrRegparmN(3)
3361 BX_CPU_C::fetchDecode64(const Bit8u *iptr, bxInstruction_c *i, unsigned remainingInPage)
3363 // remain must be at least 1
3364 unsigned remain = (remainingInPage < 15) ? remainingInPage : 15;
3366 unsigned b1, b2, ilen=0, attr, lock=0, ia_opcode = 0;
3367 unsigned imm_mode, offset = 512, rex_r = 0, rex_x = 0, rex_b = 0;
3368 unsigned rm = 0, mod = 0, nnn = 0, resolve = BX_RESOLVE_NONE;
3369 unsigned seg = BX_SEG_REG_DS, seg_override = BX_SEG_REG_NULL;
3371 #define SSE_PREFIX_NONE 0
3372 #define SSE_PREFIX_66 1
3373 #define SSE_PREFIX_F2 2
3374 #define SSE_PREFIX_F3 3
3375 unsigned sse_prefix = SSE_PREFIX_NONE;
3376 unsigned rex_prefix = 0;
3378 i->ResolveModrm = 0;
3379 i->init(/*os32*/ 1, // operand size 32 override defaults to 1
3380 /*as32*/ 1, // address size 32 override defaults to 1
3381 /*os64*/ 0, // operand size 64 override defaults to 0
3382 /*as64*/ 1); // address size 64 override defaults to 1
3384 fetch_b1:
3385 b1 = *iptr++;
3386 ilen++;
3388 switch (b1) {
3389 case 0x40:
3390 case 0x41:
3391 case 0x42:
3392 case 0x43:
3393 case 0x44:
3394 case 0x45:
3395 case 0x46:
3396 case 0x47:
3397 case 0x48:
3398 case 0x49:
3399 case 0x4A:
3400 case 0x4B:
3401 case 0x4C:
3402 case 0x4D:
3403 case 0x4E:
3404 case 0x4F:
3405 rex_prefix = b1;
3406 if (ilen < remain) {
3407 goto fetch_b1;
3409 return(0);
3410 case 0x0f: // 2 byte escape
3411 if (ilen < remain) {
3412 ilen++;
3413 b1 = 0x100 | *iptr++;
3414 break;
3416 return(0);
3417 case 0xf2: // REPNE/REPNZ
3418 case 0xf3: // REP/REPE/REPZ
3419 rex_prefix = 0;
3420 sse_prefix = b1 & 0xf;
3421 i->setRepUsed(b1 & 3);
3422 if (ilen < remain) {
3423 goto fetch_b1;
3425 return(0);
3426 case 0x2e: // CS:
3427 case 0x26: // ES:
3428 case 0x36: // SS:
3429 case 0x3e: // DS:
3430 /* ignore segment override prefix */
3431 rex_prefix = 0;
3432 if (ilen < remain) {
3433 goto fetch_b1;
3435 return(0);
3436 case 0x64: // FS:
3437 case 0x65: // GS:
3438 rex_prefix = 0;
3439 seg_override = b1 & 0xf;
3440 if (ilen < remain) {
3441 goto fetch_b1;
3443 return(0);
3444 case 0x66: // OpSize
3445 rex_prefix = 0;
3446 if(!sse_prefix) sse_prefix = SSE_PREFIX_66;
3447 i->setOs32B(0);
3448 offset = 0;
3449 if (ilen < remain) {
3450 goto fetch_b1;
3452 return(0);
3453 case 0x67: // AddrSize
3454 rex_prefix = 0;
3455 i->setAs64B(0);
3456 if (ilen < remain) {
3457 goto fetch_b1;
3459 return(0);
3460 case 0xf0: // LOCK:
3461 rex_prefix = 0;
3462 lock = 1;
3463 if (ilen < remain) {
3464 goto fetch_b1;
3466 return(0);
3467 default:
3468 break;
3471 if (rex_prefix) {
3472 i->assertExtend8bit();
3473 if (rex_prefix & 0x8) {
3474 i->assertOs64();
3475 i->assertOs32();
3476 offset = 512*2;
3478 rex_r = ((rex_prefix & 0x4) << 1);
3479 rex_x = ((rex_prefix & 0x2) << 2);
3480 rex_b = ((rex_prefix & 0x1) << 3);
3483 attr = BxOpcodeInfo64R[b1+offset].Attr;
3485 if (BxOpcodeHasModrm64[b1]) {
3487 #if (BX_SUPPORT_SSE >= 4) || (BX_SUPPORT_SSE >= 3 && BX_SUPPORT_SSE_EXTENSION > 0)
3488 unsigned b3 = 0;
3489 // handle 3-byte escape
3490 if ((attr & BxGroupX) == Bx3ByteOp) {
3491 if (ilen < remain) {
3492 ilen++;
3493 b3 = *iptr++;
3495 else
3496 return(0);
3498 #endif
3500 // opcode requires modrm byte
3501 if (ilen < remain) {
3502 ilen++;
3503 b2 = *iptr++;
3505 else
3506 return(0);
3508 // Parse mod-nnn-rm and related bytes
3509 mod = b2 & 0xc0;
3510 nnn = ((b2 >> 3) & 0x7) | rex_r;
3511 rm = (b2 & 0x7) | rex_b;
3513 // MOVs with CRx and DRx always use register ops and ignore the mod field.
3514 if ((b1 & ~3) == 0x120)
3515 mod = 0xc0;
3517 i->setModRM(b2);
3518 i->setNnn(nnn);
3520 if (mod == 0xc0) { // mod == 11b
3521 i->setRm(rm);
3522 i->assertModC0();
3523 goto modrm_done;
3526 i->setRm(BX_TMP_REGISTER);
3527 i->setSibBase(rm); // initialize with rm to use BxResolve32Base
3528 i->setSibIndex(BX_NIL_REGISTER);
3529 // initialize displ32 with zero to include cases with no diplacement
3530 i->modRMForm.displ32u = 0;
3532 if (i->as64L()) {
3533 // 64-bit addressing modes; note that mod==11b handled above
3534 resolve = BX_RESOLVE64_BASE;
3535 i->ResolveModrm = &BX_CPU_C::BxResolve64Base;
3536 if ((rm & 0x7) != 4) { // no s-i-b byte
3537 if (mod == 0x00) { // mod == 00b
3538 if ((rm & 0x7) == 5) {
3539 i->setSibBase(BX_64BIT_REG_RIP);
3540 get_32bit_displ:
3541 if ((ilen+3) < remain) {
3542 i->modRMForm.displ32u = FetchDWORD(iptr);
3543 iptr += 4;
3544 ilen += 4;
3545 goto modrm_done;
3547 else return(0);
3549 // mod==00b, rm!=4, rm!=5
3550 goto modrm_done;
3552 seg = sreg_mod01or10_rm32[rm];
3553 if (mod == 0x40) { // mod == 01b
3554 get_8bit_displ:
3555 if (ilen < remain) {
3556 // 8 sign extended to 32
3557 i->modRMForm.displ32u = (Bit8s) *iptr++;
3558 ilen++;
3559 goto modrm_done;
3561 else return(0);
3563 // (mod == 0x80) mod == 10b
3564 goto get_32bit_displ;
3566 else { // mod!=11b, rm==4, s-i-b byte follows
3567 unsigned sib, base, index, scale;
3568 if (ilen < remain) {
3569 sib = *iptr++;
3570 ilen++;
3572 else {
3573 return(0);
3575 base = (sib & 0x7) | rex_b; sib >>= 3;
3576 index = (sib & 0x7) | rex_x; sib >>= 3;
3577 scale = sib;
3578 i->setSibScale(scale);
3579 i->setSibBase(base);
3580 if (index != 4) {
3581 resolve = BX_RESOLVE64_BASE_INDEX;
3582 i->ResolveModrm = &BX_CPU_C::BxResolve64BaseIndex;
3583 i->setSibIndex(index);
3585 if (mod == 0x00) { // mod==00b, rm==4
3586 seg = sreg_mod0_base32[base];
3587 if ((base & 0x7) == 5) {
3588 i->setSibBase(BX_NIL_REGISTER);
3589 goto get_32bit_displ;
3591 // mod==00b, rm==4, base!=5
3592 goto modrm_done;
3594 seg = sreg_mod1or2_base32[base];
3595 if (mod == 0x40) // mod==01b, rm==4
3596 goto get_8bit_displ;
3597 // (mod == 0x80), mod==10b, rm==4
3598 goto get_32bit_displ;
3601 else {
3602 // 32-bit addressing modes; note that mod==11b handled above
3603 resolve = BX_RESOLVE32_BASE;
3604 i->ResolveModrm = &BX_CPU_C::BxResolve32Base;
3605 if ((rm & 0x7) != 4) { // no s-i-b byte
3606 if (mod == 0x00) { // mod == 00b
3607 if ((rm & 0x7) == 5) {
3608 i->setSibBase(BX_32BIT_REG_EIP);
3609 goto get_32bit_displ;
3611 // mod==00b, rm!=4, rm!=5
3612 goto modrm_done;
3614 seg = sreg_mod01or10_rm32[rm];
3615 if (mod == 0x40) // mod == 01b
3616 goto get_8bit_displ;
3617 // (mod == 0x80) mod == 10b
3618 goto get_32bit_displ;
3620 else { // mod!=11b, rm==4, s-i-b byte follows
3621 unsigned sib, base, index, scale;
3622 if (ilen < remain) {
3623 sib = *iptr++;
3624 ilen++;
3626 else {
3627 return(0);
3629 base = (sib & 0x7) | rex_b; sib >>= 3;
3630 index = (sib & 0x7) | rex_x; sib >>= 3;
3631 scale = sib;
3632 i->setSibBase(base);
3633 i->setSibScale(scale);
3634 if (index != 4) {
3635 resolve = BX_RESOLVE32_BASE_INDEX;
3636 i->ResolveModrm = &BX_CPU_C::BxResolve32BaseIndex;
3637 i->setSibIndex(index);
3639 if (mod == 0x00) { // mod==00b, rm==4
3640 seg = sreg_mod0_base32[base];
3641 if ((base & 0x7) == 5) {
3642 i->setSibBase(BX_NIL_REGISTER);
3643 goto get_32bit_displ;
3645 // mod==00b, rm==4, base!=5
3646 goto modrm_done;
3648 seg = sreg_mod1or2_base32[base];
3649 if (mod == 0x40) // mod==01b, rm==4
3650 goto get_8bit_displ;
3651 // (mod == 0x80), mod==10b, rm==4
3652 goto get_32bit_displ;
3656 modrm_done:
3658 // Resolve ExecutePtr and additional opcode Attr
3659 const BxOpcodeInfo_t *OpcodeInfoPtr;
3660 if (mod == 0xc0) {
3661 OpcodeInfoPtr = &(BxOpcodeInfo64R[b1+offset]);
3662 attr = BxOpcodeInfo64R[b1+offset].Attr;
3664 else {
3665 OpcodeInfoPtr = &(BxOpcodeInfo64M[b1+offset]);
3666 attr = BxOpcodeInfo64M[b1+offset].Attr;
3669 while(attr & BxGroupX) {
3670 Bit32u Group = attr & BxGroupX;
3671 attr &= ~BxGroupX;
3673 switch(Group) {
3674 case BxGroupN:
3675 OpcodeInfoPtr = &(OpcodeInfoPtr->AnotherArray[nnn & 0x7]);
3676 break;
3677 case BxRMGroup:
3678 OpcodeInfoPtr = &(OpcodeInfoPtr->AnotherArray[rm & 0x7]);
3679 break;
3680 #if (BX_SUPPORT_SSE >= 4) || (BX_SUPPORT_SSE >= 3 && BX_SUPPORT_SSE_EXTENSION > 0)
3681 case Bx3ByteOp:
3682 OpcodeInfoPtr = &(OpcodeInfoPtr->AnotherArray[b3]);
3683 break;
3684 #endif
3685 case BxOSizeGrp:
3686 OpcodeInfoPtr = &(OpcodeInfoPtr->AnotherArray[offset >> 8]);
3687 break;
3688 case BxPrefixSSE:
3689 /* For SSE opcodes look into another table
3690 with the opcode prefixes (NONE, 0x66, 0xF2, 0xF3) */
3691 if (sse_prefix) {
3692 OpcodeInfoPtr = &(OpcodeInfoPtr->AnotherArray[sse_prefix-1]);
3693 break;
3695 continue;
3696 case BxFPEscape:
3697 OpcodeInfoPtr = &(OpcodeInfoPtr->AnotherArray[b2 & 0x3f]);
3698 break;
3699 default:
3700 BX_PANIC(("fetchdecode: Unknown opcode group"));
3703 /* get additional attributes from group table */
3704 attr |= OpcodeInfoPtr->Attr;
3707 ia_opcode = OpcodeInfoPtr->IA;
3709 else {
3710 // Opcode does not require a MODRM byte.
3711 // Note that a 2-byte opcode (0F XX) will jump to before
3712 // the if() above after fetching the 2nd byte, so this path is
3713 // taken in all cases if a modrm byte is NOT required.
3714 ia_opcode = BxOpcodeInfo64R[b1+offset].IA;
3715 i->setOpcodeReg((b1 & 7) | rex_b);
3718 if (lock) { // lock prefix invalid opcode
3719 // lock prefix not allowed or destination operand is not memory
3720 // mod == 0xc0 can't be BxLockable in fetchdecode tables
3721 if (/*(mod == 0xc0) ||*/ !(attr & BxLockable)) {
3722 BX_INFO(("LOCK prefix unallowed (op1=0x%x, mod=%u, nnn=%u)", b1, mod, nnn));
3723 // replace execution function with undefined-opcode
3724 ia_opcode = BX_IA_ERROR;
3728 imm_mode = attr & BxImmediate;
3729 if (imm_mode) {
3730 switch (imm_mode) {
3731 case BxImmediate_I1:
3732 i->modRMForm.Ib = 1;
3733 break;
3734 case BxImmediate_Ib:
3735 if (ilen < remain) {
3736 i->modRMForm.Ib = *iptr;
3737 ilen++;
3739 else {
3740 return(0);
3742 break;
3743 case BxImmediate_Ib_SE: // Sign extend to OS size
3744 if (ilen < remain) {
3745 Bit8s temp8s = *iptr;
3746 if (i->os32L())
3747 i->modRMForm.Id = (Bit32s) temp8s;
3748 else
3749 i->modRMForm.Iw = (Bit16s) temp8s;
3750 ilen++;
3752 else {
3753 return(0);
3755 break;
3756 case BxImmediate_Iw:
3757 if ((ilen+1) < remain) {
3758 i->modRMForm.Iw = FetchWORD(iptr);
3759 ilen += 2;
3761 else {
3762 return(0);
3764 break;
3765 case BxImmediate_Id:
3766 if ((ilen+3) < remain) {
3767 i->modRMForm.Id = FetchDWORD(iptr);
3768 ilen += 4;
3770 else {
3771 return(0);
3773 break;
3774 case BxImmediate_Iq: // MOV Rx,imm64
3775 if ((ilen+7) < remain) {
3776 i->IqForm.Iq = FetchQWORD(iptr);
3777 ilen += 8;
3779 else {
3780 return(0);
3782 break;
3783 case BxImmediate_BrOff8:
3784 if (ilen < remain) {
3785 i->modRMForm.Id = (Bit8s) (*iptr);
3786 ilen++;
3788 else {
3789 return(0);
3791 break;
3792 case BxImmediate_IwIb:
3793 if ((ilen+1) < remain) {
3794 i->IxIxForm.Iw = FetchWORD(iptr);
3795 iptr += 2;
3796 ilen += 2;
3798 else return(0);
3799 if (ilen < remain) {
3800 i->IxIxForm.Ib2 = *iptr;
3801 ilen++;
3803 else {
3804 return(0);
3806 break;
3807 case BxImmediate_O:
3808 // For is which embed the address in the opcode. Note
3809 // there is only 64/32-bit addressing available in long-mode.
3810 if (i->as64L()) {
3811 if ((ilen+7) < remain) {
3812 i->IqForm.Iq = FetchQWORD(iptr);
3813 ilen += 8;
3815 else return(0);
3817 else { // as32
3818 if ((ilen+3) < remain) {
3819 i->IqForm.Iq = (Bit64u) FetchDWORD(iptr);
3820 ilen += 4;
3822 else return(0);
3824 break;
3825 default:
3826 BX_INFO(("b1 was %x", b1));
3827 BX_PANIC(("fetchdecode: imm_mode = %u", imm_mode));
3831 #if BX_SUPPORT_3DNOW
3832 if(b1 == 0x10f)
3833 ia_opcode = Bx3DNowOpcodeInfo[i->modRMForm.Ib].IA;
3834 #endif
3836 if (! BX_NULL_SEG_REG(seg_override))
3837 seg = seg_override;
3838 i->setSeg(seg);
3840 #if BX_SUPPORT_TRACE_CACHE
3841 if ((attr & BxTraceEnd) || ia_opcode == BX_IA_ERROR)
3842 i->setStopTraceAttr();
3843 #endif
3845 if (attr & BxArithDstRM) {
3846 i->setRm(nnn);
3847 i->setNnn(rm);
3850 i->execute = BxOpcodesTable[ia_opcode].execute1;
3851 i->execute2 = BxOpcodesTable[ia_opcode].execute2;
3853 i->setB1(b1);
3854 i->setILen(ilen);
3856 #if BX_INSTRUMENTATION
3857 i->ia_opcode = ia_opcode;
3858 #endif
3860 return(1);
3863 void BX_CPP_AttrRegparmN(2) BX_CPU_C::optimize64(bxInstruction_c *i, unsigned resolve)
3865 // empty for now
3868 #endif /* if BX_SUPPORT_X86_64 */