VirtualBox

Changeset 104188 in vbox


Ignore:
Timestamp:
Apr 5, 2024 1:16:50 PM (6 months ago)
Author:
vboxsync
Message:

VMM/IEM: Implement vpslldq, vpsrldq, instruction dispatch & emulation, bugref:9898

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

Legend:

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

    r104184 r104188  
    56065606IEMIMPL_MEDIA_AVX_INSN_IMM8_2OP vpermilps, 1, 1, 8
    56075607IEMIMPL_MEDIA_AVX_INSN_IMM8_2OP vpermilpd, 1, 1, 8
     5608IEMIMPL_MEDIA_AVX_INSN_IMM8_2OP vpslldq,   1, 1, 7
     5609IEMIMPL_MEDIA_AVX_INSN_IMM8_2OP vpsrldq,   1, 1, 7
    56085610
    56095611
  • trunk/src/VBox/VMM/VMMAll/IEMAllAImplC.cpp

    r104174 r104188  
    1099010990IEM_DECL_IMPL_DEF(void, iemAImpl_psrldq_imm_u128,(PRTUINT128U puDst, uint8_t uShift))
    1099110991{
    10992     RTUINT128U uSrc1 = *puDst;
    10993 
    1099410992    if (uShift < 16)
    1099510993    {
     10994        RTUINT128U uSrc1 = *puDst;
    1099610995        int i;
    1099710996
     
    1100811007}
    1100911008
    11010 #endif
     11009IEM_DECL_IMPL_DEF(void, iemAImpl_vpsrldq_imm_u128,(PRTUINT128U puDst, PCRTUINT128U puSrc, uint8_t uShift))
     11010{
     11011    if (uShift < 16)
     11012    {
     11013        RTUINT128U uSrc1 = *puSrc;
     11014        int i;
     11015
     11016        for (i = 0; i < 16 - uShift; ++i)
     11017            puDst->au8[i] = uSrc1.au8[i + uShift];
     11018        for (i = 16 - uShift; i < 16; ++i)
     11019            puDst->au8[i] = 0;
     11020    }
     11021    else
     11022    {
     11023        puDst->au64[0] = 0;
     11024        puDst->au64[1] = 0;
     11025    }
     11026}
     11027
     11028IEM_DECL_IMPL_DEF(void, iemAImpl_vpsrldq_imm_u256,(PRTUINT256U puDst, PCRTUINT256U puSrc, uint8_t uShift))
     11029{
     11030    iemAImpl_vpsrldq_imm_u128(&puDst->au128[0], &puSrc->au128[0], uShift);
     11031    iemAImpl_vpsrldq_imm_u128(&puDst->au128[1], &puSrc->au128[1], uShift);
     11032}
     11033#endif
     11034
     11035IEM_DECL_IMPL_DEF(void, iemAImpl_vpsrldq_imm_u128_fallback,(PRTUINT128U puDst, PCRTUINT128U puSrc, uint8_t uShift))
     11036{
     11037    if (uShift < 16)
     11038    {
     11039        RTUINT128U uSrc1 = *puSrc;
     11040        int i;
     11041
     11042        for (i = 0; i < 16 - uShift; ++i)
     11043            puDst->au8[i] = uSrc1.au8[i + uShift];
     11044        for (i = 16 - uShift; i < 16; ++i)
     11045            puDst->au8[i] = 0;
     11046    }
     11047    else
     11048    {
     11049        puDst->au64[0] = 0;
     11050        puDst->au64[1] = 0;
     11051    }
     11052}
     11053
     11054IEM_DECL_IMPL_DEF(void, iemAImpl_vpsrldq_imm_u256_fallback,(PRTUINT256U puDst, PCRTUINT256U puSrc, uint8_t uShift))
     11055{
     11056    iemAImpl_vpsrldq_imm_u128_fallback(&puDst->au128[0], &puSrc->au128[0], uShift);
     11057    iemAImpl_vpsrldq_imm_u128_fallback(&puDst->au128[1], &puSrc->au128[1], uShift);
     11058}
    1101111059
    1101211060
     
    1101811066IEM_DECL_IMPL_DEF(void, iemAImpl_pslldq_imm_u128,(PRTUINT128U puDst, uint8_t uShift))
    1101911067{
    11020     RTUINT128U uSrc1 = *puDst;
    11021 
    1102211068    if (uShift < 16)
    1102311069    {
     11070        RTUINT128U uSrc1 = *puDst;
    1102411071        int i;
    1102511072
     
    1103611083}
    1103711084
    11038 #endif
     11085IEM_DECL_IMPL_DEF(void, iemAImpl_vpslldq_imm_u128,(PRTUINT128U puDst, PCRTUINT128U puSrc, uint8_t uShift))
     11086{
     11087    if (uShift < 16)
     11088    {
     11089        RTUINT128U uSrc1 = *puSrc;
     11090        int i;
     11091
     11092        for (i = 0; i < uShift; ++i)
     11093            puDst->au8[i] = 0;
     11094        for (i = uShift; i < 16; ++i)
     11095            puDst->au8[i] = uSrc1.au8[i - uShift];
     11096    }
     11097    else
     11098    {
     11099        puDst->au64[0] = 0;
     11100        puDst->au64[1] = 0;
     11101    }
     11102}
     11103
     11104IEM_DECL_IMPL_DEF(void, iemAImpl_vpslldq_imm_u256,(PRTUINT256U puDst, PCRTUINT256U puSrc, uint8_t uShift))
     11105{
     11106    iemAImpl_vpslldq_imm_u128(&puDst->au128[0], &puSrc->au128[0], uShift);
     11107    iemAImpl_vpslldq_imm_u128(&puDst->au128[1], &puSrc->au128[1], uShift);
     11108}
     11109
     11110#endif
     11111
     11112IEM_DECL_IMPL_DEF(void, iemAImpl_vpslldq_imm_u128_fallback,(PRTUINT128U puDst, PCRTUINT128U puSrc, uint8_t uShift))
     11113{
     11114    if (uShift < 16)
     11115    {
     11116        RTUINT128U uSrc1 = *puSrc;
     11117        int i;
     11118
     11119        for (i = 0; i < uShift; ++i)
     11120            puDst->au8[i] = 0;
     11121        for (i = uShift; i < 16; ++i)
     11122            puDst->au8[i] = uSrc1.au8[i - uShift];
     11123    }
     11124    else
     11125    {
     11126        puDst->au64[0] = 0;
     11127        puDst->au64[1] = 0;
     11128    }
     11129}
     11130
     11131IEM_DECL_IMPL_DEF(void, iemAImpl_vpslldq_imm_u256_fallback,(PRTUINT256U puDst, PCRTUINT256U puSrc, uint8_t uShift))
     11132{
     11133    iemAImpl_vpslldq_imm_u128_fallback(&puDst->au128[0], &puSrc->au128[0], uShift);
     11134    iemAImpl_vpslldq_imm_u128_fallback(&puDst->au128[1], &puSrc->au128[1], uShift);
     11135}
    1103911136
    1104011137
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstVexMap1.cpp.h

    r104186 r104188  
    38133813
    38143814/** Opcode VEX.66.0F 0x73 11/3. */
    3815 FNIEMOP_STUB_1(iemOp_VGrp14_vpsrldq_Hx_Ux_Ib, uint8_t, bRm);
     3815FNIEMOP_DEF_1(iemOp_VGrp14_vpsrldq_Hx_Ux_Ib, uint8_t, bRm)
     3816{
     3817    IEMOP_MNEMONIC3(VEX_VMI_REG, VPSRLDQ, vpsrldq, Hx, Ux, Ib, DISOPTYPE_HARMLESS | DISOPTYPE_X86_AVX, 0);
     3818    if (pVCpu->iem.s.uVexLength)
     3819    {
     3820        return FNIEMOP_CALL_2(iemOpCommonAvxAvx2_Hx_Ux_Ib_u256, bRm,
     3821                              IEM_SELECT_HOST_OR_FALLBACK(fAvx2, iemAImpl_vpsrldq_imm_u256, iemAImpl_vpsrldq_imm_u256_fallback));
     3822    }
     3823    else
     3824    {
     3825        return FNIEMOP_CALL_2(iemOpCommonAvxAvx2_Hx_Ux_Ib_u128, bRm,
     3826                              IEM_SELECT_HOST_OR_FALLBACK(fAvx2, iemAImpl_vpsrldq_imm_u128, iemAImpl_vpsrldq_imm_u128_fallback));
     3827    }
     3828}
    38163829
    38173830/*  Opcode VEX.0F 0x73 11/6 - invalid. */
     
    38343847
    38353848/** Opcode VEX.66.0F 0x73 11/7. */
    3836 FNIEMOP_STUB_1(iemOp_VGrp14_vpslldq_Hx_Ux_Ib, uint8_t, bRm);
     3849FNIEMOP_DEF_1(iemOp_VGrp14_vpslldq_Hx_Ux_Ib, uint8_t, bRm)
     3850{
     3851    IEMOP_MNEMONIC3(VEX_VMI_REG, VPSLLDQ, vpslldq, Hx, Ux, Ib, DISOPTYPE_HARMLESS | DISOPTYPE_X86_AVX, 0);
     3852    if (pVCpu->iem.s.uVexLength)
     3853    {
     3854        return FNIEMOP_CALL_2(iemOpCommonAvxAvx2_Hx_Ux_Ib_u256, bRm,
     3855                              IEM_SELECT_HOST_OR_FALLBACK(fAvx2, iemAImpl_vpslldq_imm_u256, iemAImpl_vpslldq_imm_u256_fallback));
     3856    }
     3857    else
     3858    {
     3859        return FNIEMOP_CALL_2(iemOpCommonAvxAvx2_Hx_Ux_Ib_u128, bRm,
     3860                              IEM_SELECT_HOST_OR_FALLBACK(fAvx2, iemAImpl_vpslldq_imm_u128, iemAImpl_vpslldq_imm_u128_fallback));
     3861    }
     3862}
     3863
     3864/*  Opcode VEX.0F 0x73 11/6 - invalid. */
    38373865
    38383866/**
  • trunk/src/VBox/VMM/include/IEMInternal.h

    r104174 r104188  
    37933793FNIEMAIMPLMEDIAPSHUFU128 iemAImpl_vpsllq_imm_u128, iemAImpl_vpsllq_imm_u128_fallback;
    37943794FNIEMAIMPLMEDIAPSHUFU256 iemAImpl_vpsllq_imm_u256, iemAImpl_vpsllq_imm_u256_fallback;
     3795IEM_DECL_IMPL_DEF(void, iemAImpl_vpslldq_imm_u128,(PRTUINT128U puDst, PCRTUINT128U puSrc, uint8_t uShift));
     3796IEM_DECL_IMPL_DEF(void, iemAImpl_vpslldq_imm_u128_fallback,(PRTUINT128U puDst, PCRTUINT128U puSrc, uint8_t uShift));
     3797IEM_DECL_IMPL_DEF(void, iemAImpl_vpslldq_imm_u256,(PRTUINT256U puDst, PCRTUINT256U puSrc, uint8_t uShift));
     3798IEM_DECL_IMPL_DEF(void, iemAImpl_vpslldq_imm_u256_fallback,(PRTUINT256U puDst, PCRTUINT256U puSrc, uint8_t uShift));
    37953799
    37963800FNIEMAIMPLMEDIAPSHUFU128 iemAImpl_vpsraw_imm_u128, iemAImpl_vpsraw_imm_u128_fallback;
     
    38053809FNIEMAIMPLMEDIAPSHUFU128 iemAImpl_vpsrlq_imm_u128, iemAImpl_vpsrlq_imm_u128_fallback;
    38063810FNIEMAIMPLMEDIAPSHUFU256 iemAImpl_vpsrlq_imm_u256, iemAImpl_vpsrlq_imm_u256_fallback;
    3807 FNIEMAIMPLMEDIAPSHUFU128 iemAImpl_vpsrldq_imm_u128, iemAImpl_vpsrldq_imm_u128_fallback;
    3808 FNIEMAIMPLMEDIAPSHUFU256 iemAImpl_vpsrldq_imm_u256, iemAImpl_vpsrldq_imm_u256_fallback;
     3811IEM_DECL_IMPL_DEF(void, iemAImpl_vpsrldq_imm_u128,(PRTUINT128U puDst, PCRTUINT128U puSrc, uint8_t uShift));
     3812IEM_DECL_IMPL_DEF(void, iemAImpl_vpsrldq_imm_u128_fallback,(PRTUINT128U puDst, PCRTUINT128U puSrc, uint8_t uShift));
     3813IEM_DECL_IMPL_DEF(void, iemAImpl_vpsrldq_imm_u256,(PRTUINT256U puDst, PCRTUINT256U puSrc, uint8_t uShift));
     3814IEM_DECL_IMPL_DEF(void, iemAImpl_vpsrldq_imm_u256_fallback,(PRTUINT256U puDst, PCRTUINT256U puSrc, uint8_t uShift));
    38093815
    38103816FNIEMAIMPLMEDIAOPTF3U128     iemAImpl_vpermilps_u128,     iemAImpl_vpermilps_u128_fallback;
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