VirtualBox

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


Ignore:
Timestamp:
May 15, 2017 10:14:54 AM (8 years ago)
Author:
vboxsync
Message:

IEM: Implemented vmovupd Vpd,Wpd (VEX.66.0f 10)

File:
1 edited

Legend:

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

    r66886 r66888  
    123123    }
    124124    return VINF_SUCCESS;
    125 
    126125}
    127126
    128 /** Opcode VEX.66.0F 0x10 - vmovupd Vpd, Wpd */
    129 FNIEMOP_STUB(iemOp_vmovupd_Vpd_Wpd);
     127
     128/**
     129 * @opcode      0x10
     130 * @oppfx       0x66
     131 * @opcpuid     avx
     132 * @opgroup     og_avx_simdfp_datamove
     133 * @opxcpttype  4UA
     134 * @optest      op1=1 op2=2 -> op1=2
     135 * @optest      op1=0 op2=-22 -> op1=-22
     136 * @oponly
     137 */
     138FNIEMOP_DEF(iemOp_vmovupd_Vpd_Wpd)
     139{
     140    IEMOP_MNEMONIC2(VEX_RM, VMOVUPD, vmovupd, Vpd_WO, Wpd, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE);
     141    Assert(pVCpu->iem.s.uVexLength <= 1);
     142    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     143    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
     144    {
     145        /*
     146         * Register, register.
     147         */
     148        IEMOP_HLP_DONE_DECODING_NO_AVX_PREFIX_AND_NO_VVVV();
     149        IEM_MC_BEGIN(0, 0);
     150        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     151        IEM_MC_ACTUALIZE_AVX_STATE_FOR_CHANGE();
     152        if (pVCpu->iem.s.uVexLength == 0)
     153            IEM_MC_COPY_YREG_U128_ZX(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg,
     154                                     (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
     155        else
     156            IEM_MC_COPY_YREG_U256_ZX(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg,
     157                                     (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
     158        IEM_MC_ADVANCE_RIP();
     159        IEM_MC_END();
     160    }
     161    else if (pVCpu->iem.s.uVexLength == 0)
     162    {
     163        /*
     164         * 128-bit: Memory, register.
     165         */
     166        IEM_MC_BEGIN(0, 2);
     167        IEM_MC_LOCAL(RTUINT128U,                uSrc);
     168        IEM_MC_LOCAL(RTGCPTR,                   GCPtrEffSrc);
     169
     170        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     171        IEMOP_HLP_DONE_DECODING_NO_AVX_PREFIX_AND_NO_VVVV();
     172        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     173        IEM_MC_ACTUALIZE_AVX_STATE_FOR_CHANGE();
     174
     175        IEM_MC_FETCH_MEM_U128(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     176        IEM_MC_STORE_YREG_U128_ZX(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, uSrc);
     177
     178        IEM_MC_ADVANCE_RIP();
     179        IEM_MC_END();
     180    }
     181    else
     182    {
     183        /*
     184         * 256-bit: Memory, register.
     185         */
     186        IEM_MC_BEGIN(0, 2);
     187        IEM_MC_LOCAL(RTUINT256U,                uSrc);
     188        IEM_MC_LOCAL(RTGCPTR,                   GCPtrEffSrc);
     189
     190        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     191        IEMOP_HLP_DONE_DECODING_NO_AVX_PREFIX_AND_NO_VVVV();
     192        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     193        IEM_MC_ACTUALIZE_AVX_STATE_FOR_CHANGE();
     194
     195        IEM_MC_FETCH_MEM_U256(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     196        IEM_MC_STORE_YREG_U256_ZX(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, uSrc);
     197
     198        IEM_MC_ADVANCE_RIP();
     199        IEM_MC_END();
     200    }
     201    return VINF_SUCCESS;
     202
     203}
    130204
    131205
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