]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - gdb/testsuite/gdb.base/gnu_vector.c
Automatic Copyright Year update after running gdb/copyright.py
[thirdparty/binutils-gdb.git] / gdb / testsuite / gdb.base / gnu_vector.c
1 /* This testcase is part of GDB, the GNU debugger.
2
3 Copyright 2010-2022 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
22 #define VECTOR(n, type) \
23 type __attribute__ ((vector_size (n * sizeof(type))))
24
25 typedef VECTOR (8, int) int8;
26
27 typedef VECTOR (4, int) int4;
28 typedef VECTOR (4, unsigned int) uint4;
29 typedef VECTOR (4, char) char4;
30 typedef VECTOR (4, float) float4;
31
32 typedef VECTOR (2, int) int2;
33 typedef VECTOR (2, long long) longlong2;
34 typedef VECTOR (2, float) float2;
35 typedef VECTOR (2, double) double2;
36
37 typedef VECTOR (1, char) char1;
38 typedef VECTOR (1, int) int1;
39 typedef VECTOR (1, double) double1;
40
41 int ia = 2;
42 int ib = 1;
43 float fa = 2;
44 float fb = 1;
45 long long lla __attribute__ ((mode(DI))) = 0x0000000100000001ll;
46 char4 c4 = {1, 2, 3, 4};
47 int4 i4a = {2, 4, 8, 16};
48 int4 i4b = {1, 2, 8, 4};
49 float4 f4a = {2, 4, 8, 16};
50 float4 f4b = {1, 2, 8, 4};
51 uint4 ui4 = {2, 4, 8, 16};
52 int2 i2 = {1, 2};
53 longlong2 ll2 = {1, 2};
54 float2 f2 = {1, 2};
55 double2 d2 = {1, 2};
56
57 union
58 {
59 int i;
60 VECTOR (sizeof(int), char) cv;
61 } union_with_vector_1;
62
63 struct
64 {
65 int i;
66 VECTOR (sizeof(int), char) cv;
67 float4 f4;
68 } struct_with_vector_1;
69
70 struct just_int2
71 {
72 int2 i;
73 };
74
75 struct two_int2
76 {
77 int2 i, j;
78 };
79
80
81 /* Simple vector-valued function with a few 16-byte vector
82 arguments. */
83
84 int4
85 add_some_intvecs (int4 a, int4 b, int4 c)
86 {
87 return a + b + c;
88 }
89
90 /* Many small vector arguments, 4 bytes each. */
91
92 char4
93 add_many_charvecs (char4 a, char4 b, char4 c, char4 d, char4 e,
94 char4 f, char4 g, char4 h, char4 i, char4 j)
95 {
96 return (a + b + c + d + e + f + g + h + i + j);
97 }
98
99 /* Varargs: One fixed and N-1 variable vector arguments. */
100
101 float4
102 add_various_floatvecs (int n, float4 a, ...)
103 {
104 int i;
105 va_list argp;
106
107 va_start (argp, a);
108 for (i = 1; i < n; i++)
109 a += va_arg (argp, float4);
110 va_end (argp);
111
112 return a;
113 }
114
115 /* Struct-wrapped vectors (might be passed as if not wrapped). */
116
117 struct just_int2
118 add_structvecs (int2 a, struct just_int2 b, struct two_int2 c)
119 {
120 struct just_int2 res;
121
122 res.i = a + b.i + c.i + c.j;
123 return res;
124 }
125
126 /* Single-element vectors (might be treated like scalars). */
127
128 double1
129 add_singlevecs (char1 a, int1 b, double1 c)
130 {
131 return (double1) {a[0] + b[0] + c[0]};
132 }
133
134
135 int
136 main ()
137 {
138 int4 res;
139
140 res = add_some_intvecs (i4a, i4a + i4b, i4b);
141
142 res = add_some_intvecs (i4a, i4a + i4b, i4b);
143
144 add_some_intvecs (i4a, i4a + i4b, i4b);
145
146 return 0;
147 }