blob: 293711d90dcc1b9404b5348abf24d554e5bf372c [file] [log] [blame]
sewardj9fc9e782004-11-26 17:57:40 +00001
2#include <stdio.h>
3#include <stdlib.h>
4
5void do_fsave ( void* p )
6{
sewardjbbe85d02005-01-06 12:33:30 +00007 asm __volatile__("fninit");
8 asm __volatile__("fldpi");
9 asm __volatile__("fld1");
10 asm __volatile__("fldln2");
11 asm __volatile__("fsave (%0)" : : "r" (p) : "memory" );
sewardj9fc9e782004-11-26 17:57:40 +000012}
13
sewardjbbe85d02005-01-06 12:33:30 +000014int 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
28void show_fpustate ( unsigned char* buf, int hide64to80 )
sewardj9fc9e782004-11-26 17:57:40 +000029{
30 int i;
sewardjbbe85d02005-01-06 12:33:30 +000031 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))
sewardj9fc9e782004-11-26 17:57:40 +000049 printf("\n");
50 }
sewardjbbe85d02005-01-06 12:33:30 +000051}
52
53int 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
sewardj9fc9e782004-11-26 17:57:40 +000067 return 0;
68}