VirtualBox

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


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

IEM: Implemented vmovdqa Vx,Wx (VEX.66.0F 6f).

File:
1 edited

Legend:

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

    r67007 r67009  
    21522152/*  Opcode VEX.0F 0x6f - invalid */
    21532153
    2154 /** Opcode VEX.66.0F 0x6f - vmovdqa Vx, Wx */
    2155 FNIEMOP_STUB(iemOp_vmovdqa_Vx_Wx);
    2156 //FNIEMOP_DEF(iemOp_vmovdqa_Vx_Wx)
    2157 //{
    2158 //    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    2159 //    IEMOP_MNEMONIC(vmovdqa_Vdq_Wdq, "movdqa Vdq,Wdq");
    2160 //    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
    2161 //    {
    2162 //        /*
    2163 //         * Register, register.
    2164 //         */
    2165 //        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    2166 //        IEM_MC_BEGIN(0, 0);
    2167 //        IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
    2168 //        IEM_MC_ACTUALIZE_SSE_STATE_FOR_CHANGE();
    2169 //        IEM_MC_COPY_XREG_U128(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg,
    2170 //                              (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    2171 //        IEM_MC_ADVANCE_RIP();
    2172 //        IEM_MC_END();
    2173 //    }
    2174 //    else
    2175 //    {
    2176 //        /*
    2177 //         * Register, memory.
    2178 //         */
    2179 //        IEM_MC_BEGIN(0, 2);
    2180 //        IEM_MC_LOCAL(RTUINT128U, u128Tmp);
    2181 //        IEM_MC_LOCAL(RTGCPTR,    GCPtrEffSrc);
    2182 //
    2183 //        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    2184 //        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    2185 //        IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
    2186 //        IEM_MC_ACTUALIZE_SSE_STATE_FOR_CHANGE();
    2187 //        IEM_MC_FETCH_MEM_U128_ALIGN_SSE(u128Tmp, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    2188 //        IEM_MC_STORE_XREG_U128(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, u128Tmp);
    2189 //
    2190 //        IEM_MC_ADVANCE_RIP();
    2191 //        IEM_MC_END();
    2192 //    }
    2193 //    return VINF_SUCCESS;
    2194 //}
     2154/**
     2155 * @opcode      0x6f
     2156 * @oppfx       0x66
     2157 * @opcpuid     avx
     2158 * @opgroup     og_avx_simdint_datamove
     2159 * @opxcpttype  1
     2160 * @optest      op1=1 op2=2   -> op1=2
     2161 * @optest      op1=0 op2=-42 -> op1=-42
     2162 * @oponly
     2163 */
     2164FNIEMOP_DEF(iemOp_vmovdqa_Vx_Wx)
     2165{
     2166    IEMOP_MNEMONIC2(VEX_RM, VMOVDQA, vmovdqa, Vx_WO, Wx, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES);
     2167    Assert(pVCpu->iem.s.uVexLength <= 1);
     2168    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     2169    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
     2170    {
     2171        /*
     2172         * Register, register.
     2173         */
     2174        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     2175        IEM_MC_BEGIN(0, 0);
     2176
     2177        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     2178        IEM_MC_ACTUALIZE_AVX_STATE_FOR_CHANGE();
     2179        if (pVCpu->iem.s.uVexLength == 0)
     2180            IEM_MC_COPY_YREG_U128_ZX_VLMAX(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg,
     2181                                           (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
     2182        else
     2183            IEM_MC_COPY_YREG_U256_ZX_VLMAX(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg,
     2184                                           (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
     2185        IEM_MC_ADVANCE_RIP();
     2186        IEM_MC_END();
     2187    }
     2188    else if (pVCpu->iem.s.uVexLength == 0)
     2189    {
     2190        /*
     2191         * Register, memory128.
     2192         */
     2193        IEM_MC_BEGIN(0, 2);
     2194        IEM_MC_LOCAL(RTUINT128U, u128Tmp);
     2195        IEM_MC_LOCAL(RTGCPTR,    GCPtrEffSrc);
     2196
     2197        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     2198        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     2199        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     2200        IEM_MC_ACTUALIZE_AVX_STATE_FOR_CHANGE();
     2201
     2202        IEM_MC_FETCH_MEM_U128_ALIGN_SSE(u128Tmp, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     2203        IEM_MC_STORE_YREG_U128_ZX_VLMAX(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, u128Tmp);
     2204
     2205        IEM_MC_ADVANCE_RIP();
     2206        IEM_MC_END();
     2207    }
     2208    else
     2209    {
     2210        /*
     2211         * Register, memory256.
     2212         */
     2213        IEM_MC_BEGIN(0, 2);
     2214        IEM_MC_LOCAL(RTUINT256U, u256Tmp);
     2215        IEM_MC_LOCAL(RTGCPTR,    GCPtrEffSrc);
     2216
     2217        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     2218        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     2219        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     2220        IEM_MC_ACTUALIZE_AVX_STATE_FOR_CHANGE();
     2221
     2222        IEM_MC_FETCH_MEM_U256_ALIGN_AVX(u256Tmp, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     2223        IEM_MC_STORE_YREG_U256_ZX_VLMAX(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, u256Tmp);
     2224
     2225        IEM_MC_ADVANCE_RIP();
     2226        IEM_MC_END();
     2227    }
     2228    return VINF_SUCCESS;
     2229}
    21952230
    21962231/** Opcode VEX.F3.0F 0x6f - vmovdqu Vx, Wx */
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