Commit 6b2b6112f872f656ba4c9ef22ff1576e87042bcc
1 parent
bf088061
more FPU context save tests
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@651 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
19 additions
and
21 deletions
tests/test-i386.c
... | ... | @@ -612,30 +612,21 @@ void test_fbcd(double a) |
612 | 612 | a, bcd[4], bcd[3], bcd[2], bcd[1], bcd[0], b); |
613 | 613 | } |
614 | 614 | |
615 | -#define TEST_ENV(env, prefix)\ | |
615 | +#define TEST_ENV(env, save, restore)\ | |
616 | 616 | {\ |
617 | 617 | memset((env), 0xaa, sizeof(*(env)));\ |
618 | - asm("fld1\n"\ | |
619 | - prefix "fnstenv %1\n"\ | |
620 | - prefix "fldenv %1\n"\ | |
621 | - : "=t" (res) : "m" (*(env)));\ | |
622 | - printf("res=%f\n", res);\ | |
618 | + for(i=0;i<5;i++)\ | |
619 | + asm volatile ("fldl %0" : : "m" (dtab[i]));\ | |
620 | + asm(save " %0\n" : : "m" (*(env)));\ | |
621 | + asm(restore " %0\n": : "m" (*(env)));\ | |
622 | + for(i=0;i<5;i++)\ | |
623 | + asm volatile ("fstpl %0" : "=m" (rtab[i]));\ | |
624 | + for(i=0;i<5;i++)\ | |
625 | + printf("res[%d]=%f\n", i, rtab[i]);\ | |
623 | 626 | printf("fpuc=%04x fpus=%04x fptag=%04x\n",\ |
624 | 627 | (env)->fpuc,\ |
625 | 628 | (env)->fpus & 0xff00,\ |
626 | 629 | (env)->fptag);\ |
627 | - memset((env), 0xaa, sizeof(*(env)));\ | |
628 | - asm("fld1\n"\ | |
629 | - prefix "fnsave %1\n"\ | |
630 | - prefix "frstor %1\n"\ | |
631 | - : "=t" (res) : "m" (*(env)));\ | |
632 | - printf("res=%f\n", res);\ | |
633 | - printf("fpuc=%04x fpus=%04x fptag=%04x\n",\ | |
634 | - (env)->fpuc,\ | |
635 | - (env)->fpus & 0xff00,\ | |
636 | - (env)->fptag);\ | |
637 | - printf("ST(0) = %Lf\n",\ | |
638 | - (env)->fpregs[0]);\ | |
639 | 630 | } |
640 | 631 | |
641 | 632 | void test_fenv(void) |
... | ... | @@ -657,10 +648,17 @@ void test_fenv(void) |
657 | 648 | uint16_t ignored[4]; |
658 | 649 | long double fpregs[8]; |
659 | 650 | } float_env16; |
660 | - double res; | |
651 | + double dtab[8]; | |
652 | + double rtab[8]; | |
653 | + int i; | |
654 | + | |
655 | + for(i=0;i<8;i++) | |
656 | + dtab[i] = i + 1; | |
661 | 657 | |
662 | - TEST_ENV(&float_env16, "data16 "); | |
663 | - TEST_ENV(&float_env32, ""); | |
658 | + TEST_ENV(&float_env16, "data16 fnstenv", "data16 fldenv"); | |
659 | + TEST_ENV(&float_env16, "data16 fnsave", "data16 frstor"); | |
660 | + TEST_ENV(&float_env32, "fnstenv", "fldenv"); | |
661 | + TEST_ENV(&float_env32, "fnsave", "frstor"); | |
664 | 662 | } |
665 | 663 | |
666 | 664 | ... | ... |