Improve these test programs.


git-svn-id: svn://svn.valgrind.org/vex/trunk@693 8f6e269a-dfd6-0310-a8e1-e2731360e62c
diff --git a/test/fsave.c b/test/fsave.c
index 2e0ba15..293711d 100644
--- a/test/fsave.c
+++ b/test/fsave.c
@@ -4,19 +4,65 @@
 
 void do_fsave ( void* p )
 {
-   asm("fldpi ; fld1; fldln2 ; movl 8(%esp), %eax ; fsave (%eax)");
+   asm __volatile__("fninit");
+   asm __volatile__("fldpi");
+   asm __volatile__("fld1");
+   asm __volatile__("fldln2");
+   asm __volatile__("fsave (%0)" : : "r" (p) : "memory" );
 }
 
-int main ( void )
+int isFPLsbs ( int i )
+{
+   int q;
+   q = 0; if (i == q || i == q+1) return 1;
+   q = 10; if (i == q || i == q+1) return 1;
+   q = 20; if (i == q || i == q+1) return 1;
+   q = 30; if (i == q || i == q+1) return 1;
+   q = 40; if (i == q || i == q+1) return 1;
+   q = 50; if (i == q || i == q+1) return 1;
+   q = 60; if (i == q || i == q+1) return 1;
+   q = 70; if (i == q || i == q+1) return 1;
+   return 0;
+}
+
+void show_fpustate ( unsigned char* buf, int hide64to80 )
 {
    int i;
-   unsigned int* buf = malloc(27*sizeof(int));
-   do_fsave(buf);
-   for (i = 0; i < 27; i++) {
-      printf("%08x ", buf[i]);
-      if (i > 0 && ((i % 6) == 5))
+   printf("  0   ");
+   for (i = 0; i < 14; i++)
+      printf("%02x ", buf[i]);
+   printf("\n");
+
+   printf(" 14   ");
+   for (i = 14; i < 28; i++)
+      printf("%02x ", buf[i]);
+   printf("\n");
+
+   for (i = 0; i < 80; i++) {
+      if ((i % 10) == 0)
+         printf("%3d   ", i+28);
+      if (hide64to80 && isFPLsbs(i))
+	 printf("xx ");
+      else
+         printf("%02x ", buf[i+28]);
+      if (i > 0 && ((i % 10) == 9))
           printf("\n");
    }
-   printf("\n");
+}
+
+int main ( int argc, char** argv )
+{
+   int i;
+   unsigned char* buf = malloc(108);
+   int xx = argc > 1;
+   printf("Re-run with any arg to suppress least-significant\n"
+          "   16 bits of FP numbers\n");
+   for (i = 0; i < 108; i++)
+      buf[i] = 0xAA;
+
+   /* dump FPU state in buf, and show it. */
+   do_fsave(buf);
+   show_fpustate( buf, xx );
+
    return 0;
 }