/[qemu]/qemu/tests/test-i386.c
ViewVC logotype

Diff of /qemu/tests/test-i386.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.41 by bellard, Mon Jan 3 23:25:56 2005 UTC revision 1.42 by bellard, Sat Jan 8 18:54:41 2005 UTC
# Line 35  Line 35 
35  #define TEST_VM86  #define TEST_VM86
36  //#define LINUX_VM86_IOPL_FIX  //#define LINUX_VM86_IOPL_FIX
37  //#define TEST_P4_FLAGS  //#define TEST_P4_FLAGS
38    //#define TEST_SSE
39    
40  #define xglue(x, y) x ## y  #define xglue(x, y) x ## y
41  #define glue(x, y) xglue(x, y)  #define glue(x, y) xglue(x, y)
# Line 647  void test_fbcd(double a) Line 648  void test_fbcd(double a)
648      memset((env), 0xaa, sizeof(*(env)));\      memset((env), 0xaa, sizeof(*(env)));\
649      for(i=0;i<5;i++)\      for(i=0;i<5;i++)\
650          asm volatile ("fldl %0" : : "m" (dtab[i]));\          asm volatile ("fldl %0" : : "m" (dtab[i]));\
651      asm(save " %0\n" : : "m" (*(env)));\      asm volatile (save " %0\n" : : "m" (*(env)));\
652      asm(restore " %0\n": : "m" (*(env)));\      asm volatile (restore " %0\n": : "m" (*(env)));\
653      for(i=0;i<5;i++)\      for(i=0;i<5;i++)\
654          asm volatile ("fstpl %0" : "=m" (rtab[i]));\          asm volatile ("fstpl %0" : "=m" (rtab[i]));\
655      for(i=0;i<5;i++)\      for(i=0;i<5;i++)\
# Line 1674  static void test_enter(void) Line 1675  static void test_enter(void)
1675      TEST_ENTER("w", uint16_t, 31);      TEST_ENTER("w", uint16_t, 31);
1676  }  }
1677    
1678    #ifdef TEST_SSE
1679    
1680    typedef int __m64 __attribute__ ((__mode__ (__V2SI__)));
1681    typedef int __m128 __attribute__ ((__mode__(__V4SF__)));
1682    
1683    typedef union {
1684        double d[2];
1685        float s[4];
1686        uint32_t l[4];
1687        uint64_t q[2];
1688        __m128 dq;
1689    } XMMReg;
1690    
1691    static uint64_t __attribute__((aligned(16))) test_values[4][2] = {
1692        { 0x456723c698694873, 0xdc515cff944a58ec },
1693        { 0x1f297ccd58bad7ab, 0x41f21efba9e3e146 },
1694        { 0x007c62c2085427f8, 0x231be9e8cde7438d },
1695        { 0x0f76255a085427f8, 0xc233e9e8c4c9439a },
1696    };
1697    
1698    #define SSE_OP(op)\
1699    {\
1700        asm volatile (#op " %2, %0" : "=x" (r.dq) : "0" (a.dq), "x" (b.dq));\
1701        printf("%-9s: a=%016llx%016llx b=%016llx%016llx r=%016llx%016llx\n",\
1702               #op,\
1703               a.q[1], a.q[0],\
1704               b.q[1], b.q[0],\
1705               r.q[1], r.q[0]);\
1706    }
1707    
1708    #define SSE_OP2(op)\
1709    {\
1710        int i;\
1711        for(i=0;i<2;i++) {\
1712        a.q[0] = test_values[2*i][0];\
1713        a.q[1] = test_values[2*i][1];\
1714        b.q[0] = test_values[2*i+1][0];\
1715        b.q[1] = test_values[2*i+1][1];\
1716        SSE_OP(op);\
1717        }\
1718    }
1719    
1720    #define MMX_OP2(op)\
1721    {\
1722        int i;\
1723        for(i=0;i<2;i++) {\
1724        a.q[0] = test_values[2*i][0];\
1725        b.q[0] = test_values[2*i+1][0];\
1726        asm volatile (#op " %2, %0" : "=y" (r.q[0]) : "0" (a.q[0]), "y" (b.q[0]));\
1727        printf("%-9s: a=%016llx b=%016llx r=%016llx\n",\
1728               #op,\
1729               a.q[0],\
1730               b.q[0],\
1731               r.q[0]);\
1732        }\
1733        SSE_OP2(op);\
1734    }
1735    
1736    #define PSHUF_OP(op, ib)\
1737    {\
1738        int i;\
1739        for(i=0;i<2;i++) {\
1740        a.q[0] = test_values[2*i][0];\
1741        a.q[1] = test_values[2*i][1];\
1742        asm volatile (#op " $" #ib ", %1, %0" : "=x" (r.dq) : "x" (a.dq));\
1743        printf("%-9s: a=%016llx%016llx ib=%02x r=%016llx%016llx\n",\
1744               #op,\
1745               a.q[1], a.q[0],\
1746               ib,\
1747               r.q[1], r.q[0]);\
1748        }\
1749    }
1750    
1751    #define SHIFT_IM(op, ib)\
1752    {\
1753        int i;\
1754        for(i=0;i<2;i++) {\
1755        a.q[0] = test_values[2*i][0];\
1756        a.q[1] = test_values[2*i][1];\
1757        asm volatile (#op " $" #ib ", %0" : "=x" (r.dq) : "0" (a.dq));\
1758        printf("%-9s: a=%016llx%016llx ib=%02x r=%016llx%016llx\n",\
1759               #op,\
1760               a.q[1], a.q[0],\
1761               ib,\
1762               r.q[1], r.q[0]);\
1763        }\
1764    }
1765    
1766    #define SHIFT_OP(op, ib)\
1767    {\
1768        int i;\
1769        SHIFT_IM(op, ib);\
1770        for(i=0;i<2;i++) {\
1771        a.q[0] = test_values[2*i][0];\
1772        a.q[1] = test_values[2*i][1];\
1773        b.q[0] = ib;\
1774        b.q[1] = 0;\
1775        asm volatile (#op " %2, %0" : "=x" (r.dq) : "0" (a.dq), "x" (b.dq));\
1776        printf("%-9s: a=%016llx%016llx b=%016llx%016llx r=%016llx%016llx\n",\
1777               #op,\
1778               a.q[1], a.q[0],\
1779               b.q[1], b.q[0],\
1780               r.q[1], r.q[0]);\
1781        }\
1782    }
1783    
1784    #define MOVMSK(op)\
1785    {\
1786        int i, reg;\
1787        for(i=0;i<2;i++) {\
1788        a.q[0] = test_values[2*i][0];\
1789        a.q[1] = test_values[2*i][1];\
1790        asm volatile (#op " %1, %0" : "=r" (reg) : "x" (a.dq));\
1791        printf("%-9s: a=%016llx%016llx r=%08x\n",\
1792               #op,\
1793               a.q[1], a.q[0],\
1794               reg);\
1795        }\
1796    }
1797    
1798    #define SSE_OPS(a) \
1799    SSE_OP(a ## ps);\
1800    SSE_OP(a ## ss);
1801    
1802    #define SSE_OPD(a) \
1803    SSE_OP(a ## pd);\
1804    SSE_OP(a ## sd);
1805    
1806    #define SSE_COMI(op, field)\
1807    {\
1808        unsigned int eflags;\
1809        XMMReg a, b;\
1810        a.field[0] = a1;\
1811        b.field[0] = b1;\
1812        asm volatile (#op " %2, %1\n"\
1813            "pushf\n"\
1814            "pop %0\n"\
1815            : "=m" (eflags)\
1816            : "x" (a.dq), "x" (b.dq));\
1817        printf("%-9s: a=%f b=%f cc=%04x\n",\
1818               #op, a1, b1,\
1819               eflags & (CC_C | CC_P | CC_Z | CC_S | CC_O | CC_A));\
1820    }
1821    
1822    void test_sse_comi(double a1, double b1)
1823    {
1824        SSE_COMI(ucomiss, s);
1825        SSE_COMI(ucomisd, d);
1826        SSE_COMI(comiss, s);
1827        SSE_COMI(comisd, d);
1828    }
1829    
1830    #define CVT_OP_XMM(op)\
1831    {\
1832        asm volatile (#op " %1, %0" : "=x" (r.dq) : "x" (a.dq));\
1833        printf("%-9s: a=%016llx%016llx r=%016llx%016llx\n",\
1834               #op,\
1835               a.q[1], a.q[0],\
1836               r.q[1], r.q[0]);\
1837    }
1838    
1839    #define CVT_OP_XMM2MMX(op)\
1840    {\
1841        asm volatile (#op " %1, %0" : "=y" (r.q[0]) : "x" (a.dq));\
1842        printf("%-9s: a=%016llx%016llx r=%016llx\n",\
1843               #op,\
1844               a.q[1], a.q[0],\
1845               r.q[0]);\
1846    }
1847    
1848    #define CVT_OP_MMX2XMM(op)\
1849    {\
1850        asm volatile (#op " %1, %0" : "=x" (r.dq) : "y" (a.q[0]));\
1851        printf("%-9s: a=%016llx r=%016llx%016llx\n",\
1852               #op,\
1853               a.q[0],\
1854               r.q[1], r.q[0]);\
1855    }
1856    
1857    #define CVT_OP_REG2XMM(op)\
1858    {\
1859        asm volatile (#op " %1, %0" : "=x" (r.dq) : "r" (a.l[0]));\
1860        printf("%-9s: a=%08x r=%016llx%016llx\n",\
1861               #op,\
1862               a.l[0],\
1863               r.q[1], r.q[0]);\
1864    }
1865    
1866    #define CVT_OP_XMM2REG(op)\
1867    {\
1868        asm volatile (#op " %1, %0" : "=r" (r.l[0]) : "x" (a.dq));\
1869        printf("%-9s: a=%016llx%016llx r=%08x\n",\
1870               #op,\
1871               a.q[1], a.q[0],\
1872               r.l[0]);\
1873    }
1874    
1875    void test_sse(void)
1876    {
1877        XMMReg r, a, b;
1878    
1879        MMX_OP2(punpcklbw);
1880        MMX_OP2(punpcklwd);
1881        MMX_OP2(punpckldq);
1882        MMX_OP2(packsswb);
1883        MMX_OP2(pcmpgtb);
1884        MMX_OP2(pcmpgtw);
1885        MMX_OP2(pcmpgtd);
1886        MMX_OP2(packuswb);
1887        MMX_OP2(punpckhbw);
1888        MMX_OP2(punpckhwd);
1889        MMX_OP2(punpckhdq);
1890        MMX_OP2(packssdw);
1891        MMX_OP2(pcmpeqb);
1892        MMX_OP2(pcmpeqw);
1893        MMX_OP2(pcmpeqd);
1894    
1895        MMX_OP2(paddq);
1896        MMX_OP2(pmullw);
1897        MMX_OP2(psubusb);
1898        MMX_OP2(psubusw);
1899        MMX_OP2(pminub);
1900        MMX_OP2(pand);
1901        MMX_OP2(paddusb);
1902        MMX_OP2(paddusw);
1903        MMX_OP2(pmaxub);
1904        MMX_OP2(pandn);
1905    
1906        MMX_OP2(pmulhuw);
1907        MMX_OP2(pmulhw);
1908        
1909        MMX_OP2(psubsb);
1910        MMX_OP2(psubsw);
1911        MMX_OP2(pminsw);
1912        MMX_OP2(por);
1913        MMX_OP2(paddsb);
1914        MMX_OP2(paddsw);
1915        MMX_OP2(pmaxsw);
1916        MMX_OP2(pxor);
1917        MMX_OP2(pmuludq);
1918        MMX_OP2(pmaddwd);
1919        MMX_OP2(psadbw);
1920        MMX_OP2(psubb);
1921        MMX_OP2(psubw);
1922        MMX_OP2(psubd);
1923        MMX_OP2(psubq);
1924        MMX_OP2(paddb);
1925        MMX_OP2(paddw);
1926        MMX_OP2(paddd);
1927    
1928        MMX_OP2(pavgb);
1929        MMX_OP2(pavgw);
1930    
1931        asm volatile ("pinsrw $1, %1, %0" : "=y" (r.q[0]) : "r" (0x12345678));
1932        printf("%-9s: r=%016llx\n", "pinsrw", r.q[0]);
1933    
1934        asm volatile ("pinsrw $5, %1, %0" : "=x" (r.dq) : "r" (0x12345678));
1935        printf("%-9s: r=%016llx%016llx\n", "pinsrw", r.q[1], r.q[0]);
1936    
1937        a.q[0] = test_values[0][0];
1938        a.q[1] = test_values[0][1];
1939        asm volatile ("pextrw $1, %1, %0" : "=r" (r.l[0]) : "y" (a.q[0]));
1940        printf("%-9s: r=%08x\n", "pextrw", r.l[0]);
1941    
1942        asm volatile ("pextrw $5, %1, %0" : "=r" (r.l[0]) : "x" (a.dq));
1943        printf("%-9s: r=%08x\n", "pextrw", r.l[0]);
1944    
1945        asm volatile ("pmovmskb %1, %0" : "=r" (r.l[0]) : "y" (a.q[0]));
1946        printf("%-9s: r=%08x\n", "pmovmskb", r.l[0]);
1947        
1948        asm volatile ("pmovmskb %1, %0" : "=r" (r.l[0]) : "x" (a.dq));
1949        printf("%-9s: r=%08x\n", "pmovmskb", r.l[0]);
1950    
1951        asm volatile ("emms");
1952    
1953        SSE_OP2(punpcklqdq);
1954        SSE_OP2(punpckhqdq);
1955        SSE_OP2(andps);
1956        SSE_OP2(andpd);
1957        SSE_OP2(andnps);
1958        SSE_OP2(andnpd);
1959        SSE_OP2(orps);
1960        SSE_OP2(orpd);
1961        SSE_OP2(xorps);
1962        SSE_OP2(xorpd);
1963    
1964        SSE_OP2(unpcklps);
1965        SSE_OP2(unpcklpd);
1966        SSE_OP2(unpckhps);
1967        SSE_OP2(unpckhpd);
1968    
1969        PSHUF_OP(shufps, 0x78);
1970        PSHUF_OP(shufpd, 0x02);
1971    
1972        PSHUF_OP(pshufd, 0x78);
1973        PSHUF_OP(pshuflw, 0x78);
1974        PSHUF_OP(pshufhw, 0x78);
1975    
1976        SHIFT_OP(psrlw, 7);
1977        SHIFT_OP(psrlw, 16);
1978        SHIFT_OP(psraw, 7);
1979        SHIFT_OP(psraw, 16);
1980        SHIFT_OP(psllw, 7);
1981        SHIFT_OP(psllw, 16);
1982    
1983        SHIFT_OP(psrld, 7);
1984        SHIFT_OP(psrld, 32);
1985        SHIFT_OP(psrad, 7);
1986        SHIFT_OP(psrad, 32);
1987        SHIFT_OP(pslld, 7);
1988        SHIFT_OP(pslld, 32);
1989    
1990        SHIFT_OP(psrlq, 7);
1991        SHIFT_OP(psrlq, 32);
1992        SHIFT_OP(psllq, 7);
1993        SHIFT_OP(psllq, 32);
1994    
1995        SHIFT_IM(psrldq, 16);
1996        SHIFT_IM(psrldq, 7);
1997        SHIFT_IM(pslldq, 16);
1998        SHIFT_IM(pslldq, 7);
1999    
2000        MOVMSK(movmskps);
2001        MOVMSK(movmskpd);
2002    
2003        /* FPU specific ops */
2004    
2005        {
2006            uint32_t mxcsr;
2007            asm volatile("stmxcsr %0" : "=m" (mxcsr));
2008            printf("mxcsr=%08x\n", mxcsr & 0x1f80);
2009            asm volatile("ldmxcsr %0" : : "m" (mxcsr));
2010        }
2011    
2012        test_sse_comi(2, -1);
2013        test_sse_comi(2, 2);
2014        test_sse_comi(2, 3);
2015    
2016        a.s[0] = 2.7;
2017        a.s[1] = 3.4;
2018        a.s[2] = 4;
2019        a.s[3] = -6.3;
2020        b.s[0] = 45.7;
2021        b.s[1] = 353.4;
2022        b.s[2] = 4;
2023        b.s[3] = 56.3;
2024        SSE_OPS(add);
2025        SSE_OPS(mul);
2026        SSE_OPS(sub);
2027        SSE_OPS(min);
2028        SSE_OPS(div);
2029        SSE_OPS(max);
2030        SSE_OPS(sqrt);
2031        SSE_OPS(cmpeq);
2032        SSE_OPS(cmplt);
2033        SSE_OPS(cmple);
2034        SSE_OPS(cmpunord);
2035        SSE_OPS(cmpneq);
2036        SSE_OPS(cmpnlt);
2037        SSE_OPS(cmpnle);
2038        SSE_OPS(cmpord);
2039    
2040        a.d[0] = 2.7;
2041        a.d[1] = -3.4;
2042        b.d[0] = 45.7;
2043        b.d[1] = -53.4;
2044        SSE_OPD(add);
2045        SSE_OPD(mul);
2046        SSE_OPD(sub);
2047        SSE_OPD(min);
2048        SSE_OPD(div);
2049        SSE_OPD(max);
2050        SSE_OPD(sqrt);
2051        SSE_OPD(cmpeq);
2052        SSE_OPD(cmplt);
2053        SSE_OPD(cmple);
2054        SSE_OPD(cmpunord);
2055        SSE_OPD(cmpneq);
2056        SSE_OPD(cmpnlt);
2057        SSE_OPD(cmpnle);
2058        SSE_OPD(cmpord);
2059        
2060        /* float to float/int */
2061        a.s[0] = 2.7;
2062        a.s[1] = 3.4;
2063        a.s[2] = 4;
2064        a.s[3] = -6.3;
2065        CVT_OP_XMM(cvtps2pd);
2066        CVT_OP_XMM(cvtss2sd);
2067        CVT_OP_XMM2MMX(cvtps2pi);
2068        CVT_OP_XMM2MMX(cvttps2pi);
2069        CVT_OP_XMM2REG(cvtss2si);
2070        CVT_OP_XMM2REG(cvttss2si);
2071        CVT_OP_XMM(cvtps2dq);
2072        CVT_OP_XMM(cvttps2dq);
2073    
2074        a.d[0] = 2.6;
2075        a.d[1] = -3.4;
2076        CVT_OP_XMM(cvtpd2ps);
2077        CVT_OP_XMM(cvtsd2ss);
2078        CVT_OP_XMM2MMX(cvtpd2pi);
2079        CVT_OP_XMM2MMX(cvttpd2pi);
2080        CVT_OP_XMM2REG(cvtsd2si);
2081        CVT_OP_XMM2REG(cvttsd2si);
2082        CVT_OP_XMM(cvtpd2dq);
2083        CVT_OP_XMM(cvttpd2dq);
2084    
2085        /* int to float */
2086        a.l[0] = -6;
2087        a.l[1] = 2;
2088        a.l[2] = 100;
2089        a.l[3] = -60000;
2090        CVT_OP_MMX2XMM(cvtpi2ps);
2091        CVT_OP_MMX2XMM(cvtpi2pd);
2092        CVT_OP_REG2XMM(cvtsi2ss);
2093        CVT_OP_REG2XMM(cvtsi2sd);
2094        CVT_OP_XMM(cvtdq2ps);
2095        CVT_OP_XMM(cvtdq2pd);
2096    
2097        /* XXX: test PNI insns */
2098    #if 0
2099        SSE_OP2(movshdup);
2100    #endif
2101    }
2102    
2103    #endif
2104    
2105  static void *call_end __init_call = NULL;  static void *call_end __init_call = NULL;
2106    
2107  int main(int argc, char **argv)  int main(int argc, char **argv)
# Line 1704  int main(int argc, char **argv) Line 2132  int main(int argc, char **argv)
2132      test_self_modifying_code();      test_self_modifying_code();
2133      test_single_step();      test_single_step();
2134      test_enter();      test_enter();
2135    #ifdef TEST_SSE
2136        test_sse();
2137    #endif
2138      return 0;      return 0;
2139  }  }

Legend:
Removed from v.1.41  
changed lines
  Added in v.1.42

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26