- Timestamp:
- Mar 27, 2024 8:19:25 AM (10 months ago)
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/IEMAllAImpl.asm
r104051 r104076 5926 5926 5927 5927 ;; 5928 ; pinsrw instruction.5929 ;5930 ; @param A0 Pointer to the first media register size operand (input/output).5931 ; @param A1 The 16 bit input operand (input).5932 ; @param A2 The 8-bit immediate5933 ;5934 BEGINPROC_FASTCALL iemAImpl_pinsrw_u64, 165935 PROLOGUE_3_ARGS5936 IEMIMPL_SSE_PROLOGUE5937 5938 movzx A2, A2_8 ; must clear top bits5939 movq mm0, [A0]5940 lea T1, [.imm0 xWrtRIP]5941 %ifdef RT_WITH_IBT_BRANCH_PROTECTION_WITHOUT_NOTRACK5942 lea T0, [A2 + A2*8] ; sizeof(endbrxx+pinsrw+ret) == 9: A2 * 95943 %else5944 lea T0, [A2 + A2*4] ; sizeof(pinsrw+ret) == 5: A2 * 55945 %endif5946 lea T1, [T1 + T0]5947 IBT_NOTRACK5948 call T15949 movq [A0], mm05950 5951 IEMIMPL_SSE_EPILOGUE5952 EPILOGUE_3_ARGS5953 %assign bImm 05954 %rep 2565955 .imm %+ bImm:5956 IBT_ENDBRxx_WITHOUT_NOTRACK5957 pinsrw mm0, A1_32, bImm5958 ret5959 %assign bImm bImm + 15960 %endrep5961 .immEnd: IEMCHECK_256_JUMP_ARRAY_SIZE (.immEnd - .imm0), 0x5005962 ENDPROC iemAImpl_pinsrw_u645963 5964 BEGINPROC_FASTCALL iemAImpl_pinsrw_u128, 165965 PROLOGUE_3_ARGS5966 IEMIMPL_SSE_PROLOGUE5967 5968 movzx A2, A2_8 ; must clear top bits5969 movdqu xmm0, [A0]5970 lea T1, [.imm0 xWrtRIP]5971 %ifdef RT_WITH_IBT_BRANCH_PROTECTION_WITHOUT_NOTRACK5972 lea T0, [A2 + A2*4] ; sizeof(endbrxx+pinsrw+ret) == 10: A2 * 10 = (A2 * 5) * 25973 %else5974 lea T0, [A2 + A2*2] ; sizeof(pinsrw+ret) == 6: A2 * 6 = (A2 * 3) * 25975 %endif5976 lea T1, [T1 + T0*2]5977 IBT_NOTRACK5978 call T15979 movdqu [A0], xmm05980 5981 IEMIMPL_SSE_EPILOGUE5982 EPILOGUE_3_ARGS5983 %assign bImm 05984 %rep 2565985 .imm %+ bImm:5986 IBT_ENDBRxx_WITHOUT_NOTRACK5987 pinsrw xmm0, A1_32, bImm5988 ret5989 %assign bImm bImm + 15990 %endrep5991 .immEnd: IEMCHECK_256_JUMP_ARRAY_SIZE (.immEnd - .imm0), 0x6005992 ENDPROC iemAImpl_pinsrw_u1285993 5994 ;;5995 ; vpinsrw instruction.5996 ;5997 ; @param A0 Pointer to the first media register size operand (output).5998 ; @param A1 Pointer to the source media register size operand (input).5999 ; @param A2 The 16 bit input operand (input).6000 ; @param A3 The 8-bit immediate6001 ;6002 BEGINPROC_FASTCALL iemAImpl_vpinsrw_u128, 166003 PROLOGUE_4_ARGS6004 IEMIMPL_SSE_PROLOGUE6005 6006 movzx A3, A3_8 ; must clear top bits6007 movdqu xmm0, [A1]6008 lea T1, [.imm0 xWrtRIP]6009 %ifdef RT_WITH_IBT_BRANCH_PROTECTION_WITHOUT_NOTRACK6010 lea T0, [A3 + A3*4] ; sizeof(endbrxx+vpinsrw+ret) == 10: A3 * 10 = (A3 * 5) * 26011 %else6012 lea T0, [A3 + A3*2] ; sizeof(vpinsrw+ret) == 6: A3 * 6 = (A3 * 3) * 26013 %endif6014 lea T1, [T1 + T0*2]6015 mov A1, A2 ; A2 requires longer encoding on Windows6016 IBT_NOTRACK6017 call T16018 movdqu [A0], xmm06019 6020 IEMIMPL_SSE_EPILOGUE6021 EPILOGUE_4_ARGS6022 %assign bImm 06023 %rep 2566024 .imm %+ bImm:6025 IBT_ENDBRxx_WITHOUT_NOTRACK6026 vpinsrw xmm0, xmm0, A1_32, bImm6027 ret6028 %assign bImm bImm + 16029 %endrep6030 .immEnd: IEMCHECK_256_JUMP_ARRAY_SIZE (.immEnd - .imm0), 0x6006031 ENDPROC iemAImpl_vpinsrw_u1286032 6033 6034 ;;6035 5928 ; movmskp{s,d} SSE instruction template 6036 5929 ; -
trunk/src/VBox/VMM/VMMAll/IEMAllAImplC.cpp
r104051 r104076 18279 18279 18280 18280 /** 18281 * [V]PINSRW18282 */18283 #ifdef IEM_WITHOUT_ASSEMBLY18284 IEM_DECL_IMPL_DEF(void, iemAImpl_pinsrw_u64,(uint64_t *pu64Dst, uint16_t u16Src, uint8_t bEvil))18285 {18286 uint8_t cShift = (bEvil & 0x3) * 16;18287 *pu64Dst = (*pu64Dst & ~(UINT64_C(0xffff) << cShift)) | ((uint64_t)u16Src << cShift);18288 }18289 18290 18291 IEM_DECL_IMPL_DEF(void, iemAImpl_pinsrw_u128,(PRTUINT128U puDst, uint16_t u16Src, uint8_t bEvil))18292 {18293 puDst->au16[bEvil & 0x7] = u16Src;18294 }18295 #endif18296 18297 18298 IEM_DECL_IMPL_DEF(void, iemAImpl_vpinsrw_u128_fallback,(PRTUINT128U puDst, PCRTUINT128U puSrc, uint16_t u16Src, uint8_t bEvil))18299 {18300 *puDst = *puSrc;18301 puDst->au16[bEvil & 0x7] = u16Src;18302 }18303 18304 18305 /**18306 18281 * [V]MOVMSKPS 18307 18282 */ -
trunk/src/VBox/VMM/VMMAll/IEMAllInstPython.py
r104075 r104076 3100 3100 'IEM_MC_FETCH_MEM16_U8': (McBlock.parseMcGeneric, True, True, False, ), 3101 3101 'IEM_MC_FETCH_MEM32_U8': (McBlock.parseMcGeneric, True, True, False, ), 3102 'IEM_MC_FETCH_MREG_U8': (McBlock.parseMcGeneric, False, False, False, ), 3102 3103 'IEM_MC_FETCH_MREG_U16': (McBlock.parseMcGeneric, False, False, False, ), 3103 3104 'IEM_MC_FETCH_MREG_U32': (McBlock.parseMcGeneric, False, False, False, ), … … 3342 3343 'IEM_MC_STORE_MEM_U8': (McBlock.parseMcGeneric, True, True, True, ), 3343 3344 'IEM_MC_STORE_MEM_U8_CONST': (McBlock.parseMcGeneric, True, True, True, ), 3345 'IEM_MC_STORE_MREG_U8': (McBlock.parseMcGeneric, True, True, False, ), 3346 'IEM_MC_STORE_MREG_U16': (McBlock.parseMcGeneric, True, True, False, ), 3347 'IEM_MC_STORE_MREG_U32': (McBlock.parseMcGeneric, True, True, False, ), 3344 3348 'IEM_MC_STORE_MREG_U32_ZX_U64': (McBlock.parseMcGeneric, True, True, False, ), 3345 3349 'IEM_MC_STORE_MREG_U64': (McBlock.parseMcGeneric, True, True, False, ), -
trunk/src/VBox/VMM/VMMAll/IEMAllInstTwoByte0f.cpp.h
r104018 r104076 12407 12407 * Register, register. 12408 12408 */ 12409 uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm); 12409 12410 IEM_MC_BEGIN(IEM_MC_F_NOT_286_OR_OLDER, 0); 12410 uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm); 12411 IEM_MC_LOCAL(uint16_t, uValue); 12412 12411 12413 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX_EX_2_OR(fSse, fAmdMmxExts); 12412 IEM_MC_ARG(uint64_t *, pu64Dst, 0);12413 IEM_MC_ARG(uint16_t, u16Src, 1);12414 IEM_MC_ARG_CONST(uint8_t, bImmArg, /*=*/ bImm, 2);12415 12414 IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT(); 12416 12415 IEM_MC_PREPARE_FPU_USAGE(); 12417 12416 IEM_MC_FPU_TO_MMX_MODE(); 12418 IEM_MC_REF_MREG_U64(pu64Dst, IEM_GET_MODRM_REG_8(bRm)); 12419 IEM_MC_FETCH_GREG_U16(u 16Src, IEM_GET_MODRM_RM(pVCpu, bRm));12420 IEM_MC_ CALL_VOID_AIMPL_3(iemAImpl_pinsrw_u64, pu64Dst, u16Src, bImmArg);12421 IEM_MC_MODIFIED_MREG_BY_REF(pu64Dst); 12417 12418 IEM_MC_FETCH_GREG_U16(uValue, IEM_GET_MODRM_RM(pVCpu, bRm)); 12419 IEM_MC_STORE_MREG_U16(IEM_GET_MODRM_REG(pVCpu, bRm), bImm & 3, uValue); 12420 12422 12421 IEM_MC_ADVANCE_RIP_AND_FINISH(); 12423 12422 IEM_MC_END(); … … 12429 12428 */ 12430 12429 IEM_MC_BEGIN(IEM_MC_F_NOT_286_OR_OLDER, 0); 12431 IEM_MC_ARG(uint64_t *, pu64Dst, 0); 12432 IEM_MC_ARG(uint16_t, u16Src, 1); 12433 IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc); 12430 IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc); 12431 IEM_MC_LOCAL(uint16_t, uValue); 12434 12432 12435 12433 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 1); 12436 12434 uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm); 12437 IEM_MC_ARG_CONST(uint8_t, bImmArg, /*=*/ bImm, 2);12438 12435 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX_EX_2_OR(fSse, fAmdMmxExts); 12439 12436 IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT(); 12440 12437 IEM_MC_PREPARE_FPU_USAGE(); 12441 12438 12442 IEM_MC_FETCH_MEM_U16(u 16Src, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);12439 IEM_MC_FETCH_MEM_U16(uValue, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); 12443 12440 IEM_MC_FPU_TO_MMX_MODE(); 12444 12445 IEM_MC_REF_MREG_U64(pu64Dst, IEM_GET_MODRM_REG_8(bRm)); 12446 IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_pinsrw_u64, pu64Dst, u16Src, bImmArg); 12447 IEM_MC_MODIFIED_MREG_BY_REF(pu64Dst); 12441 IEM_MC_STORE_MREG_U16(IEM_GET_MODRM_REG(pVCpu, bRm), bImm & 3, uValue); 12442 12448 12443 IEM_MC_ADVANCE_RIP_AND_FINISH(); 12449 12444 IEM_MC_END(); … … 12465 12460 uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm); 12466 12461 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX_EX(fSse2); 12467 IEM_MC_ARG(PRTUINT128U, puDst, 0); 12468 IEM_MC_ARG(uint16_t, u16Src, 1); 12469 IEM_MC_ARG_CONST(uint8_t, bImmArg, /*=*/ bImm, 2); 12462 12463 IEM_MC_LOCAL(uint16_t, uValue); 12470 12464 IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT(); 12471 12465 IEM_MC_PREPARE_SSE_USAGE(); 12472 IEM_MC_FETCH_GREG_U16(u16Src, IEM_GET_MODRM_RM(pVCpu, bRm)); 12473 IEM_MC_ REF_XREG_U128(puDst, IEM_GET_MODRM_REG(pVCpu, bRm));12474 IEM_MC_ CALL_VOID_AIMPL_3(iemAImpl_pinsrw_u128, puDst, u16Src, bImmArg);12466 12467 IEM_MC_FETCH_GREG_U16(uValue, IEM_GET_MODRM_RM(pVCpu, bRm)); 12468 IEM_MC_STORE_XREG_U16(IEM_GET_MODRM_REG(pVCpu, bRm), bImm & 7, uValue); 12475 12469 IEM_MC_ADVANCE_RIP_AND_FINISH(); 12476 12470 IEM_MC_END(); … … 12482 12476 */ 12483 12477 IEM_MC_BEGIN(IEM_MC_F_NOT_286_OR_OLDER, 0); 12484 IEM_MC_ARG(PRTUINT128U, puDst, 0);12485 IEM_MC_ARG(uint16_t, u16Src, 1);12486 12478 IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc); 12479 IEM_MC_LOCAL(uint16_t, uValue); 12487 12480 12488 12481 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 1); 12489 12482 uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm); 12490 IEM_MC_ARG_CONST(uint8_t, bImmArg, /*=*/ bImm, 2);12491 12483 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX_EX(fSse2); 12492 12484 IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT(); 12493 12485 IEM_MC_PREPARE_SSE_USAGE(); 12494 12486 12495 IEM_MC_FETCH_MEM_U16(u16Src, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); 12496 IEM_MC_REF_XREG_U128(puDst, IEM_GET_MODRM_REG(pVCpu, bRm)); 12497 IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_pinsrw_u128, puDst, u16Src, bImmArg); 12487 IEM_MC_FETCH_MEM_U16(uValue, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); 12488 IEM_MC_STORE_XREG_U16(IEM_GET_MODRM_REG(pVCpu, bRm), bImm & 7, uValue); 12498 12489 IEM_MC_ADVANCE_RIP_AND_FINISH(); 12499 12490 IEM_MC_END(); -
trunk/src/VBox/VMM/VMMAll/IEMAllInstVexMap1.cpp.h
r104058 r104076 4593 4593 IEM_MC_BEGIN(IEM_MC_F_NOT_286_OR_OLDER, 0); 4594 4594 uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm); 4595 IEM_MC_LOCAL(RTUINT128U, uSrc1); 4596 IEM_MC_LOCAL(uint16_t, uValue); 4597 4595 4598 IEMOP_HLP_DONE_VEX_DECODING_L0_EX(fAvx); 4596 IEM_MC_ARG(PRTUINT128U, puDst, 0);4597 IEM_MC_ARG(PCRTUINT128U, puSrc, 1);4598 IEM_MC_ARG(uint16_t, u16Src, 2);4599 IEM_MC_ARG_CONST(uint8_t, bImmArg, /*=*/ bImm, 3);4600 4599 IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT(); 4601 4600 IEM_MC_PREPARE_AVX_USAGE(); 4602 IEM_MC_REF_XREG_U128(puDst, IEM_GET_MODRM_REG(pVCpu, bRm)); 4603 IEM_MC_REF_XREG_U128_CONST(puSrc, IEM_GET_MODRM_RM(pVCpu, bRm)); 4604 IEM_MC_FETCH_GREG_U16(u16Src, IEM_GET_MODRM_RM(pVCpu, bRm)); 4605 IEM_MC_CALL_VOID_AIMPL_4(IEM_SELECT_HOST_OR_FALLBACK(fAvx, iemAImpl_vpinsrw_u128, iemAImpl_vpinsrw_u128_fallback), 4606 puDst, puSrc, u16Src, bImmArg); 4607 IEM_MC_CLEAR_YREG_128_UP( IEM_GET_MODRM_REG(pVCpu, bRm)); 4601 4602 IEM_MC_FETCH_XREG_U128(uSrc1, IEM_GET_EFFECTIVE_VVVV(pVCpu)); 4603 IEM_MC_FETCH_GREG_U16(uValue, IEM_GET_MODRM_RM(pVCpu, bRm)); 4604 IEM_MC_STORE_XREG_U128( IEM_GET_MODRM_REG(pVCpu, bRm), uSrc1); 4605 IEM_MC_STORE_XREG_U16( IEM_GET_MODRM_REG(pVCpu, bRm), bImm & 7, uValue); 4608 4606 IEM_MC_ADVANCE_RIP_AND_FINISH(); 4609 4607 IEM_MC_END(); … … 4616 4614 IEM_MC_BEGIN(IEM_MC_F_NOT_286_OR_OLDER, 0); 4617 4615 IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc); 4618 IEM_MC_ARG(PRTUINT128U, puDst, 0); 4619 IEM_MC_ARG(PCRTUINT128U, puSrc, 1); 4620 IEM_MC_ARG(uint16_t, u16Src, 2); 4621 4622 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0); 4616 IEM_MC_LOCAL(RTUINT128U, uSrc1); 4617 IEM_MC_LOCAL(uint16_t, uValue); 4618 4619 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 1); 4623 4620 uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm); 4624 IEM_MC_ARG_CONST(uint8_t, bImmArg, /*=*/ bImm, 3);4625 4621 IEMOP_HLP_DONE_VEX_DECODING_L0_EX(fAvx); 4626 4622 IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT(); 4627 4623 IEM_MC_PREPARE_AVX_USAGE(); 4628 4624 4629 IEM_MC_FETCH_MEM_U16(u16Src, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); 4630 IEM_MC_REF_XREG_U128(puDst, IEM_GET_MODRM_REG(pVCpu, bRm)); 4631 IEM_MC_REF_XREG_U128_CONST(puSrc, IEM_GET_MODRM_RM(pVCpu, bRm)); 4632 IEM_MC_CALL_VOID_AIMPL_4(IEM_SELECT_HOST_OR_FALLBACK(fAvx, iemAImpl_vpinsrw_u128, iemAImpl_vpinsrw_u128_fallback), 4633 puDst, puSrc, u16Src, bImmArg); 4634 IEM_MC_CLEAR_YREG_128_UP( IEM_GET_MODRM_REG(pVCpu, bRm)); 4635 4625 IEM_MC_FETCH_XREG_U128(uSrc1, IEM_GET_EFFECTIVE_VVVV(pVCpu)); 4626 IEM_MC_FETCH_MEM_U16(uValue, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); 4627 IEM_MC_STORE_XREG_U128( IEM_GET_MODRM_REG(pVCpu, bRm), uSrc1); 4628 IEM_MC_STORE_XREG_U16( IEM_GET_MODRM_REG(pVCpu, bRm), bImm & 7, uValue); 4636 4629 IEM_MC_ADVANCE_RIP_AND_FINISH(); 4637 4630 IEM_MC_END(); -
trunk/src/VBox/VMM/VMMAll/IEMAllInstVexMap3.cpp.h
r104059 r104076 837 837 838 838 /** Opcode VEX.66.0F3A 0x20. */ 839 FNIEMOP_STUB(iemOp_vpinsrb_Vdq_Hdq_RyMb_Ib); 839 FNIEMOP_DEF(iemOp_vpinsrb_Vdq_Hdq_RyMb_Ib) 840 { 841 /*IEMOP_MNEMONIC4(VEX_RMVI, VPINSRB, vpinsrb, Vdq, Hdq, Ey, Ib, DISOPTYPE_HARMLESS, IEMOPHINT_VEX_L_ZERO);*/ /** @todo */ 842 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); 843 if (IEM_IS_MODRM_REG_MODE(bRm)) 844 { 845 /* 846 * Register, register. 847 */ 848 uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm); 849 IEM_MC_BEGIN(IEM_MC_F_NOT_286_OR_OLDER, 0); 850 IEM_MC_LOCAL(RTUINT128U, uSrc1); 851 IEM_MC_LOCAL(uint16_t, uValue); 852 853 IEMOP_HLP_DONE_VEX_DECODING_L0_EX(fAvx); 854 IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT(); 855 IEM_MC_PREPARE_AVX_USAGE(); 856 857 IEM_MC_FETCH_XREG_U128(uSrc1, IEM_GET_EFFECTIVE_VVVV(pVCpu)); 858 IEM_MC_FETCH_GREG_U16(uValue, IEM_GET_MODRM_RM(pVCpu, bRm)); 859 IEM_MC_STORE_XREG_U128( IEM_GET_MODRM_REG(pVCpu, bRm), uSrc1); 860 IEM_MC_STORE_XREG_U8( IEM_GET_MODRM_REG(pVCpu, bRm), bImm & 15, uValue & 0xff); 861 IEM_MC_ADVANCE_RIP_AND_FINISH(); 862 IEM_MC_END(); 863 } 864 else 865 { 866 /* 867 * Register, memory. 868 */ 869 IEM_MC_BEGIN(IEM_MC_F_NOT_286_OR_OLDER, 0); 870 IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc); 871 IEM_MC_LOCAL(RTUINT128U, uSrc1); 872 IEM_MC_LOCAL(uint8_t, uValue); 873 874 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 1); 875 uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm); 876 IEMOP_HLP_DONE_VEX_DECODING_L0_EX(fAvx); 877 IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT(); 878 IEM_MC_PREPARE_AVX_USAGE(); 879 880 IEM_MC_FETCH_XREG_U128(uSrc1, IEM_GET_EFFECTIVE_VVVV(pVCpu)); 881 IEM_MC_FETCH_MEM_U8(uValue, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); 882 IEM_MC_STORE_XREG_U128( IEM_GET_MODRM_REG(pVCpu, bRm), uSrc1); 883 IEM_MC_STORE_XREG_U8( IEM_GET_MODRM_REG(pVCpu, bRm), bImm & 15, uValue); 884 IEM_MC_ADVANCE_RIP_AND_FINISH(); 885 IEM_MC_END(); 886 } 887 } 888 889 840 890 /** Opcode VEX.66.0F3A 0x21, */ 841 891 FNIEMOP_STUB(iemOp_vinsertps_Vdq_Hdq_UdqMd_Ib); 892 893 842 894 /** Opcode VEX.66.0F3A 0x22. */ 843 FNIEMOP_STUB(iemOp_vpinsrd_q_Vdq_Hdq_Ey_Ib); 895 FNIEMOP_DEF(iemOp_vpinsrd_q_Vdq_Hdq_Ey_Ib) 896 { 897 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); 898 if (pVCpu->iem.s.fPrefixes & IEM_OP_PRF_SIZE_REX_W) 899 { 900 /*IEMOP_MNEMONIC4(VEX_RMVI, VPINSRQ, vpinsrq, Vdq, Hdq, Ey, Ib, DISOPTYPE_HARMLESS, IEMOPHINT_VEX_L_ZERO);*/ /** @todo */ 901 if (IEM_IS_MODRM_REG_MODE(bRm)) 902 { 903 /* 904 * Register, register. 905 */ 906 uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm); 907 IEM_MC_BEGIN(IEM_MC_F_NOT_286_OR_OLDER, 0); 908 IEM_MC_LOCAL(RTUINT128U, uSrc1); 909 IEM_MC_LOCAL(uint64_t, uValue); 910 911 IEMOP_HLP_DONE_VEX_DECODING_L0_EX(fAvx); 912 IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT(); 913 IEM_MC_PREPARE_AVX_USAGE(); 914 915 IEM_MC_FETCH_XREG_U128(uSrc1, IEM_GET_EFFECTIVE_VVVV(pVCpu)); 916 IEM_MC_FETCH_GREG_U64(uValue, IEM_GET_MODRM_RM(pVCpu, bRm)); 917 IEM_MC_STORE_XREG_U128( IEM_GET_MODRM_REG(pVCpu, bRm), uSrc1); 918 IEM_MC_STORE_XREG_U64( IEM_GET_MODRM_REG(pVCpu, bRm), bImm & 1, uValue); 919 IEM_MC_ADVANCE_RIP_AND_FINISH(); 920 IEM_MC_END(); 921 } 922 else 923 { 924 /* 925 * Register, memory. 926 */ 927 IEM_MC_BEGIN(IEM_MC_F_NOT_286_OR_OLDER, 0); 928 IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc); 929 IEM_MC_LOCAL(RTUINT128U, uSrc1); 930 IEM_MC_LOCAL(uint64_t, uValue); 931 932 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 1); 933 uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm); 934 IEMOP_HLP_DONE_VEX_DECODING_L0_EX(fAvx); 935 IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT(); 936 IEM_MC_PREPARE_AVX_USAGE(); 937 938 IEM_MC_FETCH_XREG_U128(uSrc1, IEM_GET_EFFECTIVE_VVVV(pVCpu)); 939 IEM_MC_FETCH_MEM_U64(uValue, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); 940 IEM_MC_STORE_XREG_U128( IEM_GET_MODRM_REG(pVCpu, bRm), uSrc1); 941 IEM_MC_STORE_XREG_U64( IEM_GET_MODRM_REG(pVCpu, bRm), bImm & 1, uValue); 942 IEM_MC_ADVANCE_RIP_AND_FINISH(); 943 IEM_MC_END(); 944 } 945 } 946 else 947 { 948 /*IEMOP_MNEMONIC4(VEX_RMVI, VPINSRD, vpinsrd, Vdq, Hdq, Ey, Ib, DISOPTYPE_HARMLESS, IEMOPHINT_VEX_L_ZERO);*/ /** @todo */ 949 if (IEM_IS_MODRM_REG_MODE(bRm)) 950 { 951 /* 952 * Register, register. 953 */ 954 IEM_MC_BEGIN(IEM_MC_F_NOT_286_OR_OLDER, 0); 955 uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm); 956 IEM_MC_LOCAL(RTUINT128U, uSrc1); 957 IEM_MC_LOCAL(uint32_t, uValue); 958 959 IEMOP_HLP_DONE_VEX_DECODING_L0_EX(fAvx); 960 IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT(); 961 IEM_MC_PREPARE_AVX_USAGE(); 962 963 IEM_MC_FETCH_XREG_U128(uSrc1, IEM_GET_EFFECTIVE_VVVV(pVCpu)); 964 IEM_MC_FETCH_GREG_U32(uValue, IEM_GET_MODRM_RM(pVCpu, bRm)); 965 IEM_MC_STORE_XREG_U128( IEM_GET_MODRM_REG(pVCpu, bRm), uSrc1); 966 IEM_MC_STORE_XREG_U32( IEM_GET_MODRM_REG(pVCpu, bRm), bImm & 3, uValue); 967 IEM_MC_ADVANCE_RIP_AND_FINISH(); 968 IEM_MC_END(); 969 } 970 else 971 { 972 /* 973 * Register, memory. 974 */ 975 IEM_MC_BEGIN(IEM_MC_F_NOT_286_OR_OLDER, 0); 976 IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc); 977 IEM_MC_LOCAL(RTUINT128U, uSrc1); 978 IEM_MC_LOCAL(uint32_t, uValue); 979 980 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 1); 981 uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm); 982 IEMOP_HLP_DONE_VEX_DECODING_L0_EX(fAvx); 983 IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT(); 984 IEM_MC_PREPARE_AVX_USAGE(); 985 986 IEM_MC_FETCH_XREG_U128(uSrc1, IEM_GET_EFFECTIVE_VVVV(pVCpu)); 987 IEM_MC_FETCH_MEM_U32(uValue, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); 988 IEM_MC_STORE_XREG_U128( IEM_GET_MODRM_REG(pVCpu, bRm), uSrc1); 989 IEM_MC_STORE_XREG_U32( IEM_GET_MODRM_REG(pVCpu, bRm), bImm & 3, uValue); 990 IEM_MC_ADVANCE_RIP_AND_FINISH(); 991 IEM_MC_END(); 992 } 993 } 994 } 995 996 844 997 /* Opcode VEX.66.0F3A 0x23 - invalid */ 845 998 /* Opcode VEX.66.0F3A 0x24 - invalid */ -
trunk/src/VBox/VMM/VMMAll/IEMAllN8veLiveness.cpp
r104058 r104076 665 665 #define IEM_MC_FETCH_MREG_U32(a_u32Value, a_iMReg, a_iDWord) NOP() 666 666 #define IEM_MC_FETCH_MREG_U16(a_u16Value, a_iMReg, a_iWord) NOP() 667 #define IEM_MC_FETCH_MREG_U8(a_u8Value, a_iMReg, a_iByte) NOP() 667 668 #define IEM_MC_STORE_MREG_U64(a_iMReg, a_u64Value) NOP() 669 #define IEM_MC_STORE_MREG_U32(a_iMReg, a_iDword, a_u32Value) NOP() 670 #define IEM_MC_STORE_MREG_U16(a_iMReg, a_iWord, a_u16Value) NOP() 671 #define IEM_MC_STORE_MREG_U8(a_iMReg, a_iByte, a_u8Value) NOP() 668 672 #define IEM_MC_STORE_MREG_U32_ZX_U64(a_iMReg, a_u32Value) NOP() 669 673 #define IEM_MC_REF_MREG_U64(a_pu64Dst, a_iMReg) NOP() -
trunk/src/VBox/VMM/VMMAll/IEMAllThrdPython.py
r104021 r104076 1766 1766 'IEM_MC_FETCH_MREG_U32': '__mreg32', 1767 1767 'IEM_MC_FETCH_MREG_U16': '__mreg16', 1768 'IEM_MC_FETCH_MREG_U8': '__mreg8', 1768 1769 'IEM_MC_STORE_MREG_U64': '__mreg64', 1770 'IEM_MC_STORE_MREG_U32': '__mreg32', 1771 'IEM_MC_STORE_MREG_U16': '__mreg16', 1772 'IEM_MC_STORE_MREG_U8': '__mreg8', 1769 1773 'IEM_MC_STORE_MREG_U32_ZX_U64': '__mreg32zx64', 1770 1774 'IEM_MC_REF_MREG_U64': '__mreg64', -
trunk/src/VBox/VMM/include/IEMInternal.h
r104073 r104076 3680 3680 IEM_DECL_IMPL_DEF(void, iemAImpl_palignr_u64,(uint64_t *pu64Dst, uint64_t u64Src, uint8_t bEvil)); 3681 3681 IEM_DECL_IMPL_DEF(void, iemAImpl_palignr_u64_fallback,(uint64_t *pu64Dst, uint64_t u64Src, uint8_t bEvil)); 3682 3683 IEM_DECL_IMPL_DEF(void, iemAImpl_pinsrw_u64,(uint64_t *pu64Dst, uint16_t u16Src, uint8_t bEvil));3684 IEM_DECL_IMPL_DEF(void, iemAImpl_pinsrw_u128,(PRTUINT128U puDst, uint16_t u16Src, uint8_t bEvil));3685 IEM_DECL_IMPL_DEF(void, iemAImpl_vpinsrw_u128,(PRTUINT128U puDst, PCRTUINT128U puSrc, uint16_t u16Src, uint8_t bEvil));3686 IEM_DECL_IMPL_DEF(void, iemAImpl_vpinsrw_u128_fallback,(PRTUINT128U puDst, PCRTUINT128U puSrc, uint16_t u16Src, uint8_t bEvil));3687 3682 3688 3683 IEM_DECL_IMPL_DEF(void, iemAImpl_movmskps_u128,(uint8_t *pu8Dst, PCRTUINT128U puSrc)); -
trunk/src/VBox/VMM/include/IEMMc.h
r104058 r104076 438 438 #define IEM_MC_FETCH_MREG_U16(a_u16Value, a_iMReg, a_iWord) \ 439 439 do { (a_u16Value) = pVCpu->cpum.GstCtx.XState.x87.aRegs[(a_iMReg)].au16[a_iWord]; } while (0) 440 #define IEM_MC_STORE_MREG_U64(a_iMReg, a_u64Value) do { \ 441 pVCpu->cpum.GstCtx.XState.x87.aRegs[(a_iMReg)].mmx = (a_u64Value); \ 442 pVCpu->cpum.GstCtx.XState.x87.aRegs[(a_iMReg)].au32[2] = 0xffff; \ 443 } while (0) 444 #define IEM_MC_STORE_MREG_U32_ZX_U64(a_iMReg, a_u32Value) do { \ 445 pVCpu->cpum.GstCtx.XState.x87.aRegs[(a_iMReg)].mmx = (uint32_t)(a_u32Value); \ 446 pVCpu->cpum.GstCtx.XState.x87.aRegs[(a_iMReg)].au32[2] = 0xffff; \ 440 #define IEM_MC_FETCH_MREG_U8(a_u8Value, a_iMReg, a_iByte) \ 441 do { (a_u8Value) = pVCpu->cpum.GstCtx.XState.x87.aRegs[(a_iMReg)].au8[a_iByte]; } while (0) 442 #define IEM_MC_STORE_MREG_U64(a_iMReg, a_u64Value) \ 443 do { pVCpu->cpum.GstCtx.XState.x87.aRegs[(a_iMReg)].mmx = (a_u64Value); \ 444 pVCpu->cpum.GstCtx.XState.x87.aRegs[(a_iMReg)].au32[2] = 0xffff; \ 445 } while (0) 446 #define IEM_MC_STORE_MREG_U32(a_iMReg, a_iDword, a_u32Value) \ 447 do { pVCpu->cpum.GstCtx.XState.x87.aRegs[(a_iMReg)].au32[(a_iDword)] = (a_u32Value); \ 448 pVCpu->cpum.GstCtx.XState.x87.aRegs[(a_iMReg)].au32[2] = 0xffff; \ 449 } while (0) 450 #define IEM_MC_STORE_MREG_U16(a_iMReg, a_iWord, a_u16Value) \ 451 do { pVCpu->cpum.GstCtx.XState.x87.aRegs[(a_iMReg)].au16[(a_iWord)] = (a_u16Value); \ 452 pVCpu->cpum.GstCtx.XState.x87.aRegs[(a_iMReg)].au32[2] = 0xffff; \ 453 } while (0) 454 #define IEM_MC_STORE_MREG_U8(a_iMReg, a_iByte, a_u8Value) \ 455 do { pVCpu->cpum.GstCtx.XState.x87.aRegs[(a_iMReg)].au8[(a_iByte)] = (a_u8Value); \ 456 pVCpu->cpum.GstCtx.XState.x87.aRegs[(a_iMReg)].au32[2] = 0xffff; \ 457 } while (0) 458 #define IEM_MC_STORE_MREG_U32_ZX_U64(a_iMReg, a_u32Value) \ 459 do { pVCpu->cpum.GstCtx.XState.x87.aRegs[(a_iMReg)].mmx = (uint32_t)(a_u32Value); \ 460 pVCpu->cpum.GstCtx.XState.x87.aRegs[(a_iMReg)].au32[2] = 0xffff; \ 447 461 } while (0) 448 462 #define IEM_MC_REF_MREG_U64(a_pu64Dst, a_iMReg) /** @todo need to set high word to 0xffff on commit (see IEM_MC_STORE_MREG_U64) */ \ … … 524 538 do { pVCpu->cpum.GstCtx.XState.x87.aXMM[(a_iXReg)].au32[(a_iDword)] = (a_u32Value); } while (0) 525 539 #define IEM_MC_STORE_XREG_U16(a_iXReg, a_iWord, a_u16Value) \ 526 do { pVCpu->cpum.GstCtx.XState.x87.aXMM[(a_iXReg)].au 32[(a_iWord)] = (a_u16Value); } while (0)540 do { pVCpu->cpum.GstCtx.XState.x87.aXMM[(a_iXReg)].au16[(a_iWord)] = (a_u16Value); } while (0) 527 541 #define IEM_MC_STORE_XREG_U8(a_iXReg, a_iByte, a_u8Value) \ 528 do { pVCpu->cpum.GstCtx.XState.x87.aXMM[(a_iXReg)].au 32[(a_iByte)]= (a_u8Value); } while (0)542 do { pVCpu->cpum.GstCtx.XState.x87.aXMM[(a_iXReg)].au8[(a_iByte)] = (a_u8Value); } while (0) 529 543 530 544 #define IEM_MC_STORE_XREG_U64_ZX_U128(a_iXReg, a_u64Value) \ -
trunk/src/VBox/VMM/testcase/tstIEMCheckMc.cpp
r104058 r104076 783 783 #define IEM_MC_BSWAP_LOCAL_U64(a_u64Local) do { CHK_TYPE(uint64_t, a_u64Local); CHK_VAR(a_u64Local); (void)fMcBegin; } while (0) 784 784 785 #define IEM_MC_FETCH_MREG_U64(a_u64Value, a_iMReg) do { CHK_MREG_IDX(a_iMReg); (a_u64Value) = 0; CHK_VAR(a_u64Value); CHK_TYPE(uint64_t, a_u64Value); (void)fFpuRead; (void)fMcBegin; } while (0)785 #define IEM_MC_FETCH_MREG_U64(a_u64Value, a_iMReg) do { CHK_MREG_IDX(a_iMReg); (a_u64Value) = 0; CHK_VAR(a_u64Value); CHK_TYPE(uint64_t, a_u64Value); (void)fFpuRead; (void)fMcBegin; } while (0) 786 786 #define IEM_MC_FETCH_MREG_U32(a_u32Value, a_iMReg, a_iDWord) do { CHK_MREG_IDX(a_iMReg); (a_u32Value) = 0; CHK_VAR(a_u32Value); CHK_TYPE(uint32_t, a_u32Value); (void)fFpuRead; (void)fMcBegin; } while (0) 787 787 #define IEM_MC_FETCH_MREG_U16(a_u16Value, a_iMReg, a_iWord) do { CHK_MREG_IDX(a_iMReg); (a_u16Value) = 0; CHK_VAR(a_u16Value); CHK_TYPE(uint16_t, a_u16Value); (void)fFpuRead; (void)fMcBegin; } while (0) 788 #define IEM_MC_STORE_MREG_U64(a_iMReg, a_u64Value) do { CHK_MREG_IDX(a_iMReg); CHK_VAR(a_u64Value); CHK_TYPE(uint64_t, a_u64Value); (void)fFpuWrite; (void)fMcBegin; } while (0) 788 #define IEM_MC_FETCH_MREG_U8(a_u8Value, a_iMReg, a_iByte) do { CHK_MREG_IDX(a_iMReg); (a_u8Value) = 0; CHK_VAR(a_u8Value); CHK_TYPE(uint8_t, a_u8Value); (void)fFpuRead; (void)fMcBegin; } while (0) 789 #define IEM_MC_STORE_MREG_U64(a_iMReg, a_u64Value) do { CHK_MREG_IDX(a_iMReg); CHK_VAR(a_u64Value); CHK_TYPE(uint64_t, a_u64Value); (void)fFpuWrite; (void)fMcBegin; } while (0) 790 #define IEM_MC_STORE_MREG_U32(a_iMReg, a_iDword, a_u32Value) do { CHK_MREG_IDX(a_iMReg); CHK_VAR(a_u32Value); CHK_TYPE(uint32_t, a_u32Value); (void)fFpuWrite; (void)fMcBegin; } while (0) 791 #define IEM_MC_STORE_MREG_U16(a_iMReg, a_iWord, a_u16Value) do { CHK_MREG_IDX(a_iMReg); CHK_VAR(a_u16Value); CHK_TYPE(uint16_t, a_u16Value); (void)fFpuWrite; (void)fMcBegin; } while (0) 792 #define IEM_MC_STORE_MREG_U8(a_iMReg, a_iByte, a_u8Value) do { CHK_MREG_IDX(a_iMReg); CHK_VAR(a_u8Value); CHK_TYPE(uint8_t, a_u8Value); (void)fFpuWrite; (void)fMcBegin; } while (0) 789 793 #define IEM_MC_STORE_MREG_U32_ZX_U64(a_iMReg, a_u32Value) do { CHK_MREG_IDX(a_iMReg); CHK_VAR(a_u32Value); CHK_TYPE(uint32_t, a_u32Value); (void)fFpuWrite; (void)fMcBegin; } while (0) 790 794 #define IEM_MC_REF_MREG_U64(a_pu64Dst, a_iMReg) do { CHK_MREG_IDX(a_iMReg); (a_pu64Dst) = (uint64_t *)((uintptr_t)0); CHK_VAR(a_pu64Dst); CHK_PTYPE(uint64_t *, a_pu64Dst); (void)fFpuWrite; (void)fMcBegin; } while (0)
Note:
See TracChangeset
for help on using the changeset viewer.