1*72246065SRichard Henderson /*
2*72246065SRichard Henderson * Test m68k extended double denormals.
3*72246065SRichard Henderson */
4*72246065SRichard Henderson
5*72246065SRichard Henderson #include <stdio.h>
6*72246065SRichard Henderson #include <stdint.h>
7*72246065SRichard Henderson
8*72246065SRichard Henderson #define TEST(X, Y) { X, Y, X * Y }
9*72246065SRichard Henderson
10*72246065SRichard Henderson static volatile long double test[][3] = {
11*72246065SRichard Henderson TEST(0x1p+16383l, 0x1p-16446l),
12*72246065SRichard Henderson TEST(0x1.1p-8223l, 0x1.1p-8224l),
13*72246065SRichard Henderson TEST(1.0l, 0x1p-16383l),
14*72246065SRichard Henderson };
15*72246065SRichard Henderson
16*72246065SRichard Henderson #undef TEST
17*72246065SRichard Henderson
dump_ld(const char * label,long double ld)18*72246065SRichard Henderson static void dump_ld(const char *label, long double ld)
19*72246065SRichard Henderson {
20*72246065SRichard Henderson union {
21*72246065SRichard Henderson long double d;
22*72246065SRichard Henderson struct {
23*72246065SRichard Henderson uint32_t exp:16;
24*72246065SRichard Henderson uint32_t space:16;
25*72246065SRichard Henderson uint32_t h;
26*72246065SRichard Henderson uint32_t l;
27*72246065SRichard Henderson };
28*72246065SRichard Henderson } u;
29*72246065SRichard Henderson
30*72246065SRichard Henderson u.d = ld;
31*72246065SRichard Henderson printf("%12s: % -27La 0x%04x 0x%08x 0x%08x\n", label, u.d, u.exp, u.h, u.l);
32*72246065SRichard Henderson }
33*72246065SRichard Henderson
main(void)34*72246065SRichard Henderson int main(void)
35*72246065SRichard Henderson {
36*72246065SRichard Henderson int i, n = sizeof(test) / sizeof(test[0]), err = 0;
37*72246065SRichard Henderson
38*72246065SRichard Henderson for (i = 0; i < n; ++i) {
39*72246065SRichard Henderson long double x = test[i][0];
40*72246065SRichard Henderson long double y = test[i][1];
41*72246065SRichard Henderson long double build_mul = test[i][2];
42*72246065SRichard Henderson long double runtime_mul = x * y;
43*72246065SRichard Henderson
44*72246065SRichard Henderson if (runtime_mul != build_mul) {
45*72246065SRichard Henderson dump_ld("x", x);
46*72246065SRichard Henderson dump_ld("y", y);
47*72246065SRichard Henderson dump_ld("build_mul", build_mul);
48*72246065SRichard Henderson dump_ld("runtime_mul", runtime_mul);
49*72246065SRichard Henderson err = 1;
50*72246065SRichard Henderson }
51*72246065SRichard Henderson }
52*72246065SRichard Henderson return err;
53*72246065SRichard Henderson }
54