Changeset 105276 in vbox
- Timestamp:
- Jul 11, 2024 5:08:17 PM (5 months ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/IEMAllInstVexMap3.cpp.h
r105274 r105276 1806 1806 1807 1807 /** Opcode VEX.66.0F3A 0x60. */ 1808 FNIEMOP_STUB(iemOp_vpcmpestrm_Vdq_Wdq_Ib); 1808 FNIEMOP_DEF(iemOp_vpcmpestrm_Vdq_Wdq_Ib) 1809 { 1810 IEMOP_MNEMONIC3(VEX_RMI, VPCMPESTRM, vpcmpestrm, Vdq, Wdq, Ib, DISOPTYPE_HARMLESS | DISOPTYPE_X86_AVX, 0); 1811 1812 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); 1813 if (pVCpu->iem.s.fPrefixes & IEM_OP_PRF_SIZE_REX_W) 1814 { 1815 if (IEM_IS_MODRM_REG_MODE(bRm)) 1816 { 1817 /* 1818 * Register, register. 1819 */ 1820 uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm); 1821 IEM_MC_BEGIN(IEM_MC_F_64BIT, 0); 1822 IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV_EX(fAvx); 1823 IEM_MC_ARG(PRTUINT128U, puDst, 0); 1824 IEM_MC_ARG(uint32_t *, pEFlags, 1); 1825 IEM_MC_LOCAL(IEMPCMPESTRXSRC, Src); 1826 IEM_MC_ARG_LOCAL_REF(PIEMPCMPESTRXSRC, pSrc, Src, 2); 1827 IEM_MC_ARG_CONST(uint8_t, bImmArg, /*=*/ bImm, 3); 1828 IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT(); 1829 IEM_MC_PREPARE_SSE_USAGE(); 1830 IEM_MC_FETCH_XREG_PAIR_U128_AND_RAX_RDX_U64(Src, IEM_GET_MODRM_REG(pVCpu, bRm), IEM_GET_MODRM_RM(pVCpu, bRm)); 1831 IEM_MC_REF_XREG_U128(puDst, 0 /*xmm0*/); 1832 IEM_MC_REF_EFLAGS(pEFlags); 1833 IEM_MC_CALL_VOID_AIMPL_4(IEM_SELECT_HOST_OR_FALLBACK(fAvx, 1834 iemAImpl_vpcmpestrm_u128, 1835 iemAImpl_vpcmpestrm_u128_fallback), 1836 puDst, pEFlags, pSrc, bImmArg); 1837 IEM_MC_ADVANCE_RIP_AND_FINISH(); 1838 IEM_MC_END(); 1839 } 1840 else 1841 { 1842 /* 1843 * Register, memory. 1844 */ 1845 IEM_MC_BEGIN(IEM_MC_F_64BIT, 0); 1846 IEM_MC_ARG(PRTUINT128U, puDst, 0); 1847 IEM_MC_ARG(uint32_t *, pEFlags, 1); 1848 IEM_MC_LOCAL(IEMPCMPESTRXSRC, Src); 1849 IEM_MC_ARG_LOCAL_REF(PIEMPCMPESTRXSRC, pSrc, Src, 2); 1850 IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc); 1851 1852 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 1); 1853 uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm); 1854 IEM_MC_ARG_CONST(uint8_t, bImmArg, /*=*/ bImm, 3); 1855 IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV_EX(fAvx); 1856 IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT(); 1857 IEM_MC_PREPARE_SSE_USAGE(); 1858 1859 IEM_MC_FETCH_MEM_U128_AND_XREG_U128_AND_RAX_RDX_U64(Src, IEM_GET_MODRM_REG(pVCpu, bRm), 1860 pVCpu->iem.s.iEffSeg, GCPtrEffSrc); 1861 IEM_MC_REF_XREG_U128(puDst, 0 /*xmm0*/); 1862 IEM_MC_REF_EFLAGS(pEFlags); 1863 IEM_MC_CALL_VOID_AIMPL_4(IEM_SELECT_HOST_OR_FALLBACK(fAvx, 1864 iemAImpl_vpcmpestrm_u128, 1865 iemAImpl_vpcmpestrm_u128_fallback), 1866 puDst, pEFlags, pSrc, bImmArg); 1867 IEM_MC_ADVANCE_RIP_AND_FINISH(); 1868 IEM_MC_END(); 1869 } 1870 } 1871 else 1872 { 1873 if (IEM_IS_MODRM_REG_MODE(bRm)) 1874 { 1875 /* 1876 * Register, register. 1877 */ 1878 uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm); 1879 IEM_MC_BEGIN(IEM_MC_F_NOT_286_OR_OLDER, 0); 1880 IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV_EX(fAvx); 1881 IEM_MC_ARG(PRTUINT128U, puDst, 0); 1882 IEM_MC_ARG(uint32_t *, pEFlags, 1); 1883 IEM_MC_LOCAL(IEMPCMPESTRXSRC, Src); 1884 IEM_MC_ARG_LOCAL_REF(PIEMPCMPESTRXSRC, pSrc, Src, 2); 1885 IEM_MC_ARG_CONST(uint8_t, bImmArg, /*=*/ bImm, 3); 1886 IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT(); 1887 IEM_MC_PREPARE_SSE_USAGE(); 1888 IEM_MC_FETCH_XREG_PAIR_U128_AND_EAX_EDX_U32_SX_U64(Src, IEM_GET_MODRM_REG(pVCpu, bRm), IEM_GET_MODRM_RM(pVCpu, bRm)); 1889 IEM_MC_REF_XREG_U128(puDst, 0 /*xmm0*/); 1890 IEM_MC_REF_EFLAGS(pEFlags); 1891 IEM_MC_CALL_VOID_AIMPL_4(IEM_SELECT_HOST_OR_FALLBACK(fSse42, 1892 iemAImpl_vpcmpestrm_u128, 1893 iemAImpl_vpcmpestrm_u128_fallback), 1894 puDst, pEFlags, pSrc, bImmArg); 1895 IEM_MC_ADVANCE_RIP_AND_FINISH(); 1896 IEM_MC_END(); 1897 } 1898 else 1899 { 1900 /* 1901 * Register, memory. 1902 */ 1903 IEM_MC_BEGIN(IEM_MC_F_NOT_286_OR_OLDER, 0); 1904 IEM_MC_ARG(PRTUINT128U, puDst, 0); 1905 IEM_MC_ARG(uint32_t *, pEFlags, 1); 1906 IEM_MC_LOCAL(IEMPCMPESTRXSRC, Src); 1907 IEM_MC_ARG_LOCAL_REF(PIEMPCMPESTRXSRC, pSrc, Src, 2); 1908 IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc); 1909 1910 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 1); 1911 uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm); 1912 IEM_MC_ARG_CONST(uint8_t, bImmArg, /*=*/ bImm, 3); 1913 IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV_EX(fAvx); 1914 IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT(); 1915 IEM_MC_PREPARE_SSE_USAGE(); 1916 1917 IEM_MC_FETCH_MEM_U128_AND_XREG_U128_AND_EAX_EDX_U32_SX_U64(Src, IEM_GET_MODRM_REG(pVCpu, bRm), 1918 pVCpu->iem.s.iEffSeg, GCPtrEffSrc); 1919 IEM_MC_REF_XREG_U128(puDst, 0 /*xmm0*/); 1920 IEM_MC_REF_EFLAGS(pEFlags); 1921 IEM_MC_CALL_VOID_AIMPL_4(IEM_SELECT_HOST_OR_FALLBACK(fAvx, 1922 iemAImpl_vpcmpestrm_u128, 1923 iemAImpl_vpcmpestrm_u128_fallback), 1924 puDst, pEFlags, pSrc, bImmArg); 1925 IEM_MC_ADVANCE_RIP_AND_FINISH(); 1926 IEM_MC_END(); 1927 } 1928 } 1929 } 1930 1931 1809 1932 /** Opcode VEX.66.0F3A 0x61, */ 1810 FNIEMOP_STUB(iemOp_vpcmpestri_Vdq_Wdq_Ib); 1933 FNIEMOP_DEF(iemOp_vpcmpestri_Vdq_Wdq_Ib) 1934 { 1935 IEMOP_MNEMONIC3(VEX_RMI, VPCMPESTRI, vpcmpestri, Vdq, Wdq, Ib, DISOPTYPE_HARMLESS | DISOPTYPE_X86_AVX, 0); 1936 1937 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); 1938 if (pVCpu->iem.s.fPrefixes & IEM_OP_PRF_SIZE_REX_W) 1939 { 1940 if (IEM_IS_MODRM_REG_MODE(bRm)) 1941 { 1942 /* 1943 * Register, register. 1944 */ 1945 uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm); 1946 IEM_MC_BEGIN(IEM_MC_F_64BIT, 0); 1947 IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV_EX(fAvx); 1948 IEM_MC_ARG(uint32_t *, pu32Ecx, 0); 1949 IEM_MC_ARG(uint32_t *, pEFlags, 1); 1950 IEM_MC_LOCAL(IEMPCMPESTRXSRC, Src); 1951 IEM_MC_ARG_LOCAL_REF(PIEMPCMPESTRXSRC, pSrc, Src, 2); 1952 IEM_MC_ARG_CONST(uint8_t, bImmArg, /*=*/ bImm, 3); 1953 IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT(); 1954 IEM_MC_PREPARE_SSE_USAGE(); 1955 IEM_MC_FETCH_XREG_PAIR_U128_AND_RAX_RDX_U64(Src, IEM_GET_MODRM_REG(pVCpu, bRm), IEM_GET_MODRM_RM(pVCpu, bRm)); 1956 IEM_MC_REF_GREG_U32(pu32Ecx, X86_GREG_xCX); 1957 IEM_MC_CLEAR_HIGH_GREG_U64(X86_GREG_xCX); 1958 IEM_MC_REF_EFLAGS(pEFlags); 1959 IEM_MC_CALL_VOID_AIMPL_4(IEM_SELECT_HOST_OR_FALLBACK(fAvx, 1960 iemAImpl_vpcmpestri_u128, 1961 iemAImpl_vpcmpestri_u128_fallback), 1962 pu32Ecx, pEFlags, pSrc, bImmArg); 1963 /** @todo testcase: High dword of RCX cleared? */ 1964 IEM_MC_ADVANCE_RIP_AND_FINISH(); 1965 IEM_MC_END(); 1966 } 1967 else 1968 { 1969 /* 1970 * Register, memory. 1971 */ 1972 IEM_MC_BEGIN(IEM_MC_F_64BIT, 0); 1973 IEM_MC_ARG(uint32_t *, pu32Ecx, 0); 1974 IEM_MC_ARG(uint32_t *, pEFlags, 1); 1975 IEM_MC_LOCAL(IEMPCMPESTRXSRC, Src); 1976 IEM_MC_ARG_LOCAL_REF(PIEMPCMPESTRXSRC, pSrc, Src, 2); 1977 IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc); 1978 1979 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 1); 1980 uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm); 1981 IEM_MC_ARG_CONST(uint8_t, bImmArg, /*=*/ bImm, 3); 1982 IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV_EX(fAvx); 1983 IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT(); 1984 IEM_MC_PREPARE_SSE_USAGE(); 1985 1986 IEM_MC_FETCH_MEM_U128_AND_XREG_U128_AND_RAX_RDX_U64(Src, IEM_GET_MODRM_REG(pVCpu, bRm), 1987 pVCpu->iem.s.iEffSeg, GCPtrEffSrc); 1988 IEM_MC_REF_GREG_U32(pu32Ecx, X86_GREG_xCX); 1989 IEM_MC_CLEAR_HIGH_GREG_U64(X86_GREG_xCX); 1990 IEM_MC_REF_EFLAGS(pEFlags); 1991 IEM_MC_CALL_VOID_AIMPL_4(IEM_SELECT_HOST_OR_FALLBACK(fAvx, 1992 iemAImpl_vpcmpestri_u128, 1993 iemAImpl_vpcmpestri_u128_fallback), 1994 pu32Ecx, pEFlags, pSrc, bImmArg); 1995 /** @todo testcase: High dword of RCX cleared? */ 1996 IEM_MC_ADVANCE_RIP_AND_FINISH(); 1997 IEM_MC_END(); 1998 } 1999 } 2000 else 2001 { 2002 if (IEM_IS_MODRM_REG_MODE(bRm)) 2003 { 2004 /* 2005 * Register, register. 2006 */ 2007 uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm); 2008 IEM_MC_BEGIN(IEM_MC_F_NOT_286_OR_OLDER, 0); 2009 IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV_EX(fAvx); 2010 IEM_MC_ARG(uint32_t *, pu32Ecx, 0); 2011 IEM_MC_ARG(uint32_t *, pEFlags, 1); 2012 IEM_MC_LOCAL(IEMPCMPESTRXSRC, Src); 2013 IEM_MC_ARG_LOCAL_REF(PIEMPCMPESTRXSRC, pSrc, Src, 2); 2014 IEM_MC_ARG_CONST(uint8_t, bImmArg, /*=*/ bImm, 3); 2015 IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT(); 2016 IEM_MC_PREPARE_SSE_USAGE(); 2017 IEM_MC_FETCH_XREG_PAIR_U128_AND_EAX_EDX_U32_SX_U64(Src, IEM_GET_MODRM_REG(pVCpu, bRm), IEM_GET_MODRM_RM(pVCpu, bRm)); 2018 IEM_MC_REF_GREG_U32(pu32Ecx, X86_GREG_xCX); 2019 IEM_MC_CLEAR_HIGH_GREG_U64(X86_GREG_xCX); 2020 IEM_MC_REF_EFLAGS(pEFlags); 2021 IEM_MC_CALL_VOID_AIMPL_4(IEM_SELECT_HOST_OR_FALLBACK(fAvx, 2022 iemAImpl_vpcmpestri_u128, 2023 iemAImpl_vpcmpestri_u128_fallback), 2024 pu32Ecx, pEFlags, pSrc, bImmArg); 2025 /** @todo testcase: High dword of RCX cleared? */ 2026 IEM_MC_ADVANCE_RIP_AND_FINISH(); 2027 IEM_MC_END(); 2028 } 2029 else 2030 { 2031 /* 2032 * Register, memory. 2033 */ 2034 IEM_MC_BEGIN(IEM_MC_F_NOT_286_OR_OLDER, 0); 2035 IEM_MC_ARG(uint32_t *, pu32Ecx, 0); 2036 IEM_MC_ARG(uint32_t *, pEFlags, 1); 2037 IEM_MC_LOCAL(IEMPCMPESTRXSRC, Src); 2038 IEM_MC_ARG_LOCAL_REF(PIEMPCMPESTRXSRC, pSrc, Src, 2); 2039 IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc); 2040 2041 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 1); 2042 uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm); 2043 IEM_MC_ARG_CONST(uint8_t, bImmArg, /*=*/ bImm, 3); 2044 IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV_EX(fAvx); 2045 IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT(); 2046 IEM_MC_PREPARE_SSE_USAGE(); 2047 2048 IEM_MC_FETCH_MEM_U128_AND_XREG_U128_AND_EAX_EDX_U32_SX_U64(Src, IEM_GET_MODRM_REG(pVCpu, bRm), 2049 pVCpu->iem.s.iEffSeg, GCPtrEffSrc); 2050 IEM_MC_REF_GREG_U32(pu32Ecx, X86_GREG_xCX); 2051 IEM_MC_CLEAR_HIGH_GREG_U64(X86_GREG_xCX); 2052 IEM_MC_REF_EFLAGS(pEFlags); 2053 IEM_MC_CALL_VOID_AIMPL_4(IEM_SELECT_HOST_OR_FALLBACK(fAvx, 2054 iemAImpl_vpcmpestri_u128, 2055 iemAImpl_vpcmpestri_u128_fallback), 2056 pu32Ecx, pEFlags, pSrc, bImmArg); 2057 /** @todo testcase: High dword of RCX cleared? */ 2058 IEM_MC_ADVANCE_RIP_AND_FINISH(); 2059 IEM_MC_END(); 2060 } 2061 } 2062 } 2063 2064 1811 2065 /** Opcode VEX.66.0F3A 0x62. */ 1812 FNIEMOP_STUB(iemOp_vpcmpistrm_Vdq_Wdq_Ib); 2066 FNIEMOP_DEF(iemOp_vpcmpistrm_Vdq_Wdq_Ib) 2067 { 2068 IEMOP_MNEMONIC3(VEX_RMI, VPCMPISTRM, vpcmpistrm, Vdq, Wdq, Ib, DISOPTYPE_HARMLESS | DISOPTYPE_X86_AVX, 0); 2069 2070 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); 2071 if (IEM_IS_MODRM_REG_MODE(bRm)) 2072 { 2073 /* 2074 * Register, register. 2075 */ 2076 uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm); 2077 IEM_MC_BEGIN(IEM_MC_F_NOT_286_OR_OLDER, 0); 2078 IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV_EX(fAvx); 2079 IEM_MC_ARG(PRTUINT128U, puDst, 0); 2080 IEM_MC_ARG(uint32_t *, pEFlags, 1); 2081 IEM_MC_LOCAL(IEMPCMPISTRXSRC, Src); 2082 IEM_MC_ARG_LOCAL_REF(PIEMPCMPISTRXSRC, pSrc, Src, 2); 2083 IEM_MC_ARG_CONST(uint8_t, bImmArg, /*=*/ bImm, 3); 2084 IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT(); 2085 IEM_MC_PREPARE_SSE_USAGE(); 2086 IEM_MC_FETCH_XREG_PAIR_U128(Src, IEM_GET_MODRM_REG(pVCpu, bRm), IEM_GET_MODRM_RM(pVCpu, bRm)); 2087 IEM_MC_REF_XREG_U128(puDst, 0 /*xmm0*/); 2088 IEM_MC_REF_EFLAGS(pEFlags); 2089 IEM_MC_CALL_VOID_AIMPL_4(IEM_SELECT_HOST_OR_FALLBACK(fAvx, 2090 iemAImpl_vpcmpistrm_u128, 2091 iemAImpl_vpcmpistrm_u128_fallback), 2092 puDst, pEFlags, pSrc, bImmArg); 2093 IEM_MC_ADVANCE_RIP_AND_FINISH(); 2094 IEM_MC_END(); 2095 } 2096 else 2097 { 2098 /* 2099 * Register, memory. 2100 */ 2101 IEM_MC_BEGIN(IEM_MC_F_NOT_286_OR_OLDER, 0); 2102 IEM_MC_ARG(PRTUINT128U, puDst, 0); 2103 IEM_MC_ARG(uint32_t *, pEFlags, 1); 2104 IEM_MC_LOCAL(IEMPCMPISTRXSRC, Src); 2105 IEM_MC_ARG_LOCAL_REF(PIEMPCMPISTRXSRC, pSrc, Src, 2); 2106 IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc); 2107 2108 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 1); 2109 uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm); 2110 IEM_MC_ARG_CONST(uint8_t, bImmArg, /*=*/ bImm, 3); 2111 IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV_EX(fAvx); 2112 IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT(); 2113 IEM_MC_PREPARE_SSE_USAGE(); 2114 2115 IEM_MC_FETCH_MEM_U128_AND_XREG_U128(Src, IEM_GET_MODRM_REG(pVCpu, bRm), pVCpu->iem.s.iEffSeg, GCPtrEffSrc); 2116 IEM_MC_REF_XREG_U128(puDst, 0 /*xmm0*/); 2117 IEM_MC_REF_EFLAGS(pEFlags); 2118 IEM_MC_CALL_VOID_AIMPL_4(IEM_SELECT_HOST_OR_FALLBACK(fAvx, 2119 iemAImpl_vpcmpistrm_u128, 2120 iemAImpl_vpcmpistrm_u128_fallback), 2121 puDst, pEFlags, pSrc, bImmArg); 2122 IEM_MC_ADVANCE_RIP_AND_FINISH(); 2123 IEM_MC_END(); 2124 } 2125 } 2126 2127 1813 2128 /** Opcode VEX.66.0F3A 0x63*/ 1814 FNIEMOP_STUB(iemOp_vpcmpistri_Vdq_Wdq_Ib); 2129 FNIEMOP_DEF(iemOp_vpcmpistri_Vdq_Wdq_Ib) 2130 { 2131 IEMOP_MNEMONIC3(VEX_RMI, VPCMPISTRI, vpcmpistri, Vdq, Wdq, Ib, DISOPTYPE_HARMLESS | DISOPTYPE_X86_AVX, 0); 2132 2133 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); 2134 if (IEM_IS_MODRM_REG_MODE(bRm)) 2135 { 2136 /* 2137 * Register, register. 2138 */ 2139 uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm); 2140 IEM_MC_BEGIN(IEM_MC_F_NOT_286_OR_OLDER, 0); 2141 IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV_EX(fAvx); 2142 IEM_MC_ARG(uint32_t *, pEFlags, 0); 2143 IEM_MC_ARG(PCRTUINT128U, pSrc1, 1); 2144 IEM_MC_ARG(PCRTUINT128U, pSrc2, 2); 2145 IEM_MC_ARG_CONST(uint8_t, bImmArg, /*=*/ bImm, 3); 2146 IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT(); 2147 IEM_MC_PREPARE_SSE_USAGE(); 2148 IEM_MC_REF_XREG_U128_CONST(pSrc1, IEM_GET_MODRM_REG(pVCpu, bRm)); 2149 IEM_MC_REF_XREG_U128_CONST(pSrc2, IEM_GET_MODRM_RM(pVCpu, bRm)); 2150 IEM_MC_REF_EFLAGS(pEFlags); 2151 IEM_MC_CALL_AIMPL_4(uint32_t, u32Ecx, 2152 IEM_SELECT_HOST_OR_FALLBACK(fAvx, 2153 iemAImpl_vpcmpistri_u128, 2154 iemAImpl_vpcmpistri_u128_fallback), 2155 pEFlags, pSrc1, pSrc2, bImmArg); 2156 /** @todo testcase: High dword of RCX cleared? */ 2157 IEM_MC_STORE_GREG_U32(X86_GREG_xCX, u32Ecx); 2158 IEM_MC_CLEAR_HIGH_GREG_U64(X86_GREG_xCX); 2159 2160 IEM_MC_ADVANCE_RIP_AND_FINISH(); 2161 IEM_MC_END(); 2162 } 2163 else 2164 { 2165 /* 2166 * Register, memory. 2167 */ 2168 IEM_MC_BEGIN(IEM_MC_F_NOT_286_OR_OLDER, 0); 2169 IEM_MC_ARG(uint32_t *, pEFlags, 0); 2170 IEM_MC_ARG(PCRTUINT128U, pSrc1, 1); 2171 IEM_MC_LOCAL(RTUINT128U, Src2); 2172 IEM_MC_ARG_LOCAL_REF(PCRTUINT128U, pSrc2, Src2, 2); 2173 IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc); 2174 2175 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 1); 2176 uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm); 2177 IEM_MC_ARG_CONST(uint8_t, bImmArg, /*=*/ bImm, 3); 2178 IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV_EX(fAvx); 2179 IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT(); 2180 IEM_MC_PREPARE_SSE_USAGE(); 2181 2182 IEM_MC_FETCH_MEM_U128(Src2, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); 2183 IEM_MC_REF_XREG_U128_CONST(pSrc1, IEM_GET_MODRM_REG(pVCpu, bRm)); 2184 IEM_MC_REF_EFLAGS(pEFlags); 2185 IEM_MC_CALL_AIMPL_4(uint32_t, u32Ecx, 2186 IEM_SELECT_HOST_OR_FALLBACK(fAvx, 2187 iemAImpl_vpcmpistri_u128, 2188 iemAImpl_vpcmpistri_u128_fallback), 2189 pEFlags, pSrc1, pSrc2, bImmArg); 2190 /** @todo testcase: High dword of RCX cleared? */ 2191 IEM_MC_STORE_GREG_U32(X86_GREG_xCX, u32Ecx); 2192 IEM_MC_CLEAR_HIGH_GREG_U64(X86_GREG_xCX); 2193 IEM_MC_ADVANCE_RIP_AND_FINISH(); 2194 IEM_MC_END(); 2195 } 2196 } 2197 2198 1815 2199 /* Opcode VEX.66.0F3A 0x64 - invalid */ 1816 2200 /* Opcode VEX.66.0F3A 0x65 - invalid */
Note:
See TracChangeset
for help on using the changeset viewer.