Changeset 96025 in vbox
- Timestamp:
- Aug 4, 2022 9:39:20 AM (3 years ago)
- svn:sync-xref-src-repo-rev:
- 152820
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/IEMAllAImpl.asm
r96022 r96025 3698 3698 IEMIMPL_MEDIA_OPT_F2 psraw, 1 3699 3699 IEMIMPL_MEDIA_OPT_F2 psrad, 1 3700 IEMIMPL_MEDIA_OPT_F2 pmulhuw, 1 3700 3701 3701 3702 … … 4175 4176 IEMIMPL_MEDIA_OPT_F3 vpmulld 4176 4177 IEMIMPL_MEDIA_OPT_F3 vpmulhw 4178 IEMIMPL_MEDIA_OPT_F3 vpmulhuw 4177 4179 4178 4180 -
trunk/src/VBox/VMM/VMMAll/IEMAllAImplC.cpp
r96022 r96025 8847 8847 8848 8848 /* 8849 * PMULHUW / VPMULHUW 8850 */ 8851 #ifdef IEM_WITHOUT_ASSEMBLY 8852 8853 IEM_DECL_IMPL_DEF(void, iemAImpl_pmulhuw_u64,(uint64_t *puDst, uint64_t const *puSrc)) 8854 { 8855 RTUINT64U uSrc1 = { *puDst }; 8856 RTUINT64U uSrc2 = { *puSrc }; 8857 RTUINT64U uDst; 8858 uDst.au16[0] = RT_HIWORD(uSrc1.au16[0] * uSrc2.au16[0]); 8859 uDst.au16[1] = RT_HIWORD(uSrc1.au16[1] * uSrc2.au16[1]); 8860 uDst.au16[2] = RT_HIWORD(uSrc1.au16[2] * uSrc2.au16[2]); 8861 uDst.au16[3] = RT_HIWORD(uSrc1.au16[3] * uSrc2.au16[3]); 8862 *puDst = uDst.u; 8863 } 8864 8865 8866 IEM_DECL_IMPL_DEF(void, iemAImpl_pmulhuw_u128,(PRTUINT128U puDst, PCRTUINT128U puSrc)) 8867 { 8868 RTUINT128U uSrc1 = *puDst; 8869 puDst->au16[0] = RT_HIWORD(uSrc1.au16[0] * puSrc->au16[0]); 8870 puDst->au16[1] = RT_HIWORD(uSrc1.au16[1] * puSrc->au16[1]); 8871 puDst->au16[2] = RT_HIWORD(uSrc1.au16[2] * puSrc->au16[2]); 8872 puDst->au16[3] = RT_HIWORD(uSrc1.au16[3] * puSrc->au16[3]); 8873 puDst->au16[4] = RT_HIWORD(uSrc1.au16[4] * puSrc->au16[4]); 8874 puDst->au16[5] = RT_HIWORD(uSrc1.au16[5] * puSrc->au16[5]); 8875 puDst->au16[6] = RT_HIWORD(uSrc1.au16[6] * puSrc->au16[6]); 8876 puDst->au16[7] = RT_HIWORD(uSrc1.au16[7] * puSrc->au16[7]); 8877 } 8878 8879 #endif 8880 8881 IEM_DECL_IMPL_DEF(void, iemAImpl_vpmulhuw_u128_fallback,(PRTUINT128U puDst, PCRTUINT128U puSrc1, PCRTUINT128U puSrc2)) 8882 { 8883 puDst->au16[0] = RT_HIWORD(puSrc1->au16[0] * puSrc2->au16[0]); 8884 puDst->au16[1] = RT_HIWORD(puSrc1->au16[1] * puSrc2->au16[1]); 8885 puDst->au16[2] = RT_HIWORD(puSrc1->au16[2] * puSrc2->au16[2]); 8886 puDst->au16[3] = RT_HIWORD(puSrc1->au16[3] * puSrc2->au16[3]); 8887 puDst->au16[4] = RT_HIWORD(puSrc1->au16[4] * puSrc2->au16[4]); 8888 puDst->au16[5] = RT_HIWORD(puSrc1->au16[5] * puSrc2->au16[5]); 8889 puDst->au16[6] = RT_HIWORD(puSrc1->au16[6] * puSrc2->au16[6]); 8890 puDst->au16[7] = RT_HIWORD(puSrc1->au16[7] * puSrc2->au16[7]); 8891 } 8892 8893 8894 IEM_DECL_IMPL_DEF(void, iemAImpl_vpmulhuw_u256_fallback,(PRTUINT256U puDst, PCRTUINT256U puSrc1, PCRTUINT256U puSrc2)) 8895 { 8896 puDst->au16[ 0] = RT_HIWORD(puSrc1->au16[ 0] * puSrc2->au16[ 0]); 8897 puDst->au16[ 1] = RT_HIWORD(puSrc1->au16[ 1] * puSrc2->au16[ 1]); 8898 puDst->au16[ 2] = RT_HIWORD(puSrc1->au16[ 2] * puSrc2->au16[ 2]); 8899 puDst->au16[ 3] = RT_HIWORD(puSrc1->au16[ 3] * puSrc2->au16[ 3]); 8900 puDst->au16[ 4] = RT_HIWORD(puSrc1->au16[ 4] * puSrc2->au16[ 4]); 8901 puDst->au16[ 5] = RT_HIWORD(puSrc1->au16[ 5] * puSrc2->au16[ 5]); 8902 puDst->au16[ 6] = RT_HIWORD(puSrc1->au16[ 6] * puSrc2->au16[ 6]); 8903 puDst->au16[ 7] = RT_HIWORD(puSrc1->au16[ 7] * puSrc2->au16[ 7]); 8904 puDst->au16[ 8] = RT_HIWORD(puSrc1->au16[ 8] * puSrc2->au16[ 8]); 8905 puDst->au16[ 9] = RT_HIWORD(puSrc1->au16[ 9] * puSrc2->au16[ 9]); 8906 puDst->au16[10] = RT_HIWORD(puSrc1->au16[10] * puSrc2->au16[10]); 8907 puDst->au16[11] = RT_HIWORD(puSrc1->au16[11] * puSrc2->au16[11]); 8908 puDst->au16[12] = RT_HIWORD(puSrc1->au16[12] * puSrc2->au16[12]); 8909 puDst->au16[13] = RT_HIWORD(puSrc1->au16[13] * puSrc2->au16[13]); 8910 puDst->au16[14] = RT_HIWORD(puSrc1->au16[14] * puSrc2->au16[14]); 8911 puDst->au16[15] = RT_HIWORD(puSrc1->au16[15] * puSrc2->au16[15]); 8912 } 8913 8914 8915 /* 8849 8916 * PSRLW / VPSRLW 8850 8917 */ -
trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsTwoByte0f.cpp.h
r96010 r96025 191 191 IEM_MC_REF_MREG_U64(pDst, IEM_GET_MODRM_REG_8(bRm)); 192 192 IEM_MC_CALL_MMX_AIMPL_2(pfnU64, pDst, pSrc); 193 IEM_MC_MODIFIED_MREG_BY_REF(pDst); 194 IEM_MC_FPU_TO_MMX_MODE(); 195 196 IEM_MC_ADVANCE_RIP(); 197 IEM_MC_END(); 198 } 199 return VINF_SUCCESS; 200 } 201 202 203 /** 204 * Common worker for MMX instructions on the form: 205 * pxxx mm1, mm2/mem64 206 * for instructions introduced with SSE. 207 * 208 * Unlike iemOpCommonMmxSse_FullFull_To_Full, the @a pfnU64 worker function takes 209 * no FXSAVE state, just the operands. 210 */ 211 FNIEMOP_DEF_1(iemOpCommonMmxSseOpt_FullFull_To_Full, PFNIEMAIMPLMEDIAOPTF2U64, pfnU64) 212 { 213 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); 214 if (IEM_IS_MODRM_REG_MODE(bRm)) 215 { 216 /* 217 * Register, register. 218 */ 219 /** @todo testcase: REX.B / REX.R and MMX register indexing. Ignored? */ 220 /** @todo testcase: REX.B / REX.R and segment register indexing. Ignored? */ 221 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); 222 IEM_MC_BEGIN(2, 0); 223 IEM_MC_ARG(uint64_t *, pDst, 0); 224 IEM_MC_ARG(uint64_t const *, pSrc, 1); 225 IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT_CHECK_SSE_OR_MMXEXT(); 226 IEM_MC_PREPARE_FPU_USAGE(); 227 IEM_MC_REF_MREG_U64(pDst, IEM_GET_MODRM_REG_8(bRm)); 228 IEM_MC_REF_MREG_U64_CONST(pSrc, IEM_GET_MODRM_RM_8(bRm)); 229 IEM_MC_CALL_VOID_AIMPL_2(pfnU64, pDst, pSrc); 230 IEM_MC_MODIFIED_MREG_BY_REF(pDst); 231 IEM_MC_FPU_TO_MMX_MODE(); 232 IEM_MC_ADVANCE_RIP(); 233 IEM_MC_END(); 234 } 235 else 236 { 237 /* 238 * Register, memory. 239 */ 240 IEM_MC_BEGIN(2, 2); 241 IEM_MC_ARG(uint64_t *, pDst, 0); 242 IEM_MC_LOCAL(uint64_t, uSrc); 243 IEM_MC_ARG_LOCAL_REF(uint64_t const *, pSrc, uSrc, 1); 244 IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc); 245 246 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0); 247 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); 248 IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT_CHECK_SSE_OR_MMXEXT(); 249 IEM_MC_FETCH_MEM_U64(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); 250 251 IEM_MC_PREPARE_FPU_USAGE(); 252 IEM_MC_REF_MREG_U64(pDst, IEM_GET_MODRM_REG_8(bRm)); 253 IEM_MC_CALL_VOID_AIMPL_2(pfnU64, pDst, pSrc); 193 254 IEM_MC_MODIFIED_MREG_BY_REF(pDst); 194 255 IEM_MC_FPU_TO_MMX_MODE(); … … 10118 10179 10119 10180 /** Opcode 0x0f 0xe4 - pmulhuw Pq, Qq */ 10120 FNIEMOP_STUB(iemOp_pmulhuw_Pq_Qq); 10181 FNIEMOP_DEF(iemOp_pmulhuw_Pq_Qq) 10182 { 10183 IEMOP_MNEMONIC2(RM, PMULHUW, pmulhuw, Pq, Qq, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES); 10184 return FNIEMOP_CALL_1(iemOpCommonMmxSseOpt_FullFull_To_Full, iemAImpl_pmulhuw_u64); 10185 } 10186 10187 10121 10188 /** Opcode 0x66 0x0f 0xe4 - pmulhuw Vx, Wx */ 10122 FNIEMOP_STUB(iemOp_pmulhuw_Vx_Wx); 10189 FNIEMOP_DEF(iemOp_pmulhuw_Vx_Wx) 10190 { 10191 IEMOP_MNEMONIC2(RM, PMULHUW, pmulhuw, Vx, Wx, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES); 10192 return FNIEMOP_CALL_1(iemOpCommonSse2Opt_FullFull_To_Full, iemAImpl_pmulhuw_u128); 10193 } 10194 10195 10123 10196 /* Opcode 0xf3 0x0f 0xe4 - invalid */ 10124 10197 /* Opcode 0xf2 0x0f 0xe4 - invalid */ -
trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsVexMap1.cpp.h
r96022 r96025 4134 4134 4135 4135 /* Opcode VEX.0F 0xe4 - invalid */ 4136 /** Opcode VEX.66.0F 0xe4 - vpmulhuw Vx, Hx, W */ 4137 FNIEMOP_STUB(iemOp_vpmulhuw_Vx_Hx_W); 4136 4137 4138 /** Opcode VEX.66.0F 0xe4 - vpmulhuw Vx, Hx, Wx */ 4139 FNIEMOP_DEF(iemOp_vpmulhuw_Vx_Hx_Wx) 4140 { 4141 IEMOP_MNEMONIC3(VEX_RVM, VPMULHUW, vpmulhuw, Vx, Hx, Wx, DISOPTYPE_HARMLESS | DISOPTYPE_AVX, 0); 4142 IEMOPMEDIAOPTF3_INIT_VARS(vpmulhuw); 4143 return FNIEMOP_CALL_1(iemOpCommonAvxAvx2_Vx_Hx_Wx_Opt, IEM_SELECT_HOST_OR_FALLBACK(fAvx2, &s_Host, &s_Fallback)); 4144 } 4145 4146 4138 4147 /* Opcode VEX.F3.0F 0xe4 - invalid */ 4139 4148 /* Opcode VEX.F2.0F 0xe4 - invalid */ … … 4736 4745 /* 0xe2 */ iemOp_InvalidNeedRM, iemOp_vpsrad_Vx_Hx_Wx, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM, 4737 4746 /* 0xe3 */ iemOp_InvalidNeedRM, iemOp_vpavgw_Vx_Hx_Wx, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM, 4738 /* 0xe4 */ iemOp_InvalidNeedRM, iemOp_vpmulhuw_Vx_Hx_W ,iemOp_InvalidNeedRM, iemOp_InvalidNeedRM,4747 /* 0xe4 */ iemOp_InvalidNeedRM, iemOp_vpmulhuw_Vx_Hx_Wx, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM, 4739 4748 /* 0xe5 */ iemOp_InvalidNeedRM, iemOp_vpmulhw_Vx_Hx_Wx, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM, 4740 4749 /* 0xe6 */ iemOp_InvalidNeedRM, iemOp_vcvttpd2dq_Vx_Wpd, iemOp_vcvtdq2pd_Vx_Wpd, iemOp_vcvtpd2dq_Vx_Wpd, -
trunk/src/VBox/VMM/include/IEMInternal.h
r96022 r96025 1784 1784 FNIEMAIMPLMEDIAOPTF2U64 iemAImpl_packsswb_u64, iemAImpl_packuswb_u64; 1785 1785 FNIEMAIMPLMEDIAOPTF2U64 iemAImpl_packssdw_u64; 1786 FNIEMAIMPLMEDIAOPTF2U64 iemAImpl_pmulhuw_u64; 1786 1787 1787 1788 FNIEMAIMPLMEDIAF2U128 iemAImpl_pshufb_u128, iemAImpl_pshufb_u128_fallback; … … 1820 1821 FNIEMAIMPLMEDIAOPTF2U128 iemAImpl_pslld_u128, iemAImpl_psrld_u128, iemAImpl_psrad_u128; 1821 1822 FNIEMAIMPLMEDIAOPTF2U128 iemAImpl_psllq_u128, iemAImpl_psrlq_u128; 1823 FNIEMAIMPLMEDIAOPTF2U128 iemAImpl_pmulhuw_u128; 1822 1824 1823 1825 FNIEMAIMPLMEDIAF3U128 iemAImpl_vpshufb_u128, iemAImpl_vpshufb_u128_fallback; … … 1861 1863 FNIEMAIMPLMEDIAOPTF3U128 iemAImpl_vpmulld_u128, iemAImpl_vpmulld_u128_fallback; 1862 1864 FNIEMAIMPLMEDIAOPTF3U128 iemAImpl_vpmulhw_u128, iemAImpl_vpmulhw_u128_fallback; 1865 FNIEMAIMPLMEDIAOPTF3U128 iemAImpl_vpmulhuw_u128, iemAImpl_vpmulhuw_u128_fallback; 1863 1866 1864 1867 FNIEMAIMPLMEDIAF3U256 iemAImpl_vpshufb_u256, iemAImpl_vpshufb_u256_fallback; … … 1902 1905 FNIEMAIMPLMEDIAOPTF3U256 iemAImpl_vpmulld_u256, iemAImpl_vpmulld_u256_fallback; 1903 1906 FNIEMAIMPLMEDIAOPTF3U256 iemAImpl_vpmulhw_u256, iemAImpl_vpmulhw_u256_fallback; 1907 FNIEMAIMPLMEDIAOPTF3U256 iemAImpl_vpmulhuw_u256, iemAImpl_vpmulhuw_u256_fallback; 1904 1908 /** @} */ 1905 1909 -
trunk/src/VBox/VMM/testcase/tstIEMCheckMc.cpp
r96010 r96025 432 432 #define iemAImpl_pmullw_u64 NULL 433 433 #define iemAImpl_pmulhw_u64 NULL 434 #define iemAImpl_pmulhuw_u64 NULL 434 435 #define iemAImpl_pmaddwd_u64 NULL 435 436 436 437 #define iemAImpl_pmullw_u128 NULL 437 438 #define iemAImpl_pmulhw_u128 NULL 439 #define iemAImpl_pmulhuw_u128 NULL 438 440 #define iemAImpl_pmaddwd_u128 NULL 439 441
Note:
See TracChangeset
for help on using the changeset viewer.