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