VirtualBox

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


Ignore:
Timestamp:
Nov 18, 2022 10:58:11 AM (2 years ago)
Author:
vboxsync
Message:

IEM: Added SSE 4.1 PINSRB, PEXTRB, PEXTRB, PEXTRW, EXTRACTPS.

File:
1 edited

Legend:

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

    r97547 r97607  
    329329/*  Opcode 0x66 0x0f 0x12 - invalid */
    330330/*  Opcode 0x66 0x0f 0x13 - invalid */
     331
     332
    331333/** Opcode 0x66 0x0f 0x14. */
    332 FNIEMOP_STUB(iemOp_pextrb_RdMb_Vdq_Ib);
     334FNIEMOP_DEF(iemOp_pextrb_RdMb_Vdq_Ib)
     335{
     336    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     337    IEMOP_MNEMONIC3(MRI, PEXTRB, pextrb, Ev, Vq, Ib, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, IEMOPHINT_IGNORES_OP_SIZES);
     338    if (IEM_IS_MODRM_REG_MODE(bRm))
     339    {
     340        /*
     341         * greg32, XMM.
     342         */
     343        uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm);
     344        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     345        IEM_MC_BEGIN(0, 1);
     346        IEM_MC_LOCAL(uint8_t,   uValue);
     347        IEM_MC_MAYBE_RAISE_SSE41_RELATED_XCPT();
     348        IEM_MC_PREPARE_SSE_USAGE();
     349        IEM_MC_AND_LOCAL_U8(bImm, 15);
     350        IEM_MC_FETCH_XREG_U8(uValue, IEM_GET_MODRM_REG(pVCpu, bRm), bImm /*a_iByte*/);
     351        IEM_MC_STORE_GREG_U32(IEM_GET_MODRM_RM(pVCpu, bRm), uValue);
     352        IEM_MC_ADVANCE_RIP_AND_FINISH();
     353        IEM_MC_END();
     354    }
     355    else
     356    {
     357        /*
     358         * [mem8], XMM.
     359         */
     360        IEM_MC_BEGIN(0, 2);
     361        IEM_MC_LOCAL(uint8_t,   uValue);
     362        IEM_MC_LOCAL(RTGCPTR,   GCPtrEffSrc);
     363
     364        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 1);
     365        uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm);
     366        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     367        IEM_MC_MAYBE_RAISE_SSE41_RELATED_XCPT();
     368        IEM_MC_PREPARE_SSE_USAGE();
     369
     370        IEM_MC_AND_LOCAL_U8(bImm, 15);
     371        IEM_MC_FETCH_XREG_U8(uValue, IEM_GET_MODRM_REG(pVCpu, bRm), bImm /*a_iByte*/);
     372        IEM_MC_STORE_MEM_U8(pVCpu->iem.s.iEffSeg, GCPtrEffSrc, uValue);
     373        IEM_MC_ADVANCE_RIP_AND_FINISH();
     374        IEM_MC_END();
     375    }
     376}
     377
     378
    333379/** Opcode 0x66 0x0f 0x15. */
    334 FNIEMOP_STUB(iemOp_pextrw_RdMw_Vdq_Ib);
     380FNIEMOP_DEF(iemOp_pextrw_RdMw_Vdq_Ib)
     381{
     382    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     383    IEMOP_MNEMONIC3(MRI, PEXTRW, pextrw, Ev, Vq, Ib, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, IEMOPHINT_IGNORES_OP_SIZES);
     384    if (IEM_IS_MODRM_REG_MODE(bRm))
     385    {
     386        /*
     387         * greg32, XMM.
     388         */
     389        uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm);
     390        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     391        IEM_MC_BEGIN(0, 1);
     392        IEM_MC_LOCAL(uint16_t,  uValue);
     393        IEM_MC_MAYBE_RAISE_SSE41_RELATED_XCPT();
     394        IEM_MC_PREPARE_SSE_USAGE();
     395        IEM_MC_AND_LOCAL_U8(bImm, 7);
     396        IEM_MC_FETCH_XREG_U16(uValue, IEM_GET_MODRM_REG(pVCpu, bRm), bImm /*a_iWord*/);
     397        IEM_MC_STORE_GREG_U32(IEM_GET_MODRM_RM(pVCpu, bRm), uValue);
     398        IEM_MC_ADVANCE_RIP_AND_FINISH();
     399        IEM_MC_END();
     400    }
     401    else
     402    {
     403        /*
     404         * [mem16], XMM.
     405         */
     406        IEM_MC_BEGIN(0, 2);
     407        IEM_MC_LOCAL(uint16_t,  uValue);
     408        IEM_MC_LOCAL(RTGCPTR,   GCPtrEffSrc);
     409
     410        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 1);
     411        uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm);
     412        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     413        IEM_MC_MAYBE_RAISE_SSE41_RELATED_XCPT();
     414        IEM_MC_PREPARE_SSE_USAGE();
     415
     416        IEM_MC_AND_LOCAL_U8(bImm, 7);
     417        IEM_MC_FETCH_XREG_U16(uValue, IEM_GET_MODRM_REG(pVCpu, bRm), bImm /*a_iWord*/);
     418        IEM_MC_STORE_MEM_U16(pVCpu->iem.s.iEffSeg, GCPtrEffSrc, uValue);
     419        IEM_MC_ADVANCE_RIP_AND_FINISH();
     420        IEM_MC_END();
     421    }
     422}
    335423
    336424
     
    350438        {
    351439            /*
    352              * XMM, greg64.
     440             * greg64, XMM.
    353441             */
    354442            uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm);
     
    367455        {
    368456            /*
    369              * XMM, [mem64].
     457             * [mem64], XMM.
    370458             */
    371459            IEM_MC_BEGIN(0, 2);
     
    399487        {
    400488            /*
    401              * XMM, greg32.
     489             * greg32, XMM.
    402490             */
    403491            uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm);
     
    416504        {
    417505            /*
    418              * XMM, [mem32].
     506             * [mem32], XMM.
    419507             */
    420508            IEM_MC_BEGIN(0, 2);
     
    438526
    439527/** Opcode 0x66 0x0f 0x17. */
    440 FNIEMOP_STUB(iemOp_extractps_Ed_Vdq_Ib);
     528FNIEMOP_DEF(iemOp_extractps_Ed_Vdq_Ib)
     529{
     530    IEMOP_MNEMONIC3(MRI, EXTRACTPS, extractps, Ed, Vdq, Ib, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, IEMOPHINT_IGNORES_OP_SIZES);
     531    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     532    if (IEM_IS_MODRM_REG_MODE(bRm))
     533    {
     534        /*
     535         * greg32, XMM.
     536         */
     537        uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm);
     538        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     539        IEM_MC_BEGIN(0, 1);
     540        IEM_MC_LOCAL(uint32_t,  uSrc);
     541        IEM_MC_MAYBE_RAISE_SSE41_RELATED_XCPT();
     542        IEM_MC_PREPARE_SSE_USAGE();
     543        IEM_MC_AND_LOCAL_U8(bImm, 3);
     544        IEM_MC_FETCH_XREG_U32(uSrc, IEM_GET_MODRM_REG(pVCpu, bRm), bImm /*a_iDword*/);
     545        IEM_MC_STORE_GREG_U32(IEM_GET_MODRM_RM(pVCpu, bRm), uSrc);
     546        IEM_MC_ADVANCE_RIP_AND_FINISH();
     547        IEM_MC_END();
     548    }
     549    else
     550    {
     551        /*
     552         * [mem32], XMM.
     553         */
     554        IEM_MC_BEGIN(0, 2);
     555        IEM_MC_LOCAL(uint32_t,  uSrc);
     556        IEM_MC_LOCAL(RTGCPTR,   GCPtrEffSrc);
     557
     558        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 1);
     559        uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm);
     560        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     561        IEM_MC_MAYBE_RAISE_SSE41_RELATED_XCPT();
     562        IEM_MC_PREPARE_SSE_USAGE();
     563        IEM_MC_AND_LOCAL_U8(bImm, 3);
     564        IEM_MC_FETCH_XREG_U32(uSrc, IEM_GET_MODRM_REG(pVCpu, bRm), bImm /*a_iDword*/);
     565        IEM_MC_STORE_MEM_U32(pVCpu->iem.s.iEffSeg, GCPtrEffSrc, uSrc);
     566        IEM_MC_ADVANCE_RIP_AND_FINISH();
     567        IEM_MC_END();
     568    }
     569}
     570
     571
    441572/*  Opcode 0x66 0x0f 0x18 - invalid (vex only). */
    442573/*  Opcode 0x66 0x0f 0x19 - invalid (vex only). */
     
    450581
    451582/** Opcode 0x66 0x0f 0x20. */
    452 FNIEMOP_STUB(iemOp_pinsrb_Vdq_RyMb_Ib);
     583FNIEMOP_DEF(iemOp_pinsrb_Vdq_RyMb_Ib)
     584{
     585    IEMOP_MNEMONIC3(RMI, PINSRB, pinsrb, Vd, Ey, Ib, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, IEMOPHINT_IGNORES_OP_SIZES);
     586    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     587    if (IEM_IS_MODRM_REG_MODE(bRm))
     588    {
     589        /*
     590         * XMM, greg32.
     591         */
     592        uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm);
     593        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     594        IEM_MC_BEGIN(0, 1);
     595        IEM_MC_LOCAL(uint8_t,   uSrc);
     596        IEM_MC_MAYBE_RAISE_SSE41_RELATED_XCPT();
     597        IEM_MC_PREPARE_SSE_USAGE();
     598        IEM_MC_FETCH_GREG_U8(uSrc, IEM_GET_MODRM_RM(pVCpu, bRm));
     599        IEM_MC_AND_LOCAL_U8(bImm, 15);
     600        IEM_MC_STORE_XREG_U8(IEM_GET_MODRM_REG(pVCpu, bRm), bImm /*a_iByte*/, uSrc);
     601        IEM_MC_ADVANCE_RIP_AND_FINISH();
     602        IEM_MC_END();
     603    }
     604    else
     605    {
     606        /*
     607         * XMM, [mem8].
     608         */
     609        IEM_MC_BEGIN(0, 2);
     610        IEM_MC_LOCAL(uint8_t,   uSrc);
     611        IEM_MC_LOCAL(RTGCPTR,   GCPtrEffSrc);
     612
     613        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 1);
     614        uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm);
     615        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     616        IEM_MC_MAYBE_RAISE_SSE41_RELATED_XCPT();
     617        IEM_MC_PREPARE_SSE_USAGE();
     618
     619        IEM_MC_FETCH_MEM_U8(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     620        IEM_MC_AND_LOCAL_U8(bImm, 15);
     621        IEM_MC_STORE_XREG_U8(IEM_GET_MODRM_REG(pVCpu, bRm), bImm /*a_iByte*/, uSrc);
     622        IEM_MC_ADVANCE_RIP_AND_FINISH();
     623        IEM_MC_END();
     624    }
     625}
     626
    453627/** Opcode 0x66 0x0f 0x21, */
    454628FNIEMOP_STUB(iemOp_insertps_Vdq_UdqMd_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