VirtualBox

Changeset 96438 in vbox


Ignore:
Timestamp:
Aug 23, 2022 1:16:15 PM (2 years ago)
Author:
vboxsync
Message:

VMM/IEM: Implement [v]phminposuw instructions, bugref:9898

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

Legend:

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

    r96407 r96438  
    37333733IEMIMPL_MEDIA_OPT_F2 unpckhps, 0
    37343734IEMIMPL_MEDIA_OPT_F2 unpckhpd, 0
     3735IEMIMPL_MEDIA_OPT_F2 phminposuw, 0
    37353736
    37363737;;
     
    42364237;
    42374238; @param    1       The instruction
     4239; @param    2       Flag whether the isntruction has a 256-bit (AVX2) variant (1) or not (0).
    42384240;
    42394241; @param    A0      Pointer to the destination media register size operand (output).
    42404242; @param    A1      Pointer to the source media register size operand (input).
    42414243;
    4242 %macro IEMIMPL_MEDIA_OPT_F2_AVX 1
     4244%macro IEMIMPL_MEDIA_OPT_F2_AVX 2
    42434245BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u128, 12
    42444246        PROLOGUE_2_ARGS
     
    42534255ENDPROC iemAImpl_ %+ %1 %+ _u128
    42544256
     4257 %if %2 == 1
    42554258BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u256, 12
    42564259        PROLOGUE_2_ARGS
     
    42644267        EPILOGUE_2_ARGS
    42654268ENDPROC 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
     4272IEMIMPL_MEDIA_OPT_F2_AVX vpabsb, 1
     4273IEMIMPL_MEDIA_OPT_F2_AVX vpabsw, 1
     4274IEMIMPL_MEDIA_OPT_F2_AVX vpabsd, 1
     4275IEMIMPL_MEDIA_OPT_F2_AVX vphminposuw, 0
    42714276
    42724277
     
    48514856
    48524857;;
    4853 ; shufp{s,d} instructions with 8-bit immediates.
    4854 ;
    4855 ; @param    1       The instruction name.
     4858; shufpd instruction with 8-bit immediates.
    48564859;
    48574860; @param    A0      Pointer to the destination media register size operand (input/output).
     
    48594862; @param    A2      The 8-bit immediate
    48604863;
    4861 %macro IEMIMPL_MEDIA_SSE_SHUFPX 1
    4862 BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u128, 16
     4864BEGINPROC_FASTCALL iemAImpl_shufpd_u128, 16
    48634865        PROLOGUE_3_ARGS
    48644866        IEMIMPL_SSE_PROLOGUE
     
    48774879 %rep 256
    48784880.imm %+ bImm:
    4879        %1       xmm0, xmm1, bImm
     4881       shufpd   xmm0, xmm1, bImm
    48804882       ret
    48814883  %assign bImm bImm + 1
     
    48844886dw 0xf9ff  + (.immEnd - .imm0)          ; will cause warning if entries are too big.
    48854887dw 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
     4888ENDPROC iemAImpl_shufpd_u128
    48914889
    48924890
  • trunk/src/VBox/VMM/VMMAll/IEMAllAImplC.cpp

    r96407 r96438  
    1512515125    puDst->au64[3] = (bEvil & RT_BIT(3)) ? uSrc2.au64[3] : uSrc2.au64[2];
    1512615126}
     15127
     15128
     15129/*
     15130 * PHMINPOSUW / VPHMINPOSUW
     15131 */
     15132IEM_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
     15151IEM_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  
    998998
    999999/** Opcode 0x66 0x0f 0x38 0x41. */
    1000 FNIEMOP_STUB(iemOp_phminposuw_Vdq_Wdq);
     1000FNIEMOP_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
    10011008/*  Opcode 0x66 0x0f 0x38 0x42 - invalid. */
    10021009/*  Opcode 0x66 0x0f 0x38 0x43 - invalid. */
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsVexMap2.cpp.h

    r96407 r96438  
    780780
    781781/** Opcode VEX.66.0F38 0x41. */
    782 FNIEMOP_STUB(iemOp_vphminposuw_Vdq_Wdq);
     782FNIEMOP_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
    783835/*  Opcode VEX.66.0F38 0x42 - invalid. */
    784836/*  Opcode VEX.66.0F38 0x43 - invalid. */
  • trunk/src/VBox/VMM/include/IEMInternal.h

    r96407 r96438  
    18711871FNIEMAIMPLMEDIAOPTF2U128 iemAImpl_unpcklps_u128, iemAImpl_unpcklpd_u128;
    18721872FNIEMAIMPLMEDIAOPTF2U128 iemAImpl_unpckhps_u128, iemAImpl_unpckhpd_u128;
     1873FNIEMAIMPLMEDIAOPTF2U128 iemAImpl_phminposuw_u128, iemAImpl_phminposuw_u128_fallback;
    18731874
    18741875FNIEMAIMPLMEDIAF3U128    iemAImpl_vpshufb_u128,    iemAImpl_vpshufb_u128_fallback;
     
    19331934FNIEMAIMPLMEDIAOPTF2U128 iemAImpl_vpabsw_u128,     iemAImpl_vpabsd_u128_fallback;
    19341935FNIEMAIMPLMEDIAOPTF2U128 iemAImpl_vpabsd_u128,     iemAImpl_vpabsw_u128_fallback;
     1936FNIEMAIMPLMEDIAOPTF2U128 iemAImpl_vphminposuw_u128, iemAImpl_vphminposuw_u128_fallback;
    19351937
    19361938FNIEMAIMPLMEDIAF3U256    iemAImpl_vpshufb_u256,    iemAImpl_vpshufb_u256_fallback;
  • trunk/src/VBox/VMM/include/IEMOpHlp.h

    r96407 r96438  
    461461    } while (0)
    462462
     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
    463480
    464481/**
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