VirtualBox

Changeset 105276 in vbox


Ignore:
Timestamp:
Jul 11, 2024 5:08:17 PM (5 months ago)
Author:
vboxsync
Message:

VMM/IEM: Implement vpcmpestrm, vpcmpestri, vpcmpistrm, vpcmpistri instruction emulation, bugref:9898

File:
1 edited

Legend:

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

    r105274 r105276  
    18061806
    18071807/** Opcode VEX.66.0F3A 0x60. */
    1808 FNIEMOP_STUB(iemOp_vpcmpestrm_Vdq_Wdq_Ib);
     1808FNIEMOP_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
    18091932/** Opcode VEX.66.0F3A 0x61, */
    1810 FNIEMOP_STUB(iemOp_vpcmpestri_Vdq_Wdq_Ib);
     1933FNIEMOP_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
    18112065/** Opcode VEX.66.0F3A 0x62. */
    1812 FNIEMOP_STUB(iemOp_vpcmpistrm_Vdq_Wdq_Ib);
     2066FNIEMOP_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
    18132128/** Opcode VEX.66.0F3A 0x63*/
    1814 FNIEMOP_STUB(iemOp_vpcmpistri_Vdq_Wdq_Ib);
     2129FNIEMOP_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
    18152199/*  Opcode VEX.66.0F3A 0x64 - invalid */
    18162200/*  Opcode VEX.66.0F3A 0x65 - invalid */
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