Commit 6b2b6112f872f656ba4c9ef22ff1576e87042bcc

Authored by bellard
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