VirtualBox

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


Ignore:
Timestamp:
Jul 14, 2023 2:04:07 PM (20 months ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
158409
Message:

VMM/IEM: Implement vinserti128/vinsertf128 instruction emulation, bugref:9898

File:
1 edited

Legend:

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

    r100575 r100579  
    347347/** Opcode VEX.66.0F3A 0x17. */
    348348FNIEMOP_STUB(iemOp_vextractps_Ed_Vdq_Ib);
     349
     350
    349351/** Opcode VEX.66.0F3A 0x18 (vex only). */
    350 FNIEMOP_STUB(iemOp_vinsertf128_Vqq_Hqq_Wqq_Ib);
     352FNIEMOP_DEF(iemOp_vinsertf128_Vqq_Hqq_Wqq_Ib)
     353{
     354    //IEMOP_MNEMONIC4(VEX_RMI, VINSERTF128, vinsertf128, Vx, Hx, Wx, Ib, DISOPTYPE_HARMLESS, 0);
     355    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     356    if (IEM_IS_MODRM_REG_MODE(bRm))
     357    {
     358        /*
     359         * Register, register.
     360         */
     361        uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm);
     362        IEMOP_HLP_DONE_VEX_DECODING_L1_EX(fAvx2);
     363
     364        IEM_MC_BEGIN(0, 1);
     365        IEM_MC_LOCAL(RTUINT128U,            uSrc);
     366
     367        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     368        IEM_MC_PREPARE_AVX_USAGE();
     369
     370        IEM_MC_FETCH_XREG_U128(uSrc,                                  IEM_GET_MODRM_RM(pVCpu, bRm));
     371        IEM_MC_COPY_YREG_U256_ZX_VLMAX(IEM_GET_MODRM_REG(pVCpu, bRm), IEM_GET_EFFECTIVE_VVVV(pVCpu));
     372        IEM_MC_STORE_YREG_U128(        IEM_GET_MODRM_REG(pVCpu, bRm), bImm & 1, uSrc);
     373
     374        IEM_MC_ADVANCE_RIP_AND_FINISH();
     375        IEM_MC_END();
     376    }
     377    else
     378    {
     379        /*
     380         * Register, memory.
     381         */
     382        IEM_MC_BEGIN(0, 2);
     383        IEM_MC_LOCAL(RTUINT128U,            uSrc);
     384        IEM_MC_LOCAL(RTGCPTR,               GCPtrEffSrc);
     385
     386        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     387        uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm);
     388        IEMOP_HLP_DONE_VEX_DECODING_L1_EX(fAvx2);
     389        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     390        IEM_MC_PREPARE_AVX_USAGE();
     391
     392        IEM_MC_FETCH_MEM_U128(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     393        IEM_MC_COPY_YREG_U256_ZX_VLMAX(IEM_GET_MODRM_REG(pVCpu, bRm), IEM_GET_EFFECTIVE_VVVV(pVCpu));
     394        IEM_MC_STORE_YREG_U128(        IEM_GET_MODRM_REG(pVCpu, bRm), bImm & 1, uSrc);
     395
     396        IEM_MC_ADVANCE_RIP_AND_FINISH();
     397        IEM_MC_END();
     398    }
     399}
     400
     401
    351402/** Opcode VEX.66.0F3A 0x19 (vex only). */
    352403FNIEMOP_STUB(iemOp_vextractf128_Wdq_Vqq_Ib);
     
    389440/*  Opcode VEX.66.0F3A 0x36 - invalid */
    390441/*  Opcode VEX.66.0F3A 0x37 - invalid */
     442
     443
    391444/** Opcode VEX.66.0F3A 0x38 (vex only). */
    392 FNIEMOP_STUB(iemOp_vinserti128_Vqq_Hqq_Wqq_Ib);
     445FNIEMOP_DEF(iemOp_vinserti128_Vqq_Hqq_Wqq_Ib)
     446{
     447    //IEMOP_MNEMONIC4(VEX_RMI, VINSERTI128, vinserti128, Vx, Hx, Wx, Ib, DISOPTYPE_HARMLESS, 0);
     448    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     449    if (IEM_IS_MODRM_REG_MODE(bRm))
     450    {
     451        /*
     452         * Register, register.
     453         */
     454        uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm);
     455        IEMOP_HLP_DONE_VEX_DECODING_L1_EX(fAvx2);
     456
     457        IEM_MC_BEGIN(0, 1);
     458        IEM_MC_LOCAL(RTUINT128U,            uSrc);
     459
     460        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     461        IEM_MC_PREPARE_AVX_USAGE();
     462
     463        IEM_MC_FETCH_XREG_U128(uSrc,                                  IEM_GET_MODRM_RM(pVCpu, bRm));
     464        IEM_MC_COPY_YREG_U256_ZX_VLMAX(IEM_GET_MODRM_REG(pVCpu, bRm), IEM_GET_EFFECTIVE_VVVV(pVCpu));
     465        IEM_MC_STORE_YREG_U128(        IEM_GET_MODRM_REG(pVCpu, bRm), bImm & 1, uSrc);
     466
     467        IEM_MC_ADVANCE_RIP_AND_FINISH();
     468        IEM_MC_END();
     469    }
     470    else
     471    {
     472        /*
     473         * Register, memory.
     474         */
     475        IEM_MC_BEGIN(0, 2);
     476        IEM_MC_LOCAL(RTUINT128U,            uSrc);
     477        IEM_MC_LOCAL(RTGCPTR,               GCPtrEffSrc);
     478
     479        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     480        uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm);
     481        IEMOP_HLP_DONE_VEX_DECODING_L1_EX(fAvx2);
     482        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     483        IEM_MC_PREPARE_AVX_USAGE();
     484
     485        IEM_MC_FETCH_MEM_U128(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     486        IEM_MC_COPY_YREG_U256_ZX_VLMAX(IEM_GET_MODRM_REG(pVCpu, bRm), IEM_GET_EFFECTIVE_VVVV(pVCpu));
     487        IEM_MC_STORE_YREG_U128(        IEM_GET_MODRM_REG(pVCpu, bRm), bImm & 1, uSrc);
     488
     489        IEM_MC_ADVANCE_RIP_AND_FINISH();
     490        IEM_MC_END();
     491    }
     492}
     493
     494
    393495/** Opcode VEX.66.0F3A 0x39 (vex only). */
    394496FNIEMOP_STUB(iemOp_vextracti128_Wdq_Vqq_Ib);
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