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