1#if __INT_MAX__ != 2147483647 || (__LONG_LONG_MAX__ != 9223372036854775807ll && __LONG_MAX__ != 9223372036854775807ll)
2int main(void) { exit (0); }
3#else
4#if __LONG_MAX__ != 9223372036854775807ll
5typedef unsigned long long ull;
6#else
7typedef unsigned long ull;
8#endif
9typedef unsigned ul;
10
11union fl {
12  float	f;
13  ul l;
14} uf;
15union dl {
16  double d;
17  ull ll;
18} ud;
19
20int failed = 0;
21
22void c(ull d, ul f)
23{
24  ud.ll = d;
25  uf.f = (float) ud.d;
26  if (uf.l != f)
27    {
28      failed++;
29    }
30}
31
32int main()
33{
34  if (sizeof (float) != sizeof (ul)
35      || sizeof (double) != sizeof (ull))
36    exit (0);
37
38  c(0x3690000000000000ULL, 0x00000000U);
39#if (defined __arm__ || defined __thumb__) && ! (defined __ARMEB__ || defined __VFP_FP__)
40  /* The ARM always stores FP numbers in big-wordian format,
41     even when running in little-byteian mode.  */
42  c(0x0000000136900000ULL, 0x00000001U);
43  c(0xffffffff369fffffULL, 0x00000001U);
44  c(0x0000000036A00000ULL, 0x00000001U);
45  c(0xffffffff36A7ffffULL, 0x00000001U);
46  c(0x0000000036A80000ULL, 0x00000002U);
47  c(0xffffffff36AfffffULL, 0x00000002U);
48  c(0x0000000036b00000ULL, 0x00000002U);
49  c(0x0000000136b00000ULL, 0x00000002U);
50
51  c(0xdfffffff380fffffULL, 0x007fffffU);
52  c(0xe0000000380fffffULL, 0x00800000U);
53  c(0xe0000001380fffffULL, 0x00800000U);
54  c(0xffffffff380fffffULL, 0x00800000U);
55  c(0x0000000038100000ULL, 0x00800000U);
56  c(0x0000000138100000ULL, 0x00800000U);
57  c(0x1000000038100000ULL, 0x00800000U);
58  c(0x1000000138100000ULL, 0x00800001U);
59  c(0x2fffffff38100000ULL, 0x00800001U);
60  c(0x3000000038100000ULL, 0x00800002U);
61  c(0x5000000038100000ULL, 0x00800002U);
62  c(0x5000000138100000ULL, 0x00800003U);
63#else
64  c(0x3690000000000001ULL, 0x00000001U);
65  c(0x369fffffffffffffULL, 0x00000001U);
66  c(0x36A0000000000000ULL, 0x00000001U);
67  c(0x36A7ffffffffffffULL, 0x00000001U);
68  c(0x36A8000000000000ULL, 0x00000002U);
69  c(0x36AfffffffffffffULL, 0x00000002U);
70  c(0x36b0000000000000ULL, 0x00000002U);
71  c(0x36b0000000000001ULL, 0x00000002U);
72
73  c(0x380fffffdfffffffULL, 0x007fffffU);
74  c(0x380fffffe0000000ULL, 0x00800000U);
75  c(0x380fffffe0000001ULL, 0x00800000U);
76  c(0x380fffffffffffffULL, 0x00800000U);
77  c(0x3810000000000000ULL, 0x00800000U);
78  c(0x3810000000000001ULL, 0x00800000U);
79  c(0x3810000010000000ULL, 0x00800000U);
80  c(0x3810000010000001ULL, 0x00800001U);
81  c(0x381000002fffffffULL, 0x00800001U);
82  c(0x3810000030000000ULL, 0x00800002U);
83  c(0x3810000050000000ULL, 0x00800002U);
84  c(0x3810000050000001ULL, 0x00800003U);
85#endif
86
87  if (failed)
88    abort ();
89  else
90    exit (0);
91}
92#endif
93