/* * Test m68k extended double denormals. */ #include #include #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; }