summaryrefslogtreecommitdiff
path: root/src/VBox/VMM/VMMAll/IEMAllInstructionsThree0f3a.cpp.h
diff options
context:
space:
mode:
authorvboxsync <vboxsync@cfe28804-0f27-0410-a406-dd0f0b0b656f>2022-09-07 10:20:13 +0000
committervboxsync <vboxsync@cfe28804-0f27-0410-a406-dd0f0b0b656f>2022-09-07 10:20:13 +0000
commitea214d7c9e51213e1aa1f8b8c1eea79864fbc573 (patch)
treed8567e1421ebc8a14fe312f66aef16f299fc0e16 /src/VBox/VMM/VMMAll/IEMAllInstructionsThree0f3a.cpp.h
parentbbc64e013b73346fbcac318424f316d3759083bf (diff)
downloadVirtualBox-svn-ea214d7c9e51213e1aa1f8b8c1eea79864fbc573.tar.gz
VMM/IEM: Current state of the pcmpistri isntruction (missing the C only implementation right now), bugref:9898
git-svn-id: https://www.virtualbox.org/svn/vbox/trunk@96624 cfe28804-0f27-0410-a406-dd0f0b0b656f
Diffstat (limited to 'src/VBox/VMM/VMMAll/IEMAllInstructionsThree0f3a.cpp.h')
-rw-r--r--src/VBox/VMM/VMMAll/IEMAllInstructionsThree0f3a.cpp.h66
1 files changed, 65 insertions, 1 deletions
diff --git a/src/VBox/VMM/VMMAll/IEMAllInstructionsThree0f3a.cpp.h b/src/VBox/VMM/VMMAll/IEMAllInstructionsThree0f3a.cpp.h
index c7d946983c3..f57e0b3b300 100644
--- a/src/VBox/VMM/VMMAll/IEMAllInstructionsThree0f3a.cpp.h
+++ b/src/VBox/VMM/VMMAll/IEMAllInstructionsThree0f3a.cpp.h
@@ -374,8 +374,72 @@ FNIEMOP_STUB(iemOp_pcmpestrm_Vdq_Wdq_Ib);
FNIEMOP_STUB(iemOp_pcmpestri_Vdq_Wdq_Ib);
/** Opcode 0x66 0x0f 0x62. */
FNIEMOP_STUB(iemOp_pcmpistrm_Vdq_Wdq_Ib);
+
+
/** Opcode 0x66 0x0f 0x63*/
-FNIEMOP_STUB(iemOp_pcmpistri_Vdq_Wdq_Ib);
+FNIEMOP_DEF(iemOp_pcmpistri_Vdq_Wdq_Ib)
+{
+ uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
+ if (IEM_IS_MODRM_REG_MODE(bRm))
+ {
+ /*
+ * Register, register.
+ */
+ uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm);
+ IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
+ IEM_MC_BEGIN(4, 1);
+ IEM_MC_ARG(uint32_t *, pu32Ecx, 0);
+ IEM_MC_ARG(uint32_t *, pEFlags, 1);
+ IEM_MC_LOCAL(IEMPCMPISTRISRC, Src);
+ IEM_MC_ARG_LOCAL_REF(PIEMPCMPISTRISRC, pSrc, Src, 2);
+ IEM_MC_ARG_CONST(uint8_t, bImmArg, /*=*/ bImm, 3);
+ IEM_MC_MAYBE_RAISE_SSE41_RELATED_XCPT();
+ IEM_MC_PREPARE_SSE_USAGE();
+ IEM_MC_REF_GREG_U32(pu32Ecx, X86_GREG_xCX);
+ IEM_MC_FETCH_XREG_U128(Src.uSrc1, IEM_GET_MODRM_REG(pVCpu, bRm));
+ IEM_MC_FETCH_XREG_U128(Src.uSrc2, IEM_GET_MODRM_RM(pVCpu, bRm));
+ IEM_MC_REF_EFLAGS(pEFlags);
+ IEM_MC_CALL_VOID_AIMPL_4(IEM_SELECT_HOST_OR_FALLBACK(fSse41,
+ iemAImpl_pcmpistri_u128,
+ iemAImpl_pcmpistri_u128_fallback),
+ pu32Ecx, pEFlags, pSrc, bImmArg);
+ IEM_MC_ADVANCE_RIP();
+ IEM_MC_END();
+ }
+ else
+ {
+ /*
+ * Register, memory.
+ */
+ IEM_MC_BEGIN(4, 3);
+ IEM_MC_ARG(uint32_t *, pu32Ecx, 0);
+ IEM_MC_ARG(uint32_t *, pEFlags, 1);
+ IEM_MC_LOCAL(IEMPCMPISTRISRC, Src);
+ IEM_MC_ARG_LOCAL_REF(PIEMPCMPISTRISRC, pSrc, Src, 2);
+ IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
+
+ IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
+ uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm);
+ IEM_MC_ARG_CONST(uint8_t, bImmArg, /*=*/ bImm, 3);
+ IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
+ IEM_MC_MAYBE_RAISE_SSE41_RELATED_XCPT();
+ IEM_MC_FETCH_MEM_U128_ALIGN_SSE(Src.uSrc2, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
+
+ IEM_MC_PREPARE_SSE_USAGE();
+ IEM_MC_REF_GREG_U32(pu32Ecx, X86_GREG_xCX);
+ IEM_MC_FETCH_XREG_U128(Src.uSrc1, IEM_GET_MODRM_REG(pVCpu, bRm));
+ IEM_MC_REF_EFLAGS(pEFlags);
+ IEM_MC_CALL_VOID_AIMPL_4(IEM_SELECT_HOST_OR_FALLBACK(fSse41,
+ iemAImpl_pcmpistri_u128,
+ iemAImpl_pcmpistri_u128_fallback),
+ pu32Ecx, pEFlags, pSrc, bImmArg);
+ IEM_MC_ADVANCE_RIP();
+ IEM_MC_END();
+ }
+ return VINF_SUCCESS;
+}
+
+
/* Opcode 0x66 0x0f 0x64 - invalid */
/* Opcode 0x66 0x0f 0x65 - invalid */
/* Opcode 0x66 0x0f 0x66 - invalid */