VirtualBox

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


Ignore:
Timestamp:
Mar 8, 2024 5:15:24 AM (9 months ago)
Author:
vboxsync
Message:

VMM/IEM: Implement vpsrlv[dq], vpsravd, vpsllv[dq] instruction dispatch & emulation, bugref:9898

Location:
trunk/src/VBox/VMM/VMMAll
Files:
3 edited

Legend:

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

    r103700 r103735  
    44294429IEMIMPL_MEDIA_OPT_F3 vpermilpd
    44304430IEMIMPL_MEDIA_OPT_F3 vpmaddwd
     4431IEMIMPL_MEDIA_OPT_F3 vpsrlvd
     4432IEMIMPL_MEDIA_OPT_F3 vpsrlvq
     4433IEMIMPL_MEDIA_OPT_F3 vpsravd
     4434IEMIMPL_MEDIA_OPT_F3 vpsllvd
     4435IEMIMPL_MEDIA_OPT_F3 vpsllvq
    44314436
    44324437;;
  • trunk/src/VBox/VMM/VMMAll/IEMAllAImplC.cpp

    r103700 r103735  
    1122211222
    1122311223/*
     11224 * VPSRLVD
     11225 */
     11226IEM_DECL_IMPL_DEF(void, iemAImpl_vpsrlvd_u128_fallback,(PRTUINT128U puDst, PCRTUINT128U puSrc1, PCRTUINT128U puSrc2))
     11227{
     11228    for (uint8_t uU32 = 0; uU32 < RT_ELEMENTS(puDst->au32); ++uU32)
     11229    {
     11230        puDst->au32[uU32] = (puSrc2->au32[uU32] > 31) ? 0 : puSrc1->au32[uU32] >> puSrc2->au8[uU32 << 2];
     11231    }
     11232}
     11233
     11234IEM_DECL_IMPL_DEF(void, iemAImpl_vpsrlvd_u256_fallback,(PRTUINT256U puDst, PCRTUINT256U puSrc1, PCRTUINT256U puSrc2))
     11235{
     11236    for (uint8_t uU32 = 0; uU32 < RT_ELEMENTS(puDst->au32); ++uU32)
     11237    {
     11238        puDst->au32[uU32] = (puSrc2->au32[uU32] > 31) ? 0 : puSrc1->au32[uU32] >> puSrc2->au8[uU32 << 2];
     11239    }
     11240}
     11241
     11242
     11243/*
     11244 * VPSRAVD
     11245 */
     11246IEM_DECL_IMPL_DEF(void, iemAImpl_vpsravd_u128_fallback,(PRTUINT128U puDst, PCRTUINT128U puSrc1, PCRTUINT128U puSrc2))
     11247{
     11248    for (uint8_t uI32 = 0; uI32 < RT_ELEMENTS(puDst->ai32); ++uI32)
     11249    {
     11250        puDst->ai32[uI32] = (puSrc2->au32[uI32] > 31) ? 0 : puSrc1->ai32[uI32] >> puSrc2->au8[uI32 << 2];
     11251    }
     11252}
     11253
     11254IEM_DECL_IMPL_DEF(void, iemAImpl_vpsravd_u256_fallback,(PRTUINT256U puDst, PCRTUINT256U puSrc1, PCRTUINT256U puSrc2))
     11255{
     11256    for (uint8_t uI32 = 0; uI32 < RT_ELEMENTS(puDst->ai32); ++uI32)
     11257    {
     11258        puDst->ai32[uI32] = (puSrc2->au32[uI32] > 31) ? 0 : puSrc1->ai32[uI32] >> puSrc2->au8[uI32 << 2];
     11259    }
     11260}
     11261
     11262
     11263/*
     11264 * VPSLLVD
     11265 */
     11266IEM_DECL_IMPL_DEF(void, iemAImpl_vpsllvd_u128_fallback,(PRTUINT128U puDst, PCRTUINT128U puSrc1, PCRTUINT128U puSrc2))
     11267{
     11268    for (uint8_t uU32 = 0; uU32 < RT_ELEMENTS(puDst->au32); ++uU32)
     11269    {
     11270        puDst->au32[uU32] = (puSrc2->au32[uU32] > 31) ? 0 : puSrc1->au32[uU32] << puSrc2->au8[uU32 << 2];
     11271    }
     11272}
     11273
     11274IEM_DECL_IMPL_DEF(void, iemAImpl_vpsllvd_u256_fallback,(PRTUINT256U puDst, PCRTUINT256U puSrc1, PCRTUINT256U puSrc2))
     11275{
     11276    for (uint8_t uU32 = 0; uU32 < RT_ELEMENTS(puDst->au32); ++uU32)
     11277    {
     11278        puDst->au32[uU32] = (puSrc2->au32[uU32] > 31) ? 0 : puSrc1->au32[uU32] << puSrc2->au8[uU32 << 2];
     11279    }
     11280}
     11281
     11282
     11283/*
     11284 * VPSRLVQ
     11285 */
     11286IEM_DECL_IMPL_DEF(void, iemAImpl_vpsrlvq_u128_fallback,(PRTUINT128U puDst, PCRTUINT128U puSrc1, PCRTUINT128U puSrc2))
     11287{
     11288    for (uint8_t uU64 = 0; uU64 < RT_ELEMENTS(puDst->au64); ++uU64)
     11289    {
     11290        puDst->au64[uU64] = (puSrc2->au64[uU64] > 63) ? 0 : puSrc1->au64[uU64] >> puSrc2->au8[uU64 << 3];
     11291    }
     11292}
     11293
     11294IEM_DECL_IMPL_DEF(void, iemAImpl_vpsrlvq_u256_fallback,(PRTUINT256U puDst, PCRTUINT256U puSrc1, PCRTUINT256U puSrc2))
     11295{
     11296    for (uint8_t uU64 = 0; uU64 < RT_ELEMENTS(puDst->au64); ++uU64)
     11297    {
     11298        puDst->au64[uU64] = (puSrc2->au64[uU64] > 63) ? 0 : puSrc1->au64[uU64] >> puSrc2->au8[uU64 << 3];
     11299    }
     11300}
     11301
     11302
     11303/*
     11304 * VPSLLVQ
     11305 */
     11306IEM_DECL_IMPL_DEF(void, iemAImpl_vpsllvq_u128_fallback,(PRTUINT128U puDst, PCRTUINT128U puSrc1, PCRTUINT128U puSrc2))
     11307{
     11308    for (uint8_t uU64 = 0; uU64 < RT_ELEMENTS(puDst->au64); ++uU64)
     11309    {
     11310        puDst->au64[uU64] = (puSrc2->au64[uU64] > 63) ? 0 : puSrc1->au64[uU64] << puSrc2->au8[uU64 << 3];
     11311    }
     11312}
     11313
     11314IEM_DECL_IMPL_DEF(void, iemAImpl_vpsllvq_u256_fallback,(PRTUINT256U puDst, PCRTUINT256U puSrc1, PCRTUINT256U puSrc2))
     11315{
     11316    for (uint8_t uU64 = 0; uU64 < RT_ELEMENTS(puDst->au64); ++uU64)
     11317    {
     11318        puDst->au64[uU64] = (puSrc2->au64[uU64] > 63) ? 0 : puSrc1->au64[uU64] << puSrc2->au8[uU64 << 3];
     11319    }
     11320}
     11321
     11322
     11323/*
    1122411324 * PMADDWD / VPMADDWD
    1122511325 */
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstVexMap2.cpp.h

    r103558 r103735  
    10381038/*  Opcode VEX.66.0F38 0x43 - invalid. */
    10391039/*  Opcode VEX.66.0F38 0x44 - invalid. */
     1040
     1041
    10401042/** Opcode VEX.66.0F38 0x45. */
    1041 FNIEMOP_STUB(iemOp_vpsrlvd_q_Vx_Hx_Wx);
     1043FNIEMOP_DEF(iemOp_vpsrlvd_q_Vx_Hx_Wx)
     1044{
     1045    IEMOP_MNEMONIC3(VEX_RVM, VPSRLVD, vpsrlvd, Vx, Hx, Wx, DISOPTYPE_HARMLESS, 0);
     1046
     1047    if (pVCpu->iem.s.fPrefixes & IEM_OP_PRF_SIZE_REX_W)
     1048    {
     1049        IEMOPMEDIAOPTF3_INIT_VARS(vpsrlvq);
     1050        return FNIEMOP_CALL_1(iemOpCommonAvxAvx2_Vx_Hx_Wx_Opt, IEM_SELECT_HOST_OR_FALLBACK(fAvx2, &s_Host, &s_Fallback));
     1051    }
     1052    else
     1053    {
     1054        IEMOPMEDIAOPTF3_INIT_VARS(vpsrlvd);
     1055        return FNIEMOP_CALL_1(iemOpCommonAvxAvx2_Vx_Hx_Wx_Opt, IEM_SELECT_HOST_OR_FALLBACK(fAvx2, &s_Host, &s_Fallback));
     1056    }
     1057}
     1058
     1059
    10421060/** Opcode VEX.66.0F38 0x46. */
    1043 FNIEMOP_STUB(iemOp_vsravd_Vx_Hx_Wx);
     1061FNIEMOP_DEF(iemOp_vpsravd_Vx_Hx_Wx)
     1062{
     1063    IEMOP_MNEMONIC3(VEX_RVM, VPSRAVD, vpsravd, Vx, Hx, Wx, DISOPTYPE_HARMLESS, 0);
     1064    IEMOPMEDIAOPTF3_INIT_VARS(vpsravd);
     1065    return FNIEMOP_CALL_1(iemOpCommonAvxAvx2_Vx_Hx_Wx_Opt, IEM_SELECT_HOST_OR_FALLBACK(fAvx2, &s_Host, &s_Fallback));
     1066}
     1067
     1068
    10441069/** Opcode VEX.66.0F38 0x47. */
    1045 FNIEMOP_STUB(iemOp_vpsllvd_q_Vx_Hx_Wx);
     1070FNIEMOP_DEF(iemOp_vpsllvd_q_Vx_Hx_Wx)
     1071{
     1072    IEMOP_MNEMONIC3(VEX_RVM, VPSLLVD, vpsllvd, Vx, Hx, Wx, DISOPTYPE_HARMLESS, 0);
     1073
     1074    if (pVCpu->iem.s.fPrefixes & IEM_OP_PRF_SIZE_REX_W)
     1075    {
     1076        IEMOPMEDIAOPTF3_INIT_VARS(vpsllvq);
     1077        return FNIEMOP_CALL_1(iemOpCommonAvxAvx2_Vx_Hx_Wx_Opt, IEM_SELECT_HOST_OR_FALLBACK(fAvx2, &s_Host, &s_Fallback));
     1078    }
     1079    else
     1080    {
     1081        IEMOPMEDIAOPTF3_INIT_VARS(vpsllvd);
     1082        return FNIEMOP_CALL_1(iemOpCommonAvxAvx2_Vx_Hx_Wx_Opt, IEM_SELECT_HOST_OR_FALLBACK(fAvx2, &s_Host, &s_Fallback));
     1083    }
     1084}
     1085
     1086
    10461087/*  Opcode VEX.66.0F38 0x48 - invalid. */
    10471088/*  Opcode VEX.66.0F38 0x49 - invalid. */
     
    25062547    /* 0x44 */  IEMOP_X4(iemOp_InvalidNeedRM),
    25072548    /* 0x45 */  iemOp_InvalidNeedRM,        iemOp_vpsrlvd_q_Vx_Hx_Wx,   iemOp_InvalidNeedRM,        iemOp_InvalidNeedRM,
    2508     /* 0x46 */  iemOp_InvalidNeedRM,        iemOp_vsravd_Vx_Hx_Wx,      iemOp_InvalidNeedRM,        iemOp_InvalidNeedRM,
     2549    /* 0x46 */  iemOp_InvalidNeedRM,        iemOp_vpsravd_Vx_Hx_Wx,     iemOp_InvalidNeedRM,        iemOp_InvalidNeedRM,
    25092550    /* 0x47 */  iemOp_InvalidNeedRM,        iemOp_vpsllvd_q_Vx_Hx_Wx,   iemOp_InvalidNeedRM,        iemOp_InvalidNeedRM,
    25102551    /* 0x48 */  IEMOP_X4(iemOp_InvalidNeedRM),
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