VirtualBox

Changeset 65757 in vbox for trunk/src/VBox/VMM


Ignore:
Timestamp:
Feb 13, 2017 9:27:54 AM (8 years ago)
Author:
vboxsync
Message:

IEM: 0x0f 0xe7 split up.

File:
1 edited

Legend:

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

    r65756 r65757  
    79567956
    79577957
    7958 /** Opcode 0x0f 0xe7. */
    7959 FNIEMOP_DEF(iemOp_movntq_Mq_Pq__movntdq_Mdq_Vdq)
    7960 {
     7958/** Opcode      0x0f 0xe7 - movntq Mq, Pq */
     7959FNIEMOP_DEF(iemOp_movntq_Mq_Pq)
     7960{
     7961    IEMOP_MNEMONIC(movntq_Mq_Pq, "movntq Mq,Pq");
    79617962    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    79627963    if ((bRm & X86_MODRM_MOD_MASK) != (3 << X86_MODRM_MOD_SHIFT))
    79637964    {
    7964         /*
    7965          * Register, memory.
    7966          */
    7967 /** @todo check when the REPNZ/Z bits kick in. Same as lock, probably... */
    7968         switch (pVCpu->iem.s.fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPNZ | IEM_OP_PRF_REPZ))
    7969         {
    7970 
    7971             case IEM_OP_PRF_SIZE_OP: /* SSE */
    7972                 IEMOP_MNEMONIC(movntq_Mq_Pq, "movntq Mq,Pq");
    7973                 IEM_MC_BEGIN(0, 2);
    7974                 IEM_MC_LOCAL(uint128_t,                 uSrc);
    7975                 IEM_MC_LOCAL(RTGCPTR,                   GCPtrEffSrc);
    7976 
    7977                 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    7978                 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    7979                 IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
    7980                 IEM_MC_ACTUALIZE_SSE_STATE_FOR_READ();
    7981 
    7982                 IEM_MC_FETCH_XREG_U128(uSrc, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
    7983                 IEM_MC_STORE_MEM_U128_ALIGN_SSE(pVCpu->iem.s.iEffSeg, GCPtrEffSrc, uSrc);
    7984 
    7985                 IEM_MC_ADVANCE_RIP();
    7986                 IEM_MC_END();
    7987                 break;
    7988 
    7989             case 0: /* MMX */
    7990                 IEMOP_MNEMONIC(movntdq_Mdq_Vdq, "movntdq Mdq,Vdq");
    7991                 IEM_MC_BEGIN(0, 2);
    7992                 IEM_MC_LOCAL(uint64_t,                  uSrc);
    7993                 IEM_MC_LOCAL(RTGCPTR,                   GCPtrEffSrc);
    7994 
    7995                 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    7996                 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    7997                 IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT();
    7998                 IEM_MC_ACTUALIZE_FPU_STATE_FOR_READ();
    7999 
    8000                 IEM_MC_FETCH_MREG_U64(uSrc, (bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK);
    8001                 IEM_MC_STORE_MEM_U64(pVCpu->iem.s.iEffSeg, GCPtrEffSrc, uSrc);
    8002 
    8003                 IEM_MC_ADVANCE_RIP();
    8004                 IEM_MC_END();
    8005                 break;
    8006 
    8007             default:
    8008                 return IEMOP_RAISE_INVALID_OPCODE();
    8009         }
     7965        /* Register, memory. */
     7966        IEM_MC_BEGIN(0, 2);
     7967        IEM_MC_LOCAL(uint64_t,                  uSrc);
     7968        IEM_MC_LOCAL(RTGCPTR,                   GCPtrEffSrc);
     7969
     7970        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     7971        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     7972        IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT();
     7973        IEM_MC_ACTUALIZE_FPU_STATE_FOR_READ();
     7974
     7975        IEM_MC_FETCH_MREG_U64(uSrc, (bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK);
     7976        IEM_MC_STORE_MEM_U64(pVCpu->iem.s.iEffSeg, GCPtrEffSrc, uSrc);
     7977
     7978        IEM_MC_ADVANCE_RIP();
     7979        IEM_MC_END();
     7980        return VINF_SUCCESS;
    80107981    }
    80117982    /* The register, register encoding is invalid. */
    8012     else
    8013         return IEMOP_RAISE_INVALID_OPCODE();
    8014     return VINF_SUCCESS;
    8015 }
     7983    return IEMOP_RAISE_INVALID_OPCODE();
     7984}
     7985
     7986/** Opcode 0x66 0x0f 0xe7 - vmovntdq Mx, Vx */
     7987FNIEMOP_DEF(iemOp_vmovntdq_Mx_Vx)
     7988{
     7989    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     7990    if ((bRm & X86_MODRM_MOD_MASK) != (3 << X86_MODRM_MOD_SHIFT))
     7991    {
     7992        /* Register, memory. */
     7993        IEMOP_MNEMONIC(vmovntdq_Mx_Vx, "vmovntdq Mx,Vx");
     7994        IEM_MC_BEGIN(0, 2);
     7995        IEM_MC_LOCAL(uint128_t,                 uSrc);
     7996        IEM_MC_LOCAL(RTGCPTR,                   GCPtrEffSrc);
     7997
     7998        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     7999        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     8000        IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
     8001        IEM_MC_ACTUALIZE_SSE_STATE_FOR_READ();
     8002
     8003        IEM_MC_FETCH_XREG_U128(uSrc, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     8004        IEM_MC_STORE_MEM_U128_ALIGN_SSE(pVCpu->iem.s.iEffSeg, GCPtrEffSrc, uSrc);
     8005
     8006        IEM_MC_ADVANCE_RIP();
     8007        IEM_MC_END();
     8008        return VINF_SUCCESS;
     8009    }
     8010
     8011    /* The register, register encoding is invalid. */
     8012    return IEMOP_RAISE_INVALID_OPCODE();
     8013}
     8014
     8015/*  Opcode 0xf3 0x0f 0xe7 - invalid */
     8016/*  Opcode 0xf2 0x0f 0xe7 - invalid */
    80168017
    80178018
     
    84458446    /* 0xe5 */  iemOp_pmulhw_Pq_Qq,         iemOp_vpmulhw_Vx_Hx_Wx,     iemOp_InvalidNeedRM,        iemOp_InvalidNeedRM,
    84468447    /* 0xe6 */  iemOp_InvalidNeedRM,        iemOp_vcvttpd2dq_Vx_Wpd,    iemOp_vcvtdq2pd_Vx_Wpd,     iemOp_vcvtpd2dq_Vx_Wpd,
    8447     /* 0xe7 */  iemOp_movntq_Mq_Pq__movntdq_Mdq_Vdq, iemOp_movntq_Mq_Pq__movntdq_Mdq_Vdq, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM,
     8448    /* 0xe7 */  iemOp_movntq_Mq_Pq,         iemOp_vmovntdq_Mx_Vx,       iemOp_InvalidNeedRM,        iemOp_InvalidNeedRM,
    84488449    /* 0xe8 */  iemOp_psubsb_Pq_Qq,         iemOp_vpsubsb_Vx_Hx_W,      iemOp_InvalidNeedRM,        iemOp_InvalidNeedRM,
    84498450    /* 0xe9 */  iemOp_psubsw_Pq_Qq,         iemOp_vpsubsw_Vx_Hx_Wx,     iemOp_InvalidNeedRM,        iemOp_InvalidNeedRM,
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