comparison src/impl/generic.c @ 31:bf6ad516f1e6

Backed out changeset c6c99ab1088a
author Paper <paper@tflc.us>
date Fri, 25 Apr 2025 17:40:33 -0400
parents c6c99ab1088a
children 8b5e0974fd41
comparison
equal deleted inserted replaced
30:641d8c79b1da 31:bf6ad516f1e6
1 /**
2 * vec - a tiny SIMD vector library in C99
3 *
4 * Copyright (c) 2024 Paper
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 * copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in all
14 * copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 * SOFTWARE.
23 **/
24
25 #include "vec/impl/generic.h" 1 #include "vec/impl/generic.h"
26 2
27 #include <string.h> 3 #include <string.h>
28 4
29 // ----------------------------------------------------------------- 5 // -----------------------------------------------------------------
48 union v##sign##int##bits##x##size##_impl_data { \ 24 union v##sign##int##bits##x##size##_impl_data { \
49 v##sign##int##bits##x##size vec; \ 25 v##sign##int##bits##x##size vec; \
50 vec_##sign##int##bits impl[size]; \ 26 vec_##sign##int##bits impl[size]; \
51 }; \ 27 }; \
52 \ 28 \
53 VEC_FUNC_IMPL v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_splat(vec_##sign##int##bits x) \ 29 v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_splat(vec_##sign##int##bits x) \
54 { \ 30 { \
55 v##sign##int##bits##x##size vec; \ 31 v##sign##int##bits##x##size vec; \
56 for (int i = 0; i < size; i++) \ 32 for (int i = 0; i < size; i++) \
57 ((union v##sign##int##bits##x##size##_impl_data *)&vec)->impl[i] = x; \ 33 ((union v##sign##int##bits##x##size##_impl_data *)&vec)->impl[i] = x; \
58 return vec; \ 34 return vec; \
59 } \ 35 } \
60 \ 36 \
61 VEC_FUNC_IMPL v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_load_aligned(const vec_##sign##int##bits in[size]) \ 37 v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_load_aligned(const vec_##sign##int##bits in[size]) \
62 { \ 38 { \
63 v##sign##int##bits##x##size vec; \ 39 v##sign##int##bits##x##size vec; \
64 memcpy(&vec, in, sizeof(vec_##sign##int##bits) * size); \ 40 memcpy(&vec, in, sizeof(vec_##sign##int##bits) * size); \
65 return vec; \ 41 return vec; \
66 } \ 42 } \
67 \ 43 \
68 VEC_FUNC_IMPL void v##sign##int##bits##x##size##_generic_store_aligned(v##sign##int##bits##x##size vec, vec_##sign##int##bits out[size]) \ 44 void v##sign##int##bits##x##size##_generic_store_aligned(v##sign##int##bits##x##size vec, vec_##sign##int##bits out[size]) \
69 { \ 45 { \
70 memcpy(out, &vec, sizeof(vec_##sign##int##bits) * size); \ 46 memcpy(out, &vec, sizeof(vec_##sign##int##bits) * size); \
71 } \ 47 } \
72 \ 48 \
73 VEC_FUNC_IMPL v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_add(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \ 49 v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_add(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \
74 { \ 50 { \
75 VEC_GENERIC_BUILTIN_OPERATION(+, sign, csign, bits, size); \ 51 VEC_GENERIC_BUILTIN_OPERATION(+, sign, csign, bits, size); \
76 } \ 52 } \
77 \ 53 \
78 VEC_FUNC_IMPL v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_sub(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \ 54 v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_sub(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \
79 { \ 55 { \
80 VEC_GENERIC_BUILTIN_OPERATION(-, sign, csign, bits, size); \ 56 VEC_GENERIC_BUILTIN_OPERATION(-, sign, csign, bits, size); \
81 } \ 57 } \
82 \ 58 \
83 VEC_FUNC_IMPL v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_mul(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \ 59 v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_mul(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \
84 { \ 60 { \
85 VEC_GENERIC_BUILTIN_OPERATION(*, sign, csign, bits, size); \ 61 VEC_GENERIC_BUILTIN_OPERATION(*, sign, csign, bits, size); \
86 } \ 62 } \
87 \ 63 \
88 VEC_FUNC_IMPL v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_div(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \ 64 v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_div(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \
89 { \ 65 { \
90 VEC_GENERIC_OPERATION(((union v##sign##int##bits##x##size##_impl_data *)&vec2)->impl[i] ? (((union v##sign##int##bits##x##size##_impl_data *)&vec1)->impl[i] / ((union v##sign##int##bits##x##size##_impl_data *)&vec2)->impl[i]) : 0, sign, csign, bits, size); \ 66 VEC_GENERIC_OPERATION(((union v##sign##int##bits##x##size##_impl_data *)&vec2)->impl[i] ? (((union v##sign##int##bits##x##size##_impl_data *)&vec1)->impl[i] / ((union v##sign##int##bits##x##size##_impl_data *)&vec2)->impl[i]) : 0, sign, csign, bits, size); \
91 } \ 67 } \
92 \ 68 \
93 VEC_FUNC_IMPL v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_avg(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \ 69 v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_avg(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \
94 { \ 70 { \
95 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ 71 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
96 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \ 72 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \
97 \ 73 \
98 for (int i = 0; i < size; i++) \ 74 for (int i = 0; i < size; i++) \
99 vec1d->impl[i] = vec_##sign##avg(vec1d->impl[i], vec2d->impl[i]); \ 75 vec1d->impl[i] = vec_##sign##avg(vec1d->impl[i], vec2d->impl[i]); \
100 \ 76 \
101 return vec1d->vec; \ 77 return vec1d->vec; \
102 } \ 78 } \
103 \ 79 \
104 VEC_FUNC_IMPL v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_and(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \ 80 v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_and(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \
105 { \ 81 { \
106 VEC_GENERIC_BUILTIN_OPERATION(&, sign, csign, bits, size); \ 82 VEC_GENERIC_BUILTIN_OPERATION(&, sign, csign, bits, size); \
107 } \ 83 } \
108 \ 84 \
109 VEC_FUNC_IMPL v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_or(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \ 85 v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_or(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \
110 { \ 86 { \
111 VEC_GENERIC_BUILTIN_OPERATION(|, sign, csign, bits, size); \ 87 VEC_GENERIC_BUILTIN_OPERATION(|, sign, csign, bits, size); \
112 } \ 88 } \
113 \ 89 \
114 VEC_FUNC_IMPL v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_xor(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \ 90 v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_xor(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \
115 { \ 91 { \
116 VEC_GENERIC_BUILTIN_OPERATION(^, sign, csign, bits, size); \ 92 VEC_GENERIC_BUILTIN_OPERATION(^, sign, csign, bits, size); \
117 } \ 93 } \
118 \ 94 \
119 VEC_FUNC_IMPL v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_cmplt(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \ 95 v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_not(v##sign##int##bits##x##size vec) \
96 { \
97 return v##sign##int##bits##x##size##_generic_xor(vec, v##sign##int##bits##x##size##_generic_splat((vec_##sign##int##bits)VEC_UINT##bits##_MAX)); \
98 } \
99 \
100 v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_cmplt(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \
120 { \ 101 { \
121 VEC_GENERIC_CMP(<, sign, csign, bits, size); \ 102 VEC_GENERIC_CMP(<, sign, csign, bits, size); \
122 } \ 103 } \
123 \ 104 \
124 VEC_FUNC_IMPL v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_cmple(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \ 105 v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_cmple(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \
125 { \ 106 { \
126 return v##sign##int##bits##x##size##_not(v##sign##int##bits##x##size##_cmpgt(vec1, vec2)); \ 107 VEC_GENERIC_CMP(<=, sign, csign, bits, size); \
127 } \ 108 } \
128 \ 109 \
129 VEC_FUNC_IMPL v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_cmpeq(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \ 110 v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_cmpeq(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \
130 { \ 111 { \
131 VEC_GENERIC_CMP(==, sign, csign, bits, size); \ 112 VEC_GENERIC_CMP(==, sign, csign, bits, size); \
132 } \ 113 } \
133 \ 114 \
134 VEC_FUNC_IMPL v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_cmpge(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \ 115 v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_cmpge(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \
135 { \ 116 { \
136 return v##sign##int##bits##x##size##_not(v##sign##int##bits##x##size##_cmplt(vec1, vec2)); \ 117 VEC_GENERIC_CMP(>=, sign, csign, bits, size); \
137 } \ 118 } \
138 \ 119 \
139 VEC_FUNC_IMPL v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_cmpgt(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \ 120 v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_cmpgt(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \
140 { \ 121 { \
141 VEC_GENERIC_CMP(>, sign, csign, bits, size); \ 122 VEC_GENERIC_CMP(>, sign, csign, bits, size); \
142 } \ 123 } \
143 \ 124 \
144 VEC_FUNC_IMPL v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_lshift(v##sign##int##bits##x##size vec1, vuint##bits##x##size vec2) \ 125 v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_lshift(v##sign##int##bits##x##size vec1, vuint##bits##x##size vec2) \
145 { \ 126 { \
146 VEC_GENERIC_OPERATION(vec_##sign##lshift(((union v##sign##int##bits##x##size##_impl_data *)&vec1)->impl[i], ((union v##sign##int##bits##x##size##_impl_data *)&vec2)->impl[i]), sign, csign, bits, size); \ 127 VEC_GENERIC_OPERATION(vec_##sign##lshift(((union v##sign##int##bits##x##size##_impl_data *)&vec1)->impl[i], ((union v##sign##int##bits##x##size##_impl_data *)&vec2)->impl[i]), sign, csign, bits, size); \
147 } \ 128 } \
148 \ 129 \
149 VEC_FUNC_IMPL v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_rshift(v##sign##int##bits##x##size vec1, vuint##bits##x##size vec2) \ 130 v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_rshift(v##sign##int##bits##x##size vec1, vuint##bits##x##size vec2) \
150 { \ 131 { \
151 VEC_GENERIC_OPERATION(vec_##sign##rshift(((union v##sign##int##bits##x##size##_impl_data *)&vec1)->impl[i], ((union v##sign##int##bits##x##size##_impl_data *)&vec2)->impl[i]), sign, csign, bits, size); \ 132 VEC_GENERIC_OPERATION(vec_##sign##rshift(((union v##sign##int##bits##x##size##_impl_data *)&vec1)->impl[i], ((union v##sign##int##bits##x##size##_impl_data *)&vec2)->impl[i]), sign, csign, bits, size); \
152 } \ 133 } \
153 \ 134 \
154 VEC_FUNC_IMPL v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_lrshift(v##sign##int##bits##x##size vec1, vuint##bits##x##size vec2) \ 135 v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_lrshift(v##sign##int##bits##x##size vec1, vuint##bits##x##size vec2) \
155 { \ 136 { \
156 VEC_GENERIC_OPERATION(vec_lrshift((vec_uint##bits)(((union v##sign##int##bits##x##size##_impl_data *)&vec1)->impl[i]), ((union v##sign##int##bits##x##size##_impl_data *)&vec2)->impl[i]), sign, csign, bits, size); \ 137 VEC_GENERIC_OPERATION(vec_lrshift((vec_uint##bits)(((union v##sign##int##bits##x##size##_impl_data *)&vec1)->impl[i]), ((union v##sign##int##bits##x##size##_impl_data *)&vec2)->impl[i]), sign, csign, bits, size); \
157 } \ 138 } \
158 \ 139 \
159 VEC_FUNC_IMPL v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_min(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \
160 { \
161 v##sign##int##bits##x##size cmplt = v##sign##int##bits##x##size##_cmplt(vec1, vec2); \
162 \
163 v##sign##int##bits##x##size a = v##sign##int##bits##x##size##_and(vec1, cmplt); \
164 v##sign##int##bits##x##size b = v##sign##int##bits##x##size##_and(vec2, v##sign##int##bits##x##size##_not(cmplt)); \
165 \
166 return v##sign##int##bits##x##size##_or(a, b); \
167 } \
168 \
169 VEC_FUNC_IMPL v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_max(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \
170 { \
171 v##sign##int##bits##x##size cmplt = v##sign##int##bits##x##size##_cmpgt(vec1, vec2); \
172 \
173 v##sign##int##bits##x##size a = v##sign##int##bits##x##size##_and(vec1, cmplt); \
174 v##sign##int##bits##x##size b = v##sign##int##bits##x##size##_and(vec2, v##sign##int##bits##x##size##_not(cmplt)); \
175 \
176 return v##sign##int##bits##x##size##_or(a, b); \
177 } \
178 \
179 const v##sign##int##bits##x##size##_impl v##sign##int##bits##x##size##_impl_generic = { \ 140 const v##sign##int##bits##x##size##_impl v##sign##int##bits##x##size##_impl_generic = { \
180 .splat = v##sign##int##bits##x##size##_generic_splat, \ 141 v##sign##int##bits##x##size##_generic_splat, \
181 .load_aligned = v##sign##int##bits##x##size##_generic_load_aligned, \ 142 v##sign##int##bits##x##size##_generic_load_aligned, \
182 .load = v##sign##int##bits##x##size##_generic_load_aligned, \ 143 v##sign##int##bits##x##size##_generic_load_aligned, \
183 .store_aligned = v##sign##int##bits##x##size##_generic_store_aligned, \ 144 v##sign##int##bits##x##size##_generic_store_aligned, \
184 .store = v##sign##int##bits##x##size##_generic_store_aligned, \ 145 v##sign##int##bits##x##size##_generic_store_aligned, \
185 .add = v##sign##int##bits##x##size##_generic_add, \ 146 v##sign##int##bits##x##size##_generic_add, \
186 .sub = v##sign##int##bits##x##size##_generic_sub, \ 147 v##sign##int##bits##x##size##_generic_sub, \
187 .mul = v##sign##int##bits##x##size##_generic_mul, \ 148 v##sign##int##bits##x##size##_generic_mul, \
188 .div = v##sign##int##bits##x##size##_generic_div, \ 149 v##sign##int##bits##x##size##_generic_div, \
189 .avg = v##sign##int##bits##x##size##_generic_avg, \ 150 v##sign##int##bits##x##size##_generic_avg, \
190 .band = v##sign##int##bits##x##size##_generic_and, \ 151 v##sign##int##bits##x##size##_generic_and, \
191 .bor = v##sign##int##bits##x##size##_generic_or, \ 152 v##sign##int##bits##x##size##_generic_or, \
192 .bxor = v##sign##int##bits##x##size##_generic_xor, \ 153 v##sign##int##bits##x##size##_generic_xor, \
193 .lshift = v##sign##int##bits##x##size##_generic_lshift, \ 154 v##sign##int##bits##x##size##_generic_not, \
194 .rshift = v##sign##int##bits##x##size##_generic_rshift, \ 155 v##sign##int##bits##x##size##_generic_lshift, \
195 .lrshift = v##sign##int##bits##x##size##_generic_lrshift, \ 156 v##sign##int##bits##x##size##_generic_rshift, \
196 .cmplt = v##sign##int##bits##x##size##_generic_cmplt, \ 157 v##sign##int##bits##x##size##_generic_lrshift, \
197 .cmple = v##sign##int##bits##x##size##_generic_cmple, \ 158 v##sign##int##bits##x##size##_generic_cmplt, \
198 .cmpeq = v##sign##int##bits##x##size##_generic_cmpeq, \ 159 v##sign##int##bits##x##size##_generic_cmple, \
199 .cmpge = v##sign##int##bits##x##size##_generic_cmpge, \ 160 v##sign##int##bits##x##size##_generic_cmpeq, \
200 .cmpgt = v##sign##int##bits##x##size##_generic_cmpgt, \ 161 v##sign##int##bits##x##size##_generic_cmpge, \
201 .min = v##sign##int##bits##x##size##_generic_min, \ 162 v##sign##int##bits##x##size##_generic_cmpgt, \
202 .max = v##sign##int##bits##x##size##_generic_max, \
203 }; 163 };
204 164
205 #define VEC_GENERIC_DEFINE_OPERATIONS(bits, size) \ 165 #define VEC_GENERIC_DEFINE_OPERATIONS(bits, size) \
206 VEC_GENERIC_DEFINE_OPERATIONS_SIGN(u, U, bits, size) \ 166 VEC_GENERIC_DEFINE_OPERATIONS_SIGN(u, U, bits, size) \
207 VEC_GENERIC_DEFINE_OPERATIONS_SIGN( , , bits, size) 167 VEC_GENERIC_DEFINE_OPERATIONS_SIGN( , , bits, size)
221 union v##sign##int##bits##x##size##_impl_data { \ 181 union v##sign##int##bits##x##size##_impl_data { \
222 v##sign##int##bits##x##size vec; \ 182 v##sign##int##bits##x##size vec; \
223 v##sign##int##bits##x##halfsize impl[2]; \ 183 v##sign##int##bits##x##halfsize impl[2]; \
224 }; \ 184 }; \
225 \ 185 \
226 VEC_FUNC_IMPL v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_splat(vec_##sign##int##bits x) \ 186 v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_splat(vec_##sign##int##bits x) \
227 { \ 187 { \
228 union v##sign##int##bits##x##size##_impl_data vec; \ 188 union v##sign##int##bits##x##size##_impl_data vec; \
229 vec.impl[0] = v##sign##int##bits##x##halfsize##_splat(x); \ 189 vec.impl[0] = v##sign##int##bits##x##halfsize##_splat(x); \
230 vec.impl[1] = v##sign##int##bits##x##halfsize##_splat(x); \ 190 vec.impl[1] = v##sign##int##bits##x##halfsize##_splat(x); \
231 return vec.vec; \ 191 return vec.vec; \
232 } \ 192 } \
233 \ 193 \
234 VEC_FUNC_IMPL v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_load_aligned(const vec_##sign##int##bits in[size]) \ 194 v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_load_aligned(const vec_##sign##int##bits in[size]) \
235 { \ 195 { \
236 union v##sign##int##bits##x##size##_impl_data vec; \ 196 union v##sign##int##bits##x##size##_impl_data vec; \
237 vec.impl[0] = v##sign##int##bits##x##halfsize##_load_aligned(in); \ 197 vec.impl[0] = v##sign##int##bits##x##halfsize##_load_aligned(in); \
238 vec.impl[1] = v##sign##int##bits##x##halfsize##_load_aligned(in + halfsize); \ 198 vec.impl[1] = v##sign##int##bits##x##halfsize##_load_aligned(in + halfsize); \
239 return vec.vec; \ 199 return vec.vec; \
240 } \ 200 } \
241 \ 201 \
242 VEC_FUNC_IMPL v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_load(const vec_##sign##int##bits in[size]) \ 202 v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_load(const vec_##sign##int##bits in[size]) \
243 { \ 203 { \
244 union v##sign##int##bits##x##size##_impl_data vec; \ 204 union v##sign##int##bits##x##size##_impl_data vec; \
245 vec.impl[0] = v##sign##int##bits##x##halfsize##_load(in); \ 205 vec.impl[0] = v##sign##int##bits##x##halfsize##_load(in); \
246 vec.impl[1] = v##sign##int##bits##x##halfsize##_load(in + halfsize); \ 206 vec.impl[1] = v##sign##int##bits##x##halfsize##_load(in + halfsize); \
247 return vec.vec; \ 207 return vec.vec; \
248 } \ 208 } \
249 \ 209 \
250 VEC_FUNC_IMPL void v##sign##int##bits##x##size##_generic_store_aligned(v##sign##int##bits##x##size vec, vec_##sign##int##bits out[size]) \ 210 void v##sign##int##bits##x##size##_generic_store_aligned(v##sign##int##bits##x##size vec, vec_##sign##int##bits out[size]) \
251 { \ 211 { \
252 union v##sign##int##bits##x##size##_impl_data *vecd = (union v##sign##int##bits##x##size##_impl_data *)&vec; \ 212 union v##sign##int##bits##x##size##_impl_data *vecd = (union v##sign##int##bits##x##size##_impl_data *)&vec; \
253 \ 213 \
254 v##sign##int##bits##x##halfsize##_store_aligned(vecd->impl[0], out); \ 214 v##sign##int##bits##x##halfsize##_store_aligned(vecd->impl[0], out); \
255 v##sign##int##bits##x##halfsize##_store_aligned(vecd->impl[1], out + halfsize); \ 215 v##sign##int##bits##x##halfsize##_store_aligned(vecd->impl[1], out + halfsize); \
256 } \ 216 } \
257 \ 217 \
258 VEC_FUNC_IMPL void v##sign##int##bits##x##size##_generic_store(v##sign##int##bits##x##size vec, vec_##sign##int##bits out[size]) \ 218 void v##sign##int##bits##x##size##_generic_store(v##sign##int##bits##x##size vec, vec_##sign##int##bits out[size]) \
259 { \ 219 { \
260 union v##sign##int##bits##x##size##_impl_data *vecd = (union v##sign##int##bits##x##size##_impl_data *)&vec; \ 220 union v##sign##int##bits##x##size##_impl_data *vecd = (union v##sign##int##bits##x##size##_impl_data *)&vec; \
261 \ 221 \
262 v##sign##int##bits##x##halfsize##_store(vecd->impl[0], out); \ 222 v##sign##int##bits##x##halfsize##_store(vecd->impl[0], out); \
263 v##sign##int##bits##x##halfsize##_store(vecd->impl[1], out + halfsize); \ 223 v##sign##int##bits##x##halfsize##_store(vecd->impl[1], out + halfsize); \
264 } \ 224 } \
265 \ 225 \
266 VEC_FUNC_IMPL v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_add(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \ 226 v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_add(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \
267 { \ 227 { \
268 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ 228 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
269 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \ 229 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \
270 \ 230 \
271 vec1d->impl[0] = v##sign##int##bits##x##halfsize##_add(vec1d->impl[0], vec2d->impl[0]); \ 231 vec1d->impl[0] = v##sign##int##bits##x##halfsize##_add(vec1d->impl[0], vec2d->impl[0]); \
272 vec1d->impl[1] = v##sign##int##bits##x##halfsize##_add(vec1d->impl[1], vec2d->impl[1]); \ 232 vec1d->impl[1] = v##sign##int##bits##x##halfsize##_add(vec1d->impl[1], vec2d->impl[1]); \
273 \ 233 \
274 return vec1d->vec; \ 234 return vec1d->vec; \
275 } \ 235 } \
276 \ 236 \
277 VEC_FUNC_IMPL v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_sub(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \ 237 v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_sub(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \
278 { \ 238 { \
279 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ 239 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
280 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \ 240 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \
281 \ 241 \
282 vec1d->impl[0] = v##sign##int##bits##x##halfsize##_sub(vec1d->impl[0], vec2d->impl[0]); \ 242 vec1d->impl[0] = v##sign##int##bits##x##halfsize##_sub(vec1d->impl[0], vec2d->impl[0]); \
283 vec1d->impl[1] = v##sign##int##bits##x##halfsize##_sub(vec1d->impl[1], vec2d->impl[1]); \ 243 vec1d->impl[1] = v##sign##int##bits##x##halfsize##_sub(vec1d->impl[1], vec2d->impl[1]); \
284 \ 244 \
285 return vec1d->vec; \ 245 return vec1d->vec; \
286 } \ 246 } \
287 \ 247 \
288 VEC_FUNC_IMPL v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_mul(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \ 248 v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_mul(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \
289 { \ 249 { \
290 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ 250 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
291 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \ 251 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \
292 \ 252 \
293 vec1d->impl[0] = v##sign##int##bits##x##halfsize##_mul(vec1d->impl[0], vec2d->impl[0]); \ 253 vec1d->impl[0] = v##sign##int##bits##x##halfsize##_mul(vec1d->impl[0], vec2d->impl[0]); \
294 vec1d->impl[1] = v##sign##int##bits##x##halfsize##_mul(vec1d->impl[1], vec2d->impl[1]); \ 254 vec1d->impl[1] = v##sign##int##bits##x##halfsize##_mul(vec1d->impl[1], vec2d->impl[1]); \
295 \ 255 \
296 return vec1d->vec; \ 256 return vec1d->vec; \
297 } \ 257 } \
298 \ 258 \
299 VEC_FUNC_IMPL v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_div(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \ 259 v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_div(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \
300 { \ 260 { \
301 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ 261 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
302 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \ 262 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \
303 \ 263 \
304 vec1d->impl[0] = v##sign##int##bits##x##halfsize##_div(vec1d->impl[0], vec2d->impl[0]); \ 264 vec1d->impl[0] = v##sign##int##bits##x##halfsize##_div(vec1d->impl[0], vec2d->impl[0]); \
305 vec1d->impl[1] = v##sign##int##bits##x##halfsize##_div(vec1d->impl[1], vec2d->impl[1]); \ 265 vec1d->impl[1] = v##sign##int##bits##x##halfsize##_div(vec1d->impl[1], vec2d->impl[1]); \
306 \ 266 \
307 return vec1d->vec; \ 267 return vec1d->vec; \
308 } \ 268 } \
309 \ 269 \
310 VEC_FUNC_IMPL v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_avg(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \ 270 v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_avg(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \
311 { \ 271 { \
312 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ 272 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
313 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \ 273 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \
314 \ 274 \
315 vec1d->impl[0] = v##sign##int##bits##x##halfsize##_avg(vec1d->impl[0], vec2d->impl[0]); \ 275 vec1d->impl[0] = v##sign##int##bits##x##halfsize##_avg(vec1d->impl[0], vec2d->impl[0]); \
316 vec1d->impl[1] = v##sign##int##bits##x##halfsize##_avg(vec1d->impl[1], vec2d->impl[1]); \ 276 vec1d->impl[1] = v##sign##int##bits##x##halfsize##_avg(vec1d->impl[1], vec2d->impl[1]); \
317 \ 277 \
318 return vec1d->vec; \ 278 return vec1d->vec; \
319 } \ 279 } \
320 \ 280 \
321 VEC_FUNC_IMPL v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_and(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \ 281 v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_and(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \
322 { \ 282 { \
323 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ 283 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
324 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \ 284 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \
325 \ 285 \
326 vec1d->impl[0] = v##sign##int##bits##x##halfsize##_and(vec1d->impl[0], vec2d->impl[0]); \ 286 vec1d->impl[0] = v##sign##int##bits##x##halfsize##_and(vec1d->impl[0], vec2d->impl[0]); \
327 vec1d->impl[1] = v##sign##int##bits##x##halfsize##_and(vec1d->impl[1], vec2d->impl[1]); \ 287 vec1d->impl[1] = v##sign##int##bits##x##halfsize##_and(vec1d->impl[1], vec2d->impl[1]); \
328 \ 288 \
329 return vec1d->vec; \ 289 return vec1d->vec; \
330 } \ 290 } \
331 \ 291 \
332 VEC_FUNC_IMPL v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_or(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \ 292 v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_or(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \
333 { \ 293 { \
334 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ 294 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
335 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \ 295 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \
336 \ 296 \
337 vec1d->impl[0] = v##sign##int##bits##x##halfsize##_or(vec1d->impl[0], vec2d->impl[0]); \ 297 vec1d->impl[0] = v##sign##int##bits##x##halfsize##_or(vec1d->impl[0], vec2d->impl[0]); \
338 vec1d->impl[1] = v##sign##int##bits##x##halfsize##_or(vec1d->impl[1], vec2d->impl[1]); \ 298 vec1d->impl[1] = v##sign##int##bits##x##halfsize##_or(vec1d->impl[1], vec2d->impl[1]); \
339 \ 299 \
340 return vec1d->vec; \ 300 return vec1d->vec; \
341 } \ 301 } \
342 \ 302 \
343 VEC_FUNC_IMPL v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_xor(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \ 303 v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_xor(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \
344 { \ 304 { \
345 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ 305 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
346 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \ 306 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \
347 \ 307 \
348 vec1d->impl[0] = v##sign##int##bits##x##halfsize##_xor(vec1d->impl[0], vec2d->impl[0]); \ 308 vec1d->impl[0] = v##sign##int##bits##x##halfsize##_xor(vec1d->impl[0], vec2d->impl[0]); \
349 vec1d->impl[1] = v##sign##int##bits##x##halfsize##_xor(vec1d->impl[1], vec2d->impl[1]); \ 309 vec1d->impl[1] = v##sign##int##bits##x##halfsize##_xor(vec1d->impl[1], vec2d->impl[1]); \
350 \ 310 \
351 return vec1d->vec; \ 311 return vec1d->vec; \
352 } \ 312 } \
353 \ 313 \
354 VEC_FUNC_IMPL v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_lshift(v##sign##int##bits##x##size vec1, vuint##bits##x##size vec2) \ 314 v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_not(v##sign##int##bits##x##size vec1) \
315 { \
316 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
317 \
318 vec1d->impl[0] = v##sign##int##bits##x##halfsize##_not(vec1d->impl[0]); \
319 vec1d->impl[1] = v##sign##int##bits##x##halfsize##_not(vec1d->impl[1]); \
320 \
321 return vec1d->vec; \
322 } \
323 \
324 v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_lshift(v##sign##int##bits##x##size vec1, vuint##bits##x##size vec2) \
355 { \ 325 { \
356 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ 326 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
357 union vuint##bits##x##size##_impl_data *vec2d = (union vuint##bits##x##size##_impl_data *)&vec2; \ 327 union vuint##bits##x##size##_impl_data *vec2d = (union vuint##bits##x##size##_impl_data *)&vec2; \
358 \ 328 \
359 vec1d->impl[0] = v##sign##int##bits##x##halfsize##_lshift(vec1d->impl[0], vec2d->impl[0]); \ 329 vec1d->impl[0] = v##sign##int##bits##x##halfsize##_lshift(vec1d->impl[0], vec2d->impl[0]); \
360 vec1d->impl[1] = v##sign##int##bits##x##halfsize##_lshift(vec1d->impl[1], vec2d->impl[1]); \ 330 vec1d->impl[1] = v##sign##int##bits##x##halfsize##_lshift(vec1d->impl[1], vec2d->impl[1]); \
361 \ 331 \
362 return vec1d->vec; \ 332 return vec1d->vec; \
363 } \ 333 } \
364 \ 334 \
365 VEC_FUNC_IMPL v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_rshift(v##sign##int##bits##x##size vec1, vuint##bits##x##size vec2) \ 335 v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_rshift(v##sign##int##bits##x##size vec1, vuint##bits##x##size vec2) \
366 { \ 336 { \
367 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ 337 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
368 union vuint##bits##x##size##_impl_data *vec2d = (union vuint##bits##x##size##_impl_data *)&vec2; \ 338 union vuint##bits##x##size##_impl_data *vec2d = (union vuint##bits##x##size##_impl_data *)&vec2; \
369 \ 339 \
370 vec1d->impl[0] = v##sign##int##bits##x##halfsize##_rshift(vec1d->impl[0], vec2d->impl[0]); \ 340 vec1d->impl[0] = v##sign##int##bits##x##halfsize##_rshift(vec1d->impl[0], vec2d->impl[0]); \
371 vec1d->impl[1] = v##sign##int##bits##x##halfsize##_rshift(vec1d->impl[1], vec2d->impl[1]); \ 341 vec1d->impl[1] = v##sign##int##bits##x##halfsize##_rshift(vec1d->impl[1], vec2d->impl[1]); \
372 \ 342 \
373 return vec1d->vec; \ 343 return vec1d->vec; \
374 } \ 344 } \
375 \ 345 \
376 VEC_FUNC_IMPL v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_lrshift(v##sign##int##bits##x##size vec1, vuint##bits##x##size vec2) \ 346 v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_lrshift(v##sign##int##bits##x##size vec1, vuint##bits##x##size vec2) \
377 { \ 347 { \
378 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ 348 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
379 union vuint##bits##x##size##_impl_data *vec2d = (union vuint##bits##x##size##_impl_data *)&vec2; \ 349 union vuint##bits##x##size##_impl_data *vec2d = (union vuint##bits##x##size##_impl_data *)&vec2; \
380 \ 350 \
381 vec1d->impl[0] = v##sign##int##bits##x##halfsize##_lrshift(vec1d->impl[0], vec2d->impl[0]); \ 351 vec1d->impl[0] = v##sign##int##bits##x##halfsize##_lrshift(vec1d->impl[0], vec2d->impl[0]); \
382 vec1d->impl[1] = v##sign##int##bits##x##halfsize##_lrshift(vec1d->impl[1], vec2d->impl[1]); \ 352 vec1d->impl[1] = v##sign##int##bits##x##halfsize##_lrshift(vec1d->impl[1], vec2d->impl[1]); \
383 \ 353 \
384 return vec1d->vec; \ 354 return vec1d->vec; \
385 } \ 355 } \
386 \ 356 \
387 VEC_FUNC_IMPL v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_cmplt(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \ 357 v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_cmplt(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \
388 { \ 358 { \
389 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ 359 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
390 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \ 360 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \
391 \ 361 \
392 vec1d->impl[0] = v##sign##int##bits##x##halfsize##_cmplt(vec1d->impl[0], vec2d->impl[0]); \ 362 vec1d->impl[0] = v##sign##int##bits##x##halfsize##_cmplt(vec1d->impl[0], vec2d->impl[0]); \
393 vec1d->impl[1] = v##sign##int##bits##x##halfsize##_cmplt(vec1d->impl[1], vec2d->impl[1]); \ 363 vec1d->impl[1] = v##sign##int##bits##x##halfsize##_cmplt(vec1d->impl[1], vec2d->impl[1]); \
394 \ 364 \
395 return vec1d->vec; \ 365 return vec1d->vec; \
396 } \ 366 } \
397 \ 367 \
398 VEC_FUNC_IMPL v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_cmple(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \ 368 v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_cmple(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \
399 { \ 369 { \
400 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ 370 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
401 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \ 371 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \
402 \ 372 \
403 vec1d->impl[0] = v##sign##int##bits##x##halfsize##_cmple(vec1d->impl[0], vec2d->impl[0]); \ 373 vec1d->impl[0] = v##sign##int##bits##x##halfsize##_cmple(vec1d->impl[0], vec2d->impl[0]); \
404 vec1d->impl[1] = v##sign##int##bits##x##halfsize##_cmple(vec1d->impl[1], vec2d->impl[1]); \ 374 vec1d->impl[1] = v##sign##int##bits##x##halfsize##_cmple(vec1d->impl[1], vec2d->impl[1]); \
405 \ 375 \
406 return vec1d->vec; \ 376 return vec1d->vec; \
407 } \ 377 } \
408 \ 378 \
409 VEC_FUNC_IMPL v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_cmpeq(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \ 379 v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_cmpeq(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \
410 { \ 380 { \
411 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ 381 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
412 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \ 382 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \
413 \ 383 \
414 vec1d->impl[0] = v##sign##int##bits##x##halfsize##_cmpeq(vec1d->impl[0], vec2d->impl[0]); \ 384 vec1d->impl[0] = v##sign##int##bits##x##halfsize##_cmpeq(vec1d->impl[0], vec2d->impl[0]); \
415 vec1d->impl[1] = v##sign##int##bits##x##halfsize##_cmpeq(vec1d->impl[1], vec2d->impl[1]); \ 385 vec1d->impl[1] = v##sign##int##bits##x##halfsize##_cmpeq(vec1d->impl[1], vec2d->impl[1]); \
416 \ 386 \
417 return vec1d->vec; \ 387 return vec1d->vec; \
418 } \ 388 } \
419 \ 389 \
420 VEC_FUNC_IMPL v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_cmpge(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \ 390 v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_cmpge(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \
421 { \ 391 { \
422 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ 392 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
423 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \ 393 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \
424 \ 394 \
425 vec1d->impl[0] = v##sign##int##bits##x##halfsize##_cmpge(vec1d->impl[0], vec2d->impl[0]); \ 395 vec1d->impl[0] = v##sign##int##bits##x##halfsize##_cmpge(vec1d->impl[0], vec2d->impl[0]); \
426 vec1d->impl[1] = v##sign##int##bits##x##halfsize##_cmpge(vec1d->impl[1], vec2d->impl[1]); \ 396 vec1d->impl[1] = v##sign##int##bits##x##halfsize##_cmpge(vec1d->impl[1], vec2d->impl[1]); \
427 \ 397 \
428 return vec1d->vec; \ 398 return vec1d->vec; \
429 } \ 399 } \
430 \ 400 \
431 VEC_FUNC_IMPL v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_cmpgt(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \ 401 v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_cmpgt(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \
432 { \ 402 { \
433 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ 403 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
434 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \ 404 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \
435 \ 405 \
436 vec1d->impl[0] = v##sign##int##bits##x##halfsize##_cmpgt(vec1d->impl[0], vec2d->impl[0]); \ 406 vec1d->impl[0] = v##sign##int##bits##x##halfsize##_cmpgt(vec1d->impl[0], vec2d->impl[0]); \
437 vec1d->impl[1] = v##sign##int##bits##x##halfsize##_cmpgt(vec1d->impl[1], vec2d->impl[1]); \ 407 vec1d->impl[1] = v##sign##int##bits##x##halfsize##_cmpgt(vec1d->impl[1], vec2d->impl[1]); \
438 \ 408 \
439 return vec1d->vec; \ 409 return vec1d->vec; \
440 } \ 410 } \
441 \ 411 \
442 VEC_FUNC_IMPL v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_min(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \
443 { \
444 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
445 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \
446 \
447 vec1d->impl[0] = v##sign##int##bits##x##halfsize##_min(vec1d->impl[0], vec2d->impl[0]); \
448 vec1d->impl[1] = v##sign##int##bits##x##halfsize##_min(vec1d->impl[1], vec2d->impl[1]); \
449 \
450 return vec1d->vec; \
451 } \
452 \
453 VEC_FUNC_IMPL v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_max(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \
454 { \
455 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
456 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \
457 \
458 vec1d->impl[0] = v##sign##int##bits##x##halfsize##_max(vec1d->impl[0], vec2d->impl[0]); \
459 vec1d->impl[1] = v##sign##int##bits##x##halfsize##_max(vec1d->impl[1], vec2d->impl[1]); \
460 \
461 return vec1d->vec; \
462 } \
463 \
464 const v##sign##int##bits##x##size##_impl v##sign##int##bits##x##size##_impl_generic = { \ 412 const v##sign##int##bits##x##size##_impl v##sign##int##bits##x##size##_impl_generic = { \
465 .splat = v##sign##int##bits##x##size##_generic_splat, \ 413 v##sign##int##bits##x##size##_generic_splat, \
466 .load_aligned = v##sign##int##bits##x##size##_generic_load_aligned, \ 414 v##sign##int##bits##x##size##_generic_load_aligned, \
467 .load = v##sign##int##bits##x##size##_generic_load, \ 415 v##sign##int##bits##x##size##_generic_load, \
468 .store_aligned = v##sign##int##bits##x##size##_generic_store_aligned, \ 416 v##sign##int##bits##x##size##_generic_store_aligned, \
469 .store = v##sign##int##bits##x##size##_generic_store, \ 417 v##sign##int##bits##x##size##_generic_store, \
470 .add = v##sign##int##bits##x##size##_generic_add, \ 418 v##sign##int##bits##x##size##_generic_add, \
471 .sub = v##sign##int##bits##x##size##_generic_sub, \ 419 v##sign##int##bits##x##size##_generic_sub, \
472 .mul = v##sign##int##bits##x##size##_generic_mul, \ 420 v##sign##int##bits##x##size##_generic_mul, \
473 .div = v##sign##int##bits##x##size##_generic_div, \ 421 v##sign##int##bits##x##size##_generic_div, \
474 .avg = v##sign##int##bits##x##size##_generic_avg, \ 422 v##sign##int##bits##x##size##_generic_avg, \
475 .band = v##sign##int##bits##x##size##_generic_and, \ 423 v##sign##int##bits##x##size##_generic_and, \
476 .bor = v##sign##int##bits##x##size##_generic_or, \ 424 v##sign##int##bits##x##size##_generic_or, \
477 .bxor = v##sign##int##bits##x##size##_generic_xor, \ 425 v##sign##int##bits##x##size##_generic_xor, \
478 .lshift = v##sign##int##bits##x##size##_generic_lshift, \ 426 v##sign##int##bits##x##size##_generic_not, \
479 .rshift = v##sign##int##bits##x##size##_generic_rshift, \ 427 v##sign##int##bits##x##size##_generic_lshift, \
480 .lrshift = v##sign##int##bits##x##size##_generic_lrshift, \ 428 v##sign##int##bits##x##size##_generic_rshift, \
481 .cmplt = v##sign##int##bits##x##size##_generic_cmplt, \ 429 v##sign##int##bits##x##size##_generic_lrshift, \
482 .cmple = v##sign##int##bits##x##size##_generic_cmple, \ 430 v##sign##int##bits##x##size##_generic_cmplt, \
483 .cmpeq = v##sign##int##bits##x##size##_generic_cmpeq, \ 431 v##sign##int##bits##x##size##_generic_cmple, \
484 .cmpge = v##sign##int##bits##x##size##_generic_cmpge, \ 432 v##sign##int##bits##x##size##_generic_cmpeq, \
485 .cmpgt = v##sign##int##bits##x##size##_generic_cmpgt, \ 433 v##sign##int##bits##x##size##_generic_cmpge, \
486 .min = v##sign##int##bits##x##size##_generic_min, \ 434 v##sign##int##bits##x##size##_generic_cmpgt, \
487 .max = v##sign##int##bits##x##size##_generic_max, \
488 }; 435 };
489 436
490 #define VEC_GENERIC_DEFINE_OPERATIONS(bits, size, halfsize) \ 437 #define VEC_GENERIC_DEFINE_OPERATIONS(bits, size, halfsize) \
491 VEC_GENERIC_DEFINE_OPERATIONS_SIGN(u, U, bits, size, halfsize) \ 438 VEC_GENERIC_DEFINE_OPERATIONS_SIGN(u, U, bits, size, halfsize) \
492 VEC_GENERIC_DEFINE_OPERATIONS_SIGN( , , bits, size, halfsize) 439 VEC_GENERIC_DEFINE_OPERATIONS_SIGN( , , bits, size, halfsize)