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,6 +1872,67 @@ void test_sse_comi(double a1, double b1) | ||
1872 | r.l[0]);\ | 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 | void test_sse(void) | 1936 | void test_sse(void) |
1876 | { | 1937 | { |
1877 | XMMReg r, a, b; | 1938 | XMMReg r, a, b; |
@@ -2098,6 +2159,7 @@ void test_sse(void) | @@ -2098,6 +2159,7 @@ void test_sse(void) | ||
2098 | #if 0 | 2159 | #if 0 |
2099 | SSE_OP2(movshdup); | 2160 | SSE_OP2(movshdup); |
2100 | #endif | 2161 | #endif |
2162 | + asm volatile ("emms"); | ||
2101 | } | 2163 | } |
2102 | 2164 | ||
2103 | #endif | 2165 | #endif |
@@ -2134,6 +2196,7 @@ int main(int argc, char **argv) | @@ -2134,6 +2196,7 @@ int main(int argc, char **argv) | ||
2134 | test_enter(); | 2196 | test_enter(); |
2135 | #ifdef TEST_SSE | 2197 | #ifdef TEST_SSE |
2136 | test_sse(); | 2198 | test_sse(); |
2199 | + test_fxsave(); | ||
2137 | #endif | 2200 | #endif |
2138 | return 0; | 2201 | return 0; |
2139 | } | 2202 | } |