blob: 006e19ee3cfe278b7a1733e74332b69d4fd3bc06 [file] [log] [blame]
sewardj9fc9e782004-11-26 17:57:40 +00001
2#include <stdio.h>
3#include <stdlib.h>
4
sewardj211465d2005-01-06 15:46:22 +00005void 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
sewardj9fc9e782004-11-26 17:57:40 +000014void do_fsave ( void* p )
15{
sewardjbbe85d02005-01-06 12:33:30 +000016 asm __volatile__("fsave (%0)" : : "r" (p) : "memory" );
sewardj9fc9e782004-11-26 17:57:40 +000017}
18
19void do_frstor ( void* p )
20{
sewardjbbe85d02005-01-06 12:33:30 +000021 asm __volatile__("frstor (%0)" : : "r" (p) : "memory" );
sewardj9fc9e782004-11-26 17:57:40 +000022}
23
sewardjbbe85d02005-01-06 12:33:30 +000024
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 )
sewardj9fc9e782004-11-26 17:57:40 +000065{
sewardj211465d2005-01-06 15:46:22 +000066 unsigned short* buf1 = malloc(54*sizeof(short));
67 unsigned short* buf2 = malloc(54*sizeof(short));
sewardjbbe85d02005-01-06 12:33:30 +000068 int xx = argc > 1;
69 printf("Re-run with any arg to suppress least-significant\n"
70 " 16 bits of FP numbers\n");
71
sewardj211465d2005-01-06 15:46:22 +000072 /* Create an initial image. */
73 do_fsave_interesting_stuff(buf1);
74 show_fpustate( (unsigned char*)buf1, xx );
sewardj9fc9e782004-11-26 17:57:40 +000075
sewardj211465d2005-01-06 15:46:22 +000076 /* Reload it into buf2. */
77 do_frstor(buf1);
78 do_fsave(buf2);
79 show_fpustate( (unsigned char*)buf2, xx );
sewardjbbe85d02005-01-06 12:33:30 +000080
sewardj9fc9e782004-11-26 17:57:40 +000081 return 0;
82}