OSDN Git Service

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