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 | ... | ... |