VirtualBox

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


Ignore:
Timestamp:
May 16, 2017 7:21:21 PM (8 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
115447
Message:

IEM: Implemented movss Uss,Hss,Vss (VEX.F3.0F 11 mod=3) and movss Md,Vss (VEX.F3.0F 11 mod!=3).

Location:
trunk/src/VBox/VMM/VMMAll
Files:
3 edited

Legend:

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

    r66909 r66920  
    1149311493    } while (0)
    1149411494
     11495#define IEM_MC_FETCH_YREG_U32(a_u32Dst, a_iYRegSrc) \
     11496    do { PX86XSAVEAREA   pXStateTmp     = IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState); \
     11497         uintptr_t const iYRegSrcTmp    = (a_iYRegSrc); \
     11498         (a_u32Dst) = pXStateTmp->x87.aXMM[iYRegSrcTmp].au32[0]; \
     11499    } while (0)
    1149511500#define IEM_MC_FETCH_YREG_U64(a_u64Dst, a_iYRegSrc) \
    1149611501    do { PX86XSAVEAREA   pXStateTmp     = IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState); \
    1149711502         uintptr_t const iYRegSrcTmp    = (a_iYRegSrc); \
    11498          (a_u64Dst).au64[0] = pXStateTmp->x87.aXMM[iYRegSrcTmp].au64[0]; \
     11503         (a_u64Dst) = pXStateTmp->x87.aXMM[iYRegSrcTmp].au64[0]; \
    1149911504    } while (0)
    1150011505#define IEM_MC_FETCH_YREG_U128(a_u128Dst, a_iYRegSrc) \
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsPython.py

    r66909 r66920  
    233233    'UqHi':         ( 'IDX_UseModRM',       'rm',     '%Uq',  'UqHi',    ),
    234234    'Uss':          ( 'IDX_UseModRM',       'rm',     '%Uss', 'Uss',     ),
     235    'Uss_WO':       ( 'IDX_UseModRM',       'rm',     '%Uss', 'Uss',     ),
    235236    'Usd':          ( 'IDX_UseModRM',       'rm',     '%Usd', 'Usd',     ),
    236237    'Nq':           ( 'IDX_UseModRM',       'rm',     '%Qq',  'Nq',      ),
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsVexMap1.cpp.h

    r66919 r66920  
    306306         * @opgroup     og_avx_simdfp_datamove
    307307         * @opxcpttype  5
    308          * @opfunction  iemOp_vmovss_Vss_Hss_Wss
     308         * @opfunction  iemOp_vmovsd_Vsd_Hsd_Wsd
    309309         * @optest      op1=1 op2=2 -> op1=2
    310310         * @optest      op1=0 op2=-22 -> op1=-22
     
    415415 * @optest      op1=1 op2=2 -> op1=2
    416416 * @optest      op1=0 op2=-22 -> op1=-22
    417  * @oponly
    418417 */
    419418FNIEMOP_DEF(iemOp_vmovupd_Wpd_Vpd)
     
    483482}
    484483
    485 /**
    486  * @ opcode      0x11
    487  * @ oppfx       0xf3
    488  * @ opcpuid     sse
    489  * @ opgroup     og_sse_simdfp_datamove
    490  * @ opxcpttype  5
    491  * @ optest      op1=1 op2=2 -> op1=2
    492  * @ optest      op1=0 op2=-22 -> op1=-22
    493  */
    494 FNIEMOP_STUB(iemOp_vmovss_Wss_Hx_Vss);
    495 //FNIEMOP_DEF(iemOp_vmovss_Wss_Hx_Vss)
    496 //{
    497 //    IEMOP_MNEMONIC2(MR, VMOVSS, vmovss, Wss, Vss, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE);
    498 //    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    499 //    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
    500 //    {
    501 //        /*
    502 //         * Register, register.
    503 //         */
    504 //        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    505 //        IEM_MC_BEGIN(0, 1);
    506 //        IEM_MC_LOCAL(uint32_t,                  uSrc);
    507 //
    508 //        IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
    509 //        IEM_MC_ACTUALIZE_SSE_STATE_FOR_CHANGE();
    510 //        IEM_MC_FETCH_XREG_U32(uSrc, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
    511 //        IEM_MC_STORE_XREG_U32((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB, uSrc);
    512 //
    513 //        IEM_MC_ADVANCE_RIP();
    514 //        IEM_MC_END();
    515 //    }
    516 //    else
    517 //    {
    518 //        /*
    519 //         * Memory, register.
    520 //         */
    521 //        IEM_MC_BEGIN(0, 2);
    522 //        IEM_MC_LOCAL(uint32_t,                  uSrc);
    523 //        IEM_MC_LOCAL(RTGCPTR,                   GCPtrEffSrc);
    524 //
    525 //        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    526 //        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    527 //        IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
    528 //        IEM_MC_ACTUALIZE_SSE_STATE_FOR_READ();
    529 //
    530 //        IEM_MC_FETCH_XREG_U32(uSrc, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
    531 //        IEM_MC_STORE_MEM_U32(pVCpu->iem.s.iEffSeg, GCPtrEffSrc, uSrc);
    532 //
    533 //        IEM_MC_ADVANCE_RIP();
    534 //        IEM_MC_END();
    535 //    }
    536 //    return VINF_SUCCESS;
    537 //}
     484
     485FNIEMOP_DEF(iemOp_vmovss_Wss_Hss_Vss)
     486{
     487    Assert(pVCpu->iem.s.uVexLength <= 1);
     488    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     489    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
     490    {
     491        /**
     492         * @opcode      0x11
     493         * @oppfx       0xf3
     494         * @opcodesub   11 mr/reg
     495         * @opcpuid     avx
     496         * @opgroup     og_avx_simdfp_datamerge
     497         * @opxcpttype  5
     498         * @optest      op1=1 op2=0  op3=2    -> op1=2
     499         * @optest      op1=0 op2=0  op3=-22  -> op1=0xffffffea
     500         * @optest      op1=3 op2=-1 op3=0x77 -> op1=-4294967177
     501         */
     502        IEMOP_MNEMONIC3(VEX_MVR, VMOVSS, vmovss, Uss_WO, HdqCss, Vss, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE);
     503        IEMOP_HLP_DONE_DECODING_NO_AVX_PREFIX();
     504        IEM_MC_BEGIN(0, 0);
     505
     506        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     507        IEM_MC_ACTUALIZE_AVX_STATE_FOR_CHANGE();
     508        IEM_MC_MERGE_YREG_U32_U96_ZX_VLMAX((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB /*U32*/,
     509                                           ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg,
     510                                           pVCpu->iem.s.uVex3rdReg /*Hss*/);
     511        IEM_MC_ADVANCE_RIP();
     512        IEM_MC_END();
     513    }
     514    else
     515    {
     516        /**
     517         * @opdone
     518         * @opcode      0x11
     519         * @oppfx       0xf3
     520         * @opcodesub   11 mr/reg
     521         * @opcpuid     avx
     522         * @opgroup     og_avx_simdfp_datamove
     523         * @opxcpttype  5
     524         * @opfunction  iemOp_vmovss_Vss_Hss_Wss
     525         * @optest      op1=1 op2=2 -> op1=2
     526         * @optest      op1=0 op2=-22 -> op1=-22
     527         */
     528        IEMOP_MNEMONIC2(VEX_MR, VMOVSS, vmovss, Md_WO, Vss, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE);
     529        IEM_MC_BEGIN(0, 2);
     530        IEM_MC_LOCAL(uint32_t,                  uSrc);
     531        IEM_MC_LOCAL(RTGCPTR,                   GCPtrEffSrc);
     532
     533        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     534        IEMOP_HLP_DONE_DECODING_NO_AVX_PREFIX_AND_NO_VVVV();
     535        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     536        IEM_MC_ACTUALIZE_AVX_STATE_FOR_READ();
     537
     538        IEM_MC_FETCH_YREG_U32(uSrc, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     539        IEM_MC_STORE_MEM_U32(pVCpu->iem.s.iEffSeg, GCPtrEffSrc, uSrc);
     540
     541        IEM_MC_ADVANCE_RIP();
     542        IEM_MC_END();
     543    }
     544
     545    return VINF_SUCCESS;
     546}
    538547
    539548
     
    30693078
    30703079    /* 0x10 */  iemOp_vmovups_Vps_Wps,      iemOp_vmovupd_Vpd_Wpd,      iemOp_vmovss_Vss_Hss_Wss,   iemOp_vmovsd_Vsd_Hsd_Wsd,
    3071     /* 0x11 */  iemOp_vmovups_Wps_Vps,      iemOp_vmovupd_Wpd_Vpd,      iemOp_vmovss_Wss_Hx_Vss,    iemOp_vmovsd_Wsd_Hx_Vsd,
     3080    /* 0x11 */  iemOp_vmovups_Wps_Vps,      iemOp_vmovupd_Wpd_Vpd,      iemOp_vmovss_Wss_Hss_Vss,   iemOp_vmovsd_Wsd_Hx_Vsd,
    30723081    /* 0x12 */  iemOp_vmovlps_Vq_Hq_Mq__vmovhlps, iemOp_vmovlpd_Vq_Hq_Mq, iemOp_vmovsldup_Vx_Wx,    iemOp_vmovddup_Vx_Wx,
    30733082    /* 0x13 */  iemOp_vmovlps_Mq_Vq,        iemOp_vmovlpd_Mq_Vq,        iemOp_InvalidNeedRM,        iemOp_InvalidNeedRM,
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