VirtualBox

Changeset 66921 in vbox for trunk/src/VBox


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

IEM: Implemented movsd Usd,Hsd,Vsd (VEX.F2.0F 11 mod=3) and movsd Mq,Vsd (VEX.F2.0F 11 mod!=3).

Location:
trunk/src/VBox
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsPython.py

    r66920 r66921  
    235235    'Uss_WO':       ( 'IDX_UseModRM',       'rm',     '%Uss', 'Uss',     ),
    236236    'Usd':          ( 'IDX_UseModRM',       'rm',     '%Usd', 'Usd',     ),
     237    'Usd_WO':       ( 'IDX_UseModRM',       'rm',     '%Usd', 'Usd',     ),
    237238    'Nq':           ( 'IDX_UseModRM',       'rm',     '%Qq',  'Nq',      ),
    238239
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsVexMap1.cpp.h

    r66920 r66921  
    547547
    548548
    549 /**
    550  * @ opcode      0x11
    551  * @ oppfx       0xf2
    552  * @ opcpuid     sse2
    553  * @ opgroup     og_sse2_pcksclr_datamove
    554  * @ opxcpttype  5
    555  * @ optest      op1=1 op2=2 -> op1=2
    556  * @ optest      op1=0 op2=-42 -> op1=-42
    557  */
    558 FNIEMOP_STUB(iemOp_vmovsd_Wsd_Hx_Vsd);
    559 //FNIEMOP_DEF(iemOp_vmovsd_Wsd_Hx_Vsd)
    560 //{
    561 //    IEMOP_MNEMONIC2(MR, VMOVSD, vmovsd, Wsd, Vsd, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE);
    562 //    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    563 //    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
    564 //    {
    565 //        /*
    566 //         * Register, register.
    567 //         */
    568 //        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    569 //        IEM_MC_BEGIN(0, 1);
    570 //        IEM_MC_LOCAL(uint64_t,                  uSrc);
    571 //
    572 //        IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
    573 //        IEM_MC_ACTUALIZE_SSE_STATE_FOR_CHANGE();
    574 //        IEM_MC_FETCH_XREG_U64(uSrc, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
    575 //        IEM_MC_STORE_XREG_U64((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB, uSrc);
    576 //
    577 //        IEM_MC_ADVANCE_RIP();
    578 //        IEM_MC_END();
    579 //    }
    580 //    else
    581 //    {
    582 //        /*
    583 //         * Memory, register.
    584 //         */
    585 //        IEM_MC_BEGIN(0, 2);
    586 //        IEM_MC_LOCAL(uint64_t,                  uSrc);
    587 //        IEM_MC_LOCAL(RTGCPTR,                   GCPtrEffSrc);
    588 //
    589 //        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    590 //        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    591 //        IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
    592 //        IEM_MC_ACTUALIZE_SSE_STATE_FOR_READ();
    593 //
    594 //        IEM_MC_FETCH_XREG_U64(uSrc, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
    595 //        IEM_MC_STORE_MEM_U64(pVCpu->iem.s.iEffSeg, GCPtrEffSrc, uSrc);
    596 //
    597 //        IEM_MC_ADVANCE_RIP();
    598 //        IEM_MC_END();
    599 //    }
    600 //    return VINF_SUCCESS;
    601 //}
     549FNIEMOP_DEF(iemOp_vmovsd_Wsd_Hsd_Vsd)
     550{
     551    Assert(pVCpu->iem.s.uVexLength <= 1);
     552    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     553    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
     554    {
     555        /**
     556         * @opcode      0x11
     557         * @oppfx       0xf2
     558         * @opcodesub   11 mr/reg
     559         * @opcpuid     avx
     560         * @opgroup     og_avx_simdfp_datamerge
     561         * @opxcpttype  5
     562         * @optest      op1=1 op2=0  op3=2    -> op1=2
     563         * @optest      op1=0 op2=0  op3=-22  -> op1=0xffffffffffffffea
     564         * @optest      op1=3 op2=-1 op3=0x77 ->
     565         *              op1=0xffffffffffffffff0000000000000077
     566         */
     567        IEMOP_MNEMONIC3(VEX_MVR, VMOVSD, vmovsd, Usd_WO, HdqCsd, Vsd, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE);
     568        IEMOP_HLP_DONE_DECODING_NO_AVX_PREFIX();
     569        IEM_MC_BEGIN(0, 0);
     570
     571        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     572        IEM_MC_ACTUALIZE_AVX_STATE_FOR_CHANGE();
     573        IEM_MC_MERGE_YREG_U64_U64_ZX_VLMAX((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB,
     574                                           ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg,
     575                                           pVCpu->iem.s.uVex3rdReg /*Hss*/);
     576        IEM_MC_ADVANCE_RIP();
     577        IEM_MC_END();
     578    }
     579    else
     580    {
     581        /**
     582         * @opdone
     583         * @opcode      0x11
     584         * @oppfx       0xf2
     585         * @opcodesub   11 mr/reg
     586         * @opcpuid     avx
     587         * @opgroup     og_avx_simdfp_datamove
     588         * @opxcpttype  5
     589         * @opfunction  iemOp_vmovsd_Wsd_Hsd_Vsd
     590         * @optest      op1=1 op2=2 -> op1=2
     591         * @optest      op1=0 op2=-22 -> op1=-22
     592         */
     593        IEMOP_MNEMONIC2(VEX_MR, VMOVSD, vmovsd, Mq_WO, Vsd, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE);
     594        IEM_MC_BEGIN(0, 2);
     595        IEM_MC_LOCAL(uint64_t,                  uSrc);
     596        IEM_MC_LOCAL(RTGCPTR,                   GCPtrEffSrc);
     597
     598        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     599        IEMOP_HLP_DONE_DECODING_NO_AVX_PREFIX_AND_NO_VVVV();
     600        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     601        IEM_MC_ACTUALIZE_AVX_STATE_FOR_READ();
     602
     603        IEM_MC_FETCH_YREG_U64(uSrc, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     604        IEM_MC_STORE_MEM_U64(pVCpu->iem.s.iEffSeg, GCPtrEffSrc, uSrc);
     605
     606        IEM_MC_ADVANCE_RIP();
     607        IEM_MC_END();
     608    }
     609
     610    return VINF_SUCCESS;
     611}
    602612
    603613
     
    30783088
    30793089    /* 0x10 */  iemOp_vmovups_Vps_Wps,      iemOp_vmovupd_Vpd_Wpd,      iemOp_vmovss_Vss_Hss_Wss,   iemOp_vmovsd_Vsd_Hsd_Wsd,
    3080     /* 0x11 */  iemOp_vmovups_Wps_Vps,      iemOp_vmovupd_Wpd_Vpd,      iemOp_vmovss_Wss_Hss_Vss,   iemOp_vmovsd_Wsd_Hx_Vsd,
     3090    /* 0x11 */  iemOp_vmovups_Wps_Vps,      iemOp_vmovupd_Wpd_Vpd,      iemOp_vmovss_Wss_Hss_Vss,   iemOp_vmovsd_Wsd_Hsd_Vsd,
    30813091    /* 0x12 */  iemOp_vmovlps_Vq_Hq_Mq__vmovhlps, iemOp_vmovlpd_Vq_Hq_Mq, iemOp_vmovsldup_Vx_Wx,    iemOp_vmovddup_Vx_Wx,
    30823092    /* 0x13 */  iemOp_vmovlps_Mq_Vq,        iemOp_vmovlpd_Mq_Vq,        iemOp_InvalidNeedRM,        iemOp_InvalidNeedRM,
  • trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-generated-1-template.c

    r66920 r66921  
    33473347            break;
    33483348
     3349        case BS3CG1ENC_VEX_MODRM_Mq_WO_Vsd:
     3350            pThis->pfnEncoder        = Bs3Cg1EncodeNext_VEX_MODRM_VsomethingWO_Msomething_Wip_Lig_OR_ViceVersa;
     3351            pThis->iRmOp             = 0;
     3352            pThis->iRegOp            = 1;
     3353            pThis->aOperands[0].cbOp = 8;
     3354            pThis->aOperands[1].cbOp = 8;
     3355            pThis->aOperands[0].enmLocation  = BS3CG1OPLOC_MEM_WO;
     3356            pThis->aOperands[1].enmLocation  = BS3CG1OPLOC_CTX;
     3357            pThis->aOperands[0].idxFieldBase = BS3CG1DST_INVALID;
     3358            pThis->aOperands[1].idxFieldBase = BS3CG1DST_XMM0_LO;
     3359            break;
     3360
    33493361        case BS3CG1ENC_VEX_MODRM_Uss_WO_HdqCss_Vss:
    33503362            pThis->pfnEncoder        = Bs3Cg1EncodeNext_VEX_MODRM_VsomethingWO_HdqCsomething_Usomething_OR_Vice_Versa;
     
    33603372            pThis->aOperands[1].idxFieldBase = BS3CG1DST_XMM0;
    33613373            pThis->aOperands[2].idxFieldBase = BS3CG1DST_XMM0_DW0;
     3374            break;
     3375
     3376        case BS3CG1ENC_VEX_MODRM_Usd_WO_HdqCsd_Vsd:
     3377            pThis->pfnEncoder        = Bs3Cg1EncodeNext_VEX_MODRM_VsomethingWO_HdqCsomething_Usomething_OR_Vice_Versa;
     3378            pThis->iRegOp            = 2;
     3379            pThis->iRmOp             = 0;
     3380            pThis->aOperands[0].cbOp = 16;
     3381            pThis->aOperands[1].cbOp = 16;
     3382            pThis->aOperands[2].cbOp = 8;
     3383            pThis->aOperands[0].enmLocation  = BS3CG1OPLOC_CTX_ZX_VLMAX;
     3384            pThis->aOperands[1].enmLocation  = BS3CG1OPLOC_CTX;
     3385            pThis->aOperands[2].enmLocation  = BS3CG1OPLOC_CTX;
     3386            pThis->aOperands[0].idxFieldBase = BS3CG1DST_XMM0;
     3387            pThis->aOperands[1].idxFieldBase = BS3CG1DST_XMM0;
     3388            pThis->aOperands[2].idxFieldBase = BS3CG1DST_XMM0_LO;
    33623389            break;
    33633390
  • trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-generated-1.h

    r66920 r66921  
    156156    BS3CG1ENC_VEX_MODRM_Md_WO,
    157157    BS3CG1ENC_VEX_MODRM_Md_WO_Vss,
    158     BS3CG1ENC_VEX_MODRM_Md_WO_Vsd,
     158    BS3CG1ENC_VEX_MODRM_Mq_WO_Vsd,
    159159    BS3CG1ENC_VEX_MODRM_Uss_WO_HdqCss_Vss,
    160160    BS3CG1ENC_VEX_MODRM_Usd_WO_HdqCsd_Vsd,
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