VirtualBox

Changeset 103909 in vbox for trunk/src/VBox/VMM/VMMAll


Ignore:
Timestamp:
Mar 19, 2024 9:07:55 AM (9 months ago)
Author:
vboxsync
Message:

VMM/IEM: Implement 'microcoded' vpextr[bwdq] instruction decode, dispatch & emulation, bugref:9898

  • eliminate '256 immediate instructions' jumptable implementations of pextrw, vpextrw
  • eliminate 'fallback' C implementations of pextrw, vpextrw
  • add 'IEM_MC_FETCH_MREG_U16' micro-op
  • fix 'IEM_MC_FETCH_MREG_U32' micro-op to take 'a_iDWord' arg
Location:
trunk/src/VBox/VMM/VMMAll
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/IEMAllAImpl.asm

    r103735 r103909  
    59015901
    59025902;;
    5903 ; pextrw instruction.
    5904 ;
    5905 ; @param    A0      Pointer to the 16bit output operand (output).
    5906 ; @param    A1      Pointer to the media register size operand (input).
    5907 ; @param    A2      The 8-bit immediate
    5908 ;
    5909 BEGINPROC_FASTCALL iemAImpl_pextrw_u64, 16
    5910         PROLOGUE_3_ARGS
    5911         IEMIMPL_SSE_PROLOGUE
    5912 
    5913         movzx   A2, A2_8                ; must clear top bits
    5914         movq    mm0,  A1
    5915         lea     T1, [.imm0 xWrtRIP]
    5916  %ifdef RT_WITH_IBT_BRANCH_PROTECTION_WITHOUT_NOTRACK
    5917         lea     T0, [A2 + A2*8]         ; sizeof(endbrxx+pextrw+ret) == 9: A2 * 9
    5918  %else
    5919         lea     T0, [A2 + A2*4]         ; sizeof(pextrw+ret)         == 5: A2 * 5
    5920  %endif
    5921         lea     T1, [T1 + T0]
    5922         IBT_NOTRACK
    5923         call    T1
    5924         mov     word [A0], T0_16
    5925 
    5926         IEMIMPL_SSE_EPILOGUE
    5927         EPILOGUE_3_ARGS
    5928  %assign bImm 0
    5929  %rep 256
    5930 .imm %+ bImm:
    5931         IBT_ENDBRxx_WITHOUT_NOTRACK
    5932         pextrw  T0_32, mm0, bImm
    5933         ret
    5934   %assign bImm bImm + 1
    5935  %endrep
    5936 .immEnd: IEMCHECK_256_JUMP_ARRAY_SIZE (.immEnd - .imm0), 0x500
    5937 ENDPROC iemAImpl_pextrw_u64
    5938 
    5939 BEGINPROC_FASTCALL iemAImpl_pextrw_u128, 16
    5940         PROLOGUE_3_ARGS
    5941         IEMIMPL_SSE_PROLOGUE
    5942 
    5943         movzx   A2, A2_8                ; must clear top bits
    5944         movdqu  xmm0, [A1]
    5945         lea     T1, [.imm0 xWrtRIP]
    5946  %ifdef RT_WITH_IBT_BRANCH_PROTECTION_WITHOUT_NOTRACK
    5947         lea     T0, [A2 + A2*4]         ; sizeof(endbrxx+pextrw+ret) == 10: A2 * 10 = (A2 * 5) * 2
    5948  %else
    5949         lea     T0, [A2 + A2*2]         ; sizeof(pextrw+ret)         ==  6: A2 *  6 = (A2 * 3) * 2
    5950  %endif
    5951         lea     T1, [T1 + T0*2]
    5952         IBT_NOTRACK
    5953         call    T1
    5954         mov     word [A0], T0_16
    5955 
    5956         IEMIMPL_SSE_EPILOGUE
    5957         EPILOGUE_3_ARGS
    5958  %assign bImm 0
    5959  %rep 256
    5960 .imm %+ bImm:
    5961         IBT_ENDBRxx_WITHOUT_NOTRACK
    5962         pextrw  T0_32, xmm0, bImm
    5963         ret
    5964   %assign bImm bImm + 1
    5965  %endrep
    5966 .immEnd: IEMCHECK_256_JUMP_ARRAY_SIZE (.immEnd - .imm0), 0x600
    5967 ENDPROC iemAImpl_pextrw_u128
    5968 
    5969 ;;
    5970 ; vpextrw instruction.
    5971 ;
    5972 ; @param    A0      Pointer to the 16bit output operand (output).
    5973 ; @param    A1      Pointer to the source media register size operand (input).
    5974 ; @param    A2      The 8-bit immediate
    5975 ;
    5976 BEGINPROC_FASTCALL iemAImpl_vpextrw_u128, 16
    5977         PROLOGUE_3_ARGS
    5978         IEMIMPL_SSE_PROLOGUE
    5979 
    5980         movzx   A2, A2_8                ; must clear top bits
    5981         movdqu  xmm0, [A1]
    5982         lea     T1, [.imm0 xWrtRIP]
    5983  %ifdef RT_WITH_IBT_BRANCH_PROTECTION_WITHOUT_NOTRACK
    5984         lea     T0, [A2 + A2*4]         ; sizeof(endbrxx+vpextrw+ret) == 10: A2 * 10 = (A2 * 5) * 2
    5985  %else
    5986         lea     T0, [A2 + A2*2]         ; sizeof(vpextrw+ret)         ==  6: A2 *  6 = (A2 * 3) * 2
    5987  %endif
    5988         lea     T1, [T1 + T0*2]
    5989         IBT_NOTRACK
    5990         call    T1
    5991         mov     word [A0], T0_16
    5992 
    5993         IEMIMPL_SSE_EPILOGUE
    5994         EPILOGUE_3_ARGS
    5995  %assign bImm 0
    5996  %rep 256
    5997 .imm %+ bImm:
    5998         IBT_ENDBRxx_WITHOUT_NOTRACK
    5999         vpextrw T0_32, xmm0, bImm
    6000         ret
    6001   %assign bImm bImm + 1
    6002  %endrep
    6003 .immEnd: IEMCHECK_256_JUMP_ARRAY_SIZE (.immEnd - .imm0), 0x600
    6004 ENDPROC iemAImpl_vpextrw_u128
    6005 
    6006 
    6007 ;;
    60085903; movmskp{s,d} SSE instruction template
    60095904;
  • trunk/src/VBox/VMM/VMMAll/IEMAllAImplC.cpp

    r103745 r103909  
    1829118291
    1829218292/**
    18293  * [V]PEXTRW
    18294  */
    18295 #ifdef IEM_WITHOUT_ASSEMBLY
    18296 IEM_DECL_IMPL_DEF(void, iemAImpl_pextrw_u64,(uint16_t *pu16Dst, uint64_t u64Src, uint8_t bEvil))
    18297 {
    18298     *pu16Dst = (uint16_t)(u64Src >> ((bEvil & 0x3) * 16));
    18299 }
    18300 
    18301 
    18302 IEM_DECL_IMPL_DEF(void, iemAImpl_pextrw_u128,(uint16_t *pu16Dst, PCRTUINT128U puSrc, uint8_t bEvil))
    18303 {
    18304     *pu16Dst = puSrc->au16[bEvil & 0x7];
    18305 }
    18306 
    18307 #endif
    18308 
    18309 IEM_DECL_IMPL_DEF(void, iemAImpl_vpextrw_u128_fallback,(uint16_t *pu16Dst, PCRTUINT128U puSrc, uint8_t bEvil))
    18310 {
    18311     *pu16Dst = puSrc->au16[bEvil & 0x7];
    18312 }
    18313 
    18314 
    18315 /**
    1831618293 * [V]MOVMSKPS
    1831718294 */
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstPython.py

    r103900 r103909  
    30963096    'IEM_MC_FETCH_MEM16_U8':                                     (McBlock.parseMcGeneric,           True,  True,  False, ),
    30973097    'IEM_MC_FETCH_MEM32_U8':                                     (McBlock.parseMcGeneric,           True,  True,  False, ),
     3098    'IEM_MC_FETCH_MREG_U16':                                     (McBlock.parseMcGeneric,           False, False, False, ),
    30983099    'IEM_MC_FETCH_MREG_U32':                                     (McBlock.parseMcGeneric,           False, False, False, ),
    30993100    'IEM_MC_FETCH_MREG_U64':                                     (McBlock.parseMcGeneric,           False, False, False, ),
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstTwoByte0f.cpp.h

    r103778 r103909  
    75057505            IEM_MC_FPU_TO_MMX_MODE();
    75067506
    7507             IEM_MC_FETCH_MREG_U32(u32Tmp, IEM_GET_MODRM_REG_8(bRm));
     7507            IEM_MC_FETCH_MREG_U32(u32Tmp, IEM_GET_MODRM_REG_8(bRm), 0);
    75087508            IEM_MC_STORE_GREG_U32(IEM_GET_MODRM_RM(pVCpu, bRm), u32Tmp);
    75097509
     
    75237523            IEM_MC_ACTUALIZE_FPU_STATE_FOR_CHANGE();
    75247524
    7525             IEM_MC_FETCH_MREG_U32(u32Tmp, IEM_GET_MODRM_REG_8(bRm));
     7525            IEM_MC_FETCH_MREG_U32(u32Tmp, IEM_GET_MODRM_REG_8(bRm), 0);
    75267526            IEM_MC_STORE_MEM_U32(pVCpu->iem.s.iEffSeg, GCPtrEffSrc, u32Tmp);
    75277527            IEM_MC_FPU_TO_MMX_MODE();
     
    1254812548         * Greg32, MMX, imm8.
    1254912549         */
    12550         IEM_MC_BEGIN(3, 1, IEM_MC_F_NOT_286_OR_OLDER, 0);
     12550        IEM_MC_BEGIN(0, 1, IEM_MC_F_NOT_286_OR_OLDER, 0);
    1255112551        uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm);
    1255212552        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX_EX_2_OR(fSse, fAmdMmxExts);
    12553         IEM_MC_LOCAL(uint16_t,              u16Dst);
    12554         IEM_MC_ARG_LOCAL_REF(uint16_t *,    pu16Dst,  u16Dst,      0);
    12555         IEM_MC_ARG(uint64_t,                u64Src,                1);
    12556         IEM_MC_ARG_CONST(uint8_t,           bImmArg, /*=*/ bImm,   2);
     12553        IEM_MC_LOCAL(uint16_t,  uValue);
    1255712554        IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT();
    1255812555        IEM_MC_PREPARE_FPU_USAGE();
    1255912556        IEM_MC_FPU_TO_MMX_MODE();
    12560         IEM_MC_FETCH_MREG_U64(u64Src, IEM_GET_MODRM_RM_8(bRm));
    12561         IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_pextrw_u64, pu16Dst, u64Src, bImmArg);
    12562         IEM_MC_STORE_GREG_U32(IEM_GET_MODRM_REG(pVCpu, bRm), u16Dst);
     12557        IEM_MC_FETCH_MREG_U16(uValue, IEM_GET_MODRM_RM_8(bRm), bImm & 3);
     12558        IEM_MC_STORE_GREG_U32(IEM_GET_MODRM_REG(pVCpu, bRm), uValue);
    1256312559        IEM_MC_ADVANCE_RIP_AND_FINISH();
    1256412560        IEM_MC_END();
     
    1258012576         * Greg32, XMM, imm8.
    1258112577         */
    12582         IEM_MC_BEGIN(3, 1, IEM_MC_F_NOT_286_OR_OLDER, 0);
     12578        IEM_MC_BEGIN(0, 1, IEM_MC_F_NOT_286_OR_OLDER, 0);
    1258312579        uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm);
    1258412580        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX_EX(fSse2);
    12585         IEM_MC_LOCAL(uint16_t,              u16Dst);
    12586         IEM_MC_ARG_LOCAL_REF(uint16_t *,    pu16Dst,  u16Dst,      0);
    12587         IEM_MC_ARG(PCRTUINT128U,            puSrc,                 1);
    12588         IEM_MC_ARG_CONST(uint8_t,           bImmArg, /*=*/ bImm,   2);
     12581        IEM_MC_LOCAL(uint16_t,  uValue);
    1258912582        IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
    1259012583        IEM_MC_PREPARE_SSE_USAGE();
    12591         IEM_MC_REF_XREG_U128_CONST(puSrc, IEM_GET_MODRM_RM(pVCpu, bRm));
    12592         IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_pextrw_u128, pu16Dst, puSrc, bImmArg);
    12593         IEM_MC_STORE_GREG_U32(IEM_GET_MODRM_REG(pVCpu, bRm), u16Dst);
     12584        IEM_MC_FETCH_XREG_U16(uValue, IEM_GET_MODRM_RM(pVCpu, bRm), bImm & 7);
     12585        IEM_MC_STORE_GREG_U32(IEM_GET_MODRM_REG(pVCpu, bRm), uValue);
    1259412586        IEM_MC_ADVANCE_RIP_AND_FINISH();
    1259512587        IEM_MC_END();
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstVexMap1.cpp.h

    r103787 r103909  
    46444644/*  Opcode VEX.F2.0F 0xc4 - invalid */
    46454645
    4646 /*  Opcode VEX.0F 0xc5 - invlid */
     4646/*  Opcode VEX.0F 0xc5 - invalid */
    46474647
    46484648
     
    46554655    {
    46564656        /*
    4657          * Register, register.
     4657         * greg32, XMM, imm8.
    46584658         */
    46594659        uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm);
    4660         IEM_MC_BEGIN(3, 1, IEM_MC_F_NOT_286_OR_OLDER, 0);
     4660        IEM_MC_BEGIN(0, 1, IEM_MC_F_NOT_286_OR_OLDER, 0);
    46614661        IEMOP_HLP_DONE_VEX_DECODING_L0_EX(fAvx);
    4662         IEM_MC_LOCAL(uint16_t,              u16Dst);
    4663         IEM_MC_ARG_LOCAL_REF(uint16_t *,    pu16Dst,  u16Dst,      0);
    4664         IEM_MC_ARG(PCRTUINT128U,            puSrc,                 1);
    4665         IEM_MC_ARG_CONST(uint8_t,           bImmArg, /*=*/ bImm, 2);
     4662        IEM_MC_LOCAL(uint16_t,  uValue);
    46664663        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    46674664        IEM_MC_PREPARE_AVX_USAGE();
    4668         IEM_MC_REF_XREG_U128_CONST(puSrc,  IEM_GET_MODRM_RM(pVCpu, bRm));
    4669         IEM_MC_CALL_VOID_AIMPL_3(IEM_SELECT_HOST_OR_FALLBACK(fAvx, iemAImpl_vpextrw_u128, iemAImpl_vpextrw_u128_fallback),
    4670                                  pu16Dst, puSrc, bImmArg);
    4671         IEM_MC_STORE_GREG_U32(IEM_GET_MODRM_REG(pVCpu, bRm), u16Dst);
     4665        IEM_MC_FETCH_XREG_U16(uValue, IEM_GET_MODRM_RM(pVCpu, bRm), bImm & 7);
     4666        IEM_MC_STORE_GREG_U32(IEM_GET_MODRM_REG(pVCpu, bRm), uValue);
    46724667        IEM_MC_ADVANCE_RIP_AND_FINISH();
    46734668        IEM_MC_END();
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstVexMap3.cpp.h

    r103900 r103909  
    537537/*  Opcode VEX.66.0F3A 0x12 - invalid */
    538538/*  Opcode VEX.66.0F3A 0x13 - invalid */
    539 /** Opcode VEX.66.0F3A 0x14. */
    540 FNIEMOP_STUB(iemOp_vpextrb_RdMb_Vdq_Ib);
     539
     540
     541/** Opcode VEX.66.0F3A 0x14 - vpextrb Eb, Vdq, Ib */
     542FNIEMOP_DEF(iemOp_vpextrb_Eb_Vdq_Ib)
     543{
     544    IEMOP_MNEMONIC3(VEX_MRI, VPEXTRB, vpextrb, Eb, Vdq, Ib, DISOPTYPE_HARMLESS, IEMOPHINT_VEX_L_ZERO | IEMOPHINT_VEX_V_ZERO); /** @todo */
     545    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     546    if (IEM_IS_MODRM_REG_MODE(bRm))
     547    {
     548        /*
     549         * greg32, XMM, imm8.
     550         */
     551        uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm);
     552        IEM_MC_BEGIN(0, 1, IEM_MC_F_NOT_286_OR_OLDER, 0);
     553        IEM_MC_LOCAL(uint8_t,   uValue);
     554
     555        IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV_EX(fAvx);
     556        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     557        IEM_MC_PREPARE_AVX_USAGE();
     558
     559        IEM_MC_FETCH_XREG_U8(uValue, IEM_GET_MODRM_REG(pVCpu, bRm), bImm & 15 /*a_iByte*/);
     560        IEM_MC_STORE_GREG_U32(IEM_GET_MODRM_RM(pVCpu, bRm), uValue);
     561        IEM_MC_ADVANCE_RIP_AND_FINISH();
     562        IEM_MC_END();
     563    }
     564    else
     565    {
     566        /*
     567         * [mem8], XMM, imm8.
     568         */
     569        uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm);
     570        IEM_MC_BEGIN(0, 2, IEM_MC_F_NOT_286_OR_OLDER, 0);
     571        IEM_MC_LOCAL(uint8_t,   uValue);
     572        IEM_MC_LOCAL(RTGCPTR,   GCPtrEffSrc);
     573        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     574
     575        IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV_EX(fAvx);
     576        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     577        IEM_MC_PREPARE_AVX_USAGE();
     578
     579        IEM_MC_FETCH_XREG_U8(uValue, IEM_GET_MODRM_REG(pVCpu, bRm), bImm & 15 /*a_iByte*/);
     580        IEM_MC_STORE_MEM_U8(pVCpu->iem.s.iEffSeg, GCPtrEffSrc, uValue);
     581        IEM_MC_ADVANCE_RIP_AND_FINISH();
     582        IEM_MC_END();
     583    }
     584}
    541585
    542586
     
    549593    {
    550594        /*
    551          * Register, register.
     595         * greg32, XMM, imm8.
    552596         */
    553597        uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm);
    554         IEM_MC_BEGIN(3, 1, IEM_MC_F_NOT_286_OR_OLDER, 0);
     598        IEM_MC_BEGIN(0, 1, IEM_MC_F_NOT_286_OR_OLDER, 0);
     599        IEM_MC_LOCAL(uint16_t,  uValue);
     600
    555601        IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV_EX(fAvx);
    556602        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    557603        IEM_MC_PREPARE_AVX_USAGE();
    558         IEM_MC_LOCAL(uint16_t,              u16Dst);
    559         IEM_MC_ARG_LOCAL_REF(uint16_t *,    pu16Dst,  u16Dst,      0);
    560         IEM_MC_ARG(PCRTUINT128U,            puSrc,                 1);
    561         IEM_MC_REF_XREG_U128_CONST(puSrc,  IEM_GET_MODRM_REG(pVCpu, bRm));
    562         IEM_MC_ARG_CONST(uint8_t,           bImmArg, /*=*/ bImm, 2);
    563         IEM_MC_CALL_VOID_AIMPL_3(IEM_SELECT_HOST_OR_FALLBACK(fAvx, iemAImpl_vpextrw_u128, iemAImpl_vpextrw_u128_fallback),
    564                                  pu16Dst, puSrc, bImmArg);
    565         IEM_MC_STORE_GREG_U32(IEM_GET_MODRM_RM(pVCpu, bRm), u16Dst);
     604
     605        IEM_MC_FETCH_XREG_U16(uValue, IEM_GET_MODRM_REG(pVCpu, bRm), bImm & 7);
     606        IEM_MC_STORE_GREG_U32(IEM_GET_MODRM_RM(pVCpu, bRm), uValue);
    566607        IEM_MC_ADVANCE_RIP_AND_FINISH();
    567608        IEM_MC_END();
     
    570611    {
    571612        /*
    572          * Memory, register.
     613         * [mem16], XMM, imm8.
    573614         */
    574615        uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm);
    575         IEM_MC_BEGIN(3, 2, IEM_MC_F_NOT_286_OR_OLDER, 0);
    576         IEM_MC_LOCAL(RTGCPTR,               GCPtrEffSrc);
     616        IEM_MC_BEGIN(0, 2, IEM_MC_F_NOT_286_OR_OLDER, 0);
     617        IEM_MC_LOCAL(uint16_t,  uValue);
     618        IEM_MC_LOCAL(RTGCPTR,   GCPtrEffSrc);
    577619        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    578620
     
    581623        IEM_MC_PREPARE_AVX_USAGE();
    582624
    583         IEM_MC_LOCAL(uint16_t,              u16Dst);
    584         IEM_MC_ARG_LOCAL_REF(uint16_t *,    pu16Dst,  u16Dst,       0);
    585         IEM_MC_ARG(PCRTUINT128U,            puSrc,                  1);
    586         IEM_MC_REF_XREG_U128_CONST(puSrc,  IEM_GET_MODRM_REG(pVCpu, bRm));
    587         IEM_MC_ARG_CONST(uint8_t,           bImmArg, /*=*/ bImm,    2);
    588         IEM_MC_CALL_VOID_AIMPL_3(IEM_SELECT_HOST_OR_FALLBACK(fAvx, iemAImpl_vpextrw_u128, iemAImpl_vpextrw_u128_fallback),
    589                                  pu16Dst, puSrc, bImmArg);
    590         IEM_MC_STORE_MEM_U16(pVCpu->iem.s.iEffSeg, GCPtrEffSrc, u16Dst);
     625        IEM_MC_FETCH_XREG_U16(uValue, IEM_GET_MODRM_REG(pVCpu, bRm), bImm & 7);
     626        IEM_MC_STORE_MEM_U16(pVCpu->iem.s.iEffSeg, GCPtrEffSrc, uValue);
    591627        IEM_MC_ADVANCE_RIP_AND_FINISH();
    592628        IEM_MC_END();
     
    595631
    596632
    597 /** Opcode VEX.66.0F3A 0x16. */
    598 FNIEMOP_STUB(iemOp_vpextrd_q_RdMw_Vdq_Ib);
     633/** Opcode VEX.66.0F3A 0x16 - vpextrd / vpextrq Eq / Ey, Vdq, Ib */
     634FNIEMOP_DEF(iemOp_vpextrd_q_Ey_Vdq_Ib)
     635{
     636    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     637    if (pVCpu->iem.s.fPrefixes & IEM_OP_PRF_SIZE_REX_W)
     638    {
     639        IEMOP_MNEMONIC3(VEX_MRI, VPEXTRQ, vpextrq, Eq_WO, Vdq, Ib, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES | IEMOPHINT_VEX_L_ZERO); /** @todo */
     640        if (IEM_IS_MODRM_REG_MODE(bRm))
     641        {
     642            /*
     643             * greg64, XMM, imm8.
     644             */
     645            uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm);
     646            IEM_MC_BEGIN(0, 1, IEM_MC_F_NOT_286_OR_OLDER, 0);
     647            IEM_MC_LOCAL(uint64_t,  uValue);
     648
     649            IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV_EX(fAvx);
     650            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     651            IEM_MC_PREPARE_AVX_USAGE();
     652
     653            IEM_MC_FETCH_XREG_U64(uValue, IEM_GET_MODRM_REG(pVCpu, bRm), bImm & 1);
     654            IEM_MC_STORE_GREG_U64(IEM_GET_MODRM_RM(pVCpu, bRm), uValue);
     655            IEM_MC_ADVANCE_RIP_AND_FINISH();
     656            IEM_MC_END();
     657        }
     658        else
     659        {
     660            /*
     661             * [mem64], XMM, imm8.
     662             */
     663            uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm);
     664            IEM_MC_BEGIN(0, 2, IEM_MC_F_NOT_286_OR_OLDER, 0);
     665            IEM_MC_LOCAL(uint64_t,  uValue);
     666            IEM_MC_LOCAL(RTGCPTR,   GCPtrEffSrc);
     667            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 1);
     668
     669            IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV_EX(fAvx);
     670            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     671            IEM_MC_PREPARE_AVX_USAGE();
     672
     673            IEM_MC_FETCH_XREG_U64(uValue, IEM_GET_MODRM_REG(pVCpu, bRm), bImm & 1);
     674            IEM_MC_STORE_MEM_U64(pVCpu->iem.s.iEffSeg, GCPtrEffSrc, uValue);
     675            IEM_MC_ADVANCE_RIP_AND_FINISH();
     676            IEM_MC_END();
     677        }
     678    }
     679    else
     680    {
     681        /**
     682         * @opdone
     683         */
     684        IEMOP_MNEMONIC3(VEX_MRI, VPEXTRD, vpextrd, Ey, Vdq, Ib, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES | IEMOPHINT_VEX_L_ZERO); /** @todo */
     685        if (IEM_IS_MODRM_REG_MODE(bRm))
     686        {
     687            /*
     688             * greg32, XMM, imm8.
     689             */
     690            uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm);
     691            IEM_MC_BEGIN(0, 1, IEM_MC_F_NOT_286_OR_OLDER, 0);
     692            IEM_MC_LOCAL(uint32_t,  uValue);
     693
     694            IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV_EX(fAvx);
     695            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     696            IEM_MC_PREPARE_AVX_USAGE();
     697
     698            IEM_MC_FETCH_XREG_U32(uValue, IEM_GET_MODRM_REG(pVCpu, bRm), bImm & 3);
     699            IEM_MC_STORE_GREG_U32(IEM_GET_MODRM_RM(pVCpu, bRm), uValue);
     700            IEM_MC_ADVANCE_RIP_AND_FINISH();
     701            IEM_MC_END();
     702        }
     703        else
     704        {
     705            /*
     706             * [mem32], XMM, imm8.
     707             */
     708            uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm);
     709            IEM_MC_BEGIN(0, 2, IEM_MC_F_NOT_286_OR_OLDER, 0);
     710            IEM_MC_LOCAL(uint32_t,  uValue);
     711            IEM_MC_LOCAL(RTGCPTR,   GCPtrEffSrc);
     712            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 1);
     713
     714            IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV_EX(fAvx);
     715            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     716            IEM_MC_PREPARE_AVX_USAGE();
     717
     718            IEM_MC_FETCH_XREG_U32(uValue, IEM_GET_MODRM_REG(pVCpu, bRm), bImm & 3);
     719            IEM_MC_STORE_MEM_U32(pVCpu->iem.s.iEffSeg, GCPtrEffSrc, uValue);
     720            IEM_MC_ADVANCE_RIP_AND_FINISH();
     721            IEM_MC_END();
     722        }
     723    }
     724}
     725
     726
    599727/** Opcode VEX.66.0F3A 0x17. */
    600728FNIEMOP_STUB(iemOp_vextractps_Ed_Vdq_Ib);
     
    14171545    /* 0x12 */  IEMOP_X4(iemOp_InvalidNeedRMImm8),
    14181546    /* 0x13 */  IEMOP_X4(iemOp_InvalidNeedRMImm8),
    1419     /* 0x14 */  iemOp_InvalidNeedRMImm8,    iemOp_vpextrb_RdMb_Vdq_Ib,  iemOp_InvalidNeedRMImm8,    iemOp_InvalidNeedRMImm8,
     1547    /* 0x14 */  iemOp_InvalidNeedRMImm8,    iemOp_vpextrb_Eb_Vdq_Ib,    iemOp_InvalidNeedRMImm8,    iemOp_InvalidNeedRMImm8,
    14201548    /* 0x15 */  iemOp_InvalidNeedRMImm8,    iemOp_vpextrw_Ew_Vdq_Ib,    iemOp_InvalidNeedRMImm8,    iemOp_InvalidNeedRMImm8,
    1421     /* 0x16 */  iemOp_InvalidNeedRMImm8,    iemOp_vpextrd_q_RdMw_Vdq_Ib, iemOp_InvalidNeedRMImm8,   iemOp_InvalidNeedRMImm8,
     1549    /* 0x16 */  iemOp_InvalidNeedRMImm8,    iemOp_vpextrd_q_Ey_Vdq_Ib,  iemOp_InvalidNeedRMImm8,    iemOp_InvalidNeedRMImm8,
    14221550    /* 0x17 */  iemOp_InvalidNeedRMImm8,    iemOp_vextractps_Ed_Vdq_Ib, iemOp_InvalidNeedRMImm8,    iemOp_InvalidNeedRMImm8,
    14231551    /* 0x18 */  iemOp_InvalidNeedRMImm8,    iemOp_vinsertf128_Vqq_Hqq_Wqq_Ib, iemOp_InvalidNeedRMImm8, iemOp_InvalidNeedRMImm8,
  • trunk/src/VBox/VMM/VMMAll/IEMAllN8veLiveness.cpp

    r103828 r103909  
    663663
    664664#define IEM_MC_FETCH_MREG_U64(a_u64Value, a_iMReg)                  NOP()
    665 #define IEM_MC_FETCH_MREG_U32(a_u32Value, a_iMReg)                  NOP()
     665#define IEM_MC_FETCH_MREG_U32(a_u32Value, a_iMReg, a_iDWord)        NOP()
     666#define IEM_MC_FETCH_MREG_U16(a_u16Value, a_iMReg, a_iWord)         NOP()
    666667#define IEM_MC_STORE_MREG_U64(a_iMReg, a_u64Value)                  NOP()
    667668#define IEM_MC_STORE_MREG_U32_ZX_U64(a_iMReg, a_u32Value)           NOP()
  • trunk/src/VBox/VMM/VMMAll/IEMAllThrdPython.py

    r103842 r103909  
    17621762        'IEM_MC_FETCH_MREG_U64':                    '__mreg64',
    17631763        'IEM_MC_FETCH_MREG_U32':                    '__mreg32',
     1764        'IEM_MC_FETCH_MREG_U16':                    '__mreg16',
    17641765        'IEM_MC_STORE_MREG_U64':                    '__mreg64',
    17651766        'IEM_MC_STORE_MREG_U32_ZX_U64':             '__mreg32zx64',
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette