* gcc.dg/torture/builtin-modf-1.c: Use -fno-finite-math-only on
[official-gcc.git] / gcc / testsuite / gcc.dg / torture / builtin-modf-1.c
blob27fd1fdfacdc135625f003927a21ecf1b96624d7
1 /* Copyright (C) 2007 Free Software Foundation.
3 Verify that built-in folding of modf is correctly performed by the
4 compiler.
6 Origin: Kaveh R. Ghazi, February 23, 2007. */
8 /* { dg-do link } */
9 /* { dg-options "-fno-finite-math-only" { target sh*-*-* } } */
11 extern void link_error(int);
13 /* Return TRUE if the sign of X != sign of Y. This is important when
14 comparing signed zeros. */
15 #define CKSGN_F(X,Y) \
16 (__builtin_copysignf(1.0F,(X)) != __builtin_copysignf(1.0F,(Y)))
17 #define CKSGN(X,Y) \
18 (__builtin_copysign(1.0,(X)) != __builtin_copysign(1.0,(Y)))
19 #define CKSGN_L(X,Y) \
20 (__builtin_copysignl(1.0L,(X)) != __builtin_copysignl(1.0L,(Y)))
22 /* We use these macros if we can only check these when optimizing. In
23 some cases we rely on other optimizations to propagate the value
24 and fold away certain constructs. Likewise for the sign testing.
25 TRUE means an error occurred. */
26 #ifdef __OPTIMIZE__
27 #define CKRES(X) (X)
28 #define CKIPTR(X,Y) X != Y
29 #define CKSGN_IPTR_F(X,Y) CKSGN_F(X,Y)
30 #define CKSGN_IPTR(X,Y) CKSGN(X,Y)
31 #define CKSGN_IPTR_L(X,Y) CKSGN_L(X,Y)
32 #else
33 #define CKRES(X) 0
34 #define CKIPTR(X,Y) 0
35 #define CKSGN_IPTR_F(X,Y) 0
36 #define CKSGN_IPTR(X,Y) 0
37 #define CKSGN_IPTR_L(X,Y) 0
38 #endif
40 /* Test that modf(ARG1,&iptr) == FRACRES && iptr == INTRES. Check the
41 sign in case we get -0.0. */
42 #define TESTIT_MODF(ARG,INTRES,FRACRES) do { \
43 float iptrf = 0.5; double iptr = 0.5; long double iptrl = 0.5; \
44 if (__builtin_modff(ARG##f,&iptrf) != FRACRES##f \
45 || CKIPTR(iptrf,INTRES##f) \
46 || CKSGN_F(__builtin_modff(ARG##f,&iptrf),FRACRES##f) \
47 || CKSGN_IPTR_F(iptrf,INTRES##f)) \
48 link_error(__LINE__); \
49 if (__builtin_modf(ARG,&iptr) != FRACRES \
50 || CKIPTR(iptr,INTRES) \
51 || CKSGN(__builtin_modf(ARG,&iptr),FRACRES) \
52 || CKSGN_IPTR(iptr,INTRES)) \
53 link_error(__LINE__); \
54 if (__builtin_modfl(ARG##l,&iptrl) != FRACRES##l \
55 || CKIPTR(iptrl,INTRES##l) \
56 || CKSGN_L(__builtin_modfl(ARG##l,&iptrl),FRACRES##l) \
57 || CKSGN_IPTR_L(iptrl,INTRES##l)) \
58 link_error(__LINE__); \
59 } while (0)
61 /* Test that modf(NEG FUNCARG(ARGARG, &iptr)) == FRACRES &&
62 FUNCRES(iptr) is true. Check the sign of both as well. This is
63 for checking an argument of Inf. */
64 #define TESTIT_MODF2(NEG,FUNCARG,ARGARG,FUNCRES,FRACRES) do { \
65 float iptrf = 0.5; double iptr = 0.5; long double iptrl = 0.5; \
66 if (__builtin_modff(NEG __builtin_##FUNCARG##f(ARGARG),&iptrf) != FRACRES##f \
67 || CKSGN_F(__builtin_modff(NEG __builtin_##FUNCARG##f(ARGARG),&iptrf), FRACRES##f) \
68 || CKIPTR(!__builtin_##FUNCRES##f(iptrf),0) \
69 || CKSGN_IPTR_F(iptrf,FRACRES##f)) \
70 link_error(__LINE__); \
71 if (__builtin_modf(NEG __builtin_##FUNCARG(ARGARG),&iptr) != FRACRES \
72 || CKSGN(__builtin_modf(NEG __builtin_##FUNCARG(ARGARG),&iptr), FRACRES) \
73 || CKIPTR(!__builtin_##FUNCRES(iptr),0) \
74 || CKSGN_IPTR(iptr,FRACRES)) \
75 link_error(__LINE__); \
76 if (__builtin_modfl(NEG __builtin_##FUNCARG##l(ARGARG),&iptrl) != FRACRES##l \
77 || CKSGN_L(__builtin_modfl(NEG __builtin_##FUNCARG##l(ARGARG),&iptrl), FRACRES##l) \
78 || CKIPTR(!__builtin_##FUNCRES##l(iptrl),0) \
79 || CKSGN_IPTR_L(iptrl,FRACRES##l)) \
80 link_error(__LINE__); \
81 } while (0)
83 /* Test that FUNCRES(modf(NEG FUNCARG(ARGARG, &iptr))) is true &&
84 FUNCRES(iptr) is true. Check the sign of both as well. This is
85 for checking an argument of NaN. */
86 #define TESTIT_MODF3(NEG,FUNCARG,ARGARG,FUNCRES) do { \
87 float iptrf = 0.5; double iptr = 0.5; long double iptrl = 0.5; \
88 if (CKRES(!__builtin_##FUNCRES##f(__builtin_modff(NEG __builtin_##FUNCARG##f(ARGARG),&iptrf))) \
89 || CKSGN_F(__builtin_modff(NEG __builtin_##FUNCARG##f(ARGARG),&iptrf), NEG 1) \
90 || CKIPTR(!__builtin_##FUNCRES##f(iptrf),0) \
91 || CKSGN_IPTR_F(iptrf,NEG 1)) \
92 link_error(__LINE__); \
93 if (CKRES(!__builtin_##FUNCRES(__builtin_modf(NEG __builtin_##FUNCARG(ARGARG),&iptr))) \
94 || CKSGN(__builtin_modf(NEG __builtin_##FUNCARG(ARGARG),&iptr), NEG 1) \
95 || CKIPTR(!__builtin_##FUNCRES(iptr),0) \
96 || CKSGN_IPTR(iptr,NEG 1)) \
97 link_error(__LINE__); \
98 if (CKRES(!__builtin_##FUNCRES##l(__builtin_modfl(NEG __builtin_##FUNCARG##l(ARGARG),&iptrl))) \
99 || CKSGN_L(__builtin_modfl(NEG __builtin_##FUNCARG##l(ARGARG),&iptrl), NEG 1) \
100 || CKIPTR(!__builtin_##FUNCRES##l(iptrl),0) \
101 || CKSGN_IPTR_L(iptrl,NEG 1)) \
102 link_error(__LINE__); \
103 } while (0)
105 void __attribute__ ((__noinline__))
106 foo(void)
108 /* Test that modf(ARG1,&iptr) -> ARG3 && iptr == ARG2. */
109 TESTIT_MODF (0x1p10F+0.5, 0x1p10, 0.5);
110 TESTIT_MODF (0x1p10F+0x1p-10, 0x1p10, 0x1p-10);
111 TESTIT_MODF (12345678L/17.0, 726216.0, -726216L+12345678L/17.0);
112 TESTIT_MODF (555.555, 555.0, -555+555.555);
113 TESTIT_MODF (5000/11.0, 454.0, -454+5000/11.0);
114 TESTIT_MODF (1000/7.0, 142.0, -142+1000/7.0);
115 TESTIT_MODF (123/7.0, 17.0, -17+123/7.0);
116 TESTIT_MODF (117/7.0, 16.0, -16+117/7.0);
117 TESTIT_MODF (5.5, 5.0, 0.5);
118 TESTIT_MODF (1.5, 1.0, 0.5);
119 TESTIT_MODF (4/3.0, 1.0, -1+4/3.0);
120 TESTIT_MODF (1.0, 1.0, 0.0);
121 TESTIT_MODF (0.5, 0.0, 0.5);
122 TESTIT_MODF (4/9.0, 0.0, 4/9.0);
123 TESTIT_MODF (1/3.0, 0.0, 1/3.0);
124 TESTIT_MODF (1/9.0, 0.0, 1/9.0);
125 TESTIT_MODF (0.0, 0.0, 0.0);
127 TESTIT_MODF (-0.0, -0.0, -0.0);
128 TESTIT_MODF (-1/9.0, -0.0, -1/9.0);
129 TESTIT_MODF (-1/3.0, -0.0, -1/3.0);
130 TESTIT_MODF (-4/9.0, -0.0, -4/9.0);
131 TESTIT_MODF (-0.5, -0.0, -0.5);
132 TESTIT_MODF (-1.0, -1.0, -0.0);
133 TESTIT_MODF (-4/3.0, -1.0, 1-4/3.0);
134 TESTIT_MODF (-1.5, -1.0, -0.5);
135 TESTIT_MODF (-5.5, -5.0, -0.5);
136 TESTIT_MODF (-117/7.0, -16.0, 16-117/7.0);
137 TESTIT_MODF (-123/7.0, -17.0, 17-123/7.0);
138 TESTIT_MODF (-1000/7.0, -142.0, 142-1000/7.0);
139 TESTIT_MODF (-5000/11.0, -454.0, 454-5000/11.0);
140 TESTIT_MODF (-555.555, -555.0, 555-555.555);
141 TESTIT_MODF (-12345678L/17.0, -726216.0, 726216L-12345678L/17.0);
142 TESTIT_MODF (-0x1p10F-0x1p-10, -0x1p10, -0x1p-10);
143 TESTIT_MODF (-0x1p10F-0.5, -0x1p10, -0.5);
146 /* Test for modf(+-Inf,&i) -> (i=+-0.0, +-Inf). */
147 TESTIT_MODF2 ( ,inf, , isinf, 0.0);
148 TESTIT_MODF2 (- ,inf, , isinf, -0.0);
150 /* Test for and modf(+-NaN,&i) -> (i=+-NaN, +-NaN). */
151 TESTIT_MODF3 ( ,nan, "", isnan);
152 TESTIT_MODF3 (- ,nan, "", isnan);
155 int main()
157 foo();
159 return 0;