more FPU context save tests
authorbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>
Wed, 25 Feb 2004 23:34:07 +0000 (23:34 +0000)
committerbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>
Wed, 25 Feb 2004 23:34:07 +0000 (23:34 +0000)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@651 c046a42c-6fe2-441c-8c8c-71466251a162

tests/test-i386.c

index b0c2af8..650a5a9 100644 (file)
@@ -612,30 +612,21 @@ void test_fbcd(double a)
            a, bcd[4], bcd[3], bcd[2], bcd[1], bcd[0], b);
 }
 
-#define TEST_ENV(env, prefix)\
+#define TEST_ENV(env, save, restore)\
 {\
     memset((env), 0xaa, sizeof(*(env)));\
-    asm("fld1\n"\
-        prefix "fnstenv %1\n"\
-        prefix "fldenv %1\n"\
-        : "=t" (res) : "m" (*(env)));\
-    printf("res=%f\n", res);\
+    for(i=0;i<5;i++)\
+        asm volatile ("fldl %0" : : "m" (dtab[i]));\
+    asm(save " %0\n" : : "m" (*(env)));\
+    asm(restore " %0\n": : "m" (*(env)));\
+    for(i=0;i<5;i++)\
+        asm volatile ("fstpl %0" : "=m" (rtab[i]));\
+    for(i=0;i<5;i++)\
+        printf("res[%d]=%f\n", i, rtab[i]);\
     printf("fpuc=%04x fpus=%04x fptag=%04x\n",\
            (env)->fpuc,\
            (env)->fpus & 0xff00,\
            (env)->fptag);\
-    memset((env), 0xaa, sizeof(*(env)));\
-    asm("fld1\n"\
-        prefix "fnsave %1\n"\
-        prefix "frstor %1\n"\
-        : "=t" (res) : "m" (*(env)));\
-    printf("res=%f\n", res);\
-    printf("fpuc=%04x fpus=%04x fptag=%04x\n",\
-           (env)->fpuc,\
-           (env)->fpus & 0xff00,\
-           (env)->fptag);\
-    printf("ST(0) = %Lf\n",\
-           (env)->fpregs[0]);\
 }
 
 void test_fenv(void)
@@ -657,10 +648,17 @@ void test_fenv(void)
         uint16_t ignored[4];
         long double fpregs[8];
     } float_env16;
-    double res;
+    double dtab[8];
+    double rtab[8];
+    int i;
+
+    for(i=0;i<8;i++)
+        dtab[i] = i + 1;
 
-    TEST_ENV(&float_env16, "data16 ");
-    TEST_ENV(&float_env32, "");
+    TEST_ENV(&float_env16, "data16 fnstenv", "data16 fldenv");
+    TEST_ENV(&float_env16, "data16 fnsave", "data16 frstor");
+    TEST_ENV(&float_env32, "fnstenv", "fldenv");
+    TEST_ENV(&float_env32, "fnsave", "frstor");
 }