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,30 +612,21 @@ void test_fbcd(double a) | ||
| 612 | a, bcd[4], bcd[3], bcd[2], bcd[1], bcd[0], b); | 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 | memset((env), 0xaa, sizeof(*(env)));\ | 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 | printf("fpuc=%04x fpus=%04x fptag=%04x\n",\ | 626 | printf("fpuc=%04x fpus=%04x fptag=%04x\n",\ |
| 624 | (env)->fpuc,\ | 627 | (env)->fpuc,\ |
| 625 | (env)->fpus & 0xff00,\ | 628 | (env)->fpus & 0xff00,\ |
| 626 | (env)->fptag);\ | 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 | void test_fenv(void) | 632 | void test_fenv(void) |
| @@ -657,10 +648,17 @@ void test_fenv(void) | @@ -657,10 +648,17 @@ void test_fenv(void) | ||
| 657 | uint16_t ignored[4]; | 648 | uint16_t ignored[4]; |
| 658 | long double fpregs[8]; | 649 | long double fpregs[8]; |
| 659 | } float_env16; | 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 |