Changeset 96438 in vbox
- Timestamp:
- Aug 23, 2022 1:16:15 PM (2 years ago)
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 6 edited
-
VMMAll/IEMAllAImpl.asm (modified) (8 diffs)
-
VMMAll/IEMAllAImplC.cpp (modified) (1 diff)
-
VMMAll/IEMAllInstructionsThree0f38.cpp.h (modified) (1 diff)
-
VMMAll/IEMAllInstructionsVexMap2.cpp.h (modified) (1 diff)
-
include/IEMInternal.h (modified) (2 diffs)
-
include/IEMOpHlp.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/IEMAllAImpl.asm
r96407 r96438 3733 3733 IEMIMPL_MEDIA_OPT_F2 unpckhps, 0 3734 3734 IEMIMPL_MEDIA_OPT_F2 unpckhpd, 0 3735 IEMIMPL_MEDIA_OPT_F2 phminposuw, 0 3735 3736 3736 3737 ;; … … 4236 4237 ; 4237 4238 ; @param 1 The instruction 4239 ; @param 2 Flag whether the isntruction has a 256-bit (AVX2) variant (1) or not (0). 4238 4240 ; 4239 4241 ; @param A0 Pointer to the destination media register size operand (output). 4240 4242 ; @param A1 Pointer to the source media register size operand (input). 4241 4243 ; 4242 %macro IEMIMPL_MEDIA_OPT_F2_AVX 14244 %macro IEMIMPL_MEDIA_OPT_F2_AVX 2 4243 4245 BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u128, 12 4244 4246 PROLOGUE_2_ARGS … … 4253 4255 ENDPROC iemAImpl_ %+ %1 %+ _u128 4254 4256 4257 %if %2 == 1 4255 4258 BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u256, 12 4256 4259 PROLOGUE_2_ARGS … … 4264 4267 EPILOGUE_2_ARGS 4265 4268 ENDPROC iemAImpl_ %+ %1 %+ _u256 4266 %endmacro 4267 4268 IEMIMPL_MEDIA_OPT_F2_AVX vpabsb 4269 IEMIMPL_MEDIA_OPT_F2_AVX vpabsw 4270 IEMIMPL_MEDIA_OPT_F2_AVX vpabsd 4269 %endif 4270 %endmacro 4271 4272 IEMIMPL_MEDIA_OPT_F2_AVX vpabsb, 1 4273 IEMIMPL_MEDIA_OPT_F2_AVX vpabsw, 1 4274 IEMIMPL_MEDIA_OPT_F2_AVX vpabsd, 1 4275 IEMIMPL_MEDIA_OPT_F2_AVX vphminposuw, 0 4271 4276 4272 4277 … … 4851 4856 4852 4857 ;; 4853 ; shufp{s,d} instructions with 8-bit immediates. 4854 ; 4855 ; @param 1 The instruction name. 4858 ; shufpd instruction with 8-bit immediates. 4856 4859 ; 4857 4860 ; @param A0 Pointer to the destination media register size operand (input/output). … … 4859 4862 ; @param A2 The 8-bit immediate 4860 4863 ; 4861 %macro IEMIMPL_MEDIA_SSE_SHUFPX 1 4862 BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u128, 16 4864 BEGINPROC_FASTCALL iemAImpl_shufpd_u128, 16 4863 4865 PROLOGUE_3_ARGS 4864 4866 IEMIMPL_SSE_PROLOGUE … … 4877 4879 %rep 256 4878 4880 .imm %+ bImm: 4879 %1xmm0, xmm1, bImm4881 shufpd xmm0, xmm1, bImm 4880 4882 ret 4881 4883 %assign bImm bImm + 1 … … 4884 4886 dw 0xf9ff + (.immEnd - .imm0) ; will cause warning if entries are too big. 4885 4887 dw 0x105ff - (.immEnd - .imm0) ; will cause warning if entries are too small. 4886 ENDPROC iemAImpl_ %+ %1 %+ _u128 4887 %endmacro 4888 4889 ;IEMIMPL_MEDIA_SSE_SHUFPX shufps 4890 IEMIMPL_MEDIA_SSE_SHUFPX shufpd 4888 ENDPROC iemAImpl_shufpd_u128 4891 4889 4892 4890 -
trunk/src/VBox/VMM/VMMAll/IEMAllAImplC.cpp
r96407 r96438 15125 15125 puDst->au64[3] = (bEvil & RT_BIT(3)) ? uSrc2.au64[3] : uSrc2.au64[2]; 15126 15126 } 15127 15128 15129 /* 15130 * PHMINPOSUW / VPHMINPOSUW 15131 */ 15132 IEM_DECL_IMPL_DEF(void, iemAImpl_phminposuw_u128_fallback,(PRTUINT128U puDst, PCRTUINT128U puSrc)) 15133 { 15134 uint16_t u16Min = puSrc->au16[0]; 15135 uint8_t idxMin = 0; 15136 15137 for (uint8_t i = 1; i < RT_ELEMENTS(puSrc->au16); i++) 15138 if (puSrc->au16[i] < u16Min) 15139 { 15140 u16Min = puSrc->au16[i]; 15141 idxMin = i; 15142 } 15143 15144 puDst->au64[0] = 0; 15145 puDst->au64[1] = 0; 15146 puDst->au16[0] = u16Min; 15147 puDst->au16[1] = idxMin; 15148 } 15149 15150 15151 IEM_DECL_IMPL_DEF(void, iemAImpl_vphminposuw_u128_fallback,(PRTUINT128U puDst, PCRTUINT128U puSrc)) 15152 { 15153 iemAImpl_phminposuw_u128_fallback(puDst, puSrc); 15154 } -
trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsThree0f38.cpp.h
r96407 r96438 998 998 999 999 /** Opcode 0x66 0x0f 0x38 0x41. */ 1000 FNIEMOP_STUB(iemOp_phminposuw_Vdq_Wdq); 1000 FNIEMOP_DEF(iemOp_phminposuw_Vdq_Wdq) 1001 { 1002 IEMOP_MNEMONIC2(RM, PHMINPOSUW, phminposuw, Vdq, Wdq, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, IEMOPHINT_IGNORES_OP_SIZES); 1003 return FNIEMOP_CALL_1(iemOpCommonSse41Opt_FullFull_To_Full, 1004 IEM_SELECT_HOST_OR_FALLBACK(fSse41, iemAImpl_phminposuw_u128, iemAImpl_phminposuw_u128_fallback)); 1005 } 1006 1007 1001 1008 /* Opcode 0x66 0x0f 0x38 0x42 - invalid. */ 1002 1009 /* Opcode 0x66 0x0f 0x38 0x43 - invalid. */ -
trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsVexMap2.cpp.h
r96407 r96438 780 780 781 781 /** Opcode VEX.66.0F38 0x41. */ 782 FNIEMOP_STUB(iemOp_vphminposuw_Vdq_Wdq); 782 FNIEMOP_DEF(iemOp_vphminposuw_Vdq_Wdq) 783 { 784 IEMOP_MNEMONIC2(VEX_RM, VPHMINPOSUW, vphminposuw, Vdq, Wdq, DISOPTYPE_HARMLESS, IEMOPHINT_VEX_L_ZERO); 785 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); 786 if (IEM_IS_MODRM_REG_MODE(bRm)) 787 { 788 /* 789 * Register, register. 790 */ 791 IEMOP_HLP_DONE_VEX_DECODING_L0_EX(fAvx); 792 IEM_MC_BEGIN(2, 0); 793 IEM_MC_ARG(PRTUINT128U, puDst, 0); 794 IEM_MC_ARG(PCRTUINT128U, puSrc, 1); 795 IEM_MC_MAYBE_RAISE_AVX2_RELATED_XCPT(); 796 IEM_MC_PREPARE_AVX_USAGE(); 797 IEM_MC_REF_XREG_U128(puDst, IEM_GET_MODRM_REG(pVCpu, bRm)); 798 IEM_MC_REF_XREG_U128_CONST(puSrc, IEM_GET_MODRM_RM(pVCpu, bRm)); 799 IEM_MC_CALL_VOID_AIMPL_2(IEM_SELECT_HOST_OR_FALLBACK(fAvx, iemAImpl_vphminposuw_u128, iemAImpl_vphminposuw_u128_fallback), 800 puDst, puSrc); 801 IEM_MC_CLEAR_YREG_128_UP( IEM_GET_MODRM_REG(pVCpu, bRm)); 802 IEM_MC_ADVANCE_RIP(); 803 IEM_MC_END(); 804 } 805 else 806 { 807 /* 808 * Register, memory. 809 */ 810 IEM_MC_BEGIN(2, 2); 811 IEM_MC_LOCAL(RTUINT128U, uSrc); 812 IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc); 813 IEM_MC_ARG(PRTUINT128U, puDst, 0); 814 IEM_MC_ARG_LOCAL_REF(PCRTUINT128U, puSrc, uSrc, 1); 815 816 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0); 817 IEMOP_HLP_DONE_VEX_DECODING_L0_EX(fAvx); 818 IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT(); 819 IEM_MC_PREPARE_AVX_USAGE(); 820 821 IEM_MC_FETCH_MEM_U128_NO_AC(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); 822 IEM_MC_REF_XREG_U128(puDst, IEM_GET_MODRM_REG(pVCpu, bRm)); 823 IEM_MC_CALL_VOID_AIMPL_2(IEM_SELECT_HOST_OR_FALLBACK(fAvx, iemAImpl_vphminposuw_u128, iemAImpl_vphminposuw_u128_fallback), 824 puDst, puSrc); 825 IEM_MC_CLEAR_YREG_128_UP( IEM_GET_MODRM_REG(pVCpu, bRm)); 826 827 IEM_MC_ADVANCE_RIP(); 828 IEM_MC_END(); 829 } 830 831 return VINF_SUCCESS; 832 } 833 834 783 835 /* Opcode VEX.66.0F38 0x42 - invalid. */ 784 836 /* Opcode VEX.66.0F38 0x43 - invalid. */ -
trunk/src/VBox/VMM/include/IEMInternal.h
r96407 r96438 1871 1871 FNIEMAIMPLMEDIAOPTF2U128 iemAImpl_unpcklps_u128, iemAImpl_unpcklpd_u128; 1872 1872 FNIEMAIMPLMEDIAOPTF2U128 iemAImpl_unpckhps_u128, iemAImpl_unpckhpd_u128; 1873 FNIEMAIMPLMEDIAOPTF2U128 iemAImpl_phminposuw_u128, iemAImpl_phminposuw_u128_fallback; 1873 1874 1874 1875 FNIEMAIMPLMEDIAF3U128 iemAImpl_vpshufb_u128, iemAImpl_vpshufb_u128_fallback; … … 1933 1934 FNIEMAIMPLMEDIAOPTF2U128 iemAImpl_vpabsw_u128, iemAImpl_vpabsd_u128_fallback; 1934 1935 FNIEMAIMPLMEDIAOPTF2U128 iemAImpl_vpabsd_u128, iemAImpl_vpabsw_u128_fallback; 1936 FNIEMAIMPLMEDIAOPTF2U128 iemAImpl_vphminposuw_u128, iemAImpl_vphminposuw_u128_fallback; 1935 1937 1936 1938 FNIEMAIMPLMEDIAF3U256 iemAImpl_vpshufb_u256, iemAImpl_vpshufb_u256_fallback; -
trunk/src/VBox/VMM/include/IEMOpHlp.h
r96407 r96438 461 461 } while (0) 462 462 463 /** 464 * Done decoding VEX instruction, raise \#UD exception if any lock, rex, repz, 465 * repnz or size prefixes are present, or if in real or v8086 mode. 466 */ 467 #define IEMOP_HLP_DONE_VEX_DECODING_L0_EX(a_fFeature) \ 468 do \ 469 { \ 470 if (RT_LIKELY( !( pVCpu->iem.s.fPrefixes \ 471 & (IEM_OP_PRF_LOCK | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ | IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REX)) \ 472 && !IEM_IS_REAL_OR_V86_MODE(pVCpu) \ 473 && pVCpu->iem.s.uVexLength == 0 \ 474 && IEM_GET_GUEST_CPU_FEATURES(pVCpu)->a_fFeature)) \ 475 { /* likely */ } \ 476 else \ 477 return IEMOP_RAISE_INVALID_OPCODE(); \ 478 } while (0) 479 463 480 464 481 /**
Note:
See TracChangeset
for help on using the changeset viewer.

