xref: /openbmc/qemu/tests/tcg/m68k/denormal.c (revision d7754940d78a7d5bfb13531afa9a67f8c57e987e)
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