VirtualBox

Changeset 104059 in vbox for trunk


Ignore:
Timestamp:
Mar 26, 2024 1:43:01 PM (12 months ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
162452
Message:

VMM/IEM: Implement vextracti128/vextractf128 instruction emulation, bugref:9898

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

Legend:

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

    r104018 r104059  
    780780
    781781/** Opcode VEX.66.0F3A 0x19 (vex only). */
    782 FNIEMOP_STUB(iemOp_vextractf128_Wdq_Vqq_Ib);
     782FNIEMOP_DEF(iemOp_vextractf128_Wdq_Vqq_Ib)
     783{
     784    IEMOP_MNEMONIC3(VEX_MRI, VEXTRACTF128, vextractf128, Wdq, Vqq, Ib, DISOPTYPE_HARMLESS, 0);
     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        IEM_MC_BEGIN(IEM_MC_F_NOT_286_OR_OLDER, 0);
     792        uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm);
     793        IEMOP_HLP_DONE_VEX_DECODING_L1_AND_NO_VVVV_EX(fAvx2);
     794
     795        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     796        IEM_MC_PREPARE_AVX_USAGE();
     797
     798        IEM_MC_LOCAL(RTUINT128U, uDst);
     799        IEM_MC_FETCH_YREG_U128(uDst,   IEM_GET_MODRM_REG(pVCpu, bRm), bImm & 1);
     800        IEM_MC_STORE_XREG_U128(        IEM_GET_MODRM_RM(pVCpu, bRm), uDst);
     801
     802        IEM_MC_ADVANCE_RIP_AND_FINISH();
     803        IEM_MC_END();
     804    }
     805    else
     806    {
     807        /*
     808         * Register, memory.
     809         */
     810        IEM_MC_BEGIN(IEM_MC_F_NOT_286_OR_OLDER, 0);
     811        IEM_MC_LOCAL(RTGCPTR,               GCPtrEffSrc);
     812
     813        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     814        uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm);
     815        IEMOP_HLP_DONE_VEX_DECODING_L1_AND_NO_VVVV_EX(fAvx2);
     816        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     817        IEM_MC_PREPARE_AVX_USAGE();
     818
     819        IEM_MC_LOCAL(RTUINT128U, uDst);
     820        IEM_MC_FETCH_YREG_U128(uDst,   IEM_GET_MODRM_REG(pVCpu, bRm), bImm & 1);
     821        IEM_MC_STORE_MEM_U128_NO_AC(pVCpu->iem.s.iEffSeg, GCPtrEffSrc, uDst);
     822
     823        IEM_MC_ADVANCE_RIP_AND_FINISH();
     824        IEM_MC_END();
     825    }
     826}
     827
     828
    783829/*  Opcode VEX.66.0F3A 0x1a - invalid */
    784830/*  Opcode VEX.66.0F3A 0x1b - invalid */
     
    872918
    873919/** Opcode VEX.66.0F3A 0x39 (vex only). */
    874 FNIEMOP_STUB(iemOp_vextracti128_Wdq_Vqq_Ib);
     920FNIEMOP_DEF(iemOp_vextracti128_Wdq_Vqq_Ib)
     921{
     922    IEMOP_MNEMONIC3(VEX_MRI, VEXTRACTI128, vextracti128, Wdq, Vqq, Ib, DISOPTYPE_HARMLESS, 0);
     923    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     924    if (IEM_IS_MODRM_REG_MODE(bRm))
     925    {
     926        /*
     927         * Register, register.
     928         */
     929        IEM_MC_BEGIN(IEM_MC_F_NOT_286_OR_OLDER, 0);
     930        uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm);
     931        IEMOP_HLP_DONE_VEX_DECODING_L1_AND_NO_VVVV_EX(fAvx2);
     932
     933        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     934        IEM_MC_PREPARE_AVX_USAGE();
     935
     936        IEM_MC_LOCAL(RTUINT128U, uDst);
     937        IEM_MC_FETCH_YREG_U128(uDst,   IEM_GET_MODRM_REG(pVCpu, bRm), bImm & 1);
     938        IEM_MC_STORE_XREG_U128(        IEM_GET_MODRM_RM(pVCpu, bRm), uDst);
     939
     940        IEM_MC_ADVANCE_RIP_AND_FINISH();
     941        IEM_MC_END();
     942    }
     943    else
     944    {
     945        /*
     946         * Register, memory.
     947         */
     948        IEM_MC_BEGIN(IEM_MC_F_NOT_286_OR_OLDER, 0);
     949        IEM_MC_LOCAL(RTGCPTR,               GCPtrEffSrc);
     950
     951        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     952        uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm);
     953        IEMOP_HLP_DONE_VEX_DECODING_L1_AND_NO_VVVV_EX(fAvx2);
     954        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     955        IEM_MC_PREPARE_AVX_USAGE();
     956
     957        IEM_MC_LOCAL(RTUINT128U, uDst);
     958        IEM_MC_FETCH_YREG_U128(uDst,   IEM_GET_MODRM_REG(pVCpu, bRm), bImm & 1);
     959        IEM_MC_STORE_MEM_U128_NO_AC(pVCpu->iem.s.iEffSeg, GCPtrEffSrc, uDst);
     960
     961        IEM_MC_ADVANCE_RIP_AND_FINISH();
     962        IEM_MC_END();
     963    }
     964}
     965
     966
    875967/*  Opcode VEX.66.0F3A 0x3a - invalid */
    876968/*  Opcode VEX.66.0F3A 0x3b - invalid */
  • trunk/src/VBox/VMM/include/IEMInternal.h

    r104050 r104059  
    19991999    /** Statistics per threaded function call.
    20002000     * Updated by both the threaded and native recompilers. */
    2001     uint32_t                acThreadedFuncStats[0x5000 /*20480*/];
     2001    uint32_t                acThreadedFuncStats[0x5100 /*20736*/];
    20022002# endif
    20032003#endif
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette