OSDN Git Service

* c-decl.c (declspecs_add_type): Don't pedwarn for _Complex in
[pf3gnuchains/gcc-fork.git] / gcc / testsuite / gcc.dg / darwin-longdouble.c
1 /* { dg-do run { target powerpc*-*-darwin* } } */
2 /* { dg-options "" } */
3 /* No options so 'long long' can be used.  */
4
5 #include <stdio.h>
6
7 typedef unsigned long long uint64_t;
8 typedef uint64_t ldbits[2];
9
10 union ldu 
11 {
12   ldbits lb;
13   long double ld;
14 };
15
16 static const struct {
17   ldbits a;
18   ldbits b;
19   ldbits result;
20 } single_tests[] = {
21   /* Test of values that add to near +Inf.  */
22   { { 0x7FEFFFFFFFFFFFFFLL, 0xFC88000000000000LL },
23     { 0x7C94000000000000LL, 0x0000000000000000LL },
24     { 0x7FEFFFFFFFFFFFFFLL, 0x7C80000000000000LL } },
25   { { 0x7FEFFFFFFFFFFFFFLL, 0x7C8FFFFFFFFFFFFFLL },
26     { 0x792FFFFFFFFFFFFFLL, 0x0000000000000000LL },
27     { 0x7FEFFFFFFFFFFFFFLL, 0x7C8FFFFFFFFFFFFFLL } },
28   { { 0x7FEFFFFFFFFFFFFFLL, 0x7C8FFFFFFFFFFFFFLL },
29     { 0x7930000000000000LL, 0xF5DFFFFFFFFFFFFFLL },
30     /* correct result is: { 0x7FEFFFFFFFFFFFFFLL, 0x7C8FFFFFFFFFFFFFLL } */
31     { 0x7FF0000000000000LL, 0x0000000000000000LL } },
32   /* Test of values that add to +Inf.  */
33   { { 0x7FEFFFFFFFFFFFFFLL, 0x7C8FFFFFFFFFFFFFLL },
34     { 0x7930000000000000LL, 0x0000000000000000LL },
35     { 0x7FF0000000000000LL, 0x0000000000000000LL } },
36   /* Tests of Inf addition.  */
37   { { 0x7FF0000000000000LL, 0x0000000000000000LL },
38     { 0x0000000000000000LL, 0x0000000000000000LL },
39     { 0x7FF0000000000000LL, 0x0000000000000000LL } },
40   { { 0x7FF0000000000000LL, 0x0000000000000000LL },
41     { 0x7FF0000000000000LL, 0x0000000000000000LL },
42     { 0x7FF0000000000000LL, 0x0000000000000000LL } },
43   /* Test of Inf addition producing NaN.  */
44   { { 0x7FF0000000000000LL, 0x0000000000000000LL },
45     { 0xFFF0000000000000LL, 0x0000000000000000LL },
46     { 0x7FF8000000000000LL, 0x0000000000000000LL } },
47   /* Tests of NaN addition.  */
48   { { 0x7FF8000000000000LL, 0x0000000000000000LL },
49     { 0x0000000000000000LL, 0x0000000000000000LL },
50     { 0x7FF8000000000000LL, 0x7FF8000000000000LL } },
51   { { 0x7FF8000000000000LL, 0x0000000000000000LL },
52     { 0x7FF0000000000000LL, 0x0000000000000000LL },
53     { 0x7FF8000000000000LL, 0x7FF8000000000000LL } },
54   /* Addition of positive integers, with interesting rounding properties.  */
55   { { 0x4690000000000000LL, 0x4330000000000000LL },
56     { 0x4650000000000009LL, 0xC2FFFFFFFFFFFFF2LL },
57     /* correct result is: { 0x4691000000000001LL, 0xC32C000000000000LL } */
58     { 0x4691000000000001LL, 0xc32bfffffffffffeLL } },
59   { { 0x4690000000000000LL, 0x4330000000000000LL },
60     { 0x4650000000000008LL, 0x42F0000000000010LL },
61     { 0x4691000000000001LL, 0xC32E000000000000LL } },
62   { { 0x469FFFFFFFFFFFFFLL, 0x433FFFFFFFFFFFFFLL },
63     { 0x4340000000000000LL, 0x3FF0000000000000LL },
64     { 0x46A0000000000000LL, 0x0000000000000000LL } },
65   { { 0x469FFFFFFFFFFFFFLL, 0x433FFFFFFFFFFFFFLL },
66     { 0x4340000000000000LL, 0x0000000000000000LL },
67     { 0x46A0000000000000LL, 0xBFF0000000000000LL } },
68   /* Subtraction of integers, with cancellation.  */
69   { { 0x4690000000000000LL, 0x4330000000000000LL },
70     { 0xC690000000000000LL, 0xC330000000000000LL },
71     { 0x0000000000000000LL, 0x0000000000000000LL } },
72   { { 0x4690000000000000LL, 0x4330000000000000LL },
73     { 0xC330000000000000LL, 0x0000000000000000LL },
74     { 0x4690000000000000LL, 0x0000000000000000LL } },
75   { { 0x4690000000000000LL, 0x4330000000000000LL },
76     { 0xC330000000000000LL, 0x3FA0000000000000LL },
77     { 0x4690000000000000LL, 0x3FA0000000000000LL } },
78   { { 0x4690000000000000LL, 0x4330000000000000LL },
79     { 0xC690000000000000LL, 0x3FA0000000000000LL },
80     /* correct result is: { 0x4330000000000000LL, 0x3FA0000000000000LL } */
81     { 0x4330000000000000LL, 0x0000000000000000LL } }
82 };
83     
84 static int fail = 0;
85
86 static void
87 run_single_tests (void)
88 {
89   size_t i;
90   for (i = 0; i < sizeof (single_tests) / sizeof (single_tests[0]); i++)
91     {
92       union ldu a, b, result, expected;
93       memcpy (a.lb, single_tests[i].a, sizeof (ldbits));
94       memcpy (b.lb, single_tests[i].b, sizeof (ldbits));
95       memcpy (expected.lb, single_tests[i].result, sizeof (ldbits));
96       result.ld = a.ld + b.ld;
97       if (memcmp (result.lb, expected.lb,
98                   result.ld == result.ld ? sizeof (ldbits) : sizeof (double))
99           != 0)
100         {
101           printf ("FAIL: %016llx %016llx + %016llx %016llx\n",
102                   a.lb[0], a.lb[1], b.lb[0], b.lb[1]);
103           printf (" = %016llx %016llx not %016llx %016llx\n",
104                   result.lb[0], result.lb[1], expected.lb[0], expected.lb[1]);
105           fail = 1;
106         }
107     }
108 }
109
110 int main(void)
111 {
112   run_single_tests();
113   if (fail)
114     abort ();
115   else
116     exit (0);
117 }