aboutsummaryrefslogtreecommitdiff
path: root/tests/test-i386.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test-i386.c')
-rw-r--r--tests/test-i386.c65
1 files changed, 64 insertions, 1 deletions
diff --git a/tests/test-i386.c b/tests/test-i386.c
index 39c7a55a74..56dc6af937 100644
--- a/tests/test-i386.c
+++ b/tests/test-i386.c
@@ -9,7 +9,8 @@
#include <sys/mman.h>
#include <asm/vm86.h>
-#define TEST_CMOV 0
+#define TEST_CMOV 0
+#define TEST_FCOMI 0
#define xglue(x, y) x ## y
#define glue(x, y) xglue(x, y)
@@ -510,6 +511,16 @@ void test_fcmp(double a, double b)
a, b, a > b);
printf("(%f<=%f)=%d\n",
a, b, a >= b);
+ if (TEST_FCOMI) {
+ unsigned int eflags;
+ /* test f(u)comi instruction */
+ asm("fcomi %2, %1\n"
+ "pushf\n"
+ "pop %0\n"
+ : "=r" (eflags)
+ : "t" (a), "u" (b));
+ printf("fcomi(%f %f)=%08x\n", a, b, eflags & (CC_Z | CC_P | CC_C));
+ }
}
void test_fcvt(double a)
@@ -556,6 +567,57 @@ void test_fbcd(double a)
a, bcd[4], bcd[3], bcd[2], bcd[1], bcd[0], b);
}
+#define TEST_ENV(env, prefix)\
+{\
+ memset((env), 0xaa, sizeof(*(env)));\
+ asm("fld1\n"\
+ prefix "fnstenv %1\n"\
+ prefix "fldenv %1\n"\
+ : "=t" (res) : "m" (*(env)) : "st");\
+ printf("res=%f\n", res);\
+ 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)) : "st");\
+ 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)
+{
+ struct __attribute__((packed)) {
+ uint16_t fpuc;
+ uint16_t dummy1;
+ uint16_t fpus;
+ uint16_t dummy2;
+ uint16_t fptag;
+ uint16_t dummy3;
+ uint32_t ignored[4];
+ long double fpregs[8];
+ } float_env32;
+ struct __attribute__((packed)) {
+ uint16_t fpuc;
+ uint16_t fpus;
+ uint16_t fptag;
+ uint16_t ignored[4];
+ long double fpregs[8];
+ } float_env16;
+ double res;
+
+ TEST_ENV(&float_env16, "data16 ");
+ TEST_ENV(&float_env32, "");
+}
+
void test_floats(void)
{
test_fops(2, 3);
@@ -569,6 +631,7 @@ void test_floats(void)
test_fconst();
test_fbcd(1234567890123456);
test_fbcd(-123451234567890);
+ test_fenv();
}
/**********************************************/