| /* |
| * Test m68k extended double denormals. |
| */ |
| |
| #include <stdio.h> |
| #include <stdint.h> |
| |
| #define TEST(X, Y) { X, Y, X * Y } |
| |
| static volatile long double test[][3] = { |
| TEST(0x1p+16383l, 0x1p-16446l), |
| TEST(0x1.1p-8223l, 0x1.1p-8224l), |
| TEST(1.0l, 0x1p-16383l), |
| }; |
| |
| #undef TEST |
| |
| static void dump_ld(const char *label, long double ld) |
| { |
| union { |
| long double d; |
| struct { |
| uint32_t exp:16; |
| uint32_t space:16; |
| uint32_t h; |
| uint32_t l; |
| }; |
| } u; |
| |
| u.d = ld; |
| printf("%12s: % -27La 0x%04x 0x%08x 0x%08x\n", label, u.d, u.exp, u.h, u.l); |
| } |
| |
| int main(void) |
| { |
| int i, n = sizeof(test) / sizeof(test[0]), err = 0; |
| |
| for (i = 0; i < n; ++i) { |
| long double x = test[i][0]; |
| long double y = test[i][1]; |
| long double build_mul = test[i][2]; |
| long double runtime_mul = x * y; |
| |
| if (runtime_mul != build_mul) { |
| dump_ld("x", x); |
| dump_ld("y", y); |
| dump_ld("build_mul", build_mul); |
| dump_ld("runtime_mul", runtime_mul); |
| err = 1; |
| } |
| } |
| return err; |
| } |