- Timestamp:
- Sep 13, 2022 9:09:57 AM (2 years ago)
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/IEMAllAImpl.asm
r96707 r96713 5427 5427 dw 0x105ff - (.immEnd - .imm0) ; will cause warning if entries are too small. 5428 5428 ENDPROC iemAImpl_vpextrw_u128 5429 5430 5431 ;; 5432 ; movmskp{s,d} SSE instruction template 5433 ; 5434 ; @param 1 The SSE instruction name. 5435 ; @param 2 The AVX instruction name. 5436 ; 5437 ; @param A0 Pointer to the output register (output/byte sized). 5438 ; @param A1 Pointer to the source media register size operand (input). 5439 ; 5440 %macro IEMIMPL_MEDIA_MOVMSK_P 2 5441 BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u128, 16 5442 PROLOGUE_2_ARGS 5443 IEMIMPL_SSE_PROLOGUE 5444 5445 movdqu xmm0, [A1] 5446 %1 T0, xmm0 5447 mov byte [A0], T0_8 5448 5449 IEMIMPL_SSE_EPILOGUE 5450 EPILOGUE_2_ARGS 5451 ENDPROC iemAImpl_ %+ %1 %+ _u128 5452 5453 BEGINPROC_FASTCALL iemAImpl_ %+ %2 %+ _u128, 16 5454 PROLOGUE_2_ARGS 5455 IEMIMPL_AVX_PROLOGUE 5456 5457 movdqu xmm0, [A1] 5458 %2 T0, xmm0 5459 mov byte [A0], T0_8 5460 5461 IEMIMPL_AVX_EPILOGUE 5462 EPILOGUE_2_ARGS 5463 ENDPROC iemAImpl_ %+ %2 %+ _u128 5464 5465 BEGINPROC_FASTCALL iemAImpl_ %+ %2 %+ _u256, 16 5466 PROLOGUE_2_ARGS 5467 IEMIMPL_AVX_PROLOGUE 5468 5469 vmovdqu ymm0, [A1] 5470 %2 T0, ymm0 5471 mov byte [A0], T0_8 5472 5473 IEMIMPL_AVX_EPILOGUE 5474 EPILOGUE_2_ARGS 5475 ENDPROC iemAImpl_ %+ %2 %+ _u256 5476 %endmacro 5477 5478 IEMIMPL_MEDIA_MOVMSK_P movmskps, vmovmskps 5479 IEMIMPL_MEDIA_MOVMSK_P movmskpd, vmovmskpd -
trunk/src/VBox/VMM/VMMAll/IEMAllAImplC.cpp
r96707 r96713 15935 15935 *pu16Dst = puSrc->au16[bEvil & 0x7]; 15936 15936 } 15937 15938 15939 /** 15940 * [V]MOVMSKPS 15941 */ 15942 #ifdef IEM_WITHOUT_ASSEMBLY 15943 IEM_DECL_IMPL_DEF(void, iemAImpl_movmskps_u128,(uint8_t *pu8Dst, PCRTUINT128U puSrc)) 15944 { 15945 *pu8Dst = puSrc->au32[0] >> 31; 15946 *pu8Dst |= (puSrc->au32[1] >> 31) << 1; 15947 *pu8Dst |= (puSrc->au32[2] >> 31) << 2; 15948 *pu8Dst |= (puSrc->au32[3] >> 31) << 3; 15949 } 15950 15951 #endif 15952 15953 IEM_DECL_IMPL_DEF(void, iemAImpl_vmovmskps_u128_fallback,(uint8_t *pu8Dst, PCRTUINT128U puSrc)) 15954 { 15955 *pu8Dst = puSrc->au32[0] >> 31; 15956 *pu8Dst |= (puSrc->au32[1] >> 31) << 1; 15957 *pu8Dst |= (puSrc->au32[2] >> 31) << 2; 15958 *pu8Dst |= (puSrc->au32[3] >> 31) << 3; 15959 } 15960 15961 15962 IEM_DECL_IMPL_DEF(void, iemAImpl_vmovmskps_u256_fallback,(uint8_t *pu8Dst, PCRTUINT256U puSrc)) 15963 { 15964 *pu8Dst = puSrc->au32[0] >> 31; 15965 *pu8Dst |= (puSrc->au32[1] >> 31) << 1; 15966 *pu8Dst |= (puSrc->au32[2] >> 31) << 2; 15967 *pu8Dst |= (puSrc->au32[3] >> 31) << 3; 15968 *pu8Dst |= (puSrc->au32[4] >> 31) << 4; 15969 *pu8Dst |= (puSrc->au32[5] >> 31) << 5; 15970 *pu8Dst |= (puSrc->au32[6] >> 31) << 6; 15971 *pu8Dst |= (puSrc->au32[7] >> 31) << 7; 15972 } 15973 15974 15975 /** 15976 * [V]MOVMSKPD 15977 */ 15978 #ifdef IEM_WITHOUT_ASSEMBLY 15979 IEM_DECL_IMPL_DEF(void, iemAImpl_movmskpd_u128,(uint8_t *pu8Dst, PCRTUINT128U puSrc)) 15980 { 15981 *pu8Dst = puSrc->au64[0] >> 63; 15982 *pu8Dst |= (puSrc->au64[1] >> 63) << 1; 15983 } 15984 15985 #endif 15986 15987 IEM_DECL_IMPL_DEF(void, iemAImpl_vmovmskpd_u128_fallback,(uint8_t *pu8Dst, PCRTUINT128U puSrc)) 15988 { 15989 *pu8Dst = puSrc->au64[0] >> 63; 15990 *pu8Dst |= (puSrc->au64[1] >> 63) << 1; 15991 } 15992 15993 15994 IEM_DECL_IMPL_DEF(void, iemAImpl_vmovmskpd_u256_fallback,(uint8_t *pu8Dst, PCRTUINT256U puSrc)) 15995 { 15996 *pu8Dst = puSrc->au64[0] >> 63; 15997 *pu8Dst |= (puSrc->au64[1] >> 63) << 1; 15998 *pu8Dst |= (puSrc->au64[2] >> 63) << 2; 15999 *pu8Dst |= (puSrc->au64[3] >> 63) << 3; 16000 } -
trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsTwoByte0f.cpp.h
r96707 r96713 4019 4019 4020 4020 /** Opcode 0x0f 0x50 - movmskps Gy, Ups */ 4021 FNIEMOP_STUB(iemOp_movmskps_Gy_Ups); 4021 FNIEMOP_DEF(iemOp_movmskps_Gy_Ups) 4022 { 4023 IEMOP_MNEMONIC2(RM_REG, MOVMSKPS, movmskps, Gy, Ux, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, 0); /** @todo */ 4024 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); 4025 if (IEM_IS_MODRM_REG_MODE(bRm)) 4026 { 4027 /* 4028 * Register, register. 4029 */ 4030 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); 4031 IEM_MC_BEGIN(2, 1); 4032 IEM_MC_LOCAL(uint8_t, u8Dst); 4033 IEM_MC_ARG_LOCAL_REF(uint8_t *, pu8Dst, u8Dst, 0); 4034 IEM_MC_ARG(PCRTUINT128U, puSrc, 1); 4035 IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT(); 4036 IEM_MC_PREPARE_SSE_USAGE(); 4037 IEM_MC_REF_XREG_U128_CONST(puSrc, IEM_GET_MODRM_RM(pVCpu, bRm)); 4038 IEM_MC_CALL_VOID_AIMPL_2(iemAImpl_movmskps_u128, pu8Dst, puSrc); 4039 IEM_MC_STORE_GREG_U32(IEM_GET_MODRM_REG(pVCpu, bRm), u8Dst); 4040 IEM_MC_ADVANCE_RIP(); 4041 IEM_MC_END(); 4042 return VINF_SUCCESS; 4043 } 4044 4045 /* No memory operand. */ 4046 return IEMOP_RAISE_INVALID_OPCODE(); 4047 } 4048 4049 4022 4050 /** Opcode 0x66 0x0f 0x50 - movmskpd Gy, Upd */ 4023 FNIEMOP_STUB(iemOp_movmskpd_Gy_Upd); 4051 FNIEMOP_DEF(iemOp_movmskpd_Gy_Upd) 4052 { 4053 IEMOP_MNEMONIC2(RM_REG, MOVMSKPD, movmskpd, Gy, Ux, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, 0); /** @todo */ 4054 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); 4055 if (IEM_IS_MODRM_REG_MODE(bRm)) 4056 { 4057 /* 4058 * Register, register. 4059 */ 4060 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); 4061 IEM_MC_BEGIN(2, 1); 4062 IEM_MC_LOCAL(uint8_t, u8Dst); 4063 IEM_MC_ARG_LOCAL_REF(uint8_t *, pu8Dst, u8Dst, 0); 4064 IEM_MC_ARG(PCRTUINT128U, puSrc, 1); 4065 IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT(); 4066 IEM_MC_PREPARE_SSE_USAGE(); 4067 IEM_MC_REF_XREG_U128_CONST(puSrc, IEM_GET_MODRM_RM(pVCpu, bRm)); 4068 IEM_MC_CALL_VOID_AIMPL_2(iemAImpl_movmskpd_u128, pu8Dst, puSrc); 4069 IEM_MC_STORE_GREG_U32(IEM_GET_MODRM_REG(pVCpu, bRm), u8Dst); 4070 IEM_MC_ADVANCE_RIP(); 4071 IEM_MC_END(); 4072 return VINF_SUCCESS; 4073 } 4074 4075 /* No memory operand. */ 4076 return IEMOP_RAISE_INVALID_OPCODE(); 4077 4078 } 4079 4080 4024 4081 /* Opcode 0xf3 0x0f 0x50 - invalid */ 4025 4082 /* Opcode 0xf2 0x0f 0x50 - invalid */ -
trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsVexMap1.cpp.h
r96707 r96713 2349 2349 /* Opcode VEX.0F 0x4f - invalid */ 2350 2350 2351 2351 2352 /** Opcode VEX.0F 0x50 - vmovmskps Gy, Ups */ 2352 FNIEMOP_STUB(iemOp_vmovmskps_Gy_Ups); 2353 FNIEMOP_DEF(iemOp_vmovmskps_Gy_Ups) 2354 { 2355 IEMOP_MNEMONIC2(VEX_RM_REG, VMOVMSKPS, vmovmskps, Gd, Ux, DISOPTYPE_HARMLESS, IEMOPHINT_VEX_L_ZERO); 2356 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); 2357 if (IEM_IS_MODRM_REG_MODE(bRm)) 2358 { 2359 /* 2360 * Register, register. 2361 */ 2362 if (pVCpu->iem.s.uVexLength == 0) 2363 { 2364 IEMOP_HLP_DONE_VEX_DECODING(); 2365 IEM_MC_BEGIN(2, 1); 2366 IEM_MC_LOCAL(uint8_t, u8Dst); 2367 IEM_MC_ARG_LOCAL_REF(uint8_t *, pu8Dst, u8Dst, 0); 2368 IEM_MC_ARG(PCRTUINT128U, puSrc, 1); 2369 IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT(); 2370 IEM_MC_PREPARE_AVX_USAGE(); 2371 IEM_MC_REF_XREG_U128_CONST(puSrc, IEM_GET_MODRM_RM(pVCpu, bRm)); 2372 IEM_MC_CALL_VOID_AIMPL_2(IEM_SELECT_HOST_OR_FALLBACK(fAvx, iemAImpl_vmovmskps_u128, iemAImpl_vmovmskps_u128_fallback), 2373 pu8Dst, puSrc); 2374 IEM_MC_STORE_GREG_U32(IEM_GET_MODRM_REG(pVCpu, bRm), u8Dst); 2375 IEM_MC_ADVANCE_RIP(); 2376 IEM_MC_END(); 2377 } 2378 else 2379 { 2380 IEMOP_HLP_DONE_VEX_DECODING(); 2381 IEM_MC_BEGIN(2, 2); 2382 IEM_MC_LOCAL(uint8_t, u8Dst); 2383 IEM_MC_LOCAL(RTUINT256U, uSrc); 2384 IEM_MC_ARG_LOCAL_REF(uint8_t *, pu8Dst, u8Dst, 0); 2385 IEM_MC_ARG_LOCAL_REF(PCRTUINT256U, puSrc, uSrc, 1); 2386 2387 IEM_MC_MAYBE_RAISE_AVX2_RELATED_XCPT(); 2388 IEM_MC_PREPARE_AVX_USAGE(); 2389 IEM_MC_FETCH_YREG_U256(uSrc, IEM_GET_MODRM_RM(pVCpu, bRm)); 2390 IEM_MC_CALL_VOID_AIMPL_2(IEM_SELECT_HOST_OR_FALLBACK(fAvx2, iemAImpl_vmovmskps_u256, iemAImpl_vmovmskps_u256_fallback), 2391 pu8Dst, puSrc); 2392 IEM_MC_STORE_GREG_U32(IEM_GET_MODRM_REG(pVCpu, bRm), u8Dst); 2393 IEM_MC_ADVANCE_RIP(); 2394 IEM_MC_END(); 2395 } 2396 return VINF_SUCCESS; 2397 } 2398 2399 /* No memory operand. */ 2400 return IEMOP_RAISE_INVALID_OPCODE(); 2401 } 2402 2403 2353 2404 /** Opcode VEX.66.0F 0x50 - vmovmskpd Gy,Upd */ 2354 FNIEMOP_STUB(iemOp_vmovmskpd_Gy_Upd); 2405 FNIEMOP_DEF(iemOp_vmovmskpd_Gy_Upd) 2406 { 2407 { 2408 IEMOP_MNEMONIC2(VEX_RM_REG, VMOVMSKPD, vmovmskpd, Gd, Ux, DISOPTYPE_HARMLESS, IEMOPHINT_VEX_L_ZERO); 2409 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); 2410 if (IEM_IS_MODRM_REG_MODE(bRm)) 2411 { 2412 /* 2413 * Register, register. 2414 */ 2415 if (pVCpu->iem.s.uVexLength == 0) 2416 { 2417 IEMOP_HLP_DONE_VEX_DECODING(); 2418 IEM_MC_BEGIN(2, 1); 2419 IEM_MC_LOCAL(uint8_t, u8Dst); 2420 IEM_MC_ARG_LOCAL_REF(uint8_t *, pu8Dst, u8Dst, 0); 2421 IEM_MC_ARG(PCRTUINT128U, puSrc, 1); 2422 IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT(); 2423 IEM_MC_PREPARE_AVX_USAGE(); 2424 IEM_MC_REF_XREG_U128_CONST(puSrc, IEM_GET_MODRM_RM(pVCpu, bRm)); 2425 IEM_MC_CALL_VOID_AIMPL_2(IEM_SELECT_HOST_OR_FALLBACK(fAvx, iemAImpl_vmovmskpd_u128, iemAImpl_vmovmskpd_u128_fallback), 2426 pu8Dst, puSrc); 2427 IEM_MC_STORE_GREG_U32(IEM_GET_MODRM_REG(pVCpu, bRm), u8Dst); 2428 IEM_MC_ADVANCE_RIP(); 2429 IEM_MC_END(); 2430 } 2431 else 2432 { 2433 IEMOP_HLP_DONE_VEX_DECODING(); 2434 IEM_MC_BEGIN(2, 2); 2435 IEM_MC_LOCAL(uint8_t, u8Dst); 2436 IEM_MC_LOCAL(RTUINT256U, uSrc); 2437 IEM_MC_ARG_LOCAL_REF(uint8_t *, pu8Dst, u8Dst, 0); 2438 IEM_MC_ARG_LOCAL_REF(PCRTUINT256U, puSrc, uSrc, 1); 2439 2440 IEM_MC_MAYBE_RAISE_AVX2_RELATED_XCPT(); 2441 IEM_MC_PREPARE_AVX_USAGE(); 2442 IEM_MC_FETCH_YREG_U256(uSrc, IEM_GET_MODRM_RM(pVCpu, bRm)); 2443 IEM_MC_CALL_VOID_AIMPL_2(IEM_SELECT_HOST_OR_FALLBACK(fAvx2, iemAImpl_vmovmskpd_u256, iemAImpl_vmovmskpd_u256_fallback), 2444 pu8Dst, puSrc); 2445 IEM_MC_STORE_GREG_U32(IEM_GET_MODRM_REG(pVCpu, bRm), u8Dst); 2446 IEM_MC_ADVANCE_RIP(); 2447 IEM_MC_END(); 2448 } 2449 return VINF_SUCCESS; 2450 } 2451 2452 /* No memory operand. */ 2453 return IEMOP_RAISE_INVALID_OPCODE(); 2454 } 2455 } 2456 2457 2355 2458 /* Opcode VEX.F3.0F 0x50 - invalid */ 2356 2459 /* Opcode VEX.F2.0F 0x50 - invalid */ -
trunk/src/VBox/VMM/include/IEMInternal.h
r96707 r96713 2226 2226 IEM_DECL_IMPL_DEF(void, iemAImpl_vpextrw_u128,(uint16_t *pu16Dst, PCRTUINT128U puSrc, uint8_t bEvil)); 2227 2227 IEM_DECL_IMPL_DEF(void, iemAImpl_vpextrw_u128_fallback,(uint16_t *pu16Dst, PCRTUINT128U puSrc, uint8_t bEvil)); 2228 2229 IEM_DECL_IMPL_DEF(void, iemAImpl_movmskps_u128,(uint8_t *pu8Dst, PCRTUINT128U puSrc)); 2230 IEM_DECL_IMPL_DEF(void, iemAImpl_vmovmskps_u128,(uint8_t *pu8Dst, PCRTUINT128U puSrc)); 2231 IEM_DECL_IMPL_DEF(void, iemAImpl_vmovmskps_u128_fallback,(uint8_t *pu8Dst, PCRTUINT128U puSrc)); 2232 IEM_DECL_IMPL_DEF(void, iemAImpl_vmovmskps_u256,(uint8_t *pu8Dst, PCRTUINT256U puSrc)); 2233 IEM_DECL_IMPL_DEF(void, iemAImpl_vmovmskps_u256_fallback,(uint8_t *pu8Dst, PCRTUINT256U puSrc)); 2234 2235 IEM_DECL_IMPL_DEF(void, iemAImpl_movmskpd_u128,(uint8_t *pu8Dst, PCRTUINT128U puSrc)); 2236 IEM_DECL_IMPL_DEF(void, iemAImpl_vmovmskpd_u128,(uint8_t *pu8Dst, PCRTUINT128U puSrc)); 2237 IEM_DECL_IMPL_DEF(void, iemAImpl_vmovmskpd_u128_fallback,(uint8_t *pu8Dst, PCRTUINT128U puSrc)); 2238 IEM_DECL_IMPL_DEF(void, iemAImpl_vmovmskpd_u256,(uint8_t *pu8Dst, PCRTUINT256U puSrc)); 2239 IEM_DECL_IMPL_DEF(void, iemAImpl_vmovmskpd_u256_fallback,(uint8_t *pu8Dst, PCRTUINT256U puSrc)); 2228 2240 2229 2241
Note:
See TracChangeset
for help on using the changeset viewer.