VirtualBox

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


Ignore:
Timestamp:
May 16, 2016 7:26:51 PM (9 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
107235
Message:

IEM: Implemented movntps/d and movaps/d. (lacks proper testcase)

Location:
trunk/src/VBox/VMM/VMMAll
Files:
2 edited

Legend:

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

    r60912 r60991  
    86238623            return iemRaiseDeviceNotAvailable(pIemCpu); \
    86248624    } while (0)
     8625#define IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT() \
     8626    do { \
     8627        if (   (pIemCpu->CTX_SUFF(pCtx)->cr0 & X86_CR0_EM) \
     8628            || !(pIemCpu->CTX_SUFF(pCtx)->cr4 & X86_CR4_OSFXSR) \
     8629            || !IEM_GET_GUEST_CPU_FEATURES(pIemCpu)->fSse) \
     8630            return iemRaiseUndefinedOpcode(pIemCpu); \
     8631        if (pIemCpu->CTX_SUFF(pCtx)->cr0 & X86_CR0_TS) \
     8632            return iemRaiseDeviceNotAvailable(pIemCpu); \
     8633    } while (0)
    86258634#define IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT() \
    86268635    do { \
     
    88418850#define IEM_MC_REF_XREG_U64_CONST(a_pu64Dst, a_iXReg) \
    88428851    (a_pu64Dst) = ((uint64_t const *)&pIemCpu->CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].au64[0])
     8852#define IEM_MC_COPY_XREG_U128(a_iXRegDst, a_iXRegSrc) \
     8853    do { pIemCpu->CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87.aXMM[(a_iXRegDst)].xmm \
     8854            = pIemCpu->CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87.aXMM[(a_iXRegSrc)].xmm; } while (0)
    88438855
    88448856#define IEM_MC_FETCH_MEM_U8(a_u8Dst, a_iSeg, a_GCPtrMem) \
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructions.cpp.h

    r60961 r60991  
    16951695
    16961696/** Opcode 0x0f 0x28. */
    1697 FNIEMOP_STUB(iemOp_movaps_Vps_Wps__movapd_Vpd_Wpd); // NEXT - win2k
     1697FNIEMOP_DEF(iemOp_movaps_Vps_Wps__movapd_Vpd_Wpd)
     1698{
     1699    IEMOP_MNEMONIC(!(pIemCpu->fPrefixes & IEM_OP_PRF_SIZE_OP) ? "movaps r,mr" : "movapd r,mr");
     1700    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     1701    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
     1702    {
     1703        /*
     1704         * Register, register.
     1705         */
     1706        IEMOP_HLP_DONE_DECODING_NO_LOCK_REPZ_OR_REPNZ_PREFIXES();
     1707        IEM_MC_BEGIN(0, 0);
     1708        if (!(pIemCpu->fPrefixes & IEM_OP_PRF_SIZE_OP))
     1709            IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
     1710        else
     1711            IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
     1712        IEM_MC_COPY_XREG_U128(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg,
     1713                              (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     1714        IEM_MC_ADVANCE_RIP();
     1715        IEM_MC_END();
     1716    }
     1717    else
     1718    {
     1719        /*
     1720         * Register, memory.
     1721         */
     1722        IEM_MC_BEGIN(0, 2);
     1723        IEM_MC_LOCAL(uint128_t,                 uSrc); /** @todo optimize this one day... */
     1724        IEM_MC_LOCAL(RTGCPTR,                   GCPtrEffSrc);
     1725
     1726        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     1727        IEMOP_HLP_DONE_DECODING_NO_LOCK_REPZ_OR_REPNZ_PREFIXES(); /** @todo check if this is delayed this long for REPZ/NZ */
     1728        if (!(pIemCpu->fPrefixes & IEM_OP_PRF_SIZE_OP))
     1729            IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
     1730        else
     1731            IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
     1732
     1733        IEM_MC_FETCH_MEM_U128_ALIGN_SSE(uSrc, pIemCpu->iEffSeg, GCPtrEffSrc);
     1734        IEM_MC_STORE_XREG_U128(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, uSrc);
     1735
     1736        IEM_MC_ADVANCE_RIP();
     1737        IEM_MC_END();
     1738    }
     1739    return VINF_SUCCESS;
     1740}
     1741
     1742
    16981743/** Opcode 0x0f 0x29. */
    1699 FNIEMOP_STUB(iemOp_movaps_Wps_Vps__movapd_Wpd_Vpd); // NEXT - win2k
     1744FNIEMOP_DEF(iemOp_movaps_Wps_Vps__movapd_Wpd_Vpd)
     1745{
     1746    IEMOP_MNEMONIC(!(pIemCpu->fPrefixes & IEM_OP_PRF_SIZE_OP) ? "movaps mr,r" : "movapd mr,r");
     1747    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     1748    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
     1749    {
     1750        /*
     1751         * Register, register.
     1752         */
     1753        IEMOP_HLP_DONE_DECODING_NO_LOCK_REPZ_OR_REPNZ_PREFIXES();
     1754        IEM_MC_BEGIN(0, 0);
     1755        if (!(pIemCpu->fPrefixes & IEM_OP_PRF_SIZE_OP))
     1756            IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
     1757        else
     1758            IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
     1759        IEM_MC_COPY_XREG_U128((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB,
     1760                              ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
     1761        IEM_MC_ADVANCE_RIP();
     1762        IEM_MC_END();
     1763    }
     1764    else
     1765    {
     1766        /*
     1767         * Memory, register.
     1768         */
     1769        IEM_MC_BEGIN(0, 2);
     1770        IEM_MC_LOCAL(uint128_t,                 uSrc); /** @todo optimize this one day... */
     1771        IEM_MC_LOCAL(RTGCPTR,                   GCPtrEffSrc);
     1772
     1773        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     1774        IEMOP_HLP_DONE_DECODING_NO_LOCK_REPZ_OR_REPNZ_PREFIXES(); /** @todo check if this is delayed this long for REPZ/NZ */
     1775        if (!(pIemCpu->fPrefixes & IEM_OP_PRF_SIZE_OP))
     1776            IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
     1777        else
     1778            IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
     1779
     1780        IEM_MC_FETCH_XREG_U128(uSrc, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
     1781        IEM_MC_STORE_MEM_U128_ALIGN_SSE(pIemCpu->iEffSeg, GCPtrEffSrc, uSrc);
     1782
     1783        IEM_MC_ADVANCE_RIP();
     1784        IEM_MC_END();
     1785    }
     1786    return VINF_SUCCESS;
     1787}
     1788
     1789
    17001790/** Opcode 0x0f 0x2a. */
    17011791FNIEMOP_STUB(iemOp_cvtpi2ps_Vps_Qpi__cvtpi2pd_Vpd_Qpi__cvtsi2ss_Vss_Ey__cvtsi2sd_Vsd_Ey); //NEXT
     1792
     1793
    17021794/** Opcode 0x0f 0x2b. */
    1703 FNIEMOP_STUB(iemOp_movntps_Mps_Vps__movntpd_Mpd_Vpd); //NEXT:XP
     1795FNIEMOP_DEF(iemOp_movntps_Mps_Vps__movntpd_Mpd_Vpd)
     1796{
     1797    IEMOP_MNEMONIC(!(pIemCpu->fPrefixes & IEM_OP_PRF_SIZE_OP) ? "movntps mr,r" : "movntpd mr,r");
     1798    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     1799    if ((bRm & X86_MODRM_MOD_MASK) != (3 << X86_MODRM_MOD_SHIFT))
     1800    {
     1801        /*
     1802         * Register, memory.
     1803         */
     1804        IEM_MC_BEGIN(0, 2);
     1805        IEM_MC_LOCAL(uint128_t,                 uSrc); /** @todo optimize this one day... */
     1806        IEM_MC_LOCAL(RTGCPTR,                   GCPtrEffSrc);
     1807
     1808        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     1809        IEMOP_HLP_DONE_DECODING_NO_LOCK_REPZ_OR_REPNZ_PREFIXES(); /** @todo check if this is delayed this long for REPZ/NZ */
     1810        if (!(pIemCpu->fPrefixes & IEM_OP_PRF_SIZE_OP))
     1811            IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
     1812        else
     1813            IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
     1814
     1815        IEM_MC_FETCH_MEM_U128_ALIGN_SSE(uSrc, pIemCpu->iEffSeg, GCPtrEffSrc);
     1816        IEM_MC_STORE_XREG_U128(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, uSrc);
     1817
     1818        IEM_MC_ADVANCE_RIP();
     1819        IEM_MC_END();
     1820    }
     1821    /* The register, register encoding is invalid. */
     1822    else
     1823        return IEMOP_RAISE_INVALID_OPCODE();
     1824    return VINF_SUCCESS;
     1825}
     1826
     1827
    17041828/** Opcode 0x0f 0x2c. */
    17051829FNIEMOP_STUB(iemOp_cvttps2pi_Ppi_Wps__cvttpd2pi_Ppi_Wpd__cvttss2si_Gy_Wss__cvttsd2si_Yu_Wsd); //NEXT
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