VirtualBox

Changeset 66919 in vbox for trunk/src/VBox


Ignore:
Timestamp:
May 16, 2017 6:47:23 PM (8 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
115446
Message:

IEM: Implemented vmovupd Wpd,Vdp (VEX.66.0F 11). (For all intents and purposes the same as VEX.0F 11.)

Location:
trunk/src/VBox
Files:
3 edited

Legend:

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

    r66909 r66919  
    199199    }
    200200    return VINF_SUCCESS;
    201 
    202201}
    203202
     
    340339 * @optest      op1=1 op2=2 -> op1=2
    341340 * @optest      op1=0 op2=-22 -> op1=-22
    342  * @oponly
    343341 */
    344342FNIEMOP_DEF(iemOp_vmovups_Wps_Vps)
     
    410408
    411409/**
    412  * @ opcode      0x11
    413  * @ oppfx       0x66
    414  * @ opcpuid     sse2
    415  * @ opgroup     og_sse2_pcksclr_datamove
    416  * @ opxcpttype  4UA
    417  * @ optest      op1=1 op2=2 -> op1=2
    418  * @ optest      op1=0 op2=-42 -> op1=-42
     410 * @opcode      0x11
     411 * @oppfx       0x66
     412 * @opcpuid     avx
     413 * @opgroup     og_avx_simdfp_datamove
     414 * @opxcpttype  4UA
     415 * @optest      op1=1 op2=2 -> op1=2
     416 * @optest      op1=0 op2=-22 -> op1=-22
     417 * @oponly
    419418 */
    420 FNIEMOP_STUB(iemOp_vmovupd_Wpd_Vpd);
    421 //FNIEMOP_DEF(iemOp_vmovupd_Wpd_Vpd)
    422 //{
    423 //    IEMOP_MNEMONIC2(MR, VMOVUPD, vmovupd, Wpd, Vpd, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE);
    424 //    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    425 //    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
    426 //    {
    427 //        /*
    428 //         * Register, register.
    429 //         */
    430 //        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    431 //        IEM_MC_BEGIN(0, 0);
    432 //        IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
    433 //        IEM_MC_ACTUALIZE_SSE_STATE_FOR_CHANGE();
    434 //        IEM_MC_COPY_XREG_U128((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB,
    435 //                              ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
    436 //        IEM_MC_ADVANCE_RIP();
    437 //        IEM_MC_END();
    438 //    }
    439 //    else
    440 //    {
    441 //        /*
    442 //         * Memory, register.
    443 //         */
    444 //        IEM_MC_BEGIN(0, 2);
    445 //        IEM_MC_LOCAL(RTUINT128U,                uSrc); /** @todo optimize this one day... */
    446 //        IEM_MC_LOCAL(RTGCPTR,                   GCPtrEffSrc);
    447 //
    448 //        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    449 //        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    450 //        IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
    451 //        IEM_MC_ACTUALIZE_SSE_STATE_FOR_READ();
    452 //
    453 //        IEM_MC_FETCH_XREG_U128(uSrc, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
    454 //        IEM_MC_STORE_MEM_U128(pVCpu->iem.s.iEffSeg, GCPtrEffSrc, uSrc);
    455 //
    456 //        IEM_MC_ADVANCE_RIP();
    457 //        IEM_MC_END();
    458 //    }
    459 //    return VINF_SUCCESS;
    460 //}
    461 
     419FNIEMOP_DEF(iemOp_vmovupd_Wpd_Vpd)
     420{
     421    IEMOP_MNEMONIC2(VEX_MR, VMOVUPD, vmovupd, Wpd_WO, Vpd, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE);
     422    Assert(pVCpu->iem.s.uVexLength <= 1);
     423    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     424    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
     425    {
     426        /*
     427         * Register, register.
     428         */
     429        IEMOP_HLP_DONE_DECODING_NO_AVX_PREFIX_AND_NO_VVVV();
     430        IEM_MC_BEGIN(0, 0);
     431        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     432        IEM_MC_ACTUALIZE_AVX_STATE_FOR_CHANGE();
     433        if (pVCpu->iem.s.uVexLength == 0)
     434            IEM_MC_COPY_YREG_U128_ZX_VLMAX((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB,
     435                                           ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     436        else
     437            IEM_MC_COPY_YREG_U256_ZX_VLMAX((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB,
     438                                           ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     439        IEM_MC_ADVANCE_RIP();
     440        IEM_MC_END();
     441    }
     442    else if (pVCpu->iem.s.uVexLength == 0)
     443    {
     444        /*
     445         * 128-bit: Memory, register.
     446         */
     447        IEM_MC_BEGIN(0, 2);
     448        IEM_MC_LOCAL(RTUINT128U,                uSrc);
     449        IEM_MC_LOCAL(RTGCPTR,                   GCPtrEffSrc);
     450
     451        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     452        IEMOP_HLP_DONE_DECODING_NO_AVX_PREFIX_AND_NO_VVVV();
     453        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     454        IEM_MC_ACTUALIZE_AVX_STATE_FOR_READ();
     455
     456        IEM_MC_FETCH_YREG_U128(uSrc, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     457        IEM_MC_STORE_MEM_U128(pVCpu->iem.s.iEffSeg, GCPtrEffSrc, uSrc);
     458
     459        IEM_MC_ADVANCE_RIP();
     460        IEM_MC_END();
     461    }
     462    else
     463    {
     464        /*
     465         * 256-bit: Memory, register.
     466         */
     467        IEM_MC_BEGIN(0, 2);
     468        IEM_MC_LOCAL(RTUINT256U,                uSrc);
     469        IEM_MC_LOCAL(RTGCPTR,                   GCPtrEffSrc);
     470
     471        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     472        IEMOP_HLP_DONE_DECODING_NO_AVX_PREFIX_AND_NO_VVVV();
     473        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     474        IEM_MC_ACTUALIZE_AVX_STATE_FOR_READ();
     475
     476        IEM_MC_FETCH_YREG_U256(uSrc, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     477        IEM_MC_STORE_MEM_U256(pVCpu->iem.s.iEffSeg, GCPtrEffSrc, uSrc);
     478
     479        IEM_MC_ADVANCE_RIP();
     480        IEM_MC_END();
     481    }
     482    return VINF_SUCCESS;
     483}
    462484
    463485/**
  • trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-generated-1-template.c

    r66917 r66919  
    33303330
    33313331        case BS3CG1ENC_VEX_MODRM_Wps_WO_Vps:
     3332        case BS3CG1ENC_VEX_MODRM_Wpd_WO_Vpd:
    33323333            pThis->pfnEncoder        = Bs3Cg1EncodeNext_VEX_MODRM_WsomethingWO_Vsomething_Wip;
    33333334            pThis->iRmOp             = 0;
  • trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-generated-1.h

    r66909 r66919  
    154154    BS3CG1ENC_VEX_MODRM_Md_WO,
    155155    BS3CG1ENC_VEX_MODRM_Wps_WO_Vps,
     156    BS3CG1ENC_VEX_MODRM_Wpd_WO_Vpd,
    156157
    157158    BS3CG1ENC_FIXED,
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