Commit 03bfca946a9fdf7a437f28183be36b4bf89b51e9
1 parent
ed2dcdf6
more FPU tests
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@202 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
64 additions
and
1 deletions
tests/test-i386.c
... | ... | @@ -9,7 +9,8 @@ |
9 | 9 | #include <sys/mman.h> |
10 | 10 | #include <asm/vm86.h> |
11 | 11 | |
12 | -#define TEST_CMOV 0 | |
12 | +#define TEST_CMOV 0 | |
13 | +#define TEST_FCOMI 0 | |
13 | 14 | |
14 | 15 | #define xglue(x, y) x ## y |
15 | 16 | #define glue(x, y) xglue(x, y) |
... | ... | @@ -510,6 +511,16 @@ void test_fcmp(double a, double b) |
510 | 511 | a, b, a > b); |
511 | 512 | printf("(%f<=%f)=%d\n", |
512 | 513 | a, b, a >= b); |
514 | + if (TEST_FCOMI) { | |
515 | + unsigned int eflags; | |
516 | + /* test f(u)comi instruction */ | |
517 | + asm("fcomi %2, %1\n" | |
518 | + "pushf\n" | |
519 | + "pop %0\n" | |
520 | + : "=r" (eflags) | |
521 | + : "t" (a), "u" (b)); | |
522 | + printf("fcomi(%f %f)=%08x\n", a, b, eflags & (CC_Z | CC_P | CC_C)); | |
523 | + } | |
513 | 524 | } |
514 | 525 | |
515 | 526 | void test_fcvt(double a) |
... | ... | @@ -556,6 +567,57 @@ void test_fbcd(double a) |
556 | 567 | a, bcd[4], bcd[3], bcd[2], bcd[1], bcd[0], b); |
557 | 568 | } |
558 | 569 | |
570 | +#define TEST_ENV(env, prefix)\ | |
571 | +{\ | |
572 | + memset((env), 0xaa, sizeof(*(env)));\ | |
573 | + asm("fld1\n"\ | |
574 | + prefix "fnstenv %1\n"\ | |
575 | + prefix "fldenv %1\n"\ | |
576 | + : "=t" (res) : "m" (*(env)) : "st");\ | |
577 | + printf("res=%f\n", res);\ | |
578 | + printf("fpuc=%04x fpus=%04x fptag=%04x\n",\ | |
579 | + (env)->fpuc,\ | |
580 | + (env)->fpus & 0xff00,\ | |
581 | + (env)->fptag);\ | |
582 | + memset((env), 0xaa, sizeof(*(env)));\ | |
583 | + asm("fld1\n"\ | |
584 | + prefix "fnsave %1\n"\ | |
585 | + prefix "frstor %1\n"\ | |
586 | + : "=t" (res) : "m" (*(env)) : "st");\ | |
587 | + printf("res=%f\n", res);\ | |
588 | + printf("fpuc=%04x fpus=%04x fptag=%04x\n",\ | |
589 | + (env)->fpuc,\ | |
590 | + (env)->fpus & 0xff00,\ | |
591 | + (env)->fptag);\ | |
592 | + printf("ST(0) = %Lf\n",\ | |
593 | + (env)->fpregs[0]);\ | |
594 | +} | |
595 | + | |
596 | +void test_fenv(void) | |
597 | +{ | |
598 | + struct __attribute__((packed)) { | |
599 | + uint16_t fpuc; | |
600 | + uint16_t dummy1; | |
601 | + uint16_t fpus; | |
602 | + uint16_t dummy2; | |
603 | + uint16_t fptag; | |
604 | + uint16_t dummy3; | |
605 | + uint32_t ignored[4]; | |
606 | + long double fpregs[8]; | |
607 | + } float_env32; | |
608 | + struct __attribute__((packed)) { | |
609 | + uint16_t fpuc; | |
610 | + uint16_t fpus; | |
611 | + uint16_t fptag; | |
612 | + uint16_t ignored[4]; | |
613 | + long double fpregs[8]; | |
614 | + } float_env16; | |
615 | + double res; | |
616 | + | |
617 | + TEST_ENV(&float_env16, "data16 "); | |
618 | + TEST_ENV(&float_env32, ""); | |
619 | +} | |
620 | + | |
559 | 621 | void test_floats(void) |
560 | 622 | { |
561 | 623 | test_fops(2, 3); |
... | ... | @@ -569,6 +631,7 @@ void test_floats(void) |
569 | 631 | test_fconst(); |
570 | 632 | test_fbcd(1234567890123456); |
571 | 633 | test_fbcd(-123451234567890); |
634 | + test_fenv(); | |
572 | 635 | } |
573 | 636 | |
574 | 637 | /**********************************************/ | ... | ... |