Changeset 60991 in vbox for trunk/src/VBox/VMM
- Timestamp:
- May 16, 2016 7:26:51 PM (9 years ago)
- svn:sync-xref-src-repo-rev:
- 107235
- Location:
- trunk/src/VBox/VMM/VMMAll
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/IEMAll.cpp
r60912 r60991 8623 8623 return iemRaiseDeviceNotAvailable(pIemCpu); \ 8624 8624 } 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) 8625 8634 #define IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT() \ 8626 8635 do { \ … … 8841 8850 #define IEM_MC_REF_XREG_U64_CONST(a_pu64Dst, a_iXReg) \ 8842 8851 (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) 8843 8855 8844 8856 #define IEM_MC_FETCH_MEM_U8(a_u8Dst, a_iSeg, a_GCPtrMem) \ -
trunk/src/VBox/VMM/VMMAll/IEMAllInstructions.cpp.h
r60961 r60991 1695 1695 1696 1696 /** Opcode 0x0f 0x28. */ 1697 FNIEMOP_STUB(iemOp_movaps_Vps_Wps__movapd_Vpd_Wpd); // NEXT - win2k 1697 FNIEMOP_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 1698 1743 /** Opcode 0x0f 0x29. */ 1699 FNIEMOP_STUB(iemOp_movaps_Wps_Vps__movapd_Wpd_Vpd); // NEXT - win2k 1744 FNIEMOP_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 1700 1790 /** Opcode 0x0f 0x2a. */ 1701 1791 FNIEMOP_STUB(iemOp_cvtpi2ps_Vps_Qpi__cvtpi2pd_Vpd_Qpi__cvtsi2ss_Vss_Ey__cvtsi2sd_Vsd_Ey); //NEXT 1792 1793 1702 1794 /** Opcode 0x0f 0x2b. */ 1703 FNIEMOP_STUB(iemOp_movntps_Mps_Vps__movntpd_Mpd_Vpd); //NEXT:XP 1795 FNIEMOP_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 1704 1828 /** Opcode 0x0f 0x2c. */ 1705 1829 FNIEMOP_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.