VirtualBox

Changeset 96707 in vbox


Ignore:
Timestamp:
Sep 12, 2022 4:57:18 PM (2 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
153591
Message:

VMM/IEM: Implement [v]pextrw instruction, bugref:9898

Location:
trunk/src/VBox/VMM
Files:
5 edited

Legend:

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

    r96701 r96707  
    53375337dw 0x105ff - (.immEnd - .imm0)          ; will cause warning if entries are too small.
    53385338ENDPROC iemAImpl_vpinsrw_u128
     5339
     5340
     5341;;
     5342; pextrw instruction.
     5343;
     5344; @param    A0      Pointer to the 16bit output operand (output).
     5345; @param    A1      Pointer to the media register size operand (input).
     5346; @param    A2      The 8-bit immediate
     5347;
     5348BEGINPROC_FASTCALL iemAImpl_pextrw_u64, 16
     5349        PROLOGUE_3_ARGS
     5350        IEMIMPL_SSE_PROLOGUE
     5351
     5352        movq    mm0,  A1
     5353        lea     T0, [A2 + A2*4]         ; sizeof(pextrw+ret) == 5
     5354        lea     T1, [.imm0 xWrtRIP]
     5355        lea     T1, [T1 + T0]
     5356        call    T1
     5357        mov     word [A0], T0_16
     5358
     5359        IEMIMPL_SSE_EPILOGUE
     5360        EPILOGUE_3_ARGS
     5361 %assign bImm 0
     5362 %rep 256
     5363.imm %+ bImm:
     5364       pextrw   T0_32, mm0, bImm
     5365       ret
     5366  %assign bImm bImm + 1
     5367 %endrep
     5368.immEnd:                                ; 256*5 == 0x500
     5369dw 0xfaff  + (.immEnd - .imm0)          ; will cause warning if entries are too big.
     5370dw 0x104ff - (.immEnd - .imm0)          ; will cause warning if entries are too small.
     5371ENDPROC iemAImpl_pextrw_u64
     5372
     5373BEGINPROC_FASTCALL iemAImpl_pextrw_u128, 16
     5374        PROLOGUE_3_ARGS
     5375        IEMIMPL_SSE_PROLOGUE
     5376
     5377        movdqu  xmm0, [A1]
     5378        lea     T1, [.imm0 xWrtRIP]
     5379        lea     T0, [A2 + A2*2]         ; sizeof(pextrw+ret) == 6: (A2 * 3) *2
     5380        lea     T1, [T1 + T0*2]
     5381        call    T1
     5382        mov     word [A0], T0_16
     5383
     5384        IEMIMPL_SSE_EPILOGUE
     5385        EPILOGUE_3_ARGS
     5386 %assign bImm 0
     5387 %rep 256
     5388.imm %+ bImm:
     5389       pextrw   T0_32, xmm0, bImm
     5390       ret
     5391  %assign bImm bImm + 1
     5392 %endrep
     5393.immEnd:                                ; 256*6 == 0x600
     5394dw 0xf9ff  + (.immEnd - .imm0)          ; will cause warning if entries are too big.
     5395dw 0x105ff - (.immEnd - .imm0)          ; will cause warning if entries are too small.
     5396ENDPROC iemAImpl_pextrw_u128
     5397
     5398;;
     5399; vpextrw instruction.
     5400;
     5401; @param    A0      Pointer to the 16bit output operand (output).
     5402; @param    A1      Pointer to the source media register size operand (input).
     5403; @param    A2      The 8-bit immediate
     5404;
     5405BEGINPROC_FASTCALL iemAImpl_vpextrw_u128, 16
     5406        PROLOGUE_3_ARGS
     5407        IEMIMPL_SSE_PROLOGUE
     5408
     5409        movdqu  xmm0, [A1]
     5410        lea     T1, [.imm0 xWrtRIP]
     5411        lea     T0, [A2 + A2*2]         ; sizeof(vpextrw+ret) == 6: (A2 * 3) *2
     5412        lea     T1, [T1 + T0*2]
     5413        call    T1
     5414        mov     word [A0], T0_16
     5415
     5416        IEMIMPL_SSE_EPILOGUE
     5417        EPILOGUE_3_ARGS
     5418 %assign bImm 0
     5419 %rep 256
     5420.imm %+ bImm:
     5421       vpextrw   T0_32, xmm0, bImm
     5422       ret
     5423  %assign bImm bImm + 1
     5424 %endrep
     5425.immEnd:                                ; 256*6 == 0x600
     5426dw 0xf9ff  + (.immEnd - .imm0)          ; will cause warning if entries are too big.
     5427dw 0x105ff - (.immEnd - .imm0)          ; will cause warning if entries are too small.
     5428ENDPROC iemAImpl_vpextrw_u128
  • trunk/src/VBox/VMM/VMMAll/IEMAllAImplC.cpp

    r96701 r96707  
    1591215912    puDst->au16[bEvil & 0x7] = u16Src;
    1591315913}
     15914
     15915
     15916/**
     15917 * [V]PEXTRW
     15918 */
     15919#ifdef IEM_WITHOUT_ASSEMBLY
     15920IEM_DECL_IMPL_DEF(void, iemAImpl_pextrw_u64,(uint16_t *pu16Dst, uint64_t u64Src, uint8_t bEvil))
     15921{
     15922    *pu16Dst = (uint16_t)(u64Src >> ((bEvil & 0x3) * 16));
     15923}
     15924
     15925
     15926IEM_DECL_IMPL_DEF(void, iemAImpl_pextrw_u128,(uint16_t *pu16Dst, PCRTUINT128U puSrc, uint8_t bEvil))
     15927{
     15928    *pu16Dst = puSrc->au16[bEvil & 0x7];
     15929}
     15930
     15931#endif
     15932
     15933IEM_DECL_IMPL_DEF(void, iemAImpl_vpextrw_u128_fallback,(uint16_t *pu16Dst, PCRTUINT128U puSrc, uint8_t bEvil))
     15934{
     15935    *pu16Dst = puSrc->au16[bEvil & 0x7];
     15936}
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsTwoByte0f.cpp.h

    r96701 r96707  
    1006110061/*  Opcode 0xf2 0x0f 0xc4 - invalid */
    1006210062
     10063
    1006310064/** Opcode      0x0f 0xc5 - pextrw Gd, Nq, Ib */
    10064 FNIEMOP_STUB(iemOp_pextrw_Gd_Nq_Ib);
     10065FNIEMOP_DEF(iemOp_pextrw_Gd_Nq_Ib)
     10066{
     10067    /*IEMOP_MNEMONIC3(RMI_REG, PEXTRW, pinsrw, Gd, Nq, Ib, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, 0);*/ /** @todo */
     10068    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     10069    if (IEM_IS_MODRM_REG_MODE(bRm))
     10070    {
     10071        /*
     10072         * Register, register.
     10073         */
     10074        uint8_t bEvil; IEM_OPCODE_GET_NEXT_U8(&bEvil);
     10075        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     10076        IEM_MC_BEGIN(3, 1);
     10077        IEM_MC_LOCAL(uint16_t,              u16Dst);
     10078        IEM_MC_ARG_LOCAL_REF(uint16_t *,    pu16Dst,  u16Dst,      0);
     10079        IEM_MC_ARG(uint64_t,                u64Src,                1);
     10080        IEM_MC_ARG_CONST(uint8_t,           bEvilArg, /*=*/ bEvil, 2);
     10081        IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT_CHECK_SSE_OR_MMXEXT();
     10082        IEM_MC_PREPARE_FPU_USAGE();
     10083        IEM_MC_FETCH_MREG_U64(u64Src, IEM_GET_MODRM_RM(pVCpu, bRm));
     10084        IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_pextrw_u64, pu16Dst, u64Src, bEvilArg);
     10085        IEM_MC_STORE_GREG_U32(IEM_GET_MODRM_REG(pVCpu, bRm), u16Dst);
     10086        IEM_MC_FPU_TO_MMX_MODE();
     10087        IEM_MC_ADVANCE_RIP();
     10088        IEM_MC_END();
     10089        return VINF_SUCCESS;
     10090    }
     10091
     10092    /* No memory operand. */
     10093    return IEMOP_RAISE_INVALID_OPCODE();
     10094}
     10095
     10096
    1006510097/** Opcode 0x66 0x0f 0xc5 - pextrw Gd, Udq, Ib */
    10066 FNIEMOP_STUB(iemOp_pextrw_Gd_Udq_Ib);
     10098FNIEMOP_DEF(iemOp_pextrw_Gd_Udq_Ib)
     10099{
     10100    IEMOP_MNEMONIC3(RMI_REG, PEXTRW, pextrw, Gd, Ux, Ib, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, 0);
     10101    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     10102    if (IEM_IS_MODRM_REG_MODE(bRm))
     10103    {
     10104        /*
     10105         * Register, register.
     10106         */
     10107        uint8_t bEvil; IEM_OPCODE_GET_NEXT_U8(&bEvil);
     10108        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     10109        IEM_MC_BEGIN(3, 1);
     10110        IEM_MC_LOCAL(uint16_t,              u16Dst);
     10111        IEM_MC_ARG_LOCAL_REF(uint16_t *,    pu16Dst,  u16Dst,      0);
     10112        IEM_MC_ARG(PCRTUINT128U,            puSrc,                 1);
     10113        IEM_MC_ARG_CONST(uint8_t,           bEvilArg, /*=*/ bEvil, 2);
     10114        IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
     10115        IEM_MC_PREPARE_SSE_USAGE();
     10116        IEM_MC_REF_XREG_U128_CONST(puSrc, IEM_GET_MODRM_RM(pVCpu, bRm));
     10117        IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_pextrw_u128, pu16Dst, puSrc, bEvilArg);
     10118        IEM_MC_STORE_GREG_U32(IEM_GET_MODRM_REG(pVCpu, bRm), u16Dst);
     10119        IEM_MC_ADVANCE_RIP();
     10120        IEM_MC_END();
     10121        return VINF_SUCCESS;
     10122    }
     10123
     10124    /* No memory operand. */
     10125    return IEMOP_RAISE_INVALID_OPCODE();
     10126}
     10127
     10128
    1006710129/*  Opcode 0xf3 0x0f 0xc5 - invalid */
    1006810130/*  Opcode 0xf2 0x0f 0xc5 - invalid */
     10131
    1006910132
    1007010133/** Opcode      0x0f 0xc6 - shufps Vps, Wps, Ib */
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsVexMap1.cpp.h

    r96701 r96707  
    40364036
    40374037/*  Opcode VEX.0F 0xc5 - invlid */
     4038
     4039
    40384040/** Opcode VEX.66.0F 0xc5 - vpextrw Gd, Udq, Ib */
    4039 FNIEMOP_STUB(iemOp_vpextrw_Gd_Udq_Ib);
     4041FNIEMOP_DEF(iemOp_vpextrw_Gd_Udq_Ib)
     4042{
     4043    IEMOP_MNEMONIC3(VEX_RMI_REG, VPEXTRW, vpextrw, Gd, Ux, Ib, DISOPTYPE_HARMLESS, IEMOPHINT_VEX_L_ZERO);
     4044    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     4045    if (IEM_IS_MODRM_REG_MODE(bRm))
     4046    {
     4047        /*
     4048         * Register, register.
     4049         */
     4050        uint8_t bEvil; IEM_OPCODE_GET_NEXT_U8(&bEvil);
     4051        IEMOP_HLP_DONE_VEX_DECODING_L0_EX(fAvx);
     4052        IEM_MC_BEGIN(3, 1);
     4053        IEM_MC_LOCAL(uint16_t,              u16Dst);
     4054        IEM_MC_ARG_LOCAL_REF(uint16_t *,    pu16Dst,  u16Dst,      0);
     4055        IEM_MC_ARG(PCRTUINT128U,            puSrc,                 1);
     4056        IEM_MC_ARG_CONST(uint8_t,           bEvilArg, /*=*/ bEvil, 2);
     4057        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     4058        IEM_MC_PREPARE_AVX_USAGE();
     4059        IEM_MC_REF_XREG_U128_CONST(puSrc,  IEM_GET_MODRM_RM(pVCpu, bRm));
     4060        IEM_MC_CALL_VOID_AIMPL_3(IEM_SELECT_HOST_OR_FALLBACK(fAvx, iemAImpl_vpextrw_u128, iemAImpl_vpextrw_u128_fallback),
     4061                                 pu16Dst, puSrc, bEvilArg);
     4062        IEM_MC_STORE_GREG_U32(IEM_GET_MODRM_REG(pVCpu, bRm), u16Dst);
     4063        IEM_MC_ADVANCE_RIP();
     4064        IEM_MC_END();
     4065        return VINF_SUCCESS;
     4066    }
     4067
     4068    /* No memory operand. */
     4069    return IEMOP_RAISE_INVALID_OPCODE();
     4070}
     4071
     4072
    40404073/*  Opcode VEX.F3.0F 0xc5 - invalid */
    40414074/*  Opcode VEX.F2.0F 0xc5 - invalid */
  • trunk/src/VBox/VMM/include/IEMInternal.h

    r96701 r96707  
    22212221IEM_DECL_IMPL_DEF(void, iemAImpl_vpinsrw_u128,(PRTUINT128U puDst, PCRTUINT128U puSrc, uint16_t u16Src, uint8_t bEvil));
    22222222IEM_DECL_IMPL_DEF(void, iemAImpl_vpinsrw_u128_fallback,(PRTUINT128U puDst, PCRTUINT128U puSrc, uint16_t u16Src, uint8_t bEvil));
     2223
     2224IEM_DECL_IMPL_DEF(void, iemAImpl_pextrw_u64,(uint16_t *pu16Dst, uint64_t u64Src, uint8_t bEvil));
     2225IEM_DECL_IMPL_DEF(void, iemAImpl_pextrw_u128,(uint16_t *pu16Dst, PCRTUINT128U puSrc, uint8_t bEvil));
     2226IEM_DECL_IMPL_DEF(void, iemAImpl_vpextrw_u128,(uint16_t *pu16Dst, PCRTUINT128U puSrc, uint8_t bEvil));
     2227IEM_DECL_IMPL_DEF(void, iemAImpl_vpextrw_u128_fallback,(uint16_t *pu16Dst, PCRTUINT128U puSrc, uint8_t bEvil));
    22232228
    22242229
Note: See TracChangeset for help on using the changeset viewer.

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