VirtualBox

source: vbox/trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsThree0f38.cpp.h@ 97405

Last change on this file since 97405 was 97361, checked in by vboxsync, 2 years ago

VMM/IEM: Removed a lot of now unnecessary return statements, while keeping unnecessary break statements for the look of the think. Also added missing IEM_NOT_REACHED_DEFAULT_CASE_RET uses to try make sure all cases in the switches will return and we can skip the function (typically) return statement. bugref:9898

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 83.2 KB
Line 
1/* $Id: IEMAllInstructionsThree0f38.cpp.h 97361 2022-11-01 02:02:24Z vboxsync $ */
2/** @file
3 * IEM - Instruction Decoding and Emulation.
4 *
5 * @remarks IEMAllInstructionsVexMap2.cpp.h is a VEX mirror of this file.
6 * Any update here is likely needed in that file too.
7 */
8
9/*
10 * Copyright (C) 2011-2022 Oracle and/or its affiliates.
11 *
12 * This file is part of VirtualBox base platform packages, as
13 * available from https://www.virtualbox.org.
14 *
15 * This program is free software; you can redistribute it and/or
16 * modify it under the terms of the GNU General Public License
17 * as published by the Free Software Foundation, in version 3 of the
18 * License.
19 *
20 * This program is distributed in the hope that it will be useful, but
21 * WITHOUT ANY WARRANTY; without even the implied warranty of
22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
23 * General Public License for more details.
24 *
25 * You should have received a copy of the GNU General Public License
26 * along with this program; if not, see <https://www.gnu.org/licenses>.
27 *
28 * SPDX-License-Identifier: GPL-3.0-only
29 */
30
31
32/** @name Three byte opcodes with first two bytes 0x0f 0x38
33 * @{
34 */
35
36FNIEMOP_DEF_2(iemOpCommonMmx_FullFull_To_Full_Ex, PFNIEMAIMPLMEDIAF2U64, pfnU64, bool, fSupported); /* in IEMAllInstructionsTwoByteOf.cpp.h */
37
38
39/**
40 * Common worker for SSSE3 instructions on the forms:
41 * pxxx xmm1, xmm2/mem128
42 *
43 * Proper alignment of the 128-bit operand is enforced.
44 * Exceptions type 4. SSSE3 cpuid checks.
45 *
46 * @sa iemOpCommonSse2_FullFull_To_Full
47 */
48FNIEMOP_DEF_1(iemOpCommonSsse3_FullFull_To_Full, PFNIEMAIMPLMEDIAF2U128, pfnU128)
49{
50 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
51 if (IEM_IS_MODRM_REG_MODE(bRm))
52 {
53 /*
54 * Register, register.
55 */
56 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
57 IEM_MC_BEGIN(2, 0);
58 IEM_MC_ARG(PRTUINT128U, puDst, 0);
59 IEM_MC_ARG(PCRTUINT128U, puSrc, 1);
60 IEM_MC_MAYBE_RAISE_SSSE3_RELATED_XCPT();
61 IEM_MC_PREPARE_SSE_USAGE();
62 IEM_MC_REF_XREG_U128(puDst, IEM_GET_MODRM_REG(pVCpu, bRm));
63 IEM_MC_REF_XREG_U128_CONST(puSrc, IEM_GET_MODRM_RM(pVCpu, bRm));
64 IEM_MC_CALL_SSE_AIMPL_2(pfnU128, puDst, puSrc);
65 IEM_MC_ADVANCE_RIP_AND_FINISH();
66 IEM_MC_END();
67 }
68 else
69 {
70 /*
71 * Register, memory.
72 */
73 IEM_MC_BEGIN(2, 2);
74 IEM_MC_ARG(PRTUINT128U, puDst, 0);
75 IEM_MC_LOCAL(RTUINT128U, uSrc);
76 IEM_MC_ARG_LOCAL_REF(PCRTUINT128U, puSrc, uSrc, 1);
77 IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
78
79 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
80 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
81 IEM_MC_MAYBE_RAISE_SSSE3_RELATED_XCPT();
82 IEM_MC_FETCH_MEM_U128_ALIGN_SSE(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
83
84 IEM_MC_PREPARE_SSE_USAGE();
85 IEM_MC_REF_XREG_U128(puDst, IEM_GET_MODRM_REG(pVCpu, bRm));
86 IEM_MC_CALL_SSE_AIMPL_2(pfnU128, puDst, puSrc);
87
88 IEM_MC_ADVANCE_RIP_AND_FINISH();
89 IEM_MC_END();
90 }
91}
92
93
94/**
95 * Common worker for SSE4.1 instructions on the forms:
96 * pxxx xmm1, xmm2/mem128
97 *
98 * Proper alignment of the 128-bit operand is enforced.
99 * Exceptions type 4. SSE4.1 cpuid checks.
100 *
101 * @sa iemOpCommonSse2_FullFull_To_Full, iemOpCommonSsse3_FullFull_To_Full,
102 * iemOpCommonSse42_FullFull_To_Full
103 */
104FNIEMOP_DEF_1(iemOpCommonSse41_FullFull_To_Full, PFNIEMAIMPLMEDIAF2U128, pfnU128)
105{
106 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
107 if (IEM_IS_MODRM_REG_MODE(bRm))
108 {
109 /*
110 * Register, register.
111 */
112 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
113 IEM_MC_BEGIN(2, 0);
114 IEM_MC_ARG(PRTUINT128U, puDst, 0);
115 IEM_MC_ARG(PCRTUINT128U, puSrc, 1);
116 IEM_MC_MAYBE_RAISE_SSE41_RELATED_XCPT();
117 IEM_MC_PREPARE_SSE_USAGE();
118 IEM_MC_REF_XREG_U128(puDst, IEM_GET_MODRM_REG(pVCpu, bRm));
119 IEM_MC_REF_XREG_U128_CONST(puSrc, IEM_GET_MODRM_RM(pVCpu, bRm));
120 IEM_MC_CALL_SSE_AIMPL_2(pfnU128, puDst, puSrc);
121 IEM_MC_ADVANCE_RIP_AND_FINISH();
122 IEM_MC_END();
123 }
124 else
125 {
126 /*
127 * Register, memory.
128 */
129 IEM_MC_BEGIN(2, 2);
130 IEM_MC_ARG(PRTUINT128U, puDst, 0);
131 IEM_MC_LOCAL(RTUINT128U, uSrc);
132 IEM_MC_ARG_LOCAL_REF(PCRTUINT128U, puSrc, uSrc, 1);
133 IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
134
135 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
136 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
137 IEM_MC_MAYBE_RAISE_SSE41_RELATED_XCPT();
138 IEM_MC_FETCH_MEM_U128_ALIGN_SSE(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
139
140 IEM_MC_PREPARE_SSE_USAGE();
141 IEM_MC_REF_XREG_U128(puDst, IEM_GET_MODRM_REG(pVCpu, bRm));
142 IEM_MC_CALL_SSE_AIMPL_2(pfnU128, puDst, puSrc);
143
144 IEM_MC_ADVANCE_RIP_AND_FINISH();
145 IEM_MC_END();
146 }
147}
148
149
150/**
151 * Common worker for SSE4.1 instructions on the forms:
152 * pxxx xmm1, xmm2/mem128
153 *
154 * Proper alignment of the 128-bit operand is enforced.
155 * Exceptions type 4. SSE4.1 cpuid checks.
156 *
157 * Unlike iemOpCommonSse41_FullFull_To_Full, the @a pfnU128 worker function
158 * takes no FXSAVE state, just the operands.
159 *
160 * @sa iemOpCommonSse2_FullFull_To_Full, iemOpCommonSsse3_FullFull_To_Full,
161 * iemOpCommonSse41_FullFull_To_Full, iemOpCommonSse42_FullFull_To_Full
162 */
163FNIEMOP_DEF_1(iemOpCommonSse41Opt_FullFull_To_Full, PFNIEMAIMPLMEDIAOPTF2U128, pfnU128)
164{
165 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
166 if (IEM_IS_MODRM_REG_MODE(bRm))
167 {
168 /*
169 * Register, register.
170 */
171 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
172 IEM_MC_BEGIN(2, 0);
173 IEM_MC_ARG(PRTUINT128U, puDst, 0);
174 IEM_MC_ARG(PCRTUINT128U, puSrc, 1);
175 IEM_MC_MAYBE_RAISE_SSE41_RELATED_XCPT();
176 IEM_MC_PREPARE_SSE_USAGE();
177 IEM_MC_REF_XREG_U128(puDst, IEM_GET_MODRM_REG(pVCpu, bRm));
178 IEM_MC_REF_XREG_U128_CONST(puSrc, IEM_GET_MODRM_RM(pVCpu, bRm));
179 IEM_MC_CALL_VOID_AIMPL_2(pfnU128, puDst, puSrc);
180 IEM_MC_ADVANCE_RIP_AND_FINISH();
181 IEM_MC_END();
182 }
183 else
184 {
185 /*
186 * Register, memory.
187 */
188 IEM_MC_BEGIN(2, 2);
189 IEM_MC_ARG(PRTUINT128U, puDst, 0);
190 IEM_MC_LOCAL(RTUINT128U, uSrc);
191 IEM_MC_ARG_LOCAL_REF(PCRTUINT128U, puSrc, uSrc, 1);
192 IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
193
194 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
195 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
196 IEM_MC_MAYBE_RAISE_SSE41_RELATED_XCPT();
197 IEM_MC_FETCH_MEM_U128_ALIGN_SSE(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
198
199 IEM_MC_PREPARE_SSE_USAGE();
200 IEM_MC_REF_XREG_U128(puDst, IEM_GET_MODRM_REG(pVCpu, bRm));
201 IEM_MC_CALL_VOID_AIMPL_2(pfnU128, puDst, puSrc);
202
203 IEM_MC_ADVANCE_RIP_AND_FINISH();
204 IEM_MC_END();
205 }
206}
207
208
209/**
210 * Common worker for SSE4.2 instructions on the forms:
211 * pxxx xmm1, xmm2/mem128
212 *
213 * Proper alignment of the 128-bit operand is enforced.
214 * Exceptions type 4. SSE4.2 cpuid checks.
215 *
216 * @sa iemOpCommonSse2_FullFull_To_Full, iemOpCommonSsse3_FullFull_To_Full,
217 * iemOpCommonSse41_FullFull_To_Full
218 */
219FNIEMOP_DEF_1(iemOpCommonSse42_FullFull_To_Full, PFNIEMAIMPLMEDIAF2U128, pfnU128)
220{
221 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
222 if (IEM_IS_MODRM_REG_MODE(bRm))
223 {
224 /*
225 * Register, register.
226 */
227 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
228 IEM_MC_BEGIN(2, 0);
229 IEM_MC_ARG(PRTUINT128U, puDst, 0);
230 IEM_MC_ARG(PCRTUINT128U, puSrc, 1);
231 IEM_MC_MAYBE_RAISE_SSE42_RELATED_XCPT();
232 IEM_MC_PREPARE_SSE_USAGE();
233 IEM_MC_REF_XREG_U128(puDst, IEM_GET_MODRM_REG(pVCpu, bRm));
234 IEM_MC_REF_XREG_U128_CONST(puSrc, IEM_GET_MODRM_RM(pVCpu, bRm));
235 IEM_MC_CALL_SSE_AIMPL_2(pfnU128, puDst, puSrc);
236 IEM_MC_ADVANCE_RIP_AND_FINISH();
237 IEM_MC_END();
238 }
239 else
240 {
241 /*
242 * Register, memory.
243 */
244 IEM_MC_BEGIN(2, 2);
245 IEM_MC_ARG(PRTUINT128U, puDst, 0);
246 IEM_MC_LOCAL(RTUINT128U, uSrc);
247 IEM_MC_ARG_LOCAL_REF(PCRTUINT128U, puSrc, uSrc, 1);
248 IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
249
250 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
251 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
252 IEM_MC_MAYBE_RAISE_SSE42_RELATED_XCPT();
253 IEM_MC_FETCH_MEM_U128_ALIGN_SSE(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
254
255 IEM_MC_PREPARE_SSE_USAGE();
256 IEM_MC_REF_XREG_U128(puDst, IEM_GET_MODRM_REG(pVCpu, bRm));
257 IEM_MC_CALL_SSE_AIMPL_2(pfnU128, puDst, puSrc);
258
259 IEM_MC_ADVANCE_RIP_AND_FINISH();
260 IEM_MC_END();
261 }
262}
263
264
265/**
266 * Common worker for SSE-style AES-NI instructions of the form:
267 * aesxxx xmm1, xmm2/mem128
268 *
269 * Proper alignment of the 128-bit operand is enforced.
270 * Exceptions type 4. AES-NI cpuid checks.
271 *
272 * Unlike iemOpCommonSse41_FullFull_To_Full, the @a pfnU128 worker function
273 * takes no FXSAVE state, just the operands.
274 *
275 * @sa iemOpCommonSse2_FullFull_To_Full, iemOpCommonSsse3_FullFull_To_Full,
276 * iemOpCommonSse41_FullFull_To_Full, iemOpCommonSse42_FullFull_To_Full
277 */
278FNIEMOP_DEF_1(iemOpCommonAesNi_FullFull_To_Full, PFNIEMAIMPLMEDIAOPTF2U128, pfnU128)
279{
280 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
281 if (IEM_IS_MODRM_REG_MODE(bRm))
282 {
283 /*
284 * Register, register.
285 */
286 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
287 IEM_MC_BEGIN(2, 0);
288 IEM_MC_ARG(PRTUINT128U, puDst, 0);
289 IEM_MC_ARG(PCRTUINT128U, puSrc, 1);
290 IEM_MC_MAYBE_RAISE_AESNI_RELATED_XCPT();
291 IEM_MC_PREPARE_SSE_USAGE();
292 IEM_MC_REF_XREG_U128(puDst, IEM_GET_MODRM_REG(pVCpu, bRm));
293 IEM_MC_REF_XREG_U128_CONST(puSrc, IEM_GET_MODRM_RM(pVCpu, bRm));
294 IEM_MC_CALL_VOID_AIMPL_2(pfnU128, puDst, puSrc);
295 IEM_MC_ADVANCE_RIP_AND_FINISH();
296 IEM_MC_END();
297 }
298 else
299 {
300 /*
301 * Register, memory.
302 */
303 IEM_MC_BEGIN(2, 2);
304 IEM_MC_ARG(PRTUINT128U, puDst, 0);
305 IEM_MC_LOCAL(RTUINT128U, uSrc);
306 IEM_MC_ARG_LOCAL_REF(PCRTUINT128U, puSrc, uSrc, 1);
307 IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
308
309 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
310 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
311 IEM_MC_MAYBE_RAISE_AESNI_RELATED_XCPT();
312 IEM_MC_FETCH_MEM_U128_ALIGN_SSE(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
313
314 IEM_MC_PREPARE_SSE_USAGE();
315 IEM_MC_REF_XREG_U128(puDst, IEM_GET_MODRM_REG(pVCpu, bRm));
316 IEM_MC_CALL_VOID_AIMPL_2(pfnU128, puDst, puSrc);
317
318 IEM_MC_ADVANCE_RIP_AND_FINISH();
319 IEM_MC_END();
320 }
321}
322
323
324/** Opcode 0x0f 0x38 0x00. */
325FNIEMOP_DEF(iemOp_pshufb_Pq_Qq)
326{
327 IEMOP_MNEMONIC2(RM, PSHUFB, pshufb, Pq, Qq, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES);
328 return FNIEMOP_CALL_2(iemOpCommonMmx_FullFull_To_Full_Ex,
329 IEM_SELECT_HOST_OR_FALLBACK(fSsse3, iemAImpl_pshufb_u64,&iemAImpl_pshufb_u64_fallback),
330 IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fSsse3);
331}
332
333
334/** Opcode 0x66 0x0f 0x38 0x00. */
335FNIEMOP_DEF(iemOp_pshufb_Vx_Wx)
336{
337 IEMOP_MNEMONIC2(RM, PSHUFB, pshufb, Vx, Wx, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES);
338 return FNIEMOP_CALL_1(iemOpCommonSsse3_FullFull_To_Full,
339 IEM_SELECT_HOST_OR_FALLBACK(fSsse3, iemAImpl_pshufb_u128, iemAImpl_pshufb_u128_fallback));
340
341}
342
343
344/* Opcode 0x0f 0x38 0x01. */
345FNIEMOP_DEF(iemOp_phaddw_Pq_Qq)
346{
347 IEMOP_MNEMONIC2(RM, PHADDW, phaddw, Pq, Qq, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES);
348 return FNIEMOP_CALL_2(iemOpCommonMmx_FullFull_To_Full_Ex,
349 IEM_SELECT_HOST_OR_FALLBACK(fSsse3, iemAImpl_phaddw_u64,&iemAImpl_phaddw_u64_fallback),
350 IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fSsse3);
351}
352
353
354/** Opcode 0x66 0x0f 0x38 0x01. */
355FNIEMOP_DEF(iemOp_phaddw_Vx_Wx)
356{
357 IEMOP_MNEMONIC2(RM, PHADDW, phaddw, Vx, Wx, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES);
358 return FNIEMOP_CALL_1(iemOpCommonSsse3_FullFull_To_Full,
359 IEM_SELECT_HOST_OR_FALLBACK(fSsse3, iemAImpl_phaddw_u128, iemAImpl_phaddw_u128_fallback));
360
361}
362
363
364/** Opcode 0x0f 0x38 0x02. */
365FNIEMOP_DEF(iemOp_phaddd_Pq_Qq)
366{
367 IEMOP_MNEMONIC2(RM, PHADDD, phaddd, Pq, Qq, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES);
368 return FNIEMOP_CALL_2(iemOpCommonMmx_FullFull_To_Full_Ex,
369 IEM_SELECT_HOST_OR_FALLBACK(fSsse3, iemAImpl_phaddd_u64,&iemAImpl_phaddd_u64_fallback),
370 IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fSsse3);
371}
372
373
374/** Opcode 0x66 0x0f 0x38 0x02. */
375FNIEMOP_DEF(iemOp_phaddd_Vx_Wx)
376{
377 IEMOP_MNEMONIC2(RM, PHADDD, phaddd, Vx, Wx, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES);
378 return FNIEMOP_CALL_1(iemOpCommonSsse3_FullFull_To_Full,
379 IEM_SELECT_HOST_OR_FALLBACK(fSsse3, iemAImpl_phaddd_u128, iemAImpl_phaddd_u128_fallback));
380
381}
382
383
384/** Opcode 0x0f 0x38 0x03. */
385FNIEMOP_DEF(iemOp_phaddsw_Pq_Qq)
386{
387 IEMOP_MNEMONIC2(RM, PHADDSW, phaddsw, Pq, Qq, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES);
388 return FNIEMOP_CALL_2(iemOpCommonMmx_FullFull_To_Full_Ex,
389 IEM_SELECT_HOST_OR_FALLBACK(fSsse3, iemAImpl_phaddsw_u64,&iemAImpl_phaddsw_u64_fallback),
390 IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fSsse3);
391}
392
393
394/** Opcode 0x66 0x0f 0x38 0x03. */
395FNIEMOP_DEF(iemOp_phaddsw_Vx_Wx)
396{
397 IEMOP_MNEMONIC2(RM, PHADDSW, phaddsw, Vx, Wx, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES);
398 return FNIEMOP_CALL_1(iemOpCommonSsse3_FullFull_To_Full,
399 IEM_SELECT_HOST_OR_FALLBACK(fSsse3, iemAImpl_phaddsw_u128, iemAImpl_phaddsw_u128_fallback));
400
401}
402
403
404/** Opcode 0x0f 0x38 0x04. */
405FNIEMOP_DEF(iemOp_pmaddubsw_Pq_Qq)
406{
407 IEMOP_MNEMONIC2(RM, PMADDUBSW, pmaddubsw, Pq, Qq, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES);
408 return FNIEMOP_CALL_2(iemOpCommonMmx_FullFull_To_Full_Ex,
409 IEM_SELECT_HOST_OR_FALLBACK(fSsse3, iemAImpl_pmaddubsw_u64, &iemAImpl_pmaddubsw_u64_fallback),
410 IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fSsse3);
411}
412
413
414/** Opcode 0x66 0x0f 0x38 0x04. */
415FNIEMOP_DEF(iemOp_pmaddubsw_Vx_Wx)
416{
417 IEMOP_MNEMONIC2(RM, PMADDUBSW, pmaddubsw, Vx, Wx, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES);
418 return FNIEMOP_CALL_1(iemOpCommonSsse3_FullFull_To_Full,
419 IEM_SELECT_HOST_OR_FALLBACK(fSsse3, iemAImpl_pmaddubsw_u128, iemAImpl_pmaddubsw_u128_fallback));
420
421}
422
423
424/** Opcode 0x0f 0x38 0x05. */
425FNIEMOP_DEF(iemOp_phsubw_Pq_Qq)
426{
427 IEMOP_MNEMONIC2(RM, PHSUBW, phsubw, Pq, Qq, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES);
428 return FNIEMOP_CALL_2(iemOpCommonMmx_FullFull_To_Full_Ex,
429 IEM_SELECT_HOST_OR_FALLBACK(fSsse3, iemAImpl_phsubw_u64,&iemAImpl_phsubw_u64_fallback),
430 IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fSsse3);
431}
432
433
434/** Opcode 0x66 0x0f 0x38 0x05. */
435FNIEMOP_DEF(iemOp_phsubw_Vx_Wx)
436{
437 IEMOP_MNEMONIC2(RM, PHSUBW, phsubw, Vx, Wx, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES);
438 return FNIEMOP_CALL_1(iemOpCommonSsse3_FullFull_To_Full,
439 IEM_SELECT_HOST_OR_FALLBACK(fSsse3, iemAImpl_phsubw_u128, iemAImpl_phsubw_u128_fallback));
440
441}
442
443
444/** Opcode 0x0f 0x38 0x06. */
445FNIEMOP_DEF(iemOp_phsubd_Pq_Qq)
446{
447 IEMOP_MNEMONIC2(RM, PHSUBD, phsubd, Pq, Qq, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES);
448 return FNIEMOP_CALL_2(iemOpCommonMmx_FullFull_To_Full_Ex,
449 IEM_SELECT_HOST_OR_FALLBACK(fSsse3, iemAImpl_phsubd_u64,&iemAImpl_phsubd_u64_fallback),
450 IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fSsse3);
451}
452
453
454
455/** Opcode 0x66 0x0f 0x38 0x06. */
456FNIEMOP_DEF(iemOp_phsubd_Vx_Wx)
457{
458 IEMOP_MNEMONIC2(RM, PHSUBD, phsubd, Vx, Wx, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES);
459 return FNIEMOP_CALL_1(iemOpCommonSsse3_FullFull_To_Full,
460 IEM_SELECT_HOST_OR_FALLBACK(fSsse3, iemAImpl_phsubd_u128, iemAImpl_phsubd_u128_fallback));
461
462}
463
464
465/** Opcode 0x0f 0x38 0x07. */
466FNIEMOP_DEF(iemOp_phsubsw_Pq_Qq)
467{
468 IEMOP_MNEMONIC2(RM, PHSUBSW, phsubsw, Pq, Qq, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES);
469 return FNIEMOP_CALL_2(iemOpCommonMmx_FullFull_To_Full_Ex,
470 IEM_SELECT_HOST_OR_FALLBACK(fSsse3, iemAImpl_phsubsw_u64,&iemAImpl_phsubsw_u64_fallback),
471 IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fSsse3);
472}
473
474
475/** Opcode 0x66 0x0f 0x38 0x07. */
476FNIEMOP_DEF(iemOp_phsubsw_Vx_Wx)
477{
478 IEMOP_MNEMONIC2(RM, PHSUBSW, phsubsw, Vx, Wx, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES);
479 return FNIEMOP_CALL_1(iemOpCommonSsse3_FullFull_To_Full,
480 IEM_SELECT_HOST_OR_FALLBACK(fSsse3, iemAImpl_phsubsw_u128, iemAImpl_phsubsw_u128_fallback));
481
482}
483
484
485/** Opcode 0x0f 0x38 0x08. */
486FNIEMOP_DEF(iemOp_psignb_Pq_Qq)
487{
488 IEMOP_MNEMONIC2(RM, PSIGNB, psignb, Pq, Qq, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES);
489 return FNIEMOP_CALL_2(iemOpCommonMmx_FullFull_To_Full_Ex,
490 IEM_SELECT_HOST_OR_FALLBACK(fSsse3, iemAImpl_psignb_u64, &iemAImpl_psignb_u64_fallback),
491 IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fSsse3);
492}
493
494
495/** Opcode 0x66 0x0f 0x38 0x08. */
496FNIEMOP_DEF(iemOp_psignb_Vx_Wx)
497{
498 IEMOP_MNEMONIC2(RM, PSIGNB, psignb, Vx, Wx, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES);
499 return FNIEMOP_CALL_1(iemOpCommonSsse3_FullFull_To_Full,
500 IEM_SELECT_HOST_OR_FALLBACK(fSsse3, iemAImpl_psignb_u128, iemAImpl_psignb_u128_fallback));
501
502}
503
504
505/** Opcode 0x0f 0x38 0x09. */
506FNIEMOP_DEF(iemOp_psignw_Pq_Qq)
507{
508 IEMOP_MNEMONIC2(RM, PSIGNW, psignw, Pq, Qq, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES);
509 return FNIEMOP_CALL_2(iemOpCommonMmx_FullFull_To_Full_Ex,
510 IEM_SELECT_HOST_OR_FALLBACK(fSsse3, iemAImpl_psignw_u64, &iemAImpl_psignw_u64_fallback),
511 IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fSsse3);
512}
513
514
515/** Opcode 0x66 0x0f 0x38 0x09. */
516FNIEMOP_DEF(iemOp_psignw_Vx_Wx)
517{
518 IEMOP_MNEMONIC2(RM, PSIGNW, psignw, Vx, Wx, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES);
519 return FNIEMOP_CALL_1(iemOpCommonSsse3_FullFull_To_Full,
520 IEM_SELECT_HOST_OR_FALLBACK(fSsse3, iemAImpl_psignw_u128, iemAImpl_psignw_u128_fallback));
521
522}
523
524
525/** Opcode 0x0f 0x38 0x0a. */
526FNIEMOP_DEF(iemOp_psignd_Pq_Qq)
527{
528 IEMOP_MNEMONIC2(RM, PSIGND, psignd, Pq, Qq, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES);
529 return FNIEMOP_CALL_2(iemOpCommonMmx_FullFull_To_Full_Ex,
530 IEM_SELECT_HOST_OR_FALLBACK(fSsse3, iemAImpl_psignd_u64, &iemAImpl_psignd_u64_fallback),
531 IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fSsse3);
532}
533
534
535/** Opcode 0x66 0x0f 0x38 0x0a. */
536FNIEMOP_DEF(iemOp_psignd_Vx_Wx)
537{
538 IEMOP_MNEMONIC2(RM, PSIGND, psignd, Vx, Wx, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES);
539 return FNIEMOP_CALL_1(iemOpCommonSsse3_FullFull_To_Full,
540 IEM_SELECT_HOST_OR_FALLBACK(fSsse3, iemAImpl_psignd_u128, iemAImpl_psignd_u128_fallback));
541
542}
543
544
545/** Opcode 0x0f 0x38 0x0b. */
546FNIEMOP_DEF(iemOp_pmulhrsw_Pq_Qq)
547{
548 IEMOP_MNEMONIC2(RM, PMULHRSW, pmulhrsw, Pq, Qq, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES);
549 return FNIEMOP_CALL_2(iemOpCommonMmx_FullFull_To_Full_Ex,
550 IEM_SELECT_HOST_OR_FALLBACK(fSsse3, iemAImpl_pmulhrsw_u64, &iemAImpl_pmulhrsw_u64_fallback),
551 IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fSsse3);
552}
553
554
555/** Opcode 0x66 0x0f 0x38 0x0b. */
556FNIEMOP_DEF(iemOp_pmulhrsw_Vx_Wx)
557{
558 IEMOP_MNEMONIC2(RM, PMULHRSW, pmulhrsw, Vx, Wx, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES);
559 return FNIEMOP_CALL_1(iemOpCommonSsse3_FullFull_To_Full,
560 IEM_SELECT_HOST_OR_FALLBACK(fSsse3, iemAImpl_pmulhrsw_u128, iemAImpl_pmulhrsw_u128_fallback));
561
562}
563
564
565/* Opcode 0x0f 0x38 0x0c - invalid. */
566/* Opcode 0x66 0x0f 0x38 0x0c - invalid (vex only). */
567/* Opcode 0x0f 0x38 0x0d - invalid. */
568/* Opcode 0x66 0x0f 0x38 0x0d - invalid (vex only). */
569/* Opcode 0x0f 0x38 0x0e - invalid. */
570/* Opcode 0x66 0x0f 0x38 0x0e - invalid (vex only). */
571/* Opcode 0x0f 0x38 0x0f - invalid. */
572/* Opcode 0x66 0x0f 0x38 0x0f - invalid (vex only). */
573
574
575/* Opcode 0x0f 0x38 0x10 - invalid */
576
577
578/** Body for the *blend* instructions. */
579#define IEMOP_BODY_P_BLEND_X(a_Instr) \
580 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); \
581 if (IEM_IS_MODRM_REG_MODE(bRm)) \
582 { \
583 /* \
584 * Register, register. \
585 */ \
586 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
587 IEM_MC_BEGIN(3, 0); \
588 IEM_MC_ARG(PRTUINT128U, puDst, 0); \
589 IEM_MC_ARG(PCRTUINT128U, puSrc, 1); \
590 IEM_MC_ARG(PCRTUINT128U, puMask, 2); \
591 IEM_MC_MAYBE_RAISE_SSE41_RELATED_XCPT(); \
592 IEM_MC_PREPARE_SSE_USAGE(); \
593 IEM_MC_REF_XREG_U128(puDst, IEM_GET_MODRM_REG(pVCpu, bRm)); \
594 IEM_MC_REF_XREG_U128_CONST(puSrc, IEM_GET_MODRM_RM(pVCpu, bRm)); \
595 IEM_MC_REF_XREG_U128_CONST(puMask, 0); \
596 IEM_MC_CALL_VOID_AIMPL_3(IEM_SELECT_HOST_OR_FALLBACK(fSse41, \
597 iemAImpl_ ## a_Instr ## _u128, \
598 iemAImpl_ ## a_Instr ## _u128_fallback), \
599 puDst, puSrc, puMask); \
600 IEM_MC_ADVANCE_RIP_AND_FINISH(); \
601 IEM_MC_END(); \
602 } \
603 else \
604 { \
605 /* \
606 * Register, memory. \
607 */ \
608 IEM_MC_BEGIN(3, 2); \
609 IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc); \
610 IEM_MC_LOCAL(RTUINT128U, uSrc); \
611 IEM_MC_ARG(PRTUINT128U, puDst, 0); \
612 IEM_MC_ARG_LOCAL_REF(PCRTUINT128U, puSrc, uSrc, 1); \
613 IEM_MC_ARG(PCRTUINT128U, puMask, 2); \
614 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0); \
615 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
616 IEM_MC_MAYBE_RAISE_SSE41_RELATED_XCPT(); \
617 IEM_MC_PREPARE_SSE_USAGE(); \
618 IEM_MC_FETCH_MEM_U128_ALIGN_SSE(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); \
619 IEM_MC_REF_XREG_U128(puDst, IEM_GET_MODRM_REG(pVCpu, bRm)); \
620 IEM_MC_REF_XREG_U128_CONST(puMask, 0); \
621 IEM_MC_CALL_VOID_AIMPL_3(IEM_SELECT_HOST_OR_FALLBACK(fSse41, \
622 iemAImpl_ ## a_Instr ## _u128, \
623 iemAImpl_ ## a_Instr ## _u128_fallback), \
624 puDst, puSrc, puMask); \
625 IEM_MC_ADVANCE_RIP_AND_FINISH(); \
626 IEM_MC_END(); \
627 } \
628 (void)0
629
630/** Opcode 0x66 0x0f 0x38 0x10 (legacy only). */
631FNIEMOP_DEF(iemOp_pblendvb_Vdq_Wdq)
632{
633 IEMOP_MNEMONIC2(RM, PBLENDVB, pblendvb, Vdq, Wdq, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, IEMOPHINT_IGNORES_OP_SIZES); /** @todo RM0 */
634 IEMOP_BODY_P_BLEND_X(pblendvb);
635}
636
637
638/* Opcode 0x0f 0x38 0x11 - invalid */
639/* Opcode 0x66 0x0f 0x38 0x11 - invalid */
640/* Opcode 0x0f 0x38 0x12 - invalid */
641/* Opcode 0x66 0x0f 0x38 0x12 - invalid */
642/* Opcode 0x0f 0x38 0x13 - invalid */
643/* Opcode 0x66 0x0f 0x38 0x13 - invalid (vex only). */
644/* Opcode 0x0f 0x38 0x14 - invalid */
645
646
647/** Opcode 0x66 0x0f 0x38 0x14 (legacy only). */
648FNIEMOP_DEF(iemOp_blendvps_Vdq_Wdq)
649{
650 IEMOP_MNEMONIC2(RM, BLENDVPS, blendvps, Vdq, Wdq, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, IEMOPHINT_IGNORES_OP_SIZES); /** @todo RM0 */
651 IEMOP_BODY_P_BLEND_X(blendvps);
652}
653
654
655/* Opcode 0x0f 0x38 0x15 - invalid */
656
657
658/** Opcode 0x66 0x0f 0x38 0x15 (legacy only). */
659FNIEMOP_DEF(iemOp_blendvpd_Vdq_Wdq)
660{
661 IEMOP_MNEMONIC2(RM, BLENDVPD, blendvpd, Vdq, Wdq, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, IEMOPHINT_IGNORES_OP_SIZES); /** @todo RM0 */
662 IEMOP_BODY_P_BLEND_X(blendvpd);
663}
664
665
666/* Opcode 0x0f 0x38 0x16 - invalid */
667/* Opcode 0x66 0x0f 0x38 0x16 - invalid (vex only). */
668/* Opcode 0x0f 0x38 0x17 - invalid */
669
670
671/** Opcode 0x66 0x0f 0x38 0x17 - invalid */
672FNIEMOP_DEF(iemOp_ptest_Vx_Wx)
673{
674 IEMOP_MNEMONIC2(RM, PTEST, ptest, Vx, Wx, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, IEMOPHINT_IGNORES_OP_SIZES);
675 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
676 if (IEM_IS_MODRM_REG_MODE(bRm))
677 {
678 /*
679 * Register, register.
680 */
681 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
682 IEM_MC_BEGIN(3, 0);
683 IEM_MC_ARG(PCRTUINT128U, puSrc1, 0);
684 IEM_MC_ARG(PCRTUINT128U, puSrc2, 1);
685 IEM_MC_ARG(uint32_t *, pEFlags, 2);
686 IEM_MC_MAYBE_RAISE_SSE41_RELATED_XCPT();
687 IEM_MC_PREPARE_SSE_USAGE();
688 IEM_MC_REF_XREG_U128_CONST(puSrc1, IEM_GET_MODRM_REG(pVCpu, bRm));
689 IEM_MC_REF_XREG_U128_CONST(puSrc2, IEM_GET_MODRM_RM(pVCpu, bRm));
690 IEM_MC_REF_EFLAGS(pEFlags);
691 IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_ptest_u128, puSrc1, puSrc2, pEFlags);
692 IEM_MC_ADVANCE_RIP_AND_FINISH();
693 IEM_MC_END();
694 }
695 else
696 {
697 /*
698 * Register, memory.
699 */
700 IEM_MC_BEGIN(3, 2);
701 IEM_MC_ARG(PCRTUINT128U, puSrc1, 0);
702 IEM_MC_LOCAL(RTUINT128U, uSrc2);
703 IEM_MC_ARG_LOCAL_REF(PCRTUINT128U, puSrc2, uSrc2, 1);
704 IEM_MC_ARG(uint32_t *, pEFlags, 2);
705 IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
706
707 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
708 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
709 IEM_MC_MAYBE_RAISE_SSE41_RELATED_XCPT();
710 IEM_MC_FETCH_MEM_U128_ALIGN_SSE(uSrc2, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
711
712 IEM_MC_PREPARE_SSE_USAGE();
713 IEM_MC_REF_XREG_U128_CONST(puSrc1, IEM_GET_MODRM_REG(pVCpu, bRm));
714 IEM_MC_REF_EFLAGS(pEFlags);
715 IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_ptest_u128, puSrc1, puSrc2, pEFlags);
716
717 IEM_MC_ADVANCE_RIP_AND_FINISH();
718 IEM_MC_END();
719 }
720}
721
722
723/* Opcode 0x0f 0x38 0x18 - invalid */
724/* Opcode 0x66 0x0f 0x38 0x18 - invalid (vex only). */
725/* Opcode 0x0f 0x38 0x19 - invalid */
726/* Opcode 0x66 0x0f 0x38 0x19 - invalid (vex only). */
727/* Opcode 0x0f 0x38 0x1a - invalid */
728/* Opcode 0x66 0x0f 0x38 0x1a - invalid (vex only). */
729/* Opcode 0x0f 0x38 0x1b - invalid */
730/* Opcode 0x66 0x0f 0x38 0x1b - invalid */
731
732
733/** Opcode 0x0f 0x38 0x1c. */
734FNIEMOP_DEF(iemOp_pabsb_Pq_Qq)
735{
736 IEMOP_MNEMONIC2(RM, PABSB, pabsb, Pq, Qq, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES);
737 return FNIEMOP_CALL_2(iemOpCommonMmx_FullFull_To_Full_Ex,
738 IEM_SELECT_HOST_OR_FALLBACK(fSsse3, iemAImpl_pabsb_u64, &iemAImpl_pabsb_u64_fallback),
739 IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fSsse3);
740}
741
742
743/** Opcode 0x66 0x0f 0x38 0x1c. */
744FNIEMOP_DEF(iemOp_pabsb_Vx_Wx)
745{
746 IEMOP_MNEMONIC2(RM, PABSB, pabsb, Vx, Wx, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES);
747 return FNIEMOP_CALL_1(iemOpCommonSsse3_FullFull_To_Full,
748 IEM_SELECT_HOST_OR_FALLBACK(fSsse3, iemAImpl_pabsb_u128, iemAImpl_pabsb_u128_fallback));
749
750}
751
752
753/** Opcode 0x0f 0x38 0x1d. */
754FNIEMOP_DEF(iemOp_pabsw_Pq_Qq)
755{
756 IEMOP_MNEMONIC2(RM, PABSW, pabsw, Pq, Qq, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES);
757 return FNIEMOP_CALL_2(iemOpCommonMmx_FullFull_To_Full_Ex,
758 IEM_SELECT_HOST_OR_FALLBACK(fSsse3, iemAImpl_pabsw_u64, &iemAImpl_pabsw_u64_fallback),
759 IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fSsse3);
760}
761
762
763/** Opcode 0x66 0x0f 0x38 0x1d. */
764FNIEMOP_DEF(iemOp_pabsw_Vx_Wx)
765{
766 IEMOP_MNEMONIC2(RM, PABSW, pabsw, Vx, Wx, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES);
767 return FNIEMOP_CALL_1(iemOpCommonSsse3_FullFull_To_Full,
768 IEM_SELECT_HOST_OR_FALLBACK(fSsse3, iemAImpl_pabsw_u128, iemAImpl_pabsw_u128_fallback));
769
770}
771
772
773/** Opcode 0x0f 0x38 0x1e. */
774FNIEMOP_DEF(iemOp_pabsd_Pq_Qq)
775{
776 IEMOP_MNEMONIC2(RM, PABSD, pabsd, Pq, Qq, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES);
777 return FNIEMOP_CALL_2(iemOpCommonMmx_FullFull_To_Full_Ex,
778 IEM_SELECT_HOST_OR_FALLBACK(fSsse3, iemAImpl_pabsd_u64, &iemAImpl_pabsd_u64_fallback),
779 IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fSsse3);
780}
781
782
783/** Opcode 0x66 0x0f 0x38 0x1e. */
784FNIEMOP_DEF(iemOp_pabsd_Vx_Wx)
785{
786 IEMOP_MNEMONIC2(RM, PABSD, pabsd, Vx, Wx, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES);
787 return FNIEMOP_CALL_1(iemOpCommonSsse3_FullFull_To_Full,
788 IEM_SELECT_HOST_OR_FALLBACK(fSsse3, iemAImpl_pabsd_u128, iemAImpl_pabsd_u128_fallback));
789
790}
791
792
793/* Opcode 0x0f 0x38 0x1f - invalid */
794/* Opcode 0x66 0x0f 0x38 0x1f - invalid */
795
796
797/** Body for the pmov{s,z}x* instructions. */
798#define IEMOP_BODY_PMOV_S_Z(a_Instr, a_SrcWidth) \
799 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); \
800 if (IEM_IS_MODRM_REG_MODE(bRm)) \
801 { \
802 /* \
803 * Register, register. \
804 */ \
805 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
806 IEM_MC_BEGIN(2, 0); \
807 IEM_MC_ARG(PRTUINT128U, puDst, 0); \
808 IEM_MC_ARG(uint64_t, uSrc, 1); \
809 IEM_MC_MAYBE_RAISE_SSE41_RELATED_XCPT(); \
810 IEM_MC_PREPARE_SSE_USAGE(); \
811 IEM_MC_FETCH_XREG_U64(uSrc, IEM_GET_MODRM_RM(pVCpu, bRm)); \
812 IEM_MC_REF_XREG_U128(puDst, IEM_GET_MODRM_REG(pVCpu, bRm)); \
813 IEM_MC_CALL_VOID_AIMPL_2(IEM_SELECT_HOST_OR_FALLBACK(fSse41, \
814 iemAImpl_ ## a_Instr ## _u128, \
815 iemAImpl_v ## a_Instr ## _u128_fallback), \
816 puDst, uSrc); \
817 IEM_MC_ADVANCE_RIP_AND_FINISH(); \
818 IEM_MC_END(); \
819 } \
820 else \
821 { \
822 /* \
823 * Register, memory. \
824 */ \
825 IEM_MC_BEGIN(2, 2); \
826 IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc); \
827 IEM_MC_ARG(PRTUINT128U, puDst, 0); \
828 IEM_MC_ARG(uint ## a_SrcWidth ## _t, uSrc, 1); \
829 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0); \
830 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
831 IEM_MC_MAYBE_RAISE_SSE41_RELATED_XCPT(); \
832 IEM_MC_PREPARE_SSE_USAGE(); \
833 IEM_MC_FETCH_MEM_U## a_SrcWidth (uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); \
834 IEM_MC_REF_XREG_U128(puDst, IEM_GET_MODRM_REG(pVCpu, bRm)); \
835 IEM_MC_CALL_VOID_AIMPL_2(IEM_SELECT_HOST_OR_FALLBACK(fSse41, \
836 iemAImpl_ ## a_Instr ## _u128, \
837 iemAImpl_v ## a_Instr ## _u128_fallback), \
838 puDst, uSrc); \
839 IEM_MC_ADVANCE_RIP_AND_FINISH(); \
840 IEM_MC_END(); \
841 } \
842 (void)0
843
844
845/** Opcode 0x66 0x0f 0x38 0x20. */
846FNIEMOP_DEF(iemOp_pmovsxbw_Vx_UxMq)
847{
848 /** @todo r=aeichner Review code, the naming of this function and the parameter type specifiers. */
849 IEMOP_MNEMONIC2(RM, PMOVSXBW, pmovsxbw, Vx, Wq, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, IEMOPHINT_IGNORES_OP_SIZES);
850 IEMOP_BODY_PMOV_S_Z(pmovsxbw, 64);
851}
852
853
854/** Opcode 0x66 0x0f 0x38 0x21. */
855FNIEMOP_DEF(iemOp_pmovsxbd_Vx_UxMd)
856{
857 /** @todo r=aeichner Review code, the naming of this function and the parameter type specifiers. */
858 IEMOP_MNEMONIC2(RM, PMOVSXBD, pmovsxbd, Vx, Wq, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, IEMOPHINT_IGNORES_OP_SIZES);
859 IEMOP_BODY_PMOV_S_Z(pmovsxbd, 32);
860}
861
862
863/** Opcode 0x66 0x0f 0x38 0x22. */
864FNIEMOP_DEF(iemOp_pmovsxbq_Vx_UxMw)
865{
866 /** @todo r=aeichner Review code, the naming of this function and the parameter type specifiers. */
867 IEMOP_MNEMONIC2(RM, PMOVSXBQ, pmovsxbq, Vx, Wq, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, IEMOPHINT_IGNORES_OP_SIZES);
868 IEMOP_BODY_PMOV_S_Z(pmovsxbq, 16);
869}
870
871
872/** Opcode 0x66 0x0f 0x38 0x23. */
873FNIEMOP_DEF(iemOp_pmovsxwd_Vx_UxMq)
874{
875 /** @todo r=aeichner Review code, the naming of this function and the parameter type specifiers. */
876 IEMOP_MNEMONIC2(RM, PMOVSXWD, pmovsxwd, Vx, Wq, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, IEMOPHINT_IGNORES_OP_SIZES);
877 IEMOP_BODY_PMOV_S_Z(pmovsxwd, 64);
878}
879
880
881/** Opcode 0x66 0x0f 0x38 0x24. */
882FNIEMOP_DEF(iemOp_pmovsxwq_Vx_UxMd)
883{
884 /** @todo r=aeichner Review code, the naming of this function and the parameter type specifiers. */
885 IEMOP_MNEMONIC2(RM, PMOVSXWQ, pmovsxwq, Vx, Wq, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, IEMOPHINT_IGNORES_OP_SIZES);
886 IEMOP_BODY_PMOV_S_Z(pmovsxwq, 32);
887}
888
889
890/** Opcode 0x66 0x0f 0x38 0x25. */
891FNIEMOP_DEF(iemOp_pmovsxdq_Vx_UxMq)
892{
893 /** @todo r=aeichner Review code, the naming of this function and the parameter type specifiers. */
894 IEMOP_MNEMONIC2(RM, PMOVSXDQ, pmovsxdq, Vx, Wq, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, IEMOPHINT_IGNORES_OP_SIZES);
895 IEMOP_BODY_PMOV_S_Z(pmovsxdq, 64);
896}
897
898
899/* Opcode 0x66 0x0f 0x38 0x26 - invalid */
900/* Opcode 0x66 0x0f 0x38 0x27 - invalid */
901
902
903/** Opcode 0x66 0x0f 0x38 0x28. */
904FNIEMOP_DEF(iemOp_pmuldq_Vx_Wx)
905{
906 IEMOP_MNEMONIC2(RM, PMULDQ, pmuldq, Vx, Wx, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES);
907 return FNIEMOP_CALL_1(iemOpCommonSse41Opt_FullFull_To_Full,
908 IEM_SELECT_HOST_OR_FALLBACK(fSse41, iemAImpl_pmuldq_u128, iemAImpl_pmuldq_u128_fallback));
909}
910
911
912/** Opcode 0x66 0x0f 0x38 0x29. */
913FNIEMOP_DEF(iemOp_pcmpeqq_Vx_Wx)
914{
915 IEMOP_MNEMONIC2(RM, PCMPEQQ, pcmpeqq, Vx, Wx, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES);
916 return FNIEMOP_CALL_1(iemOpCommonSse41_FullFull_To_Full,
917 IEM_SELECT_HOST_OR_FALLBACK(fSse41, iemAImpl_pcmpeqq_u128, iemAImpl_pcmpeqq_u128_fallback));
918}
919
920
921/**
922 * @opcode 0x2a
923 * @opcodesub !11 mr/reg
924 * @oppfx 0x66
925 * @opcpuid sse4.1
926 * @opgroup og_sse41_cachect
927 * @opxcpttype 1
928 * @optest op1=-1 op2=2 -> op1=2
929 * @optest op1=0 op2=-42 -> op1=-42
930 */
931FNIEMOP_DEF(iemOp_movntdqa_Vdq_Mdq)
932{
933 IEMOP_MNEMONIC2(RM_MEM, MOVNTDQA, movntdqa, Vdq_WO, Mdq, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, IEMOPHINT_IGNORES_OP_SIZES);
934 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
935 if (IEM_IS_MODRM_MEM_MODE(bRm))
936 {
937 /* Register, memory. */
938 IEM_MC_BEGIN(0, 2);
939 IEM_MC_LOCAL(RTUINT128U, uSrc);
940 IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
941
942 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
943 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
944 IEM_MC_MAYBE_RAISE_SSE41_RELATED_XCPT();
945 IEM_MC_ACTUALIZE_SSE_STATE_FOR_CHANGE();
946
947 IEM_MC_FETCH_MEM_U128_ALIGN_SSE(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
948 IEM_MC_STORE_XREG_U128(IEM_GET_MODRM_REG(pVCpu, bRm), uSrc);
949
950 IEM_MC_ADVANCE_RIP_AND_FINISH();
951 IEM_MC_END();
952 }
953
954 /**
955 * @opdone
956 * @opmnemonic ud660f382areg
957 * @opcode 0x2a
958 * @opcodesub 11 mr/reg
959 * @oppfx 0x66
960 * @opunused immediate
961 * @opcpuid sse
962 * @optest ->
963 */
964 else
965 return IEMOP_RAISE_INVALID_OPCODE();
966}
967
968
969/** Opcode 0x66 0x0f 0x38 0x2b. */
970FNIEMOP_DEF(iemOp_packusdw_Vx_Wx)
971{
972 IEMOP_MNEMONIC2(RM, PACKUSDW, packusdw, Vx, Wx, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, 0);
973 return FNIEMOP_CALL_1(iemOpCommonSse41Opt_FullFull_To_Full, iemAImpl_packusdw_u128);
974}
975
976
977/* Opcode 0x66 0x0f 0x38 0x2c - invalid (vex only). */
978/* Opcode 0x66 0x0f 0x38 0x2d - invalid (vex only). */
979/* Opcode 0x66 0x0f 0x38 0x2e - invalid (vex only). */
980/* Opcode 0x66 0x0f 0x38 0x2f - invalid (vex only). */
981
982/** Opcode 0x66 0x0f 0x38 0x30. */
983FNIEMOP_DEF(iemOp_pmovzxbw_Vx_UxMq)
984{
985 /** @todo r=aeichner Review code, the naming of this function and the parameter type specifiers. */
986 IEMOP_MNEMONIC2(RM, PMOVZXBW, pmovzxbw, Vx, Wq, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, IEMOPHINT_IGNORES_OP_SIZES);
987 IEMOP_BODY_PMOV_S_Z(pmovzxbw, 64);
988}
989
990
991/** Opcode 0x66 0x0f 0x38 0x31. */
992FNIEMOP_DEF(iemOp_pmovzxbd_Vx_UxMd)
993{
994 /** @todo r=aeichner Review code, the naming of this function and the parameter type specifiers. */
995 IEMOP_MNEMONIC2(RM, PMOVZXBD, pmovzxbd, Vx, Wq, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, IEMOPHINT_IGNORES_OP_SIZES);
996 IEMOP_BODY_PMOV_S_Z(pmovzxbd, 32);
997}
998
999
1000/** Opcode 0x66 0x0f 0x38 0x32. */
1001FNIEMOP_DEF(iemOp_pmovzxbq_Vx_UxMw)
1002{
1003 /** @todo r=aeichner Review code, the naming of this function and the parameter type specifiers. */
1004 IEMOP_MNEMONIC2(RM, PMOVZXBQ, pmovzxbq, Vx, Wq, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, IEMOPHINT_IGNORES_OP_SIZES);
1005 IEMOP_BODY_PMOV_S_Z(pmovzxbq, 16);
1006}
1007
1008
1009/** Opcode 0x66 0x0f 0x38 0x33. */
1010FNIEMOP_DEF(iemOp_pmovzxwd_Vx_UxMq)
1011{
1012 /** @todo r=aeichner Review code, the naming of this function and the parameter type specifiers. */
1013 IEMOP_MNEMONIC2(RM, PMOVZXWD, pmovzxwd, Vx, Wq, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, IEMOPHINT_IGNORES_OP_SIZES);
1014 IEMOP_BODY_PMOV_S_Z(pmovzxwd, 64);
1015}
1016
1017
1018/** Opcode 0x66 0x0f 0x38 0x34. */
1019FNIEMOP_DEF(iemOp_pmovzxwq_Vx_UxMd)
1020{
1021 /** @todo r=aeichner Review code, the naming of this function and the parameter type specifiers. */
1022 IEMOP_MNEMONIC2(RM, PMOVZXWQ, pmovzxwq, Vx, Wq, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, IEMOPHINT_IGNORES_OP_SIZES);
1023 IEMOP_BODY_PMOV_S_Z(pmovzxwq, 32);
1024}
1025
1026
1027/** Opcode 0x66 0x0f 0x38 0x35. */
1028FNIEMOP_DEF(iemOp_pmovzxdq_Vx_UxMq)
1029{
1030 /** @todo r=aeichner Review code, the naming of this function and the parameter type specifiers. */
1031 IEMOP_MNEMONIC2(RM, PMOVZXDQ, pmovzxdq, Vx, Wq, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, IEMOPHINT_IGNORES_OP_SIZES);
1032 IEMOP_BODY_PMOV_S_Z(pmovzxdq, 64);
1033}
1034
1035
1036/* Opcode 0x66 0x0f 0x38 0x36 - invalid (vex only). */
1037
1038
1039/** Opcode 0x66 0x0f 0x38 0x37. */
1040FNIEMOP_DEF(iemOp_pcmpgtq_Vx_Wx)
1041{
1042 IEMOP_MNEMONIC2(RM, PCMPGTQ, pcmpgtq, Vx, Wx, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES);
1043 return FNIEMOP_CALL_1(iemOpCommonSse42_FullFull_To_Full,
1044 IEM_SELECT_HOST_OR_FALLBACK(fSse42, iemAImpl_pcmpgtq_u128, iemAImpl_pcmpgtq_u128_fallback));
1045}
1046
1047
1048/** Opcode 0x66 0x0f 0x38 0x38. */
1049FNIEMOP_DEF(iemOp_pminsb_Vx_Wx)
1050{
1051 IEMOP_MNEMONIC2(RM, PMINSB, pminsb, Vx, Wx, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, IEMOPHINT_IGNORES_OP_SIZES);
1052 return FNIEMOP_CALL_1(iemOpCommonSse41_FullFull_To_Full,
1053 IEM_SELECT_HOST_OR_FALLBACK(fSse41, iemAImpl_pminsb_u128, iemAImpl_pminsb_u128_fallback));
1054}
1055
1056
1057/** Opcode 0x66 0x0f 0x38 0x39. */
1058FNIEMOP_DEF(iemOp_pminsd_Vx_Wx)
1059{
1060 IEMOP_MNEMONIC2(RM, PMINSD, pminsd, Vx, Wx, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, IEMOPHINT_IGNORES_OP_SIZES);
1061 return FNIEMOP_CALL_1(iemOpCommonSse41_FullFull_To_Full,
1062 IEM_SELECT_HOST_OR_FALLBACK(fSse41, iemAImpl_pminsd_u128, iemAImpl_pminsd_u128_fallback));
1063}
1064
1065
1066/** Opcode 0x66 0x0f 0x38 0x3a. */
1067FNIEMOP_DEF(iemOp_pminuw_Vx_Wx)
1068{
1069 IEMOP_MNEMONIC2(RM, PMINUW, pminuw, Vx, Wx, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, IEMOPHINT_IGNORES_OP_SIZES);
1070 return FNIEMOP_CALL_1(iemOpCommonSse41_FullFull_To_Full,
1071 IEM_SELECT_HOST_OR_FALLBACK(fSse41, iemAImpl_pminuw_u128, iemAImpl_pminuw_u128_fallback));
1072}
1073
1074
1075/** Opcode 0x66 0x0f 0x38 0x3b. */
1076FNIEMOP_DEF(iemOp_pminud_Vx_Wx)
1077{
1078 IEMOP_MNEMONIC2(RM, PMINUD, pminud, Vx, Wx, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, IEMOPHINT_IGNORES_OP_SIZES);
1079 return FNIEMOP_CALL_1(iemOpCommonSse41_FullFull_To_Full,
1080 IEM_SELECT_HOST_OR_FALLBACK(fSse41, iemAImpl_pminud_u128, iemAImpl_pminud_u128_fallback));
1081}
1082
1083
1084/** Opcode 0x66 0x0f 0x38 0x3c. */
1085FNIEMOP_DEF(iemOp_pmaxsb_Vx_Wx)
1086{
1087 IEMOP_MNEMONIC2(RM, PMAXSB, pmaxsb, Vx, Wx, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, IEMOPHINT_IGNORES_OP_SIZES);
1088 return FNIEMOP_CALL_1(iemOpCommonSse41_FullFull_To_Full,
1089 IEM_SELECT_HOST_OR_FALLBACK(fSse41, iemAImpl_pmaxsb_u128, iemAImpl_pmaxsb_u128_fallback));
1090}
1091
1092
1093/** Opcode 0x66 0x0f 0x38 0x3d. */
1094FNIEMOP_DEF(iemOp_pmaxsd_Vx_Wx)
1095{
1096 IEMOP_MNEMONIC2(RM, PMAXSD, pmaxsd, Vx, Wx, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, IEMOPHINT_IGNORES_OP_SIZES);
1097 return FNIEMOP_CALL_1(iemOpCommonSse41_FullFull_To_Full,
1098 IEM_SELECT_HOST_OR_FALLBACK(fSse41, iemAImpl_pmaxsd_u128, iemAImpl_pmaxsd_u128_fallback));
1099}
1100
1101
1102/** Opcode 0x66 0x0f 0x38 0x3e. */
1103FNIEMOP_DEF(iemOp_pmaxuw_Vx_Wx)
1104{
1105 IEMOP_MNEMONIC2(RM, PMAXUW, pmaxuw, Vx, Wx, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, IEMOPHINT_IGNORES_OP_SIZES);
1106 return FNIEMOP_CALL_1(iemOpCommonSse41_FullFull_To_Full,
1107 IEM_SELECT_HOST_OR_FALLBACK(fSse41, iemAImpl_pmaxuw_u128, iemAImpl_pmaxuw_u128_fallback));
1108}
1109
1110
1111/** Opcode 0x66 0x0f 0x38 0x3f. */
1112FNIEMOP_DEF(iemOp_pmaxud_Vx_Wx)
1113{
1114 IEMOP_MNEMONIC2(RM, PMAXUD, pmaxud, Vx, Wx, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, IEMOPHINT_IGNORES_OP_SIZES);
1115 return FNIEMOP_CALL_1(iemOpCommonSse41_FullFull_To_Full,
1116 IEM_SELECT_HOST_OR_FALLBACK(fSse41, iemAImpl_pmaxud_u128, iemAImpl_pmaxud_u128_fallback));
1117}
1118
1119
1120/** Opcode 0x66 0x0f 0x38 0x40. */
1121FNIEMOP_DEF(iemOp_pmulld_Vx_Wx)
1122{
1123 IEMOP_MNEMONIC2(RM, PMULLD, pmulld, Vx, Wx, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, IEMOPHINT_IGNORES_OP_SIZES);
1124 return FNIEMOP_CALL_1(iemOpCommonSse41_FullFull_To_Full,
1125 IEM_SELECT_HOST_OR_FALLBACK(fSse41, iemAImpl_pmulld_u128, iemAImpl_pmulld_u128_fallback));
1126}
1127
1128
1129/** Opcode 0x66 0x0f 0x38 0x41. */
1130FNIEMOP_DEF(iemOp_phminposuw_Vdq_Wdq)
1131{
1132 IEMOP_MNEMONIC2(RM, PHMINPOSUW, phminposuw, Vdq, Wdq, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, IEMOPHINT_IGNORES_OP_SIZES);
1133 return FNIEMOP_CALL_1(iemOpCommonSse41Opt_FullFull_To_Full,
1134 IEM_SELECT_HOST_OR_FALLBACK(fSse41, iemAImpl_phminposuw_u128, iemAImpl_phminposuw_u128_fallback));
1135}
1136
1137
1138/* Opcode 0x66 0x0f 0x38 0x42 - invalid. */
1139/* Opcode 0x66 0x0f 0x38 0x43 - invalid. */
1140/* Opcode 0x66 0x0f 0x38 0x44 - invalid. */
1141/* Opcode 0x66 0x0f 0x38 0x45 - invalid (vex only). */
1142/* Opcode 0x66 0x0f 0x38 0x46 - invalid (vex only). */
1143/* Opcode 0x66 0x0f 0x38 0x47 - invalid (vex only). */
1144/* Opcode 0x66 0x0f 0x38 0x48 - invalid. */
1145/* Opcode 0x66 0x0f 0x38 0x49 - invalid. */
1146/* Opcode 0x66 0x0f 0x38 0x4a - invalid. */
1147/* Opcode 0x66 0x0f 0x38 0x4b - invalid. */
1148/* Opcode 0x66 0x0f 0x38 0x4c - invalid. */
1149/* Opcode 0x66 0x0f 0x38 0x4d - invalid. */
1150/* Opcode 0x66 0x0f 0x38 0x4e - invalid. */
1151/* Opcode 0x66 0x0f 0x38 0x4f - invalid. */
1152
1153/* Opcode 0x66 0x0f 0x38 0x50 - invalid. */
1154/* Opcode 0x66 0x0f 0x38 0x51 - invalid. */
1155/* Opcode 0x66 0x0f 0x38 0x52 - invalid. */
1156/* Opcode 0x66 0x0f 0x38 0x53 - invalid. */
1157/* Opcode 0x66 0x0f 0x38 0x54 - invalid. */
1158/* Opcode 0x66 0x0f 0x38 0x55 - invalid. */
1159/* Opcode 0x66 0x0f 0x38 0x56 - invalid. */
1160/* Opcode 0x66 0x0f 0x38 0x57 - invalid. */
1161/* Opcode 0x66 0x0f 0x38 0x58 - invalid (vex only). */
1162/* Opcode 0x66 0x0f 0x38 0x59 - invalid (vex only). */
1163/* Opcode 0x66 0x0f 0x38 0x5a - invalid (vex only). */
1164/* Opcode 0x66 0x0f 0x38 0x5b - invalid. */
1165/* Opcode 0x66 0x0f 0x38 0x5c - invalid. */
1166/* Opcode 0x66 0x0f 0x38 0x5d - invalid. */
1167/* Opcode 0x66 0x0f 0x38 0x5e - invalid. */
1168/* Opcode 0x66 0x0f 0x38 0x5f - invalid. */
1169
1170/* Opcode 0x66 0x0f 0x38 0x60 - invalid. */
1171/* Opcode 0x66 0x0f 0x38 0x61 - invalid. */
1172/* Opcode 0x66 0x0f 0x38 0x62 - invalid. */
1173/* Opcode 0x66 0x0f 0x38 0x63 - invalid. */
1174/* Opcode 0x66 0x0f 0x38 0x64 - invalid. */
1175/* Opcode 0x66 0x0f 0x38 0x65 - invalid. */
1176/* Opcode 0x66 0x0f 0x38 0x66 - invalid. */
1177/* Opcode 0x66 0x0f 0x38 0x67 - invalid. */
1178/* Opcode 0x66 0x0f 0x38 0x68 - invalid. */
1179/* Opcode 0x66 0x0f 0x38 0x69 - invalid. */
1180/* Opcode 0x66 0x0f 0x38 0x6a - invalid. */
1181/* Opcode 0x66 0x0f 0x38 0x6b - invalid. */
1182/* Opcode 0x66 0x0f 0x38 0x6c - invalid. */
1183/* Opcode 0x66 0x0f 0x38 0x6d - invalid. */
1184/* Opcode 0x66 0x0f 0x38 0x6e - invalid. */
1185/* Opcode 0x66 0x0f 0x38 0x6f - invalid. */
1186
1187/* Opcode 0x66 0x0f 0x38 0x70 - invalid. */
1188/* Opcode 0x66 0x0f 0x38 0x71 - invalid. */
1189/* Opcode 0x66 0x0f 0x38 0x72 - invalid. */
1190/* Opcode 0x66 0x0f 0x38 0x73 - invalid. */
1191/* Opcode 0x66 0x0f 0x38 0x74 - invalid. */
1192/* Opcode 0x66 0x0f 0x38 0x75 - invalid. */
1193/* Opcode 0x66 0x0f 0x38 0x76 - invalid. */
1194/* Opcode 0x66 0x0f 0x38 0x77 - invalid. */
1195/* Opcode 0x66 0x0f 0x38 0x78 - invalid (vex only). */
1196/* Opcode 0x66 0x0f 0x38 0x79 - invalid (vex only). */
1197/* Opcode 0x66 0x0f 0x38 0x7a - invalid. */
1198/* Opcode 0x66 0x0f 0x38 0x7b - invalid. */
1199/* Opcode 0x66 0x0f 0x38 0x7c - invalid. */
1200/* Opcode 0x66 0x0f 0x38 0x7d - invalid. */
1201/* Opcode 0x66 0x0f 0x38 0x7e - invalid. */
1202/* Opcode 0x66 0x0f 0x38 0x7f - invalid. */
1203
1204/** Opcode 0x66 0x0f 0x38 0x80. */
1205#ifdef VBOX_WITH_NESTED_HWVIRT_VMX_EPT
1206FNIEMOP_DEF(iemOp_invept_Gy_Mdq)
1207{
1208 IEMOP_MNEMONIC(invept, "invept Gy,Mdq");
1209 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
1210 IEMOP_HLP_IN_VMX_OPERATION("invept", kVmxVDiag_Invept);
1211 IEMOP_HLP_VMX_INSTR("invept", kVmxVDiag_Invept);
1212 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
1213 if (IEM_IS_MODRM_MEM_MODE(bRm))
1214 {
1215 /* Register, memory. */
1216 if (pVCpu->iem.s.enmEffOpSize == IEMMODE_64BIT)
1217 {
1218 IEM_MC_BEGIN(3, 0);
1219 IEM_MC_ARG(uint8_t, iEffSeg, 0);
1220 IEM_MC_ARG(RTGCPTR, GCPtrInveptDesc, 1);
1221 IEM_MC_ARG(uint64_t, uInveptType, 2);
1222 IEM_MC_FETCH_GREG_U64(uInveptType, IEM_GET_MODRM_REG(pVCpu, bRm));
1223 IEM_MC_CALC_RM_EFF_ADDR(GCPtrInveptDesc, bRm, 0);
1224 IEM_MC_ASSIGN(iEffSeg, pVCpu->iem.s.iEffSeg);
1225 IEM_MC_CALL_CIMPL_3(iemCImpl_invept, iEffSeg, GCPtrInveptDesc, uInveptType);
1226 IEM_MC_END();
1227 }
1228 else
1229 {
1230 IEM_MC_BEGIN(3, 0);
1231 IEM_MC_ARG(uint8_t, iEffSeg, 0);
1232 IEM_MC_ARG(RTGCPTR, GCPtrInveptDesc, 1);
1233 IEM_MC_ARG(uint32_t, uInveptType, 2);
1234 IEM_MC_FETCH_GREG_U32(uInveptType, IEM_GET_MODRM_REG(pVCpu, bRm));
1235 IEM_MC_CALC_RM_EFF_ADDR(GCPtrInveptDesc, bRm, 0);
1236 IEM_MC_ASSIGN(iEffSeg, pVCpu->iem.s.iEffSeg);
1237 IEM_MC_CALL_CIMPL_3(iemCImpl_invept, iEffSeg, GCPtrInveptDesc, uInveptType);
1238 IEM_MC_END();
1239 }
1240 }
1241 Log(("iemOp_invept_Gy_Mdq: invalid encoding -> #UD\n"));
1242 return IEMOP_RAISE_INVALID_OPCODE();
1243}
1244#else
1245FNIEMOP_STUB(iemOp_invept_Gy_Mdq);
1246#endif
1247
1248/** Opcode 0x66 0x0f 0x38 0x81. */
1249#ifdef VBOX_WITH_NESTED_HWVIRT_VMX
1250FNIEMOP_DEF(iemOp_invvpid_Gy_Mdq)
1251{
1252 IEMOP_MNEMONIC(invvpid, "invvpid Gy,Mdq");
1253 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
1254 IEMOP_HLP_IN_VMX_OPERATION("invvpid", kVmxVDiag_Invvpid);
1255 IEMOP_HLP_VMX_INSTR("invvpid", kVmxVDiag_Invvpid);
1256 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
1257 if (IEM_IS_MODRM_MEM_MODE(bRm))
1258 {
1259 /* Register, memory. */
1260 if (pVCpu->iem.s.enmEffOpSize == IEMMODE_64BIT)
1261 {
1262 IEM_MC_BEGIN(3, 0);
1263 IEM_MC_ARG(uint8_t, iEffSeg, 0);
1264 IEM_MC_ARG(RTGCPTR, GCPtrInvvpidDesc, 1);
1265 IEM_MC_ARG(uint64_t, uInvvpidType, 2);
1266 IEM_MC_FETCH_GREG_U64(uInvvpidType, IEM_GET_MODRM_REG(pVCpu, bRm));
1267 IEM_MC_CALC_RM_EFF_ADDR(GCPtrInvvpidDesc, bRm, 0);
1268 IEM_MC_ASSIGN(iEffSeg, pVCpu->iem.s.iEffSeg);
1269 IEM_MC_CALL_CIMPL_3(iemCImpl_invvpid, iEffSeg, GCPtrInvvpidDesc, uInvvpidType);
1270 IEM_MC_END();
1271 }
1272 else
1273 {
1274 IEM_MC_BEGIN(3, 0);
1275 IEM_MC_ARG(uint8_t, iEffSeg, 0);
1276 IEM_MC_ARG(RTGCPTR, GCPtrInvvpidDesc, 1);
1277 IEM_MC_ARG(uint32_t, uInvvpidType, 2);
1278 IEM_MC_FETCH_GREG_U32(uInvvpidType, IEM_GET_MODRM_REG(pVCpu, bRm));
1279 IEM_MC_CALC_RM_EFF_ADDR(GCPtrInvvpidDesc, bRm, 0);
1280 IEM_MC_ASSIGN(iEffSeg, pVCpu->iem.s.iEffSeg);
1281 IEM_MC_CALL_CIMPL_3(iemCImpl_invvpid, iEffSeg, GCPtrInvvpidDesc, uInvvpidType);
1282 IEM_MC_END();
1283 }
1284 }
1285 Log(("iemOp_invvpid_Gy_Mdq: invalid encoding -> #UD\n"));
1286 return IEMOP_RAISE_INVALID_OPCODE();
1287}
1288#else
1289FNIEMOP_STUB(iemOp_invvpid_Gy_Mdq);
1290#endif
1291
1292/** Opcode 0x66 0x0f 0x38 0x82. */
1293FNIEMOP_DEF(iemOp_invpcid_Gy_Mdq)
1294{
1295 IEMOP_MNEMONIC(invpcid, "invpcid Gy,Mdq");
1296 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
1297 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
1298 if (IEM_IS_MODRM_MEM_MODE(bRm))
1299 {
1300 /* Register, memory. */
1301 if (pVCpu->iem.s.enmEffOpSize == IEMMODE_64BIT)
1302 {
1303 IEM_MC_BEGIN(3, 0);
1304 IEM_MC_ARG(uint8_t, iEffSeg, 0);
1305 IEM_MC_ARG(RTGCPTR, GCPtrInvpcidDesc, 1);
1306 IEM_MC_ARG(uint64_t, uInvpcidType, 2);
1307 IEM_MC_FETCH_GREG_U64(uInvpcidType, IEM_GET_MODRM_REG(pVCpu, bRm));
1308 IEM_MC_CALC_RM_EFF_ADDR(GCPtrInvpcidDesc, bRm, 0);
1309 IEM_MC_ASSIGN(iEffSeg, pVCpu->iem.s.iEffSeg);
1310 IEM_MC_CALL_CIMPL_3(iemCImpl_invpcid, iEffSeg, GCPtrInvpcidDesc, uInvpcidType);
1311 IEM_MC_END();
1312 }
1313 else
1314 {
1315 IEM_MC_BEGIN(3, 0);
1316 IEM_MC_ARG(uint8_t, iEffSeg, 0);
1317 IEM_MC_ARG(RTGCPTR, GCPtrInvpcidDesc, 1);
1318 IEM_MC_ARG(uint32_t, uInvpcidType, 2);
1319 IEM_MC_FETCH_GREG_U32(uInvpcidType, IEM_GET_MODRM_REG(pVCpu, bRm));
1320 IEM_MC_CALC_RM_EFF_ADDR(GCPtrInvpcidDesc, bRm, 0);
1321 IEM_MC_ASSIGN(iEffSeg, pVCpu->iem.s.iEffSeg);
1322 IEM_MC_CALL_CIMPL_3(iemCImpl_invpcid, iEffSeg, GCPtrInvpcidDesc, uInvpcidType);
1323 IEM_MC_END();
1324 }
1325 }
1326 Log(("iemOp_invpcid_Gy_Mdq: invalid encoding -> #UD\n"));
1327 return IEMOP_RAISE_INVALID_OPCODE();
1328}
1329
1330
1331/* Opcode 0x66 0x0f 0x38 0x83 - invalid. */
1332/* Opcode 0x66 0x0f 0x38 0x84 - invalid. */
1333/* Opcode 0x66 0x0f 0x38 0x85 - invalid. */
1334/* Opcode 0x66 0x0f 0x38 0x86 - invalid. */
1335/* Opcode 0x66 0x0f 0x38 0x87 - invalid. */
1336/* Opcode 0x66 0x0f 0x38 0x88 - invalid. */
1337/* Opcode 0x66 0x0f 0x38 0x89 - invalid. */
1338/* Opcode 0x66 0x0f 0x38 0x8a - invalid. */
1339/* Opcode 0x66 0x0f 0x38 0x8b - invalid. */
1340/* Opcode 0x66 0x0f 0x38 0x8c - invalid (vex only). */
1341/* Opcode 0x66 0x0f 0x38 0x8d - invalid. */
1342/* Opcode 0x66 0x0f 0x38 0x8e - invalid (vex only). */
1343/* Opcode 0x66 0x0f 0x38 0x8f - invalid. */
1344
1345/* Opcode 0x66 0x0f 0x38 0x90 - invalid (vex only). */
1346/* Opcode 0x66 0x0f 0x38 0x91 - invalid (vex only). */
1347/* Opcode 0x66 0x0f 0x38 0x92 - invalid (vex only). */
1348/* Opcode 0x66 0x0f 0x38 0x93 - invalid (vex only). */
1349/* Opcode 0x66 0x0f 0x38 0x94 - invalid. */
1350/* Opcode 0x66 0x0f 0x38 0x95 - invalid. */
1351/* Opcode 0x66 0x0f 0x38 0x96 - invalid (vex only). */
1352/* Opcode 0x66 0x0f 0x38 0x97 - invalid (vex only). */
1353/* Opcode 0x66 0x0f 0x38 0x98 - invalid (vex only). */
1354/* Opcode 0x66 0x0f 0x38 0x99 - invalid (vex only). */
1355/* Opcode 0x66 0x0f 0x38 0x9a - invalid (vex only). */
1356/* Opcode 0x66 0x0f 0x38 0x9b - invalid (vex only). */
1357/* Opcode 0x66 0x0f 0x38 0x9c - invalid (vex only). */
1358/* Opcode 0x66 0x0f 0x38 0x9d - invalid (vex only). */
1359/* Opcode 0x66 0x0f 0x38 0x9e - invalid (vex only). */
1360/* Opcode 0x66 0x0f 0x38 0x9f - invalid (vex only). */
1361
1362/* Opcode 0x66 0x0f 0x38 0xa0 - invalid. */
1363/* Opcode 0x66 0x0f 0x38 0xa1 - invalid. */
1364/* Opcode 0x66 0x0f 0x38 0xa2 - invalid. */
1365/* Opcode 0x66 0x0f 0x38 0xa3 - invalid. */
1366/* Opcode 0x66 0x0f 0x38 0xa4 - invalid. */
1367/* Opcode 0x66 0x0f 0x38 0xa5 - invalid. */
1368/* Opcode 0x66 0x0f 0x38 0xa6 - invalid (vex only). */
1369/* Opcode 0x66 0x0f 0x38 0xa7 - invalid (vex only). */
1370/* Opcode 0x66 0x0f 0x38 0xa8 - invalid (vex only). */
1371/* Opcode 0x66 0x0f 0x38 0xa9 - invalid (vex only). */
1372/* Opcode 0x66 0x0f 0x38 0xaa - invalid (vex only). */
1373/* Opcode 0x66 0x0f 0x38 0xab - invalid (vex only). */
1374/* Opcode 0x66 0x0f 0x38 0xac - invalid (vex only). */
1375/* Opcode 0x66 0x0f 0x38 0xad - invalid (vex only). */
1376/* Opcode 0x66 0x0f 0x38 0xae - invalid (vex only). */
1377/* Opcode 0x66 0x0f 0x38 0xaf - invalid (vex only). */
1378
1379/* Opcode 0x66 0x0f 0x38 0xb0 - invalid. */
1380/* Opcode 0x66 0x0f 0x38 0xb1 - invalid. */
1381/* Opcode 0x66 0x0f 0x38 0xb2 - invalid. */
1382/* Opcode 0x66 0x0f 0x38 0xb3 - invalid. */
1383/* Opcode 0x66 0x0f 0x38 0xb4 - invalid. */
1384/* Opcode 0x66 0x0f 0x38 0xb5 - invalid. */
1385/* Opcode 0x66 0x0f 0x38 0xb6 - invalid (vex only). */
1386/* Opcode 0x66 0x0f 0x38 0xb7 - invalid (vex only). */
1387/* Opcode 0x66 0x0f 0x38 0xb8 - invalid (vex only). */
1388/* Opcode 0x66 0x0f 0x38 0xb9 - invalid (vex only). */
1389/* Opcode 0x66 0x0f 0x38 0xba - invalid (vex only). */
1390/* Opcode 0x66 0x0f 0x38 0xbb - invalid (vex only). */
1391/* Opcode 0x66 0x0f 0x38 0xbc - invalid (vex only). */
1392/* Opcode 0x66 0x0f 0x38 0xbd - invalid (vex only). */
1393/* Opcode 0x66 0x0f 0x38 0xbe - invalid (vex only). */
1394/* Opcode 0x66 0x0f 0x38 0xbf - invalid (vex only). */
1395
1396/* Opcode 0x0f 0x38 0xc0 - invalid. */
1397/* Opcode 0x66 0x0f 0x38 0xc0 - invalid. */
1398/* Opcode 0x0f 0x38 0xc1 - invalid. */
1399/* Opcode 0x66 0x0f 0x38 0xc1 - invalid. */
1400/* Opcode 0x0f 0x38 0xc2 - invalid. */
1401/* Opcode 0x66 0x0f 0x38 0xc2 - invalid. */
1402/* Opcode 0x0f 0x38 0xc3 - invalid. */
1403/* Opcode 0x66 0x0f 0x38 0xc3 - invalid. */
1404/* Opcode 0x0f 0x38 0xc4 - invalid. */
1405/* Opcode 0x66 0x0f 0x38 0xc4 - invalid. */
1406/* Opcode 0x0f 0x38 0xc5 - invalid. */
1407/* Opcode 0x66 0x0f 0x38 0xc5 - invalid. */
1408/* Opcode 0x0f 0x38 0xc6 - invalid. */
1409/* Opcode 0x66 0x0f 0x38 0xc6 - invalid. */
1410/* Opcode 0x0f 0x38 0xc7 - invalid. */
1411/* Opcode 0x66 0x0f 0x38 0xc7 - invalid. */
1412/** Opcode 0x0f 0x38 0xc8. */
1413FNIEMOP_STUB(iemOp_sha1nexte_Vdq_Wdq);
1414/* Opcode 0x66 0x0f 0x38 0xc8 - invalid. */
1415/** Opcode 0x0f 0x38 0xc9. */
1416FNIEMOP_STUB(iemOp_sha1msg1_Vdq_Wdq);
1417/* Opcode 0x66 0x0f 0x38 0xc9 - invalid. */
1418/** Opcode 0x0f 0x38 0xca. */
1419FNIEMOP_STUB(iemOp_sha1msg2_Vdq_Wdq);
1420/* Opcode 0x66 0x0f 0x38 0xca - invalid. */
1421/** Opcode 0x0f 0x38 0xcb. */
1422FNIEMOP_STUB(iemOp_sha256rnds2_Vdq_Wdq);
1423/* Opcode 0x66 0x0f 0x38 0xcb - invalid. */
1424/** Opcode 0x0f 0x38 0xcc. */
1425FNIEMOP_STUB(iemOp_sha256msg1_Vdq_Wdq);
1426/* Opcode 0x66 0x0f 0x38 0xcc - invalid. */
1427/** Opcode 0x0f 0x38 0xcd. */
1428FNIEMOP_STUB(iemOp_sha256msg2_Vdq_Wdq);
1429/* Opcode 0x66 0x0f 0x38 0xcd - invalid. */
1430/* Opcode 0x0f 0x38 0xce - invalid. */
1431/* Opcode 0x66 0x0f 0x38 0xce - invalid. */
1432/* Opcode 0x0f 0x38 0xcf - invalid. */
1433/* Opcode 0x66 0x0f 0x38 0xcf - invalid. */
1434
1435/* Opcode 0x66 0x0f 0x38 0xd0 - invalid. */
1436/* Opcode 0x66 0x0f 0x38 0xd1 - invalid. */
1437/* Opcode 0x66 0x0f 0x38 0xd2 - invalid. */
1438/* Opcode 0x66 0x0f 0x38 0xd3 - invalid. */
1439/* Opcode 0x66 0x0f 0x38 0xd4 - invalid. */
1440/* Opcode 0x66 0x0f 0x38 0xd5 - invalid. */
1441/* Opcode 0x66 0x0f 0x38 0xd6 - invalid. */
1442/* Opcode 0x66 0x0f 0x38 0xd7 - invalid. */
1443/* Opcode 0x66 0x0f 0x38 0xd8 - invalid. */
1444/* Opcode 0x66 0x0f 0x38 0xd9 - invalid. */
1445/* Opcode 0x66 0x0f 0x38 0xda - invalid. */
1446
1447
1448/** Opcode 0x66 0x0f 0x38 0xdb. */
1449FNIEMOP_DEF(iemOp_aesimc_Vdq_Wdq)
1450{
1451 IEMOP_MNEMONIC2(RM, AESIMC, aesimc, Vdq, Wdq, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, IEMOPHINT_IGNORES_OP_SIZES);
1452 return FNIEMOP_CALL_1(iemOpCommonAesNi_FullFull_To_Full,
1453 IEM_SELECT_HOST_OR_FALLBACK(fAesNi, iemAImpl_aesimc_u128, iemAImpl_aesimc_u128_fallback));
1454}
1455
1456
1457/** Opcode 0x66 0x0f 0x38 0xdc. */
1458FNIEMOP_DEF(iemOp_aesenc_Vdq_Wdq)
1459{
1460 IEMOP_MNEMONIC2(RM, AESENC, aesenc, Vdq, Wdq, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, IEMOPHINT_IGNORES_OP_SIZES);
1461 return FNIEMOP_CALL_1(iemOpCommonAesNi_FullFull_To_Full,
1462 IEM_SELECT_HOST_OR_FALLBACK(fAesNi, iemAImpl_aesenc_u128, iemAImpl_aesenc_u128_fallback));
1463}
1464
1465
1466/** Opcode 0x66 0x0f 0x38 0xdd. */
1467FNIEMOP_DEF(iemOp_aesenclast_Vdq_Wdq)
1468{
1469 IEMOP_MNEMONIC2(RM, AESENCLAST, aesenclast, Vdq, Wdq, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, IEMOPHINT_IGNORES_OP_SIZES);
1470 return FNIEMOP_CALL_1(iemOpCommonAesNi_FullFull_To_Full,
1471 IEM_SELECT_HOST_OR_FALLBACK(fAesNi, iemAImpl_aesenclast_u128, iemAImpl_aesenclast_u128_fallback));
1472}
1473
1474
1475/** Opcode 0x66 0x0f 0x38 0xde. */
1476FNIEMOP_DEF(iemOp_aesdec_Vdq_Wdq)
1477{
1478 IEMOP_MNEMONIC2(RM, AESDEC, aesdec, Vdq, Wdq, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, IEMOPHINT_IGNORES_OP_SIZES);
1479 return FNIEMOP_CALL_1(iemOpCommonAesNi_FullFull_To_Full,
1480 IEM_SELECT_HOST_OR_FALLBACK(fAesNi, iemAImpl_aesdec_u128, iemAImpl_aesdec_u128_fallback));
1481}
1482
1483
1484/** Opcode 0x66 0x0f 0x38 0xdf. */
1485FNIEMOP_DEF(iemOp_aesdeclast_Vdq_Wdq)
1486{
1487 IEMOP_MNEMONIC2(RM, AESDECLAST, aesdeclast, Vdq, Wdq, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, IEMOPHINT_IGNORES_OP_SIZES);
1488 return FNIEMOP_CALL_1(iemOpCommonAesNi_FullFull_To_Full,
1489 IEM_SELECT_HOST_OR_FALLBACK(fAesNi, iemAImpl_aesdeclast_u128, iemAImpl_aesdeclast_u128_fallback));
1490}
1491
1492
1493/* Opcode 0x66 0x0f 0x38 0xe0 - invalid. */
1494/* Opcode 0x66 0x0f 0x38 0xe1 - invalid. */
1495/* Opcode 0x66 0x0f 0x38 0xe2 - invalid. */
1496/* Opcode 0x66 0x0f 0x38 0xe3 - invalid. */
1497/* Opcode 0x66 0x0f 0x38 0xe4 - invalid. */
1498/* Opcode 0x66 0x0f 0x38 0xe5 - invalid. */
1499/* Opcode 0x66 0x0f 0x38 0xe6 - invalid. */
1500/* Opcode 0x66 0x0f 0x38 0xe7 - invalid. */
1501/* Opcode 0x66 0x0f 0x38 0xe8 - invalid. */
1502/* Opcode 0x66 0x0f 0x38 0xe9 - invalid. */
1503/* Opcode 0x66 0x0f 0x38 0xea - invalid. */
1504/* Opcode 0x66 0x0f 0x38 0xeb - invalid. */
1505/* Opcode 0x66 0x0f 0x38 0xec - invalid. */
1506/* Opcode 0x66 0x0f 0x38 0xed - invalid. */
1507/* Opcode 0x66 0x0f 0x38 0xee - invalid. */
1508/* Opcode 0x66 0x0f 0x38 0xef - invalid. */
1509
1510
1511/** Opcode 0x0f 0x38 0xf0. */
1512FNIEMOP_STUB(iemOp_movbe_Gy_My);
1513/** Opcode 0x66 0x0f 0x38 0xf0. */
1514FNIEMOP_STUB(iemOp_movbe_Gw_Mw);
1515/* Opcode 0xf3 0x0f 0x38 0xf0 - invalid. */
1516
1517
1518/** Opcode 0xf2 0x0f 0x38 0xf0. */
1519FNIEMOP_DEF(iemOp_crc32_Gd_Eb)
1520{
1521 IEMOP_MNEMONIC2(RM, CRC32, crc32, Gd, Eb, DISOPTYPE_HARMLESS, 0);
1522 if (!IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fSse42)
1523 return iemOp_InvalidNeedRM(pVCpu);
1524
1525 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
1526 if (IEM_IS_MODRM_REG_MODE(bRm))
1527 {
1528 /*
1529 * Register, register.
1530 */
1531 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
1532 IEM_MC_BEGIN(2, 0);
1533 IEM_MC_ARG(uint32_t *, puDst, 0);
1534 IEM_MC_ARG(uint8_t, uSrc, 1);
1535 IEM_MC_REF_GREG_U32(puDst, IEM_GET_MODRM_REG(pVCpu, bRm));
1536 IEM_MC_FETCH_GREG_U8(uSrc, IEM_GET_MODRM_RM(pVCpu, bRm));
1537 IEM_MC_CALL_VOID_AIMPL_2(IEM_SELECT_HOST_OR_FALLBACK(fSse42, iemAImpl_crc32_u8, iemAImpl_crc32_u8_fallback), puDst, uSrc);
1538 IEM_MC_CLEAR_HIGH_GREG_U64_BY_REF(puDst);
1539 IEM_MC_ADVANCE_RIP_AND_FINISH();
1540 IEM_MC_END();
1541 }
1542 else
1543 {
1544 /*
1545 * Register, memory.
1546 */
1547 IEM_MC_BEGIN(2, 1);
1548 IEM_MC_ARG(uint32_t *, puDst, 0);
1549 IEM_MC_ARG(uint8_t, uSrc, 1);
1550 IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
1551
1552 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
1553 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
1554 IEM_MC_FETCH_MEM_U8(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
1555
1556 IEM_MC_REF_GREG_U32(puDst, IEM_GET_MODRM_REG(pVCpu, bRm));
1557 IEM_MC_CALL_VOID_AIMPL_2(IEM_SELECT_HOST_OR_FALLBACK(fSse42, iemAImpl_crc32_u8, iemAImpl_crc32_u8_fallback), puDst, uSrc);
1558 IEM_MC_CLEAR_HIGH_GREG_U64_BY_REF(puDst);
1559
1560 IEM_MC_ADVANCE_RIP_AND_FINISH();
1561 IEM_MC_END();
1562 }
1563}
1564
1565
1566/** Opcode 0x0f 0x38 0xf1. */
1567FNIEMOP_STUB(iemOp_movbe_My_Gy);
1568/** Opcode 0x66 0x0f 0x38 0xf1. */
1569FNIEMOP_STUB(iemOp_movbe_Mw_Gw);
1570/* Opcode 0xf3 0x0f 0x38 0xf1 - invalid. */
1571
1572
1573/** Opcode 0xf2 0x0f 0x38 0xf1. */
1574FNIEMOP_DEF(iemOp_crc32_Gv_Ev)
1575{
1576 IEMOP_MNEMONIC2(RM, CRC32, crc32, Gd, Ev, DISOPTYPE_HARMLESS, 0);
1577 if (!IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fSse42)
1578 return iemOp_InvalidNeedRM(pVCpu);
1579
1580 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
1581 if (IEM_IS_MODRM_REG_MODE(bRm))
1582 {
1583 /*
1584 * Register, register.
1585 */
1586 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
1587 switch (pVCpu->iem.s.enmEffOpSize)
1588 {
1589 case IEMMODE_16BIT:
1590 IEM_MC_BEGIN(2, 0);
1591 IEM_MC_ARG(uint32_t *, puDst, 0);
1592 IEM_MC_ARG(uint16_t, uSrc, 1);
1593 IEM_MC_REF_GREG_U32(puDst, IEM_GET_MODRM_REG(pVCpu, bRm));
1594 IEM_MC_FETCH_GREG_U16(uSrc, IEM_GET_MODRM_RM(pVCpu, bRm));
1595 IEM_MC_CALL_VOID_AIMPL_2(IEM_SELECT_HOST_OR_FALLBACK(fSse42, iemAImpl_crc32_u16, iemAImpl_crc32_u16_fallback),
1596 puDst, uSrc);
1597 IEM_MC_CLEAR_HIGH_GREG_U64_BY_REF(puDst);
1598 IEM_MC_ADVANCE_RIP_AND_FINISH();
1599 IEM_MC_END();
1600 break;
1601
1602 case IEMMODE_32BIT:
1603 IEM_MC_BEGIN(2, 0);
1604 IEM_MC_ARG(uint32_t *, puDst, 0);
1605 IEM_MC_ARG(uint32_t, uSrc, 1);
1606 IEM_MC_REF_GREG_U32(puDst, IEM_GET_MODRM_REG(pVCpu, bRm));
1607 IEM_MC_FETCH_GREG_U32(uSrc, IEM_GET_MODRM_RM(pVCpu, bRm));
1608 IEM_MC_CALL_VOID_AIMPL_2(IEM_SELECT_HOST_OR_FALLBACK(fSse42, iemAImpl_crc32_u32, iemAImpl_crc32_u32_fallback),
1609 puDst, uSrc);
1610 IEM_MC_CLEAR_HIGH_GREG_U64_BY_REF(puDst);
1611 IEM_MC_ADVANCE_RIP_AND_FINISH();
1612 IEM_MC_END();
1613 break;
1614
1615 case IEMMODE_64BIT:
1616 IEM_MC_BEGIN(2, 0);
1617 IEM_MC_ARG(uint32_t *, puDst, 0);
1618 IEM_MC_ARG(uint64_t, uSrc, 1);
1619 IEM_MC_REF_GREG_U32(puDst, IEM_GET_MODRM_REG(pVCpu, bRm));
1620 IEM_MC_FETCH_GREG_U64(uSrc, IEM_GET_MODRM_RM(pVCpu, bRm));
1621 IEM_MC_CALL_VOID_AIMPL_2(IEM_SELECT_HOST_OR_FALLBACK(fSse42, iemAImpl_crc32_u64, iemAImpl_crc32_u64_fallback),
1622 puDst, uSrc);
1623 IEM_MC_CLEAR_HIGH_GREG_U64_BY_REF(puDst);
1624 IEM_MC_ADVANCE_RIP_AND_FINISH();
1625 IEM_MC_END();
1626 break;
1627
1628 IEM_NOT_REACHED_DEFAULT_CASE_RET();
1629 }
1630 }
1631 else
1632 {
1633 /*
1634 * Register, memory.
1635 */
1636 switch (pVCpu->iem.s.enmEffOpSize)
1637 {
1638 case IEMMODE_16BIT:
1639 IEM_MC_BEGIN(2, 1);
1640 IEM_MC_ARG(uint32_t *, puDst, 0);
1641 IEM_MC_ARG(uint16_t, uSrc, 1);
1642 IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
1643
1644 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
1645 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
1646 IEM_MC_FETCH_MEM_U16(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
1647
1648 IEM_MC_REF_GREG_U32(puDst, IEM_GET_MODRM_REG(pVCpu, bRm));
1649 IEM_MC_CALL_VOID_AIMPL_2(IEM_SELECT_HOST_OR_FALLBACK(fSse42, iemAImpl_crc32_u16, iemAImpl_crc32_u16_fallback),
1650 puDst, uSrc);
1651 IEM_MC_CLEAR_HIGH_GREG_U64_BY_REF(puDst);
1652
1653 IEM_MC_ADVANCE_RIP_AND_FINISH();
1654 IEM_MC_END();
1655 break;
1656
1657 case IEMMODE_32BIT:
1658 IEM_MC_BEGIN(2, 1);
1659 IEM_MC_ARG(uint32_t *, puDst, 0);
1660 IEM_MC_ARG(uint32_t, uSrc, 1);
1661 IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
1662
1663 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
1664 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
1665 IEM_MC_FETCH_MEM_U32(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
1666
1667 IEM_MC_REF_GREG_U32(puDst, IEM_GET_MODRM_REG(pVCpu, bRm));
1668 IEM_MC_CALL_VOID_AIMPL_2(IEM_SELECT_HOST_OR_FALLBACK(fSse42, iemAImpl_crc32_u32, iemAImpl_crc32_u32_fallback),
1669 puDst, uSrc);
1670 IEM_MC_CLEAR_HIGH_GREG_U64_BY_REF(puDst);
1671
1672 IEM_MC_ADVANCE_RIP_AND_FINISH();
1673 IEM_MC_END();
1674 break;
1675
1676 case IEMMODE_64BIT:
1677 IEM_MC_BEGIN(2, 1);
1678 IEM_MC_ARG(uint32_t *, puDst, 0);
1679 IEM_MC_ARG(uint64_t, uSrc, 1);
1680 IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
1681
1682 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
1683 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
1684 IEM_MC_FETCH_MEM_U64(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
1685
1686 IEM_MC_REF_GREG_U32(puDst, IEM_GET_MODRM_REG(pVCpu, bRm));
1687 IEM_MC_CALL_VOID_AIMPL_2(IEM_SELECT_HOST_OR_FALLBACK(fSse42, iemAImpl_crc32_u64, iemAImpl_crc32_u64_fallback),
1688 puDst, uSrc);
1689 IEM_MC_CLEAR_HIGH_GREG_U64_BY_REF(puDst);
1690
1691 IEM_MC_ADVANCE_RIP_AND_FINISH();
1692 IEM_MC_END();
1693 break;
1694
1695 IEM_NOT_REACHED_DEFAULT_CASE_RET();
1696 }
1697 }
1698}
1699
1700
1701/* Opcode 0x0f 0x38 0xf2 - invalid (vex only). */
1702/* Opcode 0x66 0x0f 0x38 0xf2 - invalid. */
1703/* Opcode 0xf3 0x0f 0x38 0xf2 - invalid. */
1704/* Opcode 0xf2 0x0f 0x38 0xf2 - invalid. */
1705
1706/* Opcode 0x0f 0x38 0xf3 - invalid (vex only - group 17). */
1707/* Opcode 0x66 0x0f 0x38 0xf3 - invalid (vex only - group 17). */
1708/* Opcode 0xf3 0x0f 0x38 0xf3 - invalid (vex only - group 17). */
1709/* Opcode 0xf2 0x0f 0x38 0xf3 - invalid (vex only - group 17). */
1710
1711/* Opcode 0x0f 0x38 0xf4 - invalid. */
1712/* Opcode 0x66 0x0f 0x38 0xf4 - invalid. */
1713/* Opcode 0xf3 0x0f 0x38 0xf4 - invalid. */
1714/* Opcode 0xf2 0x0f 0x38 0xf4 - invalid. */
1715
1716/* Opcode 0x0f 0x38 0xf5 - invalid (vex only). */
1717/* Opcode 0x66 0x0f 0x38 0xf5 - invalid. */
1718/* Opcode 0xf3 0x0f 0x38 0xf5 - invalid (vex only). */
1719/* Opcode 0xf2 0x0f 0x38 0xf5 - invalid (vex only). */
1720
1721/* Opcode 0x0f 0x38 0xf6 - invalid. */
1722/** Opcode 0x66 0x0f 0x38 0xf6. */
1723FNIEMOP_STUB(iemOp_adcx_Gy_Ey);
1724/** Opcode 0xf3 0x0f 0x38 0xf6. */
1725FNIEMOP_STUB(iemOp_adox_Gy_Ey);
1726/* Opcode 0xf2 0x0f 0x38 0xf6 - invalid (vex only). */
1727
1728/* Opcode 0x0f 0x38 0xf7 - invalid (vex only). */
1729/* Opcode 0x66 0x0f 0x38 0xf7 - invalid (vex only). */
1730/* Opcode 0xf3 0x0f 0x38 0xf7 - invalid (vex only). */
1731/* Opcode 0xf2 0x0f 0x38 0xf7 - invalid (vex only). */
1732
1733/* Opcode 0x0f 0x38 0xf8 - invalid. */
1734/* Opcode 0x66 0x0f 0x38 0xf8 - invalid. */
1735/* Opcode 0xf3 0x0f 0x38 0xf8 - invalid. */
1736/* Opcode 0xf2 0x0f 0x38 0xf8 - invalid. */
1737
1738/* Opcode 0x0f 0x38 0xf9 - invalid. */
1739/* Opcode 0x66 0x0f 0x38 0xf9 - invalid. */
1740/* Opcode 0xf3 0x0f 0x38 0xf9 - invalid. */
1741/* Opcode 0xf2 0x0f 0x38 0xf9 - invalid. */
1742
1743/* Opcode 0x0f 0x38 0xfa - invalid. */
1744/* Opcode 0x66 0x0f 0x38 0xfa - invalid. */
1745/* Opcode 0xf3 0x0f 0x38 0xfa - invalid. */
1746/* Opcode 0xf2 0x0f 0x38 0xfa - invalid. */
1747
1748/* Opcode 0x0f 0x38 0xfb - invalid. */
1749/* Opcode 0x66 0x0f 0x38 0xfb - invalid. */
1750/* Opcode 0xf3 0x0f 0x38 0xfb - invalid. */
1751/* Opcode 0xf2 0x0f 0x38 0xfb - invalid. */
1752
1753/* Opcode 0x0f 0x38 0xfc - invalid. */
1754/* Opcode 0x66 0x0f 0x38 0xfc - invalid. */
1755/* Opcode 0xf3 0x0f 0x38 0xfc - invalid. */
1756/* Opcode 0xf2 0x0f 0x38 0xfc - invalid. */
1757
1758/* Opcode 0x0f 0x38 0xfd - invalid. */
1759/* Opcode 0x66 0x0f 0x38 0xfd - invalid. */
1760/* Opcode 0xf3 0x0f 0x38 0xfd - invalid. */
1761/* Opcode 0xf2 0x0f 0x38 0xfd - invalid. */
1762
1763/* Opcode 0x0f 0x38 0xfe - invalid. */
1764/* Opcode 0x66 0x0f 0x38 0xfe - invalid. */
1765/* Opcode 0xf3 0x0f 0x38 0xfe - invalid. */
1766/* Opcode 0xf2 0x0f 0x38 0xfe - invalid. */
1767
1768/* Opcode 0x0f 0x38 0xff - invalid. */
1769/* Opcode 0x66 0x0f 0x38 0xff - invalid. */
1770/* Opcode 0xf3 0x0f 0x38 0xff - invalid. */
1771/* Opcode 0xf2 0x0f 0x38 0xff - invalid. */
1772
1773
1774/**
1775 * Three byte opcode map, first two bytes are 0x0f 0x38.
1776 * @sa g_apfnVexMap2
1777 */
1778IEM_STATIC const PFNIEMOP g_apfnThreeByte0f38[] =
1779{
1780 /* no prefix, 066h prefix f3h prefix, f2h prefix */
1781 /* 0x00 */ iemOp_pshufb_Pq_Qq, iemOp_pshufb_Vx_Wx, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM,
1782 /* 0x01 */ iemOp_phaddw_Pq_Qq, iemOp_phaddw_Vx_Wx, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM,
1783 /* 0x02 */ iemOp_phaddd_Pq_Qq, iemOp_phaddd_Vx_Wx, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM,
1784 /* 0x03 */ iemOp_phaddsw_Pq_Qq, iemOp_phaddsw_Vx_Wx, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM,
1785 /* 0x04 */ iemOp_pmaddubsw_Pq_Qq, iemOp_pmaddubsw_Vx_Wx, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM,
1786 /* 0x05 */ iemOp_phsubw_Pq_Qq, iemOp_phsubw_Vx_Wx, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM,
1787 /* 0x06 */ iemOp_phsubd_Pq_Qq, iemOp_phsubd_Vx_Wx, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM,
1788 /* 0x07 */ iemOp_phsubsw_Pq_Qq, iemOp_phsubsw_Vx_Wx, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM,
1789 /* 0x08 */ iemOp_psignb_Pq_Qq, iemOp_psignb_Vx_Wx, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM,
1790 /* 0x09 */ iemOp_psignw_Pq_Qq, iemOp_psignw_Vx_Wx, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM,
1791 /* 0x0a */ iemOp_psignd_Pq_Qq, iemOp_psignd_Vx_Wx, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM,
1792 /* 0x0b */ iemOp_pmulhrsw_Pq_Qq, iemOp_pmulhrsw_Vx_Wx, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM,
1793 /* 0x0c */ IEMOP_X4(iemOp_InvalidNeedRM),
1794 /* 0x0d */ IEMOP_X4(iemOp_InvalidNeedRM),
1795 /* 0x0e */ IEMOP_X4(iemOp_InvalidNeedRM),
1796 /* 0x0f */ IEMOP_X4(iemOp_InvalidNeedRM),
1797
1798 /* 0x10 */ iemOp_InvalidNeedRM, iemOp_pblendvb_Vdq_Wdq, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM,
1799 /* 0x11 */ IEMOP_X4(iemOp_InvalidNeedRM),
1800 /* 0x12 */ IEMOP_X4(iemOp_InvalidNeedRM),
1801 /* 0x13 */ IEMOP_X4(iemOp_InvalidNeedRM),
1802 /* 0x14 */ iemOp_InvalidNeedRM, iemOp_blendvps_Vdq_Wdq, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM,
1803 /* 0x15 */ iemOp_InvalidNeedRM, iemOp_blendvpd_Vdq_Wdq, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM,
1804 /* 0x16 */ IEMOP_X4(iemOp_InvalidNeedRM),
1805 /* 0x17 */ iemOp_InvalidNeedRM, iemOp_ptest_Vx_Wx, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM,
1806 /* 0x18 */ IEMOP_X4(iemOp_InvalidNeedRM),
1807 /* 0x19 */ IEMOP_X4(iemOp_InvalidNeedRM),
1808 /* 0x1a */ IEMOP_X4(iemOp_InvalidNeedRM),
1809 /* 0x1b */ IEMOP_X4(iemOp_InvalidNeedRM),
1810 /* 0x1c */ iemOp_pabsb_Pq_Qq, iemOp_pabsb_Vx_Wx, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM,
1811 /* 0x1d */ iemOp_pabsw_Pq_Qq, iemOp_pabsw_Vx_Wx, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM,
1812 /* 0x1e */ iemOp_pabsd_Pq_Qq, iemOp_pabsd_Vx_Wx, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM,
1813 /* 0x1f */ IEMOP_X4(iemOp_InvalidNeedRM),
1814
1815 /* 0x20 */ iemOp_InvalidNeedRM, iemOp_pmovsxbw_Vx_UxMq, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM,
1816 /* 0x21 */ iemOp_InvalidNeedRM, iemOp_pmovsxbd_Vx_UxMd, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM,
1817 /* 0x22 */ iemOp_InvalidNeedRM, iemOp_pmovsxbq_Vx_UxMw, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM,
1818 /* 0x23 */ iemOp_InvalidNeedRM, iemOp_pmovsxwd_Vx_UxMq, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM,
1819 /* 0x24 */ iemOp_InvalidNeedRM, iemOp_pmovsxwq_Vx_UxMd, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM,
1820 /* 0x25 */ iemOp_InvalidNeedRM, iemOp_pmovsxdq_Vx_UxMq, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM,
1821 /* 0x26 */ IEMOP_X4(iemOp_InvalidNeedRM),
1822 /* 0x27 */ IEMOP_X4(iemOp_InvalidNeedRM),
1823 /* 0x28 */ iemOp_InvalidNeedRM, iemOp_pmuldq_Vx_Wx, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM,
1824 /* 0x29 */ iemOp_InvalidNeedRM, iemOp_pcmpeqq_Vx_Wx, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM,
1825 /* 0x2a */ iemOp_InvalidNeedRM, iemOp_movntdqa_Vdq_Mdq, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM,
1826 /* 0x2b */ iemOp_InvalidNeedRM, iemOp_packusdw_Vx_Wx, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM,
1827 /* 0x2c */ IEMOP_X4(iemOp_InvalidNeedRM),
1828 /* 0x2d */ IEMOP_X4(iemOp_InvalidNeedRM),
1829 /* 0x2e */ IEMOP_X4(iemOp_InvalidNeedRM),
1830 /* 0x2f */ IEMOP_X4(iemOp_InvalidNeedRM),
1831
1832 /* 0x30 */ iemOp_InvalidNeedRM, iemOp_pmovzxbw_Vx_UxMq, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM,
1833 /* 0x31 */ iemOp_InvalidNeedRM, iemOp_pmovzxbd_Vx_UxMd, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM,
1834 /* 0x32 */ iemOp_InvalidNeedRM, iemOp_pmovzxbq_Vx_UxMw, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM,
1835 /* 0x33 */ iemOp_InvalidNeedRM, iemOp_pmovzxwd_Vx_UxMq, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM,
1836 /* 0x34 */ iemOp_InvalidNeedRM, iemOp_pmovzxwq_Vx_UxMd, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM,
1837 /* 0x35 */ iemOp_InvalidNeedRM, iemOp_pmovzxdq_Vx_UxMq, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM,
1838 /* 0x36 */ IEMOP_X4(iemOp_InvalidNeedRM),
1839 /* 0x37 */ iemOp_InvalidNeedRM, iemOp_pcmpgtq_Vx_Wx, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM,
1840 /* 0x38 */ iemOp_InvalidNeedRM, iemOp_pminsb_Vx_Wx, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM,
1841 /* 0x39 */ iemOp_InvalidNeedRM, iemOp_pminsd_Vx_Wx, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM,
1842 /* 0x3a */ iemOp_InvalidNeedRM, iemOp_pminuw_Vx_Wx, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM,
1843 /* 0x3b */ iemOp_InvalidNeedRM, iemOp_pminud_Vx_Wx, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM,
1844 /* 0x3c */ iemOp_InvalidNeedRM, iemOp_pmaxsb_Vx_Wx, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM,
1845 /* 0x3d */ iemOp_InvalidNeedRM, iemOp_pmaxsd_Vx_Wx, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM,
1846 /* 0x3e */ iemOp_InvalidNeedRM, iemOp_pmaxuw_Vx_Wx, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM,
1847 /* 0x3f */ iemOp_InvalidNeedRM, iemOp_pmaxud_Vx_Wx, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM,
1848
1849 /* 0x40 */ iemOp_InvalidNeedRM, iemOp_pmulld_Vx_Wx, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM,
1850 /* 0x41 */ iemOp_InvalidNeedRM, iemOp_phminposuw_Vdq_Wdq, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM,
1851 /* 0x42 */ IEMOP_X4(iemOp_InvalidNeedRM),
1852 /* 0x43 */ IEMOP_X4(iemOp_InvalidNeedRM),
1853 /* 0x44 */ IEMOP_X4(iemOp_InvalidNeedRM),
1854 /* 0x45 */ IEMOP_X4(iemOp_InvalidNeedRM),
1855 /* 0x46 */ IEMOP_X4(iemOp_InvalidNeedRM),
1856 /* 0x47 */ IEMOP_X4(iemOp_InvalidNeedRM),
1857 /* 0x48 */ IEMOP_X4(iemOp_InvalidNeedRM),
1858 /* 0x49 */ IEMOP_X4(iemOp_InvalidNeedRM),
1859 /* 0x4a */ IEMOP_X4(iemOp_InvalidNeedRM),
1860 /* 0x4b */ IEMOP_X4(iemOp_InvalidNeedRM),
1861 /* 0x4c */ IEMOP_X4(iemOp_InvalidNeedRM),
1862 /* 0x4d */ IEMOP_X4(iemOp_InvalidNeedRM),
1863 /* 0x4e */ IEMOP_X4(iemOp_InvalidNeedRM),
1864 /* 0x4f */ IEMOP_X4(iemOp_InvalidNeedRM),
1865
1866 /* 0x50 */ IEMOP_X4(iemOp_InvalidNeedRM),
1867 /* 0x51 */ IEMOP_X4(iemOp_InvalidNeedRM),
1868 /* 0x52 */ IEMOP_X4(iemOp_InvalidNeedRM),
1869 /* 0x53 */ IEMOP_X4(iemOp_InvalidNeedRM),
1870 /* 0x54 */ IEMOP_X4(iemOp_InvalidNeedRM),
1871 /* 0x55 */ IEMOP_X4(iemOp_InvalidNeedRM),
1872 /* 0x56 */ IEMOP_X4(iemOp_InvalidNeedRM),
1873 /* 0x57 */ IEMOP_X4(iemOp_InvalidNeedRM),
1874 /* 0x58 */ IEMOP_X4(iemOp_InvalidNeedRM),
1875 /* 0x59 */ IEMOP_X4(iemOp_InvalidNeedRM),
1876 /* 0x5a */ IEMOP_X4(iemOp_InvalidNeedRM),
1877 /* 0x5b */ IEMOP_X4(iemOp_InvalidNeedRM),
1878 /* 0x5c */ IEMOP_X4(iemOp_InvalidNeedRM),
1879 /* 0x5d */ IEMOP_X4(iemOp_InvalidNeedRM),
1880 /* 0x5e */ IEMOP_X4(iemOp_InvalidNeedRM),
1881 /* 0x5f */ IEMOP_X4(iemOp_InvalidNeedRM),
1882
1883 /* 0x60 */ IEMOP_X4(iemOp_InvalidNeedRM),
1884 /* 0x61 */ IEMOP_X4(iemOp_InvalidNeedRM),
1885 /* 0x62 */ IEMOP_X4(iemOp_InvalidNeedRM),
1886 /* 0x63 */ IEMOP_X4(iemOp_InvalidNeedRM),
1887 /* 0x64 */ IEMOP_X4(iemOp_InvalidNeedRM),
1888 /* 0x65 */ IEMOP_X4(iemOp_InvalidNeedRM),
1889 /* 0x66 */ IEMOP_X4(iemOp_InvalidNeedRM),
1890 /* 0x67 */ IEMOP_X4(iemOp_InvalidNeedRM),
1891 /* 0x68 */ IEMOP_X4(iemOp_InvalidNeedRM),
1892 /* 0x69 */ IEMOP_X4(iemOp_InvalidNeedRM),
1893 /* 0x6a */ IEMOP_X4(iemOp_InvalidNeedRM),
1894 /* 0x6b */ IEMOP_X4(iemOp_InvalidNeedRM),
1895 /* 0x6c */ IEMOP_X4(iemOp_InvalidNeedRM),
1896 /* 0x6d */ IEMOP_X4(iemOp_InvalidNeedRM),
1897 /* 0x6e */ IEMOP_X4(iemOp_InvalidNeedRM),
1898 /* 0x6f */ IEMOP_X4(iemOp_InvalidNeedRM),
1899
1900 /* 0x70 */ IEMOP_X4(iemOp_InvalidNeedRM),
1901 /* 0x71 */ IEMOP_X4(iemOp_InvalidNeedRM),
1902 /* 0x72 */ IEMOP_X4(iemOp_InvalidNeedRM),
1903 /* 0x73 */ IEMOP_X4(iemOp_InvalidNeedRM),
1904 /* 0x74 */ IEMOP_X4(iemOp_InvalidNeedRM),
1905 /* 0x75 */ IEMOP_X4(iemOp_InvalidNeedRM),
1906 /* 0x76 */ IEMOP_X4(iemOp_InvalidNeedRM),
1907 /* 0x77 */ IEMOP_X4(iemOp_InvalidNeedRM),
1908 /* 0x78 */ IEMOP_X4(iemOp_InvalidNeedRM),
1909 /* 0x79 */ IEMOP_X4(iemOp_InvalidNeedRM),
1910 /* 0x7a */ IEMOP_X4(iemOp_InvalidNeedRM),
1911 /* 0x7b */ IEMOP_X4(iemOp_InvalidNeedRM),
1912 /* 0x7c */ IEMOP_X4(iemOp_InvalidNeedRM),
1913 /* 0x7d */ IEMOP_X4(iemOp_InvalidNeedRM),
1914 /* 0x7e */ IEMOP_X4(iemOp_InvalidNeedRM),
1915 /* 0x7f */ IEMOP_X4(iemOp_InvalidNeedRM),
1916
1917 /* 0x80 */ iemOp_InvalidNeedRM, iemOp_invept_Gy_Mdq, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM,
1918 /* 0x81 */ iemOp_InvalidNeedRM, iemOp_invvpid_Gy_Mdq, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM,
1919 /* 0x82 */ iemOp_InvalidNeedRM, iemOp_invpcid_Gy_Mdq, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM,
1920 /* 0x83 */ IEMOP_X4(iemOp_InvalidNeedRM),
1921 /* 0x84 */ IEMOP_X4(iemOp_InvalidNeedRM),
1922 /* 0x85 */ IEMOP_X4(iemOp_InvalidNeedRM),
1923 /* 0x86 */ IEMOP_X4(iemOp_InvalidNeedRM),
1924 /* 0x87 */ IEMOP_X4(iemOp_InvalidNeedRM),
1925 /* 0x88 */ IEMOP_X4(iemOp_InvalidNeedRM),
1926 /* 0x89 */ IEMOP_X4(iemOp_InvalidNeedRM),
1927 /* 0x8a */ IEMOP_X4(iemOp_InvalidNeedRM),
1928 /* 0x8b */ IEMOP_X4(iemOp_InvalidNeedRM),
1929 /* 0x8c */ IEMOP_X4(iemOp_InvalidNeedRM),
1930 /* 0x8d */ IEMOP_X4(iemOp_InvalidNeedRM),
1931 /* 0x8e */ IEMOP_X4(iemOp_InvalidNeedRM),
1932 /* 0x8f */ IEMOP_X4(iemOp_InvalidNeedRM),
1933
1934 /* 0x90 */ IEMOP_X4(iemOp_InvalidNeedRM),
1935 /* 0x91 */ IEMOP_X4(iemOp_InvalidNeedRM),
1936 /* 0x92 */ IEMOP_X4(iemOp_InvalidNeedRM),
1937 /* 0x93 */ IEMOP_X4(iemOp_InvalidNeedRM),
1938 /* 0x94 */ IEMOP_X4(iemOp_InvalidNeedRM),
1939 /* 0x95 */ IEMOP_X4(iemOp_InvalidNeedRM),
1940 /* 0x96 */ IEMOP_X4(iemOp_InvalidNeedRM),
1941 /* 0x97 */ IEMOP_X4(iemOp_InvalidNeedRM),
1942 /* 0x98 */ IEMOP_X4(iemOp_InvalidNeedRM),
1943 /* 0x99 */ IEMOP_X4(iemOp_InvalidNeedRM),
1944 /* 0x9a */ IEMOP_X4(iemOp_InvalidNeedRM),
1945 /* 0x9b */ IEMOP_X4(iemOp_InvalidNeedRM),
1946 /* 0x9c */ IEMOP_X4(iemOp_InvalidNeedRM),
1947 /* 0x9d */ IEMOP_X4(iemOp_InvalidNeedRM),
1948 /* 0x9e */ IEMOP_X4(iemOp_InvalidNeedRM),
1949 /* 0x9f */ IEMOP_X4(iemOp_InvalidNeedRM),
1950
1951 /* 0xa0 */ IEMOP_X4(iemOp_InvalidNeedRM),
1952 /* 0xa1 */ IEMOP_X4(iemOp_InvalidNeedRM),
1953 /* 0xa2 */ IEMOP_X4(iemOp_InvalidNeedRM),
1954 /* 0xa3 */ IEMOP_X4(iemOp_InvalidNeedRM),
1955 /* 0xa4 */ IEMOP_X4(iemOp_InvalidNeedRM),
1956 /* 0xa5 */ IEMOP_X4(iemOp_InvalidNeedRM),
1957 /* 0xa6 */ IEMOP_X4(iemOp_InvalidNeedRM),
1958 /* 0xa7 */ IEMOP_X4(iemOp_InvalidNeedRM),
1959 /* 0xa8 */ IEMOP_X4(iemOp_InvalidNeedRM),
1960 /* 0xa9 */ IEMOP_X4(iemOp_InvalidNeedRM),
1961 /* 0xaa */ IEMOP_X4(iemOp_InvalidNeedRM),
1962 /* 0xab */ IEMOP_X4(iemOp_InvalidNeedRM),
1963 /* 0xac */ IEMOP_X4(iemOp_InvalidNeedRM),
1964 /* 0xad */ IEMOP_X4(iemOp_InvalidNeedRM),
1965 /* 0xae */ IEMOP_X4(iemOp_InvalidNeedRM),
1966 /* 0xaf */ IEMOP_X4(iemOp_InvalidNeedRM),
1967
1968 /* 0xb0 */ IEMOP_X4(iemOp_InvalidNeedRM),
1969 /* 0xb1 */ IEMOP_X4(iemOp_InvalidNeedRM),
1970 /* 0xb2 */ IEMOP_X4(iemOp_InvalidNeedRM),
1971 /* 0xb3 */ IEMOP_X4(iemOp_InvalidNeedRM),
1972 /* 0xb4 */ IEMOP_X4(iemOp_InvalidNeedRM),
1973 /* 0xb5 */ IEMOP_X4(iemOp_InvalidNeedRM),
1974 /* 0xb6 */ IEMOP_X4(iemOp_InvalidNeedRM),
1975 /* 0xb7 */ IEMOP_X4(iemOp_InvalidNeedRM),
1976 /* 0xb8 */ IEMOP_X4(iemOp_InvalidNeedRM),
1977 /* 0xb9 */ IEMOP_X4(iemOp_InvalidNeedRM),
1978 /* 0xba */ IEMOP_X4(iemOp_InvalidNeedRM),
1979 /* 0xbb */ IEMOP_X4(iemOp_InvalidNeedRM),
1980 /* 0xbc */ IEMOP_X4(iemOp_InvalidNeedRM),
1981 /* 0xbd */ IEMOP_X4(iemOp_InvalidNeedRM),
1982 /* 0xbe */ IEMOP_X4(iemOp_InvalidNeedRM),
1983 /* 0xbf */ IEMOP_X4(iemOp_InvalidNeedRM),
1984
1985 /* 0xc0 */ IEMOP_X4(iemOp_InvalidNeedRM),
1986 /* 0xc1 */ IEMOP_X4(iemOp_InvalidNeedRM),
1987 /* 0xc2 */ IEMOP_X4(iemOp_InvalidNeedRM),
1988 /* 0xc3 */ IEMOP_X4(iemOp_InvalidNeedRM),
1989 /* 0xc4 */ IEMOP_X4(iemOp_InvalidNeedRM),
1990 /* 0xc5 */ IEMOP_X4(iemOp_InvalidNeedRM),
1991 /* 0xc6 */ IEMOP_X4(iemOp_InvalidNeedRM),
1992 /* 0xc7 */ IEMOP_X4(iemOp_InvalidNeedRM),
1993 /* 0xc8 */ iemOp_sha1nexte_Vdq_Wdq, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM,
1994 /* 0xc9 */ iemOp_sha1msg1_Vdq_Wdq, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM,
1995 /* 0xca */ iemOp_sha1msg2_Vdq_Wdq, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM,
1996 /* 0xcb */ iemOp_sha256rnds2_Vdq_Wdq, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM,
1997 /* 0xcc */ iemOp_sha256msg1_Vdq_Wdq, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM,
1998 /* 0xcd */ iemOp_sha256msg2_Vdq_Wdq, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM,
1999 /* 0xce */ IEMOP_X4(iemOp_InvalidNeedRM),
2000 /* 0xcf */ IEMOP_X4(iemOp_InvalidNeedRM),
2001
2002 /* 0xd0 */ IEMOP_X4(iemOp_InvalidNeedRM),
2003 /* 0xd1 */ IEMOP_X4(iemOp_InvalidNeedRM),
2004 /* 0xd2 */ IEMOP_X4(iemOp_InvalidNeedRM),
2005 /* 0xd3 */ IEMOP_X4(iemOp_InvalidNeedRM),
2006 /* 0xd4 */ IEMOP_X4(iemOp_InvalidNeedRM),
2007 /* 0xd5 */ IEMOP_X4(iemOp_InvalidNeedRM),
2008 /* 0xd6 */ IEMOP_X4(iemOp_InvalidNeedRM),
2009 /* 0xd7 */ IEMOP_X4(iemOp_InvalidNeedRM),
2010 /* 0xd8 */ IEMOP_X4(iemOp_InvalidNeedRM),
2011 /* 0xd9 */ IEMOP_X4(iemOp_InvalidNeedRM),
2012 /* 0xda */ IEMOP_X4(iemOp_InvalidNeedRM),
2013 /* 0xdb */ iemOp_InvalidNeedRM, iemOp_aesimc_Vdq_Wdq, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM,
2014 /* 0xdc */ iemOp_InvalidNeedRM, iemOp_aesenc_Vdq_Wdq, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM,
2015 /* 0xdd */ iemOp_InvalidNeedRM, iemOp_aesenclast_Vdq_Wdq, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM,
2016 /* 0xde */ iemOp_InvalidNeedRM, iemOp_aesdec_Vdq_Wdq, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM,
2017 /* 0xdf */ iemOp_InvalidNeedRM, iemOp_aesdeclast_Vdq_Wdq, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM,
2018
2019 /* 0xe0 */ IEMOP_X4(iemOp_InvalidNeedRM),
2020 /* 0xe1 */ IEMOP_X4(iemOp_InvalidNeedRM),
2021 /* 0xe2 */ IEMOP_X4(iemOp_InvalidNeedRM),
2022 /* 0xe3 */ IEMOP_X4(iemOp_InvalidNeedRM),
2023 /* 0xe4 */ IEMOP_X4(iemOp_InvalidNeedRM),
2024 /* 0xe5 */ IEMOP_X4(iemOp_InvalidNeedRM),
2025 /* 0xe6 */ IEMOP_X4(iemOp_InvalidNeedRM),
2026 /* 0xe7 */ IEMOP_X4(iemOp_InvalidNeedRM),
2027 /* 0xe8 */ IEMOP_X4(iemOp_InvalidNeedRM),
2028 /* 0xe9 */ IEMOP_X4(iemOp_InvalidNeedRM),
2029 /* 0xea */ IEMOP_X4(iemOp_InvalidNeedRM),
2030 /* 0xeb */ IEMOP_X4(iemOp_InvalidNeedRM),
2031 /* 0xec */ IEMOP_X4(iemOp_InvalidNeedRM),
2032 /* 0xed */ IEMOP_X4(iemOp_InvalidNeedRM),
2033 /* 0xee */ IEMOP_X4(iemOp_InvalidNeedRM),
2034 /* 0xef */ IEMOP_X4(iemOp_InvalidNeedRM),
2035
2036 /* 0xf0 */ iemOp_movbe_Gy_My, iemOp_movbe_Gw_Mw, iemOp_InvalidNeedRM, iemOp_crc32_Gd_Eb,
2037 /* 0xf1 */ iemOp_movbe_My_Gy, iemOp_movbe_Mw_Gw, iemOp_InvalidNeedRM, iemOp_crc32_Gv_Ev,
2038 /* 0xf2 */ IEMOP_X4(iemOp_InvalidNeedRM),
2039 /* 0xf3 */ IEMOP_X4(iemOp_InvalidNeedRM),
2040 /* 0xf4 */ IEMOP_X4(iemOp_InvalidNeedRM),
2041 /* 0xf5 */ IEMOP_X4(iemOp_InvalidNeedRM),
2042 /* 0xf6 */ iemOp_InvalidNeedRM, iemOp_adcx_Gy_Ey, iemOp_adox_Gy_Ey, iemOp_InvalidNeedRM,
2043 /* 0xf7 */ IEMOP_X4(iemOp_InvalidNeedRM),
2044 /* 0xf8 */ IEMOP_X4(iemOp_InvalidNeedRM),
2045 /* 0xf9 */ IEMOP_X4(iemOp_InvalidNeedRM),
2046 /* 0xfa */ IEMOP_X4(iemOp_InvalidNeedRM),
2047 /* 0xfb */ IEMOP_X4(iemOp_InvalidNeedRM),
2048 /* 0xfc */ IEMOP_X4(iemOp_InvalidNeedRM),
2049 /* 0xfd */ IEMOP_X4(iemOp_InvalidNeedRM),
2050 /* 0xfe */ IEMOP_X4(iemOp_InvalidNeedRM),
2051 /* 0xff */ IEMOP_X4(iemOp_InvalidNeedRM),
2052};
2053AssertCompile(RT_ELEMENTS(g_apfnThreeByte0f38) == 1024);
2054
2055/** @} */
2056
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette