2014-04-15 Richard Biener <rguenther@suse.de>
[official-gcc.git] / gcc / testsuite / gcc.target / i386 / excess-precision-1.c
blob1bd3b8868bb47efa8159366b67d9c4b7ab9787e8
1 /* Excess precision tests. Test that excess precision is carried
2 through various operations. */
3 /* { dg-do run } */
4 /* { dg-options "-O2 -mfpmath=387 -fexcess-precision=standard" } */
6 #include <float.h>
8 extern void abort (void);
9 extern void exit (int);
11 volatile float f1 = 1.0f;
12 volatile float f2 = 0x1.0p-30f;
13 volatile float f3 = 0x1.0p-60f;
14 volatile double d1 = 1.0;
15 volatile double d2 = 0x1.0p-30;
16 volatile double d3 = 0x1.0p-60;
17 volatile float fadd1 = 1.0f + 0x1.0p-30f;
18 volatile double dadd2 = 1.0 + 0x1.0p-30 + 0x1.0p-60;
19 volatile long double ldadd1 = 1.0l + 0x1.0p-30l;
20 volatile long double ldadd2 = 1.0l + 0x1.0p-30l + 0x1.0p-60l;
22 void
23 test_add (void)
25 if (f1 + f2 != ldadd1)
26 abort ();
27 if (f1 + f2 + f3 != ldadd2)
28 abort ();
29 if (d1 + d2 != ldadd1)
30 abort ();
31 if (d1 + d2 + d3 != ldadd2)
32 abort ();
33 if (f1 + d2 + f3 != ldadd2)
34 abort ();
35 if (f1 + f2 == fadd1)
36 abort ();
37 if (f1 + f2 <= fadd1)
38 abort ();
39 if (f1 + f2 < fadd1)
40 abort ();
41 if (sizeof(long double) > sizeof(double)) {
42 if ( d1 + d2 + d3 == dadd2)
43 abort ();
44 if (!(d1 + d2 + d3 > dadd2))
45 abort ();
46 if (!(d1 + d2 + d3 >= dadd2))
47 abort ();
49 else {
50 if ( d1 + d2 + d3 != dadd2 )
51 abort();
52 if ( d1 + d2 + d3 < dadd2 )
53 abort();
54 if ( d1 + d2 + d3 > dadd2 )
55 abort();
59 volatile long double ldsub1 = 1.0l - 0x1.0p-30l;
60 volatile long double ldsub2 = 1.0l - 0x1.0p-30l - 0x1.0p-60l;
62 void
63 test_sub (void)
65 if (f1 - f2 != ldsub1)
66 abort ();
67 if (f1 - f2 - f3 != ldsub2)
68 abort ();
69 if (d1 - d2 != ldsub1)
70 abort ();
71 if (d1 - d2 - d3 != ldsub2)
72 abort ();
73 if (f1 - d2 - f3 != ldsub2)
74 abort ();
75 if (+(f1 - d2 - f3) != ldsub2)
76 abort ();
77 if (-(f1 - d2 - f3) != -ldsub2)
78 abort ();
81 volatile float flt_min = FLT_MIN;
82 volatile double dbl_min = DBL_MIN;
83 volatile long double flt_min2 = (long double)FLT_MIN * (long double)FLT_MIN;
84 volatile long double dbl_min3 = (long double)DBL_MIN * (long double)DBL_MIN * (long double)DBL_MIN;
86 void
87 test_mul (void)
89 if (flt_min * flt_min != flt_min2)
90 abort ();
91 if (flt_min * flt_min == 0)
92 abort ();
93 if (flt_min * flt_min == 0)
94 abort ();
95 if (!(flt_min * flt_min))
96 abort ();
97 if (dbl_min * dbl_min * dbl_min != dbl_min3)
98 abort ();
99 if ((long double)(dbl_min * dbl_min * dbl_min) != dbl_min3)
100 abort ();
101 if ((0, dbl_min * dbl_min * dbl_min) != dbl_min3)
102 abort ();
103 if (sizeof(long double) > sizeof(double) ) {
104 if (dbl_min * dbl_min * dbl_min == 0)
105 abort ();
106 if ((flt_min * flt_min ? dbl_min * dbl_min * dbl_min : 0) == 0)
107 abort ();
109 else {
110 if (dbl_min * dbl_min * dbl_min != 0)
111 abort ();
112 if ((flt_min * flt_min ? dbl_min * dbl_min * dbl_min : 1) != 0)
113 abort ();
115 if ((flt_min * flt_min ? : 0) == 0)
116 abort ();
119 volatile float f4 = 0x1.0p100f;
120 volatile double d4 = 0x1.0p100;
121 volatile long double flt_div = 0x1.0p100l / (long double) FLT_MIN;
122 volatile long double dbl_div = 0x1.0p100l / (long double) DBL_MIN;
124 void
125 test_div (void)
127 if (f4 / flt_min != flt_div)
128 abort ();
129 if (d4 / dbl_min != dbl_div)
130 abort ();
133 volatile float f5 = 0x1.0p30;
135 void
136 test_cast (void)
138 if ((int)(f1 + f5) != 0x40000001)
139 abort ();
142 volatile float _Complex f1c = 1.0f + 1.0if;
143 volatile float _Complex f2c = 0x1.0p-30f + 0x1.0p-31if;
144 volatile float _Complex f3c = 0x1.0p-60f + 0x1.0p-59if;
145 volatile double _Complex d1c = 1.0 + 1.0i;
146 volatile double _Complex d2c = 0x1.0p-30 + 0x1.0p-31i;
147 volatile double _Complex d3c = 0x1.0p-60 + 0x1.0p-59i;
148 volatile long double _Complex ldadd1c = 1.0l + 0x1.0p-30l + 1.0il + 0x1.0p-31il;
149 volatile long double _Complex ldadd2c = 1.0l + 0x1.0p-30l + 0x1.0p-60l + 1.0il + 0x1.0p-31il + 0x1.0p-59il;
150 volatile long double _Complex ldadd2cc = 1.0l + 0x1.0p-30l + 0x1.0p-60l - 1.0il - 0x1.0p-31il - 0x1.0p-59il;
151 volatile float _Complex flt_minc = FLT_MIN;
152 volatile double _Complex dbl_minc = DBL_MIN;
153 volatile float _Complex f4c = 0x1.0p100f;
154 volatile double _Complex d4c = 0x1.0p100;
156 void
157 test_complex (void)
159 if (f1c + f2c != ldadd1c)
160 abort ();
161 if (f1c + f2c + f3c != ldadd2c)
162 abort ();
163 if (d1c + d2c != ldadd1c)
164 abort ();
165 if (d1c + d2c + d3c != ldadd2c)
166 abort ();
167 if (__real__ (f1c + f2c + f3c) != ldadd2)
168 abort ();
169 if (__imag__ (d1c + d2c + d3c) != __imag__ ldadd2c)
170 abort ();
171 if (~(d1c + d2c + d3c) != ldadd2cc)
172 abort ();
173 /* The following call libgcc functions and so would fail unless they
174 call those for long double. */
175 if (flt_minc * flt_minc != flt_min2)
176 abort ();
177 if (dbl_minc * dbl_minc * dbl_minc != dbl_min3)
178 abort ();
179 if (f4c / flt_minc != flt_div)
180 abort ();
181 if (d4c / dbl_minc != dbl_div)
182 abort ();
183 if (f4 / flt_minc != flt_div)
184 abort ();
185 if (d4 / dbl_minc != dbl_div)
186 abort ();
187 if (f4c / flt_min != flt_div)
188 abort ();
189 if (d4c / dbl_min != dbl_div)
190 abort ();
194 main (void)
196 test_add ();
197 test_sub ();
198 test_mul ();
199 test_div ();
200 test_cast ();
201 test_complex ();
202 exit (0);