OSDN Git Service

* gcc.dg/torture/builtin-explog-1.c (PREC): Make it the same
[pf3gnuchains/gcc-fork.git] / gcc / testsuite / gcc.dg / torture / builtin-explog-1.c
1 /* Copyright (C) 2003  Free Software Foundation.
2
3    Verify that built-in math function constant folding of log & exp is
4    correctly performed by the compiler.
5
6    Written by Kaveh Ghazi, 2003-09-05.  */
7
8 /* { dg-do link } */
9 /* { dg-options "-ffast-math" } */
10
11 /* Define "e" with as many bits as found in builtins.c:dconste.  */
12 #define M_E  2.7182818284590452353602874713526624977572470936999595749669676277241
13 #define M_EF 2.7182818284590452353602874713526624977572470936999595749669676277241F
14 #define M_EL 2.7182818284590452353602874713526624977572470936999595749669676277241L
15 /* Precision for comparison tests.  */
16 #define PREC  (sizeof (float) < sizeof (double) ? 0.0000001 : PRECF)
17 #define PRECF 0.0001F
18 #define PRECL (sizeof (float) < sizeof (long double)    \
19                ? 0.0000000000001L : PRECF)
20 #define PROTOTYPE(FN) extern double FN(double); extern float FN##f(float); \
21   extern long double FN##l(long double);
22 #define PROTOTYPE2(FN) extern double FN(double, double); \
23   extern float FN##f(float, float); \
24   extern long double FN##l(long double, long double);
25
26 PROTOTYPE(exp)
27 PROTOTYPE(exp2)
28 PROTOTYPE(exp10)
29 PROTOTYPE(log)
30 PROTOTYPE(log2)
31 PROTOTYPE(log10)
32 PROTOTYPE(pow10)
33 PROTOTYPE(sqrt)
34 PROTOTYPE(cbrt)
35 PROTOTYPE2(pow)
36
37 void test(double d1, double d2, float f1, float f2,
38           long double ld1, long double ld2)
39 {
40 #define LOG_1(LOG) \
41  extern void link_failure_##LOG##_1(void); \
42  if (LOG(1.0) != 0.0 || LOG##f(1.0F) != 0.0F || LOG##l(1.0L) != 0.0L) \
43     link_failure_##LOG##_1()
44
45   LOG_1(log);
46   LOG_1(log2);
47   LOG_1(log10);
48   
49 #define LOG_N(LOG, BASE) \
50  extern void link_failure_##LOG##_N(void); \
51  if (LOG(BASE) != 1.0 || LOG##f(BASE##F) != 1.0F || LOG##l(BASE##L) != 1.0L) \
52     link_failure_##LOG##_N()
53
54   LOG_N(log, M_E);
55   LOG_N(log2, 2.0);
56   LOG_N(log10, 10.0);
57
58 #define LOGEXP_SAME(LOG, EXP) \
59  extern void link_failure_##LOG##_##EXP##_same(void); \
60  if (LOG(EXP(d1)) != d1 || LOG##f(EXP##f(f1)) != f1 \
61   || LOG##l(EXP##l(ld1)) != ld1) link_failure_##LOG##_##EXP##_same()
62
63   LOGEXP_SAME(log,exp);
64   LOGEXP_SAME(log2,exp2);
65   LOGEXP_SAME(log10,exp10);
66   LOGEXP_SAME(log10,pow10);
67
68 #define LOGEXP(LOG, EXP, BASE) \
69  extern void link_failure_##LOG##_##EXP(void); \
70  if (LOG(EXP(d1)) != d1*LOG(BASE) || LOG##f(EXP##f(f1)) != f1*LOG##f(BASE##F) \
71   || LOG##l(EXP##l(ld1)) != ld1*LOG##l(BASE##L)) link_failure_##LOG##_##EXP()
72
73   LOGEXP(log,exp,M_E);
74   LOGEXP(log,exp2,2.0);
75   LOGEXP(log,exp10,10.0);
76   LOGEXP(log,pow10,10.0);
77   LOGEXP(log2,exp,M_E);
78   LOGEXP(log2,exp2,2.0);
79   LOGEXP(log2,exp10,10.0);
80   LOGEXP(log2,pow10,10.0);
81   LOGEXP(log10,exp,M_E);
82   LOGEXP(log10,exp2,2.0);
83   LOGEXP(log10,exp10,10.0);
84   LOGEXP(log10,pow10,10.0);
85   
86 #define LOG_SQRT(LOG) \
87  extern void link_failure_##LOG##_sqrt(void); \
88  if (LOG(sqrt(d1)) != 0.5*LOG(d1) || LOG##f(sqrtf(f1)) != 0.5F*LOG##f(f1) \
89   || LOG##l(sqrtl(ld1)) != 0.5L*LOG##l(ld1)) link_failure_##LOG##_sqrt()
90     
91   LOG_SQRT(log);
92   LOG_SQRT(log2);
93   LOG_SQRT(log10);
94   
95 #define LOG_CBRT(LOG) \
96  extern void link_failure_##LOG##_cbrt(void); \
97  if (LOG(cbrt(d1)) != (1.0/3)*LOG(d1) \
98   || LOG##f(cbrtf(f1)) != (1.0F/3)*LOG##f(f1) \
99   || LOG##l(cbrtl(ld1)) != (1.0L/3)*LOG##l(ld1)) link_failure_##LOG##_cbrt()
100     
101   LOG_CBRT(log);
102   LOG_CBRT(log2);
103   LOG_CBRT(log10);
104   
105 #define LOGPOW(LOG, POW) \
106  extern void link_failure_##LOG##_##POW(void); \
107  if (LOG(POW(d1,d2)) != d2*LOG(d1) || LOG##f(POW##f(f1,f2)) != f2*LOG##f(f1) \
108   || LOG##l(POW##l(ld1,ld2)) != ld2*LOG##l(ld1)) link_failure_##LOG##_##POW()
109   
110   LOGPOW(log,pow);
111   LOGPOW(log2,pow);
112   LOGPOW(log10,pow);
113
114 #define EXP_0(EXP) \
115  extern void link_failure_##EXP##_0(void); \
116  if (EXP(0.0) != 1.0 || EXP##f(0.0F) != 1.0F || EXP##l(0.0L) != 1.0L) \
117   link_failure_##EXP##_0()
118
119   EXP_0(exp);
120   EXP_0(exp2);
121   EXP_0(exp10);
122   EXP_0(pow10);
123   
124 #define EXP_N(EXP, BASE) \
125  extern void link_failure_##EXP##_N(void); \
126  if (EXP(1.0) != BASE || EXP##f(1.0F) != BASE##F || EXP##l(1.0L) != BASE##L) \
127   link_failure_##EXP##_N()
128
129   EXP_N(exp, M_E);
130   EXP_N(exp2, 2.0);
131   EXP_N(exp10, 10.0);
132   EXP_N(pow10, 10.0);
133
134 #define EXP_INT(EXP, BASE) \
135  extern void link_failure_##EXP##_INT(void); \
136  if (EXP(5.0) < (BASE)*(BASE)*(BASE)*(BASE)*(BASE) - PREC \
137   || EXP(5.0) > (BASE)*(BASE)*(BASE)*(BASE)*(BASE) + PREC \
138   || EXP##f(5.0F) < (BASE##F)*(BASE##F)*(BASE##F)*(BASE##F)*(BASE##F) -PRECF \
139   || EXP##f(5.0F) > (BASE##F)*(BASE##F)*(BASE##F)*(BASE##F)*(BASE##F) +PRECF \
140   || EXP##l(5.0L) < (BASE##L)*(BASE##L)*(BASE##L)*(BASE##L)*(BASE##L) -PRECL \
141   || EXP##l(5.0L) > (BASE##L)*(BASE##L)*(BASE##L)*(BASE##L)*(BASE##L) +PRECL) \
142    link_failure_##EXP##_INT()
143
144   EXP_INT(exp, M_E);
145   EXP_INT(exp2, 2.0);
146   EXP_INT(exp10, 10.0);
147   EXP_INT(pow10, 10.0);
148
149 #define EXPLOG_SAME(EXP, LOG) \
150  extern void link_failure_##EXP##_##LOG##_same(void); \
151  if (EXP(LOG(d1)) != d1 || EXP##f(LOG##f(f1)) != f1 \
152   || EXP##l(LOG##l(ld1)) != ld1) link_failure_##EXP##_##LOG##_same()
153
154   EXPLOG_SAME(exp, log);
155   EXPLOG_SAME(exp2, log2);
156   EXPLOG_SAME(exp10, log10);
157   EXPLOG_SAME(pow10, log10);
158
159 #define EXPXEXP(EXP) \
160  extern void link_failure_##EXP##X##EXP(void); \
161  if (EXP(d1)*EXP(d2) != EXP(d1+d2) || EXP##f(f1)*EXP##f(f2) != EXP##f(f1+f2) \
162   || EXP##l(ld1)*EXP##l(ld2) != EXP##l(ld1+ld2)) link_failure_##EXP##X##EXP()
163
164   EXPXEXP(exp);
165   EXPXEXP(exp2);
166   EXPXEXP(exp10);
167   EXPXEXP(pow10);
168
169 #define DIVEXP(EXP) \
170  extern void link_failure_div1_##EXP(void); \
171  if (d1/EXP(d2) != d1*EXP(-d2) || f1/EXP##f(f2) != f1*EXP##f(-f2) \
172   || ld1/EXP##l(ld2) != ld1*EXP##l(-ld2)) link_failure_div1_##EXP(); \
173  extern void link_failure_div2_##EXP(void); \
174  if (EXP(d1)/EXP(d2) != EXP(d1-d2) || EXP##f(f1)/EXP##f(f2) != EXP##f(f1-f2) \
175   || EXP##l(ld1)/EXP##l(ld2) != EXP##l(ld1-ld2)) link_failure_div2_##EXP()
176
177   DIVEXP(exp);
178   DIVEXP(exp2);
179   DIVEXP(exp10);
180   DIVEXP(pow10);
181 }
182
183 int main (void)
184 {
185   return 0;
186 }