1 /* Test front-end conversions, optimizer conversions, and run-time
2    conversions between different arithmetic types.
3 
4    Constants are specified in a non-obvious way to make them work for
5    any word size.  Their value on a 32-bit machine is indicated in the
6    comments.
7 
8    Note that this code is NOT intended for testing of accuracy of fp
9    conversions.  */
10 
11 float
u2f(u)12 u2f(u)
13      unsigned int u;
14 {
15   return u;
16 }
17 
18 double
u2d(u)19 u2d(u)
20      unsigned int u;
21 {
22   return u;
23 }
24 
25 long double
u2ld(u)26 u2ld(u)
27      unsigned int u;
28 {
29   return u;
30 }
31 
32 float
s2f(s)33 s2f(s)
34      int s;
35 {
36   return s;
37 }
38 
39 double
s2d(s)40 s2d(s)
41      int s;
42 {
43   return s;
44 }
45 
46 long double
s2ld(s)47 s2ld(s)
48      int s;
49 {
50   return s;
51 }
52 
53 int
fnear(float x,float y)54 fnear (float x, float y)
55 {
56   float t = x - y;
57   return t == 0 || x / t > 1000000.0;
58 }
59 
60 int
dnear(double x,double y)61 dnear (double x, double y)
62 {
63   double t = x - y;
64   return t == 0 || x / t > 100000000000000.0;
65 }
66 
67 int
ldnear(long double x,long double y)68 ldnear (long double x, long double y)
69 {
70   long double t = x - y;
71   return t == 0 || x / t > 100000000000000000000000000000000.0;
72 }
73 
test_integer_to_float()74 test_integer_to_float()
75 {
76   if (u2f(0U) != (float) 0U)				/* 0 */
77     abort();
78   if (!fnear (u2f(~0U), (float) ~0U))			/* 0xffffffff */
79     abort();
80   if (!fnear (u2f((~0U) >> 1), (float) ((~0U) >> 1)))	/* 0x7fffffff */
81     abort();
82   if (u2f(~((~0U) >> 1)) != (float) ~((~0U) >> 1))	/* 0x80000000 */
83     abort();
84 
85   if (u2d(0U) != (double) 0U)				/* 0 */
86     abort();
87   if (!dnear (u2d(~0U), (double) ~0U))			/* 0xffffffff */
88     abort();
89   if (!dnear (u2d((~0U) >> 1),(double) ((~0U) >> 1)))	/* 0x7fffffff */
90     abort();
91   if (u2d(~((~0U) >> 1)) != (double) ~((~0U) >> 1))	/* 0x80000000 */
92     abort();
93 
94   if (u2ld(0U) != (long double) 0U)			/* 0 */
95     abort();
96   if (!ldnear (u2ld(~0U), (long double) ~0U))		/* 0xffffffff */
97     abort();
98   if (!ldnear (u2ld((~0U) >> 1),(long double) ((~0U) >> 1)))	/* 0x7fffffff */
99     abort();
100   if (u2ld(~((~0U) >> 1)) != (long double) ~((~0U) >> 1))	/* 0x80000000 */
101     abort();
102 
103   if (s2f(0) != (float) 0)				/* 0 */
104     abort();
105   if (!fnear (s2f(~0), (float) ~0))			/* 0xffffffff */
106     abort();
107   if (!fnear (s2f((int)((~0U) >> 1)), (float)(int)((~0U) >> 1))) /* 0x7fffffff */
108     abort();
109   if (s2f((int)(~((~0U) >> 1))) != (float)(int)~((~0U) >> 1)) /* 0x80000000 */
110     abort();
111 
112   if (s2d(0) != (double) 0)				/* 0 */
113     abort();
114   if (!dnear (s2d(~0), (double) ~0))			/* 0xffffffff */
115     abort();
116   if (!dnear (s2d((int)((~0U) >> 1)), (double)(int)((~0U) >> 1))) /* 0x7fffffff */
117     abort();
118   if (s2d((int)~((~0U) >> 1)) != (double)(int)~((~0U) >> 1)) /* 0x80000000 */
119     abort();
120 
121   if (s2ld(0) != (long double) 0)			/* 0 */
122     abort();
123   if (!ldnear (s2ld(~0), (long double) ~0))		/* 0xffffffff */
124     abort();
125   if (!ldnear (s2ld((int)((~0U) >> 1)), (long double)(int)((~0U) >> 1))) /* 0x7fffffff */
126     abort();
127   if (s2ld((int)~((~0U) >> 1)) != (long double)(int)~((~0U) >> 1)) /* 0x80000000 */
128     abort();
129 }
130 
131 #if __GNUC__
132 float
ull2f(u)133 ull2f(u)
134      unsigned long long int u;
135 {
136   return u;
137 }
138 
139 double
ull2d(u)140 ull2d(u)
141      unsigned long long int u;
142 {
143   return u;
144 }
145 
146 long double
ull2ld(u)147 ull2ld(u)
148      unsigned long long int u;
149 {
150   return u;
151 }
152 
153 float
sll2f(s)154 sll2f(s)
155      long long int s;
156 {
157   return s;
158 }
159 
160 double
sll2d(s)161 sll2d(s)
162      long long int s;
163 {
164   return s;
165 }
166 
167 long double
sll2ld(s)168 sll2ld(s)
169      long long int s;
170 {
171   return s;
172 }
173 
test_longlong_integer_to_float()174 test_longlong_integer_to_float()
175 {
176   if (ull2f(0ULL) != (float) 0ULL)			/* 0 */
177     abort();
178   if (ull2f(~0ULL) != (float) ~0ULL)			/* 0xffffffff */
179     abort();
180   if (ull2f((~0ULL) >> 1) != (float) ((~0ULL) >> 1))	/* 0x7fffffff */
181     abort();
182   if (ull2f(~((~0ULL) >> 1)) != (float) ~((~0ULL) >> 1)) /* 0x80000000 */
183     abort();
184 
185   if (ull2d(0ULL) != (double) 0ULL)			/* 0 */
186     abort();
187 #if __HAVE_68881__
188   /* Some 68881 targets return values in fp0, with excess precision.
189      But the compile-time conversion to double works correctly.  */
190   if (! dnear (ull2d(~0ULL), (double) ~0ULL))		/* 0xffffffff */
191     abort();
192   if (! dnear (ull2d((~0ULL) >> 1), (double) ((~0ULL) >> 1))) /* 0x7fffffff */
193     abort();
194 #else
195   if (ull2d(~0ULL) != (double) ~0ULL)			/* 0xffffffff */
196     abort();
197   if (ull2d((~0ULL) >> 1) != (double) ((~0ULL) >> 1))	/* 0x7fffffff */
198     abort();
199 #endif
200   if (ull2d(~((~0ULL) >> 1)) != (double) ~((~0ULL) >> 1)) /* 0x80000000 */
201     abort();
202 
203   if (ull2ld(0ULL) != (long double) 0ULL)		/* 0 */
204     abort();
205   if (ull2ld(~0ULL) != (long double) ~0ULL)		/* 0xffffffff */
206     abort();
207   if (ull2ld((~0ULL) >> 1) != (long double) ((~0ULL) >> 1))	/* 0x7fffffff */
208     abort();
209   if (ull2ld(~((~0ULL) >> 1)) != (long double) ~((~0ULL) >> 1)) /* 0x80000000 */
210     abort();
211 
212   if (sll2f(0LL) != (float) 0LL)			/* 0 */
213     abort();
214   if (sll2f(~0LL) != (float) ~0LL)			/* 0xffffffff */
215     abort();
216   if (! fnear (sll2f((long long int)((~0ULL) >> 1)), (float)(long long int)((~0ULL) >> 1))) /* 0x7fffffff */
217     abort();
218   if (sll2f((long long int)(~((~0ULL) >> 1))) != (float)(long long int)~((~0ULL) >> 1)) /* 0x80000000 */
219     abort();
220 
221   if (sll2d(0LL) != (double) 0LL)			/* 0 */
222     abort();
223   if (sll2d(~0LL) != (double) ~0LL)			/* 0xffffffff */
224     abort();
225   if (!dnear (sll2d((long long int)((~0ULL) >> 1)), (double)(long long int)((~0ULL) >> 1))) /* 0x7fffffff */
226     abort();
227   if (! dnear (sll2d((long long int)~((~0ULL) >> 1)), (double)(long long int)~((~0ULL) >> 1))) /* 0x80000000 */
228     abort();
229 
230   if (sll2ld(0LL) != (long double) 0LL)			/* 0 */
231     abort();
232   if (sll2ld(~0LL) != (long double) ~0LL)		/* 0xffffffff */
233     abort();
234   if (!ldnear (sll2ld((long long int)((~0ULL) >> 1)), (long double)(long long int)((~0ULL) >> 1))) /* 0x7fffffff */
235     abort();
236   if (! ldnear (sll2ld((long long int)~((~0ULL) >> 1)), (long double)(long long int)~((~0ULL) >> 1))) /* 0x80000000 */
237     abort();
238 }
239 #endif
240 
241 unsigned int
f2u(float f)242 f2u(float f)
243 {
244   return (unsigned) f;
245 }
246 
247 unsigned int
d2u(double d)248 d2u(double d)
249 {
250   return (unsigned) d;
251 }
252 
253 unsigned int
ld2u(long double d)254 ld2u(long double d)
255 {
256   return (unsigned) d;
257 }
258 
259 int
f2s(float f)260 f2s(float f)
261 {
262   return (int) f;
263 }
264 
265 int
d2s(double d)266 d2s(double d)
267 {
268   return (int) d;
269 }
270 
271 int
ld2s(long double d)272 ld2s(long double d)
273 {
274   return (int) d;
275 }
276 
test_float_to_integer()277 test_float_to_integer()
278 {
279   if (f2u(0.0) != 0)
280     abort();
281   if (f2u(0.999) != 0)
282     abort();
283   if (f2u(1.0) != 1)
284     abort();
285   if (f2u(1.99) != 1)
286     abort();
287 #ifdef __SPU__
288   /* SPU float rounds towards zero.  */
289   if (f2u((float) ((~0U) >> 1)) != 0x7fffff80)
290     abort();
291 #else
292   if (f2u((float) ((~0U) >> 1)) != (~0U) >> 1 &&	/* 0x7fffffff */
293       f2u((float) ((~0U) >> 1)) != ((~0U) >> 1) + 1)
294     abort();
295 #endif
296   if (f2u((float) ~((~0U) >> 1)) != ~((~0U) >> 1))	/* 0x80000000 */
297     abort();
298 
299  /* These tests require double precision, so for hosts that don't offer
300     that much precision, just ignore these test.  */
301  if (sizeof (double) >= 8) {
302   if (d2u(0.0) != 0)
303     abort();
304   if (d2u(0.999) != 0)
305     abort();
306   if (d2u(1.0) != 1)
307     abort();
308   if (d2u(1.99) != 1)
309     abort();
310   if (d2u((double) (~0U)) != ~0U)			/* 0xffffffff */
311     abort();
312   if (d2u((double) ((~0U) >> 1)) != (~0U) >> 1)		/* 0x7fffffff */
313     abort();
314   if (d2u((double) ~((~0U) >> 1)) != ~((~0U) >> 1))	/* 0x80000000 */
315     abort();
316  }
317 
318  /* These tests require long double precision, so for hosts that don't offer
319     that much precision, just ignore these test.  */
320  if (sizeof (long double) >= 8) {
321   if (ld2u(0.0) != 0)
322     abort();
323   if (ld2u(0.999) != 0)
324     abort();
325   if (ld2u(1.0) != 1)
326     abort();
327   if (ld2u(1.99) != 1)
328     abort();
329   if (ld2u((long double) (~0U)) != ~0U)			/* 0xffffffff */
330     abort();
331   if (ld2u((long double) ((~0U) >> 1)) != (~0U) >> 1)	/* 0x7fffffff */
332     abort();
333   if (ld2u((long double) ~((~0U) >> 1)) != ~((~0U) >> 1))	/* 0x80000000 */
334     abort();
335  }
336 
337   if (f2s(0.0) != 0)
338     abort();
339   if (f2s(0.999) != 0)
340     abort();
341   if (f2s(1.0) != 1)
342     abort();
343   if (f2s(1.99) != 1)
344     abort();
345   if (f2s(-0.999) != 0)
346     abort();
347   if (f2s(-1.0) != -1)
348     abort();
349   if (f2s(-1.99) != -1)
350     abort();
351   if (f2s((float)(int)~((~0U) >> 1)) != (int)~((~0U) >> 1)) /* 0x80000000 */
352     abort();
353 
354  /* These tests require double precision, so for hosts that don't offer
355     that much precision, just ignore these test.  */
356  if (sizeof (double) >= 8) {
357   if (d2s(0.0) != 0)
358     abort();
359   if (d2s(0.999) != 0)
360     abort();
361   if (d2s(1.0) != 1)
362     abort();
363   if (d2s(1.99) != 1)
364     abort();
365   if (d2s(-0.999) != 0)
366     abort();
367   if (d2s(-1.0) != -1)
368     abort();
369   if (d2s(-1.99) != -1)
370     abort();
371   if (d2s((double) ((~0U) >> 1)) != (~0U) >> 1)		/* 0x7fffffff */
372     abort();
373   if (d2s((double)(int)~((~0U) >> 1)) != (int)~((~0U) >> 1)) /* 0x80000000 */
374     abort();
375  }
376 
377  /* These tests require long double precision, so for hosts that don't offer
378     that much precision, just ignore these test.  */
379  if (sizeof (long double) >= 8) {
380   if (ld2s(0.0) != 0)
381     abort();
382   if (ld2s(0.999) != 0)
383     abort();
384   if (ld2s(1.0) != 1)
385     abort();
386   if (ld2s(1.99) != 1)
387     abort();
388   if (ld2s(-0.999) != 0)
389     abort();
390   if (ld2s(-1.0) != -1)
391     abort();
392   if (ld2s(-1.99) != -1)
393     abort();
394   if (ld2s((long double) ((~0U) >> 1)) != (~0U) >> 1)		/* 0x7fffffff */
395     abort();
396   if (ld2s((long double)(int)~((~0U) >> 1)) != (int)~((~0U) >> 1)) /* 0x80000000 */
397     abort();
398  }
399 }
400 
401 #if __GNUC__
402 unsigned long long int
f2ull(float f)403 f2ull(float f)
404 {
405   return (unsigned long long int) f;
406 }
407 
408 unsigned long long int
d2ull(double d)409 d2ull(double d)
410 {
411   return (unsigned long long int) d;
412 }
413 
414 unsigned long long int
ld2ull(long double d)415 ld2ull(long double d)
416 {
417   return (unsigned long long int) d;
418 }
419 
420 long long int
f2sll(float f)421 f2sll(float f)
422 {
423   return (long long int) f;
424 }
425 
426 long long int
d2sll(double d)427 d2sll(double d)
428 {
429   return (long long int) d;
430 }
431 
432 long long int
ld2sll(long double d)433 ld2sll(long double d)
434 {
435   return (long long int) d;
436 }
437 
test_float_to_longlong_integer()438 test_float_to_longlong_integer()
439 {
440   if (f2ull(0.0) != 0LL)
441     abort();
442   if (f2ull(0.999) != 0LL)
443     abort();
444   if (f2ull(1.0) != 1LL)
445     abort();
446   if (f2ull(1.99) != 1LL)
447     abort();
448 #ifdef __SPU__
449   /* SPU float rounds towards zero.  */
450   if (f2ull((float) ((~0ULL) >> 1)) != 0x7fffff8000000000ULL)
451     abort();
452 #else
453   if (f2ull((float) ((~0ULL) >> 1)) != (~0ULL) >> 1 &&	/* 0x7fffffff */
454       f2ull((float) ((~0ULL) >> 1)) != ((~0ULL) >> 1) + 1)
455     abort();
456 #endif
457   if (f2ull((float) ~((~0ULL) >> 1)) != ~((~0ULL) >> 1)) /* 0x80000000 */
458     abort();
459 
460   if (d2ull(0.0) != 0LL)
461     abort();
462   if (d2ull(0.999) != 0LL)
463     abort();
464   if (d2ull(1.0) != 1LL)
465     abort();
466   if (d2ull(1.99) != 1LL)
467     abort();
468   if (d2ull((double) ((~0ULL) >> 1)) != (~0ULL) >> 1 &&	/* 0x7fffffff */
469       d2ull((double) ((~0ULL) >> 1)) != ((~0ULL) >> 1) + 1)
470     abort();
471   if (d2ull((double) ~((~0ULL) >> 1)) != ~((~0ULL) >> 1)) /* 0x80000000 */
472     abort();
473 
474   if (ld2ull(0.0) != 0LL)
475     abort();
476   if (ld2ull(0.999) != 0LL)
477     abort();
478   if (ld2ull(1.0) != 1LL)
479     abort();
480   if (ld2ull(1.99) != 1LL)
481     abort();
482   if (ld2ull((long double) ((~0ULL) >> 1)) != (~0ULL) >> 1 &&	/* 0x7fffffff */
483       ld2ull((long double) ((~0ULL) >> 1)) != ((~0ULL) >> 1) + 1)
484     abort();
485   if (ld2ull((long double) ~((~0ULL) >> 1)) != ~((~0ULL) >> 1)) /* 0x80000000 */
486     abort();
487 
488 
489   if (f2sll(0.0) != 0LL)
490     abort();
491   if (f2sll(0.999) != 0LL)
492     abort();
493   if (f2sll(1.0) != 1LL)
494     abort();
495   if (f2sll(1.99) != 1LL)
496     abort();
497   if (f2sll(-0.999) != 0LL)
498     abort();
499   if (f2sll(-1.0) != -1LL)
500     abort();
501   if (f2sll(-1.99) != -1LL)
502     abort();
503   if (f2sll((float)(long long int)~((~0ULL) >> 1)) != (long long int)~((~0ULL) >> 1)) /* 0x80000000 */
504     abort();
505 
506   if (d2sll(0.0) != 0LL)
507     abort();
508   if (d2sll(0.999) != 0LL)
509     abort();
510   if (d2sll(1.0) != 1LL)
511     abort();
512   if (d2sll(1.99) != 1LL)
513     abort();
514   if (d2sll(-0.999) != 0LL)
515     abort();
516   if (d2sll(-1.0) != -1LL)
517     abort();
518   if (d2sll(-1.99) != -1LL)
519     abort();
520   if (d2sll((double)(long long int)~((~0ULL) >> 1)) != (long long int)~((~0ULL) >> 1)) /* 0x80000000 */
521     abort();
522 
523   if (ld2sll(0.0) != 0LL)
524     abort();
525   if (ld2sll(0.999) != 0LL)
526     abort();
527   if (ld2sll(1.0) != 1LL)
528     abort();
529   if (ld2sll(1.99) != 1LL)
530     abort();
531   if (ld2sll(-0.999) != 0LL)
532     abort();
533   if (ld2sll(-1.0) != -1LL)
534     abort();
535   if (ld2sll(-1.99) != -1LL)
536     abort();
537   if (ld2sll((long double)(long long int)~((~0ULL) >> 1)) != (long long int)~((~0ULL) >> 1)) /* 0x80000000 */
538     abort();
539 }
540 #endif
541 
main()542 main()
543 {
544   test_integer_to_float();
545   test_float_to_integer();
546 #if __GNUC__
547   test_longlong_integer_to_float();
548   test_float_to_longlong_integer();
549 #endif
550   exit(0);
551 }
552