frstor.c revision b32f58018498ea2225959b0ba11c18f0c433deef
1
2#include <stdio.h>
3#include <stdlib.h>
4
5void do_fsave_interesting_stuff ( void* p )
6{
7   asm __volatile__("fninit");
8   asm __volatile__("fldpi");
9   asm __volatile__("fld1");
10   asm __volatile__("fldln2");
11   asm __volatile__("fsave (%0)" : : "r" (p) : "memory" );
12}
13
14void do_fsave ( void* p )
15{
16   asm __volatile__("fsave (%0)" : : "r" (p) : "memory" );
17}
18
19void do_frstor ( void* p )
20{
21   asm __volatile__("frstor (%0)" : : "r" (p) : "memory" );
22}
23
24
25int isFPLsbs ( int i )
26{
27   int q;
28   q = 0; if (i == q || i == q+1) return 1;
29   q = 10; if (i == q || i == q+1) return 1;
30   q = 20; if (i == q || i == q+1) return 1;
31   q = 30; if (i == q || i == q+1) return 1;
32   q = 40; if (i == q || i == q+1) return 1;
33   q = 50; if (i == q || i == q+1) return 1;
34   q = 60; if (i == q || i == q+1) return 1;
35   q = 70; if (i == q || i == q+1) return 1;
36   return 0;
37}
38
39void show_fpustate ( unsigned char* buf, int hide64to80 )
40{
41   int i;
42   printf("  0   ");
43   for (i = 0; i < 14; i++)
44      printf("%02x ", buf[i]);
45   printf("\n");
46
47   printf(" 14   ");
48   for (i = 14; i < 28; i++)
49      printf("%02x ", buf[i]);
50   printf("\n");
51
52   for (i = 0; i < 80; i++) {
53      if ((i % 10) == 0)
54         printf("%3d   ", i+28);
55      if (hide64to80 && isFPLsbs(i))
56	 printf("xx ");
57      else
58         printf("%02x ", buf[i+28]);
59      if (i > 0 && ((i % 10) == 9))
60          printf("\n");
61   }
62}
63
64int main ( int argc, char** argv )
65{
66   unsigned short* buf1 = malloc(54*sizeof(short));
67   unsigned short* buf2 = malloc(54*sizeof(short));
68   int xx = argc > 1;
69   printf("Re-run with any arg to suppress least-significant\n"
70          "   16 bits of FP numbers\n");
71
72   /* Create an initial image. */
73   do_fsave_interesting_stuff(buf1);
74   show_fpustate( (unsigned char*)buf1, xx );
75
76   /* Reload it into buf2. */
77   do_frstor(buf1);
78   do_fsave(buf2);
79   show_fpustate( (unsigned char*)buf2, xx );
80
81   return 0;
82}
83