VirtualBox

Ignore:
Timestamp:
Jul 12, 2024 1:20:30 PM (5 months ago)
Author:
vboxsync
Message:

VMM/IEM: Implement vpermq, vpermpd instruction emulations, bugref:9898

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstVexMap3.cpp.h

    r105302 r105306  
    483483
    484484/** Opcode VEX.66.0F3A 0x00. */
    485 FNIEMOP_STUB(iemOp_vpermq_Vqq_Wqq_Ib);
     485FNIEMOP_DEF(iemOp_vpermq_Vqq_Wqq_Ib)
     486{
     487    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     488    if (IEM_IS_MODRM_REG_MODE(bRm))
     489    {
     490        /*
     491         * Register, register.
     492         */
     493        uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm);
     494        IEM_MC_BEGIN(IEM_MC_F_NOT_286_OR_OLDER, 0);
     495        IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV_EX(fAvx2);
     496        IEM_MC_LOCAL(RTUINT256U,            uDst);
     497        IEM_MC_LOCAL(RTUINT256U,            uSrc);
     498        IEM_MC_ARG_LOCAL_REF(PRTUINT256U,   puDst, uDst,         0);
     499        IEM_MC_ARG_LOCAL_REF(PCRTUINT256U,  puSrc, uSrc,         1);
     500        IEM_MC_ARG_CONST(uint8_t,           bImmArg, /*=*/ bImm, 2);
     501        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     502        IEM_MC_PREPARE_AVX_USAGE();
     503        IEM_MC_FETCH_YREG_U256(uSrc, IEM_GET_MODRM_RM(pVCpu, bRm));
     504        IEM_MC_CALL_VOID_AIMPL_3(IEM_SELECT_HOST_OR_FALLBACK(fAvx2, iemAImpl_vpermq_u256, iemAImpl_vpermq_u256_fallback),
     505                                 puDst, puSrc, bImmArg);
     506        IEM_MC_STORE_YREG_U256_ZX_VLMAX(IEM_GET_MODRM_REG(pVCpu, bRm), uDst);
     507        IEM_MC_ADVANCE_RIP_AND_FINISH();
     508        IEM_MC_END();
     509    }
     510    else
     511    {
     512        /*
     513         * Register, memory.
     514         */
     515        IEM_MC_BEGIN(IEM_MC_F_NOT_286_OR_OLDER, 0);
     516        IEM_MC_LOCAL(RTGCPTR,               GCPtrEffSrc);
     517        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     518        uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm);
     519        IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV_EX(fAvx2);
     520        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     521        IEM_MC_PREPARE_AVX_USAGE();
     522
     523        IEM_MC_LOCAL(RTUINT256U,            uSrc);
     524        IEM_MC_ARG_LOCAL_REF(PCRTUINT256U,  puSrc, uSrc,         1);
     525        IEM_MC_FETCH_MEM_U256_NO_AC(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     526        IEM_MC_LOCAL(RTUINT256U,            uDst);
     527        IEM_MC_ARG_LOCAL_REF(PRTUINT256U,   puDst, uDst,         0);
     528        IEM_MC_ARG_CONST(uint8_t,           bImmArg, /*=*/ bImm, 2);
     529        IEM_MC_CALL_VOID_AIMPL_3(IEM_SELECT_HOST_OR_FALLBACK(fAvx2, iemAImpl_vpermq_u256, iemAImpl_vpermq_u256_fallback),
     530                                 puDst, puSrc, bImmArg);
     531        IEM_MC_STORE_YREG_U256_ZX_VLMAX(IEM_GET_MODRM_REG(pVCpu, bRm), uDst);
     532        IEM_MC_ADVANCE_RIP_AND_FINISH();
     533        IEM_MC_END();
     534    }
     535}
     536
     537
    486538/** Opcode VEX.66.0F3A 0x01. */
    487 FNIEMOP_STUB(iemOp_vpermpd_Vqq_Wqq_Ib);
     539FNIEMOP_DEF(iemOp_vpermpd_Vqq_Wqq_Ib)
     540{
     541    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     542    if (IEM_IS_MODRM_REG_MODE(bRm))
     543    {
     544        /*
     545         * Register, register.
     546         */
     547        uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm);
     548        IEM_MC_BEGIN(IEM_MC_F_NOT_286_OR_OLDER, 0);
     549        IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV_EX(fAvx2);
     550        IEM_MC_LOCAL(RTUINT256U,            uDst);
     551        IEM_MC_LOCAL(RTUINT256U,            uSrc);
     552        IEM_MC_ARG_LOCAL_REF(PRTUINT256U,   puDst, uDst,         0);
     553        IEM_MC_ARG_LOCAL_REF(PCRTUINT256U,  puSrc, uSrc,         1);
     554        IEM_MC_ARG_CONST(uint8_t,           bImmArg, /*=*/ bImm, 2);
     555        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     556        IEM_MC_PREPARE_AVX_USAGE();
     557        IEM_MC_FETCH_YREG_U256(uSrc, IEM_GET_MODRM_RM(pVCpu, bRm));
     558        IEM_MC_CALL_VOID_AIMPL_3(IEM_SELECT_HOST_OR_FALLBACK(fAvx2, iemAImpl_vpermpd_u256, iemAImpl_vpermpd_u256_fallback),
     559                                 puDst, puSrc, bImmArg);
     560        IEM_MC_STORE_YREG_U256_ZX_VLMAX(IEM_GET_MODRM_REG(pVCpu, bRm), uDst);
     561        IEM_MC_ADVANCE_RIP_AND_FINISH();
     562        IEM_MC_END();
     563    }
     564    else
     565    {
     566        /*
     567         * Register, memory.
     568         */
     569        IEM_MC_BEGIN(IEM_MC_F_NOT_286_OR_OLDER, 0);
     570        IEM_MC_LOCAL(RTGCPTR,               GCPtrEffSrc);
     571        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     572        uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm);
     573        IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV_EX(fAvx2);
     574        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     575        IEM_MC_PREPARE_AVX_USAGE();
     576
     577        IEM_MC_LOCAL(RTUINT256U,            uSrc);
     578        IEM_MC_ARG_LOCAL_REF(PCRTUINT256U,  puSrc, uSrc,         1);
     579        IEM_MC_FETCH_MEM_U256_NO_AC(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     580        IEM_MC_LOCAL(RTUINT256U,            uDst);
     581        IEM_MC_ARG_LOCAL_REF(PRTUINT256U,   puDst, uDst,         0);
     582        IEM_MC_ARG_CONST(uint8_t,           bImmArg, /*=*/ bImm, 2);
     583        IEM_MC_CALL_VOID_AIMPL_3(IEM_SELECT_HOST_OR_FALLBACK(fAvx2, iemAImpl_vpermpd_u256, iemAImpl_vpermpd_u256_fallback),
     584                                 puDst, puSrc, bImmArg);
     585        IEM_MC_STORE_YREG_U256_ZX_VLMAX(IEM_GET_MODRM_REG(pVCpu, bRm), uDst);
     586        IEM_MC_ADVANCE_RIP_AND_FINISH();
     587        IEM_MC_END();
     588    }
     589}
    488590
    489591
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