VirtualBox

Changeset 67014 in vbox for trunk/src/VBox


Ignore:
Timestamp:
May 22, 2017 12:47:58 PM (8 years ago)
Author:
vboxsync
Message:

IEM: Documented movd Ed,Vd and mov Eq,Vq (0x66 0x0f 0x7e).

Location:
trunk/src/VBox
Files:
3 edited

Legend:

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

    r67013 r67014  
    35583558}
    35593559
    3560 /** Opcode 0x66 0x0f 0x6e - movd/q Vy, Ey */
    35613560FNIEMOP_DEF(iemOp_movd_q_Vy_Ey)
    35623561{
     
    43994398         * @optest      64-bit / op1=1 op2=2   -> op1=2   ftw=0xff
    44004399         * @optest      64-bit / op1=0 op2=-42 -> op1=-42 ftw=0xff
    4401          * @oponly
    44024400         */
    44034401        IEMOP_MNEMONIC2(MR, MOVQ, movq, Eq_WO, Pq, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OZ_PFX);
     
    44524450         * @optest      op1=1 op2=2   -> op1=2   ftw=0xff
    44534451         * @optest      op1=0 op2=-42 -> op1=-42 ftw=0xff
    4454         * @oponly
    44554452         */
    44564453        IEMOP_MNEMONIC2(MR, MOVD, movd, Ed_WO, Pd, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OZ_PFX);
     
    44974494
    44984495
    4499 /** Opcode 0x66 0x0f 0x7e - movd_q Ey, Vy */
    45004496FNIEMOP_DEF(iemOp_movd_q_Ey_Vy)
    45014497{
    45024498    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    45034499    if (pVCpu->iem.s.fPrefixes & IEM_OP_PRF_SIZE_REX_W)
    4504         IEMOP_MNEMONIC(movq_Eq_Wq, "movq Eq,Wq");
    4505     else
    4506         IEMOP_MNEMONIC(movd_Ed_Wd, "movd Ed,Wd");
    4507     if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
    4508     {
    4509         /* greg, XMM */
    4510         IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    4511         IEM_MC_BEGIN(0, 1);
    4512         IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
    4513         IEM_MC_ACTUALIZE_SSE_STATE_FOR_READ();
    4514         if (pVCpu->iem.s.fPrefixes & IEM_OP_PRF_SIZE_REX_W)
     4500    {
     4501        /**
     4502         * @opcode      0x7e
     4503         * @opcodesub   rex.w=1
     4504         * @oppfx       0x66
     4505         * @opcpuid     sse2
     4506         * @opgroup     og_sse2_simdint_datamove
     4507         * @opxcpttype  5
     4508         * @optest      64-bit / op1=1 op2=2   -> op1=2
     4509         * @optest      64-bit / op1=0 op2=-42 -> op1=-42
     4510        * @oponly
     4511         */
     4512        IEMOP_MNEMONIC2(MR, MOVQ, movq, Eq_WO, Vq, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OZ_PFX);
     4513        if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
    45154514        {
     4515            /* greg64, XMM */
     4516            IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     4517            IEM_MC_BEGIN(0, 1);
    45164518            IEM_MC_LOCAL(uint64_t, u64Tmp);
     4519
     4520            IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
     4521            IEM_MC_ACTUALIZE_SSE_STATE_FOR_READ();
     4522
    45174523            IEM_MC_FETCH_XREG_U64(u64Tmp, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
    45184524            IEM_MC_STORE_GREG_U64((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB, u64Tmp);
     4525
     4526            IEM_MC_ADVANCE_RIP();
     4527            IEM_MC_END();
    45194528        }
    45204529        else
    45214530        {
     4531            /* [mem64], XMM */
     4532            IEM_MC_BEGIN(0, 2);
     4533            IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
     4534            IEM_MC_LOCAL(uint64_t, u64Tmp);
     4535
     4536            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     4537            IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     4538            IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
     4539            IEM_MC_ACTUALIZE_SSE_STATE_FOR_READ();
     4540
     4541            IEM_MC_FETCH_XREG_U64(u64Tmp, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     4542            IEM_MC_STORE_MEM_U64(pVCpu->iem.s.iEffSeg, GCPtrEffSrc, u64Tmp);
     4543
     4544            IEM_MC_ADVANCE_RIP();
     4545            IEM_MC_END();
     4546        }
     4547    }
     4548    else
     4549    {
     4550        /**
     4551         * @opdone
     4552         * @opcode      0x7e
     4553         * @opcodesub   rex.w=0
     4554         * @oppfx       0x66
     4555         * @opcpuid     sse2
     4556         * @opgroup     og_sse2_simdint_datamove
     4557         * @opxcpttype  5
     4558         * @opfunction  iemOp_movd_q_Vy_Ey
     4559         * @optest      op1=1 op2=2   -> op1=2
     4560         * @optest      op1=0 op2=-42 -> op1=-42
     4561         * @oponly
     4562         */
     4563        IEMOP_MNEMONIC2(MR, MOVD, movd, Ed_WO, Vd, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OZ_PFX);
     4564        if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
     4565        {
     4566            /* greg32, XMM */
     4567            IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     4568            IEM_MC_BEGIN(0, 1);
    45224569            IEM_MC_LOCAL(uint32_t, u32Tmp);
     4570
     4571            IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
     4572            IEM_MC_ACTUALIZE_SSE_STATE_FOR_READ();
     4573
    45234574            IEM_MC_FETCH_XREG_U32(u32Tmp, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
    45244575            IEM_MC_STORE_GREG_U32((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB, u32Tmp);
    4525         }
    4526         IEM_MC_ADVANCE_RIP();
    4527         IEM_MC_END();
    4528     }
    4529     else
    4530     {
    4531         /* [mem], XMM */
    4532         IEM_MC_BEGIN(0, 2);
    4533         IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
    4534         IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
    4535         IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 1);
    4536         IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    4537         IEM_MC_ACTUALIZE_SSE_STATE_FOR_READ();
    4538         if (pVCpu->iem.s.fPrefixes & IEM_OP_PRF_SIZE_REX_W)
    4539         {
    4540             IEM_MC_LOCAL(uint64_t, u64Tmp);
    4541             IEM_MC_FETCH_XREG_U64(u64Tmp, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
    4542             IEM_MC_STORE_MEM_U64(pVCpu->iem.s.iEffSeg, GCPtrEffSrc, u64Tmp);
     4576
     4577            IEM_MC_ADVANCE_RIP();
     4578            IEM_MC_END();
    45434579        }
    45444580        else
    45454581        {
     4582            /* [mem32], XMM */
     4583            IEM_MC_BEGIN(0, 2);
     4584            IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
    45464585            IEM_MC_LOCAL(uint32_t, u32Tmp);
     4586
     4587            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     4588            IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     4589            IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
     4590            IEM_MC_ACTUALIZE_SSE_STATE_FOR_READ();
     4591
    45474592            IEM_MC_FETCH_XREG_U32(u32Tmp, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
    45484593            IEM_MC_STORE_MEM_U32(pVCpu->iem.s.iEffSeg, GCPtrEffSrc, u32Tmp);
     4594
     4595            IEM_MC_ADVANCE_RIP();
     4596            IEM_MC_END();
    45494597        }
    4550         IEM_MC_ADVANCE_RIP();
    4551         IEM_MC_END();
    4552     }
    4553     return VINF_SUCCESS;
    4554 }
    4555 
     4598    }
     4599    return VINF_SUCCESS;
     4600
     4601}
    45564602
    45574603/**
  • trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-generated-1-template.c

    r67013 r67014  
    41944194            break;
    41954195
     4196        case BS3CG1ENC_MODRM_Ed_WO_Vd_WZ:
     4197            pThis->pfnEncoder        = Bs3Cg1EncodeNext_MODRM_Vd_WO_Ed_WZ;
     4198            pThis->iRmOp             = 0;
     4199            pThis->iRegOp            = 1;
     4200            pThis->aOperands[0].cbOp = 4;
     4201            pThis->aOperands[1].cbOp = 4;
     4202            pThis->aOperands[0].idxFieldBase   = BS3CG1DST_EAX;
     4203            pThis->aOperands[1].idxFieldBase   = BS3CG1DST_XMM0;
     4204            pThis->aOperands[0].enmLocation    = BS3CG1OPLOC_CTX;
     4205            pThis->aOperands[0].enmLocationReg = BS3CG1OPLOC_CTX;
     4206            pThis->aOperands[0].enmLocationMem = BS3CG1OPLOC_MEM_WO;
     4207            pThis->aOperands[1].enmLocation    = BS3CG1OPLOC_CTX;
     4208            break;
     4209
     4210        case BS3CG1ENC_MODRM_Eq_WO_Vq_WNZ:
     4211            pThis->pfnEncoder        = Bs3Cg1EncodeNext_MODRM_Vq_WO_Eq_WNZ;
     4212            pThis->iRmOp             = 0;
     4213            pThis->iRegOp            = 1;
     4214            pThis->aOperands[0].cbOp = 8;
     4215            pThis->aOperands[1].cbOp = 8;
     4216            pThis->aOperands[0].idxFieldBase   = BS3CG1DST_RAX;
     4217            pThis->aOperands[1].idxFieldBase   = BS3CG1DST_XMM0;
     4218            pThis->aOperands[0].enmLocation    = BS3CG1OPLOC_CTX;
     4219            pThis->aOperands[0].enmLocationReg = BS3CG1OPLOC_CTX;
     4220            pThis->aOperands[0].enmLocationMem = BS3CG1OPLOC_MEM_WO;
     4221            pThis->aOperands[1].enmLocation    = BS3CG1OPLOC_CTX;
     4222            break;
     4223
    41964224        case BS3CG1ENC_MODRM_Gb_Eb:
    41974225            pThis->iRmOp             = 1;
  • trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-generated-1.h

    r67013 r67014  
    140140    BS3CG1ENC_MODRM_Ed_WO_Pd_WZ,
    141141    BS3CG1ENC_MODRM_Eq_WO_Pq_WNZ,
     142    BS3CG1ENC_MODRM_Ed_WO_Vd_WZ,
     143    BS3CG1ENC_MODRM_Eq_WO_Vq_WNZ,
    142144    BS3CG1ENC_MODRM_Pq_WO_Qq,
    143145    BS3CG1ENC_MODRM_Wss_WO_Vss,
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