xref: /netbsd-src/external/gpl3/gdb.old/dist/gdb/testsuite/gdb.base/gnu_vector.c (revision e89934bbf778a6d6d6894877c4da59d0c7835b0f)
1 /* This testcase is part of GDB, the GNU debugger.
2 
3    Copyright 2010-2015 Free Software Foundation, Inc.
4 
5    This program is free software; you can redistribute it and/or modify
6    it under the terms of the GNU General Public License as published by
7    the Free Software Foundation; either version 3 of the License, or
8    (at your option) any later version.
9 
10    This program is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13    GNU General Public License for more details.
14 
15    You should have received a copy of the GNU General Public License
16    along with this program.  If not, see <http://www.gnu.org/licenses/>.
17 
18    Contributed by Ken Werner <ken.werner@de.ibm.com>  */
19 
20 #include <stdarg.h>
21 #include <stdio.h>
22 
23 #define VECTOR(n, type)					\
24   type __attribute__ ((vector_size (n * sizeof(type))))
25 
26 typedef VECTOR (8, int) int8;
27 
28 typedef VECTOR (4, int) int4;
29 typedef VECTOR (4, unsigned int) uint4;
30 typedef VECTOR (4, char) char4;
31 typedef VECTOR (4, float) float4;
32 
33 typedef VECTOR (2, int) int2;
34 typedef VECTOR (2, long long) longlong2;
35 typedef VECTOR (2, float) float2;
36 typedef VECTOR (2, double) double2;
37 
38 typedef VECTOR (1, char) char1;
39 typedef VECTOR (1, int) int1;
40 typedef VECTOR (1, double) double1;
41 
42 int ia = 2;
43 int ib = 1;
44 float fa = 2;
45 float fb = 1;
46 long long lla __attribute__ ((mode(DI))) = 0x0000000100000001ll;
47 char4 c4 = {1, 2, 3, 4};
48 int4 i4a = {2, 4, 8, 16};
49 int4 i4b = {1, 2, 8, 4};
50 float4 f4a = {2, 4, 8, 16};
51 float4 f4b = {1, 2, 8, 4};
52 uint4 ui4 = {2, 4, 8, 16};
53 int2 i2 = {1, 2};
54 longlong2 ll2 = {1, 2};
55 float2 f2 = {1, 2};
56 double2 d2 = {1, 2};
57 
58 union
59 {
60   int i;
61   VECTOR (sizeof(int), char) cv;
62 } union_with_vector_1;
63 
64 struct
65 {
66   int i;
67   VECTOR (sizeof(int), char) cv;
68   float4 f4;
69 } struct_with_vector_1;
70 
71 struct just_int2
72 {
73   int2 i;
74 };
75 
76 struct two_int2
77 {
78   int2 i, j;
79 };
80 
81 
82 /* Simple vector-valued function with a few 16-byte vector
83    arguments.  */
84 
85 int4
86 add_some_intvecs (int4 a, int4 b, int4 c)
87 {
88   return a + b + c;
89 }
90 
91 /* Many small vector arguments, 4 bytes each.  */
92 
93 char4
94 add_many_charvecs (char4 a, char4 b, char4 c, char4 d, char4 e,
95 		   char4 f, char4 g, char4 h, char4 i, char4 j)
96 {
97   return (a + b + c + d + e + f + g + h + i + j);
98 }
99 
100 /* Varargs: One fixed and N-1 variable vector arguments.  */
101 
102 float4
103 add_various_floatvecs (int n, float4 a, ...)
104 {
105   int i;
106   va_list argp;
107 
108   va_start (argp, a);
109   for (i = 1; i < n; i++)
110     a += va_arg (argp, float4);
111   va_end (argp);
112 
113   return a;
114 }
115 
116 /* Struct-wrapped vectors (might be passed as if not wrapped).  */
117 
118 struct just_int2
119 add_structvecs (int2 a, struct just_int2 b, struct two_int2 c)
120 {
121   struct just_int2 res;
122 
123   res.i = a + b.i + c.i + c.j;
124   return res;
125 }
126 
127 /* Single-element vectors (might be treated like scalars).  */
128 
129 double1
130 add_singlevecs (char1 a, int1 b, double1 c)
131 {
132   return (double1) {a[0] + b[0] + c[0]};
133 }
134 
135 
136 int
137 main ()
138 {
139   int4 res;
140 
141   res = add_some_intvecs (i4a, i4a + i4b, i4b);
142   printf ("%d %d %d %d\n", res[0], res[1], res[2], res[3]);
143 
144   res = add_some_intvecs (i4a, i4a + i4b, i4b);
145   printf ("%d %d %d %d\n", res[0], res[1], res[2], res[3]);
146 
147   return 0;
148 }
149