aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>2004-02-25 23:34:07 +0000
committerbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>2004-02-25 23:34:07 +0000
commit6b2b6112f872f656ba4c9ef22ff1576e87042bcc (patch)
treeadef8cd1411da358a39db9d62b7974b7a67cb473
parentbf0880614547dfeaed77cde6f37f081eec3b626e (diff)
more FPU context save tests
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@651 c046a42c-6fe2-441c-8c8c-71466251a162
-rw-r--r--tests/test-i386.c40
1 files changed, 19 insertions, 21 deletions
diff --git a/tests/test-i386.c b/tests/test-i386.c
index b0c2af8554..650a5a96ab 100644
--- a/tests/test-i386.c
+++ b/tests/test-i386.c
@@ -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");
}