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