sewardj | 9fc9e78 | 2004-11-26 17:57:40 +0000 | [diff] [blame] | 1 | |
| 2 | #include <stdio.h> |
| 3 | #include <stdlib.h> |
| 4 | |
| 5 | void do_fsave ( void* p ) |
| 6 | { |
sewardj | bbe85d0 | 2005-01-06 12:33:30 +0000 | [diff] [blame] | 7 | asm __volatile__("fninit"); |
| 8 | asm __volatile__("fldpi"); |
| 9 | asm __volatile__("fld1"); |
| 10 | asm __volatile__("fldln2"); |
| 11 | asm __volatile__("fsave (%0)" : : "r" (p) : "memory" ); |
sewardj | 9fc9e78 | 2004-11-26 17:57:40 +0000 | [diff] [blame] | 12 | } |
| 13 | |
sewardj | bbe85d0 | 2005-01-06 12:33:30 +0000 | [diff] [blame] | 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 | |
| 28 | void show_fpustate ( unsigned char* buf, int hide64to80 ) |
sewardj | 9fc9e78 | 2004-11-26 17:57:40 +0000 | [diff] [blame] | 29 | { |
| 30 | int i; |
sewardj | bbe85d0 | 2005-01-06 12:33:30 +0000 | [diff] [blame] | 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)) |
sewardj | 9fc9e78 | 2004-11-26 17:57:40 +0000 | [diff] [blame] | 49 | printf("\n"); |
| 50 | } |
sewardj | bbe85d0 | 2005-01-06 12:33:30 +0000 | [diff] [blame] | 51 | } |
| 52 | |
| 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 | |
sewardj | 9fc9e78 | 2004-11-26 17:57:40 +0000 | [diff] [blame] | 67 | return 0; |
| 68 | } |