| |
| #include <stdio.h> |
| #include <stdlib.h> |
| |
| void do_fsave_interesting_stuff ( void* p ) |
| { |
| asm __volatile__("fninit"); |
| asm __volatile__("fldpi"); |
| asm __volatile__("fld1"); |
| asm __volatile__("fldln2"); |
| asm __volatile__("fsave (%0)" : : "r" (p) : "memory" ); |
| } |
| |
| void do_fsave ( void* p ) |
| { |
| asm __volatile__("fsave (%0)" : : "r" (p) : "memory" ); |
| } |
| |
| void do_frstor ( void* p ) |
| { |
| asm __volatile__("frstor (%0)" : : "r" (p) : "memory" ); |
| } |
| |
| |
| 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; |
| 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"); |
| } |
| } |
| |
| int main ( int argc, char** argv ) |
| { |
| unsigned short* buf1 = malloc(54*sizeof(short)); |
| unsigned short* buf2 = malloc(54*sizeof(short)); |
| int xx = argc > 1; |
| printf("Re-run with any arg to suppress least-significant\n" |
| " 16 bits of FP numbers\n"); |
| |
| /* Create an initial image. */ |
| do_fsave_interesting_stuff(buf1); |
| show_fpustate( (unsigned char*)buf1, xx ); |
| |
| /* Reload it into buf2. */ |
| do_frstor(buf1); |
| do_fsave(buf2); |
| show_fpustate( (unsigned char*)buf2, xx ); |
| |
| return 0; |
| } |