#include #include typedef struct { u_int64_t LowPart; u_int64_t HighPart; } FLOAT128; /* d = a * b + c */ void run_fma(u_int64_t *fpsr, FLOAT128 *d, FLOAT128 *a, FLOAT128 *b, FLOAT128 *c); /* d = a * 1.0 + 0.0 */ void run_fnorm(u_int64_t *fpsr, FLOAT128 *d, FLOAT128 *a); int main(int ac, char **av) { FLOAT128 a, b, c, d; u_int64_t fpsr; int *p; p = (int *)&d; printf("fault example 1\n"); sleep(1); fpsr = 0x3bf; a.HighPart = 0x000000000000ffff; a.LowPart = 0x8000000000000000; b.HighPart = 0x0000000000000008; b.LowPart = 0x3fffffffffffffff; c.HighPart = 0x0000000000000000; c.LowPart = 0x0000000000000000; d.HighPart = 0; d.LowPart = 0; run_fma(&fpsr, &d, &a, &b, &c); printf("RN d [HH, HL, LH, LL] = %08x %08x %08x %08x PUOZDI = %02x\n", p[3], p[2], p[1], p[0], (short int)((fpsr >> 13) & 0x3f)); printf("d = %lf\n", *(long double *)&d); sleep(1); printf("fault example 7\n"); sleep(1); fpsr = 0x3bf; a.HighPart = 0x0000000000000008; a.LowPart = 0x3fffffffffffffff; d.HighPart = 0; d.LowPart = 0; run_fnorm(&fpsr, &d, &a); printf("RN d [HH, HL, LH, LL] = %08x %08x %08x %08x PUOZDI = %02x\n", p[3], p[2], p[1], p[0], (short int)((fpsr >> 13) & 0x3f)); sleep(1); printf("trap example 10\n"); sleep(1); fpsr = 0x3bf; a.HighPart = 0x0000000000000001; a.LowPart = 0x3fffffffffffffff; d.HighPart = 0; d.LowPart = 0; run_fnorm(&fpsr, &d, &a); printf("RN d [HH, HL, LH, LL] = %08x %08x %08x %08x PUOZDI = %02x\n", p[3], p[2], p[1], p[0], (short int)((fpsr >> 13) & 0x3f)); sleep(1); printf("trap example 11\n"); sleep(1); fpsr = 0x3bf; a.HighPart = 0x0000000000000001; a.LowPart = 0xfffffffffffffffc; b.HighPart = 0x000000000000fffa; b.LowPart = 0x8000000000000000; c.HighPart = 0x0000000000000000; c.LowPart = 0x0000000000000000; d.HighPart = 0; d.LowPart = 0; run_fma(&fpsr, &d, &a, &b, &c); printf("RN d [HH, HL, LH, LL] = %08x %08x %08x %08x PUOZDI = %02x\n", p[3], p[2], p[1], p[0], (short int)((fpsr >> 13) & 0x3f)); sleep(1); };