1 /* This testcase is part of GDB, the GNU debugger. 2 3 Copyright 2010-2023 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 } 148