1
2 #include <stdio.h>
3 #include <stdlib.h>
4
do_fsave(void * p)5 void do_fsave ( 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
isFPLsbs(int i)14 int isFPLsbs ( int i )
15 {
16 int q;
17 q = 0; if (i == q || i == q+1) return 1;
18 q = 10; if (i == q || i == q+1) return 1;
19 q = 20; if (i == q || i == q+1) return 1;
20 q = 30; if (i == q || i == q+1) return 1;
21 q = 40; if (i == q || i == q+1) return 1;
22 q = 50; if (i == q || i == q+1) return 1;
23 q = 60; if (i == q || i == q+1) return 1;
24 q = 70; if (i == q || i == q+1) return 1;
25 return 0;
26 }
27
show_fpustate(unsigned char * buf,int hide64to80)28 void show_fpustate ( unsigned char* buf, int hide64to80 )
29 {
30 int i;
31 printf(" 0 ");
32 for (i = 0; i < 14; i++)
33 printf("%02x ", buf[i]);
34 printf("\n");
35
36 printf(" 14 ");
37 for (i = 14; i < 28; i++)
38 printf("%02x ", buf[i]);
39 printf("\n");
40
41 for (i = 0; i < 80; i++) {
42 if ((i % 10) == 0)
43 printf("%3d ", i+28);
44 if (hide64to80 && isFPLsbs(i))
45 printf("xx ");
46 else
47 printf("%02x ", buf[i+28]);
48 if (i > 0 && ((i % 10) == 9))
49 printf("\n");
50 }
51 }
52
main(int argc,char ** argv)53 int main ( int argc, char** argv )
54 {
55 int i;
56 unsigned char* buf = malloc(108);
57 int xx = argc > 1;
58 printf("Re-run with any arg to suppress least-significant\n"
59 " 16 bits of FP numbers\n");
60 for (i = 0; i < 108; i++)
61 buf[i] = 0xAA;
62
63 /* dump FPU state in buf, and show it. */
64 do_fsave(buf);
65 show_fpustate( buf, xx );
66
67 return 0;
68 }
69