xref: /qemu/target/i386/emulate/x86_decode.c (revision c97d6d2cdf97edb4aebe832fdba65d701ad7bcb6)
1*c97d6d2cSSergio Andres Gomez Del Real /*
2*c97d6d2cSSergio Andres Gomez Del Real  * Copyright (C) 2016 Veertu Inc,
3*c97d6d2cSSergio Andres Gomez Del Real  * Copyright (C) 2017 Google Inc,
4*c97d6d2cSSergio Andres Gomez Del Real  *
5*c97d6d2cSSergio Andres Gomez Del Real  * This program is free software; you can redistribute it and/or
6*c97d6d2cSSergio Andres Gomez Del Real  * modify it under the terms of the GNU General Public License as
7*c97d6d2cSSergio Andres Gomez Del Real  * published by the Free Software Foundation; either version 2 or
8*c97d6d2cSSergio Andres Gomez Del Real  * (at your option) version 3 of the License.
9*c97d6d2cSSergio Andres Gomez Del Real  *
10*c97d6d2cSSergio Andres Gomez Del Real  * This program is distributed in the hope that it will be useful,
11*c97d6d2cSSergio Andres Gomez Del Real  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12*c97d6d2cSSergio Andres Gomez Del Real  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13*c97d6d2cSSergio Andres Gomez Del Real  * GNU General Public License for more details.
14*c97d6d2cSSergio Andres Gomez Del Real  *
15*c97d6d2cSSergio Andres Gomez Del Real  * You should have received a copy of the GNU General Public License along
16*c97d6d2cSSergio Andres Gomez Del Real  * with this program; if not, see <http://www.gnu.org/licenses/>.
17*c97d6d2cSSergio Andres Gomez Del Real  */
18*c97d6d2cSSergio Andres Gomez Del Real 
19*c97d6d2cSSergio Andres Gomez Del Real #include "qemu/osdep.h"
20*c97d6d2cSSergio Andres Gomez Del Real 
21*c97d6d2cSSergio Andres Gomez Del Real #include "x86_decode.h"
22*c97d6d2cSSergio Andres Gomez Del Real #include "string.h"
23*c97d6d2cSSergio Andres Gomez Del Real #include "vmx.h"
24*c97d6d2cSSergio Andres Gomez Del Real #include "x86_gen.h"
25*c97d6d2cSSergio Andres Gomez Del Real #include "x86_mmu.h"
26*c97d6d2cSSergio Andres Gomez Del Real #include "x86_descr.h"
27*c97d6d2cSSergio Andres Gomez Del Real 
28*c97d6d2cSSergio Andres Gomez Del Real #define OPCODE_ESCAPE   0xf
29*c97d6d2cSSergio Andres Gomez Del Real 
30*c97d6d2cSSergio Andres Gomez Del Real static void decode_invalid(CPUX86State *env, struct x86_decode *decode)
31*c97d6d2cSSergio Andres Gomez Del Real {
32*c97d6d2cSSergio Andres Gomez Del Real     printf("%llx: failed to decode instruction ", env->hvf_emul->fetch_rip -
33*c97d6d2cSSergio Andres Gomez Del Real            decode->len);
34*c97d6d2cSSergio Andres Gomez Del Real     for (int i = 0; i < decode->opcode_len; i++) {
35*c97d6d2cSSergio Andres Gomez Del Real         printf("%x ", decode->opcode[i]);
36*c97d6d2cSSergio Andres Gomez Del Real     }
37*c97d6d2cSSergio Andres Gomez Del Real     printf("\n");
38*c97d6d2cSSergio Andres Gomez Del Real     VM_PANIC("decoder failed\n");
39*c97d6d2cSSergio Andres Gomez Del Real }
40*c97d6d2cSSergio Andres Gomez Del Real 
41*c97d6d2cSSergio Andres Gomez Del Real uint64_t sign(uint64_t val, int size)
42*c97d6d2cSSergio Andres Gomez Del Real {
43*c97d6d2cSSergio Andres Gomez Del Real     switch (size) {
44*c97d6d2cSSergio Andres Gomez Del Real     case 1:
45*c97d6d2cSSergio Andres Gomez Del Real         val = (int8_t)val;
46*c97d6d2cSSergio Andres Gomez Del Real         break;
47*c97d6d2cSSergio Andres Gomez Del Real     case 2:
48*c97d6d2cSSergio Andres Gomez Del Real         val = (int16_t)val;
49*c97d6d2cSSergio Andres Gomez Del Real         break;
50*c97d6d2cSSergio Andres Gomez Del Real     case 4:
51*c97d6d2cSSergio Andres Gomez Del Real         val = (int32_t)val;
52*c97d6d2cSSergio Andres Gomez Del Real         break;
53*c97d6d2cSSergio Andres Gomez Del Real     case 8:
54*c97d6d2cSSergio Andres Gomez Del Real         val = (int64_t)val;
55*c97d6d2cSSergio Andres Gomez Del Real         break;
56*c97d6d2cSSergio Andres Gomez Del Real     default:
57*c97d6d2cSSergio Andres Gomez Del Real         VM_PANIC_EX("%s invalid size %d\n", __func__, size);
58*c97d6d2cSSergio Andres Gomez Del Real         break;
59*c97d6d2cSSergio Andres Gomez Del Real     }
60*c97d6d2cSSergio Andres Gomez Del Real     return val;
61*c97d6d2cSSergio Andres Gomez Del Real }
62*c97d6d2cSSergio Andres Gomez Del Real 
63*c97d6d2cSSergio Andres Gomez Del Real static inline uint64_t decode_bytes(CPUX86State *env, struct x86_decode *decode,
64*c97d6d2cSSergio Andres Gomez Del Real                                     int size)
65*c97d6d2cSSergio Andres Gomez Del Real {
66*c97d6d2cSSergio Andres Gomez Del Real     addr_t val = 0;
67*c97d6d2cSSergio Andres Gomez Del Real 
68*c97d6d2cSSergio Andres Gomez Del Real     switch (size) {
69*c97d6d2cSSergio Andres Gomez Del Real     case 1:
70*c97d6d2cSSergio Andres Gomez Del Real     case 2:
71*c97d6d2cSSergio Andres Gomez Del Real     case 4:
72*c97d6d2cSSergio Andres Gomez Del Real     case 8:
73*c97d6d2cSSergio Andres Gomez Del Real         break;
74*c97d6d2cSSergio Andres Gomez Del Real     default:
75*c97d6d2cSSergio Andres Gomez Del Real         VM_PANIC_EX("%s invalid size %d\n", __func__, size);
76*c97d6d2cSSergio Andres Gomez Del Real         break;
77*c97d6d2cSSergio Andres Gomez Del Real     }
78*c97d6d2cSSergio Andres Gomez Del Real     addr_t va  = linear_rip(ENV_GET_CPU(env), RIP(env)) + decode->len;
79*c97d6d2cSSergio Andres Gomez Del Real     vmx_read_mem(ENV_GET_CPU(env), &val, va, size);
80*c97d6d2cSSergio Andres Gomez Del Real     decode->len += size;
81*c97d6d2cSSergio Andres Gomez Del Real 
82*c97d6d2cSSergio Andres Gomez Del Real     return val;
83*c97d6d2cSSergio Andres Gomez Del Real }
84*c97d6d2cSSergio Andres Gomez Del Real 
85*c97d6d2cSSergio Andres Gomez Del Real static inline uint8_t decode_byte(CPUX86State *env, struct x86_decode *decode)
86*c97d6d2cSSergio Andres Gomez Del Real {
87*c97d6d2cSSergio Andres Gomez Del Real     return (uint8_t)decode_bytes(env, decode, 1);
88*c97d6d2cSSergio Andres Gomez Del Real }
89*c97d6d2cSSergio Andres Gomez Del Real 
90*c97d6d2cSSergio Andres Gomez Del Real static inline uint16_t decode_word(CPUX86State *env, struct x86_decode *decode)
91*c97d6d2cSSergio Andres Gomez Del Real {
92*c97d6d2cSSergio Andres Gomez Del Real     return (uint16_t)decode_bytes(env, decode, 2);
93*c97d6d2cSSergio Andres Gomez Del Real }
94*c97d6d2cSSergio Andres Gomez Del Real 
95*c97d6d2cSSergio Andres Gomez Del Real static inline uint32_t decode_dword(CPUX86State *env, struct x86_decode *decode)
96*c97d6d2cSSergio Andres Gomez Del Real {
97*c97d6d2cSSergio Andres Gomez Del Real     return (uint32_t)decode_bytes(env, decode, 4);
98*c97d6d2cSSergio Andres Gomez Del Real }
99*c97d6d2cSSergio Andres Gomez Del Real 
100*c97d6d2cSSergio Andres Gomez Del Real static inline uint64_t decode_qword(CPUX86State *env, struct x86_decode *decode)
101*c97d6d2cSSergio Andres Gomez Del Real {
102*c97d6d2cSSergio Andres Gomez Del Real     return decode_bytes(env, decode, 8);
103*c97d6d2cSSergio Andres Gomez Del Real }
104*c97d6d2cSSergio Andres Gomez Del Real 
105*c97d6d2cSSergio Andres Gomez Del Real static void decode_modrm_rm(CPUX86State *env, struct x86_decode *decode,
106*c97d6d2cSSergio Andres Gomez Del Real                             struct x86_decode_op *op)
107*c97d6d2cSSergio Andres Gomez Del Real {
108*c97d6d2cSSergio Andres Gomez Del Real     op->type = X86_VAR_RM;
109*c97d6d2cSSergio Andres Gomez Del Real }
110*c97d6d2cSSergio Andres Gomez Del Real 
111*c97d6d2cSSergio Andres Gomez Del Real static void decode_modrm_reg(CPUX86State *env, struct x86_decode *decode,
112*c97d6d2cSSergio Andres Gomez Del Real                              struct x86_decode_op *op)
113*c97d6d2cSSergio Andres Gomez Del Real {
114*c97d6d2cSSergio Andres Gomez Del Real     op->type = X86_VAR_REG;
115*c97d6d2cSSergio Andres Gomez Del Real     op->reg = decode->modrm.reg;
116*c97d6d2cSSergio Andres Gomez Del Real     op->ptr = get_reg_ref(env, op->reg, decode->rex.r, decode->operand_size);
117*c97d6d2cSSergio Andres Gomez Del Real }
118*c97d6d2cSSergio Andres Gomez Del Real 
119*c97d6d2cSSergio Andres Gomez Del Real static void decode_rax(CPUX86State *env, struct x86_decode *decode,
120*c97d6d2cSSergio Andres Gomez Del Real                        struct x86_decode_op *op)
121*c97d6d2cSSergio Andres Gomez Del Real {
122*c97d6d2cSSergio Andres Gomez Del Real     op->type = X86_VAR_REG;
123*c97d6d2cSSergio Andres Gomez Del Real     op->reg = REG_RAX;
124*c97d6d2cSSergio Andres Gomez Del Real     op->ptr = get_reg_ref(env, op->reg, 0, decode->operand_size);
125*c97d6d2cSSergio Andres Gomez Del Real }
126*c97d6d2cSSergio Andres Gomez Del Real 
127*c97d6d2cSSergio Andres Gomez Del Real static inline void decode_immediate(CPUX86State *env, struct x86_decode *decode,
128*c97d6d2cSSergio Andres Gomez Del Real                                     struct x86_decode_op *var, int size)
129*c97d6d2cSSergio Andres Gomez Del Real {
130*c97d6d2cSSergio Andres Gomez Del Real     var->type = X86_VAR_IMMEDIATE;
131*c97d6d2cSSergio Andres Gomez Del Real     var->size = size;
132*c97d6d2cSSergio Andres Gomez Del Real     switch (size) {
133*c97d6d2cSSergio Andres Gomez Del Real     case 1:
134*c97d6d2cSSergio Andres Gomez Del Real         var->val = decode_byte(env, decode);
135*c97d6d2cSSergio Andres Gomez Del Real         break;
136*c97d6d2cSSergio Andres Gomez Del Real     case 2:
137*c97d6d2cSSergio Andres Gomez Del Real         var->val = decode_word(env, decode);
138*c97d6d2cSSergio Andres Gomez Del Real         break;
139*c97d6d2cSSergio Andres Gomez Del Real     case 4:
140*c97d6d2cSSergio Andres Gomez Del Real         var->val = decode_dword(env, decode);
141*c97d6d2cSSergio Andres Gomez Del Real         break;
142*c97d6d2cSSergio Andres Gomez Del Real     case 8:
143*c97d6d2cSSergio Andres Gomez Del Real         var->val = decode_qword(env, decode);
144*c97d6d2cSSergio Andres Gomez Del Real         break;
145*c97d6d2cSSergio Andres Gomez Del Real     default:
146*c97d6d2cSSergio Andres Gomez Del Real         VM_PANIC_EX("bad size %d\n", size);
147*c97d6d2cSSergio Andres Gomez Del Real     }
148*c97d6d2cSSergio Andres Gomez Del Real }
149*c97d6d2cSSergio Andres Gomez Del Real 
150*c97d6d2cSSergio Andres Gomez Del Real static void decode_imm8(CPUX86State *env, struct x86_decode *decode,
151*c97d6d2cSSergio Andres Gomez Del Real                         struct x86_decode_op *op)
152*c97d6d2cSSergio Andres Gomez Del Real {
153*c97d6d2cSSergio Andres Gomez Del Real     decode_immediate(env, decode, op, 1);
154*c97d6d2cSSergio Andres Gomez Del Real     op->type = X86_VAR_IMMEDIATE;
155*c97d6d2cSSergio Andres Gomez Del Real }
156*c97d6d2cSSergio Andres Gomez Del Real 
157*c97d6d2cSSergio Andres Gomez Del Real static void decode_imm8_signed(CPUX86State *env, struct x86_decode *decode,
158*c97d6d2cSSergio Andres Gomez Del Real                                struct x86_decode_op *op)
159*c97d6d2cSSergio Andres Gomez Del Real {
160*c97d6d2cSSergio Andres Gomez Del Real     decode_immediate(env, decode, op, 1);
161*c97d6d2cSSergio Andres Gomez Del Real     op->val = sign(op->val, 1);
162*c97d6d2cSSergio Andres Gomez Del Real     op->type = X86_VAR_IMMEDIATE;
163*c97d6d2cSSergio Andres Gomez Del Real }
164*c97d6d2cSSergio Andres Gomez Del Real 
165*c97d6d2cSSergio Andres Gomez Del Real static void decode_imm16(CPUX86State *env, struct x86_decode *decode,
166*c97d6d2cSSergio Andres Gomez Del Real                          struct x86_decode_op *op)
167*c97d6d2cSSergio Andres Gomez Del Real {
168*c97d6d2cSSergio Andres Gomez Del Real     decode_immediate(env, decode, op, 2);
169*c97d6d2cSSergio Andres Gomez Del Real     op->type = X86_VAR_IMMEDIATE;
170*c97d6d2cSSergio Andres Gomez Del Real }
171*c97d6d2cSSergio Andres Gomez Del Real 
172*c97d6d2cSSergio Andres Gomez Del Real 
173*c97d6d2cSSergio Andres Gomez Del Real static void decode_imm(CPUX86State *env, struct x86_decode *decode,
174*c97d6d2cSSergio Andres Gomez Del Real                        struct x86_decode_op *op)
175*c97d6d2cSSergio Andres Gomez Del Real {
176*c97d6d2cSSergio Andres Gomez Del Real     if (8 == decode->operand_size) {
177*c97d6d2cSSergio Andres Gomez Del Real         decode_immediate(env, decode, op, 4);
178*c97d6d2cSSergio Andres Gomez Del Real         op->val = sign(op->val, decode->operand_size);
179*c97d6d2cSSergio Andres Gomez Del Real     } else {
180*c97d6d2cSSergio Andres Gomez Del Real         decode_immediate(env, decode, op, decode->operand_size);
181*c97d6d2cSSergio Andres Gomez Del Real     }
182*c97d6d2cSSergio Andres Gomez Del Real     op->type = X86_VAR_IMMEDIATE;
183*c97d6d2cSSergio Andres Gomez Del Real }
184*c97d6d2cSSergio Andres Gomez Del Real 
185*c97d6d2cSSergio Andres Gomez Del Real static void decode_imm_signed(CPUX86State *env, struct x86_decode *decode,
186*c97d6d2cSSergio Andres Gomez Del Real                               struct x86_decode_op *op)
187*c97d6d2cSSergio Andres Gomez Del Real {
188*c97d6d2cSSergio Andres Gomez Del Real     decode_immediate(env, decode, op, decode->operand_size);
189*c97d6d2cSSergio Andres Gomez Del Real     op->val = sign(op->val, decode->operand_size);
190*c97d6d2cSSergio Andres Gomez Del Real     op->type = X86_VAR_IMMEDIATE;
191*c97d6d2cSSergio Andres Gomez Del Real }
192*c97d6d2cSSergio Andres Gomez Del Real 
193*c97d6d2cSSergio Andres Gomez Del Real static void decode_imm_1(CPUX86State *env, struct x86_decode *decode,
194*c97d6d2cSSergio Andres Gomez Del Real                          struct x86_decode_op *op)
195*c97d6d2cSSergio Andres Gomez Del Real {
196*c97d6d2cSSergio Andres Gomez Del Real     op->type = X86_VAR_IMMEDIATE;
197*c97d6d2cSSergio Andres Gomez Del Real     op->val = 1;
198*c97d6d2cSSergio Andres Gomez Del Real }
199*c97d6d2cSSergio Andres Gomez Del Real 
200*c97d6d2cSSergio Andres Gomez Del Real static void decode_imm_0(CPUX86State *env, struct x86_decode *decode,
201*c97d6d2cSSergio Andres Gomez Del Real                          struct x86_decode_op *op)
202*c97d6d2cSSergio Andres Gomez Del Real {
203*c97d6d2cSSergio Andres Gomez Del Real     op->type = X86_VAR_IMMEDIATE;
204*c97d6d2cSSergio Andres Gomez Del Real     op->val = 0;
205*c97d6d2cSSergio Andres Gomez Del Real }
206*c97d6d2cSSergio Andres Gomez Del Real 
207*c97d6d2cSSergio Andres Gomez Del Real 
208*c97d6d2cSSergio Andres Gomez Del Real static void decode_pushseg(CPUX86State *env, struct x86_decode *decode)
209*c97d6d2cSSergio Andres Gomez Del Real {
210*c97d6d2cSSergio Andres Gomez Del Real     uint8_t op = (decode->opcode_len > 1) ? decode->opcode[1] : decode->opcode[0];
211*c97d6d2cSSergio Andres Gomez Del Real 
212*c97d6d2cSSergio Andres Gomez Del Real     decode->op[0].type = X86_VAR_REG;
213*c97d6d2cSSergio Andres Gomez Del Real     switch (op) {
214*c97d6d2cSSergio Andres Gomez Del Real     case 0xe:
215*c97d6d2cSSergio Andres Gomez Del Real         decode->op[0].reg = REG_SEG_CS;
216*c97d6d2cSSergio Andres Gomez Del Real         break;
217*c97d6d2cSSergio Andres Gomez Del Real     case 0x16:
218*c97d6d2cSSergio Andres Gomez Del Real         decode->op[0].reg = REG_SEG_SS;
219*c97d6d2cSSergio Andres Gomez Del Real         break;
220*c97d6d2cSSergio Andres Gomez Del Real     case 0x1e:
221*c97d6d2cSSergio Andres Gomez Del Real         decode->op[0].reg = REG_SEG_DS;
222*c97d6d2cSSergio Andres Gomez Del Real         break;
223*c97d6d2cSSergio Andres Gomez Del Real     case 0x06:
224*c97d6d2cSSergio Andres Gomez Del Real         decode->op[0].reg = REG_SEG_ES;
225*c97d6d2cSSergio Andres Gomez Del Real         break;
226*c97d6d2cSSergio Andres Gomez Del Real     case 0xa0:
227*c97d6d2cSSergio Andres Gomez Del Real         decode->op[0].reg = REG_SEG_FS;
228*c97d6d2cSSergio Andres Gomez Del Real         break;
229*c97d6d2cSSergio Andres Gomez Del Real     case 0xa8:
230*c97d6d2cSSergio Andres Gomez Del Real         decode->op[0].reg = REG_SEG_GS;
231*c97d6d2cSSergio Andres Gomez Del Real         break;
232*c97d6d2cSSergio Andres Gomez Del Real     }
233*c97d6d2cSSergio Andres Gomez Del Real }
234*c97d6d2cSSergio Andres Gomez Del Real 
235*c97d6d2cSSergio Andres Gomez Del Real static void decode_popseg(CPUX86State *env, struct x86_decode *decode)
236*c97d6d2cSSergio Andres Gomez Del Real {
237*c97d6d2cSSergio Andres Gomez Del Real     uint8_t op = (decode->opcode_len > 1) ? decode->opcode[1] : decode->opcode[0];
238*c97d6d2cSSergio Andres Gomez Del Real 
239*c97d6d2cSSergio Andres Gomez Del Real     decode->op[0].type = X86_VAR_REG;
240*c97d6d2cSSergio Andres Gomez Del Real     switch (op) {
241*c97d6d2cSSergio Andres Gomez Del Real     case 0xf:
242*c97d6d2cSSergio Andres Gomez Del Real         decode->op[0].reg = REG_SEG_CS;
243*c97d6d2cSSergio Andres Gomez Del Real         break;
244*c97d6d2cSSergio Andres Gomez Del Real     case 0x17:
245*c97d6d2cSSergio Andres Gomez Del Real         decode->op[0].reg = REG_SEG_SS;
246*c97d6d2cSSergio Andres Gomez Del Real         break;
247*c97d6d2cSSergio Andres Gomez Del Real     case 0x1f:
248*c97d6d2cSSergio Andres Gomez Del Real         decode->op[0].reg = REG_SEG_DS;
249*c97d6d2cSSergio Andres Gomez Del Real         break;
250*c97d6d2cSSergio Andres Gomez Del Real     case 0x07:
251*c97d6d2cSSergio Andres Gomez Del Real         decode->op[0].reg = REG_SEG_ES;
252*c97d6d2cSSergio Andres Gomez Del Real         break;
253*c97d6d2cSSergio Andres Gomez Del Real     case 0xa1:
254*c97d6d2cSSergio Andres Gomez Del Real         decode->op[0].reg = REG_SEG_FS;
255*c97d6d2cSSergio Andres Gomez Del Real         break;
256*c97d6d2cSSergio Andres Gomez Del Real     case 0xa9:
257*c97d6d2cSSergio Andres Gomez Del Real         decode->op[0].reg = REG_SEG_GS;
258*c97d6d2cSSergio Andres Gomez Del Real         break;
259*c97d6d2cSSergio Andres Gomez Del Real     }
260*c97d6d2cSSergio Andres Gomez Del Real }
261*c97d6d2cSSergio Andres Gomez Del Real 
262*c97d6d2cSSergio Andres Gomez Del Real static void decode_incgroup(CPUX86State *env, struct x86_decode *decode)
263*c97d6d2cSSergio Andres Gomez Del Real {
264*c97d6d2cSSergio Andres Gomez Del Real     decode->op[0].type = X86_VAR_REG;
265*c97d6d2cSSergio Andres Gomez Del Real     decode->op[0].reg = decode->opcode[0] - 0x40;
266*c97d6d2cSSergio Andres Gomez Del Real     decode->op[0].ptr = get_reg_ref(env, decode->op[0].reg, decode->rex.b,
267*c97d6d2cSSergio Andres Gomez Del Real                                     decode->operand_size);
268*c97d6d2cSSergio Andres Gomez Del Real }
269*c97d6d2cSSergio Andres Gomez Del Real 
270*c97d6d2cSSergio Andres Gomez Del Real static void decode_decgroup(CPUX86State *env, struct x86_decode *decode)
271*c97d6d2cSSergio Andres Gomez Del Real {
272*c97d6d2cSSergio Andres Gomez Del Real     decode->op[0].type = X86_VAR_REG;
273*c97d6d2cSSergio Andres Gomez Del Real     decode->op[0].reg = decode->opcode[0] - 0x48;
274*c97d6d2cSSergio Andres Gomez Del Real     decode->op[0].ptr = get_reg_ref(env, decode->op[0].reg, decode->rex.b,
275*c97d6d2cSSergio Andres Gomez Del Real                                     decode->operand_size);
276*c97d6d2cSSergio Andres Gomez Del Real }
277*c97d6d2cSSergio Andres Gomez Del Real 
278*c97d6d2cSSergio Andres Gomez Del Real static void decode_incgroup2(CPUX86State *env, struct x86_decode *decode)
279*c97d6d2cSSergio Andres Gomez Del Real {
280*c97d6d2cSSergio Andres Gomez Del Real     if (!decode->modrm.reg) {
281*c97d6d2cSSergio Andres Gomez Del Real         decode->cmd = X86_DECODE_CMD_INC;
282*c97d6d2cSSergio Andres Gomez Del Real     } else if (1 == decode->modrm.reg) {
283*c97d6d2cSSergio Andres Gomez Del Real         decode->cmd = X86_DECODE_CMD_DEC;
284*c97d6d2cSSergio Andres Gomez Del Real     }
285*c97d6d2cSSergio Andres Gomez Del Real }
286*c97d6d2cSSergio Andres Gomez Del Real 
287*c97d6d2cSSergio Andres Gomez Del Real static void decode_pushgroup(CPUX86State *env, struct x86_decode *decode)
288*c97d6d2cSSergio Andres Gomez Del Real {
289*c97d6d2cSSergio Andres Gomez Del Real     decode->op[0].type = X86_VAR_REG;
290*c97d6d2cSSergio Andres Gomez Del Real     decode->op[0].reg = decode->opcode[0] - 0x50;
291*c97d6d2cSSergio Andres Gomez Del Real     decode->op[0].ptr = get_reg_ref(env, decode->op[0].reg, decode->rex.b,
292*c97d6d2cSSergio Andres Gomez Del Real                                     decode->operand_size);
293*c97d6d2cSSergio Andres Gomez Del Real }
294*c97d6d2cSSergio Andres Gomez Del Real 
295*c97d6d2cSSergio Andres Gomez Del Real static void decode_popgroup(CPUX86State *env, struct x86_decode *decode)
296*c97d6d2cSSergio Andres Gomez Del Real {
297*c97d6d2cSSergio Andres Gomez Del Real     decode->op[0].type = X86_VAR_REG;
298*c97d6d2cSSergio Andres Gomez Del Real     decode->op[0].reg = decode->opcode[0] - 0x58;
299*c97d6d2cSSergio Andres Gomez Del Real     decode->op[0].ptr = get_reg_ref(env, decode->op[0].reg, decode->rex.b,
300*c97d6d2cSSergio Andres Gomez Del Real                                     decode->operand_size);
301*c97d6d2cSSergio Andres Gomez Del Real }
302*c97d6d2cSSergio Andres Gomez Del Real 
303*c97d6d2cSSergio Andres Gomez Del Real static void decode_jxx(CPUX86State *env, struct x86_decode *decode)
304*c97d6d2cSSergio Andres Gomez Del Real {
305*c97d6d2cSSergio Andres Gomez Del Real     decode->displacement = decode_bytes(env, decode, decode->operand_size);
306*c97d6d2cSSergio Andres Gomez Del Real     decode->displacement_size = decode->operand_size;
307*c97d6d2cSSergio Andres Gomez Del Real }
308*c97d6d2cSSergio Andres Gomez Del Real 
309*c97d6d2cSSergio Andres Gomez Del Real static void decode_farjmp(CPUX86State *env, struct x86_decode *decode)
310*c97d6d2cSSergio Andres Gomez Del Real {
311*c97d6d2cSSergio Andres Gomez Del Real     decode->op[0].type = X86_VAR_IMMEDIATE;
312*c97d6d2cSSergio Andres Gomez Del Real     decode->op[0].val = decode_bytes(env, decode, decode->operand_size);
313*c97d6d2cSSergio Andres Gomez Del Real     decode->displacement = decode_word(env, decode);
314*c97d6d2cSSergio Andres Gomez Del Real }
315*c97d6d2cSSergio Andres Gomez Del Real 
316*c97d6d2cSSergio Andres Gomez Del Real static void decode_addgroup(CPUX86State *env, struct x86_decode *decode)
317*c97d6d2cSSergio Andres Gomez Del Real {
318*c97d6d2cSSergio Andres Gomez Del Real     enum x86_decode_cmd group[] = {
319*c97d6d2cSSergio Andres Gomez Del Real         X86_DECODE_CMD_ADD,
320*c97d6d2cSSergio Andres Gomez Del Real         X86_DECODE_CMD_OR,
321*c97d6d2cSSergio Andres Gomez Del Real         X86_DECODE_CMD_ADC,
322*c97d6d2cSSergio Andres Gomez Del Real         X86_DECODE_CMD_SBB,
323*c97d6d2cSSergio Andres Gomez Del Real         X86_DECODE_CMD_AND,
324*c97d6d2cSSergio Andres Gomez Del Real         X86_DECODE_CMD_SUB,
325*c97d6d2cSSergio Andres Gomez Del Real         X86_DECODE_CMD_XOR,
326*c97d6d2cSSergio Andres Gomez Del Real         X86_DECODE_CMD_CMP
327*c97d6d2cSSergio Andres Gomez Del Real     };
328*c97d6d2cSSergio Andres Gomez Del Real     decode->cmd = group[decode->modrm.reg];
329*c97d6d2cSSergio Andres Gomez Del Real }
330*c97d6d2cSSergio Andres Gomez Del Real 
331*c97d6d2cSSergio Andres Gomez Del Real static void decode_rotgroup(CPUX86State *env, struct x86_decode *decode)
332*c97d6d2cSSergio Andres Gomez Del Real {
333*c97d6d2cSSergio Andres Gomez Del Real     enum x86_decode_cmd group[] = {
334*c97d6d2cSSergio Andres Gomez Del Real         X86_DECODE_CMD_ROL,
335*c97d6d2cSSergio Andres Gomez Del Real         X86_DECODE_CMD_ROR,
336*c97d6d2cSSergio Andres Gomez Del Real         X86_DECODE_CMD_RCL,
337*c97d6d2cSSergio Andres Gomez Del Real         X86_DECODE_CMD_RCR,
338*c97d6d2cSSergio Andres Gomez Del Real         X86_DECODE_CMD_SHL,
339*c97d6d2cSSergio Andres Gomez Del Real         X86_DECODE_CMD_SHR,
340*c97d6d2cSSergio Andres Gomez Del Real         X86_DECODE_CMD_SHL,
341*c97d6d2cSSergio Andres Gomez Del Real         X86_DECODE_CMD_SAR
342*c97d6d2cSSergio Andres Gomez Del Real     };
343*c97d6d2cSSergio Andres Gomez Del Real     decode->cmd = group[decode->modrm.reg];
344*c97d6d2cSSergio Andres Gomez Del Real }
345*c97d6d2cSSergio Andres Gomez Del Real 
346*c97d6d2cSSergio Andres Gomez Del Real static void decode_f7group(CPUX86State *env, struct x86_decode *decode)
347*c97d6d2cSSergio Andres Gomez Del Real {
348*c97d6d2cSSergio Andres Gomez Del Real     enum x86_decode_cmd group[] = {
349*c97d6d2cSSergio Andres Gomez Del Real         X86_DECODE_CMD_TST,
350*c97d6d2cSSergio Andres Gomez Del Real         X86_DECODE_CMD_TST,
351*c97d6d2cSSergio Andres Gomez Del Real         X86_DECODE_CMD_NOT,
352*c97d6d2cSSergio Andres Gomez Del Real         X86_DECODE_CMD_NEG,
353*c97d6d2cSSergio Andres Gomez Del Real         X86_DECODE_CMD_MUL,
354*c97d6d2cSSergio Andres Gomez Del Real         X86_DECODE_CMD_IMUL_1,
355*c97d6d2cSSergio Andres Gomez Del Real         X86_DECODE_CMD_DIV,
356*c97d6d2cSSergio Andres Gomez Del Real         X86_DECODE_CMD_IDIV
357*c97d6d2cSSergio Andres Gomez Del Real     };
358*c97d6d2cSSergio Andres Gomez Del Real     decode->cmd = group[decode->modrm.reg];
359*c97d6d2cSSergio Andres Gomez Del Real     decode_modrm_rm(env, decode, &decode->op[0]);
360*c97d6d2cSSergio Andres Gomez Del Real 
361*c97d6d2cSSergio Andres Gomez Del Real     switch (decode->modrm.reg) {
362*c97d6d2cSSergio Andres Gomez Del Real     case 0:
363*c97d6d2cSSergio Andres Gomez Del Real     case 1:
364*c97d6d2cSSergio Andres Gomez Del Real         decode_imm(env, decode, &decode->op[1]);
365*c97d6d2cSSergio Andres Gomez Del Real         break;
366*c97d6d2cSSergio Andres Gomez Del Real     case 2:
367*c97d6d2cSSergio Andres Gomez Del Real         break;
368*c97d6d2cSSergio Andres Gomez Del Real     case 3:
369*c97d6d2cSSergio Andres Gomez Del Real         decode->op[1].type = X86_VAR_IMMEDIATE;
370*c97d6d2cSSergio Andres Gomez Del Real         decode->op[1].val = 0;
371*c97d6d2cSSergio Andres Gomez Del Real         break;
372*c97d6d2cSSergio Andres Gomez Del Real     default:
373*c97d6d2cSSergio Andres Gomez Del Real         break;
374*c97d6d2cSSergio Andres Gomez Del Real     }
375*c97d6d2cSSergio Andres Gomez Del Real }
376*c97d6d2cSSergio Andres Gomez Del Real 
377*c97d6d2cSSergio Andres Gomez Del Real static void decode_xchgroup(CPUX86State *env, struct x86_decode *decode)
378*c97d6d2cSSergio Andres Gomez Del Real {
379*c97d6d2cSSergio Andres Gomez Del Real     decode->op[0].type = X86_VAR_REG;
380*c97d6d2cSSergio Andres Gomez Del Real     decode->op[0].reg = decode->opcode[0] - 0x90;
381*c97d6d2cSSergio Andres Gomez Del Real     decode->op[0].ptr = get_reg_ref(env, decode->op[0].reg, decode->rex.b,
382*c97d6d2cSSergio Andres Gomez Del Real                                     decode->operand_size);
383*c97d6d2cSSergio Andres Gomez Del Real }
384*c97d6d2cSSergio Andres Gomez Del Real 
385*c97d6d2cSSergio Andres Gomez Del Real static void decode_movgroup(CPUX86State *env, struct x86_decode *decode)
386*c97d6d2cSSergio Andres Gomez Del Real {
387*c97d6d2cSSergio Andres Gomez Del Real     decode->op[0].type = X86_VAR_REG;
388*c97d6d2cSSergio Andres Gomez Del Real     decode->op[0].reg = decode->opcode[0] - 0xb8;
389*c97d6d2cSSergio Andres Gomez Del Real     decode->op[0].ptr = get_reg_ref(env, decode->op[0].reg, decode->rex.b,
390*c97d6d2cSSergio Andres Gomez Del Real                                     decode->operand_size);
391*c97d6d2cSSergio Andres Gomez Del Real     decode_immediate(env, decode, &decode->op[1], decode->operand_size);
392*c97d6d2cSSergio Andres Gomez Del Real }
393*c97d6d2cSSergio Andres Gomez Del Real 
394*c97d6d2cSSergio Andres Gomez Del Real static void fetch_moffs(CPUX86State *env, struct x86_decode *decode,
395*c97d6d2cSSergio Andres Gomez Del Real                         struct x86_decode_op *op)
396*c97d6d2cSSergio Andres Gomez Del Real {
397*c97d6d2cSSergio Andres Gomez Del Real     op->type = X86_VAR_OFFSET;
398*c97d6d2cSSergio Andres Gomez Del Real     op->ptr = decode_bytes(env, decode, decode->addressing_size);
399*c97d6d2cSSergio Andres Gomez Del Real }
400*c97d6d2cSSergio Andres Gomez Del Real 
401*c97d6d2cSSergio Andres Gomez Del Real static void decode_movgroup8(CPUX86State *env, struct x86_decode *decode)
402*c97d6d2cSSergio Andres Gomez Del Real {
403*c97d6d2cSSergio Andres Gomez Del Real     decode->op[0].type = X86_VAR_REG;
404*c97d6d2cSSergio Andres Gomez Del Real     decode->op[0].reg = decode->opcode[0] - 0xb0;
405*c97d6d2cSSergio Andres Gomez Del Real     decode->op[0].ptr = get_reg_ref(env, decode->op[0].reg, decode->rex.b,
406*c97d6d2cSSergio Andres Gomez Del Real                                     decode->operand_size);
407*c97d6d2cSSergio Andres Gomez Del Real     decode_immediate(env, decode, &decode->op[1], decode->operand_size);
408*c97d6d2cSSergio Andres Gomez Del Real }
409*c97d6d2cSSergio Andres Gomez Del Real 
410*c97d6d2cSSergio Andres Gomez Del Real static void decode_rcx(CPUX86State *env, struct x86_decode *decode,
411*c97d6d2cSSergio Andres Gomez Del Real                        struct x86_decode_op *op)
412*c97d6d2cSSergio Andres Gomez Del Real {
413*c97d6d2cSSergio Andres Gomez Del Real     op->type = X86_VAR_REG;
414*c97d6d2cSSergio Andres Gomez Del Real     op->reg = REG_RCX;
415*c97d6d2cSSergio Andres Gomez Del Real     op->ptr = get_reg_ref(env, op->reg, decode->rex.b, decode->operand_size);
416*c97d6d2cSSergio Andres Gomez Del Real }
417*c97d6d2cSSergio Andres Gomez Del Real 
418*c97d6d2cSSergio Andres Gomez Del Real struct decode_tbl {
419*c97d6d2cSSergio Andres Gomez Del Real     uint8_t opcode;
420*c97d6d2cSSergio Andres Gomez Del Real     enum x86_decode_cmd cmd;
421*c97d6d2cSSergio Andres Gomez Del Real     uint8_t operand_size;
422*c97d6d2cSSergio Andres Gomez Del Real     bool is_modrm;
423*c97d6d2cSSergio Andres Gomez Del Real     void (*decode_op1)(CPUX86State *env, struct x86_decode *decode,
424*c97d6d2cSSergio Andres Gomez Del Real                        struct x86_decode_op *op1);
425*c97d6d2cSSergio Andres Gomez Del Real     void (*decode_op2)(CPUX86State *env, struct x86_decode *decode,
426*c97d6d2cSSergio Andres Gomez Del Real                        struct x86_decode_op *op2);
427*c97d6d2cSSergio Andres Gomez Del Real     void (*decode_op3)(CPUX86State *env, struct x86_decode *decode,
428*c97d6d2cSSergio Andres Gomez Del Real                        struct x86_decode_op *op3);
429*c97d6d2cSSergio Andres Gomez Del Real     void (*decode_op4)(CPUX86State *env, struct x86_decode *decode,
430*c97d6d2cSSergio Andres Gomez Del Real                        struct x86_decode_op *op4);
431*c97d6d2cSSergio Andres Gomez Del Real     void (*decode_postfix)(CPUX86State *env, struct x86_decode *decode);
432*c97d6d2cSSergio Andres Gomez Del Real     addr_t flags_mask;
433*c97d6d2cSSergio Andres Gomez Del Real };
434*c97d6d2cSSergio Andres Gomez Del Real 
435*c97d6d2cSSergio Andres Gomez Del Real struct decode_x87_tbl {
436*c97d6d2cSSergio Andres Gomez Del Real     uint8_t opcode;
437*c97d6d2cSSergio Andres Gomez Del Real     uint8_t modrm_reg;
438*c97d6d2cSSergio Andres Gomez Del Real     uint8_t modrm_mod;
439*c97d6d2cSSergio Andres Gomez Del Real     enum x86_decode_cmd cmd;
440*c97d6d2cSSergio Andres Gomez Del Real     uint8_t operand_size;
441*c97d6d2cSSergio Andres Gomez Del Real     bool rev;
442*c97d6d2cSSergio Andres Gomez Del Real     bool pop;
443*c97d6d2cSSergio Andres Gomez Del Real     void (*decode_op1)(CPUX86State *env, struct x86_decode *decode,
444*c97d6d2cSSergio Andres Gomez Del Real                        struct x86_decode_op *op1);
445*c97d6d2cSSergio Andres Gomez Del Real     void (*decode_op2)(CPUX86State *env, struct x86_decode *decode,
446*c97d6d2cSSergio Andres Gomez Del Real                        struct x86_decode_op *op2);
447*c97d6d2cSSergio Andres Gomez Del Real     void (*decode_postfix)(CPUX86State *env, struct x86_decode *decode);
448*c97d6d2cSSergio Andres Gomez Del Real     addr_t flags_mask;
449*c97d6d2cSSergio Andres Gomez Del Real };
450*c97d6d2cSSergio Andres Gomez Del Real 
451*c97d6d2cSSergio Andres Gomez Del Real struct decode_tbl invl_inst = {0x0, 0, 0, false, NULL, NULL, NULL, NULL,
452*c97d6d2cSSergio Andres Gomez Del Real                                decode_invalid};
453*c97d6d2cSSergio Andres Gomez Del Real 
454*c97d6d2cSSergio Andres Gomez Del Real struct decode_tbl _decode_tbl1[255];
455*c97d6d2cSSergio Andres Gomez Del Real struct decode_tbl _decode_tbl2[255];
456*c97d6d2cSSergio Andres Gomez Del Real struct decode_x87_tbl _decode_tbl3[255];
457*c97d6d2cSSergio Andres Gomez Del Real 
458*c97d6d2cSSergio Andres Gomez Del Real static void decode_x87_ins(CPUX86State *env, struct x86_decode *decode)
459*c97d6d2cSSergio Andres Gomez Del Real {
460*c97d6d2cSSergio Andres Gomez Del Real     struct decode_x87_tbl *decoder;
461*c97d6d2cSSergio Andres Gomez Del Real 
462*c97d6d2cSSergio Andres Gomez Del Real     decode->is_fpu = true;
463*c97d6d2cSSergio Andres Gomez Del Real     int mode = decode->modrm.mod == 3 ? 1 : 0;
464*c97d6d2cSSergio Andres Gomez Del Real     int index = ((decode->opcode[0] & 0xf) << 4) | (mode << 3) |
465*c97d6d2cSSergio Andres Gomez Del Real                  decode->modrm.reg;
466*c97d6d2cSSergio Andres Gomez Del Real 
467*c97d6d2cSSergio Andres Gomez Del Real     decoder = &_decode_tbl3[index];
468*c97d6d2cSSergio Andres Gomez Del Real 
469*c97d6d2cSSergio Andres Gomez Del Real     decode->cmd = decoder->cmd;
470*c97d6d2cSSergio Andres Gomez Del Real     if (decoder->operand_size) {
471*c97d6d2cSSergio Andres Gomez Del Real         decode->operand_size = decoder->operand_size;
472*c97d6d2cSSergio Andres Gomez Del Real     }
473*c97d6d2cSSergio Andres Gomez Del Real     decode->flags_mask = decoder->flags_mask;
474*c97d6d2cSSergio Andres Gomez Del Real     decode->fpop_stack = decoder->pop;
475*c97d6d2cSSergio Andres Gomez Del Real     decode->frev = decoder->rev;
476*c97d6d2cSSergio Andres Gomez Del Real 
477*c97d6d2cSSergio Andres Gomez Del Real     if (decoder->decode_op1) {
478*c97d6d2cSSergio Andres Gomez Del Real         decoder->decode_op1(env, decode, &decode->op[0]);
479*c97d6d2cSSergio Andres Gomez Del Real     }
480*c97d6d2cSSergio Andres Gomez Del Real     if (decoder->decode_op2) {
481*c97d6d2cSSergio Andres Gomez Del Real         decoder->decode_op2(env, decode, &decode->op[1]);
482*c97d6d2cSSergio Andres Gomez Del Real     }
483*c97d6d2cSSergio Andres Gomez Del Real     if (decoder->decode_postfix) {
484*c97d6d2cSSergio Andres Gomez Del Real         decoder->decode_postfix(env, decode);
485*c97d6d2cSSergio Andres Gomez Del Real     }
486*c97d6d2cSSergio Andres Gomez Del Real 
487*c97d6d2cSSergio Andres Gomez Del Real     VM_PANIC_ON_EX(!decode->cmd, "x87 opcode %x %x (%x %x) not decoded\n",
488*c97d6d2cSSergio Andres Gomez Del Real                    decode->opcode[0], decode->modrm.modrm, decoder->modrm_reg,
489*c97d6d2cSSergio Andres Gomez Del Real                    decoder->modrm_mod);
490*c97d6d2cSSergio Andres Gomez Del Real }
491*c97d6d2cSSergio Andres Gomez Del Real 
492*c97d6d2cSSergio Andres Gomez Del Real static void decode_ffgroup(CPUX86State *env, struct x86_decode *decode)
493*c97d6d2cSSergio Andres Gomez Del Real {
494*c97d6d2cSSergio Andres Gomez Del Real     enum x86_decode_cmd group[] = {
495*c97d6d2cSSergio Andres Gomez Del Real         X86_DECODE_CMD_INC,
496*c97d6d2cSSergio Andres Gomez Del Real         X86_DECODE_CMD_DEC,
497*c97d6d2cSSergio Andres Gomez Del Real         X86_DECODE_CMD_CALL_NEAR_ABS_INDIRECT,
498*c97d6d2cSSergio Andres Gomez Del Real         X86_DECODE_CMD_CALL_FAR_ABS_INDIRECT,
499*c97d6d2cSSergio Andres Gomez Del Real         X86_DECODE_CMD_JMP_NEAR_ABS_INDIRECT,
500*c97d6d2cSSergio Andres Gomez Del Real         X86_DECODE_CMD_JMP_FAR_ABS_INDIRECT,
501*c97d6d2cSSergio Andres Gomez Del Real         X86_DECODE_CMD_PUSH,
502*c97d6d2cSSergio Andres Gomez Del Real         X86_DECODE_CMD_INVL,
503*c97d6d2cSSergio Andres Gomez Del Real         X86_DECODE_CMD_INVL
504*c97d6d2cSSergio Andres Gomez Del Real     };
505*c97d6d2cSSergio Andres Gomez Del Real     decode->cmd = group[decode->modrm.reg];
506*c97d6d2cSSergio Andres Gomez Del Real     if (decode->modrm.reg > 2) {
507*c97d6d2cSSergio Andres Gomez Del Real         decode->flags_mask = 0;
508*c97d6d2cSSergio Andres Gomez Del Real     }
509*c97d6d2cSSergio Andres Gomez Del Real }
510*c97d6d2cSSergio Andres Gomez Del Real 
511*c97d6d2cSSergio Andres Gomez Del Real static void decode_sldtgroup(CPUX86State *env, struct x86_decode *decode)
512*c97d6d2cSSergio Andres Gomez Del Real {
513*c97d6d2cSSergio Andres Gomez Del Real 
514*c97d6d2cSSergio Andres Gomez Del Real     enum x86_decode_cmd group[] = {
515*c97d6d2cSSergio Andres Gomez Del Real         X86_DECODE_CMD_SLDT,
516*c97d6d2cSSergio Andres Gomez Del Real         X86_DECODE_CMD_STR,
517*c97d6d2cSSergio Andres Gomez Del Real         X86_DECODE_CMD_LLDT,
518*c97d6d2cSSergio Andres Gomez Del Real         X86_DECODE_CMD_LTR,
519*c97d6d2cSSergio Andres Gomez Del Real         X86_DECODE_CMD_VERR,
520*c97d6d2cSSergio Andres Gomez Del Real         X86_DECODE_CMD_VERW,
521*c97d6d2cSSergio Andres Gomez Del Real         X86_DECODE_CMD_INVL,
522*c97d6d2cSSergio Andres Gomez Del Real         X86_DECODE_CMD_INVL
523*c97d6d2cSSergio Andres Gomez Del Real     };
524*c97d6d2cSSergio Andres Gomez Del Real     decode->cmd = group[decode->modrm.reg];
525*c97d6d2cSSergio Andres Gomez Del Real     printf("%llx: decode_sldtgroup: %d\n", env->hvf_emul->fetch_rip,
526*c97d6d2cSSergio Andres Gomez Del Real             decode->modrm.reg);
527*c97d6d2cSSergio Andres Gomez Del Real }
528*c97d6d2cSSergio Andres Gomez Del Real 
529*c97d6d2cSSergio Andres Gomez Del Real static void decode_lidtgroup(CPUX86State *env, struct x86_decode *decode)
530*c97d6d2cSSergio Andres Gomez Del Real {
531*c97d6d2cSSergio Andres Gomez Del Real     enum x86_decode_cmd group[] = {
532*c97d6d2cSSergio Andres Gomez Del Real         X86_DECODE_CMD_SGDT,
533*c97d6d2cSSergio Andres Gomez Del Real         X86_DECODE_CMD_SIDT,
534*c97d6d2cSSergio Andres Gomez Del Real         X86_DECODE_CMD_LGDT,
535*c97d6d2cSSergio Andres Gomez Del Real         X86_DECODE_CMD_LIDT,
536*c97d6d2cSSergio Andres Gomez Del Real         X86_DECODE_CMD_SMSW,
537*c97d6d2cSSergio Andres Gomez Del Real         X86_DECODE_CMD_LMSW,
538*c97d6d2cSSergio Andres Gomez Del Real         X86_DECODE_CMD_LMSW,
539*c97d6d2cSSergio Andres Gomez Del Real         X86_DECODE_CMD_INVLPG
540*c97d6d2cSSergio Andres Gomez Del Real     };
541*c97d6d2cSSergio Andres Gomez Del Real     decode->cmd = group[decode->modrm.reg];
542*c97d6d2cSSergio Andres Gomez Del Real     if (0xf9 == decode->modrm.modrm) {
543*c97d6d2cSSergio Andres Gomez Del Real         decode->opcode[decode->len++] = decode->modrm.modrm;
544*c97d6d2cSSergio Andres Gomez Del Real         decode->cmd = X86_DECODE_CMD_RDTSCP;
545*c97d6d2cSSergio Andres Gomez Del Real     }
546*c97d6d2cSSergio Andres Gomez Del Real }
547*c97d6d2cSSergio Andres Gomez Del Real 
548*c97d6d2cSSergio Andres Gomez Del Real static void decode_btgroup(CPUX86State *env, struct x86_decode *decode)
549*c97d6d2cSSergio Andres Gomez Del Real {
550*c97d6d2cSSergio Andres Gomez Del Real     enum x86_decode_cmd group[] = {
551*c97d6d2cSSergio Andres Gomez Del Real         X86_DECODE_CMD_INVL,
552*c97d6d2cSSergio Andres Gomez Del Real         X86_DECODE_CMD_INVL,
553*c97d6d2cSSergio Andres Gomez Del Real         X86_DECODE_CMD_INVL,
554*c97d6d2cSSergio Andres Gomez Del Real         X86_DECODE_CMD_INVL,
555*c97d6d2cSSergio Andres Gomez Del Real         X86_DECODE_CMD_BT,
556*c97d6d2cSSergio Andres Gomez Del Real         X86_DECODE_CMD_BTS,
557*c97d6d2cSSergio Andres Gomez Del Real         X86_DECODE_CMD_BTR,
558*c97d6d2cSSergio Andres Gomez Del Real         X86_DECODE_CMD_BTC
559*c97d6d2cSSergio Andres Gomez Del Real     };
560*c97d6d2cSSergio Andres Gomez Del Real     decode->cmd = group[decode->modrm.reg];
561*c97d6d2cSSergio Andres Gomez Del Real }
562*c97d6d2cSSergio Andres Gomez Del Real 
563*c97d6d2cSSergio Andres Gomez Del Real static void decode_x87_general(CPUX86State *env, struct x86_decode *decode)
564*c97d6d2cSSergio Andres Gomez Del Real {
565*c97d6d2cSSergio Andres Gomez Del Real     decode->is_fpu = true;
566*c97d6d2cSSergio Andres Gomez Del Real }
567*c97d6d2cSSergio Andres Gomez Del Real 
568*c97d6d2cSSergio Andres Gomez Del Real static void decode_x87_modrm_floatp(CPUX86State *env, struct x86_decode *decode,
569*c97d6d2cSSergio Andres Gomez Del Real                                     struct x86_decode_op *op)
570*c97d6d2cSSergio Andres Gomez Del Real {
571*c97d6d2cSSergio Andres Gomez Del Real     op->type = X87_VAR_FLOATP;
572*c97d6d2cSSergio Andres Gomez Del Real }
573*c97d6d2cSSergio Andres Gomez Del Real 
574*c97d6d2cSSergio Andres Gomez Del Real static void decode_x87_modrm_intp(CPUX86State *env, struct x86_decode *decode,
575*c97d6d2cSSergio Andres Gomez Del Real                                   struct x86_decode_op *op)
576*c97d6d2cSSergio Andres Gomez Del Real {
577*c97d6d2cSSergio Andres Gomez Del Real     op->type = X87_VAR_INTP;
578*c97d6d2cSSergio Andres Gomez Del Real }
579*c97d6d2cSSergio Andres Gomez Del Real 
580*c97d6d2cSSergio Andres Gomez Del Real static void decode_x87_modrm_bytep(CPUX86State *env, struct x86_decode *decode,
581*c97d6d2cSSergio Andres Gomez Del Real                                    struct x86_decode_op *op)
582*c97d6d2cSSergio Andres Gomez Del Real {
583*c97d6d2cSSergio Andres Gomez Del Real     op->type = X87_VAR_BYTEP;
584*c97d6d2cSSergio Andres Gomez Del Real }
585*c97d6d2cSSergio Andres Gomez Del Real 
586*c97d6d2cSSergio Andres Gomez Del Real static void decode_x87_modrm_st0(CPUX86State *env, struct x86_decode *decode,
587*c97d6d2cSSergio Andres Gomez Del Real                                  struct x86_decode_op *op)
588*c97d6d2cSSergio Andres Gomez Del Real {
589*c97d6d2cSSergio Andres Gomez Del Real     op->type = X87_VAR_REG;
590*c97d6d2cSSergio Andres Gomez Del Real     op->reg = 0;
591*c97d6d2cSSergio Andres Gomez Del Real }
592*c97d6d2cSSergio Andres Gomez Del Real 
593*c97d6d2cSSergio Andres Gomez Del Real static void decode_decode_x87_modrm_st0(CPUX86State *env,
594*c97d6d2cSSergio Andres Gomez Del Real                                         struct x86_decode *decode,
595*c97d6d2cSSergio Andres Gomez Del Real                                         struct x86_decode_op *op)
596*c97d6d2cSSergio Andres Gomez Del Real {
597*c97d6d2cSSergio Andres Gomez Del Real     op->type = X87_VAR_REG;
598*c97d6d2cSSergio Andres Gomez Del Real     op->reg = decode->modrm.modrm & 7;
599*c97d6d2cSSergio Andres Gomez Del Real }
600*c97d6d2cSSergio Andres Gomez Del Real 
601*c97d6d2cSSergio Andres Gomez Del Real 
602*c97d6d2cSSergio Andres Gomez Del Real static void decode_aegroup(CPUX86State *env, struct x86_decode *decode)
603*c97d6d2cSSergio Andres Gomez Del Real {
604*c97d6d2cSSergio Andres Gomez Del Real     decode->is_fpu = true;
605*c97d6d2cSSergio Andres Gomez Del Real     switch (decode->modrm.reg) {
606*c97d6d2cSSergio Andres Gomez Del Real     case 0:
607*c97d6d2cSSergio Andres Gomez Del Real         decode->cmd = X86_DECODE_CMD_FXSAVE;
608*c97d6d2cSSergio Andres Gomez Del Real         decode_x87_modrm_bytep(env, decode, &decode->op[0]);
609*c97d6d2cSSergio Andres Gomez Del Real         break;
610*c97d6d2cSSergio Andres Gomez Del Real     case 1:
611*c97d6d2cSSergio Andres Gomez Del Real         decode_x87_modrm_bytep(env, decode, &decode->op[0]);
612*c97d6d2cSSergio Andres Gomez Del Real         decode->cmd = X86_DECODE_CMD_FXRSTOR;
613*c97d6d2cSSergio Andres Gomez Del Real         break;
614*c97d6d2cSSergio Andres Gomez Del Real     case 5:
615*c97d6d2cSSergio Andres Gomez Del Real         if (decode->modrm.modrm == 0xe8) {
616*c97d6d2cSSergio Andres Gomez Del Real             decode->cmd = X86_DECODE_CMD_LFENCE;
617*c97d6d2cSSergio Andres Gomez Del Real         } else {
618*c97d6d2cSSergio Andres Gomez Del Real             VM_PANIC("xrstor");
619*c97d6d2cSSergio Andres Gomez Del Real         }
620*c97d6d2cSSergio Andres Gomez Del Real         break;
621*c97d6d2cSSergio Andres Gomez Del Real     case 6:
622*c97d6d2cSSergio Andres Gomez Del Real         VM_PANIC_ON(decode->modrm.modrm != 0xf0);
623*c97d6d2cSSergio Andres Gomez Del Real         decode->cmd = X86_DECODE_CMD_MFENCE;
624*c97d6d2cSSergio Andres Gomez Del Real         break;
625*c97d6d2cSSergio Andres Gomez Del Real     case 7:
626*c97d6d2cSSergio Andres Gomez Del Real         if (decode->modrm.modrm == 0xf8) {
627*c97d6d2cSSergio Andres Gomez Del Real             decode->cmd = X86_DECODE_CMD_SFENCE;
628*c97d6d2cSSergio Andres Gomez Del Real         } else {
629*c97d6d2cSSergio Andres Gomez Del Real             decode->cmd = X86_DECODE_CMD_CLFLUSH;
630*c97d6d2cSSergio Andres Gomez Del Real         }
631*c97d6d2cSSergio Andres Gomez Del Real         break;
632*c97d6d2cSSergio Andres Gomez Del Real     default:
633*c97d6d2cSSergio Andres Gomez Del Real         VM_PANIC_ON_EX(1, "0xae: reg %d\n", decode->modrm.reg);
634*c97d6d2cSSergio Andres Gomez Del Real         break;
635*c97d6d2cSSergio Andres Gomez Del Real     }
636*c97d6d2cSSergio Andres Gomez Del Real }
637*c97d6d2cSSergio Andres Gomez Del Real 
638*c97d6d2cSSergio Andres Gomez Del Real static void decode_bswap(CPUX86State *env, struct x86_decode *decode)
639*c97d6d2cSSergio Andres Gomez Del Real {
640*c97d6d2cSSergio Andres Gomez Del Real     decode->op[0].type = X86_VAR_REG;
641*c97d6d2cSSergio Andres Gomez Del Real     decode->op[0].reg = decode->opcode[1] - 0xc8;
642*c97d6d2cSSergio Andres Gomez Del Real     decode->op[0].ptr = get_reg_ref(env, decode->op[0].reg, decode->rex.b,
643*c97d6d2cSSergio Andres Gomez Del Real                                     decode->operand_size);
644*c97d6d2cSSergio Andres Gomez Del Real }
645*c97d6d2cSSergio Andres Gomez Del Real 
646*c97d6d2cSSergio Andres Gomez Del Real static void decode_d9_4(CPUX86State *env, struct x86_decode *decode)
647*c97d6d2cSSergio Andres Gomez Del Real {
648*c97d6d2cSSergio Andres Gomez Del Real     switch (decode->modrm.modrm) {
649*c97d6d2cSSergio Andres Gomez Del Real     case 0xe0:
650*c97d6d2cSSergio Andres Gomez Del Real         /* FCHS */
651*c97d6d2cSSergio Andres Gomez Del Real         decode->cmd = X86_DECODE_CMD_FCHS;
652*c97d6d2cSSergio Andres Gomez Del Real         break;
653*c97d6d2cSSergio Andres Gomez Del Real     case 0xe1:
654*c97d6d2cSSergio Andres Gomez Del Real         decode->cmd = X86_DECODE_CMD_FABS;
655*c97d6d2cSSergio Andres Gomez Del Real         break;
656*c97d6d2cSSergio Andres Gomez Del Real     case 0xe4:
657*c97d6d2cSSergio Andres Gomez Del Real         VM_PANIC_ON_EX(1, "FTST");
658*c97d6d2cSSergio Andres Gomez Del Real         break;
659*c97d6d2cSSergio Andres Gomez Del Real     case 0xe5:
660*c97d6d2cSSergio Andres Gomez Del Real         /* FXAM */
661*c97d6d2cSSergio Andres Gomez Del Real         decode->cmd = X86_DECODE_CMD_FXAM;
662*c97d6d2cSSergio Andres Gomez Del Real         break;
663*c97d6d2cSSergio Andres Gomez Del Real     default:
664*c97d6d2cSSergio Andres Gomez Del Real         VM_PANIC_ON_EX(1, "FLDENV");
665*c97d6d2cSSergio Andres Gomez Del Real         break;
666*c97d6d2cSSergio Andres Gomez Del Real     }
667*c97d6d2cSSergio Andres Gomez Del Real }
668*c97d6d2cSSergio Andres Gomez Del Real 
669*c97d6d2cSSergio Andres Gomez Del Real static void decode_db_4(CPUX86State *env, struct x86_decode *decode)
670*c97d6d2cSSergio Andres Gomez Del Real {
671*c97d6d2cSSergio Andres Gomez Del Real     switch (decode->modrm.modrm) {
672*c97d6d2cSSergio Andres Gomez Del Real     case 0xe0:
673*c97d6d2cSSergio Andres Gomez Del Real         VM_PANIC_ON_EX(1, "unhandled FNENI: %x %x\n", decode->opcode[0],
674*c97d6d2cSSergio Andres Gomez Del Real                        decode->modrm.modrm);
675*c97d6d2cSSergio Andres Gomez Del Real         break;
676*c97d6d2cSSergio Andres Gomez Del Real     case 0xe1:
677*c97d6d2cSSergio Andres Gomez Del Real         VM_PANIC_ON_EX(1, "unhandled FNDISI: %x %x\n", decode->opcode[0],
678*c97d6d2cSSergio Andres Gomez Del Real                        decode->modrm.modrm);
679*c97d6d2cSSergio Andres Gomez Del Real         break;
680*c97d6d2cSSergio Andres Gomez Del Real     case 0xe2:
681*c97d6d2cSSergio Andres Gomez Del Real         VM_PANIC_ON_EX(1, "unhandled FCLEX: %x %x\n", decode->opcode[0],
682*c97d6d2cSSergio Andres Gomez Del Real                        decode->modrm.modrm);
683*c97d6d2cSSergio Andres Gomez Del Real         break;
684*c97d6d2cSSergio Andres Gomez Del Real     case 0xe3:
685*c97d6d2cSSergio Andres Gomez Del Real         decode->cmd = X86_DECODE_CMD_FNINIT;
686*c97d6d2cSSergio Andres Gomez Del Real         break;
687*c97d6d2cSSergio Andres Gomez Del Real     case 0xe4:
688*c97d6d2cSSergio Andres Gomez Del Real         decode->cmd = X86_DECODE_CMD_FNSETPM;
689*c97d6d2cSSergio Andres Gomez Del Real         break;
690*c97d6d2cSSergio Andres Gomez Del Real     default:
691*c97d6d2cSSergio Andres Gomez Del Real         VM_PANIC_ON_EX(1, "unhandled fpu opcode: %x %x\n", decode->opcode[0],
692*c97d6d2cSSergio Andres Gomez Del Real                        decode->modrm.modrm);
693*c97d6d2cSSergio Andres Gomez Del Real         break;
694*c97d6d2cSSergio Andres Gomez Del Real     }
695*c97d6d2cSSergio Andres Gomez Del Real }
696*c97d6d2cSSergio Andres Gomez Del Real 
697*c97d6d2cSSergio Andres Gomez Del Real 
698*c97d6d2cSSergio Andres Gomez Del Real #define RFLAGS_MASK_NONE    0
699*c97d6d2cSSergio Andres Gomez Del Real #define RFLAGS_MASK_OSZAPC  (RFLAGS_OF | RFLAGS_SF | RFLAGS_ZF | RFLAGS_AF | \
700*c97d6d2cSSergio Andres Gomez Del Real                              RFLAGS_PF | RFLAGS_CF)
701*c97d6d2cSSergio Andres Gomez Del Real #define RFLAGS_MASK_LAHF    (RFLAGS_SF | RFLAGS_ZF | RFLAGS_AF | RFLAGS_PF | \
702*c97d6d2cSSergio Andres Gomez Del Real                              RFLAGS_CF)
703*c97d6d2cSSergio Andres Gomez Del Real #define RFLAGS_MASK_CF      (RFLAGS_CF)
704*c97d6d2cSSergio Andres Gomez Del Real #define RFLAGS_MASK_IF      (RFLAGS_IF)
705*c97d6d2cSSergio Andres Gomez Del Real #define RFLAGS_MASK_TF      (RFLAGS_TF)
706*c97d6d2cSSergio Andres Gomez Del Real #define RFLAGS_MASK_DF      (RFLAGS_DF)
707*c97d6d2cSSergio Andres Gomez Del Real #define RFLAGS_MASK_ZF      (RFLAGS_ZF)
708*c97d6d2cSSergio Andres Gomez Del Real 
709*c97d6d2cSSergio Andres Gomez Del Real struct decode_tbl _1op_inst[] = {
710*c97d6d2cSSergio Andres Gomez Del Real     {0x0, X86_DECODE_CMD_ADD, 1, true, decode_modrm_rm, decode_modrm_reg, NULL,
711*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, RFLAGS_MASK_OSZAPC},
712*c97d6d2cSSergio Andres Gomez Del Real     {0x1, X86_DECODE_CMD_ADD, 0, true, decode_modrm_rm, decode_modrm_reg, NULL,
713*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, RFLAGS_MASK_OSZAPC},
714*c97d6d2cSSergio Andres Gomez Del Real     {0x2, X86_DECODE_CMD_ADD, 1, true, decode_modrm_reg, decode_modrm_rm, NULL,
715*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, RFLAGS_MASK_OSZAPC},
716*c97d6d2cSSergio Andres Gomez Del Real     {0x3, X86_DECODE_CMD_ADD, 0, true, decode_modrm_reg, decode_modrm_rm, NULL,
717*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, RFLAGS_MASK_OSZAPC},
718*c97d6d2cSSergio Andres Gomez Del Real     {0x4, X86_DECODE_CMD_ADD, 1, false, decode_rax, decode_imm8, NULL, NULL,
719*c97d6d2cSSergio Andres Gomez Del Real      NULL, RFLAGS_MASK_OSZAPC},
720*c97d6d2cSSergio Andres Gomez Del Real     {0x5, X86_DECODE_CMD_ADD, 0, false, decode_rax, decode_imm, NULL, NULL,
721*c97d6d2cSSergio Andres Gomez Del Real      NULL, RFLAGS_MASK_OSZAPC},
722*c97d6d2cSSergio Andres Gomez Del Real     {0x6, X86_DECODE_CMD_PUSH_SEG, 0, false, false, NULL, NULL, NULL,
723*c97d6d2cSSergio Andres Gomez Del Real      decode_pushseg, RFLAGS_MASK_NONE},
724*c97d6d2cSSergio Andres Gomez Del Real     {0x7, X86_DECODE_CMD_POP_SEG, 0, false, false, NULL, NULL, NULL,
725*c97d6d2cSSergio Andres Gomez Del Real      decode_popseg, RFLAGS_MASK_NONE},
726*c97d6d2cSSergio Andres Gomez Del Real     {0x8, X86_DECODE_CMD_OR, 1, true, decode_modrm_rm, decode_modrm_reg, NULL,
727*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, RFLAGS_MASK_OSZAPC},
728*c97d6d2cSSergio Andres Gomez Del Real     {0x9, X86_DECODE_CMD_OR, 0, true, decode_modrm_rm, decode_modrm_reg, NULL,
729*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, RFLAGS_MASK_OSZAPC},
730*c97d6d2cSSergio Andres Gomez Del Real     {0xa, X86_DECODE_CMD_OR, 1, true, decode_modrm_reg, decode_modrm_rm, NULL,
731*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, RFLAGS_MASK_OSZAPC},
732*c97d6d2cSSergio Andres Gomez Del Real     {0xb, X86_DECODE_CMD_OR, 0, true, decode_modrm_reg, decode_modrm_rm,
733*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_OSZAPC},
734*c97d6d2cSSergio Andres Gomez Del Real     {0xc, X86_DECODE_CMD_OR, 1, false, decode_rax, decode_imm8,
735*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_OSZAPC},
736*c97d6d2cSSergio Andres Gomez Del Real     {0xd, X86_DECODE_CMD_OR, 0, false, decode_rax, decode_imm,
737*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_OSZAPC},
738*c97d6d2cSSergio Andres Gomez Del Real 
739*c97d6d2cSSergio Andres Gomez Del Real     {0xe, X86_DECODE_CMD_PUSH_SEG, 0, false, false,
740*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, decode_pushseg, RFLAGS_MASK_NONE},
741*c97d6d2cSSergio Andres Gomez Del Real     {0xf, X86_DECODE_CMD_POP_SEG, 0, false, false,
742*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, decode_popseg, RFLAGS_MASK_NONE},
743*c97d6d2cSSergio Andres Gomez Del Real 
744*c97d6d2cSSergio Andres Gomez Del Real     {0x10, X86_DECODE_CMD_ADC, 1, true, decode_modrm_rm, decode_modrm_reg,
745*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_OSZAPC},
746*c97d6d2cSSergio Andres Gomez Del Real     {0x11, X86_DECODE_CMD_ADC, 0, true, decode_modrm_rm, decode_modrm_reg,
747*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_OSZAPC},
748*c97d6d2cSSergio Andres Gomez Del Real     {0x12, X86_DECODE_CMD_ADC, 1, true, decode_modrm_reg, decode_modrm_rm,
749*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_OSZAPC},
750*c97d6d2cSSergio Andres Gomez Del Real     {0x13, X86_DECODE_CMD_ADC, 0, true, decode_modrm_reg, decode_modrm_rm,
751*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_OSZAPC},
752*c97d6d2cSSergio Andres Gomez Del Real     {0x14, X86_DECODE_CMD_ADC, 1, false, decode_rax, decode_imm,
753*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_OSZAPC},
754*c97d6d2cSSergio Andres Gomez Del Real     {0x15, X86_DECODE_CMD_ADC, 0, false, decode_rax, decode_imm,
755*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_OSZAPC},
756*c97d6d2cSSergio Andres Gomez Del Real 
757*c97d6d2cSSergio Andres Gomez Del Real     {0x16, X86_DECODE_CMD_PUSH_SEG, 0, false, false,
758*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, decode_pushseg, RFLAGS_MASK_NONE},
759*c97d6d2cSSergio Andres Gomez Del Real     {0x17, X86_DECODE_CMD_POP_SEG, 0, false, false,
760*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, decode_popseg, RFLAGS_MASK_NONE},
761*c97d6d2cSSergio Andres Gomez Del Real 
762*c97d6d2cSSergio Andres Gomez Del Real     {0x18, X86_DECODE_CMD_SBB, 1, true, decode_modrm_rm, decode_modrm_reg,
763*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_OSZAPC},
764*c97d6d2cSSergio Andres Gomez Del Real     {0x19, X86_DECODE_CMD_SBB, 0, true, decode_modrm_rm, decode_modrm_reg,
765*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_OSZAPC},
766*c97d6d2cSSergio Andres Gomez Del Real     {0x1a, X86_DECODE_CMD_SBB, 1, true, decode_modrm_reg, decode_modrm_rm,
767*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_OSZAPC},
768*c97d6d2cSSergio Andres Gomez Del Real     {0x1b, X86_DECODE_CMD_SBB, 0, true, decode_modrm_reg, decode_modrm_rm,
769*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_OSZAPC},
770*c97d6d2cSSergio Andres Gomez Del Real     {0x1c, X86_DECODE_CMD_SBB, 1, false, decode_rax, decode_imm8,
771*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_OSZAPC},
772*c97d6d2cSSergio Andres Gomez Del Real     {0x1d, X86_DECODE_CMD_SBB, 0, false, decode_rax, decode_imm,
773*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_OSZAPC},
774*c97d6d2cSSergio Andres Gomez Del Real 
775*c97d6d2cSSergio Andres Gomez Del Real     {0x1e, X86_DECODE_CMD_PUSH_SEG, 0, false, false,
776*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, decode_pushseg, RFLAGS_MASK_NONE},
777*c97d6d2cSSergio Andres Gomez Del Real     {0x1f, X86_DECODE_CMD_POP_SEG, 0, false, false,
778*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, decode_popseg, RFLAGS_MASK_NONE},
779*c97d6d2cSSergio Andres Gomez Del Real 
780*c97d6d2cSSergio Andres Gomez Del Real     {0x20, X86_DECODE_CMD_AND, 1, true, decode_modrm_rm, decode_modrm_reg,
781*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_OSZAPC},
782*c97d6d2cSSergio Andres Gomez Del Real     {0x21, X86_DECODE_CMD_AND, 0, true, decode_modrm_rm, decode_modrm_reg,
783*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_OSZAPC},
784*c97d6d2cSSergio Andres Gomez Del Real     {0x22, X86_DECODE_CMD_AND, 1, true, decode_modrm_reg, decode_modrm_rm,
785*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_OSZAPC},
786*c97d6d2cSSergio Andres Gomez Del Real     {0x23, X86_DECODE_CMD_AND, 0, true, decode_modrm_reg, decode_modrm_rm,
787*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_OSZAPC},
788*c97d6d2cSSergio Andres Gomez Del Real     {0x24, X86_DECODE_CMD_AND, 1, false, decode_rax, decode_imm,
789*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_OSZAPC},
790*c97d6d2cSSergio Andres Gomez Del Real     {0x25, X86_DECODE_CMD_AND, 0, false, decode_rax, decode_imm,
791*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_OSZAPC},
792*c97d6d2cSSergio Andres Gomez Del Real     {0x28, X86_DECODE_CMD_SUB, 1, true, decode_modrm_rm, decode_modrm_reg,
793*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_OSZAPC},
794*c97d6d2cSSergio Andres Gomez Del Real     {0x29, X86_DECODE_CMD_SUB, 0, true, decode_modrm_rm, decode_modrm_reg,
795*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_OSZAPC},
796*c97d6d2cSSergio Andres Gomez Del Real     {0x2a, X86_DECODE_CMD_SUB, 1, true, decode_modrm_reg, decode_modrm_rm,
797*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_OSZAPC},
798*c97d6d2cSSergio Andres Gomez Del Real     {0x2b, X86_DECODE_CMD_SUB, 0, true, decode_modrm_reg, decode_modrm_rm,
799*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_OSZAPC},
800*c97d6d2cSSergio Andres Gomez Del Real     {0x2c, X86_DECODE_CMD_SUB, 1, false, decode_rax, decode_imm,
801*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_OSZAPC},
802*c97d6d2cSSergio Andres Gomez Del Real     {0x2d, X86_DECODE_CMD_SUB, 0, false, decode_rax, decode_imm,
803*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_OSZAPC},
804*c97d6d2cSSergio Andres Gomez Del Real     {0x2f, X86_DECODE_CMD_DAS, 0, false,
805*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, NULL, RFLAGS_MASK_OSZAPC},
806*c97d6d2cSSergio Andres Gomez Del Real     {0x30, X86_DECODE_CMD_XOR, 1, true, decode_modrm_rm, decode_modrm_reg,
807*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_OSZAPC},
808*c97d6d2cSSergio Andres Gomez Del Real     {0x31, X86_DECODE_CMD_XOR, 0, true, decode_modrm_rm, decode_modrm_reg,
809*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_OSZAPC},
810*c97d6d2cSSergio Andres Gomez Del Real     {0x32, X86_DECODE_CMD_XOR, 1, true, decode_modrm_reg, decode_modrm_rm,
811*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_OSZAPC},
812*c97d6d2cSSergio Andres Gomez Del Real     {0x33, X86_DECODE_CMD_XOR, 0, true, decode_modrm_reg, decode_modrm_rm,
813*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_OSZAPC},
814*c97d6d2cSSergio Andres Gomez Del Real     {0x34, X86_DECODE_CMD_XOR, 1, false, decode_rax, decode_imm,
815*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_OSZAPC},
816*c97d6d2cSSergio Andres Gomez Del Real     {0x35, X86_DECODE_CMD_XOR, 0, false, decode_rax, decode_imm,
817*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_OSZAPC},
818*c97d6d2cSSergio Andres Gomez Del Real 
819*c97d6d2cSSergio Andres Gomez Del Real     {0x38, X86_DECODE_CMD_CMP, 1, true, decode_modrm_rm, decode_modrm_reg,
820*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_OSZAPC},
821*c97d6d2cSSergio Andres Gomez Del Real     {0x39, X86_DECODE_CMD_CMP, 0, true, decode_modrm_rm, decode_modrm_reg,
822*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_OSZAPC},
823*c97d6d2cSSergio Andres Gomez Del Real     {0x3a, X86_DECODE_CMD_CMP, 1, true, decode_modrm_reg, decode_modrm_rm,
824*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_OSZAPC},
825*c97d6d2cSSergio Andres Gomez Del Real     {0x3b, X86_DECODE_CMD_CMP, 0, true, decode_modrm_reg, decode_modrm_rm,
826*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_OSZAPC},
827*c97d6d2cSSergio Andres Gomez Del Real     {0x3c, X86_DECODE_CMD_CMP, 1, false, decode_rax, decode_imm8,
828*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_OSZAPC},
829*c97d6d2cSSergio Andres Gomez Del Real     {0x3d, X86_DECODE_CMD_CMP, 0, false, decode_rax, decode_imm,
830*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_OSZAPC},
831*c97d6d2cSSergio Andres Gomez Del Real 
832*c97d6d2cSSergio Andres Gomez Del Real     {0x3f, X86_DECODE_CMD_AAS, 0, false,
833*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, NULL, RFLAGS_MASK_OSZAPC},
834*c97d6d2cSSergio Andres Gomez Del Real 
835*c97d6d2cSSergio Andres Gomez Del Real     {0x40, X86_DECODE_CMD_INC, 0, false,
836*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_incgroup, RFLAGS_MASK_OSZAPC},
837*c97d6d2cSSergio Andres Gomez Del Real     {0x41, X86_DECODE_CMD_INC, 0, false,
838*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_incgroup, RFLAGS_MASK_OSZAPC},
839*c97d6d2cSSergio Andres Gomez Del Real     {0x42, X86_DECODE_CMD_INC, 0, false,
840*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_incgroup, RFLAGS_MASK_OSZAPC},
841*c97d6d2cSSergio Andres Gomez Del Real     {0x43, X86_DECODE_CMD_INC, 0, false,
842*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_incgroup, RFLAGS_MASK_OSZAPC},
843*c97d6d2cSSergio Andres Gomez Del Real     {0x44, X86_DECODE_CMD_INC, 0, false,
844*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_incgroup, RFLAGS_MASK_OSZAPC},
845*c97d6d2cSSergio Andres Gomez Del Real     {0x45, X86_DECODE_CMD_INC, 0, false,
846*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_incgroup, RFLAGS_MASK_OSZAPC},
847*c97d6d2cSSergio Andres Gomez Del Real     {0x46, X86_DECODE_CMD_INC, 0, false,
848*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_incgroup, RFLAGS_MASK_OSZAPC},
849*c97d6d2cSSergio Andres Gomez Del Real     {0x47, X86_DECODE_CMD_INC, 0, false,
850*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_incgroup, RFLAGS_MASK_OSZAPC},
851*c97d6d2cSSergio Andres Gomez Del Real 
852*c97d6d2cSSergio Andres Gomez Del Real     {0x48, X86_DECODE_CMD_DEC, 0, false,
853*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_decgroup, RFLAGS_MASK_OSZAPC},
854*c97d6d2cSSergio Andres Gomez Del Real     {0x49, X86_DECODE_CMD_DEC, 0, false,
855*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_decgroup, RFLAGS_MASK_OSZAPC},
856*c97d6d2cSSergio Andres Gomez Del Real     {0x4a, X86_DECODE_CMD_DEC, 0, false,
857*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_decgroup, RFLAGS_MASK_OSZAPC},
858*c97d6d2cSSergio Andres Gomez Del Real     {0x4b, X86_DECODE_CMD_DEC, 0, false,
859*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_decgroup, RFLAGS_MASK_OSZAPC},
860*c97d6d2cSSergio Andres Gomez Del Real     {0x4c, X86_DECODE_CMD_DEC, 0, false,
861*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_decgroup, RFLAGS_MASK_OSZAPC},
862*c97d6d2cSSergio Andres Gomez Del Real     {0x4d, X86_DECODE_CMD_DEC, 0, false,
863*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_decgroup, RFLAGS_MASK_OSZAPC},
864*c97d6d2cSSergio Andres Gomez Del Real     {0x4e, X86_DECODE_CMD_DEC, 0, false,
865*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_decgroup, RFLAGS_MASK_OSZAPC},
866*c97d6d2cSSergio Andres Gomez Del Real     {0x4f, X86_DECODE_CMD_DEC, 0, false,
867*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_decgroup, RFLAGS_MASK_OSZAPC},
868*c97d6d2cSSergio Andres Gomez Del Real 
869*c97d6d2cSSergio Andres Gomez Del Real     {0x50, X86_DECODE_CMD_PUSH, 0, false,
870*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_pushgroup, RFLAGS_MASK_NONE},
871*c97d6d2cSSergio Andres Gomez Del Real     {0x51, X86_DECODE_CMD_PUSH, 0, false,
872*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_pushgroup, RFLAGS_MASK_NONE},
873*c97d6d2cSSergio Andres Gomez Del Real     {0x52, X86_DECODE_CMD_PUSH, 0, false,
874*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_pushgroup, RFLAGS_MASK_NONE},
875*c97d6d2cSSergio Andres Gomez Del Real     {0x53, X86_DECODE_CMD_PUSH, 0, false,
876*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_pushgroup, RFLAGS_MASK_NONE},
877*c97d6d2cSSergio Andres Gomez Del Real     {0x54, X86_DECODE_CMD_PUSH, 0, false,
878*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_pushgroup, RFLAGS_MASK_NONE},
879*c97d6d2cSSergio Andres Gomez Del Real     {0x55, X86_DECODE_CMD_PUSH, 0, false,
880*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_pushgroup, RFLAGS_MASK_NONE},
881*c97d6d2cSSergio Andres Gomez Del Real     {0x56, X86_DECODE_CMD_PUSH, 0, false,
882*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_pushgroup, RFLAGS_MASK_NONE},
883*c97d6d2cSSergio Andres Gomez Del Real     {0x57, X86_DECODE_CMD_PUSH, 0, false,
884*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_pushgroup, RFLAGS_MASK_NONE},
885*c97d6d2cSSergio Andres Gomez Del Real 
886*c97d6d2cSSergio Andres Gomez Del Real     {0x58, X86_DECODE_CMD_POP, 0, false,
887*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_popgroup, RFLAGS_MASK_NONE},
888*c97d6d2cSSergio Andres Gomez Del Real     {0x59, X86_DECODE_CMD_POP, 0, false,
889*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_popgroup, RFLAGS_MASK_NONE},
890*c97d6d2cSSergio Andres Gomez Del Real     {0x5a, X86_DECODE_CMD_POP, 0, false,
891*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_popgroup, RFLAGS_MASK_NONE},
892*c97d6d2cSSergio Andres Gomez Del Real     {0x5b, X86_DECODE_CMD_POP, 0, false,
893*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_popgroup, RFLAGS_MASK_NONE},
894*c97d6d2cSSergio Andres Gomez Del Real     {0x5c, X86_DECODE_CMD_POP, 0, false,
895*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_popgroup, RFLAGS_MASK_NONE},
896*c97d6d2cSSergio Andres Gomez Del Real     {0x5d, X86_DECODE_CMD_POP, 0, false,
897*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_popgroup, RFLAGS_MASK_NONE},
898*c97d6d2cSSergio Andres Gomez Del Real     {0x5e, X86_DECODE_CMD_POP, 0, false,
899*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_popgroup, RFLAGS_MASK_NONE},
900*c97d6d2cSSergio Andres Gomez Del Real     {0x5f, X86_DECODE_CMD_POP, 0, false,
901*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_popgroup, RFLAGS_MASK_NONE},
902*c97d6d2cSSergio Andres Gomez Del Real 
903*c97d6d2cSSergio Andres Gomez Del Real     {0x60, X86_DECODE_CMD_PUSHA, 0, false,
904*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE},
905*c97d6d2cSSergio Andres Gomez Del Real     {0x61, X86_DECODE_CMD_POPA, 0, false,
906*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE},
907*c97d6d2cSSergio Andres Gomez Del Real 
908*c97d6d2cSSergio Andres Gomez Del Real     {0x68, X86_DECODE_CMD_PUSH, 0, false, decode_imm,
909*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE},
910*c97d6d2cSSergio Andres Gomez Del Real     {0x6a, X86_DECODE_CMD_PUSH, 0, false, decode_imm8_signed,
911*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE},
912*c97d6d2cSSergio Andres Gomez Del Real     {0x69, X86_DECODE_CMD_IMUL_3, 0, true, decode_modrm_reg,
913*c97d6d2cSSergio Andres Gomez Del Real      decode_modrm_rm, decode_imm, NULL, NULL, RFLAGS_MASK_OSZAPC},
914*c97d6d2cSSergio Andres Gomez Del Real     {0x6b, X86_DECODE_CMD_IMUL_3, 0, true, decode_modrm_reg, decode_modrm_rm,
915*c97d6d2cSSergio Andres Gomez Del Real      decode_imm8_signed, NULL, NULL, RFLAGS_MASK_OSZAPC},
916*c97d6d2cSSergio Andres Gomez Del Real 
917*c97d6d2cSSergio Andres Gomez Del Real     {0x6c, X86_DECODE_CMD_INS, 1, false,
918*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE},
919*c97d6d2cSSergio Andres Gomez Del Real     {0x6d, X86_DECODE_CMD_INS, 0, false,
920*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE},
921*c97d6d2cSSergio Andres Gomez Del Real     {0x6e, X86_DECODE_CMD_OUTS, 1, false,
922*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE},
923*c97d6d2cSSergio Andres Gomez Del Real     {0x6f, X86_DECODE_CMD_OUTS, 0, false,
924*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE},
925*c97d6d2cSSergio Andres Gomez Del Real 
926*c97d6d2cSSergio Andres Gomez Del Real     {0x70, X86_DECODE_CMD_JXX, 1, false,
927*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_jxx, RFLAGS_MASK_NONE},
928*c97d6d2cSSergio Andres Gomez Del Real     {0x71, X86_DECODE_CMD_JXX, 1, false,
929*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_jxx, RFLAGS_MASK_NONE},
930*c97d6d2cSSergio Andres Gomez Del Real     {0x72, X86_DECODE_CMD_JXX, 1, false,
931*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_jxx, RFLAGS_MASK_NONE},
932*c97d6d2cSSergio Andres Gomez Del Real     {0x73, X86_DECODE_CMD_JXX, 1, false,
933*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_jxx, RFLAGS_MASK_NONE},
934*c97d6d2cSSergio Andres Gomez Del Real     {0x74, X86_DECODE_CMD_JXX, 1, false,
935*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_jxx, RFLAGS_MASK_NONE},
936*c97d6d2cSSergio Andres Gomez Del Real     {0x75, X86_DECODE_CMD_JXX, 1, false,
937*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_jxx, RFLAGS_MASK_NONE},
938*c97d6d2cSSergio Andres Gomez Del Real     {0x76, X86_DECODE_CMD_JXX, 1, false,
939*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_jxx, RFLAGS_MASK_NONE},
940*c97d6d2cSSergio Andres Gomez Del Real     {0x77, X86_DECODE_CMD_JXX, 1, false,
941*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_jxx, RFLAGS_MASK_NONE},
942*c97d6d2cSSergio Andres Gomez Del Real     {0x78, X86_DECODE_CMD_JXX, 1, false,
943*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_jxx, RFLAGS_MASK_NONE},
944*c97d6d2cSSergio Andres Gomez Del Real     {0x79, X86_DECODE_CMD_JXX, 1, false,
945*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_jxx, RFLAGS_MASK_NONE},
946*c97d6d2cSSergio Andres Gomez Del Real     {0x7a, X86_DECODE_CMD_JXX, 1, false,
947*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_jxx, RFLAGS_MASK_NONE},
948*c97d6d2cSSergio Andres Gomez Del Real     {0x7b, X86_DECODE_CMD_JXX, 1, false,
949*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_jxx, RFLAGS_MASK_NONE},
950*c97d6d2cSSergio Andres Gomez Del Real     {0x7c, X86_DECODE_CMD_JXX, 1, false,
951*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_jxx, RFLAGS_MASK_NONE},
952*c97d6d2cSSergio Andres Gomez Del Real     {0x7d, X86_DECODE_CMD_JXX, 1, false,
953*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_jxx, RFLAGS_MASK_NONE},
954*c97d6d2cSSergio Andres Gomez Del Real     {0x7e, X86_DECODE_CMD_JXX, 1, false,
955*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_jxx, RFLAGS_MASK_NONE},
956*c97d6d2cSSergio Andres Gomez Del Real     {0x7f, X86_DECODE_CMD_JXX, 1, false,
957*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_jxx, RFLAGS_MASK_NONE},
958*c97d6d2cSSergio Andres Gomez Del Real 
959*c97d6d2cSSergio Andres Gomez Del Real     {0x80, X86_DECODE_CMD_INVL, 1, true, decode_modrm_rm, decode_imm8,
960*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, decode_addgroup, RFLAGS_MASK_OSZAPC},
961*c97d6d2cSSergio Andres Gomez Del Real     {0x81, X86_DECODE_CMD_INVL, 0, true, decode_modrm_rm, decode_imm,
962*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, decode_addgroup, RFLAGS_MASK_OSZAPC},
963*c97d6d2cSSergio Andres Gomez Del Real     {0x82, X86_DECODE_CMD_INVL, 1, true, decode_modrm_rm, decode_imm8,
964*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, decode_addgroup, RFLAGS_MASK_OSZAPC},
965*c97d6d2cSSergio Andres Gomez Del Real     {0x83, X86_DECODE_CMD_INVL, 0, true, decode_modrm_rm, decode_imm8_signed,
966*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, decode_addgroup, RFLAGS_MASK_OSZAPC},
967*c97d6d2cSSergio Andres Gomez Del Real     {0x84, X86_DECODE_CMD_TST, 1, true, decode_modrm_rm, decode_modrm_reg,
968*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_OSZAPC},
969*c97d6d2cSSergio Andres Gomez Del Real     {0x85, X86_DECODE_CMD_TST, 0, true, decode_modrm_rm, decode_modrm_reg,
970*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_OSZAPC},
971*c97d6d2cSSergio Andres Gomez Del Real     {0x86, X86_DECODE_CMD_XCHG, 1, true, decode_modrm_reg, decode_modrm_rm,
972*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_NONE},
973*c97d6d2cSSergio Andres Gomez Del Real     {0x87, X86_DECODE_CMD_XCHG, 0, true, decode_modrm_reg, decode_modrm_rm,
974*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_NONE},
975*c97d6d2cSSergio Andres Gomez Del Real     {0x88, X86_DECODE_CMD_MOV, 1, true, decode_modrm_rm, decode_modrm_reg,
976*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_NONE},
977*c97d6d2cSSergio Andres Gomez Del Real     {0x89, X86_DECODE_CMD_MOV, 0, true, decode_modrm_rm, decode_modrm_reg,
978*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_NONE},
979*c97d6d2cSSergio Andres Gomez Del Real     {0x8a, X86_DECODE_CMD_MOV, 1, true, decode_modrm_reg, decode_modrm_rm,
980*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_NONE},
981*c97d6d2cSSergio Andres Gomez Del Real     {0x8b, X86_DECODE_CMD_MOV, 0, true, decode_modrm_reg, decode_modrm_rm,
982*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_NONE},
983*c97d6d2cSSergio Andres Gomez Del Real     {0x8c, X86_DECODE_CMD_MOV_FROM_SEG, 0, true, decode_modrm_rm,
984*c97d6d2cSSergio Andres Gomez Del Real      decode_modrm_reg, NULL, NULL, NULL, RFLAGS_MASK_NONE},
985*c97d6d2cSSergio Andres Gomez Del Real     {0x8d, X86_DECODE_CMD_LEA, 0, true, decode_modrm_reg, decode_modrm_rm,
986*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_NONE},
987*c97d6d2cSSergio Andres Gomez Del Real     {0x8e, X86_DECODE_CMD_MOV_TO_SEG, 0, true, decode_modrm_reg,
988*c97d6d2cSSergio Andres Gomez Del Real      decode_modrm_rm, NULL, NULL, NULL, RFLAGS_MASK_NONE},
989*c97d6d2cSSergio Andres Gomez Del Real     {0x8f, X86_DECODE_CMD_POP, 0, true, decode_modrm_rm,
990*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE},
991*c97d6d2cSSergio Andres Gomez Del Real 
992*c97d6d2cSSergio Andres Gomez Del Real     {0x90, X86_DECODE_CMD_NOP, 0, false,
993*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE},
994*c97d6d2cSSergio Andres Gomez Del Real     {0x91, X86_DECODE_CMD_XCHG, 0, false, NULL, decode_rax,
995*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, decode_xchgroup, RFLAGS_MASK_NONE},
996*c97d6d2cSSergio Andres Gomez Del Real     {0x92, X86_DECODE_CMD_XCHG, 0, false, NULL, decode_rax,
997*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, decode_xchgroup, RFLAGS_MASK_NONE},
998*c97d6d2cSSergio Andres Gomez Del Real     {0x93, X86_DECODE_CMD_XCHG, 0, false, NULL, decode_rax,
999*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, decode_xchgroup, RFLAGS_MASK_NONE},
1000*c97d6d2cSSergio Andres Gomez Del Real     {0x94, X86_DECODE_CMD_XCHG, 0, false, NULL, decode_rax,
1001*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, decode_xchgroup, RFLAGS_MASK_NONE},
1002*c97d6d2cSSergio Andres Gomez Del Real     {0x95, X86_DECODE_CMD_XCHG, 0, false, NULL, decode_rax,
1003*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, decode_xchgroup, RFLAGS_MASK_NONE},
1004*c97d6d2cSSergio Andres Gomez Del Real     {0x96, X86_DECODE_CMD_XCHG, 0, false, NULL, decode_rax,
1005*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, decode_xchgroup, RFLAGS_MASK_NONE},
1006*c97d6d2cSSergio Andres Gomez Del Real     {0x97, X86_DECODE_CMD_XCHG, 0, false, NULL, decode_rax,
1007*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, decode_xchgroup, RFLAGS_MASK_NONE},
1008*c97d6d2cSSergio Andres Gomez Del Real 
1009*c97d6d2cSSergio Andres Gomez Del Real     {0x98, X86_DECODE_CMD_CBW, 0, false, NULL, NULL,
1010*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_NONE},
1011*c97d6d2cSSergio Andres Gomez Del Real     {0x99, X86_DECODE_CMD_CWD, 0, false, NULL, NULL,
1012*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_NONE},
1013*c97d6d2cSSergio Andres Gomez Del Real 
1014*c97d6d2cSSergio Andres Gomez Del Real     {0x9a, X86_DECODE_CMD_CALL_FAR, 0, false, NULL,
1015*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, decode_farjmp, RFLAGS_MASK_NONE},
1016*c97d6d2cSSergio Andres Gomez Del Real 
1017*c97d6d2cSSergio Andres Gomez Del Real     {0x9c, X86_DECODE_CMD_PUSHF, 0, false, NULL, NULL,
1018*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_NONE},
1019*c97d6d2cSSergio Andres Gomez Del Real     /*{0x9d, X86_DECODE_CMD_POPF, 0, false, NULL, NULL,
1020*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_POPF},*/
1021*c97d6d2cSSergio Andres Gomez Del Real     {0x9e, X86_DECODE_CMD_SAHF, 0, false, NULL, NULL,
1022*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_NONE},
1023*c97d6d2cSSergio Andres Gomez Del Real     {0x9f, X86_DECODE_CMD_LAHF, 0, false, NULL, NULL,
1024*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_LAHF},
1025*c97d6d2cSSergio Andres Gomez Del Real 
1026*c97d6d2cSSergio Andres Gomez Del Real     {0xa0, X86_DECODE_CMD_MOV, 1, false, decode_rax, fetch_moffs,
1027*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_NONE},
1028*c97d6d2cSSergio Andres Gomez Del Real     {0xa1, X86_DECODE_CMD_MOV, 0, false, decode_rax, fetch_moffs,
1029*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_NONE},
1030*c97d6d2cSSergio Andres Gomez Del Real     {0xa2, X86_DECODE_CMD_MOV, 1, false, fetch_moffs, decode_rax,
1031*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_NONE},
1032*c97d6d2cSSergio Andres Gomez Del Real     {0xa3, X86_DECODE_CMD_MOV, 0, false, fetch_moffs, decode_rax,
1033*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_NONE},
1034*c97d6d2cSSergio Andres Gomez Del Real 
1035*c97d6d2cSSergio Andres Gomez Del Real     {0xa4, X86_DECODE_CMD_MOVS, 1, false, NULL, NULL,
1036*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_NONE},
1037*c97d6d2cSSergio Andres Gomez Del Real     {0xa5, X86_DECODE_CMD_MOVS, 0, false, NULL, NULL,
1038*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_NONE},
1039*c97d6d2cSSergio Andres Gomez Del Real     {0xa6, X86_DECODE_CMD_CMPS, 1, false, NULL, NULL,
1040*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_OSZAPC},
1041*c97d6d2cSSergio Andres Gomez Del Real     {0xa7, X86_DECODE_CMD_CMPS, 0, false, NULL, NULL,
1042*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_OSZAPC},
1043*c97d6d2cSSergio Andres Gomez Del Real     {0xaa, X86_DECODE_CMD_STOS, 1, false, NULL, NULL,
1044*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_NONE},
1045*c97d6d2cSSergio Andres Gomez Del Real     {0xab, X86_DECODE_CMD_STOS, 0, false, NULL, NULL,
1046*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_NONE},
1047*c97d6d2cSSergio Andres Gomez Del Real     {0xac, X86_DECODE_CMD_LODS, 1, false, NULL, NULL,
1048*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_NONE},
1049*c97d6d2cSSergio Andres Gomez Del Real     {0xad, X86_DECODE_CMD_LODS, 0, false, NULL, NULL,
1050*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_NONE},
1051*c97d6d2cSSergio Andres Gomez Del Real     {0xae, X86_DECODE_CMD_SCAS, 1, false, NULL, NULL,
1052*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_OSZAPC},
1053*c97d6d2cSSergio Andres Gomez Del Real     {0xaf, X86_DECODE_CMD_SCAS, 0, false, NULL, NULL,
1054*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_OSZAPC},
1055*c97d6d2cSSergio Andres Gomez Del Real 
1056*c97d6d2cSSergio Andres Gomez Del Real     {0xa8, X86_DECODE_CMD_TST, 1, false, decode_rax, decode_imm,
1057*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_OSZAPC},
1058*c97d6d2cSSergio Andres Gomez Del Real     {0xa9, X86_DECODE_CMD_TST, 0, false, decode_rax, decode_imm,
1059*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_OSZAPC},
1060*c97d6d2cSSergio Andres Gomez Del Real 
1061*c97d6d2cSSergio Andres Gomez Del Real     {0xb0, X86_DECODE_CMD_MOV, 1, false, NULL,
1062*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, decode_movgroup8, RFLAGS_MASK_NONE},
1063*c97d6d2cSSergio Andres Gomez Del Real     {0xb1, X86_DECODE_CMD_MOV, 1, false, NULL,
1064*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, decode_movgroup8, RFLAGS_MASK_NONE},
1065*c97d6d2cSSergio Andres Gomez Del Real     {0xb2, X86_DECODE_CMD_MOV, 1, false, NULL,
1066*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, decode_movgroup8, RFLAGS_MASK_NONE},
1067*c97d6d2cSSergio Andres Gomez Del Real     {0xb3, X86_DECODE_CMD_MOV, 1, false, NULL,
1068*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, decode_movgroup8, RFLAGS_MASK_NONE},
1069*c97d6d2cSSergio Andres Gomez Del Real     {0xb4, X86_DECODE_CMD_MOV, 1, false, NULL,
1070*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, decode_movgroup8, RFLAGS_MASK_NONE},
1071*c97d6d2cSSergio Andres Gomez Del Real     {0xb5, X86_DECODE_CMD_MOV, 1, false, NULL,
1072*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, decode_movgroup8, RFLAGS_MASK_NONE},
1073*c97d6d2cSSergio Andres Gomez Del Real     {0xb6, X86_DECODE_CMD_MOV, 1, false, NULL,
1074*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, decode_movgroup8, RFLAGS_MASK_NONE},
1075*c97d6d2cSSergio Andres Gomez Del Real     {0xb7, X86_DECODE_CMD_MOV, 1, false, NULL,
1076*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, decode_movgroup8, RFLAGS_MASK_NONE},
1077*c97d6d2cSSergio Andres Gomez Del Real 
1078*c97d6d2cSSergio Andres Gomez Del Real     {0xb8, X86_DECODE_CMD_MOV, 0, false, NULL,
1079*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, decode_movgroup, RFLAGS_MASK_NONE},
1080*c97d6d2cSSergio Andres Gomez Del Real     {0xb9, X86_DECODE_CMD_MOV, 0, false, NULL,
1081*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, decode_movgroup, RFLAGS_MASK_NONE},
1082*c97d6d2cSSergio Andres Gomez Del Real     {0xba, X86_DECODE_CMD_MOV, 0, false, NULL,
1083*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, decode_movgroup, RFLAGS_MASK_NONE},
1084*c97d6d2cSSergio Andres Gomez Del Real     {0xbb, X86_DECODE_CMD_MOV, 0, false, NULL,
1085*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, decode_movgroup, RFLAGS_MASK_NONE},
1086*c97d6d2cSSergio Andres Gomez Del Real     {0xbc, X86_DECODE_CMD_MOV, 0, false, NULL,
1087*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, decode_movgroup, RFLAGS_MASK_NONE},
1088*c97d6d2cSSergio Andres Gomez Del Real     {0xbd, X86_DECODE_CMD_MOV, 0, false, NULL,
1089*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, decode_movgroup, RFLAGS_MASK_NONE},
1090*c97d6d2cSSergio Andres Gomez Del Real     {0xbe, X86_DECODE_CMD_MOV, 0, false, NULL,
1091*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, decode_movgroup, RFLAGS_MASK_NONE},
1092*c97d6d2cSSergio Andres Gomez Del Real     {0xbf, X86_DECODE_CMD_MOV, 0, false, NULL,
1093*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, decode_movgroup, RFLAGS_MASK_NONE},
1094*c97d6d2cSSergio Andres Gomez Del Real 
1095*c97d6d2cSSergio Andres Gomez Del Real     {0xc0, X86_DECODE_CMD_INVL, 1, true, decode_modrm_rm, decode_imm8,
1096*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, decode_rotgroup, RFLAGS_MASK_OSZAPC},
1097*c97d6d2cSSergio Andres Gomez Del Real     {0xc1, X86_DECODE_CMD_INVL, 0, true, decode_modrm_rm, decode_imm8,
1098*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, decode_rotgroup, RFLAGS_MASK_OSZAPC},
1099*c97d6d2cSSergio Andres Gomez Del Real 
1100*c97d6d2cSSergio Andres Gomez Del Real     {0xc2, X86_DECODE_RET_NEAR, 0, false, decode_imm16,
1101*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE},
1102*c97d6d2cSSergio Andres Gomez Del Real     {0xc3, X86_DECODE_RET_NEAR, 0, false, NULL,
1103*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE},
1104*c97d6d2cSSergio Andres Gomez Del Real 
1105*c97d6d2cSSergio Andres Gomez Del Real     {0xc4, X86_DECODE_CMD_LES, 0, true, decode_modrm_reg, decode_modrm_rm,
1106*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_NONE},
1107*c97d6d2cSSergio Andres Gomez Del Real     {0xc5, X86_DECODE_CMD_LDS, 0, true, decode_modrm_reg, decode_modrm_rm,
1108*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_NONE},
1109*c97d6d2cSSergio Andres Gomez Del Real 
1110*c97d6d2cSSergio Andres Gomez Del Real     {0xc6, X86_DECODE_CMD_MOV, 1, true, decode_modrm_rm, decode_imm8,
1111*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_NONE},
1112*c97d6d2cSSergio Andres Gomez Del Real     {0xc7, X86_DECODE_CMD_MOV, 0, true, decode_modrm_rm, decode_imm,
1113*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_NONE},
1114*c97d6d2cSSergio Andres Gomez Del Real 
1115*c97d6d2cSSergio Andres Gomez Del Real     {0xc8, X86_DECODE_CMD_ENTER, 0, false, decode_imm16, decode_imm8,
1116*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_NONE},
1117*c97d6d2cSSergio Andres Gomez Del Real     {0xc9, X86_DECODE_CMD_LEAVE, 0, false, NULL, NULL,
1118*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_NONE},
1119*c97d6d2cSSergio Andres Gomez Del Real     {0xca, X86_DECODE_RET_FAR, 0, false, decode_imm16, NULL,
1120*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_NONE},
1121*c97d6d2cSSergio Andres Gomez Del Real     {0xcb, X86_DECODE_RET_FAR, 0, false, decode_imm_0, NULL,
1122*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_NONE},
1123*c97d6d2cSSergio Andres Gomez Del Real     {0xcd, X86_DECODE_CMD_INT, 0, false, decode_imm8, NULL,
1124*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_NONE},
1125*c97d6d2cSSergio Andres Gomez Del Real     /*{0xcf, X86_DECODE_CMD_IRET, 0, false, NULL, NULL,
1126*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_IRET},*/
1127*c97d6d2cSSergio Andres Gomez Del Real 
1128*c97d6d2cSSergio Andres Gomez Del Real     {0xd0, X86_DECODE_CMD_INVL, 1, true, decode_modrm_rm, decode_imm_1,
1129*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, decode_rotgroup, RFLAGS_MASK_OSZAPC},
1130*c97d6d2cSSergio Andres Gomez Del Real     {0xd1, X86_DECODE_CMD_INVL, 0, true, decode_modrm_rm, decode_imm_1,
1131*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, decode_rotgroup, RFLAGS_MASK_OSZAPC},
1132*c97d6d2cSSergio Andres Gomez Del Real     {0xd2, X86_DECODE_CMD_INVL, 1, true, decode_modrm_rm, decode_rcx,
1133*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, decode_rotgroup, RFLAGS_MASK_OSZAPC},
1134*c97d6d2cSSergio Andres Gomez Del Real     {0xd3, X86_DECODE_CMD_INVL, 0, true, decode_modrm_rm, decode_rcx,
1135*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, decode_rotgroup, RFLAGS_MASK_OSZAPC},
1136*c97d6d2cSSergio Andres Gomez Del Real 
1137*c97d6d2cSSergio Andres Gomez Del Real     {0xd4, X86_DECODE_CMD_AAM, 0, false, decode_imm8,
1138*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, RFLAGS_MASK_OSZAPC},
1139*c97d6d2cSSergio Andres Gomez Del Real     {0xd5, X86_DECODE_CMD_AAD, 0, false, decode_imm8,
1140*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, RFLAGS_MASK_OSZAPC},
1141*c97d6d2cSSergio Andres Gomez Del Real 
1142*c97d6d2cSSergio Andres Gomez Del Real     {0xd7, X86_DECODE_CMD_XLAT, 0, false,
1143*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE},
1144*c97d6d2cSSergio Andres Gomez Del Real 
1145*c97d6d2cSSergio Andres Gomez Del Real     {0xd8, X86_DECODE_CMD_INVL, 0, true, NULL,
1146*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, decode_x87_ins, RFLAGS_MASK_NONE},
1147*c97d6d2cSSergio Andres Gomez Del Real     {0xd9, X86_DECODE_CMD_INVL, 0, true, NULL,
1148*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, decode_x87_ins, RFLAGS_MASK_NONE},
1149*c97d6d2cSSergio Andres Gomez Del Real     {0xda, X86_DECODE_CMD_INVL, 0, true, NULL,
1150*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, decode_x87_ins, RFLAGS_MASK_NONE},
1151*c97d6d2cSSergio Andres Gomez Del Real     {0xdb, X86_DECODE_CMD_INVL, 0, true, NULL,
1152*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, decode_x87_ins, RFLAGS_MASK_NONE},
1153*c97d6d2cSSergio Andres Gomez Del Real     {0xdc, X86_DECODE_CMD_INVL, 0, true, NULL,
1154*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, decode_x87_ins, RFLAGS_MASK_NONE},
1155*c97d6d2cSSergio Andres Gomez Del Real     {0xdd, X86_DECODE_CMD_INVL, 0, true, NULL,
1156*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, decode_x87_ins, RFLAGS_MASK_NONE},
1157*c97d6d2cSSergio Andres Gomez Del Real     {0xde, X86_DECODE_CMD_INVL, 0, true, NULL,
1158*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, decode_x87_ins, RFLAGS_MASK_NONE},
1159*c97d6d2cSSergio Andres Gomez Del Real     {0xdf, X86_DECODE_CMD_INVL, 0, true, NULL,
1160*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, decode_x87_ins, RFLAGS_MASK_NONE},
1161*c97d6d2cSSergio Andres Gomez Del Real 
1162*c97d6d2cSSergio Andres Gomez Del Real     {0xe0, X86_DECODE_CMD_LOOP, 0, false, decode_imm8_signed,
1163*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE},
1164*c97d6d2cSSergio Andres Gomez Del Real     {0xe1, X86_DECODE_CMD_LOOP, 0, false, decode_imm8_signed,
1165*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE},
1166*c97d6d2cSSergio Andres Gomez Del Real     {0xe2, X86_DECODE_CMD_LOOP, 0, false, decode_imm8_signed,
1167*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE},
1168*c97d6d2cSSergio Andres Gomez Del Real 
1169*c97d6d2cSSergio Andres Gomez Del Real     {0xe3, X86_DECODE_CMD_JCXZ, 1, false,
1170*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_jxx, RFLAGS_MASK_NONE},
1171*c97d6d2cSSergio Andres Gomez Del Real 
1172*c97d6d2cSSergio Andres Gomez Del Real     {0xe4, X86_DECODE_CMD_IN, 1, false, decode_imm8,
1173*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE},
1174*c97d6d2cSSergio Andres Gomez Del Real     {0xe5, X86_DECODE_CMD_IN, 0, false, decode_imm8,
1175*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE},
1176*c97d6d2cSSergio Andres Gomez Del Real     {0xe6, X86_DECODE_CMD_OUT, 1, false, decode_imm8,
1177*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE},
1178*c97d6d2cSSergio Andres Gomez Del Real     {0xe7, X86_DECODE_CMD_OUT, 0, false, decode_imm8,
1179*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE},
1180*c97d6d2cSSergio Andres Gomez Del Real     {0xe8, X86_DECODE_CMD_CALL_NEAR, 0, false, decode_imm_signed,
1181*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE},
1182*c97d6d2cSSergio Andres Gomez Del Real     {0xe9, X86_DECODE_CMD_JMP_NEAR, 0, false, decode_imm_signed,
1183*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE},
1184*c97d6d2cSSergio Andres Gomez Del Real     {0xea, X86_DECODE_CMD_JMP_FAR, 0, false,
1185*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_farjmp, RFLAGS_MASK_NONE},
1186*c97d6d2cSSergio Andres Gomez Del Real     {0xeb, X86_DECODE_CMD_JMP_NEAR, 1, false, decode_imm8_signed,
1187*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE},
1188*c97d6d2cSSergio Andres Gomez Del Real     {0xec, X86_DECODE_CMD_IN, 1, false,
1189*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE},
1190*c97d6d2cSSergio Andres Gomez Del Real     {0xed, X86_DECODE_CMD_IN, 0, false,
1191*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE},
1192*c97d6d2cSSergio Andres Gomez Del Real     {0xee, X86_DECODE_CMD_OUT, 1, false,
1193*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE},
1194*c97d6d2cSSergio Andres Gomez Del Real     {0xef, X86_DECODE_CMD_OUT, 0, false,
1195*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE},
1196*c97d6d2cSSergio Andres Gomez Del Real 
1197*c97d6d2cSSergio Andres Gomez Del Real     {0xf4, X86_DECODE_CMD_HLT, 0, false,
1198*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE},
1199*c97d6d2cSSergio Andres Gomez Del Real 
1200*c97d6d2cSSergio Andres Gomez Del Real     {0xf5, X86_DECODE_CMD_CMC, 0, false,
1201*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, NULL, RFLAGS_MASK_CF},
1202*c97d6d2cSSergio Andres Gomez Del Real 
1203*c97d6d2cSSergio Andres Gomez Del Real     {0xf6, X86_DECODE_CMD_INVL, 1, true,
1204*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_f7group, RFLAGS_MASK_OSZAPC},
1205*c97d6d2cSSergio Andres Gomez Del Real     {0xf7, X86_DECODE_CMD_INVL, 0, true,
1206*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_f7group, RFLAGS_MASK_OSZAPC},
1207*c97d6d2cSSergio Andres Gomez Del Real 
1208*c97d6d2cSSergio Andres Gomez Del Real     {0xf8, X86_DECODE_CMD_CLC, 0, false,
1209*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, NULL, RFLAGS_MASK_CF},
1210*c97d6d2cSSergio Andres Gomez Del Real     {0xf9, X86_DECODE_CMD_STC, 0, false,
1211*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, NULL, RFLAGS_MASK_CF},
1212*c97d6d2cSSergio Andres Gomez Del Real 
1213*c97d6d2cSSergio Andres Gomez Del Real     {0xfa, X86_DECODE_CMD_CLI, 0, false,
1214*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, NULL, RFLAGS_MASK_IF},
1215*c97d6d2cSSergio Andres Gomez Del Real     {0xfb, X86_DECODE_CMD_STI, 0, false,
1216*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, NULL, RFLAGS_MASK_IF},
1217*c97d6d2cSSergio Andres Gomez Del Real     {0xfc, X86_DECODE_CMD_CLD, 0, false,
1218*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, NULL, RFLAGS_MASK_DF},
1219*c97d6d2cSSergio Andres Gomez Del Real     {0xfd, X86_DECODE_CMD_STD, 0, false,
1220*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, NULL, RFLAGS_MASK_DF},
1221*c97d6d2cSSergio Andres Gomez Del Real     {0xfe, X86_DECODE_CMD_INVL, 1, true, decode_modrm_rm,
1222*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, decode_incgroup2, RFLAGS_MASK_OSZAPC},
1223*c97d6d2cSSergio Andres Gomez Del Real     {0xff, X86_DECODE_CMD_INVL, 0, true, decode_modrm_rm,
1224*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, decode_ffgroup, RFLAGS_MASK_OSZAPC},
1225*c97d6d2cSSergio Andres Gomez Del Real };
1226*c97d6d2cSSergio Andres Gomez Del Real 
1227*c97d6d2cSSergio Andres Gomez Del Real struct decode_tbl _2op_inst[] = {
1228*c97d6d2cSSergio Andres Gomez Del Real     {0x0, X86_DECODE_CMD_INVL, 0, true, decode_modrm_rm,
1229*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, decode_sldtgroup, RFLAGS_MASK_NONE},
1230*c97d6d2cSSergio Andres Gomez Del Real     {0x1, X86_DECODE_CMD_INVL, 0, true, decode_modrm_rm,
1231*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, decode_lidtgroup, RFLAGS_MASK_NONE},
1232*c97d6d2cSSergio Andres Gomez Del Real     {0x6, X86_DECODE_CMD_CLTS, 0, false,
1233*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, NULL, RFLAGS_MASK_TF},
1234*c97d6d2cSSergio Andres Gomez Del Real     {0x9, X86_DECODE_CMD_WBINVD, 0, false,
1235*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE},
1236*c97d6d2cSSergio Andres Gomez Del Real     {0x18, X86_DECODE_CMD_PREFETCH, 0, true,
1237*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_x87_general, RFLAGS_MASK_NONE},
1238*c97d6d2cSSergio Andres Gomez Del Real     {0x1f, X86_DECODE_CMD_NOP, 0, true, decode_modrm_rm,
1239*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE},
1240*c97d6d2cSSergio Andres Gomez Del Real     {0x20, X86_DECODE_CMD_MOV_FROM_CR, 0, true, decode_modrm_rm,
1241*c97d6d2cSSergio Andres Gomez Del Real      decode_modrm_reg, NULL, NULL, NULL, RFLAGS_MASK_NONE},
1242*c97d6d2cSSergio Andres Gomez Del Real     {0x21, X86_DECODE_CMD_MOV_FROM_DR, 0, true, decode_modrm_rm,
1243*c97d6d2cSSergio Andres Gomez Del Real      decode_modrm_reg, NULL, NULL, NULL, RFLAGS_MASK_NONE},
1244*c97d6d2cSSergio Andres Gomez Del Real     {0x22, X86_DECODE_CMD_MOV_TO_CR, 0, true, decode_modrm_reg,
1245*c97d6d2cSSergio Andres Gomez Del Real      decode_modrm_rm, NULL, NULL, NULL, RFLAGS_MASK_NONE},
1246*c97d6d2cSSergio Andres Gomez Del Real     {0x23, X86_DECODE_CMD_MOV_TO_DR, 0, true, decode_modrm_reg,
1247*c97d6d2cSSergio Andres Gomez Del Real      decode_modrm_rm, NULL, NULL, NULL, RFLAGS_MASK_NONE},
1248*c97d6d2cSSergio Andres Gomez Del Real     {0x30, X86_DECODE_CMD_WRMSR, 0, false,
1249*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE},
1250*c97d6d2cSSergio Andres Gomez Del Real     {0x31, X86_DECODE_CMD_RDTSC, 0, false,
1251*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE},
1252*c97d6d2cSSergio Andres Gomez Del Real     {0x32, X86_DECODE_CMD_RDMSR, 0, false,
1253*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE},
1254*c97d6d2cSSergio Andres Gomez Del Real     {0x40, X86_DECODE_CMD_CMOV, 0, true, decode_modrm_reg, decode_modrm_rm,
1255*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_NONE},
1256*c97d6d2cSSergio Andres Gomez Del Real     {0x41, X86_DECODE_CMD_CMOV, 0, true, decode_modrm_reg, decode_modrm_rm,
1257*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_NONE},
1258*c97d6d2cSSergio Andres Gomez Del Real     {0x42, X86_DECODE_CMD_CMOV, 0, true, decode_modrm_reg, decode_modrm_rm,
1259*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_NONE},
1260*c97d6d2cSSergio Andres Gomez Del Real     {0x43, X86_DECODE_CMD_CMOV, 0, true, decode_modrm_reg, decode_modrm_rm,
1261*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_NONE},
1262*c97d6d2cSSergio Andres Gomez Del Real     {0x44, X86_DECODE_CMD_CMOV, 0, true, decode_modrm_reg, decode_modrm_rm,
1263*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_NONE},
1264*c97d6d2cSSergio Andres Gomez Del Real     {0x45, X86_DECODE_CMD_CMOV, 0, true, decode_modrm_reg, decode_modrm_rm,
1265*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_NONE},
1266*c97d6d2cSSergio Andres Gomez Del Real     {0x46, X86_DECODE_CMD_CMOV, 0, true, decode_modrm_reg, decode_modrm_rm,
1267*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_NONE},
1268*c97d6d2cSSergio Andres Gomez Del Real     {0x47, X86_DECODE_CMD_CMOV, 0, true, decode_modrm_reg, decode_modrm_rm,
1269*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_NONE},
1270*c97d6d2cSSergio Andres Gomez Del Real     {0x48, X86_DECODE_CMD_CMOV, 0, true, decode_modrm_reg, decode_modrm_rm,
1271*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_NONE},
1272*c97d6d2cSSergio Andres Gomez Del Real     {0x49, X86_DECODE_CMD_CMOV, 0, true, decode_modrm_reg, decode_modrm_rm,
1273*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_NONE},
1274*c97d6d2cSSergio Andres Gomez Del Real     {0x4a, X86_DECODE_CMD_CMOV, 0, true, decode_modrm_reg, decode_modrm_rm,
1275*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_NONE},
1276*c97d6d2cSSergio Andres Gomez Del Real     {0x4b, X86_DECODE_CMD_CMOV, 0, true, decode_modrm_reg, decode_modrm_rm,
1277*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_NONE},
1278*c97d6d2cSSergio Andres Gomez Del Real     {0x4c, X86_DECODE_CMD_CMOV, 0, true, decode_modrm_reg, decode_modrm_rm,
1279*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_NONE},
1280*c97d6d2cSSergio Andres Gomez Del Real     {0x4d, X86_DECODE_CMD_CMOV, 0, true, decode_modrm_reg, decode_modrm_rm,
1281*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_NONE},
1282*c97d6d2cSSergio Andres Gomez Del Real     {0x4e, X86_DECODE_CMD_CMOV, 0, true, decode_modrm_reg, decode_modrm_rm,
1283*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_NONE},
1284*c97d6d2cSSergio Andres Gomez Del Real     {0x4f, X86_DECODE_CMD_CMOV, 0, true, decode_modrm_reg, decode_modrm_rm,
1285*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_NONE},
1286*c97d6d2cSSergio Andres Gomez Del Real     {0x77, X86_DECODE_CMD_EMMS, 0, false,
1287*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_x87_general, RFLAGS_MASK_NONE},
1288*c97d6d2cSSergio Andres Gomez Del Real     {0x82, X86_DECODE_CMD_JXX, 0, false,
1289*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_jxx, RFLAGS_MASK_NONE},
1290*c97d6d2cSSergio Andres Gomez Del Real     {0x83, X86_DECODE_CMD_JXX, 0, false,
1291*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_jxx, RFLAGS_MASK_NONE},
1292*c97d6d2cSSergio Andres Gomez Del Real     {0x84, X86_DECODE_CMD_JXX, 0, false,
1293*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_jxx, RFLAGS_MASK_NONE},
1294*c97d6d2cSSergio Andres Gomez Del Real     {0x85, X86_DECODE_CMD_JXX, 0, false,
1295*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_jxx, RFLAGS_MASK_NONE},
1296*c97d6d2cSSergio Andres Gomez Del Real     {0x86, X86_DECODE_CMD_JXX, 0, false,
1297*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_jxx, RFLAGS_MASK_NONE},
1298*c97d6d2cSSergio Andres Gomez Del Real     {0x87, X86_DECODE_CMD_JXX, 0, false,
1299*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_jxx, RFLAGS_MASK_NONE},
1300*c97d6d2cSSergio Andres Gomez Del Real     {0x88, X86_DECODE_CMD_JXX, 0, false,
1301*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_jxx, RFLAGS_MASK_NONE},
1302*c97d6d2cSSergio Andres Gomez Del Real     {0x89, X86_DECODE_CMD_JXX, 0, false,
1303*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_jxx, RFLAGS_MASK_NONE},
1304*c97d6d2cSSergio Andres Gomez Del Real     {0x8a, X86_DECODE_CMD_JXX, 0, false,
1305*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_jxx, RFLAGS_MASK_NONE},
1306*c97d6d2cSSergio Andres Gomez Del Real     {0x8b, X86_DECODE_CMD_JXX, 0, false,
1307*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_jxx, RFLAGS_MASK_NONE},
1308*c97d6d2cSSergio Andres Gomez Del Real     {0x8c, X86_DECODE_CMD_JXX, 0, false,
1309*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_jxx, RFLAGS_MASK_NONE},
1310*c97d6d2cSSergio Andres Gomez Del Real     {0x8d, X86_DECODE_CMD_JXX, 0, false,
1311*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_jxx, RFLAGS_MASK_NONE},
1312*c97d6d2cSSergio Andres Gomez Del Real     {0x8e, X86_DECODE_CMD_JXX, 0, false,
1313*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_jxx, RFLAGS_MASK_NONE},
1314*c97d6d2cSSergio Andres Gomez Del Real     {0x8f, X86_DECODE_CMD_JXX, 0, false,
1315*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_jxx, RFLAGS_MASK_NONE},
1316*c97d6d2cSSergio Andres Gomez Del Real     {0x90, X86_DECODE_CMD_SETXX, 1, true, decode_modrm_rm,
1317*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE},
1318*c97d6d2cSSergio Andres Gomez Del Real     {0x91, X86_DECODE_CMD_SETXX, 1, true, decode_modrm_rm,
1319*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE},
1320*c97d6d2cSSergio Andres Gomez Del Real     {0x92, X86_DECODE_CMD_SETXX, 1, true, decode_modrm_rm,
1321*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE},
1322*c97d6d2cSSergio Andres Gomez Del Real     {0x93, X86_DECODE_CMD_SETXX, 1, true, decode_modrm_rm,
1323*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE},
1324*c97d6d2cSSergio Andres Gomez Del Real     {0x94, X86_DECODE_CMD_SETXX, 1, true, decode_modrm_rm,
1325*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE},
1326*c97d6d2cSSergio Andres Gomez Del Real     {0x95, X86_DECODE_CMD_SETXX, 1, true, decode_modrm_rm,
1327*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE},
1328*c97d6d2cSSergio Andres Gomez Del Real     {0x96, X86_DECODE_CMD_SETXX, 1, true, decode_modrm_rm,
1329*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE},
1330*c97d6d2cSSergio Andres Gomez Del Real     {0x97, X86_DECODE_CMD_SETXX, 1, true, decode_modrm_rm,
1331*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE},
1332*c97d6d2cSSergio Andres Gomez Del Real     {0x98, X86_DECODE_CMD_SETXX, 1, true, decode_modrm_rm,
1333*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE},
1334*c97d6d2cSSergio Andres Gomez Del Real     {0x99, X86_DECODE_CMD_SETXX, 1, true, decode_modrm_rm,
1335*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE},
1336*c97d6d2cSSergio Andres Gomez Del Real     {0x9a, X86_DECODE_CMD_SETXX, 1, true, decode_modrm_rm,
1337*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE},
1338*c97d6d2cSSergio Andres Gomez Del Real     {0x9b, X86_DECODE_CMD_SETXX, 1, true, decode_modrm_rm,
1339*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE},
1340*c97d6d2cSSergio Andres Gomez Del Real     {0x9c, X86_DECODE_CMD_SETXX, 1, true, decode_modrm_rm,
1341*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE},
1342*c97d6d2cSSergio Andres Gomez Del Real     {0x9d, X86_DECODE_CMD_SETXX, 1, true, decode_modrm_rm,
1343*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE},
1344*c97d6d2cSSergio Andres Gomez Del Real     {0x9e, X86_DECODE_CMD_SETXX, 1, true, decode_modrm_rm,
1345*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE},
1346*c97d6d2cSSergio Andres Gomez Del Real     {0x9f, X86_DECODE_CMD_SETXX, 1, true, decode_modrm_rm,
1347*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE},
1348*c97d6d2cSSergio Andres Gomez Del Real 
1349*c97d6d2cSSergio Andres Gomez Del Real     {0xb0, X86_DECODE_CMD_CMPXCHG, 1, true, decode_modrm_rm, decode_modrm_reg,
1350*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_NONE},
1351*c97d6d2cSSergio Andres Gomez Del Real     {0xb1, X86_DECODE_CMD_CMPXCHG, 0, true, decode_modrm_rm, decode_modrm_reg,
1352*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_NONE},
1353*c97d6d2cSSergio Andres Gomez Del Real 
1354*c97d6d2cSSergio Andres Gomez Del Real     {0xb6, X86_DECODE_CMD_MOVZX, 0, true, decode_modrm_reg, decode_modrm_rm,
1355*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_NONE},
1356*c97d6d2cSSergio Andres Gomez Del Real     {0xb7, X86_DECODE_CMD_MOVZX, 0, true, decode_modrm_reg, decode_modrm_rm,
1357*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_NONE},
1358*c97d6d2cSSergio Andres Gomez Del Real     {0xb8, X86_DECODE_CMD_POPCNT, 0, true, decode_modrm_reg, decode_modrm_rm,
1359*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_OSZAPC},
1360*c97d6d2cSSergio Andres Gomez Del Real     {0xbe, X86_DECODE_CMD_MOVSX, 0, true, decode_modrm_reg, decode_modrm_rm,
1361*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_NONE},
1362*c97d6d2cSSergio Andres Gomez Del Real     {0xbf, X86_DECODE_CMD_MOVSX, 0, true, decode_modrm_reg, decode_modrm_rm,
1363*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_NONE},
1364*c97d6d2cSSergio Andres Gomez Del Real     {0xa0, X86_DECODE_CMD_PUSH_SEG, 0, false, false,
1365*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, decode_pushseg, RFLAGS_MASK_NONE},
1366*c97d6d2cSSergio Andres Gomez Del Real     {0xa1, X86_DECODE_CMD_POP_SEG, 0, false, false,
1367*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, decode_popseg, RFLAGS_MASK_NONE},
1368*c97d6d2cSSergio Andres Gomez Del Real     {0xa2, X86_DECODE_CMD_CPUID, 0, false,
1369*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE},
1370*c97d6d2cSSergio Andres Gomez Del Real     {0xa3, X86_DECODE_CMD_BT, 0, true, decode_modrm_rm, decode_modrm_reg,
1371*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_CF},
1372*c97d6d2cSSergio Andres Gomez Del Real     {0xa4, X86_DECODE_CMD_SHLD, 0, true, decode_modrm_rm, decode_modrm_reg,
1373*c97d6d2cSSergio Andres Gomez Del Real      decode_imm8, NULL, NULL, RFLAGS_MASK_OSZAPC},
1374*c97d6d2cSSergio Andres Gomez Del Real     {0xa5, X86_DECODE_CMD_SHLD, 0, true, decode_modrm_rm, decode_modrm_reg,
1375*c97d6d2cSSergio Andres Gomez Del Real      decode_rcx, NULL, NULL, RFLAGS_MASK_OSZAPC},
1376*c97d6d2cSSergio Andres Gomez Del Real     {0xa8, X86_DECODE_CMD_PUSH_SEG, 0, false, false,
1377*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, decode_pushseg, RFLAGS_MASK_NONE},
1378*c97d6d2cSSergio Andres Gomez Del Real     {0xa9, X86_DECODE_CMD_POP_SEG, 0, false, false,
1379*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, decode_popseg, RFLAGS_MASK_NONE},
1380*c97d6d2cSSergio Andres Gomez Del Real     {0xab, X86_DECODE_CMD_BTS, 0, true, decode_modrm_rm, decode_modrm_reg,
1381*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_CF},
1382*c97d6d2cSSergio Andres Gomez Del Real     {0xac, X86_DECODE_CMD_SHRD, 0, true, decode_modrm_rm, decode_modrm_reg,
1383*c97d6d2cSSergio Andres Gomez Del Real      decode_imm8, NULL, NULL, RFLAGS_MASK_OSZAPC},
1384*c97d6d2cSSergio Andres Gomez Del Real     {0xad, X86_DECODE_CMD_SHRD, 0, true, decode_modrm_rm, decode_modrm_reg,
1385*c97d6d2cSSergio Andres Gomez Del Real      decode_rcx, NULL, NULL, RFLAGS_MASK_OSZAPC},
1386*c97d6d2cSSergio Andres Gomez Del Real 
1387*c97d6d2cSSergio Andres Gomez Del Real     {0xae, X86_DECODE_CMD_INVL, 0, true, decode_modrm_rm,
1388*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, decode_aegroup, RFLAGS_MASK_NONE},
1389*c97d6d2cSSergio Andres Gomez Del Real 
1390*c97d6d2cSSergio Andres Gomez Del Real     {0xaf, X86_DECODE_CMD_IMUL_2, 0, true, decode_modrm_reg, decode_modrm_rm,
1391*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_OSZAPC},
1392*c97d6d2cSSergio Andres Gomez Del Real     {0xb2, X86_DECODE_CMD_LSS, 0, true, decode_modrm_reg, decode_modrm_rm,
1393*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_NONE},
1394*c97d6d2cSSergio Andres Gomez Del Real     {0xb3, X86_DECODE_CMD_BTR, 0, true, decode_modrm_rm, decode_modrm_reg,
1395*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_OSZAPC},
1396*c97d6d2cSSergio Andres Gomez Del Real     {0xba, X86_DECODE_CMD_INVL, 0, true, decode_modrm_rm, decode_imm8,
1397*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, decode_btgroup, RFLAGS_MASK_OSZAPC},
1398*c97d6d2cSSergio Andres Gomez Del Real     {0xbb, X86_DECODE_CMD_BTC, 0, true, decode_modrm_rm, decode_modrm_reg,
1399*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_OSZAPC},
1400*c97d6d2cSSergio Andres Gomez Del Real     {0xbc, X86_DECODE_CMD_BSF, 0, true, decode_modrm_reg, decode_modrm_rm,
1401*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_OSZAPC},
1402*c97d6d2cSSergio Andres Gomez Del Real     {0xbd, X86_DECODE_CMD_BSR, 0, true, decode_modrm_reg, decode_modrm_rm,
1403*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_OSZAPC},
1404*c97d6d2cSSergio Andres Gomez Del Real 
1405*c97d6d2cSSergio Andres Gomez Del Real     {0xc1, X86_DECODE_CMD_XADD, 0, true, decode_modrm_rm, decode_modrm_reg,
1406*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, RFLAGS_MASK_OSZAPC},
1407*c97d6d2cSSergio Andres Gomez Del Real 
1408*c97d6d2cSSergio Andres Gomez Del Real     {0xc7, X86_DECODE_CMD_CMPXCHG8B, 0, true, decode_modrm_rm,
1409*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, RFLAGS_MASK_ZF},
1410*c97d6d2cSSergio Andres Gomez Del Real 
1411*c97d6d2cSSergio Andres Gomez Del Real     {0xc8, X86_DECODE_CMD_BSWAP, 0, false,
1412*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_bswap, RFLAGS_MASK_NONE},
1413*c97d6d2cSSergio Andres Gomez Del Real     {0xc9, X86_DECODE_CMD_BSWAP, 0, false,
1414*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_bswap, RFLAGS_MASK_NONE},
1415*c97d6d2cSSergio Andres Gomez Del Real     {0xca, X86_DECODE_CMD_BSWAP, 0, false,
1416*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_bswap, RFLAGS_MASK_NONE},
1417*c97d6d2cSSergio Andres Gomez Del Real     {0xcb, X86_DECODE_CMD_BSWAP, 0, false,
1418*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_bswap, RFLAGS_MASK_NONE},
1419*c97d6d2cSSergio Andres Gomez Del Real     {0xcc, X86_DECODE_CMD_BSWAP, 0, false,
1420*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_bswap, RFLAGS_MASK_NONE},
1421*c97d6d2cSSergio Andres Gomez Del Real     {0xcd, X86_DECODE_CMD_BSWAP, 0, false,
1422*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_bswap, RFLAGS_MASK_NONE},
1423*c97d6d2cSSergio Andres Gomez Del Real     {0xce, X86_DECODE_CMD_BSWAP, 0, false,
1424*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_bswap, RFLAGS_MASK_NONE},
1425*c97d6d2cSSergio Andres Gomez Del Real     {0xcf, X86_DECODE_CMD_BSWAP, 0, false,
1426*c97d6d2cSSergio Andres Gomez Del Real      NULL, NULL, NULL, NULL, decode_bswap, RFLAGS_MASK_NONE},
1427*c97d6d2cSSergio Andres Gomez Del Real };
1428*c97d6d2cSSergio Andres Gomez Del Real 
1429*c97d6d2cSSergio Andres Gomez Del Real struct decode_x87_tbl invl_inst_x87 = {0x0, 0, 0, 0, 0, false, false, NULL,
1430*c97d6d2cSSergio Andres Gomez Del Real                                        NULL, decode_invalid, 0};
1431*c97d6d2cSSergio Andres Gomez Del Real 
1432*c97d6d2cSSergio Andres Gomez Del Real struct decode_x87_tbl _x87_inst[] = {
1433*c97d6d2cSSergio Andres Gomez Del Real     {0xd8, 0, 3, X86_DECODE_CMD_FADD, 10, false, false,
1434*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_st0, decode_decode_x87_modrm_st0, NULL, RFLAGS_MASK_NONE},
1435*c97d6d2cSSergio Andres Gomez Del Real     {0xd8, 0, 0, X86_DECODE_CMD_FADD, 4, false, false, decode_x87_modrm_st0,
1436*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_floatp, NULL, RFLAGS_MASK_NONE},
1437*c97d6d2cSSergio Andres Gomez Del Real     {0xd8, 1, 3, X86_DECODE_CMD_FMUL, 10, false, false, decode_x87_modrm_st0,
1438*c97d6d2cSSergio Andres Gomez Del Real      decode_decode_x87_modrm_st0, NULL, RFLAGS_MASK_NONE},
1439*c97d6d2cSSergio Andres Gomez Del Real     {0xd8, 1, 0, X86_DECODE_CMD_FMUL, 4, false, false, decode_x87_modrm_st0,
1440*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_floatp, NULL, RFLAGS_MASK_NONE},
1441*c97d6d2cSSergio Andres Gomez Del Real     {0xd8, 4, 3, X86_DECODE_CMD_FSUB, 10, false, false, decode_x87_modrm_st0,
1442*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_st0, NULL, RFLAGS_MASK_NONE},
1443*c97d6d2cSSergio Andres Gomez Del Real     {0xd8, 4, 0, X86_DECODE_CMD_FSUB, 4, false, false, decode_x87_modrm_st0,
1444*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_floatp, NULL, RFLAGS_MASK_NONE},
1445*c97d6d2cSSergio Andres Gomez Del Real     {0xd8, 5, 3, X86_DECODE_CMD_FSUB, 10, true, false, decode_x87_modrm_st0,
1446*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_st0, NULL, RFLAGS_MASK_NONE},
1447*c97d6d2cSSergio Andres Gomez Del Real     {0xd8, 5, 0, X86_DECODE_CMD_FSUB, 4, true, false, decode_x87_modrm_st0,
1448*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_floatp, NULL, RFLAGS_MASK_NONE},
1449*c97d6d2cSSergio Andres Gomez Del Real     {0xd8, 6, 3, X86_DECODE_CMD_FDIV, 10, false, false, decode_x87_modrm_st0,
1450*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_st0, NULL, RFLAGS_MASK_NONE},
1451*c97d6d2cSSergio Andres Gomez Del Real     {0xd8, 6, 0, X86_DECODE_CMD_FDIV, 4, false, false, decode_x87_modrm_st0,
1452*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_floatp, NULL, RFLAGS_MASK_NONE},
1453*c97d6d2cSSergio Andres Gomez Del Real     {0xd8, 7, 3, X86_DECODE_CMD_FDIV, 10, true, false, decode_x87_modrm_st0,
1454*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_st0, NULL, RFLAGS_MASK_NONE},
1455*c97d6d2cSSergio Andres Gomez Del Real     {0xd8, 7, 0, X86_DECODE_CMD_FDIV, 4, true, false, decode_x87_modrm_st0,
1456*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_floatp, NULL, RFLAGS_MASK_NONE},
1457*c97d6d2cSSergio Andres Gomez Del Real 
1458*c97d6d2cSSergio Andres Gomez Del Real     {0xd9, 0, 3, X86_DECODE_CMD_FLD, 10, false, false,
1459*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_st0, NULL, NULL, RFLAGS_MASK_NONE},
1460*c97d6d2cSSergio Andres Gomez Del Real     {0xd9, 0, 0, X86_DECODE_CMD_FLD, 4, false, false,
1461*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_floatp, NULL, NULL, RFLAGS_MASK_NONE},
1462*c97d6d2cSSergio Andres Gomez Del Real     {0xd9, 1, 3, X86_DECODE_CMD_FXCH, 10, false, false, decode_x87_modrm_st0,
1463*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_st0, NULL, RFLAGS_MASK_NONE},
1464*c97d6d2cSSergio Andres Gomez Del Real     {0xd9, 1, 0, X86_DECODE_CMD_INVL, 10, false, false,
1465*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_st0, NULL, NULL, RFLAGS_MASK_NONE},
1466*c97d6d2cSSergio Andres Gomez Del Real     {0xd9, 2, 3, X86_DECODE_CMD_INVL, 10, false, false,
1467*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_st0, NULL, NULL, RFLAGS_MASK_NONE},
1468*c97d6d2cSSergio Andres Gomez Del Real     {0xd9, 2, 0, X86_DECODE_CMD_FST, 4, false, false,
1469*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_floatp, NULL, NULL, RFLAGS_MASK_NONE},
1470*c97d6d2cSSergio Andres Gomez Del Real     {0xd9, 3, 3, X86_DECODE_CMD_INVL, 10, false, false,
1471*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_st0, NULL, NULL, RFLAGS_MASK_NONE},
1472*c97d6d2cSSergio Andres Gomez Del Real     {0xd9, 3, 0, X86_DECODE_CMD_FST, 4, false, true,
1473*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_floatp, NULL, NULL, RFLAGS_MASK_NONE},
1474*c97d6d2cSSergio Andres Gomez Del Real     {0xd9, 4, 3, X86_DECODE_CMD_INVL, 10, false, false,
1475*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_st0, NULL, decode_d9_4, RFLAGS_MASK_NONE},
1476*c97d6d2cSSergio Andres Gomez Del Real     {0xd9, 4, 0, X86_DECODE_CMD_INVL, 4, false, false,
1477*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_bytep, NULL, NULL, RFLAGS_MASK_NONE},
1478*c97d6d2cSSergio Andres Gomez Del Real     {0xd9, 5, 3, X86_DECODE_CMD_FLDxx, 10, false, false, NULL, NULL, NULL,
1479*c97d6d2cSSergio Andres Gomez Del Real      RFLAGS_MASK_NONE},
1480*c97d6d2cSSergio Andres Gomez Del Real     {0xd9, 5, 0, X86_DECODE_CMD_FLDCW, 2, false, false,
1481*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_bytep, NULL, NULL, RFLAGS_MASK_NONE},
1482*c97d6d2cSSergio Andres Gomez Del Real 
1483*c97d6d2cSSergio Andres Gomez Del Real     {0xd9, 7, 3, X86_DECODE_CMD_FNSTCW, 2, false, false,
1484*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_bytep, NULL, NULL, RFLAGS_MASK_NONE},
1485*c97d6d2cSSergio Andres Gomez Del Real     {0xd9, 7, 0, X86_DECODE_CMD_FNSTCW, 2, false, false,
1486*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_bytep, NULL, NULL, RFLAGS_MASK_NONE},
1487*c97d6d2cSSergio Andres Gomez Del Real 
1488*c97d6d2cSSergio Andres Gomez Del Real     {0xda, 0, 3, X86_DECODE_CMD_FCMOV, 10, false, false,
1489*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_st0, decode_x87_modrm_st0, NULL, RFLAGS_MASK_NONE},
1490*c97d6d2cSSergio Andres Gomez Del Real     {0xda, 0, 0, X86_DECODE_CMD_FADD, 4, false, false, decode_x87_modrm_st0,
1491*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_intp, NULL, RFLAGS_MASK_NONE},
1492*c97d6d2cSSergio Andres Gomez Del Real     {0xda, 1, 3, X86_DECODE_CMD_FCMOV, 10, false, false, decode_x87_modrm_st0,
1493*c97d6d2cSSergio Andres Gomez Del Real      decode_decode_x87_modrm_st0, NULL, RFLAGS_MASK_NONE},
1494*c97d6d2cSSergio Andres Gomez Del Real     {0xda, 1, 0, X86_DECODE_CMD_FMUL, 4, false, false, decode_x87_modrm_st0,
1495*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_intp, NULL, RFLAGS_MASK_NONE},
1496*c97d6d2cSSergio Andres Gomez Del Real     {0xda, 2, 3, X86_DECODE_CMD_FCMOV, 10, false, false, decode_x87_modrm_st0,
1497*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_st0, NULL, RFLAGS_MASK_NONE},
1498*c97d6d2cSSergio Andres Gomez Del Real     {0xda, 3, 3, X86_DECODE_CMD_FCMOV, 10, false, false, decode_x87_modrm_st0,
1499*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_st0, NULL, RFLAGS_MASK_NONE},
1500*c97d6d2cSSergio Andres Gomez Del Real     {0xda, 4, 3, X86_DECODE_CMD_INVL, 10, false, false, NULL, NULL, NULL,
1501*c97d6d2cSSergio Andres Gomez Del Real      RFLAGS_MASK_NONE},
1502*c97d6d2cSSergio Andres Gomez Del Real     {0xda, 4, 0, X86_DECODE_CMD_FSUB, 4, false, false, decode_x87_modrm_st0,
1503*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_intp, NULL, RFLAGS_MASK_NONE},
1504*c97d6d2cSSergio Andres Gomez Del Real     {0xda, 5, 3, X86_DECODE_CMD_FUCOM, 10, false, true, decode_x87_modrm_st0,
1505*c97d6d2cSSergio Andres Gomez Del Real      decode_decode_x87_modrm_st0, NULL, RFLAGS_MASK_NONE},
1506*c97d6d2cSSergio Andres Gomez Del Real     {0xda, 5, 0, X86_DECODE_CMD_FSUB, 4, true, false, decode_x87_modrm_st0,
1507*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_intp, NULL, RFLAGS_MASK_NONE},
1508*c97d6d2cSSergio Andres Gomez Del Real     {0xda, 6, 3, X86_DECODE_CMD_INVL, 10, false, false, NULL, NULL, NULL,
1509*c97d6d2cSSergio Andres Gomez Del Real      RFLAGS_MASK_NONE},
1510*c97d6d2cSSergio Andres Gomez Del Real     {0xda, 6, 0, X86_DECODE_CMD_FDIV, 4, false, false, decode_x87_modrm_st0,
1511*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_intp, NULL, RFLAGS_MASK_NONE},
1512*c97d6d2cSSergio Andres Gomez Del Real     {0xda, 7, 3, X86_DECODE_CMD_INVL, 10, false, false, NULL, NULL, NULL,
1513*c97d6d2cSSergio Andres Gomez Del Real      RFLAGS_MASK_NONE},
1514*c97d6d2cSSergio Andres Gomez Del Real     {0xda, 7, 0, X86_DECODE_CMD_FDIV, 4, true, false, decode_x87_modrm_st0,
1515*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_intp, NULL, RFLAGS_MASK_NONE},
1516*c97d6d2cSSergio Andres Gomez Del Real 
1517*c97d6d2cSSergio Andres Gomez Del Real     {0xdb, 0, 3, X86_DECODE_CMD_FCMOV, 10, false, false, decode_x87_modrm_st0,
1518*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_st0, NULL, RFLAGS_MASK_NONE},
1519*c97d6d2cSSergio Andres Gomez Del Real     {0xdb, 0, 0, X86_DECODE_CMD_FLD, 4, false, false,
1520*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_intp, NULL, NULL, RFLAGS_MASK_NONE},
1521*c97d6d2cSSergio Andres Gomez Del Real     {0xdb, 1, 3, X86_DECODE_CMD_FCMOV, 10, false, false,
1522*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_st0, decode_x87_modrm_st0, NULL, RFLAGS_MASK_NONE},
1523*c97d6d2cSSergio Andres Gomez Del Real     {0xdb, 2, 3, X86_DECODE_CMD_FCMOV, 10, false, false,
1524*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_st0, decode_x87_modrm_st0, NULL, RFLAGS_MASK_NONE},
1525*c97d6d2cSSergio Andres Gomez Del Real     {0xdb, 2, 0, X86_DECODE_CMD_FST, 4, false, false,
1526*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_intp, NULL, NULL, RFLAGS_MASK_NONE},
1527*c97d6d2cSSergio Andres Gomez Del Real     {0xdb, 3, 3, X86_DECODE_CMD_FCMOV, 10, false, false,
1528*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_st0, decode_x87_modrm_st0, NULL, RFLAGS_MASK_NONE},
1529*c97d6d2cSSergio Andres Gomez Del Real     {0xdb, 3, 0, X86_DECODE_CMD_FST, 4, false, true,
1530*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_intp, NULL, NULL, RFLAGS_MASK_NONE},
1531*c97d6d2cSSergio Andres Gomez Del Real     {0xdb, 4, 3, X86_DECODE_CMD_INVL, 10, false, false, NULL, NULL,
1532*c97d6d2cSSergio Andres Gomez Del Real      decode_db_4, RFLAGS_MASK_NONE},
1533*c97d6d2cSSergio Andres Gomez Del Real     {0xdb, 4, 0, X86_DECODE_CMD_INVL, 10, false, false, NULL, NULL, NULL,
1534*c97d6d2cSSergio Andres Gomez Del Real      RFLAGS_MASK_NONE},
1535*c97d6d2cSSergio Andres Gomez Del Real     {0xdb, 5, 3, X86_DECODE_CMD_FUCOMI, 10, false, false,
1536*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_st0, decode_x87_modrm_st0, NULL, RFLAGS_MASK_NONE},
1537*c97d6d2cSSergio Andres Gomez Del Real     {0xdb, 5, 0, X86_DECODE_CMD_FLD, 10, false, false,
1538*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_floatp, NULL, NULL, RFLAGS_MASK_NONE},
1539*c97d6d2cSSergio Andres Gomez Del Real     {0xdb, 7, 0, X86_DECODE_CMD_FST, 10, false, true,
1540*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_floatp, NULL, NULL, RFLAGS_MASK_NONE},
1541*c97d6d2cSSergio Andres Gomez Del Real 
1542*c97d6d2cSSergio Andres Gomez Del Real     {0xdc, 0, 3, X86_DECODE_CMD_FADD, 10, false, false,
1543*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_st0, decode_x87_modrm_st0, NULL, RFLAGS_MASK_NONE},
1544*c97d6d2cSSergio Andres Gomez Del Real     {0xdc, 0, 0, X86_DECODE_CMD_FADD, 8, false, false,
1545*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_st0, decode_x87_modrm_floatp, NULL, RFLAGS_MASK_NONE},
1546*c97d6d2cSSergio Andres Gomez Del Real     {0xdc, 1, 3, X86_DECODE_CMD_FMUL, 10, false, false,
1547*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_st0, decode_x87_modrm_st0, NULL, RFLAGS_MASK_NONE},
1548*c97d6d2cSSergio Andres Gomez Del Real     {0xdc, 1, 0, X86_DECODE_CMD_FMUL, 8, false, false,
1549*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_st0, decode_x87_modrm_floatp, NULL, RFLAGS_MASK_NONE},
1550*c97d6d2cSSergio Andres Gomez Del Real     {0xdc, 4, 3, X86_DECODE_CMD_FSUB, 10, true, false,
1551*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_st0, decode_x87_modrm_st0, NULL, RFLAGS_MASK_NONE},
1552*c97d6d2cSSergio Andres Gomez Del Real     {0xdc, 4, 0, X86_DECODE_CMD_FSUB, 8, false, false,
1553*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_st0, decode_x87_modrm_floatp, NULL, RFLAGS_MASK_NONE},
1554*c97d6d2cSSergio Andres Gomez Del Real     {0xdc, 5, 3, X86_DECODE_CMD_FSUB, 10, false, false,
1555*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_st0, decode_x87_modrm_st0, NULL, RFLAGS_MASK_NONE},
1556*c97d6d2cSSergio Andres Gomez Del Real     {0xdc, 5, 0, X86_DECODE_CMD_FSUB, 8, true, false,
1557*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_st0, decode_x87_modrm_floatp, NULL, RFLAGS_MASK_NONE},
1558*c97d6d2cSSergio Andres Gomez Del Real     {0xdc, 6, 3, X86_DECODE_CMD_FDIV, 10, true, false,
1559*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_st0, decode_x87_modrm_st0, NULL, RFLAGS_MASK_NONE},
1560*c97d6d2cSSergio Andres Gomez Del Real     {0xdc, 6, 0, X86_DECODE_CMD_FDIV, 8, false, false,
1561*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_st0, decode_x87_modrm_floatp, NULL, RFLAGS_MASK_NONE},
1562*c97d6d2cSSergio Andres Gomez Del Real     {0xdc, 7, 3, X86_DECODE_CMD_FDIV, 10, false, false,
1563*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_st0, decode_x87_modrm_st0, NULL, RFLAGS_MASK_NONE},
1564*c97d6d2cSSergio Andres Gomez Del Real     {0xdc, 7, 0, X86_DECODE_CMD_FDIV, 8, true, false,
1565*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_st0, decode_x87_modrm_floatp, NULL, RFLAGS_MASK_NONE},
1566*c97d6d2cSSergio Andres Gomez Del Real 
1567*c97d6d2cSSergio Andres Gomez Del Real     {0xdd, 0, 0, X86_DECODE_CMD_FLD, 8, false, false,
1568*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_floatp, NULL, NULL, RFLAGS_MASK_NONE},
1569*c97d6d2cSSergio Andres Gomez Del Real     {0xdd, 1, 3, X86_DECODE_CMD_FXCH, 10, false, false,
1570*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_st0, decode_x87_modrm_st0, NULL, RFLAGS_MASK_NONE},
1571*c97d6d2cSSergio Andres Gomez Del Real     {0xdd, 2, 3, X86_DECODE_CMD_FST, 10, false, false,
1572*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_st0, NULL, NULL, RFLAGS_MASK_NONE},
1573*c97d6d2cSSergio Andres Gomez Del Real     {0xdd, 2, 0, X86_DECODE_CMD_FST, 8, false, false,
1574*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_floatp, NULL, NULL, RFLAGS_MASK_NONE},
1575*c97d6d2cSSergio Andres Gomez Del Real     {0xdd, 3, 3, X86_DECODE_CMD_FST, 10, false, true,
1576*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_st0, NULL, NULL, RFLAGS_MASK_NONE},
1577*c97d6d2cSSergio Andres Gomez Del Real     {0xdd, 3, 0, X86_DECODE_CMD_FST, 8, false, true,
1578*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_floatp, NULL, NULL, RFLAGS_MASK_NONE},
1579*c97d6d2cSSergio Andres Gomez Del Real     {0xdd, 4, 3, X86_DECODE_CMD_FUCOM, 10, false, false,
1580*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_st0, decode_x87_modrm_st0, NULL, RFLAGS_MASK_NONE},
1581*c97d6d2cSSergio Andres Gomez Del Real     {0xdd, 4, 0, X86_DECODE_CMD_FRSTOR, 8, false, false,
1582*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_bytep, NULL, NULL, RFLAGS_MASK_NONE},
1583*c97d6d2cSSergio Andres Gomez Del Real     {0xdd, 5, 3, X86_DECODE_CMD_FUCOM, 10, false, true,
1584*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_st0, decode_x87_modrm_st0, NULL, RFLAGS_MASK_NONE},
1585*c97d6d2cSSergio Andres Gomez Del Real     {0xdd, 7, 0, X86_DECODE_CMD_FNSTSW, 0, false, false,
1586*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_bytep, NULL, NULL, RFLAGS_MASK_NONE},
1587*c97d6d2cSSergio Andres Gomez Del Real     {0xdd, 7, 3, X86_DECODE_CMD_FNSTSW, 0, false, false,
1588*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_bytep, NULL, NULL, RFLAGS_MASK_NONE},
1589*c97d6d2cSSergio Andres Gomez Del Real 
1590*c97d6d2cSSergio Andres Gomez Del Real     {0xde, 0, 3, X86_DECODE_CMD_FADD, 10, false, true,
1591*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_st0, decode_x87_modrm_st0, NULL, RFLAGS_MASK_NONE},
1592*c97d6d2cSSergio Andres Gomez Del Real     {0xde, 0, 0, X86_DECODE_CMD_FADD, 2, false, false,
1593*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_st0, decode_x87_modrm_intp, NULL, RFLAGS_MASK_NONE},
1594*c97d6d2cSSergio Andres Gomez Del Real     {0xde, 1, 3, X86_DECODE_CMD_FMUL, 10, false, true,
1595*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_st0, decode_x87_modrm_st0, NULL, RFLAGS_MASK_NONE},
1596*c97d6d2cSSergio Andres Gomez Del Real     {0xde, 1, 0, X86_DECODE_CMD_FMUL, 2, false, false,
1597*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_st0, decode_x87_modrm_intp, NULL, RFLAGS_MASK_NONE},
1598*c97d6d2cSSergio Andres Gomez Del Real     {0xde, 4, 3, X86_DECODE_CMD_FSUB, 10, true, true,
1599*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_st0, decode_x87_modrm_st0, NULL, RFLAGS_MASK_NONE},
1600*c97d6d2cSSergio Andres Gomez Del Real     {0xde, 4, 0, X86_DECODE_CMD_FSUB, 2, false, false,
1601*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_st0, decode_x87_modrm_intp, NULL, RFLAGS_MASK_NONE},
1602*c97d6d2cSSergio Andres Gomez Del Real     {0xde, 5, 3, X86_DECODE_CMD_FSUB, 10, false, true,
1603*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_st0, decode_x87_modrm_st0, NULL, RFLAGS_MASK_NONE},
1604*c97d6d2cSSergio Andres Gomez Del Real     {0xde, 5, 0, X86_DECODE_CMD_FSUB, 2, true, false,
1605*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_st0, decode_x87_modrm_intp, NULL, RFLAGS_MASK_NONE},
1606*c97d6d2cSSergio Andres Gomez Del Real     {0xde, 6, 3, X86_DECODE_CMD_FDIV, 10, true, true,
1607*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_st0, decode_x87_modrm_st0, NULL, RFLAGS_MASK_NONE},
1608*c97d6d2cSSergio Andres Gomez Del Real     {0xde, 6, 0, X86_DECODE_CMD_FDIV, 2, false, false,
1609*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_st0, decode_x87_modrm_intp, NULL, RFLAGS_MASK_NONE},
1610*c97d6d2cSSergio Andres Gomez Del Real     {0xde, 7, 3, X86_DECODE_CMD_FDIV, 10, false, true,
1611*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_st0, decode_x87_modrm_st0, NULL, RFLAGS_MASK_NONE},
1612*c97d6d2cSSergio Andres Gomez Del Real     {0xde, 7, 0, X86_DECODE_CMD_FDIV, 2, true, false,
1613*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_st0, decode_x87_modrm_intp, NULL, RFLAGS_MASK_NONE},
1614*c97d6d2cSSergio Andres Gomez Del Real 
1615*c97d6d2cSSergio Andres Gomez Del Real     {0xdf, 0, 0, X86_DECODE_CMD_FLD, 2, false, false,
1616*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_intp, NULL, NULL, RFLAGS_MASK_NONE},
1617*c97d6d2cSSergio Andres Gomez Del Real     {0xdf, 1, 3, X86_DECODE_CMD_FXCH, 10, false, false,
1618*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_st0, decode_x87_modrm_st0, NULL, RFLAGS_MASK_NONE},
1619*c97d6d2cSSergio Andres Gomez Del Real     {0xdf, 2, 3, X86_DECODE_CMD_FST, 10, false, true,
1620*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_st0, decode_x87_modrm_st0, NULL, RFLAGS_MASK_NONE},
1621*c97d6d2cSSergio Andres Gomez Del Real     {0xdf, 2, 0, X86_DECODE_CMD_FST, 2, false, false,
1622*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_intp, NULL, NULL, RFLAGS_MASK_NONE},
1623*c97d6d2cSSergio Andres Gomez Del Real     {0xdf, 3, 3, X86_DECODE_CMD_FST, 10, false, true,
1624*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_st0, decode_x87_modrm_st0, NULL, RFLAGS_MASK_NONE},
1625*c97d6d2cSSergio Andres Gomez Del Real     {0xdf, 3, 0, X86_DECODE_CMD_FST, 2, false, true,
1626*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_intp, NULL, NULL, RFLAGS_MASK_NONE},
1627*c97d6d2cSSergio Andres Gomez Del Real     {0xdf, 4, 3, X86_DECODE_CMD_FNSTSW, 2, false, true,
1628*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_bytep, NULL, NULL, RFLAGS_MASK_NONE},
1629*c97d6d2cSSergio Andres Gomez Del Real     {0xdf, 5, 3, X86_DECODE_CMD_FUCOMI, 10, false, true,
1630*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_st0, decode_x87_modrm_st0, NULL, RFLAGS_MASK_NONE},
1631*c97d6d2cSSergio Andres Gomez Del Real     {0xdf, 5, 0, X86_DECODE_CMD_FLD, 8, false, false,
1632*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_intp, NULL, NULL, RFLAGS_MASK_NONE},
1633*c97d6d2cSSergio Andres Gomez Del Real     {0xdf, 7, 0, X86_DECODE_CMD_FST, 8, false, true,
1634*c97d6d2cSSergio Andres Gomez Del Real      decode_x87_modrm_intp, NULL, NULL, RFLAGS_MASK_NONE},
1635*c97d6d2cSSergio Andres Gomez Del Real };
1636*c97d6d2cSSergio Andres Gomez Del Real 
1637*c97d6d2cSSergio Andres Gomez Del Real void calc_modrm_operand16(CPUX86State *env, struct x86_decode *decode,
1638*c97d6d2cSSergio Andres Gomez Del Real                           struct x86_decode_op *op)
1639*c97d6d2cSSergio Andres Gomez Del Real {
1640*c97d6d2cSSergio Andres Gomez Del Real     addr_t ptr = 0;
1641*c97d6d2cSSergio Andres Gomez Del Real     x86_reg_segment seg = REG_SEG_DS;
1642*c97d6d2cSSergio Andres Gomez Del Real 
1643*c97d6d2cSSergio Andres Gomez Del Real     if (!decode->modrm.mod && 6 == decode->modrm.rm) {
1644*c97d6d2cSSergio Andres Gomez Del Real         op->ptr = (uint16_t)decode->displacement;
1645*c97d6d2cSSergio Andres Gomez Del Real         goto calc_addr;
1646*c97d6d2cSSergio Andres Gomez Del Real     }
1647*c97d6d2cSSergio Andres Gomez Del Real 
1648*c97d6d2cSSergio Andres Gomez Del Real     if (decode->displacement_size) {
1649*c97d6d2cSSergio Andres Gomez Del Real         ptr = sign(decode->displacement, decode->displacement_size);
1650*c97d6d2cSSergio Andres Gomez Del Real     }
1651*c97d6d2cSSergio Andres Gomez Del Real 
1652*c97d6d2cSSergio Andres Gomez Del Real     switch (decode->modrm.rm) {
1653*c97d6d2cSSergio Andres Gomez Del Real     case 0:
1654*c97d6d2cSSergio Andres Gomez Del Real         ptr += BX(env) + SI(env);
1655*c97d6d2cSSergio Andres Gomez Del Real         break;
1656*c97d6d2cSSergio Andres Gomez Del Real     case 1:
1657*c97d6d2cSSergio Andres Gomez Del Real         ptr += BX(env) + DI(env);
1658*c97d6d2cSSergio Andres Gomez Del Real         break;
1659*c97d6d2cSSergio Andres Gomez Del Real     case 2:
1660*c97d6d2cSSergio Andres Gomez Del Real         ptr += BP(env) + SI(env);
1661*c97d6d2cSSergio Andres Gomez Del Real         seg = REG_SEG_SS;
1662*c97d6d2cSSergio Andres Gomez Del Real         break;
1663*c97d6d2cSSergio Andres Gomez Del Real     case 3:
1664*c97d6d2cSSergio Andres Gomez Del Real         ptr += BP(env) + DI(env);
1665*c97d6d2cSSergio Andres Gomez Del Real         seg = REG_SEG_SS;
1666*c97d6d2cSSergio Andres Gomez Del Real         break;
1667*c97d6d2cSSergio Andres Gomez Del Real     case 4:
1668*c97d6d2cSSergio Andres Gomez Del Real         ptr += SI(env);
1669*c97d6d2cSSergio Andres Gomez Del Real         break;
1670*c97d6d2cSSergio Andres Gomez Del Real     case 5:
1671*c97d6d2cSSergio Andres Gomez Del Real         ptr += DI(env);
1672*c97d6d2cSSergio Andres Gomez Del Real         break;
1673*c97d6d2cSSergio Andres Gomez Del Real     case 6:
1674*c97d6d2cSSergio Andres Gomez Del Real         ptr += BP(env);
1675*c97d6d2cSSergio Andres Gomez Del Real         seg = REG_SEG_SS;
1676*c97d6d2cSSergio Andres Gomez Del Real         break;
1677*c97d6d2cSSergio Andres Gomez Del Real     case 7:
1678*c97d6d2cSSergio Andres Gomez Del Real         ptr += BX(env);
1679*c97d6d2cSSergio Andres Gomez Del Real         break;
1680*c97d6d2cSSergio Andres Gomez Del Real     }
1681*c97d6d2cSSergio Andres Gomez Del Real calc_addr:
1682*c97d6d2cSSergio Andres Gomez Del Real     if (X86_DECODE_CMD_LEA == decode->cmd) {
1683*c97d6d2cSSergio Andres Gomez Del Real         op->ptr = (uint16_t)ptr;
1684*c97d6d2cSSergio Andres Gomez Del Real     } else {
1685*c97d6d2cSSergio Andres Gomez Del Real         op->ptr = decode_linear_addr(env, decode, (uint16_t)ptr, seg);
1686*c97d6d2cSSergio Andres Gomez Del Real     }
1687*c97d6d2cSSergio Andres Gomez Del Real }
1688*c97d6d2cSSergio Andres Gomez Del Real 
1689*c97d6d2cSSergio Andres Gomez Del Real addr_t get_reg_ref(CPUX86State *env, int reg, int is_extended, int size)
1690*c97d6d2cSSergio Andres Gomez Del Real {
1691*c97d6d2cSSergio Andres Gomez Del Real     addr_t ptr = 0;
1692*c97d6d2cSSergio Andres Gomez Del Real     int which = 0;
1693*c97d6d2cSSergio Andres Gomez Del Real 
1694*c97d6d2cSSergio Andres Gomez Del Real     if (is_extended) {
1695*c97d6d2cSSergio Andres Gomez Del Real         reg |= REG_R8;
1696*c97d6d2cSSergio Andres Gomez Del Real     }
1697*c97d6d2cSSergio Andres Gomez Del Real 
1698*c97d6d2cSSergio Andres Gomez Del Real 
1699*c97d6d2cSSergio Andres Gomez Del Real     switch (size) {
1700*c97d6d2cSSergio Andres Gomez Del Real     case 1:
1701*c97d6d2cSSergio Andres Gomez Del Real         if (is_extended || reg < 4) {
1702*c97d6d2cSSergio Andres Gomez Del Real             which = 1;
1703*c97d6d2cSSergio Andres Gomez Del Real             ptr = (addr_t)&RL(env, reg);
1704*c97d6d2cSSergio Andres Gomez Del Real         } else {
1705*c97d6d2cSSergio Andres Gomez Del Real             which = 2;
1706*c97d6d2cSSergio Andres Gomez Del Real             ptr = (addr_t)&RH(env, reg - 4);
1707*c97d6d2cSSergio Andres Gomez Del Real         }
1708*c97d6d2cSSergio Andres Gomez Del Real         break;
1709*c97d6d2cSSergio Andres Gomez Del Real     default:
1710*c97d6d2cSSergio Andres Gomez Del Real         which = 3;
1711*c97d6d2cSSergio Andres Gomez Del Real         ptr = (addr_t)&RRX(env, reg);
1712*c97d6d2cSSergio Andres Gomez Del Real         break;
1713*c97d6d2cSSergio Andres Gomez Del Real     }
1714*c97d6d2cSSergio Andres Gomez Del Real     return ptr;
1715*c97d6d2cSSergio Andres Gomez Del Real }
1716*c97d6d2cSSergio Andres Gomez Del Real 
1717*c97d6d2cSSergio Andres Gomez Del Real addr_t get_reg_val(CPUX86State *env, int reg, int is_extended, int size)
1718*c97d6d2cSSergio Andres Gomez Del Real {
1719*c97d6d2cSSergio Andres Gomez Del Real     addr_t val = 0;
1720*c97d6d2cSSergio Andres Gomez Del Real     memcpy(&val, (void *)get_reg_ref(env, reg, is_extended, size), size);
1721*c97d6d2cSSergio Andres Gomez Del Real     return val;
1722*c97d6d2cSSergio Andres Gomez Del Real }
1723*c97d6d2cSSergio Andres Gomez Del Real 
1724*c97d6d2cSSergio Andres Gomez Del Real static addr_t get_sib_val(CPUX86State *env, struct x86_decode *decode,
1725*c97d6d2cSSergio Andres Gomez Del Real                           x86_reg_segment *sel)
1726*c97d6d2cSSergio Andres Gomez Del Real {
1727*c97d6d2cSSergio Andres Gomez Del Real     addr_t base = 0;
1728*c97d6d2cSSergio Andres Gomez Del Real     addr_t scaled_index = 0;
1729*c97d6d2cSSergio Andres Gomez Del Real     int addr_size = decode->addressing_size;
1730*c97d6d2cSSergio Andres Gomez Del Real     int base_reg = decode->sib.base;
1731*c97d6d2cSSergio Andres Gomez Del Real     int index_reg = decode->sib.index;
1732*c97d6d2cSSergio Andres Gomez Del Real 
1733*c97d6d2cSSergio Andres Gomez Del Real     *sel = REG_SEG_DS;
1734*c97d6d2cSSergio Andres Gomez Del Real 
1735*c97d6d2cSSergio Andres Gomez Del Real     if (decode->modrm.mod || base_reg != REG_RBP) {
1736*c97d6d2cSSergio Andres Gomez Del Real         if (decode->rex.b) {
1737*c97d6d2cSSergio Andres Gomez Del Real             base_reg |= REG_R8;
1738*c97d6d2cSSergio Andres Gomez Del Real         }
1739*c97d6d2cSSergio Andres Gomez Del Real         if (REG_RSP == base_reg || REG_RBP == base_reg) {
1740*c97d6d2cSSergio Andres Gomez Del Real             *sel = REG_SEG_SS;
1741*c97d6d2cSSergio Andres Gomez Del Real         }
1742*c97d6d2cSSergio Andres Gomez Del Real         base = get_reg_val(env, decode->sib.base, decode->rex.b, addr_size);
1743*c97d6d2cSSergio Andres Gomez Del Real     }
1744*c97d6d2cSSergio Andres Gomez Del Real 
1745*c97d6d2cSSergio Andres Gomez Del Real     if (decode->rex.x) {
1746*c97d6d2cSSergio Andres Gomez Del Real         index_reg |= REG_R8;
1747*c97d6d2cSSergio Andres Gomez Del Real     }
1748*c97d6d2cSSergio Andres Gomez Del Real 
1749*c97d6d2cSSergio Andres Gomez Del Real     if (index_reg != REG_RSP) {
1750*c97d6d2cSSergio Andres Gomez Del Real         scaled_index = get_reg_val(env, index_reg, decode->rex.x, addr_size) <<
1751*c97d6d2cSSergio Andres Gomez Del Real                                    decode->sib.scale;
1752*c97d6d2cSSergio Andres Gomez Del Real     }
1753*c97d6d2cSSergio Andres Gomez Del Real     return base + scaled_index;
1754*c97d6d2cSSergio Andres Gomez Del Real }
1755*c97d6d2cSSergio Andres Gomez Del Real 
1756*c97d6d2cSSergio Andres Gomez Del Real void calc_modrm_operand32(CPUX86State *env, struct x86_decode *decode,
1757*c97d6d2cSSergio Andres Gomez Del Real                           struct x86_decode_op *op)
1758*c97d6d2cSSergio Andres Gomez Del Real {
1759*c97d6d2cSSergio Andres Gomez Del Real     x86_reg_segment seg = REG_SEG_DS;
1760*c97d6d2cSSergio Andres Gomez Del Real     addr_t ptr = 0;
1761*c97d6d2cSSergio Andres Gomez Del Real     int addr_size = decode->addressing_size;
1762*c97d6d2cSSergio Andres Gomez Del Real 
1763*c97d6d2cSSergio Andres Gomez Del Real     if (decode->displacement_size) {
1764*c97d6d2cSSergio Andres Gomez Del Real         ptr = sign(decode->displacement, decode->displacement_size);
1765*c97d6d2cSSergio Andres Gomez Del Real     }
1766*c97d6d2cSSergio Andres Gomez Del Real 
1767*c97d6d2cSSergio Andres Gomez Del Real     if (4 == decode->modrm.rm) {
1768*c97d6d2cSSergio Andres Gomez Del Real         ptr += get_sib_val(env, decode, &seg);
1769*c97d6d2cSSergio Andres Gomez Del Real     } else if (!decode->modrm.mod && 5 == decode->modrm.rm) {
1770*c97d6d2cSSergio Andres Gomez Del Real         if (x86_is_long_mode(ENV_GET_CPU(env))) {
1771*c97d6d2cSSergio Andres Gomez Del Real             ptr += RIP(env) + decode->len;
1772*c97d6d2cSSergio Andres Gomez Del Real         } else {
1773*c97d6d2cSSergio Andres Gomez Del Real             ptr = decode->displacement;
1774*c97d6d2cSSergio Andres Gomez Del Real         }
1775*c97d6d2cSSergio Andres Gomez Del Real     } else {
1776*c97d6d2cSSergio Andres Gomez Del Real         if (REG_RBP == decode->modrm.rm || REG_RSP == decode->modrm.rm) {
1777*c97d6d2cSSergio Andres Gomez Del Real             seg = REG_SEG_SS;
1778*c97d6d2cSSergio Andres Gomez Del Real         }
1779*c97d6d2cSSergio Andres Gomez Del Real         ptr += get_reg_val(env, decode->modrm.rm, decode->rex.b, addr_size);
1780*c97d6d2cSSergio Andres Gomez Del Real     }
1781*c97d6d2cSSergio Andres Gomez Del Real 
1782*c97d6d2cSSergio Andres Gomez Del Real     if (X86_DECODE_CMD_LEA == decode->cmd) {
1783*c97d6d2cSSergio Andres Gomez Del Real         op->ptr = (uint32_t)ptr;
1784*c97d6d2cSSergio Andres Gomez Del Real     } else {
1785*c97d6d2cSSergio Andres Gomez Del Real         op->ptr = decode_linear_addr(env, decode, (uint32_t)ptr, seg);
1786*c97d6d2cSSergio Andres Gomez Del Real     }
1787*c97d6d2cSSergio Andres Gomez Del Real }
1788*c97d6d2cSSergio Andres Gomez Del Real 
1789*c97d6d2cSSergio Andres Gomez Del Real void calc_modrm_operand64(CPUX86State *env, struct x86_decode *decode,
1790*c97d6d2cSSergio Andres Gomez Del Real                           struct x86_decode_op *op)
1791*c97d6d2cSSergio Andres Gomez Del Real {
1792*c97d6d2cSSergio Andres Gomez Del Real     x86_reg_segment seg = REG_SEG_DS;
1793*c97d6d2cSSergio Andres Gomez Del Real     int32_t offset = 0;
1794*c97d6d2cSSergio Andres Gomez Del Real     int mod = decode->modrm.mod;
1795*c97d6d2cSSergio Andres Gomez Del Real     int rm = decode->modrm.rm;
1796*c97d6d2cSSergio Andres Gomez Del Real     addr_t ptr;
1797*c97d6d2cSSergio Andres Gomez Del Real     int src = decode->modrm.rm;
1798*c97d6d2cSSergio Andres Gomez Del Real 
1799*c97d6d2cSSergio Andres Gomez Del Real     if (decode->displacement_size) {
1800*c97d6d2cSSergio Andres Gomez Del Real         offset = sign(decode->displacement, decode->displacement_size);
1801*c97d6d2cSSergio Andres Gomez Del Real     }
1802*c97d6d2cSSergio Andres Gomez Del Real 
1803*c97d6d2cSSergio Andres Gomez Del Real     if (4 == rm) {
1804*c97d6d2cSSergio Andres Gomez Del Real         ptr = get_sib_val(env, decode, &seg) + offset;
1805*c97d6d2cSSergio Andres Gomez Del Real     } else if (0 == mod && 5 == rm) {
1806*c97d6d2cSSergio Andres Gomez Del Real         ptr = RIP(env) + decode->len + (int32_t) offset;
1807*c97d6d2cSSergio Andres Gomez Del Real     } else {
1808*c97d6d2cSSergio Andres Gomez Del Real         ptr = get_reg_val(env, src, decode->rex.b, 8) + (int64_t) offset;
1809*c97d6d2cSSergio Andres Gomez Del Real     }
1810*c97d6d2cSSergio Andres Gomez Del Real 
1811*c97d6d2cSSergio Andres Gomez Del Real     if (X86_DECODE_CMD_LEA == decode->cmd) {
1812*c97d6d2cSSergio Andres Gomez Del Real         op->ptr = ptr;
1813*c97d6d2cSSergio Andres Gomez Del Real     } else {
1814*c97d6d2cSSergio Andres Gomez Del Real         op->ptr = decode_linear_addr(env, decode, ptr, seg);
1815*c97d6d2cSSergio Andres Gomez Del Real     }
1816*c97d6d2cSSergio Andres Gomez Del Real }
1817*c97d6d2cSSergio Andres Gomez Del Real 
1818*c97d6d2cSSergio Andres Gomez Del Real 
1819*c97d6d2cSSergio Andres Gomez Del Real void calc_modrm_operand(CPUX86State *env, struct x86_decode *decode,
1820*c97d6d2cSSergio Andres Gomez Del Real                         struct x86_decode_op *op)
1821*c97d6d2cSSergio Andres Gomez Del Real {
1822*c97d6d2cSSergio Andres Gomez Del Real     if (3 == decode->modrm.mod) {
1823*c97d6d2cSSergio Andres Gomez Del Real         op->reg = decode->modrm.reg;
1824*c97d6d2cSSergio Andres Gomez Del Real         op->type = X86_VAR_REG;
1825*c97d6d2cSSergio Andres Gomez Del Real         op->ptr = get_reg_ref(env, decode->modrm.rm, decode->rex.b,
1826*c97d6d2cSSergio Andres Gomez Del Real                               decode->operand_size);
1827*c97d6d2cSSergio Andres Gomez Del Real         return;
1828*c97d6d2cSSergio Andres Gomez Del Real     }
1829*c97d6d2cSSergio Andres Gomez Del Real 
1830*c97d6d2cSSergio Andres Gomez Del Real     switch (decode->addressing_size) {
1831*c97d6d2cSSergio Andres Gomez Del Real     case 2:
1832*c97d6d2cSSergio Andres Gomez Del Real         calc_modrm_operand16(env, decode, op);
1833*c97d6d2cSSergio Andres Gomez Del Real         break;
1834*c97d6d2cSSergio Andres Gomez Del Real     case 4:
1835*c97d6d2cSSergio Andres Gomez Del Real         calc_modrm_operand32(env, decode, op);
1836*c97d6d2cSSergio Andres Gomez Del Real         break;
1837*c97d6d2cSSergio Andres Gomez Del Real     case 8:
1838*c97d6d2cSSergio Andres Gomez Del Real         calc_modrm_operand64(env, decode, op);
1839*c97d6d2cSSergio Andres Gomez Del Real         break;
1840*c97d6d2cSSergio Andres Gomez Del Real     default:
1841*c97d6d2cSSergio Andres Gomez Del Real         VM_PANIC_EX("unsupported address size %d\n", decode->addressing_size);
1842*c97d6d2cSSergio Andres Gomez Del Real         break;
1843*c97d6d2cSSergio Andres Gomez Del Real     }
1844*c97d6d2cSSergio Andres Gomez Del Real }
1845*c97d6d2cSSergio Andres Gomez Del Real 
1846*c97d6d2cSSergio Andres Gomez Del Real static void decode_prefix(CPUX86State *env, struct x86_decode *decode)
1847*c97d6d2cSSergio Andres Gomez Del Real {
1848*c97d6d2cSSergio Andres Gomez Del Real     while (1) {
1849*c97d6d2cSSergio Andres Gomez Del Real         uint8_t byte = decode_byte(env, decode);
1850*c97d6d2cSSergio Andres Gomez Del Real         switch (byte) {
1851*c97d6d2cSSergio Andres Gomez Del Real         case PREFIX_LOCK:
1852*c97d6d2cSSergio Andres Gomez Del Real             decode->lock = byte;
1853*c97d6d2cSSergio Andres Gomez Del Real             break;
1854*c97d6d2cSSergio Andres Gomez Del Real         case PREFIX_REPN:
1855*c97d6d2cSSergio Andres Gomez Del Real         case PREFIX_REP:
1856*c97d6d2cSSergio Andres Gomez Del Real             decode->rep = byte;
1857*c97d6d2cSSergio Andres Gomez Del Real             break;
1858*c97d6d2cSSergio Andres Gomez Del Real         case PREFIX_CS_SEG_OVEERIDE:
1859*c97d6d2cSSergio Andres Gomez Del Real         case PREFIX_SS_SEG_OVEERIDE:
1860*c97d6d2cSSergio Andres Gomez Del Real         case PREFIX_DS_SEG_OVEERIDE:
1861*c97d6d2cSSergio Andres Gomez Del Real         case PREFIX_ES_SEG_OVEERIDE:
1862*c97d6d2cSSergio Andres Gomez Del Real         case PREFIX_FS_SEG_OVEERIDE:
1863*c97d6d2cSSergio Andres Gomez Del Real         case PREFIX_GS_SEG_OVEERIDE:
1864*c97d6d2cSSergio Andres Gomez Del Real             decode->segment_override = byte;
1865*c97d6d2cSSergio Andres Gomez Del Real             break;
1866*c97d6d2cSSergio Andres Gomez Del Real         case PREFIX_OP_SIZE_OVERRIDE:
1867*c97d6d2cSSergio Andres Gomez Del Real             decode->op_size_override = byte;
1868*c97d6d2cSSergio Andres Gomez Del Real             break;
1869*c97d6d2cSSergio Andres Gomez Del Real         case PREFIX_ADDR_SIZE_OVERRIDE:
1870*c97d6d2cSSergio Andres Gomez Del Real             decode->addr_size_override = byte;
1871*c97d6d2cSSergio Andres Gomez Del Real             break;
1872*c97d6d2cSSergio Andres Gomez Del Real         case PREFIX_REX ... (PREFIX_REX + 0xf):
1873*c97d6d2cSSergio Andres Gomez Del Real             if (x86_is_long_mode(ENV_GET_CPU(env))) {
1874*c97d6d2cSSergio Andres Gomez Del Real                 decode->rex.rex = byte;
1875*c97d6d2cSSergio Andres Gomez Del Real                 break;
1876*c97d6d2cSSergio Andres Gomez Del Real             }
1877*c97d6d2cSSergio Andres Gomez Del Real             /* fall through when not in long mode */
1878*c97d6d2cSSergio Andres Gomez Del Real         default:
1879*c97d6d2cSSergio Andres Gomez Del Real             decode->len--;
1880*c97d6d2cSSergio Andres Gomez Del Real             return;
1881*c97d6d2cSSergio Andres Gomez Del Real         }
1882*c97d6d2cSSergio Andres Gomez Del Real     }
1883*c97d6d2cSSergio Andres Gomez Del Real }
1884*c97d6d2cSSergio Andres Gomez Del Real 
1885*c97d6d2cSSergio Andres Gomez Del Real void set_addressing_size(CPUX86State *env, struct x86_decode *decode)
1886*c97d6d2cSSergio Andres Gomez Del Real {
1887*c97d6d2cSSergio Andres Gomez Del Real     decode->addressing_size = -1;
1888*c97d6d2cSSergio Andres Gomez Del Real     if (x86_is_real(ENV_GET_CPU(env)) || x86_is_v8086(ENV_GET_CPU(env))) {
1889*c97d6d2cSSergio Andres Gomez Del Real         if (decode->addr_size_override) {
1890*c97d6d2cSSergio Andres Gomez Del Real             decode->addressing_size = 4;
1891*c97d6d2cSSergio Andres Gomez Del Real         } else {
1892*c97d6d2cSSergio Andres Gomez Del Real             decode->addressing_size = 2;
1893*c97d6d2cSSergio Andres Gomez Del Real         }
1894*c97d6d2cSSergio Andres Gomez Del Real     } else if (!x86_is_long_mode(ENV_GET_CPU(env))) {
1895*c97d6d2cSSergio Andres Gomez Del Real         /* protected */
1896*c97d6d2cSSergio Andres Gomez Del Real         struct vmx_segment cs;
1897*c97d6d2cSSergio Andres Gomez Del Real         vmx_read_segment_descriptor(ENV_GET_CPU(env), &cs, REG_SEG_CS);
1898*c97d6d2cSSergio Andres Gomez Del Real         /* check db */
1899*c97d6d2cSSergio Andres Gomez Del Real         if ((cs.ar >> 14) & 1) {
1900*c97d6d2cSSergio Andres Gomez Del Real             if (decode->addr_size_override) {
1901*c97d6d2cSSergio Andres Gomez Del Real                 decode->addressing_size = 2;
1902*c97d6d2cSSergio Andres Gomez Del Real             } else {
1903*c97d6d2cSSergio Andres Gomez Del Real                 decode->addressing_size = 4;
1904*c97d6d2cSSergio Andres Gomez Del Real             }
1905*c97d6d2cSSergio Andres Gomez Del Real         } else {
1906*c97d6d2cSSergio Andres Gomez Del Real             if (decode->addr_size_override) {
1907*c97d6d2cSSergio Andres Gomez Del Real                 decode->addressing_size = 4;
1908*c97d6d2cSSergio Andres Gomez Del Real             } else {
1909*c97d6d2cSSergio Andres Gomez Del Real                 decode->addressing_size = 2;
1910*c97d6d2cSSergio Andres Gomez Del Real             }
1911*c97d6d2cSSergio Andres Gomez Del Real         }
1912*c97d6d2cSSergio Andres Gomez Del Real     } else {
1913*c97d6d2cSSergio Andres Gomez Del Real         /* long */
1914*c97d6d2cSSergio Andres Gomez Del Real         if (decode->addr_size_override) {
1915*c97d6d2cSSergio Andres Gomez Del Real             decode->addressing_size = 4;
1916*c97d6d2cSSergio Andres Gomez Del Real         } else {
1917*c97d6d2cSSergio Andres Gomez Del Real             decode->addressing_size = 8;
1918*c97d6d2cSSergio Andres Gomez Del Real         }
1919*c97d6d2cSSergio Andres Gomez Del Real     }
1920*c97d6d2cSSergio Andres Gomez Del Real }
1921*c97d6d2cSSergio Andres Gomez Del Real 
1922*c97d6d2cSSergio Andres Gomez Del Real void set_operand_size(CPUX86State *env, struct x86_decode *decode)
1923*c97d6d2cSSergio Andres Gomez Del Real {
1924*c97d6d2cSSergio Andres Gomez Del Real     decode->operand_size = -1;
1925*c97d6d2cSSergio Andres Gomez Del Real     if (x86_is_real(ENV_GET_CPU(env)) || x86_is_v8086(ENV_GET_CPU(env))) {
1926*c97d6d2cSSergio Andres Gomez Del Real         if (decode->op_size_override) {
1927*c97d6d2cSSergio Andres Gomez Del Real             decode->operand_size = 4;
1928*c97d6d2cSSergio Andres Gomez Del Real         } else {
1929*c97d6d2cSSergio Andres Gomez Del Real             decode->operand_size = 2;
1930*c97d6d2cSSergio Andres Gomez Del Real         }
1931*c97d6d2cSSergio Andres Gomez Del Real     } else if (!x86_is_long_mode(ENV_GET_CPU(env))) {
1932*c97d6d2cSSergio Andres Gomez Del Real         /* protected */
1933*c97d6d2cSSergio Andres Gomez Del Real         struct vmx_segment cs;
1934*c97d6d2cSSergio Andres Gomez Del Real         vmx_read_segment_descriptor(ENV_GET_CPU(env), &cs, REG_SEG_CS);
1935*c97d6d2cSSergio Andres Gomez Del Real         /* check db */
1936*c97d6d2cSSergio Andres Gomez Del Real         if ((cs.ar >> 14) & 1) {
1937*c97d6d2cSSergio Andres Gomez Del Real             if (decode->op_size_override) {
1938*c97d6d2cSSergio Andres Gomez Del Real                 decode->operand_size = 2;
1939*c97d6d2cSSergio Andres Gomez Del Real             } else{
1940*c97d6d2cSSergio Andres Gomez Del Real                 decode->operand_size = 4;
1941*c97d6d2cSSergio Andres Gomez Del Real             }
1942*c97d6d2cSSergio Andres Gomez Del Real         } else {
1943*c97d6d2cSSergio Andres Gomez Del Real             if (decode->op_size_override) {
1944*c97d6d2cSSergio Andres Gomez Del Real                 decode->operand_size = 4;
1945*c97d6d2cSSergio Andres Gomez Del Real             } else {
1946*c97d6d2cSSergio Andres Gomez Del Real                 decode->operand_size = 2;
1947*c97d6d2cSSergio Andres Gomez Del Real             }
1948*c97d6d2cSSergio Andres Gomez Del Real         }
1949*c97d6d2cSSergio Andres Gomez Del Real     } else {
1950*c97d6d2cSSergio Andres Gomez Del Real         /* long */
1951*c97d6d2cSSergio Andres Gomez Del Real         if (decode->op_size_override) {
1952*c97d6d2cSSergio Andres Gomez Del Real             decode->operand_size = 2;
1953*c97d6d2cSSergio Andres Gomez Del Real         } else {
1954*c97d6d2cSSergio Andres Gomez Del Real             decode->operand_size = 4;
1955*c97d6d2cSSergio Andres Gomez Del Real         }
1956*c97d6d2cSSergio Andres Gomez Del Real 
1957*c97d6d2cSSergio Andres Gomez Del Real         if (decode->rex.w) {
1958*c97d6d2cSSergio Andres Gomez Del Real             decode->operand_size = 8;
1959*c97d6d2cSSergio Andres Gomez Del Real         }
1960*c97d6d2cSSergio Andres Gomez Del Real     }
1961*c97d6d2cSSergio Andres Gomez Del Real }
1962*c97d6d2cSSergio Andres Gomez Del Real 
1963*c97d6d2cSSergio Andres Gomez Del Real static void decode_sib(CPUX86State *env, struct x86_decode *decode)
1964*c97d6d2cSSergio Andres Gomez Del Real {
1965*c97d6d2cSSergio Andres Gomez Del Real     if ((decode->modrm.mod != 3) && (4 == decode->modrm.rm) &&
1966*c97d6d2cSSergio Andres Gomez Del Real         (decode->addressing_size != 2)) {
1967*c97d6d2cSSergio Andres Gomez Del Real         decode->sib.sib = decode_byte(env, decode);
1968*c97d6d2cSSergio Andres Gomez Del Real         decode->sib_present = true;
1969*c97d6d2cSSergio Andres Gomez Del Real     }
1970*c97d6d2cSSergio Andres Gomez Del Real }
1971*c97d6d2cSSergio Andres Gomez Del Real 
1972*c97d6d2cSSergio Andres Gomez Del Real /* 16 bit modrm */
1973*c97d6d2cSSergio Andres Gomez Del Real int disp16_tbl[4][8] = {
1974*c97d6d2cSSergio Andres Gomez Del Real     {0, 0, 0, 0, 0, 0, 2, 0},
1975*c97d6d2cSSergio Andres Gomez Del Real     {1, 1, 1, 1, 1, 1, 1, 1},
1976*c97d6d2cSSergio Andres Gomez Del Real     {2, 2, 2, 2, 2, 2, 2, 2},
1977*c97d6d2cSSergio Andres Gomez Del Real     {0, 0, 0, 0, 0, 0, 0, 0}
1978*c97d6d2cSSergio Andres Gomez Del Real };
1979*c97d6d2cSSergio Andres Gomez Del Real 
1980*c97d6d2cSSergio Andres Gomez Del Real /* 32/64-bit modrm */
1981*c97d6d2cSSergio Andres Gomez Del Real int disp32_tbl[4][8] = {
1982*c97d6d2cSSergio Andres Gomez Del Real     {0, 0, 0, 0, -1, 4, 0, 0},
1983*c97d6d2cSSergio Andres Gomez Del Real     {1, 1, 1, 1, 1, 1, 1, 1},
1984*c97d6d2cSSergio Andres Gomez Del Real     {4, 4, 4, 4, 4, 4, 4, 4},
1985*c97d6d2cSSergio Andres Gomez Del Real     {0, 0, 0, 0, 0, 0, 0, 0}
1986*c97d6d2cSSergio Andres Gomez Del Real };
1987*c97d6d2cSSergio Andres Gomez Del Real 
1988*c97d6d2cSSergio Andres Gomez Del Real static inline void decode_displacement(CPUX86State *env, struct x86_decode *decode)
1989*c97d6d2cSSergio Andres Gomez Del Real {
1990*c97d6d2cSSergio Andres Gomez Del Real     int addressing_size = decode->addressing_size;
1991*c97d6d2cSSergio Andres Gomez Del Real     int mod = decode->modrm.mod;
1992*c97d6d2cSSergio Andres Gomez Del Real     int rm = decode->modrm.rm;
1993*c97d6d2cSSergio Andres Gomez Del Real 
1994*c97d6d2cSSergio Andres Gomez Del Real     decode->displacement_size = 0;
1995*c97d6d2cSSergio Andres Gomez Del Real     switch (addressing_size) {
1996*c97d6d2cSSergio Andres Gomez Del Real     case 2:
1997*c97d6d2cSSergio Andres Gomez Del Real         decode->displacement_size = disp16_tbl[mod][rm];
1998*c97d6d2cSSergio Andres Gomez Del Real         if (decode->displacement_size) {
1999*c97d6d2cSSergio Andres Gomez Del Real             decode->displacement = (uint16_t)decode_bytes(env, decode,
2000*c97d6d2cSSergio Andres Gomez Del Real                                     decode->displacement_size);
2001*c97d6d2cSSergio Andres Gomez Del Real         }
2002*c97d6d2cSSergio Andres Gomez Del Real         break;
2003*c97d6d2cSSergio Andres Gomez Del Real     case 4:
2004*c97d6d2cSSergio Andres Gomez Del Real     case 8:
2005*c97d6d2cSSergio Andres Gomez Del Real         if (-1 == disp32_tbl[mod][rm]) {
2006*c97d6d2cSSergio Andres Gomez Del Real             if (5 == decode->sib.base) {
2007*c97d6d2cSSergio Andres Gomez Del Real                 decode->displacement_size = 4;
2008*c97d6d2cSSergio Andres Gomez Del Real             }
2009*c97d6d2cSSergio Andres Gomez Del Real         } else {
2010*c97d6d2cSSergio Andres Gomez Del Real             decode->displacement_size = disp32_tbl[mod][rm];
2011*c97d6d2cSSergio Andres Gomez Del Real         }
2012*c97d6d2cSSergio Andres Gomez Del Real 
2013*c97d6d2cSSergio Andres Gomez Del Real         if (decode->displacement_size) {
2014*c97d6d2cSSergio Andres Gomez Del Real             decode->displacement = (uint32_t)decode_bytes(env, decode,
2015*c97d6d2cSSergio Andres Gomez Del Real                                                 decode->displacement_size);
2016*c97d6d2cSSergio Andres Gomez Del Real         }
2017*c97d6d2cSSergio Andres Gomez Del Real         break;
2018*c97d6d2cSSergio Andres Gomez Del Real     }
2019*c97d6d2cSSergio Andres Gomez Del Real }
2020*c97d6d2cSSergio Andres Gomez Del Real 
2021*c97d6d2cSSergio Andres Gomez Del Real static inline void decode_modrm(CPUX86State *env, struct x86_decode *decode)
2022*c97d6d2cSSergio Andres Gomez Del Real {
2023*c97d6d2cSSergio Andres Gomez Del Real     decode->modrm.modrm = decode_byte(env, decode);
2024*c97d6d2cSSergio Andres Gomez Del Real     decode->is_modrm = true;
2025*c97d6d2cSSergio Andres Gomez Del Real 
2026*c97d6d2cSSergio Andres Gomez Del Real     decode_sib(env, decode);
2027*c97d6d2cSSergio Andres Gomez Del Real     decode_displacement(env, decode);
2028*c97d6d2cSSergio Andres Gomez Del Real }
2029*c97d6d2cSSergio Andres Gomez Del Real 
2030*c97d6d2cSSergio Andres Gomez Del Real static inline void decode_opcode_general(CPUX86State *env,
2031*c97d6d2cSSergio Andres Gomez Del Real                                          struct x86_decode *decode,
2032*c97d6d2cSSergio Andres Gomez Del Real                                          uint8_t opcode,
2033*c97d6d2cSSergio Andres Gomez Del Real                                          struct decode_tbl *inst_decoder)
2034*c97d6d2cSSergio Andres Gomez Del Real {
2035*c97d6d2cSSergio Andres Gomez Del Real     decode->cmd = inst_decoder->cmd;
2036*c97d6d2cSSergio Andres Gomez Del Real     if (inst_decoder->operand_size) {
2037*c97d6d2cSSergio Andres Gomez Del Real         decode->operand_size = inst_decoder->operand_size;
2038*c97d6d2cSSergio Andres Gomez Del Real     }
2039*c97d6d2cSSergio Andres Gomez Del Real     decode->flags_mask = inst_decoder->flags_mask;
2040*c97d6d2cSSergio Andres Gomez Del Real 
2041*c97d6d2cSSergio Andres Gomez Del Real     if (inst_decoder->is_modrm) {
2042*c97d6d2cSSergio Andres Gomez Del Real         decode_modrm(env, decode);
2043*c97d6d2cSSergio Andres Gomez Del Real     }
2044*c97d6d2cSSergio Andres Gomez Del Real     if (inst_decoder->decode_op1) {
2045*c97d6d2cSSergio Andres Gomez Del Real         inst_decoder->decode_op1(env, decode, &decode->op[0]);
2046*c97d6d2cSSergio Andres Gomez Del Real     }
2047*c97d6d2cSSergio Andres Gomez Del Real     if (inst_decoder->decode_op2) {
2048*c97d6d2cSSergio Andres Gomez Del Real         inst_decoder->decode_op2(env, decode, &decode->op[1]);
2049*c97d6d2cSSergio Andres Gomez Del Real     }
2050*c97d6d2cSSergio Andres Gomez Del Real     if (inst_decoder->decode_op3) {
2051*c97d6d2cSSergio Andres Gomez Del Real         inst_decoder->decode_op3(env, decode, &decode->op[2]);
2052*c97d6d2cSSergio Andres Gomez Del Real     }
2053*c97d6d2cSSergio Andres Gomez Del Real     if (inst_decoder->decode_op4) {
2054*c97d6d2cSSergio Andres Gomez Del Real         inst_decoder->decode_op4(env, decode, &decode->op[3]);
2055*c97d6d2cSSergio Andres Gomez Del Real     }
2056*c97d6d2cSSergio Andres Gomez Del Real     if (inst_decoder->decode_postfix) {
2057*c97d6d2cSSergio Andres Gomez Del Real         inst_decoder->decode_postfix(env, decode);
2058*c97d6d2cSSergio Andres Gomez Del Real     }
2059*c97d6d2cSSergio Andres Gomez Del Real }
2060*c97d6d2cSSergio Andres Gomez Del Real 
2061*c97d6d2cSSergio Andres Gomez Del Real static inline void decode_opcode_1(CPUX86State *env, struct x86_decode *decode,
2062*c97d6d2cSSergio Andres Gomez Del Real                                    uint8_t opcode)
2063*c97d6d2cSSergio Andres Gomez Del Real {
2064*c97d6d2cSSergio Andres Gomez Del Real     struct decode_tbl *inst_decoder = &_decode_tbl1[opcode];
2065*c97d6d2cSSergio Andres Gomez Del Real     decode_opcode_general(env, decode, opcode, inst_decoder);
2066*c97d6d2cSSergio Andres Gomez Del Real }
2067*c97d6d2cSSergio Andres Gomez Del Real 
2068*c97d6d2cSSergio Andres Gomez Del Real 
2069*c97d6d2cSSergio Andres Gomez Del Real static inline void decode_opcode_2(CPUX86State *env, struct x86_decode *decode,
2070*c97d6d2cSSergio Andres Gomez Del Real                                    uint8_t opcode)
2071*c97d6d2cSSergio Andres Gomez Del Real {
2072*c97d6d2cSSergio Andres Gomez Del Real     struct decode_tbl *inst_decoder = &_decode_tbl2[opcode];
2073*c97d6d2cSSergio Andres Gomez Del Real     decode_opcode_general(env, decode, opcode, inst_decoder);
2074*c97d6d2cSSergio Andres Gomez Del Real }
2075*c97d6d2cSSergio Andres Gomez Del Real 
2076*c97d6d2cSSergio Andres Gomez Del Real static void decode_opcodes(CPUX86State *env, struct x86_decode *decode)
2077*c97d6d2cSSergio Andres Gomez Del Real {
2078*c97d6d2cSSergio Andres Gomez Del Real     uint8_t opcode;
2079*c97d6d2cSSergio Andres Gomez Del Real 
2080*c97d6d2cSSergio Andres Gomez Del Real     opcode = decode_byte(env, decode);
2081*c97d6d2cSSergio Andres Gomez Del Real     decode->opcode[decode->opcode_len++] = opcode;
2082*c97d6d2cSSergio Andres Gomez Del Real     if (opcode != OPCODE_ESCAPE) {
2083*c97d6d2cSSergio Andres Gomez Del Real         decode_opcode_1(env, decode, opcode);
2084*c97d6d2cSSergio Andres Gomez Del Real     } else {
2085*c97d6d2cSSergio Andres Gomez Del Real         opcode = decode_byte(env, decode);
2086*c97d6d2cSSergio Andres Gomez Del Real         decode->opcode[decode->opcode_len++] = opcode;
2087*c97d6d2cSSergio Andres Gomez Del Real         decode_opcode_2(env, decode, opcode);
2088*c97d6d2cSSergio Andres Gomez Del Real     }
2089*c97d6d2cSSergio Andres Gomez Del Real }
2090*c97d6d2cSSergio Andres Gomez Del Real 
2091*c97d6d2cSSergio Andres Gomez Del Real uint32_t decode_instruction(CPUX86State *env, struct x86_decode *decode)
2092*c97d6d2cSSergio Andres Gomez Del Real {
2093*c97d6d2cSSergio Andres Gomez Del Real     ZERO_INIT(*decode);
2094*c97d6d2cSSergio Andres Gomez Del Real 
2095*c97d6d2cSSergio Andres Gomez Del Real     decode_prefix(env, decode);
2096*c97d6d2cSSergio Andres Gomez Del Real     set_addressing_size(env, decode);
2097*c97d6d2cSSergio Andres Gomez Del Real     set_operand_size(env, decode);
2098*c97d6d2cSSergio Andres Gomez Del Real 
2099*c97d6d2cSSergio Andres Gomez Del Real     decode_opcodes(env, decode);
2100*c97d6d2cSSergio Andres Gomez Del Real 
2101*c97d6d2cSSergio Andres Gomez Del Real     return decode->len;
2102*c97d6d2cSSergio Andres Gomez Del Real }
2103*c97d6d2cSSergio Andres Gomez Del Real 
2104*c97d6d2cSSergio Andres Gomez Del Real void init_decoder()
2105*c97d6d2cSSergio Andres Gomez Del Real {
2106*c97d6d2cSSergio Andres Gomez Del Real     int i;
2107*c97d6d2cSSergio Andres Gomez Del Real 
2108*c97d6d2cSSergio Andres Gomez Del Real     for (i = 0; i < ARRAY_SIZE(_decode_tbl2); i++) {
2109*c97d6d2cSSergio Andres Gomez Del Real         memcpy(_decode_tbl1, &invl_inst, sizeof(invl_inst));
2110*c97d6d2cSSergio Andres Gomez Del Real     }
2111*c97d6d2cSSergio Andres Gomez Del Real     for (i = 0; i < ARRAY_SIZE(_decode_tbl2); i++) {
2112*c97d6d2cSSergio Andres Gomez Del Real         memcpy(_decode_tbl2, &invl_inst, sizeof(invl_inst));
2113*c97d6d2cSSergio Andres Gomez Del Real     }
2114*c97d6d2cSSergio Andres Gomez Del Real     for (i = 0; i < ARRAY_SIZE(_decode_tbl3); i++) {
2115*c97d6d2cSSergio Andres Gomez Del Real         memcpy(_decode_tbl3, &invl_inst, sizeof(invl_inst_x87));
2116*c97d6d2cSSergio Andres Gomez Del Real 
2117*c97d6d2cSSergio Andres Gomez Del Real     }
2118*c97d6d2cSSergio Andres Gomez Del Real     for (i = 0; i < ARRAY_SIZE(_1op_inst); i++) {
2119*c97d6d2cSSergio Andres Gomez Del Real         _decode_tbl1[_1op_inst[i].opcode] = _1op_inst[i];
2120*c97d6d2cSSergio Andres Gomez Del Real     }
2121*c97d6d2cSSergio Andres Gomez Del Real     for (i = 0; i < ARRAY_SIZE(_2op_inst); i++) {
2122*c97d6d2cSSergio Andres Gomez Del Real         _decode_tbl2[_2op_inst[i].opcode] = _2op_inst[i];
2123*c97d6d2cSSergio Andres Gomez Del Real     }
2124*c97d6d2cSSergio Andres Gomez Del Real     for (i = 0; i < ARRAY_SIZE(_x87_inst); i++) {
2125*c97d6d2cSSergio Andres Gomez Del Real         int index = ((_x87_inst[i].opcode & 0xf) << 4) |
2126*c97d6d2cSSergio Andres Gomez Del Real                     ((_x87_inst[i].modrm_mod & 1) << 3) |
2127*c97d6d2cSSergio Andres Gomez Del Real                     _x87_inst[i].modrm_reg;
2128*c97d6d2cSSergio Andres Gomez Del Real         _decode_tbl3[index] = _x87_inst[i];
2129*c97d6d2cSSergio Andres Gomez Del Real     }
2130*c97d6d2cSSergio Andres Gomez Del Real }
2131*c97d6d2cSSergio Andres Gomez Del Real 
2132*c97d6d2cSSergio Andres Gomez Del Real 
2133*c97d6d2cSSergio Andres Gomez Del Real const char *decode_cmd_to_string(enum x86_decode_cmd cmd)
2134*c97d6d2cSSergio Andres Gomez Del Real {
2135*c97d6d2cSSergio Andres Gomez Del Real     static const char *cmds[] = {"INVL", "PUSH", "PUSH_SEG", "POP", "POP_SEG",
2136*c97d6d2cSSergio Andres Gomez Del Real         "MOV", "MOVSX", "MOVZX", "CALL_NEAR", "CALL_NEAR_ABS_INDIRECT",
2137*c97d6d2cSSergio Andres Gomez Del Real         "CALL_FAR_ABS_INDIRECT", "CMD_CALL_FAR", "RET_NEAR", "RET_FAR", "ADD",
2138*c97d6d2cSSergio Andres Gomez Del Real         "OR", "ADC", "SBB", "AND", "SUB", "XOR", "CMP", "INC", "DEC", "TST",
2139*c97d6d2cSSergio Andres Gomez Del Real         "NOT", "NEG", "JMP_NEAR", "JMP_NEAR_ABS_INDIRECT", "JMP_FAR",
2140*c97d6d2cSSergio Andres Gomez Del Real         "JMP_FAR_ABS_INDIRECT", "LEA", "JXX", "JCXZ", "SETXX", "MOV_TO_SEG",
2141*c97d6d2cSSergio Andres Gomez Del Real         "MOV_FROM_SEG", "CLI", "STI", "CLD", "STD", "STC", "CLC", "OUT", "IN",
2142*c97d6d2cSSergio Andres Gomez Del Real         "INS", "OUTS", "LIDT", "SIDT", "LGDT", "SGDT", "SMSW", "LMSW",
2143*c97d6d2cSSergio Andres Gomez Del Real         "RDTSCP", "INVLPG", "MOV_TO_CR", "MOV_FROM_CR", "MOV_TO_DR",
2144*c97d6d2cSSergio Andres Gomez Del Real         "MOV_FROM_DR", "PUSHF", "POPF", "CPUID", "ROL", "ROR", "RCL", "RCR",
2145*c97d6d2cSSergio Andres Gomez Del Real         "SHL", "SAL", "SHR", "SHRD", "SHLD", "SAR", "DIV", "IDIV", "MUL",
2146*c97d6d2cSSergio Andres Gomez Del Real         "IMUL_3", "IMUL_2", "IMUL_1", "MOVS", "CMPS", "SCAS", "LODS", "STOS",
2147*c97d6d2cSSergio Andres Gomez Del Real         "BSWAP", "XCHG", "RDTSC", "RDMSR", "WRMSR", "ENTER", "LEAVE", "BT",
2148*c97d6d2cSSergio Andres Gomez Del Real         "BTS", "BTC", "BTR", "BSF", "BSR", "IRET", "INT", "POPA", "PUSHA",
2149*c97d6d2cSSergio Andres Gomez Del Real         "CWD", "CBW", "DAS", "AAD", "AAM", "AAS", "LOOP", "SLDT", "STR", "LLDT",
2150*c97d6d2cSSergio Andres Gomez Del Real         "LTR", "VERR", "VERW", "SAHF", "LAHF", "WBINVD", "LDS", "LSS", "LES",
2151*c97d6d2cSSergio Andres Gomez Del Real         "LGS", "LFS", "CMC", "XLAT", "NOP", "CMOV", "CLTS", "XADD", "HLT",
2152*c97d6d2cSSergio Andres Gomez Del Real         "CMPXCHG8B", "CMPXCHG", "POPCNT", "FNINIT", "FLD", "FLDxx", "FNSTCW",
2153*c97d6d2cSSergio Andres Gomez Del Real         "FNSTSW", "FNSETPM", "FSAVE", "FRSTOR", "FXSAVE", "FXRSTOR", "FDIV",
2154*c97d6d2cSSergio Andres Gomez Del Real         "FMUL", "FSUB", "FADD", "EMMS", "MFENCE", "SFENCE", "LFENCE",
2155*c97d6d2cSSergio Andres Gomez Del Real         "PREFETCH", "FST", "FABS", "FUCOM", "FUCOMI", "FLDCW",
2156*c97d6d2cSSergio Andres Gomez Del Real         "FXCH", "FCHS", "FCMOV", "FRNDINT", "FXAM", "LAST"};
2157*c97d6d2cSSergio Andres Gomez Del Real     return cmds[cmd];
2158*c97d6d2cSSergio Andres Gomez Del Real }
2159*c97d6d2cSSergio Andres Gomez Del Real 
2160*c97d6d2cSSergio Andres Gomez Del Real addr_t decode_linear_addr(CPUX86State *env, struct x86_decode *decode,
2161*c97d6d2cSSergio Andres Gomez Del Real                           addr_t addr, x86_reg_segment seg)
2162*c97d6d2cSSergio Andres Gomez Del Real {
2163*c97d6d2cSSergio Andres Gomez Del Real     switch (decode->segment_override) {
2164*c97d6d2cSSergio Andres Gomez Del Real     case PREFIX_CS_SEG_OVEERIDE:
2165*c97d6d2cSSergio Andres Gomez Del Real         seg = REG_SEG_CS;
2166*c97d6d2cSSergio Andres Gomez Del Real         break;
2167*c97d6d2cSSergio Andres Gomez Del Real     case PREFIX_SS_SEG_OVEERIDE:
2168*c97d6d2cSSergio Andres Gomez Del Real         seg = REG_SEG_SS;
2169*c97d6d2cSSergio Andres Gomez Del Real         break;
2170*c97d6d2cSSergio Andres Gomez Del Real     case PREFIX_DS_SEG_OVEERIDE:
2171*c97d6d2cSSergio Andres Gomez Del Real         seg = REG_SEG_DS;
2172*c97d6d2cSSergio Andres Gomez Del Real         break;
2173*c97d6d2cSSergio Andres Gomez Del Real     case PREFIX_ES_SEG_OVEERIDE:
2174*c97d6d2cSSergio Andres Gomez Del Real         seg = REG_SEG_ES;
2175*c97d6d2cSSergio Andres Gomez Del Real         break;
2176*c97d6d2cSSergio Andres Gomez Del Real     case PREFIX_FS_SEG_OVEERIDE:
2177*c97d6d2cSSergio Andres Gomez Del Real         seg = REG_SEG_FS;
2178*c97d6d2cSSergio Andres Gomez Del Real         break;
2179*c97d6d2cSSergio Andres Gomez Del Real     case PREFIX_GS_SEG_OVEERIDE:
2180*c97d6d2cSSergio Andres Gomez Del Real         seg = REG_SEG_GS;
2181*c97d6d2cSSergio Andres Gomez Del Real         break;
2182*c97d6d2cSSergio Andres Gomez Del Real     default:
2183*c97d6d2cSSergio Andres Gomez Del Real         break;
2184*c97d6d2cSSergio Andres Gomez Del Real     }
2185*c97d6d2cSSergio Andres Gomez Del Real     return linear_addr_size(ENV_GET_CPU(env), addr, decode->addressing_size, seg);
2186*c97d6d2cSSergio Andres Gomez Del Real }
2187