OSDN Git Service

aa9906fb442d53b16d3568ebb6b2e4d1ed9dc809
[pf3gnuchains/gcc-fork.git] / gcc / testsuite / gcc.dg / torture / builtin-ldexp-1.c
1 /* Copyright (C) 2007  Free Software Foundation.
2
3    Verify that built-in folding of ldexp et al. is correctly performed
4    by the compiler.
5
6    Origin: Kaveh R. Ghazi,  February 17, 2007.  */
7
8 /* { dg-do link } */
9
10 extern void link_error(int);
11
12 /* Return TRUE if the sign of X != sign of Y.  This is important when
13    comparing signed zeros.  */
14 #define CKSGN_F(X,Y) \
15   (__builtin_copysignf(1.0F,(X)) != __builtin_copysignf(1.0F,(Y)))
16 #define CKSGN(X,Y) \
17   (__builtin_copysign(1.0,(X)) != __builtin_copysign(1.0,(Y)))
18 #define CKSGN_L(X,Y) \
19   (__builtin_copysignl(1.0L,(X)) != __builtin_copysignl(1.0L,(Y)))
20
21 /* Test that FUNC(ARG1,ARG2) == RES.  Check the sign for -0.0.  */
22 #define TESTIT(FUNC,ARG1,ARG2,RES) do { \
23   if (__builtin_##FUNC##f(ARG1##f,ARG2) != RES##f \
24       || CKSGN(__builtin_##FUNC##f(ARG1##f,ARG2),RES##f)) \
25     link_error(__LINE__); \
26   if (__builtin_##FUNC(ARG1,ARG2) != RES \
27       || CKSGN(__builtin_##FUNC(ARG1,ARG2),RES)) \
28     link_error(__LINE__); \
29   if (__builtin_##FUNC##l(ARG1##l,ARG2) != RES##l \
30       || CKSGN(__builtin_##FUNC##l(ARG1##l,ARG2),RES##l)) \
31     link_error(__LINE__); \
32   } while (0)
33
34 /* Test that (long)FUNC(ARG1,ARG2) == (long)RES.  The cast is
35    necessary when RES is not a constant.  */
36 #define TESTIT2(FUNC,ARG1,ARG2,RES) do { \
37   if ((long)__builtin_##FUNC##f(ARG1##f,ARG2) != (long)RES##f) \
38     link_error(__LINE__); \
39   if ((long)__builtin_##FUNC(ARG1,ARG2) != (long)RES) \
40     link_error(__LINE__); \
41   if ((long)__builtin_##FUNC##l(ARG1##l,ARG2) != (long)RES##l) \
42     link_error(__LINE__); \
43   } while (0)
44
45 /* Test that FUNCRES(FUNC(NEG FUNCARG(ARGARG),ARG2)) is false.  Check
46    the sign as well.  */
47 #define TESTIT3(FUNC,NEG,FUNCARG,ARGARG,ARG2,FUNCRES) do { \
48   if (!__builtin_##FUNCRES##f(__builtin_##FUNC##f(NEG __builtin_##FUNCARG##f(ARGARG),ARG2)) \
49       || CKSGN(__builtin_##FUNC##f(NEG __builtin_##FUNCARG##f(ARGARG),ARG2), NEG __builtin_##FUNCARG##f(ARGARG))) \
50     link_error(__LINE__); \
51   if (!__builtin_##FUNCRES(__builtin_##FUNC(NEG __builtin_##FUNCARG(ARGARG),ARG2)) \
52       || CKSGN(__builtin_##FUNC(NEG __builtin_##FUNCARG(ARGARG),ARG2), NEG __builtin_##FUNCARG(ARGARG))) \
53     link_error(__LINE__); \
54   if (!__builtin_##FUNCRES##l(__builtin_##FUNC##l(NEG __builtin_##FUNCARG##l(ARGARG),ARG2)) \
55       || CKSGN(__builtin_##FUNC##l(NEG __builtin_##FUNCARG##l(ARGARG),ARG2), NEG __builtin_##FUNCARG##l(ARGARG))) \
56     link_error(__LINE__); \
57   } while (0)
58
59 /* Using foo==MIN/MAX float values, test that FUNC(foo,EXP) == foo*exp2(EXP),
60    and also that FUNC(foo,-EXP) == foo*exp2(-EXP).  */
61 #define TESTIT4(FUNC,EXP) do { \
62   if (__builtin_##FUNC##f(__FLT_MIN__,EXP) != __FLT_MIN__*__builtin_exp2f(EXP)) \
63     link_error(__LINE__); \
64   if (__builtin_##FUNC##f(-__FLT_MIN__,EXP) != -__FLT_MIN__*__builtin_exp2f(EXP)) \
65     link_error(__LINE__); \
66   if (__builtin_##FUNC(__DBL_MIN__,EXP) != __DBL_MIN__*__builtin_exp2(EXP)) \
67     link_error(__LINE__); \
68   if (__builtin_##FUNC(-__DBL_MIN__,EXP) != -__DBL_MIN__*__builtin_exp2(EXP)) \
69     link_error(__LINE__); \
70   if (__builtin_##FUNC##l(__LDBL_MIN__,EXP) != __LDBL_MIN__*__builtin_exp2l(EXP)) \
71     link_error(__LINE__); \
72   if (__builtin_##FUNC##l(-__LDBL_MIN__,EXP) != -__LDBL_MIN__*__builtin_exp2l(EXP)) \
73     link_error(__LINE__); \
74   if (__builtin_##FUNC##f(__FLT_MAX__,-EXP) != __FLT_MAX__*__builtin_exp2f(-EXP)) \
75     link_error(__LINE__); \
76   if (__builtin_##FUNC##f(-__FLT_MAX__,-EXP) != -__FLT_MAX__*__builtin_exp2f(-EXP)) \
77     link_error(__LINE__); \
78   if (__builtin_##FUNC(__DBL_MAX__,-EXP) != __DBL_MAX__*__builtin_exp2(-EXP)) \
79     link_error(__LINE__); \
80   if (__builtin_##FUNC(-__DBL_MAX__,-EXP) != -__DBL_MAX__*__builtin_exp2(-EXP)) \
81     link_error(__LINE__); \
82   if (__builtin_##FUNC##l(__LDBL_MAX__,-EXP) != __LDBL_MAX__*__builtin_exp2l(-EXP)) \
83     link_error(__LINE__); \
84   if (__builtin_##FUNC##l(-__LDBL_MAX__,-EXP) != -__LDBL_MAX__*__builtin_exp2l(-EXP)) \
85     link_error(__LINE__); \
86   } while (0)
87
88 void __attribute__ ((__noinline__))
89 foo(float xf, double x, long double xl, int i, long l)
90 {
91   /* f(0.0, i) -> 0.0 and f(-0.0, i) -> -0.0.  */
92   TESTIT (ldexp, 0.0, i, 0.0);
93   TESTIT (ldexp, -0.0, i, -0.0);
94   TESTIT (scalbn, 0.0, i, 0.0);
95   TESTIT (scalbn, -0.0, i, -0.0);
96   TESTIT (scalbln, 0.0, l, 0.0);
97   TESTIT (scalbln, -0.0, l, -0.0);
98   
99   /* f(x,0) -> x.  */
100   TESTIT2 (ldexp, x, 0, x);
101   TESTIT2 (scalbn, x, 0, x);
102   TESTIT2 (scalbln, x, 0, x);
103
104   /* f(Inf,i) -> Inf and f(NaN,i) -> NaN.  */
105   TESTIT3 (ldexp, , inf, , i, isinf);
106   TESTIT3 (ldexp, -, inf, , i, isinf);
107   TESTIT3 (ldexp, , nan, "", i, isnan);
108   TESTIT3 (ldexp, -, nan, "", i, isnan);
109
110   TESTIT3 (scalbn, , inf, , i, isinf);
111   TESTIT3 (scalbn, -, inf, , i, isinf);
112   TESTIT3 (scalbn, , nan, "", i, isnan);
113   TESTIT3 (scalbn, -, nan, "", i, isnan);
114
115   TESTIT3 (scalbln, , inf, , i, isinf);
116   TESTIT3 (scalbln, -, inf, , i, isinf);
117   TESTIT3 (scalbln, , nan, "", i, isnan);
118   TESTIT3 (scalbln, -, nan, "", i, isnan);
119
120   /* Evaluate when both arguments are constant.  */
121   TESTIT (ldexp, 5.0, 3, 40.0);
122   TESTIT (ldexp, -5.0, 3, -40.0);
123   TESTIT (ldexp, 5.0, -3, 0.625);
124   TESTIT (ldexp, -5.0, -3, -0.625);
125
126   TESTIT (ldexp, 1000.0, 5, 32000.0);
127   TESTIT (ldexp, -1000.0, 5, -32000.0);
128   TESTIT (ldexp, 1000.0, -5, 31.25);
129   TESTIT (ldexp, -1000.0, -5, -31.25);
130
131   /* f(x,N) -> x*exp2(N), using MIN/MAX constants for x and constant N.  */
132   TESTIT4 (ldexp, 1);
133   TESTIT4 (ldexp, 2);
134   TESTIT4 (ldexp, 3);
135   TESTIT4 (ldexp, 5);
136   TESTIT4 (ldexp, 9);
137   TESTIT4 (ldexp, 10);
138   TESTIT4 (ldexp, 12);
139   TESTIT4 (ldexp, 18);
140   TESTIT4 (ldexp, 25);
141   TESTIT4 (ldexp, 50);
142   TESTIT4 (ldexp, 75);
143   TESTIT4 (ldexp, 100);
144   TESTIT4 (ldexp, 123);
145
146   /* These are folded when float radix is two.  */
147 #if __FLT_RADIX__ == 2
148   TESTIT (scalbn, 5.0, 3, 40.0);
149   TESTIT (scalbn, -5.0, 3, -40.0);
150   TESTIT (scalbn, 5.0, -3, 0.625);
151   TESTIT (scalbn, -5.0, -3, -0.625);
152
153   TESTIT (scalbn, 1000.0, 5, 32000.0);
154   TESTIT (scalbn, -1000.0, 5, -32000.0);
155   TESTIT (scalbn, 1000.0, -5, 31.25);
156   TESTIT (scalbn, -1000.0, -5, -31.25);
157
158   TESTIT4 (scalbn, 1);
159   TESTIT4 (scalbn, 2);
160   TESTIT4 (scalbn, 3);
161   TESTIT4 (scalbn, 5);
162   TESTIT4 (scalbn, 9);
163   TESTIT4 (scalbn, 10);
164   TESTIT4 (scalbn, 12);
165   TESTIT4 (scalbn, 18);
166   TESTIT4 (scalbn, 25);
167   TESTIT4 (scalbn, 50);
168   TESTIT4 (scalbn, 75);
169   TESTIT4 (scalbn, 100);
170   TESTIT4 (scalbn, 123);
171
172   TESTIT (scalbln, 5.0, 3, 40.0);
173   TESTIT (scalbln, -5.0, 3, -40.0);
174   TESTIT (scalbln, 5.0, -3, 0.625);
175   TESTIT (scalbln, -5.0, -3, -0.625);
176
177   TESTIT (scalbln, 1000.0, 5, 32000.0);
178   TESTIT (scalbln, -1000.0, 5, -32000.0);
179   TESTIT (scalbln, 1000.0, -5, 31.25);
180   TESTIT (scalbln, -1000.0, -5, -31.25);
181
182   TESTIT4 (scalbln, 1);
183   TESTIT4 (scalbln, 2);
184   TESTIT4 (scalbln, 3);
185   TESTIT4 (scalbln, 5);
186   TESTIT4 (scalbln, 9);
187   TESTIT4 (scalbln, 10);
188   TESTIT4 (scalbln, 12);
189   TESTIT4 (scalbln, 18);
190   TESTIT4 (scalbln, 25);
191   TESTIT4 (scalbln, 50);
192   TESTIT4 (scalbln, 75);
193   TESTIT4 (scalbln, 100);
194   TESTIT4 (scalbln, 123);
195 #endif
196 }
197
198 int main()
199 {
200   foo (0, 0, 0, 0, 0);
201   
202   return 0;
203 }