OSDN Git Service

* g++.dg/ext/altivec-1.C: XFAIL powerpc-ibm-aix*.
[pf3gnuchains/gcc-fork.git] / gcc / testsuite / g++.dg / ext / altivec-3.C
1 /* { dg-do run { target powerpc*-*-* } { xfail powerpc-ibm-aix* } } */
2 /* { dg-options "-maltivec" } */
3
4 /* Test for correct handling of AltiVec constants passed
5    through '...' (va_arg).  */
6
7 #include <stdarg.h>
8 #include <stdio.h>
9 #include <stdlib.h>
10
11 #include <altivec.h>
12 #include "altivec_check.h"
13
14 #define CHECK_INVARIANT(expr) \
15   if (!(expr)) { \
16     printf ("ASSERT FAILED: %d: %s\n", __LINE__, #expr); \
17     abort (); \
18   }
19
20 struct foo { int x; int y; };
21 struct vfoo { int x; __vector signed int v; int y; };
22 union u { __vector signed int v; signed int i[4]; };
23
24 struct foo x_g = { 3, 4};
25 struct vfoo vx_g = { 10, (vector signed int) {11, 12, 13, 14}, 15 };
26 __vector signed int v_g = (vector signed int) {22, 23, 24, 25};
27 struct vfoo vx2_g = { 30, (vector signed int) {31, 32, 33, 34}, 35 };
28 __vector signed int v2_g = (vector signed int) {40, 41, 42, 43};
29 int i_1 = 99, i_2 = 33;
30 double d_2 = 1.5, d_3 = 1.75;
31 double ld_1 = 1.25;
32
33 void bar (int i, ... )
34 {
35     struct foo xi;
36     double d;
37     double ld;
38     float f;
39     char c;
40     short s;
41     va_list ap;
42     va_start(ap, i);
43     xi = va_arg(ap, struct foo);
44     s = (short)va_arg(ap, int);
45     f = (float)va_arg(ap, double);
46     ld = va_arg(ap, double);
47     c = (char)va_arg(ap, int);
48     d = va_arg(ap, double);
49     va_end(ap);
50     
51     CHECK_INVARIANT (xi.x == x_g.x && xi.y == x_g.y);
52     CHECK_INVARIANT (s == (short)i_2);
53     CHECK_INVARIANT (f == (float)d_2);
54     CHECK_INVARIANT (ld == ld_1);
55     CHECK_INVARIANT (c == (char)i_1);
56     CHECK_INVARIANT (d == d_3);
57 }
58
59 void baz (int i, ... )
60 {
61     struct vfoo vx, vx2;
62     __vector signed int v_i, v2_i;
63     int j, k, l;
64     va_list ap;
65     va_start(ap, i);
66     v_i = va_arg(ap, __vector signed int); 
67     j = va_arg(ap, int);
68     vx = va_arg(ap, struct vfoo);
69     k = va_arg(ap, int);
70     v2_i = va_arg(ap, __vector signed int);
71     l = va_arg(ap, int);
72     vx2 = va_arg(ap, struct vfoo);
73     va_end(ap);
74       
75     CHECK_INVARIANT (vec_all_eq (v_i, v_g));
76     CHECK_INVARIANT (j == i_1);
77     CHECK_INVARIANT (vx.x == vx_g.x && vec_all_eq(vx.v, vx_g.v) && vx.y == vx_g.y);
78     CHECK_INVARIANT (k == i_1);
79     CHECK_INVARIANT (vec_all_eq (v2_i, v2_g));
80     CHECK_INVARIANT (l == i_1);
81     CHECK_INVARIANT (vx2.x == vx2_g.x && vec_all_eq(vx2.v, vx2_g.v) && vx2.y == vx2_g.y);
82 }
83
84 void quux (int i, ... )
85 {
86     __vector signed int v_i, v2_i;
87     union u vi, v2i;
88     va_list ap;
89     va_start(ap, i);
90     v_i = va_arg(ap, __vector signed int);
91     v2_i = va_arg(ap, __vector signed int);
92     va_end(ap);
93     vi.v = v_i;
94     v2i.v = v2_i;
95
96     CHECK_INVARIANT (vec_all_eq (v_i, v_g));
97     CHECK_INVARIANT (vec_all_eq (v2_i, v_g));
98     CHECK_INVARIANT (vec_all_eq (vi.v, v_g));
99     CHECK_INVARIANT (vec_all_eq (v2i.v, v_g));
100 }
101
102 void baz2 (int i, ... )
103 {
104     struct vfoo vx;
105     union u vxi;
106     va_list ap;
107     va_start(ap, i);
108     vx = va_arg(ap, struct vfoo);
109     va_end(ap);
110     vxi.v = vx.v;
111
112     CHECK_INVARIANT (vx.x == vx_g.x && vec_all_eq(vx.v, vx_g.v) && vx.y == vx_g.y);
113     CHECK_INVARIANT (vec_all_eq (vxi.v, vx_g.v));
114 }
115
116 int main(void)
117 {
118     CHECK_INVARIANT (sizeof(struct foo) == 8 && sizeof(struct vfoo) == 48);
119
120     altivec_check();
121
122     bar(i_1, x_g, (short)i_2, (float)d_2, ld_1, (char)i_1, d_3);
123     baz(i_1, v_g, i_1, vx_g, i_1, v2_g, i_1, vx2_g); 
124     quux(i_1, v_g, v_g);
125     baz2(i_1, vx_g);
126     
127     return 0;
128 }