xref: /rk3399_rockchip-uboot/drivers/bios_emulator/x86emu/ops2.c (revision ece92f85053b8df613edcf05b26a416cbc3d629c)
1*ece92f85SJason Jin /****************************************************************************
2*ece92f85SJason Jin *
3*ece92f85SJason Jin *                       Realmode X86 Emulator Library
4*ece92f85SJason Jin *
5*ece92f85SJason Jin *  Copyright (C) 2007 Freescale Semiconductor, Inc. All rights reserved.
6*ece92f85SJason Jin *  Jason Jin <Jason.jin@freescale.com>
7*ece92f85SJason Jin *
8*ece92f85SJason Jin *               Copyright (C) 1991-2004 SciTech Software, Inc.
9*ece92f85SJason Jin *                    Copyright (C) David Mosberger-Tang
10*ece92f85SJason Jin *                      Copyright (C) 1999 Egbert Eich
11*ece92f85SJason Jin *
12*ece92f85SJason Jin *  ========================================================================
13*ece92f85SJason Jin *
14*ece92f85SJason Jin *  Permission to use, copy, modify, distribute, and sell this software and
15*ece92f85SJason Jin *  its documentation for any purpose is hereby granted without fee,
16*ece92f85SJason Jin *  provided that the above copyright notice appear in all copies and that
17*ece92f85SJason Jin *  both that copyright notice and this permission notice appear in
18*ece92f85SJason Jin *  supporting documentation, and that the name of the authors not be used
19*ece92f85SJason Jin *  in advertising or publicity pertaining to distribution of the software
20*ece92f85SJason Jin *  without specific, written prior permission.  The authors makes no
21*ece92f85SJason Jin *  representations about the suitability of this software for any purpose.
22*ece92f85SJason Jin *  It is provided "as is" without express or implied warranty.
23*ece92f85SJason Jin *
24*ece92f85SJason Jin *  THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
25*ece92f85SJason Jin *  INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
26*ece92f85SJason Jin *  EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
27*ece92f85SJason Jin *  CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
28*ece92f85SJason Jin *  USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
29*ece92f85SJason Jin *  OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
30*ece92f85SJason Jin *  PERFORMANCE OF THIS SOFTWARE.
31*ece92f85SJason Jin *
32*ece92f85SJason Jin *  ========================================================================
33*ece92f85SJason Jin *
34*ece92f85SJason Jin * Language:     ANSI C
35*ece92f85SJason Jin * Environment:  Any
36*ece92f85SJason Jin * Developer:    Kendall Bennett
37*ece92f85SJason Jin *
38*ece92f85SJason Jin * Description:  This file includes subroutines to implement the decoding
39*ece92f85SJason Jin *               and emulation of all the x86 extended two-byte processor
40*ece92f85SJason Jin *               instructions.
41*ece92f85SJason Jin *
42*ece92f85SJason Jin *               Jason port this file to u-boot. Put the function pointer into
43*ece92f85SJason Jin *               got2 sector.
44*ece92f85SJason Jin *
45*ece92f85SJason Jin ****************************************************************************/
46*ece92f85SJason Jin 
47*ece92f85SJason Jin #include "x86emu/x86emui.h"
48*ece92f85SJason Jin 
49*ece92f85SJason Jin /*----------------------------- Implementation ----------------------------*/
50*ece92f85SJason Jin 
51*ece92f85SJason Jin /****************************************************************************
52*ece92f85SJason Jin PARAMETERS:
53*ece92f85SJason Jin op1 - Instruction op code
54*ece92f85SJason Jin 
55*ece92f85SJason Jin REMARKS:
56*ece92f85SJason Jin Handles illegal opcodes.
57*ece92f85SJason Jin ****************************************************************************/
58*ece92f85SJason Jin void x86emuOp2_illegal_op(
59*ece92f85SJason Jin     u8 op2)
60*ece92f85SJason Jin {
61*ece92f85SJason Jin     START_OF_INSTR();
62*ece92f85SJason Jin     DECODE_PRINTF("ILLEGAL EXTENDED X86 OPCODE\n");
63*ece92f85SJason Jin     TRACE_REGS();
64*ece92f85SJason Jin     printk("%04x:%04x: %02X ILLEGAL EXTENDED X86 OPCODE!\n",
65*ece92f85SJason Jin         M.x86.R_CS, M.x86.R_IP-2,op2);
66*ece92f85SJason Jin     HALT_SYS();
67*ece92f85SJason Jin     END_OF_INSTR();
68*ece92f85SJason Jin }
69*ece92f85SJason Jin 
70*ece92f85SJason Jin #define xorl(a,b)   ((a) && !(b)) || (!(a) && (b))
71*ece92f85SJason Jin 
72*ece92f85SJason Jin /****************************************************************************
73*ece92f85SJason Jin REMARKS:
74*ece92f85SJason Jin Handles opcode 0x0f,0x80-0x8F
75*ece92f85SJason Jin ****************************************************************************/
76*ece92f85SJason Jin int x86emu_check_jump_condition(u8 op)
77*ece92f85SJason Jin {
78*ece92f85SJason Jin     switch (op) {
79*ece92f85SJason Jin       case 0x0:
80*ece92f85SJason Jin         DECODE_PRINTF("JO\t");
81*ece92f85SJason Jin         return ACCESS_FLAG(F_OF);
82*ece92f85SJason Jin       case 0x1:
83*ece92f85SJason Jin         DECODE_PRINTF("JNO\t");
84*ece92f85SJason Jin         return !ACCESS_FLAG(F_OF);
85*ece92f85SJason Jin         break;
86*ece92f85SJason Jin       case 0x2:
87*ece92f85SJason Jin         DECODE_PRINTF("JB\t");
88*ece92f85SJason Jin         return ACCESS_FLAG(F_CF);
89*ece92f85SJason Jin         break;
90*ece92f85SJason Jin       case 0x3:
91*ece92f85SJason Jin         DECODE_PRINTF("JNB\t");
92*ece92f85SJason Jin         return !ACCESS_FLAG(F_CF);
93*ece92f85SJason Jin         break;
94*ece92f85SJason Jin       case 0x4:
95*ece92f85SJason Jin         DECODE_PRINTF("JZ\t");
96*ece92f85SJason Jin         return ACCESS_FLAG(F_ZF);
97*ece92f85SJason Jin         break;
98*ece92f85SJason Jin       case 0x5:
99*ece92f85SJason Jin         DECODE_PRINTF("JNZ\t");
100*ece92f85SJason Jin         return !ACCESS_FLAG(F_ZF);
101*ece92f85SJason Jin         break;
102*ece92f85SJason Jin       case 0x6:
103*ece92f85SJason Jin         DECODE_PRINTF("JBE\t");
104*ece92f85SJason Jin         return ACCESS_FLAG(F_CF) || ACCESS_FLAG(F_ZF);
105*ece92f85SJason Jin         break;
106*ece92f85SJason Jin       case 0x7:
107*ece92f85SJason Jin         DECODE_PRINTF("JNBE\t");
108*ece92f85SJason Jin         return !(ACCESS_FLAG(F_CF) || ACCESS_FLAG(F_ZF));
109*ece92f85SJason Jin         break;
110*ece92f85SJason Jin       case 0x8:
111*ece92f85SJason Jin         DECODE_PRINTF("JS\t");
112*ece92f85SJason Jin         return ACCESS_FLAG(F_SF);
113*ece92f85SJason Jin         break;
114*ece92f85SJason Jin       case 0x9:
115*ece92f85SJason Jin         DECODE_PRINTF("JNS\t");
116*ece92f85SJason Jin         return !ACCESS_FLAG(F_SF);
117*ece92f85SJason Jin         break;
118*ece92f85SJason Jin       case 0xa:
119*ece92f85SJason Jin         DECODE_PRINTF("JP\t");
120*ece92f85SJason Jin         return ACCESS_FLAG(F_PF);
121*ece92f85SJason Jin         break;
122*ece92f85SJason Jin       case 0xb:
123*ece92f85SJason Jin         DECODE_PRINTF("JNP\t");
124*ece92f85SJason Jin         return !ACCESS_FLAG(F_PF);
125*ece92f85SJason Jin         break;
126*ece92f85SJason Jin       case 0xc:
127*ece92f85SJason Jin         DECODE_PRINTF("JL\t");
128*ece92f85SJason Jin         return xorl(ACCESS_FLAG(F_SF), ACCESS_FLAG(F_OF));
129*ece92f85SJason Jin         break;
130*ece92f85SJason Jin       case 0xd:
131*ece92f85SJason Jin         DECODE_PRINTF("JNL\t");
132*ece92f85SJason Jin         return !xorl(ACCESS_FLAG(F_SF), ACCESS_FLAG(F_OF));
133*ece92f85SJason Jin         break;
134*ece92f85SJason Jin       case 0xe:
135*ece92f85SJason Jin         DECODE_PRINTF("JLE\t");
136*ece92f85SJason Jin         return (xorl(ACCESS_FLAG(F_SF), ACCESS_FLAG(F_OF)) ||
137*ece92f85SJason Jin                 ACCESS_FLAG(F_ZF));
138*ece92f85SJason Jin         break;
139*ece92f85SJason Jin       default:
140*ece92f85SJason Jin         DECODE_PRINTF("JNLE\t");
141*ece92f85SJason Jin         return !(xorl(ACCESS_FLAG(F_SF), ACCESS_FLAG(F_OF)) ||
142*ece92f85SJason Jin                  ACCESS_FLAG(F_ZF));
143*ece92f85SJason Jin     }
144*ece92f85SJason Jin }
145*ece92f85SJason Jin 
146*ece92f85SJason Jin void x86emuOp2_long_jump(u8 op2)
147*ece92f85SJason Jin {
148*ece92f85SJason Jin     s32 target;
149*ece92f85SJason Jin     int cond;
150*ece92f85SJason Jin 
151*ece92f85SJason Jin     /* conditional jump to word offset. */
152*ece92f85SJason Jin     START_OF_INSTR();
153*ece92f85SJason Jin     cond = x86emu_check_jump_condition(op2 & 0xF);
154*ece92f85SJason Jin     target = (s16) fetch_word_imm();
155*ece92f85SJason Jin     target += (s16) M.x86.R_IP;
156*ece92f85SJason Jin     DECODE_PRINTF2("%04x\n", target);
157*ece92f85SJason Jin     TRACE_AND_STEP();
158*ece92f85SJason Jin     if (cond)
159*ece92f85SJason Jin         M.x86.R_IP = (u16)target;
160*ece92f85SJason Jin     DECODE_CLEAR_SEGOVR();
161*ece92f85SJason Jin     END_OF_INSTR();
162*ece92f85SJason Jin }
163*ece92f85SJason Jin 
164*ece92f85SJason Jin /****************************************************************************
165*ece92f85SJason Jin REMARKS:
166*ece92f85SJason Jin Handles opcode 0x0f,0x90-0x9F
167*ece92f85SJason Jin ****************************************************************************/
168*ece92f85SJason Jin void x86emuOp2_set_byte(u8 op2)
169*ece92f85SJason Jin {
170*ece92f85SJason Jin     int mod, rl, rh;
171*ece92f85SJason Jin     uint destoffset;
172*ece92f85SJason Jin     u8  *destreg;
173*ece92f85SJason Jin     char *name = 0;
174*ece92f85SJason Jin     int cond = 0;
175*ece92f85SJason Jin 
176*ece92f85SJason Jin     START_OF_INSTR();
177*ece92f85SJason Jin     switch (op2) {
178*ece92f85SJason Jin       case 0x90:
179*ece92f85SJason Jin         name = "SETO\t";
180*ece92f85SJason Jin         cond =  ACCESS_FLAG(F_OF);
181*ece92f85SJason Jin         break;
182*ece92f85SJason Jin       case 0x91:
183*ece92f85SJason Jin         name = "SETNO\t";
184*ece92f85SJason Jin         cond = !ACCESS_FLAG(F_OF);
185*ece92f85SJason Jin         break;
186*ece92f85SJason Jin       case 0x92:
187*ece92f85SJason Jin         name = "SETB\t";
188*ece92f85SJason Jin         cond = ACCESS_FLAG(F_CF);
189*ece92f85SJason Jin         break;
190*ece92f85SJason Jin       case 0x93:
191*ece92f85SJason Jin         name = "SETNB\t";
192*ece92f85SJason Jin         cond = !ACCESS_FLAG(F_CF);
193*ece92f85SJason Jin         break;
194*ece92f85SJason Jin       case 0x94:
195*ece92f85SJason Jin         name = "SETZ\t";
196*ece92f85SJason Jin         cond = ACCESS_FLAG(F_ZF);
197*ece92f85SJason Jin         break;
198*ece92f85SJason Jin       case 0x95:
199*ece92f85SJason Jin         name = "SETNZ\t";
200*ece92f85SJason Jin         cond = !ACCESS_FLAG(F_ZF);
201*ece92f85SJason Jin         break;
202*ece92f85SJason Jin       case 0x96:
203*ece92f85SJason Jin         name = "SETBE\t";
204*ece92f85SJason Jin         cond = ACCESS_FLAG(F_CF) || ACCESS_FLAG(F_ZF);
205*ece92f85SJason Jin         break;
206*ece92f85SJason Jin       case 0x97:
207*ece92f85SJason Jin         name = "SETNBE\t";
208*ece92f85SJason Jin         cond = !(ACCESS_FLAG(F_CF) || ACCESS_FLAG(F_ZF));
209*ece92f85SJason Jin         break;
210*ece92f85SJason Jin       case 0x98:
211*ece92f85SJason Jin         name = "SETS\t";
212*ece92f85SJason Jin         cond = ACCESS_FLAG(F_SF);
213*ece92f85SJason Jin         break;
214*ece92f85SJason Jin       case 0x99:
215*ece92f85SJason Jin         name = "SETNS\t";
216*ece92f85SJason Jin         cond = !ACCESS_FLAG(F_SF);
217*ece92f85SJason Jin         break;
218*ece92f85SJason Jin       case 0x9a:
219*ece92f85SJason Jin         name = "SETP\t";
220*ece92f85SJason Jin         cond = ACCESS_FLAG(F_PF);
221*ece92f85SJason Jin         break;
222*ece92f85SJason Jin       case 0x9b:
223*ece92f85SJason Jin         name = "SETNP\t";
224*ece92f85SJason Jin         cond = !ACCESS_FLAG(F_PF);
225*ece92f85SJason Jin         break;
226*ece92f85SJason Jin       case 0x9c:
227*ece92f85SJason Jin         name = "SETL\t";
228*ece92f85SJason Jin         cond = xorl(ACCESS_FLAG(F_SF), ACCESS_FLAG(F_OF));
229*ece92f85SJason Jin         break;
230*ece92f85SJason Jin       case 0x9d:
231*ece92f85SJason Jin         name = "SETNL\t";
232*ece92f85SJason Jin         cond = !xorl(ACCESS_FLAG(F_SF), ACCESS_FLAG(F_OF));
233*ece92f85SJason Jin         break;
234*ece92f85SJason Jin       case 0x9e:
235*ece92f85SJason Jin         name = "SETLE\t";
236*ece92f85SJason Jin         cond = (xorl(ACCESS_FLAG(F_SF), ACCESS_FLAG(F_OF)) ||
237*ece92f85SJason Jin                 ACCESS_FLAG(F_ZF));
238*ece92f85SJason Jin         break;
239*ece92f85SJason Jin       case 0x9f:
240*ece92f85SJason Jin         name = "SETNLE\t";
241*ece92f85SJason Jin         cond = !(xorl(ACCESS_FLAG(F_SF), ACCESS_FLAG(F_OF)) ||
242*ece92f85SJason Jin                  ACCESS_FLAG(F_ZF));
243*ece92f85SJason Jin         break;
244*ece92f85SJason Jin     }
245*ece92f85SJason Jin     DECODE_PRINTF(name);
246*ece92f85SJason Jin     FETCH_DECODE_MODRM(mod, rh, rl);
247*ece92f85SJason Jin     if (mod < 3) {
248*ece92f85SJason Jin         destoffset = decode_rmXX_address(mod, rl);
249*ece92f85SJason Jin         TRACE_AND_STEP();
250*ece92f85SJason Jin         store_data_byte(destoffset, cond ? 0x01 : 0x00);
251*ece92f85SJason Jin     } else {                     /* register to register */
252*ece92f85SJason Jin         destreg = DECODE_RM_BYTE_REGISTER(rl);
253*ece92f85SJason Jin         TRACE_AND_STEP();
254*ece92f85SJason Jin         *destreg = cond ? 0x01 : 0x00;
255*ece92f85SJason Jin     }
256*ece92f85SJason Jin     DECODE_CLEAR_SEGOVR();
257*ece92f85SJason Jin     END_OF_INSTR();
258*ece92f85SJason Jin }
259*ece92f85SJason Jin 
260*ece92f85SJason Jin /****************************************************************************
261*ece92f85SJason Jin REMARKS:
262*ece92f85SJason Jin Handles opcode 0x0f,0xa0
263*ece92f85SJason Jin ****************************************************************************/
264*ece92f85SJason Jin void x86emuOp2_push_FS(u8 X86EMU_UNUSED(op2))
265*ece92f85SJason Jin {
266*ece92f85SJason Jin     START_OF_INSTR();
267*ece92f85SJason Jin     DECODE_PRINTF("PUSH\tFS\n");
268*ece92f85SJason Jin     TRACE_AND_STEP();
269*ece92f85SJason Jin     push_word(M.x86.R_FS);
270*ece92f85SJason Jin     DECODE_CLEAR_SEGOVR();
271*ece92f85SJason Jin     END_OF_INSTR();
272*ece92f85SJason Jin }
273*ece92f85SJason Jin 
274*ece92f85SJason Jin /****************************************************************************
275*ece92f85SJason Jin REMARKS:
276*ece92f85SJason Jin Handles opcode 0x0f,0xa1
277*ece92f85SJason Jin ****************************************************************************/
278*ece92f85SJason Jin void x86emuOp2_pop_FS(u8 X86EMU_UNUSED(op2))
279*ece92f85SJason Jin {
280*ece92f85SJason Jin     START_OF_INSTR();
281*ece92f85SJason Jin     DECODE_PRINTF("POP\tFS\n");
282*ece92f85SJason Jin     TRACE_AND_STEP();
283*ece92f85SJason Jin     M.x86.R_FS = pop_word();
284*ece92f85SJason Jin     DECODE_CLEAR_SEGOVR();
285*ece92f85SJason Jin     END_OF_INSTR();
286*ece92f85SJason Jin }
287*ece92f85SJason Jin 
288*ece92f85SJason Jin /****************************************************************************
289*ece92f85SJason Jin REMARKS:
290*ece92f85SJason Jin Handles opcode 0x0f,0xa3
291*ece92f85SJason Jin ****************************************************************************/
292*ece92f85SJason Jin void x86emuOp2_bt_R(u8 X86EMU_UNUSED(op2))
293*ece92f85SJason Jin {
294*ece92f85SJason Jin     int mod, rl, rh;
295*ece92f85SJason Jin     uint srcoffset;
296*ece92f85SJason Jin     int bit,disp;
297*ece92f85SJason Jin 
298*ece92f85SJason Jin     START_OF_INSTR();
299*ece92f85SJason Jin     DECODE_PRINTF("BT\t");
300*ece92f85SJason Jin     FETCH_DECODE_MODRM(mod, rh, rl);
301*ece92f85SJason Jin     if (mod < 3) {
302*ece92f85SJason Jin         srcoffset = decode_rmXX_address(mod, rl);
303*ece92f85SJason Jin         if (M.x86.mode & SYSMODE_PREFIX_DATA) {
304*ece92f85SJason Jin             u32 srcval;
305*ece92f85SJason Jin             u32 *shiftreg;
306*ece92f85SJason Jin 
307*ece92f85SJason Jin             DECODE_PRINTF(",");
308*ece92f85SJason Jin             shiftreg = DECODE_RM_LONG_REGISTER(rh);
309*ece92f85SJason Jin             TRACE_AND_STEP();
310*ece92f85SJason Jin             bit = *shiftreg & 0x1F;
311*ece92f85SJason Jin             disp = (s16)*shiftreg >> 5;
312*ece92f85SJason Jin             srcval = fetch_data_long(srcoffset+disp);
313*ece92f85SJason Jin             CONDITIONAL_SET_FLAG(srcval & (0x1 << bit),F_CF);
314*ece92f85SJason Jin         } else {
315*ece92f85SJason Jin             u16 srcval;
316*ece92f85SJason Jin             u16 *shiftreg;
317*ece92f85SJason Jin 
318*ece92f85SJason Jin             DECODE_PRINTF(",");
319*ece92f85SJason Jin             shiftreg = DECODE_RM_WORD_REGISTER(rh);
320*ece92f85SJason Jin             TRACE_AND_STEP();
321*ece92f85SJason Jin             bit = *shiftreg & 0xF;
322*ece92f85SJason Jin             disp = (s16)*shiftreg >> 4;
323*ece92f85SJason Jin             srcval = fetch_data_word(srcoffset+disp);
324*ece92f85SJason Jin             CONDITIONAL_SET_FLAG(srcval & (0x1 << bit),F_CF);
325*ece92f85SJason Jin         }
326*ece92f85SJason Jin     } else {                     /* register to register */
327*ece92f85SJason Jin         if (M.x86.mode & SYSMODE_PREFIX_DATA) {
328*ece92f85SJason Jin             u32 *srcreg,*shiftreg;
329*ece92f85SJason Jin 
330*ece92f85SJason Jin             srcreg = DECODE_RM_LONG_REGISTER(rl);
331*ece92f85SJason Jin             DECODE_PRINTF(",");
332*ece92f85SJason Jin             shiftreg = DECODE_RM_LONG_REGISTER(rh);
333*ece92f85SJason Jin             TRACE_AND_STEP();
334*ece92f85SJason Jin             bit = *shiftreg & 0x1F;
335*ece92f85SJason Jin             CONDITIONAL_SET_FLAG(*srcreg & (0x1 << bit),F_CF);
336*ece92f85SJason Jin         } else {
337*ece92f85SJason Jin             u16 *srcreg,*shiftreg;
338*ece92f85SJason Jin 
339*ece92f85SJason Jin             srcreg = DECODE_RM_WORD_REGISTER(rl);
340*ece92f85SJason Jin             DECODE_PRINTF(",");
341*ece92f85SJason Jin             shiftreg = DECODE_RM_WORD_REGISTER(rh);
342*ece92f85SJason Jin             TRACE_AND_STEP();
343*ece92f85SJason Jin             bit = *shiftreg & 0xF;
344*ece92f85SJason Jin             CONDITIONAL_SET_FLAG(*srcreg & (0x1 << bit),F_CF);
345*ece92f85SJason Jin         }
346*ece92f85SJason Jin     }
347*ece92f85SJason Jin     DECODE_CLEAR_SEGOVR();
348*ece92f85SJason Jin     END_OF_INSTR();
349*ece92f85SJason Jin }
350*ece92f85SJason Jin 
351*ece92f85SJason Jin /****************************************************************************
352*ece92f85SJason Jin REMARKS:
353*ece92f85SJason Jin Handles opcode 0x0f,0xa4
354*ece92f85SJason Jin ****************************************************************************/
355*ece92f85SJason Jin void x86emuOp2_shld_IMM(u8 X86EMU_UNUSED(op2))
356*ece92f85SJason Jin {
357*ece92f85SJason Jin     int mod, rl, rh;
358*ece92f85SJason Jin     uint destoffset;
359*ece92f85SJason Jin     u8 shift;
360*ece92f85SJason Jin 
361*ece92f85SJason Jin     START_OF_INSTR();
362*ece92f85SJason Jin     DECODE_PRINTF("SHLD\t");
363*ece92f85SJason Jin     FETCH_DECODE_MODRM(mod, rh, rl);
364*ece92f85SJason Jin     if (mod < 3) {
365*ece92f85SJason Jin         destoffset = decode_rmXX_address(mod, rl);
366*ece92f85SJason Jin         if (M.x86.mode & SYSMODE_PREFIX_DATA) {
367*ece92f85SJason Jin             u32 destval;
368*ece92f85SJason Jin             u32 *shiftreg;
369*ece92f85SJason Jin 
370*ece92f85SJason Jin             DECODE_PRINTF(",");
371*ece92f85SJason Jin             shiftreg = DECODE_RM_LONG_REGISTER(rh);
372*ece92f85SJason Jin             DECODE_PRINTF(",");
373*ece92f85SJason Jin             shift = fetch_byte_imm();
374*ece92f85SJason Jin             DECODE_PRINTF2("%d\n", shift);
375*ece92f85SJason Jin             TRACE_AND_STEP();
376*ece92f85SJason Jin             destval = fetch_data_long(destoffset);
377*ece92f85SJason Jin             destval = shld_long(destval,*shiftreg,shift);
378*ece92f85SJason Jin             store_data_long(destoffset, destval);
379*ece92f85SJason Jin         } else {
380*ece92f85SJason Jin             u16 destval;
381*ece92f85SJason Jin             u16 *shiftreg;
382*ece92f85SJason Jin 
383*ece92f85SJason Jin             DECODE_PRINTF(",");
384*ece92f85SJason Jin             shiftreg = DECODE_RM_WORD_REGISTER(rh);
385*ece92f85SJason Jin             DECODE_PRINTF(",");
386*ece92f85SJason Jin             shift = fetch_byte_imm();
387*ece92f85SJason Jin             DECODE_PRINTF2("%d\n", shift);
388*ece92f85SJason Jin             TRACE_AND_STEP();
389*ece92f85SJason Jin             destval = fetch_data_word(destoffset);
390*ece92f85SJason Jin             destval = shld_word(destval,*shiftreg,shift);
391*ece92f85SJason Jin             store_data_word(destoffset, destval);
392*ece92f85SJason Jin         }
393*ece92f85SJason Jin     } else {                     /* register to register */
394*ece92f85SJason Jin         if (M.x86.mode & SYSMODE_PREFIX_DATA) {
395*ece92f85SJason Jin             u32 *destreg,*shiftreg;
396*ece92f85SJason Jin 
397*ece92f85SJason Jin             destreg = DECODE_RM_LONG_REGISTER(rl);
398*ece92f85SJason Jin             DECODE_PRINTF(",");
399*ece92f85SJason Jin             shiftreg = DECODE_RM_LONG_REGISTER(rh);
400*ece92f85SJason Jin             DECODE_PRINTF(",");
401*ece92f85SJason Jin             shift = fetch_byte_imm();
402*ece92f85SJason Jin             DECODE_PRINTF2("%d\n", shift);
403*ece92f85SJason Jin             TRACE_AND_STEP();
404*ece92f85SJason Jin             *destreg = shld_long(*destreg,*shiftreg,shift);
405*ece92f85SJason Jin         } else {
406*ece92f85SJason Jin             u16 *destreg,*shiftreg;
407*ece92f85SJason Jin 
408*ece92f85SJason Jin             destreg = DECODE_RM_WORD_REGISTER(rl);
409*ece92f85SJason Jin             DECODE_PRINTF(",");
410*ece92f85SJason Jin             shiftreg = DECODE_RM_WORD_REGISTER(rh);
411*ece92f85SJason Jin             DECODE_PRINTF(",");
412*ece92f85SJason Jin             shift = fetch_byte_imm();
413*ece92f85SJason Jin             DECODE_PRINTF2("%d\n", shift);
414*ece92f85SJason Jin             TRACE_AND_STEP();
415*ece92f85SJason Jin             *destreg = shld_word(*destreg,*shiftreg,shift);
416*ece92f85SJason Jin         }
417*ece92f85SJason Jin     }
418*ece92f85SJason Jin     DECODE_CLEAR_SEGOVR();
419*ece92f85SJason Jin     END_OF_INSTR();
420*ece92f85SJason Jin }
421*ece92f85SJason Jin 
422*ece92f85SJason Jin /****************************************************************************
423*ece92f85SJason Jin REMARKS:
424*ece92f85SJason Jin Handles opcode 0x0f,0xa5
425*ece92f85SJason Jin ****************************************************************************/
426*ece92f85SJason Jin void x86emuOp2_shld_CL(u8 X86EMU_UNUSED(op2))
427*ece92f85SJason Jin {
428*ece92f85SJason Jin     int mod, rl, rh;
429*ece92f85SJason Jin     uint destoffset;
430*ece92f85SJason Jin 
431*ece92f85SJason Jin     START_OF_INSTR();
432*ece92f85SJason Jin     DECODE_PRINTF("SHLD\t");
433*ece92f85SJason Jin     FETCH_DECODE_MODRM(mod, rh, rl);
434*ece92f85SJason Jin     if (mod < 3) {
435*ece92f85SJason Jin         destoffset = decode_rmXX_address(mod, rl);
436*ece92f85SJason Jin         if (M.x86.mode & SYSMODE_PREFIX_DATA) {
437*ece92f85SJason Jin             u32 destval;
438*ece92f85SJason Jin             u32 *shiftreg;
439*ece92f85SJason Jin 
440*ece92f85SJason Jin             DECODE_PRINTF(",");
441*ece92f85SJason Jin             shiftreg = DECODE_RM_LONG_REGISTER(rh);
442*ece92f85SJason Jin             DECODE_PRINTF(",CL\n");
443*ece92f85SJason Jin             TRACE_AND_STEP();
444*ece92f85SJason Jin             destval = fetch_data_long(destoffset);
445*ece92f85SJason Jin             destval = shld_long(destval,*shiftreg,M.x86.R_CL);
446*ece92f85SJason Jin             store_data_long(destoffset, destval);
447*ece92f85SJason Jin         } else {
448*ece92f85SJason Jin             u16 destval;
449*ece92f85SJason Jin             u16 *shiftreg;
450*ece92f85SJason Jin 
451*ece92f85SJason Jin             DECODE_PRINTF(",");
452*ece92f85SJason Jin             shiftreg = DECODE_RM_WORD_REGISTER(rh);
453*ece92f85SJason Jin             DECODE_PRINTF(",CL\n");
454*ece92f85SJason Jin             TRACE_AND_STEP();
455*ece92f85SJason Jin             destval = fetch_data_word(destoffset);
456*ece92f85SJason Jin             destval = shld_word(destval,*shiftreg,M.x86.R_CL);
457*ece92f85SJason Jin             store_data_word(destoffset, destval);
458*ece92f85SJason Jin         }
459*ece92f85SJason Jin     } else {                     /* register to register */
460*ece92f85SJason Jin         if (M.x86.mode & SYSMODE_PREFIX_DATA) {
461*ece92f85SJason Jin             u32 *destreg,*shiftreg;
462*ece92f85SJason Jin 
463*ece92f85SJason Jin             destreg = DECODE_RM_LONG_REGISTER(rl);
464*ece92f85SJason Jin             DECODE_PRINTF(",");
465*ece92f85SJason Jin             shiftreg = DECODE_RM_LONG_REGISTER(rh);
466*ece92f85SJason Jin             DECODE_PRINTF(",CL\n");
467*ece92f85SJason Jin             TRACE_AND_STEP();
468*ece92f85SJason Jin             *destreg = shld_long(*destreg,*shiftreg,M.x86.R_CL);
469*ece92f85SJason Jin         } else {
470*ece92f85SJason Jin             u16 *destreg,*shiftreg;
471*ece92f85SJason Jin 
472*ece92f85SJason Jin             destreg = DECODE_RM_WORD_REGISTER(rl);
473*ece92f85SJason Jin             DECODE_PRINTF(",");
474*ece92f85SJason Jin             shiftreg = DECODE_RM_WORD_REGISTER(rh);
475*ece92f85SJason Jin             DECODE_PRINTF(",CL\n");
476*ece92f85SJason Jin             TRACE_AND_STEP();
477*ece92f85SJason Jin             *destreg = shld_word(*destreg,*shiftreg,M.x86.R_CL);
478*ece92f85SJason Jin         }
479*ece92f85SJason Jin     }
480*ece92f85SJason Jin     DECODE_CLEAR_SEGOVR();
481*ece92f85SJason Jin     END_OF_INSTR();
482*ece92f85SJason Jin }
483*ece92f85SJason Jin 
484*ece92f85SJason Jin /****************************************************************************
485*ece92f85SJason Jin REMARKS:
486*ece92f85SJason Jin Handles opcode 0x0f,0xa8
487*ece92f85SJason Jin ****************************************************************************/
488*ece92f85SJason Jin void x86emuOp2_push_GS(u8 X86EMU_UNUSED(op2))
489*ece92f85SJason Jin {
490*ece92f85SJason Jin     START_OF_INSTR();
491*ece92f85SJason Jin     DECODE_PRINTF("PUSH\tGS\n");
492*ece92f85SJason Jin     TRACE_AND_STEP();
493*ece92f85SJason Jin     push_word(M.x86.R_GS);
494*ece92f85SJason Jin     DECODE_CLEAR_SEGOVR();
495*ece92f85SJason Jin     END_OF_INSTR();
496*ece92f85SJason Jin }
497*ece92f85SJason Jin 
498*ece92f85SJason Jin /****************************************************************************
499*ece92f85SJason Jin REMARKS:
500*ece92f85SJason Jin Handles opcode 0x0f,0xa9
501*ece92f85SJason Jin ****************************************************************************/
502*ece92f85SJason Jin void x86emuOp2_pop_GS(u8 X86EMU_UNUSED(op2))
503*ece92f85SJason Jin {
504*ece92f85SJason Jin     START_OF_INSTR();
505*ece92f85SJason Jin     DECODE_PRINTF("POP\tGS\n");
506*ece92f85SJason Jin     TRACE_AND_STEP();
507*ece92f85SJason Jin     M.x86.R_GS = pop_word();
508*ece92f85SJason Jin     DECODE_CLEAR_SEGOVR();
509*ece92f85SJason Jin     END_OF_INSTR();
510*ece92f85SJason Jin }
511*ece92f85SJason Jin 
512*ece92f85SJason Jin /****************************************************************************
513*ece92f85SJason Jin REMARKS:
514*ece92f85SJason Jin Handles opcode 0x0f,0xaa
515*ece92f85SJason Jin ****************************************************************************/
516*ece92f85SJason Jin void x86emuOp2_bts_R(u8 X86EMU_UNUSED(op2))
517*ece92f85SJason Jin {
518*ece92f85SJason Jin     int mod, rl, rh;
519*ece92f85SJason Jin     uint srcoffset;
520*ece92f85SJason Jin     int bit,disp;
521*ece92f85SJason Jin 
522*ece92f85SJason Jin     START_OF_INSTR();
523*ece92f85SJason Jin     DECODE_PRINTF("BTS\t");
524*ece92f85SJason Jin     FETCH_DECODE_MODRM(mod, rh, rl);
525*ece92f85SJason Jin     if (mod < 3) {
526*ece92f85SJason Jin         srcoffset = decode_rmXX_address(mod, rl);
527*ece92f85SJason Jin         if (M.x86.mode & SYSMODE_PREFIX_DATA) {
528*ece92f85SJason Jin             u32 srcval,mask;
529*ece92f85SJason Jin             u32 *shiftreg;
530*ece92f85SJason Jin 
531*ece92f85SJason Jin             DECODE_PRINTF(",");
532*ece92f85SJason Jin             shiftreg = DECODE_RM_LONG_REGISTER(rh);
533*ece92f85SJason Jin             TRACE_AND_STEP();
534*ece92f85SJason Jin             bit = *shiftreg & 0x1F;
535*ece92f85SJason Jin             disp = (s16)*shiftreg >> 5;
536*ece92f85SJason Jin             srcval = fetch_data_long(srcoffset+disp);
537*ece92f85SJason Jin             mask = (0x1 << bit);
538*ece92f85SJason Jin             CONDITIONAL_SET_FLAG(srcval & mask,F_CF);
539*ece92f85SJason Jin             store_data_long(srcoffset+disp, srcval | mask);
540*ece92f85SJason Jin         } else {
541*ece92f85SJason Jin             u16 srcval,mask;
542*ece92f85SJason Jin             u16 *shiftreg;
543*ece92f85SJason Jin 
544*ece92f85SJason Jin             DECODE_PRINTF(",");
545*ece92f85SJason Jin             shiftreg = DECODE_RM_WORD_REGISTER(rh);
546*ece92f85SJason Jin             TRACE_AND_STEP();
547*ece92f85SJason Jin             bit = *shiftreg & 0xF;
548*ece92f85SJason Jin             disp = (s16)*shiftreg >> 4;
549*ece92f85SJason Jin             srcval = fetch_data_word(srcoffset+disp);
550*ece92f85SJason Jin             mask = (u16)(0x1 << bit);
551*ece92f85SJason Jin             CONDITIONAL_SET_FLAG(srcval & mask,F_CF);
552*ece92f85SJason Jin             store_data_word(srcoffset+disp, srcval | mask);
553*ece92f85SJason Jin         }
554*ece92f85SJason Jin     } else {                     /* register to register */
555*ece92f85SJason Jin         if (M.x86.mode & SYSMODE_PREFIX_DATA) {
556*ece92f85SJason Jin             u32 *srcreg,*shiftreg;
557*ece92f85SJason Jin             u32 mask;
558*ece92f85SJason Jin 
559*ece92f85SJason Jin             srcreg = DECODE_RM_LONG_REGISTER(rl);
560*ece92f85SJason Jin             DECODE_PRINTF(",");
561*ece92f85SJason Jin             shiftreg = DECODE_RM_LONG_REGISTER(rh);
562*ece92f85SJason Jin             TRACE_AND_STEP();
563*ece92f85SJason Jin             bit = *shiftreg & 0x1F;
564*ece92f85SJason Jin             mask = (0x1 << bit);
565*ece92f85SJason Jin             CONDITIONAL_SET_FLAG(*srcreg & mask,F_CF);
566*ece92f85SJason Jin             *srcreg |= mask;
567*ece92f85SJason Jin         } else {
568*ece92f85SJason Jin             u16 *srcreg,*shiftreg;
569*ece92f85SJason Jin             u16 mask;
570*ece92f85SJason Jin 
571*ece92f85SJason Jin             srcreg = DECODE_RM_WORD_REGISTER(rl);
572*ece92f85SJason Jin             DECODE_PRINTF(",");
573*ece92f85SJason Jin             shiftreg = DECODE_RM_WORD_REGISTER(rh);
574*ece92f85SJason Jin             TRACE_AND_STEP();
575*ece92f85SJason Jin             bit = *shiftreg & 0xF;
576*ece92f85SJason Jin             mask = (u16)(0x1 << bit);
577*ece92f85SJason Jin             CONDITIONAL_SET_FLAG(*srcreg & mask,F_CF);
578*ece92f85SJason Jin             *srcreg |= mask;
579*ece92f85SJason Jin         }
580*ece92f85SJason Jin     }
581*ece92f85SJason Jin     DECODE_CLEAR_SEGOVR();
582*ece92f85SJason Jin     END_OF_INSTR();
583*ece92f85SJason Jin }
584*ece92f85SJason Jin 
585*ece92f85SJason Jin /****************************************************************************
586*ece92f85SJason Jin REMARKS:
587*ece92f85SJason Jin Handles opcode 0x0f,0xac
588*ece92f85SJason Jin ****************************************************************************/
589*ece92f85SJason Jin void x86emuOp2_shrd_IMM(u8 X86EMU_UNUSED(op2))
590*ece92f85SJason Jin {
591*ece92f85SJason Jin     int mod, rl, rh;
592*ece92f85SJason Jin     uint destoffset;
593*ece92f85SJason Jin     u8 shift;
594*ece92f85SJason Jin 
595*ece92f85SJason Jin     START_OF_INSTR();
596*ece92f85SJason Jin     DECODE_PRINTF("SHLD\t");
597*ece92f85SJason Jin     FETCH_DECODE_MODRM(mod, rh, rl);
598*ece92f85SJason Jin     if (mod < 3) {
599*ece92f85SJason Jin         destoffset = decode_rmXX_address(mod, rl);
600*ece92f85SJason Jin         if (M.x86.mode & SYSMODE_PREFIX_DATA) {
601*ece92f85SJason Jin             u32 destval;
602*ece92f85SJason Jin             u32 *shiftreg;
603*ece92f85SJason Jin 
604*ece92f85SJason Jin             DECODE_PRINTF(",");
605*ece92f85SJason Jin             shiftreg = DECODE_RM_LONG_REGISTER(rh);
606*ece92f85SJason Jin             DECODE_PRINTF(",");
607*ece92f85SJason Jin             shift = fetch_byte_imm();
608*ece92f85SJason Jin             DECODE_PRINTF2("%d\n", shift);
609*ece92f85SJason Jin             TRACE_AND_STEP();
610*ece92f85SJason Jin             destval = fetch_data_long(destoffset);
611*ece92f85SJason Jin             destval = shrd_long(destval,*shiftreg,shift);
612*ece92f85SJason Jin             store_data_long(destoffset, destval);
613*ece92f85SJason Jin         } else {
614*ece92f85SJason Jin             u16 destval;
615*ece92f85SJason Jin             u16 *shiftreg;
616*ece92f85SJason Jin 
617*ece92f85SJason Jin             DECODE_PRINTF(",");
618*ece92f85SJason Jin             shiftreg = DECODE_RM_WORD_REGISTER(rh);
619*ece92f85SJason Jin             DECODE_PRINTF(",");
620*ece92f85SJason Jin             shift = fetch_byte_imm();
621*ece92f85SJason Jin             DECODE_PRINTF2("%d\n", shift);
622*ece92f85SJason Jin             TRACE_AND_STEP();
623*ece92f85SJason Jin             destval = fetch_data_word(destoffset);
624*ece92f85SJason Jin             destval = shrd_word(destval,*shiftreg,shift);
625*ece92f85SJason Jin             store_data_word(destoffset, destval);
626*ece92f85SJason Jin         }
627*ece92f85SJason Jin     } else {                     /* register to register */
628*ece92f85SJason Jin         if (M.x86.mode & SYSMODE_PREFIX_DATA) {
629*ece92f85SJason Jin             u32 *destreg,*shiftreg;
630*ece92f85SJason Jin 
631*ece92f85SJason Jin             destreg = DECODE_RM_LONG_REGISTER(rl);
632*ece92f85SJason Jin             DECODE_PRINTF(",");
633*ece92f85SJason Jin             shiftreg = DECODE_RM_LONG_REGISTER(rh);
634*ece92f85SJason Jin             DECODE_PRINTF(",");
635*ece92f85SJason Jin             shift = fetch_byte_imm();
636*ece92f85SJason Jin             DECODE_PRINTF2("%d\n", shift);
637*ece92f85SJason Jin             TRACE_AND_STEP();
638*ece92f85SJason Jin             *destreg = shrd_long(*destreg,*shiftreg,shift);
639*ece92f85SJason Jin         } else {
640*ece92f85SJason Jin             u16 *destreg,*shiftreg;
641*ece92f85SJason Jin 
642*ece92f85SJason Jin             destreg = DECODE_RM_WORD_REGISTER(rl);
643*ece92f85SJason Jin             DECODE_PRINTF(",");
644*ece92f85SJason Jin             shiftreg = DECODE_RM_WORD_REGISTER(rh);
645*ece92f85SJason Jin             DECODE_PRINTF(",");
646*ece92f85SJason Jin             shift = fetch_byte_imm();
647*ece92f85SJason Jin             DECODE_PRINTF2("%d\n", shift);
648*ece92f85SJason Jin             TRACE_AND_STEP();
649*ece92f85SJason Jin             *destreg = shrd_word(*destreg,*shiftreg,shift);
650*ece92f85SJason Jin         }
651*ece92f85SJason Jin     }
652*ece92f85SJason Jin     DECODE_CLEAR_SEGOVR();
653*ece92f85SJason Jin     END_OF_INSTR();
654*ece92f85SJason Jin }
655*ece92f85SJason Jin 
656*ece92f85SJason Jin /****************************************************************************
657*ece92f85SJason Jin REMARKS:
658*ece92f85SJason Jin Handles opcode 0x0f,0xad
659*ece92f85SJason Jin ****************************************************************************/
660*ece92f85SJason Jin void x86emuOp2_shrd_CL(u8 X86EMU_UNUSED(op2))
661*ece92f85SJason Jin {
662*ece92f85SJason Jin     int mod, rl, rh;
663*ece92f85SJason Jin     uint destoffset;
664*ece92f85SJason Jin 
665*ece92f85SJason Jin     START_OF_INSTR();
666*ece92f85SJason Jin     DECODE_PRINTF("SHLD\t");
667*ece92f85SJason Jin     FETCH_DECODE_MODRM(mod, rh, rl);
668*ece92f85SJason Jin     if (mod < 3) {
669*ece92f85SJason Jin         destoffset = decode_rmXX_address(mod, rl);
670*ece92f85SJason Jin         DECODE_PRINTF(",");
671*ece92f85SJason Jin         if (M.x86.mode & SYSMODE_PREFIX_DATA) {
672*ece92f85SJason Jin             u32 destval;
673*ece92f85SJason Jin             u32 *shiftreg;
674*ece92f85SJason Jin 
675*ece92f85SJason Jin             shiftreg = DECODE_RM_LONG_REGISTER(rh);
676*ece92f85SJason Jin             DECODE_PRINTF(",CL\n");
677*ece92f85SJason Jin             TRACE_AND_STEP();
678*ece92f85SJason Jin             destval = fetch_data_long(destoffset);
679*ece92f85SJason Jin             destval = shrd_long(destval,*shiftreg,M.x86.R_CL);
680*ece92f85SJason Jin             store_data_long(destoffset, destval);
681*ece92f85SJason Jin         } else {
682*ece92f85SJason Jin             u16 destval;
683*ece92f85SJason Jin             u16 *shiftreg;
684*ece92f85SJason Jin 
685*ece92f85SJason Jin             shiftreg = DECODE_RM_WORD_REGISTER(rh);
686*ece92f85SJason Jin             DECODE_PRINTF(",CL\n");
687*ece92f85SJason Jin             TRACE_AND_STEP();
688*ece92f85SJason Jin             destval = fetch_data_word(destoffset);
689*ece92f85SJason Jin             destval = shrd_word(destval,*shiftreg,M.x86.R_CL);
690*ece92f85SJason Jin             store_data_word(destoffset, destval);
691*ece92f85SJason Jin         }
692*ece92f85SJason Jin     } else {                     /* register to register */
693*ece92f85SJason Jin         if (M.x86.mode & SYSMODE_PREFIX_DATA) {
694*ece92f85SJason Jin             u32 *destreg,*shiftreg;
695*ece92f85SJason Jin 
696*ece92f85SJason Jin             destreg = DECODE_RM_LONG_REGISTER(rl);
697*ece92f85SJason Jin             DECODE_PRINTF(",");
698*ece92f85SJason Jin             shiftreg = DECODE_RM_LONG_REGISTER(rh);
699*ece92f85SJason Jin             DECODE_PRINTF(",CL\n");
700*ece92f85SJason Jin             TRACE_AND_STEP();
701*ece92f85SJason Jin             *destreg = shrd_long(*destreg,*shiftreg,M.x86.R_CL);
702*ece92f85SJason Jin         } else {
703*ece92f85SJason Jin             u16 *destreg,*shiftreg;
704*ece92f85SJason Jin 
705*ece92f85SJason Jin             destreg = DECODE_RM_WORD_REGISTER(rl);
706*ece92f85SJason Jin             DECODE_PRINTF(",");
707*ece92f85SJason Jin             shiftreg = DECODE_RM_WORD_REGISTER(rh);
708*ece92f85SJason Jin             DECODE_PRINTF(",CL\n");
709*ece92f85SJason Jin             TRACE_AND_STEP();
710*ece92f85SJason Jin             *destreg = shrd_word(*destreg,*shiftreg,M.x86.R_CL);
711*ece92f85SJason Jin         }
712*ece92f85SJason Jin     }
713*ece92f85SJason Jin     DECODE_CLEAR_SEGOVR();
714*ece92f85SJason Jin     END_OF_INSTR();
715*ece92f85SJason Jin }
716*ece92f85SJason Jin 
717*ece92f85SJason Jin /****************************************************************************
718*ece92f85SJason Jin REMARKS:
719*ece92f85SJason Jin Handles opcode 0x0f,0xaf
720*ece92f85SJason Jin ****************************************************************************/
721*ece92f85SJason Jin void x86emuOp2_imul_R_RM(u8 X86EMU_UNUSED(op2))
722*ece92f85SJason Jin {
723*ece92f85SJason Jin     int mod, rl, rh;
724*ece92f85SJason Jin     uint srcoffset;
725*ece92f85SJason Jin 
726*ece92f85SJason Jin     START_OF_INSTR();
727*ece92f85SJason Jin     DECODE_PRINTF("IMUL\t");
728*ece92f85SJason Jin     FETCH_DECODE_MODRM(mod, rh, rl);
729*ece92f85SJason Jin     if (mod < 3) {
730*ece92f85SJason Jin         if (M.x86.mode & SYSMODE_PREFIX_DATA) {
731*ece92f85SJason Jin             u32 *destreg;
732*ece92f85SJason Jin             u32 srcval;
733*ece92f85SJason Jin             u32 res_lo,res_hi;
734*ece92f85SJason Jin 
735*ece92f85SJason Jin             destreg = DECODE_RM_LONG_REGISTER(rh);
736*ece92f85SJason Jin             DECODE_PRINTF(",");
737*ece92f85SJason Jin             srcoffset = decode_rmXX_address(mod, rl);
738*ece92f85SJason Jin             srcval = fetch_data_long(srcoffset);
739*ece92f85SJason Jin             TRACE_AND_STEP();
740*ece92f85SJason Jin             imul_long_direct(&res_lo,&res_hi,(s32)*destreg,(s32)srcval);
741*ece92f85SJason Jin             if (res_hi != 0) {
742*ece92f85SJason Jin                 SET_FLAG(F_CF);
743*ece92f85SJason Jin                 SET_FLAG(F_OF);
744*ece92f85SJason Jin             } else {
745*ece92f85SJason Jin                 CLEAR_FLAG(F_CF);
746*ece92f85SJason Jin                 CLEAR_FLAG(F_OF);
747*ece92f85SJason Jin             }
748*ece92f85SJason Jin             *destreg = (u32)res_lo;
749*ece92f85SJason Jin         } else {
750*ece92f85SJason Jin             u16 *destreg;
751*ece92f85SJason Jin             u16 srcval;
752*ece92f85SJason Jin             u32 res;
753*ece92f85SJason Jin 
754*ece92f85SJason Jin             destreg = DECODE_RM_WORD_REGISTER(rh);
755*ece92f85SJason Jin             DECODE_PRINTF(",");
756*ece92f85SJason Jin             srcoffset = decode_rmXX_address(mod, rl);
757*ece92f85SJason Jin             srcval = fetch_data_word(srcoffset);
758*ece92f85SJason Jin             TRACE_AND_STEP();
759*ece92f85SJason Jin             res = (s16)*destreg * (s16)srcval;
760*ece92f85SJason Jin             if (res > 0xFFFF) {
761*ece92f85SJason Jin                 SET_FLAG(F_CF);
762*ece92f85SJason Jin                 SET_FLAG(F_OF);
763*ece92f85SJason Jin             } else {
764*ece92f85SJason Jin                 CLEAR_FLAG(F_CF);
765*ece92f85SJason Jin                 CLEAR_FLAG(F_OF);
766*ece92f85SJason Jin             }
767*ece92f85SJason Jin             *destreg = (u16)res;
768*ece92f85SJason Jin         }
769*ece92f85SJason Jin     } else {                     /* register to register */
770*ece92f85SJason Jin         if (M.x86.mode & SYSMODE_PREFIX_DATA) {
771*ece92f85SJason Jin             u32 *destreg,*srcreg;
772*ece92f85SJason Jin             u32 res_lo,res_hi;
773*ece92f85SJason Jin 
774*ece92f85SJason Jin             destreg = DECODE_RM_LONG_REGISTER(rh);
775*ece92f85SJason Jin             DECODE_PRINTF(",");
776*ece92f85SJason Jin             srcreg = DECODE_RM_LONG_REGISTER(rl);
777*ece92f85SJason Jin             TRACE_AND_STEP();
778*ece92f85SJason Jin             imul_long_direct(&res_lo,&res_hi,(s32)*destreg,(s32)*srcreg);
779*ece92f85SJason Jin             if (res_hi != 0) {
780*ece92f85SJason Jin                 SET_FLAG(F_CF);
781*ece92f85SJason Jin                 SET_FLAG(F_OF);
782*ece92f85SJason Jin             } else {
783*ece92f85SJason Jin                 CLEAR_FLAG(F_CF);
784*ece92f85SJason Jin                 CLEAR_FLAG(F_OF);
785*ece92f85SJason Jin             }
786*ece92f85SJason Jin             *destreg = (u32)res_lo;
787*ece92f85SJason Jin         } else {
788*ece92f85SJason Jin             u16 *destreg,*srcreg;
789*ece92f85SJason Jin             u32 res;
790*ece92f85SJason Jin 
791*ece92f85SJason Jin             destreg = DECODE_RM_WORD_REGISTER(rh);
792*ece92f85SJason Jin             DECODE_PRINTF(",");
793*ece92f85SJason Jin             srcreg = DECODE_RM_WORD_REGISTER(rl);
794*ece92f85SJason Jin             res = (s16)*destreg * (s16)*srcreg;
795*ece92f85SJason Jin             if (res > 0xFFFF) {
796*ece92f85SJason Jin                 SET_FLAG(F_CF);
797*ece92f85SJason Jin                 SET_FLAG(F_OF);
798*ece92f85SJason Jin             } else {
799*ece92f85SJason Jin                 CLEAR_FLAG(F_CF);
800*ece92f85SJason Jin                 CLEAR_FLAG(F_OF);
801*ece92f85SJason Jin             }
802*ece92f85SJason Jin             *destreg = (u16)res;
803*ece92f85SJason Jin         }
804*ece92f85SJason Jin     }
805*ece92f85SJason Jin     DECODE_CLEAR_SEGOVR();
806*ece92f85SJason Jin     END_OF_INSTR();
807*ece92f85SJason Jin }
808*ece92f85SJason Jin 
809*ece92f85SJason Jin /****************************************************************************
810*ece92f85SJason Jin REMARKS:
811*ece92f85SJason Jin Handles opcode 0x0f,0xb2
812*ece92f85SJason Jin ****************************************************************************/
813*ece92f85SJason Jin void x86emuOp2_lss_R_IMM(u8 X86EMU_UNUSED(op2))
814*ece92f85SJason Jin {
815*ece92f85SJason Jin     int mod, rh, rl;
816*ece92f85SJason Jin     u16 *dstreg;
817*ece92f85SJason Jin     uint srcoffset;
818*ece92f85SJason Jin 
819*ece92f85SJason Jin     START_OF_INSTR();
820*ece92f85SJason Jin     DECODE_PRINTF("LSS\t");
821*ece92f85SJason Jin     FETCH_DECODE_MODRM(mod, rh, rl);
822*ece92f85SJason Jin     if (mod < 3) {
823*ece92f85SJason Jin         dstreg = DECODE_RM_WORD_REGISTER(rh);
824*ece92f85SJason Jin         DECODE_PRINTF(",");
825*ece92f85SJason Jin         srcoffset = decode_rmXX_address(mod, rl);
826*ece92f85SJason Jin         DECODE_PRINTF("\n");
827*ece92f85SJason Jin         TRACE_AND_STEP();
828*ece92f85SJason Jin         *dstreg = fetch_data_word(srcoffset);
829*ece92f85SJason Jin         M.x86.R_SS = fetch_data_word(srcoffset + 2);
830*ece92f85SJason Jin     } else {                     /* register to register */
831*ece92f85SJason Jin         /* UNDEFINED! */
832*ece92f85SJason Jin         TRACE_AND_STEP();
833*ece92f85SJason Jin     }
834*ece92f85SJason Jin     DECODE_CLEAR_SEGOVR();
835*ece92f85SJason Jin     END_OF_INSTR();
836*ece92f85SJason Jin }
837*ece92f85SJason Jin 
838*ece92f85SJason Jin /****************************************************************************
839*ece92f85SJason Jin REMARKS:
840*ece92f85SJason Jin Handles opcode 0x0f,0xb3
841*ece92f85SJason Jin ****************************************************************************/
842*ece92f85SJason Jin void x86emuOp2_btr_R(u8 X86EMU_UNUSED(op2))
843*ece92f85SJason Jin {
844*ece92f85SJason Jin     int mod, rl, rh;
845*ece92f85SJason Jin     uint srcoffset;
846*ece92f85SJason Jin     int bit,disp;
847*ece92f85SJason Jin 
848*ece92f85SJason Jin     START_OF_INSTR();
849*ece92f85SJason Jin     DECODE_PRINTF("BTR\t");
850*ece92f85SJason Jin     FETCH_DECODE_MODRM(mod, rh, rl);
851*ece92f85SJason Jin     if (mod < 3) {
852*ece92f85SJason Jin         srcoffset = decode_rmXX_address(mod, rl);
853*ece92f85SJason Jin         DECODE_PRINTF(",");
854*ece92f85SJason Jin         if (M.x86.mode & SYSMODE_PREFIX_DATA) {
855*ece92f85SJason Jin             u32 srcval,mask;
856*ece92f85SJason Jin             u32 *shiftreg;
857*ece92f85SJason Jin 
858*ece92f85SJason Jin             shiftreg = DECODE_RM_LONG_REGISTER(rh);
859*ece92f85SJason Jin             TRACE_AND_STEP();
860*ece92f85SJason Jin             bit = *shiftreg & 0x1F;
861*ece92f85SJason Jin             disp = (s16)*shiftreg >> 5;
862*ece92f85SJason Jin             srcval = fetch_data_long(srcoffset+disp);
863*ece92f85SJason Jin             mask = (0x1 << bit);
864*ece92f85SJason Jin             CONDITIONAL_SET_FLAG(srcval & mask,F_CF);
865*ece92f85SJason Jin             store_data_long(srcoffset+disp, srcval & ~mask);
866*ece92f85SJason Jin         } else {
867*ece92f85SJason Jin             u16 srcval,mask;
868*ece92f85SJason Jin             u16 *shiftreg;
869*ece92f85SJason Jin 
870*ece92f85SJason Jin             shiftreg = DECODE_RM_WORD_REGISTER(rh);
871*ece92f85SJason Jin             TRACE_AND_STEP();
872*ece92f85SJason Jin             bit = *shiftreg & 0xF;
873*ece92f85SJason Jin             disp = (s16)*shiftreg >> 4;
874*ece92f85SJason Jin             srcval = fetch_data_word(srcoffset+disp);
875*ece92f85SJason Jin             mask = (u16)(0x1 << bit);
876*ece92f85SJason Jin             CONDITIONAL_SET_FLAG(srcval & mask,F_CF);
877*ece92f85SJason Jin             store_data_word(srcoffset+disp, (u16)(srcval & ~mask));
878*ece92f85SJason Jin         }
879*ece92f85SJason Jin     } else {                     /* register to register */
880*ece92f85SJason Jin         if (M.x86.mode & SYSMODE_PREFIX_DATA) {
881*ece92f85SJason Jin             u32 *srcreg,*shiftreg;
882*ece92f85SJason Jin             u32 mask;
883*ece92f85SJason Jin 
884*ece92f85SJason Jin             srcreg = DECODE_RM_LONG_REGISTER(rl);
885*ece92f85SJason Jin             DECODE_PRINTF(",");
886*ece92f85SJason Jin             shiftreg = DECODE_RM_LONG_REGISTER(rh);
887*ece92f85SJason Jin             TRACE_AND_STEP();
888*ece92f85SJason Jin             bit = *shiftreg & 0x1F;
889*ece92f85SJason Jin             mask = (0x1 << bit);
890*ece92f85SJason Jin             CONDITIONAL_SET_FLAG(*srcreg & mask,F_CF);
891*ece92f85SJason Jin             *srcreg &= ~mask;
892*ece92f85SJason Jin         } else {
893*ece92f85SJason Jin             u16 *srcreg,*shiftreg;
894*ece92f85SJason Jin             u16 mask;
895*ece92f85SJason Jin 
896*ece92f85SJason Jin             srcreg = DECODE_RM_WORD_REGISTER(rl);
897*ece92f85SJason Jin             DECODE_PRINTF(",");
898*ece92f85SJason Jin             shiftreg = DECODE_RM_WORD_REGISTER(rh);
899*ece92f85SJason Jin             TRACE_AND_STEP();
900*ece92f85SJason Jin             bit = *shiftreg & 0xF;
901*ece92f85SJason Jin             mask = (u16)(0x1 << bit);
902*ece92f85SJason Jin             CONDITIONAL_SET_FLAG(*srcreg & mask,F_CF);
903*ece92f85SJason Jin             *srcreg &= ~mask;
904*ece92f85SJason Jin         }
905*ece92f85SJason Jin     }
906*ece92f85SJason Jin     DECODE_CLEAR_SEGOVR();
907*ece92f85SJason Jin     END_OF_INSTR();
908*ece92f85SJason Jin }
909*ece92f85SJason Jin 
910*ece92f85SJason Jin /****************************************************************************
911*ece92f85SJason Jin REMARKS:
912*ece92f85SJason Jin Handles opcode 0x0f,0xb4
913*ece92f85SJason Jin ****************************************************************************/
914*ece92f85SJason Jin void x86emuOp2_lfs_R_IMM(u8 X86EMU_UNUSED(op2))
915*ece92f85SJason Jin {
916*ece92f85SJason Jin     int mod, rh, rl;
917*ece92f85SJason Jin     u16 *dstreg;
918*ece92f85SJason Jin     uint srcoffset;
919*ece92f85SJason Jin 
920*ece92f85SJason Jin     START_OF_INSTR();
921*ece92f85SJason Jin     DECODE_PRINTF("LFS\t");
922*ece92f85SJason Jin     FETCH_DECODE_MODRM(mod, rh, rl);
923*ece92f85SJason Jin     if (mod < 3) {
924*ece92f85SJason Jin         dstreg = DECODE_RM_WORD_REGISTER(rh);
925*ece92f85SJason Jin         DECODE_PRINTF(",");
926*ece92f85SJason Jin         srcoffset = decode_rmXX_address(mod, rl);
927*ece92f85SJason Jin         DECODE_PRINTF("\n");
928*ece92f85SJason Jin         TRACE_AND_STEP();
929*ece92f85SJason Jin         *dstreg = fetch_data_word(srcoffset);
930*ece92f85SJason Jin         M.x86.R_FS = fetch_data_word(srcoffset + 2);
931*ece92f85SJason Jin     } else {                     /* register to register */
932*ece92f85SJason Jin         /* UNDEFINED! */
933*ece92f85SJason Jin         TRACE_AND_STEP();
934*ece92f85SJason Jin     }
935*ece92f85SJason Jin     DECODE_CLEAR_SEGOVR();
936*ece92f85SJason Jin     END_OF_INSTR();
937*ece92f85SJason Jin }
938*ece92f85SJason Jin 
939*ece92f85SJason Jin /****************************************************************************
940*ece92f85SJason Jin REMARKS:
941*ece92f85SJason Jin Handles opcode 0x0f,0xb5
942*ece92f85SJason Jin ****************************************************************************/
943*ece92f85SJason Jin void x86emuOp2_lgs_R_IMM(u8 X86EMU_UNUSED(op2))
944*ece92f85SJason Jin {
945*ece92f85SJason Jin     int mod, rh, rl;
946*ece92f85SJason Jin     u16 *dstreg;
947*ece92f85SJason Jin     uint srcoffset;
948*ece92f85SJason Jin 
949*ece92f85SJason Jin     START_OF_INSTR();
950*ece92f85SJason Jin     DECODE_PRINTF("LGS\t");
951*ece92f85SJason Jin     FETCH_DECODE_MODRM(mod, rh, rl);
952*ece92f85SJason Jin     if (mod < 3) {
953*ece92f85SJason Jin         dstreg = DECODE_RM_WORD_REGISTER(rh);
954*ece92f85SJason Jin         DECODE_PRINTF(",");
955*ece92f85SJason Jin         srcoffset = decode_rmXX_address(mod, rl);
956*ece92f85SJason Jin         DECODE_PRINTF("\n");
957*ece92f85SJason Jin         TRACE_AND_STEP();
958*ece92f85SJason Jin         *dstreg = fetch_data_word(srcoffset);
959*ece92f85SJason Jin         M.x86.R_GS = fetch_data_word(srcoffset + 2);
960*ece92f85SJason Jin     } else {                     /* register to register */
961*ece92f85SJason Jin         /* UNDEFINED! */
962*ece92f85SJason Jin         TRACE_AND_STEP();
963*ece92f85SJason Jin     }
964*ece92f85SJason Jin     DECODE_CLEAR_SEGOVR();
965*ece92f85SJason Jin     END_OF_INSTR();
966*ece92f85SJason Jin }
967*ece92f85SJason Jin 
968*ece92f85SJason Jin /****************************************************************************
969*ece92f85SJason Jin REMARKS:
970*ece92f85SJason Jin Handles opcode 0x0f,0xb6
971*ece92f85SJason Jin ****************************************************************************/
972*ece92f85SJason Jin void x86emuOp2_movzx_byte_R_RM(u8 X86EMU_UNUSED(op2))
973*ece92f85SJason Jin {
974*ece92f85SJason Jin     int mod, rl, rh;
975*ece92f85SJason Jin     uint srcoffset;
976*ece92f85SJason Jin 
977*ece92f85SJason Jin     START_OF_INSTR();
978*ece92f85SJason Jin     DECODE_PRINTF("MOVZX\t");
979*ece92f85SJason Jin     FETCH_DECODE_MODRM(mod, rh, rl);
980*ece92f85SJason Jin     if (mod < 3) {
981*ece92f85SJason Jin         if (M.x86.mode & SYSMODE_PREFIX_DATA) {
982*ece92f85SJason Jin             u32 *destreg;
983*ece92f85SJason Jin             u32 srcval;
984*ece92f85SJason Jin 
985*ece92f85SJason Jin             destreg = DECODE_RM_LONG_REGISTER(rh);
986*ece92f85SJason Jin             DECODE_PRINTF(",");
987*ece92f85SJason Jin             srcoffset = decode_rmXX_address(mod, rl);
988*ece92f85SJason Jin             srcval = fetch_data_byte(srcoffset);
989*ece92f85SJason Jin             DECODE_PRINTF("\n");
990*ece92f85SJason Jin             TRACE_AND_STEP();
991*ece92f85SJason Jin             *destreg = srcval;
992*ece92f85SJason Jin         } else {
993*ece92f85SJason Jin             u16 *destreg;
994*ece92f85SJason Jin             u16 srcval;
995*ece92f85SJason Jin 
996*ece92f85SJason Jin             destreg = DECODE_RM_WORD_REGISTER(rh);
997*ece92f85SJason Jin             DECODE_PRINTF(",");
998*ece92f85SJason Jin             srcoffset = decode_rmXX_address(mod, rl);
999*ece92f85SJason Jin             srcval = fetch_data_byte(srcoffset);
1000*ece92f85SJason Jin             DECODE_PRINTF("\n");
1001*ece92f85SJason Jin             TRACE_AND_STEP();
1002*ece92f85SJason Jin             *destreg = srcval;
1003*ece92f85SJason Jin         }
1004*ece92f85SJason Jin     } else {                     /* register to register */
1005*ece92f85SJason Jin         if (M.x86.mode & SYSMODE_PREFIX_DATA) {
1006*ece92f85SJason Jin             u32 *destreg;
1007*ece92f85SJason Jin             u8  *srcreg;
1008*ece92f85SJason Jin 
1009*ece92f85SJason Jin             destreg = DECODE_RM_LONG_REGISTER(rh);
1010*ece92f85SJason Jin             DECODE_PRINTF(",");
1011*ece92f85SJason Jin             srcreg = DECODE_RM_BYTE_REGISTER(rl);
1012*ece92f85SJason Jin             DECODE_PRINTF("\n");
1013*ece92f85SJason Jin             TRACE_AND_STEP();
1014*ece92f85SJason Jin             *destreg = *srcreg;
1015*ece92f85SJason Jin         } else {
1016*ece92f85SJason Jin             u16 *destreg;
1017*ece92f85SJason Jin             u8  *srcreg;
1018*ece92f85SJason Jin 
1019*ece92f85SJason Jin             destreg = DECODE_RM_WORD_REGISTER(rh);
1020*ece92f85SJason Jin             DECODE_PRINTF(",");
1021*ece92f85SJason Jin             srcreg = DECODE_RM_BYTE_REGISTER(rl);
1022*ece92f85SJason Jin             DECODE_PRINTF("\n");
1023*ece92f85SJason Jin             TRACE_AND_STEP();
1024*ece92f85SJason Jin             *destreg = *srcreg;
1025*ece92f85SJason Jin         }
1026*ece92f85SJason Jin     }
1027*ece92f85SJason Jin     DECODE_CLEAR_SEGOVR();
1028*ece92f85SJason Jin     END_OF_INSTR();
1029*ece92f85SJason Jin }
1030*ece92f85SJason Jin 
1031*ece92f85SJason Jin /****************************************************************************
1032*ece92f85SJason Jin REMARKS:
1033*ece92f85SJason Jin Handles opcode 0x0f,0xb7
1034*ece92f85SJason Jin ****************************************************************************/
1035*ece92f85SJason Jin void x86emuOp2_movzx_word_R_RM(u8 X86EMU_UNUSED(op2))
1036*ece92f85SJason Jin {
1037*ece92f85SJason Jin     int mod, rl, rh;
1038*ece92f85SJason Jin     uint srcoffset;
1039*ece92f85SJason Jin     u32 *destreg;
1040*ece92f85SJason Jin     u32 srcval;
1041*ece92f85SJason Jin     u16 *srcreg;
1042*ece92f85SJason Jin 
1043*ece92f85SJason Jin     START_OF_INSTR();
1044*ece92f85SJason Jin     DECODE_PRINTF("MOVZX\t");
1045*ece92f85SJason Jin     FETCH_DECODE_MODRM(mod, rh, rl);
1046*ece92f85SJason Jin     if (mod < 3) {
1047*ece92f85SJason Jin         destreg = DECODE_RM_LONG_REGISTER(rh);
1048*ece92f85SJason Jin         DECODE_PRINTF(",");
1049*ece92f85SJason Jin         srcoffset = decode_rmXX_address(mod, rl);
1050*ece92f85SJason Jin         srcval = fetch_data_word(srcoffset);
1051*ece92f85SJason Jin         DECODE_PRINTF("\n");
1052*ece92f85SJason Jin         TRACE_AND_STEP();
1053*ece92f85SJason Jin         *destreg = srcval;
1054*ece92f85SJason Jin     } else {                     /* register to register */
1055*ece92f85SJason Jin         destreg = DECODE_RM_LONG_REGISTER(rh);
1056*ece92f85SJason Jin         DECODE_PRINTF(",");
1057*ece92f85SJason Jin         srcreg = DECODE_RM_WORD_REGISTER(rl);
1058*ece92f85SJason Jin         DECODE_PRINTF("\n");
1059*ece92f85SJason Jin         TRACE_AND_STEP();
1060*ece92f85SJason Jin         *destreg = *srcreg;
1061*ece92f85SJason Jin     }
1062*ece92f85SJason Jin     DECODE_CLEAR_SEGOVR();
1063*ece92f85SJason Jin     END_OF_INSTR();
1064*ece92f85SJason Jin }
1065*ece92f85SJason Jin 
1066*ece92f85SJason Jin /****************************************************************************
1067*ece92f85SJason Jin REMARKS:
1068*ece92f85SJason Jin Handles opcode 0x0f,0xba
1069*ece92f85SJason Jin ****************************************************************************/
1070*ece92f85SJason Jin void x86emuOp2_btX_I(u8 X86EMU_UNUSED(op2))
1071*ece92f85SJason Jin {
1072*ece92f85SJason Jin     int mod, rl, rh;
1073*ece92f85SJason Jin     uint srcoffset;
1074*ece92f85SJason Jin     u8 shift;
1075*ece92f85SJason Jin     int bit;
1076*ece92f85SJason Jin 
1077*ece92f85SJason Jin     START_OF_INSTR();
1078*ece92f85SJason Jin     FETCH_DECODE_MODRM(mod, rh, rl);
1079*ece92f85SJason Jin     switch (rh) {
1080*ece92f85SJason Jin     case 4:
1081*ece92f85SJason Jin         DECODE_PRINTF("BT\t");
1082*ece92f85SJason Jin         break;
1083*ece92f85SJason Jin     case 5:
1084*ece92f85SJason Jin         DECODE_PRINTF("BTS\t");
1085*ece92f85SJason Jin         break;
1086*ece92f85SJason Jin     case 6:
1087*ece92f85SJason Jin         DECODE_PRINTF("BTR\t");
1088*ece92f85SJason Jin         break;
1089*ece92f85SJason Jin     case 7:
1090*ece92f85SJason Jin         DECODE_PRINTF("BTC\t");
1091*ece92f85SJason Jin         break;
1092*ece92f85SJason Jin     default:
1093*ece92f85SJason Jin         DECODE_PRINTF("ILLEGAL EXTENDED X86 OPCODE\n");
1094*ece92f85SJason Jin         TRACE_REGS();
1095*ece92f85SJason Jin         printk("%04x:%04x: %02X%02X ILLEGAL EXTENDED X86 OPCODE EXTENSION!\n",
1096*ece92f85SJason Jin                 M.x86.R_CS, M.x86.R_IP-3,op2, (mod<<6)|(rh<<3)|rl);
1097*ece92f85SJason Jin         HALT_SYS();
1098*ece92f85SJason Jin     }
1099*ece92f85SJason Jin     if (mod < 3) {
1100*ece92f85SJason Jin 
1101*ece92f85SJason Jin         srcoffset = decode_rmXX_address(mod, rl);
1102*ece92f85SJason Jin         shift = fetch_byte_imm();
1103*ece92f85SJason Jin         DECODE_PRINTF2(",%d\n", shift);
1104*ece92f85SJason Jin         TRACE_AND_STEP();
1105*ece92f85SJason Jin 
1106*ece92f85SJason Jin         if (M.x86.mode & SYSMODE_PREFIX_DATA) {
1107*ece92f85SJason Jin             u32 srcval, mask;
1108*ece92f85SJason Jin 
1109*ece92f85SJason Jin             bit = shift & 0x1F;
1110*ece92f85SJason Jin             srcval = fetch_data_long(srcoffset);
1111*ece92f85SJason Jin             mask = (0x1 << bit);
1112*ece92f85SJason Jin             CONDITIONAL_SET_FLAG(srcval & mask,F_CF);
1113*ece92f85SJason Jin             switch (rh) {
1114*ece92f85SJason Jin             case 5:
1115*ece92f85SJason Jin                 store_data_long(srcoffset, srcval | mask);
1116*ece92f85SJason Jin                 break;
1117*ece92f85SJason Jin             case 6:
1118*ece92f85SJason Jin                 store_data_long(srcoffset, srcval & ~mask);
1119*ece92f85SJason Jin                 break;
1120*ece92f85SJason Jin             case 7:
1121*ece92f85SJason Jin                 store_data_long(srcoffset, srcval ^ mask);
1122*ece92f85SJason Jin                 break;
1123*ece92f85SJason Jin             default:
1124*ece92f85SJason Jin                 break;
1125*ece92f85SJason Jin             }
1126*ece92f85SJason Jin         } else {
1127*ece92f85SJason Jin             u16 srcval, mask;
1128*ece92f85SJason Jin 
1129*ece92f85SJason Jin             bit = shift & 0xF;
1130*ece92f85SJason Jin             srcval = fetch_data_word(srcoffset);
1131*ece92f85SJason Jin             mask = (0x1 << bit);
1132*ece92f85SJason Jin             CONDITIONAL_SET_FLAG(srcval & mask,F_CF);
1133*ece92f85SJason Jin             switch (rh) {
1134*ece92f85SJason Jin             case 5:
1135*ece92f85SJason Jin                 store_data_word(srcoffset, srcval | mask);
1136*ece92f85SJason Jin                 break;
1137*ece92f85SJason Jin             case 6:
1138*ece92f85SJason Jin                 store_data_word(srcoffset, srcval & ~mask);
1139*ece92f85SJason Jin                 break;
1140*ece92f85SJason Jin             case 7:
1141*ece92f85SJason Jin                 store_data_word(srcoffset, srcval ^ mask);
1142*ece92f85SJason Jin                 break;
1143*ece92f85SJason Jin             default:
1144*ece92f85SJason Jin                 break;
1145*ece92f85SJason Jin             }
1146*ece92f85SJason Jin         }
1147*ece92f85SJason Jin     } else {                     /* register to register */
1148*ece92f85SJason Jin         if (M.x86.mode & SYSMODE_PREFIX_DATA) {
1149*ece92f85SJason Jin             u32 *srcreg;
1150*ece92f85SJason Jin             u32 mask;
1151*ece92f85SJason Jin 
1152*ece92f85SJason Jin             srcreg = DECODE_RM_LONG_REGISTER(rl);
1153*ece92f85SJason Jin             shift = fetch_byte_imm();
1154*ece92f85SJason Jin             DECODE_PRINTF2(",%d\n", shift);
1155*ece92f85SJason Jin             TRACE_AND_STEP();
1156*ece92f85SJason Jin             bit = shift & 0x1F;
1157*ece92f85SJason Jin             mask = (0x1 << bit);
1158*ece92f85SJason Jin             CONDITIONAL_SET_FLAG(*srcreg & mask,F_CF);
1159*ece92f85SJason Jin             switch (rh) {
1160*ece92f85SJason Jin             case 5:
1161*ece92f85SJason Jin                 *srcreg |= mask;
1162*ece92f85SJason Jin                 break;
1163*ece92f85SJason Jin             case 6:
1164*ece92f85SJason Jin                 *srcreg &= ~mask;
1165*ece92f85SJason Jin                 break;
1166*ece92f85SJason Jin             case 7:
1167*ece92f85SJason Jin                 *srcreg ^= mask;
1168*ece92f85SJason Jin                 break;
1169*ece92f85SJason Jin             default:
1170*ece92f85SJason Jin                 break;
1171*ece92f85SJason Jin             }
1172*ece92f85SJason Jin         } else {
1173*ece92f85SJason Jin             u16 *srcreg;
1174*ece92f85SJason Jin             u16 mask;
1175*ece92f85SJason Jin 
1176*ece92f85SJason Jin             srcreg = DECODE_RM_WORD_REGISTER(rl);
1177*ece92f85SJason Jin             shift = fetch_byte_imm();
1178*ece92f85SJason Jin             DECODE_PRINTF2(",%d\n", shift);
1179*ece92f85SJason Jin             TRACE_AND_STEP();
1180*ece92f85SJason Jin             bit = shift & 0xF;
1181*ece92f85SJason Jin             mask = (0x1 << bit);
1182*ece92f85SJason Jin             CONDITIONAL_SET_FLAG(*srcreg & mask,F_CF);
1183*ece92f85SJason Jin             switch (rh) {
1184*ece92f85SJason Jin             case 5:
1185*ece92f85SJason Jin                 *srcreg |= mask;
1186*ece92f85SJason Jin                 break;
1187*ece92f85SJason Jin             case 6:
1188*ece92f85SJason Jin                 *srcreg &= ~mask;
1189*ece92f85SJason Jin                 break;
1190*ece92f85SJason Jin             case 7:
1191*ece92f85SJason Jin                 *srcreg ^= mask;
1192*ece92f85SJason Jin                 break;
1193*ece92f85SJason Jin             default:
1194*ece92f85SJason Jin                 break;
1195*ece92f85SJason Jin             }
1196*ece92f85SJason Jin         }
1197*ece92f85SJason Jin     }
1198*ece92f85SJason Jin     DECODE_CLEAR_SEGOVR();
1199*ece92f85SJason Jin     END_OF_INSTR();
1200*ece92f85SJason Jin }
1201*ece92f85SJason Jin 
1202*ece92f85SJason Jin /****************************************************************************
1203*ece92f85SJason Jin REMARKS:
1204*ece92f85SJason Jin Handles opcode 0x0f,0xbb
1205*ece92f85SJason Jin ****************************************************************************/
1206*ece92f85SJason Jin void x86emuOp2_btc_R(u8 X86EMU_UNUSED(op2))
1207*ece92f85SJason Jin {
1208*ece92f85SJason Jin     int mod, rl, rh;
1209*ece92f85SJason Jin     uint srcoffset;
1210*ece92f85SJason Jin     int bit,disp;
1211*ece92f85SJason Jin 
1212*ece92f85SJason Jin     START_OF_INSTR();
1213*ece92f85SJason Jin     DECODE_PRINTF("BTC\t");
1214*ece92f85SJason Jin     FETCH_DECODE_MODRM(mod, rh, rl);
1215*ece92f85SJason Jin     if (mod < 3) {
1216*ece92f85SJason Jin         srcoffset = decode_rmXX_address(mod, rl);
1217*ece92f85SJason Jin         DECODE_PRINTF(",");
1218*ece92f85SJason Jin         if (M.x86.mode & SYSMODE_PREFIX_DATA) {
1219*ece92f85SJason Jin             u32 srcval,mask;
1220*ece92f85SJason Jin             u32 *shiftreg;
1221*ece92f85SJason Jin 
1222*ece92f85SJason Jin             shiftreg = DECODE_RM_LONG_REGISTER(rh);
1223*ece92f85SJason Jin             TRACE_AND_STEP();
1224*ece92f85SJason Jin             bit = *shiftreg & 0x1F;
1225*ece92f85SJason Jin             disp = (s16)*shiftreg >> 5;
1226*ece92f85SJason Jin             srcval = fetch_data_long(srcoffset+disp);
1227*ece92f85SJason Jin             mask = (0x1 << bit);
1228*ece92f85SJason Jin             CONDITIONAL_SET_FLAG(srcval & mask,F_CF);
1229*ece92f85SJason Jin             store_data_long(srcoffset+disp, srcval ^ mask);
1230*ece92f85SJason Jin         } else {
1231*ece92f85SJason Jin             u16 srcval,mask;
1232*ece92f85SJason Jin             u16 *shiftreg;
1233*ece92f85SJason Jin 
1234*ece92f85SJason Jin             shiftreg = DECODE_RM_WORD_REGISTER(rh);
1235*ece92f85SJason Jin             TRACE_AND_STEP();
1236*ece92f85SJason Jin             bit = *shiftreg & 0xF;
1237*ece92f85SJason Jin             disp = (s16)*shiftreg >> 4;
1238*ece92f85SJason Jin             srcval = fetch_data_word(srcoffset+disp);
1239*ece92f85SJason Jin             mask = (u16)(0x1 << bit);
1240*ece92f85SJason Jin             CONDITIONAL_SET_FLAG(srcval & mask,F_CF);
1241*ece92f85SJason Jin             store_data_word(srcoffset+disp, (u16)(srcval ^ mask));
1242*ece92f85SJason Jin         }
1243*ece92f85SJason Jin     } else {                     /* register to register */
1244*ece92f85SJason Jin         if (M.x86.mode & SYSMODE_PREFIX_DATA) {
1245*ece92f85SJason Jin             u32 *srcreg,*shiftreg;
1246*ece92f85SJason Jin             u32 mask;
1247*ece92f85SJason Jin 
1248*ece92f85SJason Jin             srcreg = DECODE_RM_LONG_REGISTER(rl);
1249*ece92f85SJason Jin             DECODE_PRINTF(",");
1250*ece92f85SJason Jin             shiftreg = DECODE_RM_LONG_REGISTER(rh);
1251*ece92f85SJason Jin             TRACE_AND_STEP();
1252*ece92f85SJason Jin             bit = *shiftreg & 0x1F;
1253*ece92f85SJason Jin             mask = (0x1 << bit);
1254*ece92f85SJason Jin             CONDITIONAL_SET_FLAG(*srcreg & mask,F_CF);
1255*ece92f85SJason Jin             *srcreg ^= mask;
1256*ece92f85SJason Jin         } else {
1257*ece92f85SJason Jin             u16 *srcreg,*shiftreg;
1258*ece92f85SJason Jin             u16 mask;
1259*ece92f85SJason Jin 
1260*ece92f85SJason Jin             srcreg = DECODE_RM_WORD_REGISTER(rl);
1261*ece92f85SJason Jin             DECODE_PRINTF(",");
1262*ece92f85SJason Jin             shiftreg = DECODE_RM_WORD_REGISTER(rh);
1263*ece92f85SJason Jin             TRACE_AND_STEP();
1264*ece92f85SJason Jin             bit = *shiftreg & 0xF;
1265*ece92f85SJason Jin             mask = (u16)(0x1 << bit);
1266*ece92f85SJason Jin             CONDITIONAL_SET_FLAG(*srcreg & mask,F_CF);
1267*ece92f85SJason Jin             *srcreg ^= mask;
1268*ece92f85SJason Jin         }
1269*ece92f85SJason Jin     }
1270*ece92f85SJason Jin     DECODE_CLEAR_SEGOVR();
1271*ece92f85SJason Jin     END_OF_INSTR();
1272*ece92f85SJason Jin }
1273*ece92f85SJason Jin 
1274*ece92f85SJason Jin /****************************************************************************
1275*ece92f85SJason Jin REMARKS:
1276*ece92f85SJason Jin Handles opcode 0x0f,0xbc
1277*ece92f85SJason Jin ****************************************************************************/
1278*ece92f85SJason Jin void x86emuOp2_bsf(u8 X86EMU_UNUSED(op2))
1279*ece92f85SJason Jin {
1280*ece92f85SJason Jin     int mod, rl, rh;
1281*ece92f85SJason Jin     uint srcoffset;
1282*ece92f85SJason Jin 
1283*ece92f85SJason Jin     START_OF_INSTR();
1284*ece92f85SJason Jin     DECODE_PRINTF("BSF\n");
1285*ece92f85SJason Jin     FETCH_DECODE_MODRM(mod, rh, rl);
1286*ece92f85SJason Jin     if (mod < 3) {
1287*ece92f85SJason Jin         srcoffset = decode_rmXX_address(mod, rl);
1288*ece92f85SJason Jin         DECODE_PRINTF(",");
1289*ece92f85SJason Jin         if (M.x86.mode & SYSMODE_PREFIX_DATA) {
1290*ece92f85SJason Jin             u32 srcval, *dstreg;
1291*ece92f85SJason Jin 
1292*ece92f85SJason Jin             dstreg = DECODE_RM_LONG_REGISTER(rh);
1293*ece92f85SJason Jin             TRACE_AND_STEP();
1294*ece92f85SJason Jin             srcval = fetch_data_long(srcoffset);
1295*ece92f85SJason Jin             CONDITIONAL_SET_FLAG(srcval == 0, F_ZF);
1296*ece92f85SJason Jin             for(*dstreg = 0; *dstreg < 32; (*dstreg)++)
1297*ece92f85SJason Jin                 if ((srcval >> *dstreg) & 1) break;
1298*ece92f85SJason Jin         } else {
1299*ece92f85SJason Jin             u16 srcval, *dstreg;
1300*ece92f85SJason Jin 
1301*ece92f85SJason Jin             dstreg = DECODE_RM_WORD_REGISTER(rh);
1302*ece92f85SJason Jin             TRACE_AND_STEP();
1303*ece92f85SJason Jin             srcval = fetch_data_word(srcoffset);
1304*ece92f85SJason Jin             CONDITIONAL_SET_FLAG(srcval == 0, F_ZF);
1305*ece92f85SJason Jin             for(*dstreg = 0; *dstreg < 16; (*dstreg)++)
1306*ece92f85SJason Jin                 if ((srcval >> *dstreg) & 1) break;
1307*ece92f85SJason Jin         }
1308*ece92f85SJason Jin     } else {             /* register to register */
1309*ece92f85SJason Jin         if (M.x86.mode & SYSMODE_PREFIX_DATA) {
1310*ece92f85SJason Jin             u32 *srcreg, *dstreg;
1311*ece92f85SJason Jin 
1312*ece92f85SJason Jin             srcreg = DECODE_RM_LONG_REGISTER(rl);
1313*ece92f85SJason Jin             DECODE_PRINTF(",");
1314*ece92f85SJason Jin             dstreg = DECODE_RM_LONG_REGISTER(rh);
1315*ece92f85SJason Jin             TRACE_AND_STEP();
1316*ece92f85SJason Jin             CONDITIONAL_SET_FLAG(*srcreg == 0, F_ZF);
1317*ece92f85SJason Jin             for(*dstreg = 0; *dstreg < 32; (*dstreg)++)
1318*ece92f85SJason Jin                 if ((*srcreg >> *dstreg) & 1) break;
1319*ece92f85SJason Jin         } else {
1320*ece92f85SJason Jin             u16 *srcreg, *dstreg;
1321*ece92f85SJason Jin 
1322*ece92f85SJason Jin             srcreg = DECODE_RM_WORD_REGISTER(rl);
1323*ece92f85SJason Jin             DECODE_PRINTF(",");
1324*ece92f85SJason Jin             dstreg = DECODE_RM_WORD_REGISTER(rh);
1325*ece92f85SJason Jin             TRACE_AND_STEP();
1326*ece92f85SJason Jin             CONDITIONAL_SET_FLAG(*srcreg == 0, F_ZF);
1327*ece92f85SJason Jin             for(*dstreg = 0; *dstreg < 16; (*dstreg)++)
1328*ece92f85SJason Jin                 if ((*srcreg >> *dstreg) & 1) break;
1329*ece92f85SJason Jin         }
1330*ece92f85SJason Jin     }
1331*ece92f85SJason Jin     DECODE_CLEAR_SEGOVR();
1332*ece92f85SJason Jin     END_OF_INSTR();
1333*ece92f85SJason Jin }
1334*ece92f85SJason Jin 
1335*ece92f85SJason Jin /****************************************************************************
1336*ece92f85SJason Jin REMARKS:
1337*ece92f85SJason Jin Handles opcode 0x0f,0xbd
1338*ece92f85SJason Jin ****************************************************************************/
1339*ece92f85SJason Jin void x86emuOp2_bsr(u8 X86EMU_UNUSED(op2))
1340*ece92f85SJason Jin {
1341*ece92f85SJason Jin     int mod, rl, rh;
1342*ece92f85SJason Jin     uint srcoffset;
1343*ece92f85SJason Jin 
1344*ece92f85SJason Jin     START_OF_INSTR();
1345*ece92f85SJason Jin     DECODE_PRINTF("BSF\n");
1346*ece92f85SJason Jin     FETCH_DECODE_MODRM(mod, rh, rl);
1347*ece92f85SJason Jin     if (mod < 3) {
1348*ece92f85SJason Jin         srcoffset = decode_rmXX_address(mod, rl);
1349*ece92f85SJason Jin         DECODE_PRINTF(",");
1350*ece92f85SJason Jin         if (M.x86.mode & SYSMODE_PREFIX_DATA) {
1351*ece92f85SJason Jin             u32 srcval, *dstreg;
1352*ece92f85SJason Jin 
1353*ece92f85SJason Jin             dstreg = DECODE_RM_LONG_REGISTER(rh);
1354*ece92f85SJason Jin             TRACE_AND_STEP();
1355*ece92f85SJason Jin             srcval = fetch_data_long(srcoffset);
1356*ece92f85SJason Jin             CONDITIONAL_SET_FLAG(srcval == 0, F_ZF);
1357*ece92f85SJason Jin             for(*dstreg = 31; *dstreg > 0; (*dstreg)--)
1358*ece92f85SJason Jin                 if ((srcval >> *dstreg) & 1) break;
1359*ece92f85SJason Jin         } else {
1360*ece92f85SJason Jin             u16 srcval, *dstreg;
1361*ece92f85SJason Jin 
1362*ece92f85SJason Jin             dstreg = DECODE_RM_WORD_REGISTER(rh);
1363*ece92f85SJason Jin             TRACE_AND_STEP();
1364*ece92f85SJason Jin             srcval = fetch_data_word(srcoffset);
1365*ece92f85SJason Jin             CONDITIONAL_SET_FLAG(srcval == 0, F_ZF);
1366*ece92f85SJason Jin             for(*dstreg = 15; *dstreg > 0; (*dstreg)--)
1367*ece92f85SJason Jin                 if ((srcval >> *dstreg) & 1) break;
1368*ece92f85SJason Jin         }
1369*ece92f85SJason Jin     } else {             /* register to register */
1370*ece92f85SJason Jin         if (M.x86.mode & SYSMODE_PREFIX_DATA) {
1371*ece92f85SJason Jin             u32 *srcreg, *dstreg;
1372*ece92f85SJason Jin 
1373*ece92f85SJason Jin             srcreg = DECODE_RM_LONG_REGISTER(rl);
1374*ece92f85SJason Jin             DECODE_PRINTF(",");
1375*ece92f85SJason Jin             dstreg = DECODE_RM_LONG_REGISTER(rh);
1376*ece92f85SJason Jin             TRACE_AND_STEP();
1377*ece92f85SJason Jin             CONDITIONAL_SET_FLAG(*srcreg == 0, F_ZF);
1378*ece92f85SJason Jin             for(*dstreg = 31; *dstreg > 0; (*dstreg)--)
1379*ece92f85SJason Jin                 if ((*srcreg >> *dstreg) & 1) break;
1380*ece92f85SJason Jin         } else {
1381*ece92f85SJason Jin             u16 *srcreg, *dstreg;
1382*ece92f85SJason Jin 
1383*ece92f85SJason Jin             srcreg = DECODE_RM_WORD_REGISTER(rl);
1384*ece92f85SJason Jin             DECODE_PRINTF(",");
1385*ece92f85SJason Jin             dstreg = DECODE_RM_WORD_REGISTER(rh);
1386*ece92f85SJason Jin             TRACE_AND_STEP();
1387*ece92f85SJason Jin             CONDITIONAL_SET_FLAG(*srcreg == 0, F_ZF);
1388*ece92f85SJason Jin             for(*dstreg = 15; *dstreg > 0; (*dstreg)--)
1389*ece92f85SJason Jin                 if ((*srcreg >> *dstreg) & 1) break;
1390*ece92f85SJason Jin         }
1391*ece92f85SJason Jin     }
1392*ece92f85SJason Jin     DECODE_CLEAR_SEGOVR();
1393*ece92f85SJason Jin     END_OF_INSTR();
1394*ece92f85SJason Jin }
1395*ece92f85SJason Jin 
1396*ece92f85SJason Jin /****************************************************************************
1397*ece92f85SJason Jin REMARKS:
1398*ece92f85SJason Jin Handles opcode 0x0f,0xbe
1399*ece92f85SJason Jin ****************************************************************************/
1400*ece92f85SJason Jin void x86emuOp2_movsx_byte_R_RM(u8 X86EMU_UNUSED(op2))
1401*ece92f85SJason Jin {
1402*ece92f85SJason Jin     int mod, rl, rh;
1403*ece92f85SJason Jin     uint srcoffset;
1404*ece92f85SJason Jin 
1405*ece92f85SJason Jin     START_OF_INSTR();
1406*ece92f85SJason Jin     DECODE_PRINTF("MOVSX\t");
1407*ece92f85SJason Jin     FETCH_DECODE_MODRM(mod, rh, rl);
1408*ece92f85SJason Jin     if (mod < 3) {
1409*ece92f85SJason Jin         if (M.x86.mode & SYSMODE_PREFIX_DATA) {
1410*ece92f85SJason Jin             u32 *destreg;
1411*ece92f85SJason Jin             u32 srcval;
1412*ece92f85SJason Jin 
1413*ece92f85SJason Jin             destreg = DECODE_RM_LONG_REGISTER(rh);
1414*ece92f85SJason Jin             DECODE_PRINTF(",");
1415*ece92f85SJason Jin             srcoffset = decode_rmXX_address(mod, rl);
1416*ece92f85SJason Jin             srcval = (s32)((s8)fetch_data_byte(srcoffset));
1417*ece92f85SJason Jin             DECODE_PRINTF("\n");
1418*ece92f85SJason Jin             TRACE_AND_STEP();
1419*ece92f85SJason Jin             *destreg = srcval;
1420*ece92f85SJason Jin         } else {
1421*ece92f85SJason Jin             u16 *destreg;
1422*ece92f85SJason Jin             u16 srcval;
1423*ece92f85SJason Jin 
1424*ece92f85SJason Jin             destreg = DECODE_RM_WORD_REGISTER(rh);
1425*ece92f85SJason Jin             DECODE_PRINTF(",");
1426*ece92f85SJason Jin             srcoffset = decode_rmXX_address(mod, rl);
1427*ece92f85SJason Jin             srcval = (s16)((s8)fetch_data_byte(srcoffset));
1428*ece92f85SJason Jin             DECODE_PRINTF("\n");
1429*ece92f85SJason Jin             TRACE_AND_STEP();
1430*ece92f85SJason Jin             *destreg = srcval;
1431*ece92f85SJason Jin         }
1432*ece92f85SJason Jin     } else {                     /* register to register */
1433*ece92f85SJason Jin         if (M.x86.mode & SYSMODE_PREFIX_DATA) {
1434*ece92f85SJason Jin             u32 *destreg;
1435*ece92f85SJason Jin             u8  *srcreg;
1436*ece92f85SJason Jin 
1437*ece92f85SJason Jin             destreg = DECODE_RM_LONG_REGISTER(rh);
1438*ece92f85SJason Jin             DECODE_PRINTF(",");
1439*ece92f85SJason Jin             srcreg = DECODE_RM_BYTE_REGISTER(rl);
1440*ece92f85SJason Jin             DECODE_PRINTF("\n");
1441*ece92f85SJason Jin             TRACE_AND_STEP();
1442*ece92f85SJason Jin             *destreg = (s32)((s8)*srcreg);
1443*ece92f85SJason Jin         } else {
1444*ece92f85SJason Jin             u16 *destreg;
1445*ece92f85SJason Jin             u8  *srcreg;
1446*ece92f85SJason Jin 
1447*ece92f85SJason Jin             destreg = DECODE_RM_WORD_REGISTER(rh);
1448*ece92f85SJason Jin             DECODE_PRINTF(",");
1449*ece92f85SJason Jin             srcreg = DECODE_RM_BYTE_REGISTER(rl);
1450*ece92f85SJason Jin             DECODE_PRINTF("\n");
1451*ece92f85SJason Jin             TRACE_AND_STEP();
1452*ece92f85SJason Jin             *destreg = (s16)((s8)*srcreg);
1453*ece92f85SJason Jin         }
1454*ece92f85SJason Jin     }
1455*ece92f85SJason Jin     DECODE_CLEAR_SEGOVR();
1456*ece92f85SJason Jin     END_OF_INSTR();
1457*ece92f85SJason Jin }
1458*ece92f85SJason Jin 
1459*ece92f85SJason Jin /****************************************************************************
1460*ece92f85SJason Jin REMARKS:
1461*ece92f85SJason Jin Handles opcode 0x0f,0xbf
1462*ece92f85SJason Jin ****************************************************************************/
1463*ece92f85SJason Jin void x86emuOp2_movsx_word_R_RM(u8 X86EMU_UNUSED(op2))
1464*ece92f85SJason Jin {
1465*ece92f85SJason Jin     int mod, rl, rh;
1466*ece92f85SJason Jin     uint srcoffset;
1467*ece92f85SJason Jin     u32 *destreg;
1468*ece92f85SJason Jin     u32 srcval;
1469*ece92f85SJason Jin     u16 *srcreg;
1470*ece92f85SJason Jin 
1471*ece92f85SJason Jin     START_OF_INSTR();
1472*ece92f85SJason Jin     DECODE_PRINTF("MOVSX\t");
1473*ece92f85SJason Jin     FETCH_DECODE_MODRM(mod, rh, rl);
1474*ece92f85SJason Jin     if (mod < 3) {
1475*ece92f85SJason Jin         destreg = DECODE_RM_LONG_REGISTER(rh);
1476*ece92f85SJason Jin         DECODE_PRINTF(",");
1477*ece92f85SJason Jin         srcoffset = decode_rmXX_address(mod, rl);
1478*ece92f85SJason Jin         srcval = (s32)((s16)fetch_data_word(srcoffset));
1479*ece92f85SJason Jin         DECODE_PRINTF("\n");
1480*ece92f85SJason Jin         TRACE_AND_STEP();
1481*ece92f85SJason Jin         *destreg = srcval;
1482*ece92f85SJason Jin     } else {                     /* register to register */
1483*ece92f85SJason Jin         destreg = DECODE_RM_LONG_REGISTER(rh);
1484*ece92f85SJason Jin         DECODE_PRINTF(",");
1485*ece92f85SJason Jin         srcreg = DECODE_RM_WORD_REGISTER(rl);
1486*ece92f85SJason Jin         DECODE_PRINTF("\n");
1487*ece92f85SJason Jin         TRACE_AND_STEP();
1488*ece92f85SJason Jin         *destreg = (s32)((s16)*srcreg);
1489*ece92f85SJason Jin     }
1490*ece92f85SJason Jin     DECODE_CLEAR_SEGOVR();
1491*ece92f85SJason Jin     END_OF_INSTR();
1492*ece92f85SJason Jin }
1493*ece92f85SJason Jin 
1494*ece92f85SJason Jin /***************************************************************************
1495*ece92f85SJason Jin  * Double byte operation code table:
1496*ece92f85SJason Jin  **************************************************************************/
1497*ece92f85SJason Jin void (*x86emu_optab2[256])(u8) __attribute__((section(".got2"))) =
1498*ece92f85SJason Jin {
1499*ece92f85SJason Jin /*  0x00 */ x86emuOp2_illegal_op,  /* Group F (ring 0 PM)      */
1500*ece92f85SJason Jin /*  0x01 */ x86emuOp2_illegal_op,  /* Group G (ring 0 PM)      */
1501*ece92f85SJason Jin /*  0x02 */ x86emuOp2_illegal_op,  /* lar (ring 0 PM)          */
1502*ece92f85SJason Jin /*  0x03 */ x86emuOp2_illegal_op,  /* lsl (ring 0 PM)          */
1503*ece92f85SJason Jin /*  0x04 */ x86emuOp2_illegal_op,
1504*ece92f85SJason Jin /*  0x05 */ x86emuOp2_illegal_op,  /* loadall (undocumented)   */
1505*ece92f85SJason Jin /*  0x06 */ x86emuOp2_illegal_op,  /* clts (ring 0 PM)         */
1506*ece92f85SJason Jin /*  0x07 */ x86emuOp2_illegal_op,  /* loadall (undocumented)   */
1507*ece92f85SJason Jin /*  0x08 */ x86emuOp2_illegal_op,  /* invd (ring 0 PM)         */
1508*ece92f85SJason Jin /*  0x09 */ x86emuOp2_illegal_op,  /* wbinvd (ring 0 PM)       */
1509*ece92f85SJason Jin /*  0x0a */ x86emuOp2_illegal_op,
1510*ece92f85SJason Jin /*  0x0b */ x86emuOp2_illegal_op,
1511*ece92f85SJason Jin /*  0x0c */ x86emuOp2_illegal_op,
1512*ece92f85SJason Jin /*  0x0d */ x86emuOp2_illegal_op,
1513*ece92f85SJason Jin /*  0x0e */ x86emuOp2_illegal_op,
1514*ece92f85SJason Jin /*  0x0f */ x86emuOp2_illegal_op,
1515*ece92f85SJason Jin 
1516*ece92f85SJason Jin /*  0x10 */ x86emuOp2_illegal_op,
1517*ece92f85SJason Jin /*  0x11 */ x86emuOp2_illegal_op,
1518*ece92f85SJason Jin /*  0x12 */ x86emuOp2_illegal_op,
1519*ece92f85SJason Jin /*  0x13 */ x86emuOp2_illegal_op,
1520*ece92f85SJason Jin /*  0x14 */ x86emuOp2_illegal_op,
1521*ece92f85SJason Jin /*  0x15 */ x86emuOp2_illegal_op,
1522*ece92f85SJason Jin /*  0x16 */ x86emuOp2_illegal_op,
1523*ece92f85SJason Jin /*  0x17 */ x86emuOp2_illegal_op,
1524*ece92f85SJason Jin /*  0x18 */ x86emuOp2_illegal_op,
1525*ece92f85SJason Jin /*  0x19 */ x86emuOp2_illegal_op,
1526*ece92f85SJason Jin /*  0x1a */ x86emuOp2_illegal_op,
1527*ece92f85SJason Jin /*  0x1b */ x86emuOp2_illegal_op,
1528*ece92f85SJason Jin /*  0x1c */ x86emuOp2_illegal_op,
1529*ece92f85SJason Jin /*  0x1d */ x86emuOp2_illegal_op,
1530*ece92f85SJason Jin /*  0x1e */ x86emuOp2_illegal_op,
1531*ece92f85SJason Jin /*  0x1f */ x86emuOp2_illegal_op,
1532*ece92f85SJason Jin 
1533*ece92f85SJason Jin /*  0x20 */ x86emuOp2_illegal_op,  /* mov reg32,creg (ring 0 PM) */
1534*ece92f85SJason Jin /*  0x21 */ x86emuOp2_illegal_op,  /* mov reg32,dreg (ring 0 PM) */
1535*ece92f85SJason Jin /*  0x22 */ x86emuOp2_illegal_op,  /* mov creg,reg32 (ring 0 PM) */
1536*ece92f85SJason Jin /*  0x23 */ x86emuOp2_illegal_op,  /* mov dreg,reg32 (ring 0 PM) */
1537*ece92f85SJason Jin /*  0x24 */ x86emuOp2_illegal_op,  /* mov reg32,treg (ring 0 PM) */
1538*ece92f85SJason Jin /*  0x25 */ x86emuOp2_illegal_op,
1539*ece92f85SJason Jin /*  0x26 */ x86emuOp2_illegal_op,  /* mov treg,reg32 (ring 0 PM) */
1540*ece92f85SJason Jin /*  0x27 */ x86emuOp2_illegal_op,
1541*ece92f85SJason Jin /*  0x28 */ x86emuOp2_illegal_op,
1542*ece92f85SJason Jin /*  0x29 */ x86emuOp2_illegal_op,
1543*ece92f85SJason Jin /*  0x2a */ x86emuOp2_illegal_op,
1544*ece92f85SJason Jin /*  0x2b */ x86emuOp2_illegal_op,
1545*ece92f85SJason Jin /*  0x2c */ x86emuOp2_illegal_op,
1546*ece92f85SJason Jin /*  0x2d */ x86emuOp2_illegal_op,
1547*ece92f85SJason Jin /*  0x2e */ x86emuOp2_illegal_op,
1548*ece92f85SJason Jin /*  0x2f */ x86emuOp2_illegal_op,
1549*ece92f85SJason Jin 
1550*ece92f85SJason Jin /*  0x30 */ x86emuOp2_illegal_op,
1551*ece92f85SJason Jin /*  0x31 */ x86emuOp2_illegal_op,
1552*ece92f85SJason Jin /*  0x32 */ x86emuOp2_illegal_op,
1553*ece92f85SJason Jin /*  0x33 */ x86emuOp2_illegal_op,
1554*ece92f85SJason Jin /*  0x34 */ x86emuOp2_illegal_op,
1555*ece92f85SJason Jin /*  0x35 */ x86emuOp2_illegal_op,
1556*ece92f85SJason Jin /*  0x36 */ x86emuOp2_illegal_op,
1557*ece92f85SJason Jin /*  0x37 */ x86emuOp2_illegal_op,
1558*ece92f85SJason Jin /*  0x38 */ x86emuOp2_illegal_op,
1559*ece92f85SJason Jin /*  0x39 */ x86emuOp2_illegal_op,
1560*ece92f85SJason Jin /*  0x3a */ x86emuOp2_illegal_op,
1561*ece92f85SJason Jin /*  0x3b */ x86emuOp2_illegal_op,
1562*ece92f85SJason Jin /*  0x3c */ x86emuOp2_illegal_op,
1563*ece92f85SJason Jin /*  0x3d */ x86emuOp2_illegal_op,
1564*ece92f85SJason Jin /*  0x3e */ x86emuOp2_illegal_op,
1565*ece92f85SJason Jin /*  0x3f */ x86emuOp2_illegal_op,
1566*ece92f85SJason Jin 
1567*ece92f85SJason Jin /*  0x40 */ x86emuOp2_illegal_op,
1568*ece92f85SJason Jin /*  0x41 */ x86emuOp2_illegal_op,
1569*ece92f85SJason Jin /*  0x42 */ x86emuOp2_illegal_op,
1570*ece92f85SJason Jin /*  0x43 */ x86emuOp2_illegal_op,
1571*ece92f85SJason Jin /*  0x44 */ x86emuOp2_illegal_op,
1572*ece92f85SJason Jin /*  0x45 */ x86emuOp2_illegal_op,
1573*ece92f85SJason Jin /*  0x46 */ x86emuOp2_illegal_op,
1574*ece92f85SJason Jin /*  0x47 */ x86emuOp2_illegal_op,
1575*ece92f85SJason Jin /*  0x48 */ x86emuOp2_illegal_op,
1576*ece92f85SJason Jin /*  0x49 */ x86emuOp2_illegal_op,
1577*ece92f85SJason Jin /*  0x4a */ x86emuOp2_illegal_op,
1578*ece92f85SJason Jin /*  0x4b */ x86emuOp2_illegal_op,
1579*ece92f85SJason Jin /*  0x4c */ x86emuOp2_illegal_op,
1580*ece92f85SJason Jin /*  0x4d */ x86emuOp2_illegal_op,
1581*ece92f85SJason Jin /*  0x4e */ x86emuOp2_illegal_op,
1582*ece92f85SJason Jin /*  0x4f */ x86emuOp2_illegal_op,
1583*ece92f85SJason Jin 
1584*ece92f85SJason Jin /*  0x50 */ x86emuOp2_illegal_op,
1585*ece92f85SJason Jin /*  0x51 */ x86emuOp2_illegal_op,
1586*ece92f85SJason Jin /*  0x52 */ x86emuOp2_illegal_op,
1587*ece92f85SJason Jin /*  0x53 */ x86emuOp2_illegal_op,
1588*ece92f85SJason Jin /*  0x54 */ x86emuOp2_illegal_op,
1589*ece92f85SJason Jin /*  0x55 */ x86emuOp2_illegal_op,
1590*ece92f85SJason Jin /*  0x56 */ x86emuOp2_illegal_op,
1591*ece92f85SJason Jin /*  0x57 */ x86emuOp2_illegal_op,
1592*ece92f85SJason Jin /*  0x58 */ x86emuOp2_illegal_op,
1593*ece92f85SJason Jin /*  0x59 */ x86emuOp2_illegal_op,
1594*ece92f85SJason Jin /*  0x5a */ x86emuOp2_illegal_op,
1595*ece92f85SJason Jin /*  0x5b */ x86emuOp2_illegal_op,
1596*ece92f85SJason Jin /*  0x5c */ x86emuOp2_illegal_op,
1597*ece92f85SJason Jin /*  0x5d */ x86emuOp2_illegal_op,
1598*ece92f85SJason Jin /*  0x5e */ x86emuOp2_illegal_op,
1599*ece92f85SJason Jin /*  0x5f */ x86emuOp2_illegal_op,
1600*ece92f85SJason Jin 
1601*ece92f85SJason Jin /*  0x60 */ x86emuOp2_illegal_op,
1602*ece92f85SJason Jin /*  0x61 */ x86emuOp2_illegal_op,
1603*ece92f85SJason Jin /*  0x62 */ x86emuOp2_illegal_op,
1604*ece92f85SJason Jin /*  0x63 */ x86emuOp2_illegal_op,
1605*ece92f85SJason Jin /*  0x64 */ x86emuOp2_illegal_op,
1606*ece92f85SJason Jin /*  0x65 */ x86emuOp2_illegal_op,
1607*ece92f85SJason Jin /*  0x66 */ x86emuOp2_illegal_op,
1608*ece92f85SJason Jin /*  0x67 */ x86emuOp2_illegal_op,
1609*ece92f85SJason Jin /*  0x68 */ x86emuOp2_illegal_op,
1610*ece92f85SJason Jin /*  0x69 */ x86emuOp2_illegal_op,
1611*ece92f85SJason Jin /*  0x6a */ x86emuOp2_illegal_op,
1612*ece92f85SJason Jin /*  0x6b */ x86emuOp2_illegal_op,
1613*ece92f85SJason Jin /*  0x6c */ x86emuOp2_illegal_op,
1614*ece92f85SJason Jin /*  0x6d */ x86emuOp2_illegal_op,
1615*ece92f85SJason Jin /*  0x6e */ x86emuOp2_illegal_op,
1616*ece92f85SJason Jin /*  0x6f */ x86emuOp2_illegal_op,
1617*ece92f85SJason Jin 
1618*ece92f85SJason Jin /*  0x70 */ x86emuOp2_illegal_op,
1619*ece92f85SJason Jin /*  0x71 */ x86emuOp2_illegal_op,
1620*ece92f85SJason Jin /*  0x72 */ x86emuOp2_illegal_op,
1621*ece92f85SJason Jin /*  0x73 */ x86emuOp2_illegal_op,
1622*ece92f85SJason Jin /*  0x74 */ x86emuOp2_illegal_op,
1623*ece92f85SJason Jin /*  0x75 */ x86emuOp2_illegal_op,
1624*ece92f85SJason Jin /*  0x76 */ x86emuOp2_illegal_op,
1625*ece92f85SJason Jin /*  0x77 */ x86emuOp2_illegal_op,
1626*ece92f85SJason Jin /*  0x78 */ x86emuOp2_illegal_op,
1627*ece92f85SJason Jin /*  0x79 */ x86emuOp2_illegal_op,
1628*ece92f85SJason Jin /*  0x7a */ x86emuOp2_illegal_op,
1629*ece92f85SJason Jin /*  0x7b */ x86emuOp2_illegal_op,
1630*ece92f85SJason Jin /*  0x7c */ x86emuOp2_illegal_op,
1631*ece92f85SJason Jin /*  0x7d */ x86emuOp2_illegal_op,
1632*ece92f85SJason Jin /*  0x7e */ x86emuOp2_illegal_op,
1633*ece92f85SJason Jin /*  0x7f */ x86emuOp2_illegal_op,
1634*ece92f85SJason Jin 
1635*ece92f85SJason Jin /*  0x80 */ x86emuOp2_long_jump,
1636*ece92f85SJason Jin /*  0x81 */ x86emuOp2_long_jump,
1637*ece92f85SJason Jin /*  0x82 */ x86emuOp2_long_jump,
1638*ece92f85SJason Jin /*  0x83 */ x86emuOp2_long_jump,
1639*ece92f85SJason Jin /*  0x84 */ x86emuOp2_long_jump,
1640*ece92f85SJason Jin /*  0x85 */ x86emuOp2_long_jump,
1641*ece92f85SJason Jin /*  0x86 */ x86emuOp2_long_jump,
1642*ece92f85SJason Jin /*  0x87 */ x86emuOp2_long_jump,
1643*ece92f85SJason Jin /*  0x88 */ x86emuOp2_long_jump,
1644*ece92f85SJason Jin /*  0x89 */ x86emuOp2_long_jump,
1645*ece92f85SJason Jin /*  0x8a */ x86emuOp2_long_jump,
1646*ece92f85SJason Jin /*  0x8b */ x86emuOp2_long_jump,
1647*ece92f85SJason Jin /*  0x8c */ x86emuOp2_long_jump,
1648*ece92f85SJason Jin /*  0x8d */ x86emuOp2_long_jump,
1649*ece92f85SJason Jin /*  0x8e */ x86emuOp2_long_jump,
1650*ece92f85SJason Jin /*  0x8f */ x86emuOp2_long_jump,
1651*ece92f85SJason Jin 
1652*ece92f85SJason Jin /*  0x90 */ x86emuOp2_set_byte,
1653*ece92f85SJason Jin /*  0x91 */ x86emuOp2_set_byte,
1654*ece92f85SJason Jin /*  0x92 */ x86emuOp2_set_byte,
1655*ece92f85SJason Jin /*  0x93 */ x86emuOp2_set_byte,
1656*ece92f85SJason Jin /*  0x94 */ x86emuOp2_set_byte,
1657*ece92f85SJason Jin /*  0x95 */ x86emuOp2_set_byte,
1658*ece92f85SJason Jin /*  0x96 */ x86emuOp2_set_byte,
1659*ece92f85SJason Jin /*  0x97 */ x86emuOp2_set_byte,
1660*ece92f85SJason Jin /*  0x98 */ x86emuOp2_set_byte,
1661*ece92f85SJason Jin /*  0x99 */ x86emuOp2_set_byte,
1662*ece92f85SJason Jin /*  0x9a */ x86emuOp2_set_byte,
1663*ece92f85SJason Jin /*  0x9b */ x86emuOp2_set_byte,
1664*ece92f85SJason Jin /*  0x9c */ x86emuOp2_set_byte,
1665*ece92f85SJason Jin /*  0x9d */ x86emuOp2_set_byte,
1666*ece92f85SJason Jin /*  0x9e */ x86emuOp2_set_byte,
1667*ece92f85SJason Jin /*  0x9f */ x86emuOp2_set_byte,
1668*ece92f85SJason Jin 
1669*ece92f85SJason Jin /*  0xa0 */ x86emuOp2_push_FS,
1670*ece92f85SJason Jin /*  0xa1 */ x86emuOp2_pop_FS,
1671*ece92f85SJason Jin /*  0xa2 */ x86emuOp2_illegal_op,
1672*ece92f85SJason Jin /*  0xa3 */ x86emuOp2_bt_R,
1673*ece92f85SJason Jin /*  0xa4 */ x86emuOp2_shld_IMM,
1674*ece92f85SJason Jin /*  0xa5 */ x86emuOp2_shld_CL,
1675*ece92f85SJason Jin /*  0xa6 */ x86emuOp2_illegal_op,
1676*ece92f85SJason Jin /*  0xa7 */ x86emuOp2_illegal_op,
1677*ece92f85SJason Jin /*  0xa8 */ x86emuOp2_push_GS,
1678*ece92f85SJason Jin /*  0xa9 */ x86emuOp2_pop_GS,
1679*ece92f85SJason Jin /*  0xaa */ x86emuOp2_illegal_op,
1680*ece92f85SJason Jin /*  0xab */ x86emuOp2_bt_R,
1681*ece92f85SJason Jin /*  0xac */ x86emuOp2_shrd_IMM,
1682*ece92f85SJason Jin /*  0xad */ x86emuOp2_shrd_CL,
1683*ece92f85SJason Jin /*  0xae */ x86emuOp2_illegal_op,
1684*ece92f85SJason Jin /*  0xaf */ x86emuOp2_imul_R_RM,
1685*ece92f85SJason Jin 
1686*ece92f85SJason Jin /*  0xb0 */ x86emuOp2_illegal_op,  /* TODO: cmpxchg */
1687*ece92f85SJason Jin /*  0xb1 */ x86emuOp2_illegal_op,  /* TODO: cmpxchg */
1688*ece92f85SJason Jin /*  0xb2 */ x86emuOp2_lss_R_IMM,
1689*ece92f85SJason Jin /*  0xb3 */ x86emuOp2_btr_R,
1690*ece92f85SJason Jin /*  0xb4 */ x86emuOp2_lfs_R_IMM,
1691*ece92f85SJason Jin /*  0xb5 */ x86emuOp2_lgs_R_IMM,
1692*ece92f85SJason Jin /*  0xb6 */ x86emuOp2_movzx_byte_R_RM,
1693*ece92f85SJason Jin /*  0xb7 */ x86emuOp2_movzx_word_R_RM,
1694*ece92f85SJason Jin /*  0xb8 */ x86emuOp2_illegal_op,
1695*ece92f85SJason Jin /*  0xb9 */ x86emuOp2_illegal_op,
1696*ece92f85SJason Jin /*  0xba */ x86emuOp2_btX_I,
1697*ece92f85SJason Jin /*  0xbb */ x86emuOp2_btc_R,
1698*ece92f85SJason Jin /*  0xbc */ x86emuOp2_bsf,
1699*ece92f85SJason Jin /*  0xbd */ x86emuOp2_bsr,
1700*ece92f85SJason Jin /*  0xbe */ x86emuOp2_movsx_byte_R_RM,
1701*ece92f85SJason Jin /*  0xbf */ x86emuOp2_movsx_word_R_RM,
1702*ece92f85SJason Jin 
1703*ece92f85SJason Jin /*  0xc0 */ x86emuOp2_illegal_op,  /* TODO: xadd */
1704*ece92f85SJason Jin /*  0xc1 */ x86emuOp2_illegal_op,  /* TODO: xadd */
1705*ece92f85SJason Jin /*  0xc2 */ x86emuOp2_illegal_op,
1706*ece92f85SJason Jin /*  0xc3 */ x86emuOp2_illegal_op,
1707*ece92f85SJason Jin /*  0xc4 */ x86emuOp2_illegal_op,
1708*ece92f85SJason Jin /*  0xc5 */ x86emuOp2_illegal_op,
1709*ece92f85SJason Jin /*  0xc6 */ x86emuOp2_illegal_op,
1710*ece92f85SJason Jin /*  0xc7 */ x86emuOp2_illegal_op,
1711*ece92f85SJason Jin /*  0xc8 */ x86emuOp2_illegal_op,  /* TODO: bswap */
1712*ece92f85SJason Jin /*  0xc9 */ x86emuOp2_illegal_op,  /* TODO: bswap */
1713*ece92f85SJason Jin /*  0xca */ x86emuOp2_illegal_op,  /* TODO: bswap */
1714*ece92f85SJason Jin /*  0xcb */ x86emuOp2_illegal_op,  /* TODO: bswap */
1715*ece92f85SJason Jin /*  0xcc */ x86emuOp2_illegal_op,  /* TODO: bswap */
1716*ece92f85SJason Jin /*  0xcd */ x86emuOp2_illegal_op,  /* TODO: bswap */
1717*ece92f85SJason Jin /*  0xce */ x86emuOp2_illegal_op,  /* TODO: bswap */
1718*ece92f85SJason Jin /*  0xcf */ x86emuOp2_illegal_op,  /* TODO: bswap */
1719*ece92f85SJason Jin 
1720*ece92f85SJason Jin /*  0xd0 */ x86emuOp2_illegal_op,
1721*ece92f85SJason Jin /*  0xd1 */ x86emuOp2_illegal_op,
1722*ece92f85SJason Jin /*  0xd2 */ x86emuOp2_illegal_op,
1723*ece92f85SJason Jin /*  0xd3 */ x86emuOp2_illegal_op,
1724*ece92f85SJason Jin /*  0xd4 */ x86emuOp2_illegal_op,
1725*ece92f85SJason Jin /*  0xd5 */ x86emuOp2_illegal_op,
1726*ece92f85SJason Jin /*  0xd6 */ x86emuOp2_illegal_op,
1727*ece92f85SJason Jin /*  0xd7 */ x86emuOp2_illegal_op,
1728*ece92f85SJason Jin /*  0xd8 */ x86emuOp2_illegal_op,
1729*ece92f85SJason Jin /*  0xd9 */ x86emuOp2_illegal_op,
1730*ece92f85SJason Jin /*  0xda */ x86emuOp2_illegal_op,
1731*ece92f85SJason Jin /*  0xdb */ x86emuOp2_illegal_op,
1732*ece92f85SJason Jin /*  0xdc */ x86emuOp2_illegal_op,
1733*ece92f85SJason Jin /*  0xdd */ x86emuOp2_illegal_op,
1734*ece92f85SJason Jin /*  0xde */ x86emuOp2_illegal_op,
1735*ece92f85SJason Jin /*  0xdf */ x86emuOp2_illegal_op,
1736*ece92f85SJason Jin 
1737*ece92f85SJason Jin /*  0xe0 */ x86emuOp2_illegal_op,
1738*ece92f85SJason Jin /*  0xe1 */ x86emuOp2_illegal_op,
1739*ece92f85SJason Jin /*  0xe2 */ x86emuOp2_illegal_op,
1740*ece92f85SJason Jin /*  0xe3 */ x86emuOp2_illegal_op,
1741*ece92f85SJason Jin /*  0xe4 */ x86emuOp2_illegal_op,
1742*ece92f85SJason Jin /*  0xe5 */ x86emuOp2_illegal_op,
1743*ece92f85SJason Jin /*  0xe6 */ x86emuOp2_illegal_op,
1744*ece92f85SJason Jin /*  0xe7 */ x86emuOp2_illegal_op,
1745*ece92f85SJason Jin /*  0xe8 */ x86emuOp2_illegal_op,
1746*ece92f85SJason Jin /*  0xe9 */ x86emuOp2_illegal_op,
1747*ece92f85SJason Jin /*  0xea */ x86emuOp2_illegal_op,
1748*ece92f85SJason Jin /*  0xeb */ x86emuOp2_illegal_op,
1749*ece92f85SJason Jin /*  0xec */ x86emuOp2_illegal_op,
1750*ece92f85SJason Jin /*  0xed */ x86emuOp2_illegal_op,
1751*ece92f85SJason Jin /*  0xee */ x86emuOp2_illegal_op,
1752*ece92f85SJason Jin /*  0xef */ x86emuOp2_illegal_op,
1753*ece92f85SJason Jin 
1754*ece92f85SJason Jin /*  0xf0 */ x86emuOp2_illegal_op,
1755*ece92f85SJason Jin /*  0xf1 */ x86emuOp2_illegal_op,
1756*ece92f85SJason Jin /*  0xf2 */ x86emuOp2_illegal_op,
1757*ece92f85SJason Jin /*  0xf3 */ x86emuOp2_illegal_op,
1758*ece92f85SJason Jin /*  0xf4 */ x86emuOp2_illegal_op,
1759*ece92f85SJason Jin /*  0xf5 */ x86emuOp2_illegal_op,
1760*ece92f85SJason Jin /*  0xf6 */ x86emuOp2_illegal_op,
1761*ece92f85SJason Jin /*  0xf7 */ x86emuOp2_illegal_op,
1762*ece92f85SJason Jin /*  0xf8 */ x86emuOp2_illegal_op,
1763*ece92f85SJason Jin /*  0xf9 */ x86emuOp2_illegal_op,
1764*ece92f85SJason Jin /*  0xfa */ x86emuOp2_illegal_op,
1765*ece92f85SJason Jin /*  0xfb */ x86emuOp2_illegal_op,
1766*ece92f85SJason Jin /*  0xfc */ x86emuOp2_illegal_op,
1767*ece92f85SJason Jin /*  0xfd */ x86emuOp2_illegal_op,
1768*ece92f85SJason Jin /*  0xfe */ x86emuOp2_illegal_op,
1769*ece92f85SJason Jin /*  0xff */ x86emuOp2_illegal_op,
1770*ece92f85SJason Jin };
1771