1 /* PR84407 */
2 /* { dg-do run { xfail { arm-*-* } } } */
3 /* { dg-require-effective-target fenv } */
4 /* { dg-require-effective-target hard_float } */
5 /* { dg-additional-options "-frounding-math -fexcess-precision=standard" } */
6
7 #include <fenv.h>
8 #include <stdlib.h>
9
10 void __attribute__((noipa))
11 fooa ()
12 {
13 #if __DBL_MANT_DIG__ == 53
14 #ifdef FE_TONEAREST
15 fesetround(FE_TONEAREST);
16 __UINT64_TYPE__ x = 0x7fffffffffffffff;
17 double f = x;
18 if (f != 0x1p+63)
19 abort ();
20 #endif
21 #endif
22 }
23
24 void __attribute__((noipa))
25 foob ()
26 {
27 #if __DBL_MANT_DIG__ == 53
28 #ifdef FE_DOWNWARD
29 fesetround(FE_DOWNWARD);
30 __UINT64_TYPE__ x = 0x7fffffffffffffff;
31 double f = x;
32 if (f != 0x1.fffffffffffffp+62)
33 abort ();
34 #endif
35 #endif
36 }
37
38 void __attribute__((noipa))
39 fooc ()
40 {
41 #if __DBL_MANT_DIG__ == 53
42 #ifdef FE_UPWARD
43 fesetround(FE_UPWARD);
44 __UINT64_TYPE__ x = 0x7fffffffffffffff;
45 double f = x;
46 if (f != 0x1p+63)
47 abort ();
48 #endif
49 #endif
50 }
51
52 void __attribute__((noipa))
53 food ()
54 {
55 #if __DBL_MANT_DIG__ == 53
56 #ifdef FE_TOWARDZERO
57 fesetround(FE_TOWARDZERO);
58 __UINT64_TYPE__ x = 0x7fffffffffffffff;
59 double f = x;
60 if (f != 0x1.fffffffffffffp+62)
61 abort ();
62 #endif
63 #endif
64 }
65
66
67 int
68 main ()
69 {
70 fooa ();
71 foob ();
72 fooc ();
73 food ();
74 return 0;
75 }