1/* Check that certain subnormal numbers (formerly known as denormalized
2   numbers) are rounded to within 0.5 ulp.  PR other/14354.  */
3
4/* This test requires that float and unsigned int are the same size and
5   that the sign-bit of the float is at MSB of the unsigned int.  */
6
7#if __INT_MAX__ != 2147483647L
8int main () { exit (0); }
9#else
10
11union uf
12{
13  unsigned int u;
14  float f;
15};
16
17static float
18u2f (unsigned int v)
19{
20  union uf u;
21  u.u = v;
22  return u.f;
23}
24
25static unsigned int
26f2u (float v)
27{
28  union uf u;
29  u.f = v;
30  return u.u;
31}
32
33int ok = 1;
34
35static void
36tstmul (unsigned int ux, unsigned int uy, unsigned int ur)
37{
38  float x = u2f (ux);
39  float y = u2f (uy);
40
41  if (f2u (x * y) != ur)
42    /* Set a variable rather than aborting here, to simplify tracing when
43       several computations are wrong.  */
44    ok = 0;
45}
46
47/* We don't want to make this const and static, or else we risk inlining
48   causing the test to fold as constants at compile-time.  */
49struct
50{
51  unsigned int p1, p2, res;
52} expected[] =
53  {
54    {0xfff, 0x3f800400, 0xfff},
55    {0xf, 0x3fc88888, 0x17},
56    {0xf, 0x3f844444, 0xf}
57  };
58
59int
60main (int argc, char *argv[], char *envp[])
61{
62  unsigned int i;
63
64  for (i = 0; i < sizeof (expected) / sizeof (expected[0]); i++)
65    {
66      tstmul (expected[i].p1, expected[i].p2, expected[i].res);
67      tstmul (expected[i].p2, expected[i].p1, expected[i].res);
68    }
69
70  if (!ok)
71    abort ();
72
73  exit (0);
74}
75#endif
76