Changeset 96624 in vbox for trunk/src/VBox
- Timestamp:
- Sep 7, 2022 10:20:13 AM (2 years ago)
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/IEMAllAImpl.asm
r96537 r96624 5182 5182 IEMIMPL_MEDIA_AVX_INSN_IMM8_6 vpblendw 5183 5183 IEMIMPL_MEDIA_AVX_INSN_IMM8_6 vpalignr 5184 5185 5186 ;; 5187 ; Need to move this as well somewhere better? 5188 ; 5189 struc IEMPCMPISTRISRC 5190 .uSrc1 resd 4 5191 .uSrc2 resd 4 5192 endstruc 5193 5194 ;; 5195 ; The pcmpistri instruction. 5196 ; 5197 ; @param A0 Pointer to the ECX register to store the result to (output). 5198 ; @param A1 Pointer to the EFLAGS register. 5199 ; @param A2 Pointer to the structure containing the source operands (input). 5200 ; @param A3 The 8-bit immediate 5201 ; 5202 BEGINPROC_FASTCALL iemAImpl_pcmpistri_u128, 16 5203 PROLOGUE_4_ARGS 5204 IEMIMPL_SSE_PROLOGUE 5205 5206 movdqu xmm0, [A2 + IEMPCMPISTRISRC.uSrc1] 5207 movdqu xmm1, [A2 + IEMPCMPISTRISRC.uSrc2] 5208 mov T2, A0 ; A0 can be ecx/rcx in some calling conventions which gets overwritten later (T2 only available on AMD64) 5209 lea T1, [.imm0 xWrtRIP] 5210 lea T0, [A3 + A3*3] ; sizeof(insnX+ret) == 8: (A3 * 4) * 2 5211 lea T1, [T1 + T0*2] 5212 call T1 5213 5214 IEM_SAVE_FLAGS A1, X86_EFL_STATUS_BITS, 0 5215 mov [T2], ecx 5216 5217 IEMIMPL_SSE_EPILOGUE 5218 EPILOGUE_4_ARGS 5219 %assign bImm 0 5220 %rep 256 5221 .imm %+ bImm: 5222 pcmpistri xmm0, xmm1, bImm 5223 ret 5224 int3 5225 %assign bImm bImm + 1 5226 %endrep 5227 .immEnd: ; 256*8 == 0x800 5228 dw 0xf7ff + (.immEnd - .imm0) ; will cause warning if entries are too big. 5229 dw 0x107ff - (.immEnd - .imm0) ; will cause warning if entries are too small. 5230 ENDPROC iemAImpl_pcmpistri_u128 -
trunk/src/VBox/VMM/VMMAll/IEMAllAImplC.cpp
r96537 r96624 15410 15410 puDst->au64[i] = puSrc1->au64[i]; 15411 15411 } 15412 15413 15414 /** 15415 * [V]PCMPISTRI 15416 */ 15417 IEM_DECL_IMPL_DEF(void, iemAImpl_pcmpistri_u128_fallback,(uint32_t *pu32Ecx, uint32_t *pEFlags, PCIEMPCMPISTRISRC pSrc, uint8_t bEvil)) 15418 { 15419 RT_NOREF(pu32Ecx, pEFlags, pSrc, bEvil); 15420 AssertReleaseFailed(); 15421 } -
trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsThree0f3a.cpp.h
r96592 r96624 375 375 /** Opcode 0x66 0x0f 0x62. */ 376 376 FNIEMOP_STUB(iemOp_pcmpistrm_Vdq_Wdq_Ib); 377 378 377 379 /** Opcode 0x66 0x0f 0x63*/ 378 FNIEMOP_STUB(iemOp_pcmpistri_Vdq_Wdq_Ib); 380 FNIEMOP_DEF(iemOp_pcmpistri_Vdq_Wdq_Ib) 381 { 382 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); 383 if (IEM_IS_MODRM_REG_MODE(bRm)) 384 { 385 /* 386 * Register, register. 387 */ 388 uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm); 389 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); 390 IEM_MC_BEGIN(4, 1); 391 IEM_MC_ARG(uint32_t *, pu32Ecx, 0); 392 IEM_MC_ARG(uint32_t *, pEFlags, 1); 393 IEM_MC_LOCAL(IEMPCMPISTRISRC, Src); 394 IEM_MC_ARG_LOCAL_REF(PIEMPCMPISTRISRC, pSrc, Src, 2); 395 IEM_MC_ARG_CONST(uint8_t, bImmArg, /*=*/ bImm, 3); 396 IEM_MC_MAYBE_RAISE_SSE41_RELATED_XCPT(); 397 IEM_MC_PREPARE_SSE_USAGE(); 398 IEM_MC_REF_GREG_U32(pu32Ecx, X86_GREG_xCX); 399 IEM_MC_FETCH_XREG_U128(Src.uSrc1, IEM_GET_MODRM_REG(pVCpu, bRm)); 400 IEM_MC_FETCH_XREG_U128(Src.uSrc2, IEM_GET_MODRM_RM(pVCpu, bRm)); 401 IEM_MC_REF_EFLAGS(pEFlags); 402 IEM_MC_CALL_VOID_AIMPL_4(IEM_SELECT_HOST_OR_FALLBACK(fSse41, 403 iemAImpl_pcmpistri_u128, 404 iemAImpl_pcmpistri_u128_fallback), 405 pu32Ecx, pEFlags, pSrc, bImmArg); 406 IEM_MC_ADVANCE_RIP(); 407 IEM_MC_END(); 408 } 409 else 410 { 411 /* 412 * Register, memory. 413 */ 414 IEM_MC_BEGIN(4, 3); 415 IEM_MC_ARG(uint32_t *, pu32Ecx, 0); 416 IEM_MC_ARG(uint32_t *, pEFlags, 1); 417 IEM_MC_LOCAL(IEMPCMPISTRISRC, Src); 418 IEM_MC_ARG_LOCAL_REF(PIEMPCMPISTRISRC, pSrc, Src, 2); 419 IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc); 420 421 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0); 422 uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm); 423 IEM_MC_ARG_CONST(uint8_t, bImmArg, /*=*/ bImm, 3); 424 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); 425 IEM_MC_MAYBE_RAISE_SSE41_RELATED_XCPT(); 426 IEM_MC_FETCH_MEM_U128_ALIGN_SSE(Src.uSrc2, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); 427 428 IEM_MC_PREPARE_SSE_USAGE(); 429 IEM_MC_REF_GREG_U32(pu32Ecx, X86_GREG_xCX); 430 IEM_MC_FETCH_XREG_U128(Src.uSrc1, IEM_GET_MODRM_REG(pVCpu, bRm)); 431 IEM_MC_REF_EFLAGS(pEFlags); 432 IEM_MC_CALL_VOID_AIMPL_4(IEM_SELECT_HOST_OR_FALLBACK(fSse41, 433 iemAImpl_pcmpistri_u128, 434 iemAImpl_pcmpistri_u128_fallback), 435 pu32Ecx, pEFlags, pSrc, bImmArg); 436 IEM_MC_ADVANCE_RIP(); 437 IEM_MC_END(); 438 } 439 return VINF_SUCCESS; 440 } 441 442 379 443 /* Opcode 0x66 0x0f 0x64 - invalid */ 380 444 /* Opcode 0x66 0x0f 0x65 - invalid */ -
trunk/src/VBox/VMM/include/IEMInternal.h
r96537 r96624 2230 2230 FNIEMAIMPLMEDIAOPTF3U256IMM8 iemAImpl_vblendps_u256, iemAImpl_vblendps_u256_fallback; 2231 2231 FNIEMAIMPLMEDIAOPTF3U256IMM8 iemAImpl_vblendpd_u256, iemAImpl_vblendpd_u256_fallback; 2232 2233 2234 typedef struct IEMPCMPISTRISRC 2235 { 2236 RTUINT128U uSrc1; 2237 RTUINT128U uSrc2; 2238 } IEMPCMPISTRISRC; 2239 typedef IEMPCMPISTRISRC *PIEMPCMPISTRISRC; 2240 typedef const IEMPCMPISTRISRC *PCIEMPCMPISTRISRC; 2241 2242 IEM_DECL_IMPL_DEF(void, iemAImpl_pcmpistri_u128,(uint32_t *pu32Ecx, uint32_t *pEFlags, PCIEMPCMPISTRISRC pSrc, uint8_t bEvil)); 2243 IEM_DECL_IMPL_DEF(void, iemAImpl_pcmpistri_u128_fallback,(uint32_t *pu32Ecx, uint32_t *pEFlags, PCIEMPCMPISTRISRC pSrc, uint8_t bEvil)); 2244 2232 2245 /** @} */ 2233 2246
Note:
See TracChangeset
for help on using the changeset viewer.