VirtualBox

Changeset 103267 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Feb 8, 2024 6:34:32 AM (12 months ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
161558
Message:

VMM/IEM: Implement vpsrl[wdq] 'reg/mem' instruction dispatch & emulation
VMM/IEM: Implement vpsrl[wdq] 'imm8' instruction decode, dispatch & emulation
bugref:9898

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

Legend:

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

    r103265 r103267  
    44734473IEMIMPL_SHIFT_OPT_F3 vpsraw
    44744474IEMIMPL_SHIFT_OPT_F3 vpsrad
     4475IEMIMPL_SHIFT_OPT_F3 vpsrlw
     4476IEMIMPL_SHIFT_OPT_F3 vpsrld
     4477IEMIMPL_SHIFT_OPT_F3 vpsrlq
    44754478
    44764479
  • trunk/src/VBox/VMM/VMMAll/IEMAllAImplC.cpp

    r103265 r103267  
    1013010130#endif
    1013110131
     10132IEM_DECL_IMPL_DEF(void, iemAImpl_vpsrlw_imm_u128_fallback,(PRTUINT128U puDst, PCRTUINT128U puSrc1, uint8_t uShift))
     10133{
     10134    RTUINT128U uSrc1 = *puSrc1;
     10135 
     10136    if (uShift <= 15)
     10137    {
     10138        puDst->au16[0] = uSrc1.au16[0] >> uShift;
     10139        puDst->au16[1] = uSrc1.au16[1] >> uShift;
     10140        puDst->au16[2] = uSrc1.au16[2] >> uShift;
     10141        puDst->au16[3] = uSrc1.au16[3] >> uShift;
     10142        puDst->au16[4] = uSrc1.au16[4] >> uShift;
     10143        puDst->au16[5] = uSrc1.au16[5] >> uShift;
     10144        puDst->au16[6] = uSrc1.au16[6] >> uShift;
     10145        puDst->au16[7] = uSrc1.au16[7] >> uShift;
     10146    }
     10147    else
     10148    {
     10149        puDst->au64[0] = 0;
     10150        puDst->au64[1] = 0;
     10151    }
     10152}
     10153
     10154IEM_DECL_IMPL_DEF(void, iemAImpl_vpsrlw_u128_fallback,(PRTUINT128U puDst, PCRTUINT128U puSrc1, PCRTUINT128U puSrc2))
     10155{
     10156    iemAImpl_vpsrlw_imm_u128_fallback(puDst, puSrc1, RT_MIN(15, puSrc2->au64[0]));
     10157}
     10158
     10159IEM_DECL_IMPL_DEF(void, iemAImpl_vpsrlw_imm_u128,(PRTUINT128U puDst, PCRTUINT128U puSrc1, uint8_t uShift))
     10160{
     10161     iemAImpl_vpsrlw_imm_u128_fallback(puDst, puSrc1, uShift);
     10162}
     10163
     10164IEM_DECL_IMPL_DEF(void, iemAImpl_vpsrlw_imm_u256_fallback,(PRTUINT256U puDst, PCRTUINT256U puSrc1, uint8_t uShift))
     10165{
     10166    RTUINT256U uSrc1 = *puSrc1;
     10167
     10168    if (uShift <= 15)
     10169    {
     10170        puDst->au16[0] = uSrc1.au16[0] >> uShift;
     10171        puDst->au16[1] = uSrc1.au16[1] >> uShift;
     10172        puDst->au16[2] = uSrc1.au16[2] >> uShift;
     10173        puDst->au16[3] = uSrc1.au16[3] >> uShift;
     10174        puDst->au16[4] = uSrc1.au16[4] >> uShift;
     10175        puDst->au16[5] = uSrc1.au16[5] >> uShift;
     10176        puDst->au16[6] = uSrc1.au16[6] >> uShift;
     10177        puDst->au16[7] = uSrc1.au16[7] >> uShift;
     10178        puDst->au16[8] = uSrc1.au16[8] >> uShift;
     10179        puDst->au16[9] = uSrc1.au16[9] >> uShift;
     10180        puDst->au16[10] = uSrc1.au16[10] >> uShift;
     10181        puDst->au16[11] = uSrc1.au16[11] >> uShift;
     10182        puDst->au16[12] = uSrc1.au16[12] >> uShift;
     10183        puDst->au16[13] = uSrc1.au16[13] >> uShift;
     10184        puDst->au16[14] = uSrc1.au16[14] >> uShift;
     10185        puDst->au16[15] = uSrc1.au16[15] >> uShift;
     10186    }
     10187    else
     10188    {
     10189        puDst->au64[0] = 0;
     10190        puDst->au64[1] = 0;
     10191        puDst->au64[2] = 0;
     10192        puDst->au64[3] = 0;
     10193    }
     10194}
     10195
     10196IEM_DECL_IMPL_DEF(void, iemAImpl_vpsrlw_imm_u256,(PRTUINT256U puDst, PCRTUINT256U puSrc1, uint8_t uShift))
     10197{
     10198    iemAImpl_vpsrlw_imm_u256_fallback(puDst, puSrc1, uShift);
     10199}
     10200
     10201IEM_DECL_IMPL_DEF(void, iemAImpl_vpsrlw_u256_fallback,(PRTUINT256U puDst, PCRTUINT256U puSrc1, PCRTUINT256U puSrc2))
     10202{
     10203    iemAImpl_vpsrlw_imm_u256_fallback(puDst, puSrc1, RT_MIN(15, puSrc2->au64[0]));
     10204}
     10205
    1013210206
    1013310207/*
     
    1051210586#endif
    1051310587
     10588IEM_DECL_IMPL_DEF(void, iemAImpl_vpsrld_imm_u128_fallback,(PRTUINT128U puDst, PCRTUINT128U puSrc1, uint8_t uShift))
     10589{
     10590    RTUINT128U uSrc1 = *puSrc1;
     10591 
     10592    if (uShift <= 31)
     10593    {
     10594        puDst->au32[0] = uSrc1.au32[0] >> uShift;
     10595        puDst->au32[1] = uSrc1.au32[1] >> uShift;
     10596        puDst->au32[2] = uSrc1.au32[2] >> uShift;
     10597        puDst->au32[3] = uSrc1.au32[3] >> uShift;
     10598    }
     10599    else
     10600    {
     10601        puDst->au64[0] = 0;
     10602        puDst->au64[1] = 0;
     10603    }
     10604}
     10605
     10606IEM_DECL_IMPL_DEF(void, iemAImpl_vpsrld_imm_u128,(PRTUINT128U puDst, PCRTUINT128U puSrc1, uint8_t uShift))
     10607{
     10608    iemAImpl_vpsrld_imm_u128_fallback(puDst, puSrc1, uShift);
     10609}
     10610
     10611IEM_DECL_IMPL_DEF(void, iemAImpl_vpsrld_u128_fallback,(PRTUINT128U puDst, PCRTUINT128U puSrc1, PCRTUINT128U puSrc2))
     10612{
     10613    iemAImpl_vpsrld_imm_u128_fallback(puDst, puSrc1, RT_MIN(31, puSrc2->au64[0]));
     10614}
     10615
     10616IEM_DECL_IMPL_DEF(void, iemAImpl_vpsrld_imm_u256_fallback,(PRTUINT256U puDst, PCRTUINT256U puSrc1, uint8_t uShift))
     10617{
     10618    RTUINT256U uSrc1 = *puSrc1;
     10619 
     10620    if (uShift <= 31)
     10621    {
     10622       puDst->au32[0] = uSrc1.au32[0] >> uShift;
     10623       puDst->au32[1] = uSrc1.au32[1] >> uShift;
     10624       puDst->au32[2] = uSrc1.au32[2] >> uShift;
     10625       puDst->au32[3] = uSrc1.au32[3] >> uShift;
     10626       puDst->au32[4] = uSrc1.au32[4] >> uShift;
     10627       puDst->au32[5] = uSrc1.au32[5] >> uShift;
     10628       puDst->au32[6] = uSrc1.au32[6] >> uShift;
     10629       puDst->au32[7] = uSrc1.au32[7] >> uShift;
     10630    }
     10631    else
     10632    {
     10633        puDst->au64[0] = 0;
     10634        puDst->au64[1] = 0;
     10635        puDst->au64[2] = 0;
     10636        puDst->au64[3] = 0;
     10637    }
     10638}
     10639
     10640IEM_DECL_IMPL_DEF(void, iemAImpl_vpsrld_u256_fallback,(PRTUINT256U puDst, PCRTUINT256U puSrc1, PCRTUINT256U puSrc2))
     10641{
     10642    iemAImpl_vpsrld_imm_u256_fallback(puDst, puSrc1, RT_MIN(31, puSrc2->au64[0]));
     10643}
     10644
     10645IEM_DECL_IMPL_DEF(void, iemAImpl_vpsrld_imm_u256,(PRTUINT256U puDst, PCRTUINT256U puSrc1, uint8_t uShift))
     10646{
     10647    iemAImpl_vpsrld_imm_u256_fallback(puDst, puSrc1, uShift);
     10648}
     10649
    1051410650
    1051510651/*
     
    1084010976
    1084110977#endif
     10978
     10979IEM_DECL_IMPL_DEF(void, iemAImpl_vpsrlq_imm_u128_fallback,(PRTUINT128U puDst, PCRTUINT128U puSrc1, uint8_t uShift))
     10980{
     10981    RTUINT128U uSrc1 = *puSrc1;
     10982 
     10983    if (uShift <= 63)
     10984    {
     10985        puDst->au64[0] = uSrc1.au64[0] >> uShift;
     10986        puDst->au64[1] = uSrc1.au64[1] >> uShift;
     10987    }
     10988    else
     10989    {
     10990        puDst->au64[0] = 0;
     10991        puDst->au64[1] = 0;
     10992    }
     10993}
     10994
     10995IEM_DECL_IMPL_DEF(void, iemAImpl_vpsrlq_imm_u128,(PRTUINT128U puDst, PCRTUINT128U puSrc1, uint8_t uShift))
     10996{
     10997    iemAImpl_vpsrlq_imm_u128_fallback(puDst, puSrc1, uShift);
     10998}
     10999
     11000IEM_DECL_IMPL_DEF(void, iemAImpl_vpsrlq_u128_fallback,(PRTUINT128U puDst, PCRTUINT128U puSrc1, PCRTUINT128U puSrc2))
     11001{
     11002    iemAImpl_vpsrlq_imm_u128_fallback(puDst, puSrc1, RT_MIN(31, puSrc2->au64[0]));
     11003}
     11004
     11005IEM_DECL_IMPL_DEF(void, iemAImpl_vpsrlq_imm_u256_fallback,(PRTUINT256U puDst, PCRTUINT256U puSrc1, uint8_t uShift))
     11006{
     11007    RTUINT256U uSrc1 = *puSrc1;
     11008 
     11009    if (uShift <= 63)
     11010    {
     11011        puDst->au64[0] = uSrc1.au64[0] >> uShift;
     11012        puDst->au64[1] = uSrc1.au64[1] >> uShift;
     11013        puDst->au64[2] = uSrc1.au64[2] >> uShift;
     11014        puDst->au64[3] = uSrc1.au64[3] >> uShift;
     11015    }
     11016    else
     11017    {
     11018        puDst->au64[0] = 0;
     11019        puDst->au64[1] = 0;
     11020        puDst->au64[2] = 0;
     11021        puDst->au64[3] = 0;
     11022    }
     11023}
     11024
     11025IEM_DECL_IMPL_DEF(void, iemAImpl_vpsrlq_u256_fallback,(PRTUINT256U puDst, PCRTUINT256U puSrc1, PCRTUINT256U puSrc2))
     11026{
     11027    iemAImpl_vpsrlq_imm_u256_fallback(puDst, puSrc1, RT_MIN(31, puSrc2->au64[0]));
     11028}
     11029
     11030IEM_DECL_IMPL_DEF(void, iemAImpl_vpsrlq_imm_u256,(PRTUINT256U puDst, PCRTUINT256U puSrc1, uint8_t uShift))
     11031{
     11032    iemAImpl_vpsrlq_imm_u256_fallback(puDst, puSrc1, uShift);
     11033}
    1084211034
    1084311035
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstVexMap1.cpp.h

    r103265 r103267  
    36373637/*  Opcode VEX.0F 0x71 11/2 - invalid. */
    36383638/** Opcode VEX.66.0F 0x71 11/2. */
    3639 FNIEMOP_STUB_1(iemOp_VGrp12_vpsrlw_Hx_Ux_Ib, uint8_t, bRm);
     3639FNIEMOP_DEF_1(iemOp_VGrp12_vpsrlw_Hx_Ux_Ib, uint8_t, bRm)
     3640{
     3641    IEMOP_MNEMONIC3(VEX_VMI_REG, VPSRLW, vpsrlw, Hx, Ux, Ib, DISOPTYPE_HARMLESS | DISOPTYPE_X86_AVX, 0);
     3642    if (pVCpu->iem.s.uVexLength)
     3643    {
     3644        return FNIEMOP_CALL_2(iemOpCommonAvxAvx2_Hx_Ux_Ib_u256, bRm,
     3645                              IEM_SELECT_HOST_OR_FALLBACK(fAvx2, iemAImpl_vpsrlw_imm_u256, iemAImpl_vpsrlw_imm_u256_fallback));
     3646    }
     3647    else
     3648    {
     3649        return FNIEMOP_CALL_2(iemOpCommonAvxAvx2_Hx_Ux_Ib_u128, bRm,
     3650                              IEM_SELECT_HOST_OR_FALLBACK(fAvx2, iemAImpl_vpsrlw_imm_u128, iemAImpl_vpsrlw_imm_u128_fallback));
     3651    }
     3652}
     3653
    36403654
    36413655/*  Opcode VEX.0F 0x71 11/4 - invalid */
     
    37063720/*  Opcode VEX.0F 0x72 11/2 - invalid. */
    37073721/** Opcode VEX.66.0F 0x72 11/2. */
    3708 FNIEMOP_STUB_1(iemOp_VGrp13_vpsrld_Hx_Ux_Ib, uint8_t, bRm);
     3722FNIEMOP_DEF_1(iemOp_VGrp13_vpsrld_Hx_Ux_Ib, uint8_t, bRm)
     3723{
     3724    IEMOP_MNEMONIC3(VEX_VMI_REG, VPSRLD, vpsrld, Hx, Ux, Ib, DISOPTYPE_HARMLESS | DISOPTYPE_X86_AVX, 0);
     3725    if (pVCpu->iem.s.uVexLength)
     3726    {
     3727        return FNIEMOP_CALL_2(iemOpCommonAvxAvx2_Hx_Ux_Ib_u256, bRm,
     3728                              IEM_SELECT_HOST_OR_FALLBACK(fAvx2, iemAImpl_vpsrld_imm_u256, iemAImpl_vpsrld_imm_u256_fallback));
     3729    }
     3730    else
     3731    {
     3732        return FNIEMOP_CALL_2(iemOpCommonAvxAvx2_Hx_Ux_Ib_u128, bRm,
     3733                              IEM_SELECT_HOST_OR_FALLBACK(fAvx2, iemAImpl_vpsrld_imm_u128, iemAImpl_vpsrld_imm_u128_fallback));
     3734    }
     3735}
     3736
    37093737
    37103738/*  Opcode VEX.0F 0x72 11/4 - invalid. */
     
    37743802/*  Opcode VEX.0F 0x73 11/2 - invalid. */
    37753803/** Opcode VEX.66.0F 0x73 11/2. */
    3776 FNIEMOP_STUB_1(iemOp_VGrp14_vpsrlq_Hx_Ux_Ib, uint8_t, bRm);
     3804FNIEMOP_DEF_1(iemOp_VGrp14_vpsrlq_Hx_Ux_Ib, uint8_t, bRm)
     3805{
     3806    IEMOP_MNEMONIC3(VEX_VMI_REG, VPSRLQ, vpsrlq, Hx, Ux, Ib, DISOPTYPE_HARMLESS | DISOPTYPE_X86_AVX, 0);
     3807    if (pVCpu->iem.s.uVexLength)
     3808    {
     3809        return FNIEMOP_CALL_2(iemOpCommonAvxAvx2_Hx_Ux_Ib_u256, bRm,
     3810                              IEM_SELECT_HOST_OR_FALLBACK(fAvx2, iemAImpl_vpsrlq_imm_u256, iemAImpl_vpsrlq_imm_u256_fallback));
     3811    }
     3812    else
     3813    {
     3814        return FNIEMOP_CALL_2(iemOpCommonAvxAvx2_Hx_Ux_Ib_u128, bRm,
     3815                              IEM_SELECT_HOST_OR_FALLBACK(fAvx2, iemAImpl_vpsrlq_imm_u128, iemAImpl_vpsrlq_imm_u128_fallback));
     3816    }
     3817}
     3818
    37773819
    37783820/** Opcode VEX.66.0F 0x73 11/3. */
     
    47904832/*  Opcode VEX.0F 0xd1 - invalid */
    47914833/** Opcode VEX.66.0F 0xd1 - vpsrlw Vx, Hx, W */
    4792 FNIEMOP_STUB(iemOp_vpsrlw_Vx_Hx_W);
     4834FNIEMOP_DEF(iemOp_vpsrlw_Vx_Hx_W)
     4835{
     4836    IEMOP_MNEMONIC3(VEX_RVM, VPSRLW, vpsrlw, Vx, Hx, Wx, DISOPTYPE_HARMLESS | DISOPTYPE_X86_AVX, 0);
     4837    IEMOPMEDIAOPTF3_INIT_VARS(vpsrlw);
     4838    return FNIEMOP_CALL_1(iemOpCommonAvxAvx2_Vx_Hx_Wx_Opt, IEM_SELECT_HOST_OR_FALLBACK(fAvx2, &s_Host, &s_Fallback));
     4839}
     4840
    47934841/*  Opcode VEX.F3.0F 0xd1 - invalid */
    47944842/*  Opcode VEX.F2.0F 0xd1 - invalid */
     
    47964844/*  Opcode VEX.0F 0xd2 - invalid */
    47974845/** Opcode VEX.66.0F 0xd2 - vpsrld Vx, Hx, Wx */
    4798 FNIEMOP_STUB(iemOp_vpsrld_Vx_Hx_Wx);
     4846FNIEMOP_DEF(iemOp_vpsrld_Vx_Hx_Wx)
     4847{
     4848    IEMOP_MNEMONIC3(VEX_RVM, VPSRLD, vpsrld, Vx, Hx, Wx, DISOPTYPE_HARMLESS | DISOPTYPE_X86_AVX, 0);
     4849    IEMOPMEDIAOPTF3_INIT_VARS(vpsrld);
     4850    return FNIEMOP_CALL_1(iemOpCommonAvxAvx2_Vx_Hx_Wx_Opt, IEM_SELECT_HOST_OR_FALLBACK(fAvx2, &s_Host, &s_Fallback));
     4851}
     4852
    47994853/*  Opcode VEX.F3.0F 0xd2 - invalid */
    48004854/*  Opcode VEX.F2.0F 0xd2 - invalid */
     
    48024856/*  Opcode VEX.0F 0xd3 - invalid */
    48034857/** Opcode VEX.66.0F 0xd3 - vpsrlq Vx, Hx, Wx */
    4804 FNIEMOP_STUB(iemOp_vpsrlq_Vx_Hx_Wx);
     4858FNIEMOP_DEF(iemOp_vpsrlq_Vx_Hx_Wx)
     4859{
     4860    IEMOP_MNEMONIC3(VEX_RVM, VPSRLQ, vpsrlq, Vx, Hx, Wx, DISOPTYPE_HARMLESS | DISOPTYPE_X86_AVX, 0);
     4861    IEMOPMEDIAOPTF3_INIT_VARS(vpsrlq);
     4862    return FNIEMOP_CALL_1(iemOpCommonAvxAvx2_Vx_Hx_Wx_Opt, IEM_SELECT_HOST_OR_FALLBACK(fAvx2, &s_Host, &s_Fallback));
     4863}
     4864
    48054865/*  Opcode VEX.F3.0F 0xd3 - invalid */
    48064866/*  Opcode VEX.F2.0F 0xd3 - invalid */
  • trunk/src/VBox/VMM/include/IEMInternal.h

    r103265 r103267  
    31533153FNIEMAIMPLMEDIAOPTF3U128 iemAImpl_vpsraw_u128,     iemAImpl_vpsraw_u128_fallback;
    31543154FNIEMAIMPLMEDIAOPTF3U128 iemAImpl_vpsrad_u128,     iemAImpl_vpsrad_u128_fallback;
     3155FNIEMAIMPLMEDIAOPTF3U128 iemAImpl_vpsrlw_u128,     iemAImpl_vpsrlw_u128_fallback;
     3156FNIEMAIMPLMEDIAOPTF3U128 iemAImpl_vpsrld_u128,     iemAImpl_vpsrld_u128_fallback;
     3157FNIEMAIMPLMEDIAOPTF3U128 iemAImpl_vpsrlq_u128,     iemAImpl_vpsrlq_u128_fallback;
    31553158
    31563159FNIEMAIMPLMEDIAOPTF2U128 iemAImpl_vpabsb_u128,     iemAImpl_vpabsb_u128_fallback;
     
    32293232FNIEMAIMPLMEDIAOPTF3U256 iemAImpl_vpsraw_u256,     iemAImpl_vpsraw_u256_fallback;
    32303233FNIEMAIMPLMEDIAOPTF3U256 iemAImpl_vpsrad_u256,     iemAImpl_vpsrad_u256_fallback;
     3234FNIEMAIMPLMEDIAOPTF3U256 iemAImpl_vpsrlw_u256,     iemAImpl_vpsrlw_u256_fallback;
     3235FNIEMAIMPLMEDIAOPTF3U256 iemAImpl_vpsrld_u256,     iemAImpl_vpsrld_u256_fallback;
     3236FNIEMAIMPLMEDIAOPTF3U256 iemAImpl_vpsrlq_u256,     iemAImpl_vpsrlq_u256_fallback;
    32313237
    32323238FNIEMAIMPLMEDIAOPTF2U256 iemAImpl_vpabsb_u256,     iemAImpl_vpabsb_u256_fallback;
     
    35643570FNIEMAIMPLMEDIAPSHUFU128 iemAImpl_vpsrad_imm_u128, iemAImpl_vpsrad_imm_u128_fallback;
    35653571FNIEMAIMPLMEDIAPSHUFU256 iemAImpl_vpsrad_imm_u256, iemAImpl_vpsrad_imm_u256_fallback;
     3572
     3573FNIEMAIMPLMEDIAPSHUFU128 iemAImpl_vpsrlw_imm_u128, iemAImpl_vpsrlw_imm_u128_fallback;
     3574FNIEMAIMPLMEDIAPSHUFU256 iemAImpl_vpsrlw_imm_u256, iemAImpl_vpsrlw_imm_u256_fallback;
     3575FNIEMAIMPLMEDIAPSHUFU128 iemAImpl_vpsrld_imm_u128, iemAImpl_vpsrld_imm_u128_fallback;
     3576FNIEMAIMPLMEDIAPSHUFU256 iemAImpl_vpsrld_imm_u256, iemAImpl_vpsrld_imm_u256_fallback;
     3577FNIEMAIMPLMEDIAPSHUFU128 iemAImpl_vpsrlq_imm_u128, iemAImpl_vpsrlq_imm_u128_fallback;
     3578FNIEMAIMPLMEDIAPSHUFU256 iemAImpl_vpsrlq_imm_u256, iemAImpl_vpsrlq_imm_u256_fallback;
    35663579/** @} */
    35673580
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