VirtualBox

Changeset 97607 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Nov 18, 2022 10:58:11 AM (2 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
154651
Message:

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

Location:
trunk/src/VBox/VMM
Files:
3 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);
  • trunk/src/VBox/VMM/include/IEMMc.h

    r97543 r97607  
    504504#define IEM_MC_STORE_XREG_U64(a_iXReg, a_iQword, a_u64Value) \
    505505    do { pVCpu->cpum.GstCtx.XState.x87.aXMM[(a_iXReg)].au64[(a_iQword)] = (a_u64Value); } while (0)
     506#define IEM_MC_STORE_XREG_U32(a_iXReg, a_iDword, a_u32Value) \
     507    do { pVCpu->cpum.GstCtx.XState.x87.aXMM[(a_iXReg)].au32[(a_iDword)] = (a_u32Value); } while (0)
     508#define IEM_MC_STORE_XREG_U16(a_iXReg, a_iWord, a_u16Value) \
     509    do { pVCpu->cpum.GstCtx.XState.x87.aXMM[(a_iXReg)].au32[(a_iWord)]  = (a_u16Value); } while (0)
     510#define IEM_MC_STORE_XREG_U8(a_iXReg,  a_iByte, a_u8Value) \
     511    do { pVCpu->cpum.GstCtx.XState.x87.aXMM[(a_iXReg)].au32[(a_iByte)]  = (a_u8Value);  } while (0)
     512
    506513#define IEM_MC_STORE_XREG_U64_ZX_U128(a_iXReg, a_u64Value) \
    507514    do { pVCpu->cpum.GstCtx.XState.x87.aXMM[(a_iXReg)].au64[0] = (a_u64Value); \
    508515         pVCpu->cpum.GstCtx.XState.x87.aXMM[(a_iXReg)].au64[1] = 0; \
    509516    } while (0)
    510 #define IEM_MC_STORE_XREG_U32(a_iXReg, a_iDword, a_u32Value) \
    511     do { pVCpu->cpum.GstCtx.XState.x87.aXMM[(a_iXReg)].au32[(a_iDword)] = (a_u32Value); } while (0)
     517
    512518#define IEM_MC_STORE_XREG_U32_U128(a_iXReg, a_iDwDst, a_u128Value, a_iDwSrc) \
    513519    do { pVCpu->cpum.GstCtx.XState.x87.aXMM[(a_iXReg)].au32[(a_iDwDst)] = (a_u128Value).au32[(a_iDwSrc)]; } while (0)
  • trunk/src/VBox/VMM/testcase/tstIEMCheckMc.cpp

    r97543 r97607  
    770770#define IEM_MC_FETCH_XREG_U64(a_u64Value, a_iXReg, a_iQWord)    do { CHK_XREG_IDX(a_iXReg); (a_u64Value) = 0; CHK_TYPE(uint64_t, a_u64Value); (void)fSseRead; (void)fMcBegin; } while (0)
    771771#define IEM_MC_FETCH_XREG_U32(a_u32Value, a_iXReg, a_iDWord)    do { CHK_XREG_IDX(a_iXReg); (a_u32Value) = 0; CHK_TYPE(uint32_t, a_u32Value); (void)fSseRead; (void)fMcBegin; } while (0)
    772 #define IEM_MC_FETCH_XREG_U16(a_u16Value, a_iXReg, a_iWord )    do { CHK_XREG_IDX(a_iXReg); (a_u32Value) = 0; CHK_TYPE(uint32_t, a_u32Value); (void)fSseRead; (void)fMcBegin; } while (0)
    773 #define IEM_MC_FETCH_XREG_U8( a_u8Value,  a_iXReg, a_iByte)     do { CHK_XREG_IDX(a_iXReg); (a_u32Value) = 0; CHK_TYPE(uint32_t, a_u32Value); (void)fSseRead; (void)fMcBegin; } while (0)
     772#define IEM_MC_FETCH_XREG_U16(a_u16Value, a_iXReg, a_iWord )    do { CHK_XREG_IDX(a_iXReg); (a_u16Value) = 0; CHK_TYPE(uint16_t, a_u16Value); (void)fSseRead; (void)fMcBegin; } while (0)
     773#define IEM_MC_FETCH_XREG_U8( a_u8Value,  a_iXReg, a_iByte)     do { CHK_XREG_IDX(a_iXReg); (a_u8Value)  = 0; CHK_TYPE(uint8_t,  a_u8Value); (void)fSseRead; (void)fMcBegin; } while (0)
    774774#define IEM_MC_STORE_XREG_U32_U128(a_iXReg, a_iDwDst, a_u128Value, a_iDwSrc)    do { CHK_XREG_IDX(a_iXReg); CHK_TYPE(RTUINT128U, a_u128Value);  AssertCompile((a_iDwDst) < RT_ELEMENTS((a_u128Value).au32)); AssertCompile((a_iDwSrc) < RT_ELEMENTS((a_u128Value).au32)); (void)fSseWrite; (void)fMcBegin; } while (0)
    775775#define IEM_MC_STORE_XREG_U128(a_iXReg, a_u128Value)        do { CHK_TYPE(RTUINT128U, a_u128Value); (void)fSseWrite; (void)fMcBegin; } while (0)
     
    780780#define IEM_MC_STORE_XREG_U64_ZX_U128(a_iXReg, a_u64Value)  do { CHK_XREG_IDX(a_iXReg); CHK_TYPE(uint64_t,  a_u64Value);  (void)fSseWrite; (void)fMcBegin; } while (0)
    781781#define IEM_MC_STORE_XREG_U32(a_iXReg, a_iDword, a_u32Value)    do { CHK_XREG_IDX(a_iXReg); CHK_TYPE(uint32_t,  a_u32Value); (void)fSseWrite; (void)fMcBegin; } while (0)
     782#define IEM_MC_STORE_XREG_U16(a_iXReg, a_iWord,  a_u16Value)    do { CHK_XREG_IDX(a_iXReg); CHK_TYPE(uint16_t,  a_u16Value); (void)fSseWrite; (void)fMcBegin; } while (0)
     783#define IEM_MC_STORE_XREG_U8( a_iXReg, a_iByte,  a_u8Value )    do { CHK_XREG_IDX(a_iXReg); CHK_TYPE(uint8_t,   a_u8Value ); (void)fSseWrite; (void)fMcBegin; } while (0)
    782784#define IEM_MC_STORE_XREG_U32_ZX_U128(a_iXReg, a_u32Value)  do { CHK_XREG_IDX(a_iXReg); CHK_TYPE(uint32_t,  a_u32Value);  (void)fSseWrite; (void)fMcBegin; } while (0)
    783785#define IEM_MC_STORE_XREG_HI_U64(a_iXReg, a_u64Value)       do { CHK_XREG_IDX(a_iXReg); CHK_TYPE(uint64_t,  a_u64Value);  (void)fSseWrite; (void)fMcBegin; } while (0)
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