Commit a4682cc20a68c59939552492590559e94b00a984
1 parent
839fa988
fxsr test
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1216 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
63 additions
and
0 deletions
tests/test-i386.c
| ... | ... | @@ -1872,6 +1872,67 @@ void test_sse_comi(double a1, double b1) |
| 1872 | 1872 | r.l[0]);\ |
| 1873 | 1873 | } |
| 1874 | 1874 | |
| 1875 | +struct fpxstate { | |
| 1876 | + uint16_t fpuc; | |
| 1877 | + uint16_t fpus; | |
| 1878 | + uint16_t fptag; | |
| 1879 | + uint16_t fop; | |
| 1880 | + uint32_t fpuip; | |
| 1881 | + uint16_t cs_sel; | |
| 1882 | + uint16_t dummy0; | |
| 1883 | + uint32_t fpudp; | |
| 1884 | + uint16_t ds_sel; | |
| 1885 | + uint16_t dummy1; | |
| 1886 | + uint32_t mxcsr; | |
| 1887 | + uint32_t mxcsr_mask; | |
| 1888 | + uint8_t fpregs1[8 * 16]; | |
| 1889 | + uint8_t xmm_regs[8 * 16]; | |
| 1890 | + uint8_t dummy2[224]; | |
| 1891 | +}; | |
| 1892 | + | |
| 1893 | +static struct fpxstate fpx_state __attribute__((aligned(16))); | |
| 1894 | +static struct fpxstate fpx_state2 __attribute__((aligned(16))); | |
| 1895 | + | |
| 1896 | +void test_fxsave(void) | |
| 1897 | +{ | |
| 1898 | + struct fpxstate *fp = &fpx_state; | |
| 1899 | + struct fpxstate *fp2 = &fpx_state2; | |
| 1900 | + int i; | |
| 1901 | + XMMReg a, b; | |
| 1902 | + a.q[0] = test_values[0][0]; | |
| 1903 | + a.q[1] = test_values[0][1]; | |
| 1904 | + b.q[0] = test_values[1][0]; | |
| 1905 | + b.q[1] = test_values[1][1]; | |
| 1906 | + | |
| 1907 | + asm("movdqa %2, %%xmm0\n" | |
| 1908 | + "movdqa %3, %%xmm7\n" | |
| 1909 | + " fld1\n" | |
| 1910 | + " fldpi\n" | |
| 1911 | + " fldln2\n" | |
| 1912 | + " fxsave %0\n" | |
| 1913 | + " fxrstor %0\n" | |
| 1914 | + " fxsave %1\n" | |
| 1915 | + " fninit\n" | |
| 1916 | + : "=m" (*(uint32_t *)fp2), "=m" (*(uint32_t *)fp) | |
| 1917 | + : "m" (a), "m" (b)); | |
| 1918 | + printf("fpuc=%04x\n", fp->fpuc); | |
| 1919 | + printf("fpus=%04x\n", fp->fpus); | |
| 1920 | + printf("fptag=%04x\n", fp->fptag); | |
| 1921 | + for(i = 0; i < 3; i++) { | |
| 1922 | + printf("ST%d: %016llx %04x\n", | |
| 1923 | + i, | |
| 1924 | + *(uint64_t *)&fp->fpregs1[i * 16], | |
| 1925 | + *(uint16_t *)&fp->fpregs1[i * 16 + 8]); | |
| 1926 | + } | |
| 1927 | + printf("mxcsr=%08x\n", fp->mxcsr & 0x1f80); | |
| 1928 | + for(i = 0; i < 8; i++) { | |
| 1929 | + printf("xmm%d: %016llx%016llx\n", | |
| 1930 | + i, | |
| 1931 | + *(uint64_t *)&fp->xmm_regs[i * 16], | |
| 1932 | + *(uint64_t *)&fp->xmm_regs[i * 16 + 8]); | |
| 1933 | + } | |
| 1934 | +} | |
| 1935 | + | |
| 1875 | 1936 | void test_sse(void) |
| 1876 | 1937 | { |
| 1877 | 1938 | XMMReg r, a, b; |
| ... | ... | @@ -2098,6 +2159,7 @@ void test_sse(void) |
| 2098 | 2159 | #if 0 |
| 2099 | 2160 | SSE_OP2(movshdup); |
| 2100 | 2161 | #endif |
| 2162 | + asm volatile ("emms"); | |
| 2101 | 2163 | } |
| 2102 | 2164 | |
| 2103 | 2165 | #endif |
| ... | ... | @@ -2134,6 +2196,7 @@ int main(int argc, char **argv) |
| 2134 | 2196 | test_enter(); |
| 2135 | 2197 | #ifdef TEST_SSE |
| 2136 | 2198 | test_sse(); |
| 2199 | + test_fxsave(); | |
| 2137 | 2200 | #endif |
| 2138 | 2201 | return 0; |
| 2139 | 2202 | } | ... | ... |