comparison src/impl/generic.c @ 28:c6c99ab1088a

*: add min/max functions and a big big refactor (again) agh, this time I added a few more implementations (and generally made the code just a little faster...)
author Paper <paper@tflc.us>
date Thu, 24 Apr 2025 00:54:02 -0400
parents 92156fe32755
children bf6ad516f1e6
comparison
equal deleted inserted replaced
27:d00b95f95dd1 28:c6c99ab1088a
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
1 #include "vec/impl/generic.h" 25 #include "vec/impl/generic.h"
2 26
3 #include <string.h> 27 #include <string.h>
4 28
5 // ----------------------------------------------------------------- 29 // -----------------------------------------------------------------
24 union v##sign##int##bits##x##size##_impl_data { \ 48 union v##sign##int##bits##x##size##_impl_data { \
25 v##sign##int##bits##x##size vec; \ 49 v##sign##int##bits##x##size vec; \
26 vec_##sign##int##bits impl[size]; \ 50 vec_##sign##int##bits impl[size]; \
27 }; \ 51 }; \
28 \ 52 \
29 v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_splat(vec_##sign##int##bits x) \ 53 VEC_FUNC_IMPL v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_splat(vec_##sign##int##bits x) \
30 { \ 54 { \
31 v##sign##int##bits##x##size vec; \ 55 v##sign##int##bits##x##size vec; \
32 for (int i = 0; i < size; i++) \ 56 for (int i = 0; i < size; i++) \
33 ((union v##sign##int##bits##x##size##_impl_data *)&vec)->impl[i] = x; \ 57 ((union v##sign##int##bits##x##size##_impl_data *)&vec)->impl[i] = x; \
34 return vec; \ 58 return vec; \
35 } \ 59 } \
36 \ 60 \
37 v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_load_aligned(const vec_##sign##int##bits in[size]) \ 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]) \
38 { \ 62 { \
39 v##sign##int##bits##x##size vec; \ 63 v##sign##int##bits##x##size vec; \
40 memcpy(&vec, in, sizeof(vec_##sign##int##bits) * size); \ 64 memcpy(&vec, in, sizeof(vec_##sign##int##bits) * size); \
41 return vec; \ 65 return vec; \
42 } \ 66 } \
43 \ 67 \
44 void v##sign##int##bits##x##size##_generic_store_aligned(v##sign##int##bits##x##size vec, vec_##sign##int##bits out[size]) \ 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]) \
45 { \ 69 { \
46 memcpy(out, &vec, sizeof(vec_##sign##int##bits) * size); \ 70 memcpy(out, &vec, sizeof(vec_##sign##int##bits) * size); \
47 } \ 71 } \
48 \ 72 \
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) \ 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) \
50 { \ 74 { \
51 VEC_GENERIC_BUILTIN_OPERATION(+, sign, csign, bits, size); \ 75 VEC_GENERIC_BUILTIN_OPERATION(+, sign, csign, bits, size); \
52 } \ 76 } \
53 \ 77 \
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) \ 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) \
55 { \ 79 { \
56 VEC_GENERIC_BUILTIN_OPERATION(-, sign, csign, bits, size); \ 80 VEC_GENERIC_BUILTIN_OPERATION(-, sign, csign, bits, size); \
57 } \ 81 } \
58 \ 82 \
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) \ 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) \
60 { \ 84 { \
61 VEC_GENERIC_BUILTIN_OPERATION(*, sign, csign, bits, size); \ 85 VEC_GENERIC_BUILTIN_OPERATION(*, sign, csign, bits, size); \
62 } \ 86 } \
63 \ 87 \
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) \ 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) \
65 { \ 89 { \
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); \ 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); \
67 } \ 91 } \
68 \ 92 \
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) \ 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) \
70 { \ 94 { \
71 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ 95 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
72 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \ 96 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \
73 \ 97 \
74 for (int i = 0; i < size; i++) \ 98 for (int i = 0; i < size; i++) \
75 vec1d->impl[i] = vec_##sign##avg(vec1d->impl[i], vec2d->impl[i]); \ 99 vec1d->impl[i] = vec_##sign##avg(vec1d->impl[i], vec2d->impl[i]); \
76 \ 100 \
77 return vec1d->vec; \ 101 return vec1d->vec; \
78 } \ 102 } \
79 \ 103 \
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) \ 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) \
81 { \ 105 { \
82 VEC_GENERIC_BUILTIN_OPERATION(&, sign, csign, bits, size); \ 106 VEC_GENERIC_BUILTIN_OPERATION(&, sign, csign, bits, size); \
83 } \ 107 } \
84 \ 108 \
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) \ 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) \
86 { \ 110 { \
87 VEC_GENERIC_BUILTIN_OPERATION(|, sign, csign, bits, size); \ 111 VEC_GENERIC_BUILTIN_OPERATION(|, sign, csign, bits, size); \
88 } \ 112 } \
89 \ 113 \
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) \ 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) \
91 { \ 115 { \
92 VEC_GENERIC_BUILTIN_OPERATION(^, sign, csign, bits, size); \ 116 VEC_GENERIC_BUILTIN_OPERATION(^, sign, csign, bits, size); \
93 } \ 117 } \
94 \ 118 \
95 v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_not(v##sign##int##bits##x##size vec) \ 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) \
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) \
101 { \ 120 { \
102 VEC_GENERIC_CMP(<, sign, csign, bits, size); \ 121 VEC_GENERIC_CMP(<, sign, csign, bits, size); \
103 } \ 122 } \
104 \ 123 \
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) \ 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) \
106 { \ 125 { \
107 VEC_GENERIC_CMP(<=, sign, csign, bits, size); \ 126 return v##sign##int##bits##x##size##_not(v##sign##int##bits##x##size##_cmpgt(vec1, vec2)); \
108 } \ 127 } \
109 \ 128 \
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) \ 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) \
111 { \ 130 { \
112 VEC_GENERIC_CMP(==, sign, csign, bits, size); \ 131 VEC_GENERIC_CMP(==, sign, csign, bits, size); \
113 } \ 132 } \
114 \ 133 \
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) \ 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) \
116 { \ 135 { \
117 VEC_GENERIC_CMP(>=, sign, csign, bits, size); \ 136 return v##sign##int##bits##x##size##_not(v##sign##int##bits##x##size##_cmplt(vec1, vec2)); \
118 } \ 137 } \
119 \ 138 \
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) \ 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) \
121 { \ 140 { \
122 VEC_GENERIC_CMP(>, sign, csign, bits, size); \ 141 VEC_GENERIC_CMP(>, sign, csign, bits, size); \
123 } \ 142 } \
124 \ 143 \
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) \ 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) \
126 { \ 145 { \
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); \ 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); \
128 } \ 147 } \
129 \ 148 \
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) \ 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) \
131 { \ 150 { \
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); \ 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); \
133 } \ 152 } \
134 \ 153 \
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) \ 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) \
136 { \ 155 { \
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); \ 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); \
138 } \ 157 } \
139 \ 158 \
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 \
140 const v##sign##int##bits##x##size##_impl v##sign##int##bits##x##size##_impl_generic = { \ 179 const v##sign##int##bits##x##size##_impl v##sign##int##bits##x##size##_impl_generic = { \
141 v##sign##int##bits##x##size##_generic_splat, \ 180 .splat = v##sign##int##bits##x##size##_generic_splat, \
142 v##sign##int##bits##x##size##_generic_load_aligned, \ 181 .load_aligned = v##sign##int##bits##x##size##_generic_load_aligned, \
143 v##sign##int##bits##x##size##_generic_load_aligned, \ 182 .load = v##sign##int##bits##x##size##_generic_load_aligned, \
144 v##sign##int##bits##x##size##_generic_store_aligned, \ 183 .store_aligned = v##sign##int##bits##x##size##_generic_store_aligned, \
145 v##sign##int##bits##x##size##_generic_store_aligned, \ 184 .store = v##sign##int##bits##x##size##_generic_store_aligned, \
146 v##sign##int##bits##x##size##_generic_add, \ 185 .add = v##sign##int##bits##x##size##_generic_add, \
147 v##sign##int##bits##x##size##_generic_sub, \ 186 .sub = v##sign##int##bits##x##size##_generic_sub, \
148 v##sign##int##bits##x##size##_generic_mul, \ 187 .mul = v##sign##int##bits##x##size##_generic_mul, \
149 v##sign##int##bits##x##size##_generic_div, \ 188 .div = v##sign##int##bits##x##size##_generic_div, \
150 v##sign##int##bits##x##size##_generic_avg, \ 189 .avg = v##sign##int##bits##x##size##_generic_avg, \
151 v##sign##int##bits##x##size##_generic_and, \ 190 .band = v##sign##int##bits##x##size##_generic_and, \
152 v##sign##int##bits##x##size##_generic_or, \ 191 .bor = v##sign##int##bits##x##size##_generic_or, \
153 v##sign##int##bits##x##size##_generic_xor, \ 192 .bxor = v##sign##int##bits##x##size##_generic_xor, \
154 v##sign##int##bits##x##size##_generic_not, \ 193 .lshift = v##sign##int##bits##x##size##_generic_lshift, \
155 v##sign##int##bits##x##size##_generic_lshift, \ 194 .rshift = v##sign##int##bits##x##size##_generic_rshift, \
156 v##sign##int##bits##x##size##_generic_rshift, \ 195 .lrshift = v##sign##int##bits##x##size##_generic_lrshift, \
157 v##sign##int##bits##x##size##_generic_lrshift, \ 196 .cmplt = v##sign##int##bits##x##size##_generic_cmplt, \
158 v##sign##int##bits##x##size##_generic_cmplt, \ 197 .cmple = v##sign##int##bits##x##size##_generic_cmple, \
159 v##sign##int##bits##x##size##_generic_cmple, \ 198 .cmpeq = v##sign##int##bits##x##size##_generic_cmpeq, \
160 v##sign##int##bits##x##size##_generic_cmpeq, \ 199 .cmpge = v##sign##int##bits##x##size##_generic_cmpge, \
161 v##sign##int##bits##x##size##_generic_cmpge, \ 200 .cmpgt = v##sign##int##bits##x##size##_generic_cmpgt, \
162 v##sign##int##bits##x##size##_generic_cmpgt, \ 201 .min = v##sign##int##bits##x##size##_generic_min, \
202 .max = v##sign##int##bits##x##size##_generic_max, \
163 }; 203 };
164 204
165 #define VEC_GENERIC_DEFINE_OPERATIONS(bits, size) \ 205 #define VEC_GENERIC_DEFINE_OPERATIONS(bits, size) \
166 VEC_GENERIC_DEFINE_OPERATIONS_SIGN(u, U, bits, size) \ 206 VEC_GENERIC_DEFINE_OPERATIONS_SIGN(u, U, bits, size) \
167 VEC_GENERIC_DEFINE_OPERATIONS_SIGN( , , bits, size) 207 VEC_GENERIC_DEFINE_OPERATIONS_SIGN( , , bits, size)
181 union v##sign##int##bits##x##size##_impl_data { \ 221 union v##sign##int##bits##x##size##_impl_data { \
182 v##sign##int##bits##x##size vec; \ 222 v##sign##int##bits##x##size vec; \
183 v##sign##int##bits##x##halfsize impl[2]; \ 223 v##sign##int##bits##x##halfsize impl[2]; \
184 }; \ 224 }; \
185 \ 225 \
186 v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_splat(vec_##sign##int##bits x) \ 226 VEC_FUNC_IMPL v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_splat(vec_##sign##int##bits x) \
187 { \ 227 { \
188 union v##sign##int##bits##x##size##_impl_data vec; \ 228 union v##sign##int##bits##x##size##_impl_data vec; \
189 vec.impl[0] = v##sign##int##bits##x##halfsize##_splat(x); \ 229 vec.impl[0] = v##sign##int##bits##x##halfsize##_splat(x); \
190 vec.impl[1] = v##sign##int##bits##x##halfsize##_splat(x); \ 230 vec.impl[1] = v##sign##int##bits##x##halfsize##_splat(x); \
191 return vec.vec; \ 231 return vec.vec; \
192 } \ 232 } \
193 \ 233 \
194 v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_load_aligned(const vec_##sign##int##bits in[size]) \ 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]) \
195 { \ 235 { \
196 union v##sign##int##bits##x##size##_impl_data vec; \ 236 union v##sign##int##bits##x##size##_impl_data vec; \
197 vec.impl[0] = v##sign##int##bits##x##halfsize##_load_aligned(in); \ 237 vec.impl[0] = v##sign##int##bits##x##halfsize##_load_aligned(in); \
198 vec.impl[1] = v##sign##int##bits##x##halfsize##_load_aligned(in + halfsize); \ 238 vec.impl[1] = v##sign##int##bits##x##halfsize##_load_aligned(in + halfsize); \
199 return vec.vec; \ 239 return vec.vec; \
200 } \ 240 } \
201 \ 241 \
202 v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_load(const vec_##sign##int##bits in[size]) \ 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]) \
203 { \ 243 { \
204 union v##sign##int##bits##x##size##_impl_data vec; \ 244 union v##sign##int##bits##x##size##_impl_data vec; \
205 vec.impl[0] = v##sign##int##bits##x##halfsize##_load(in); \ 245 vec.impl[0] = v##sign##int##bits##x##halfsize##_load(in); \
206 vec.impl[1] = v##sign##int##bits##x##halfsize##_load(in + halfsize); \ 246 vec.impl[1] = v##sign##int##bits##x##halfsize##_load(in + halfsize); \
207 return vec.vec; \ 247 return vec.vec; \
208 } \ 248 } \
209 \ 249 \
210 void v##sign##int##bits##x##size##_generic_store_aligned(v##sign##int##bits##x##size vec, vec_##sign##int##bits out[size]) \ 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]) \
211 { \ 251 { \
212 union v##sign##int##bits##x##size##_impl_data *vecd = (union v##sign##int##bits##x##size##_impl_data *)&vec; \ 252 union v##sign##int##bits##x##size##_impl_data *vecd = (union v##sign##int##bits##x##size##_impl_data *)&vec; \
213 \ 253 \
214 v##sign##int##bits##x##halfsize##_store_aligned(vecd->impl[0], out); \ 254 v##sign##int##bits##x##halfsize##_store_aligned(vecd->impl[0], out); \
215 v##sign##int##bits##x##halfsize##_store_aligned(vecd->impl[1], out + halfsize); \ 255 v##sign##int##bits##x##halfsize##_store_aligned(vecd->impl[1], out + halfsize); \
216 } \ 256 } \
217 \ 257 \
218 void v##sign##int##bits##x##size##_generic_store(v##sign##int##bits##x##size vec, vec_##sign##int##bits out[size]) \ 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]) \
219 { \ 259 { \
220 union v##sign##int##bits##x##size##_impl_data *vecd = (union v##sign##int##bits##x##size##_impl_data *)&vec; \ 260 union v##sign##int##bits##x##size##_impl_data *vecd = (union v##sign##int##bits##x##size##_impl_data *)&vec; \
221 \ 261 \
222 v##sign##int##bits##x##halfsize##_store(vecd->impl[0], out); \ 262 v##sign##int##bits##x##halfsize##_store(vecd->impl[0], out); \
223 v##sign##int##bits##x##halfsize##_store(vecd->impl[1], out + halfsize); \ 263 v##sign##int##bits##x##halfsize##_store(vecd->impl[1], out + halfsize); \
224 } \ 264 } \
225 \ 265 \
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) \ 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) \
227 { \ 267 { \
228 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ 268 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
229 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \ 269 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \
230 \ 270 \
231 vec1d->impl[0] = v##sign##int##bits##x##halfsize##_add(vec1d->impl[0], vec2d->impl[0]); \ 271 vec1d->impl[0] = v##sign##int##bits##x##halfsize##_add(vec1d->impl[0], vec2d->impl[0]); \
232 vec1d->impl[1] = v##sign##int##bits##x##halfsize##_add(vec1d->impl[1], vec2d->impl[1]); \ 272 vec1d->impl[1] = v##sign##int##bits##x##halfsize##_add(vec1d->impl[1], vec2d->impl[1]); \
233 \ 273 \
234 return vec1d->vec; \ 274 return vec1d->vec; \
235 } \ 275 } \
236 \ 276 \
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) \ 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) \
238 { \ 278 { \
239 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ 279 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
240 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \ 280 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \
241 \ 281 \
242 vec1d->impl[0] = v##sign##int##bits##x##halfsize##_sub(vec1d->impl[0], vec2d->impl[0]); \ 282 vec1d->impl[0] = v##sign##int##bits##x##halfsize##_sub(vec1d->impl[0], vec2d->impl[0]); \
243 vec1d->impl[1] = v##sign##int##bits##x##halfsize##_sub(vec1d->impl[1], vec2d->impl[1]); \ 283 vec1d->impl[1] = v##sign##int##bits##x##halfsize##_sub(vec1d->impl[1], vec2d->impl[1]); \
244 \ 284 \
245 return vec1d->vec; \ 285 return vec1d->vec; \
246 } \ 286 } \
247 \ 287 \
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) \ 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) \
249 { \ 289 { \
250 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ 290 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
251 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \ 291 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \
252 \ 292 \
253 vec1d->impl[0] = v##sign##int##bits##x##halfsize##_mul(vec1d->impl[0], vec2d->impl[0]); \ 293 vec1d->impl[0] = v##sign##int##bits##x##halfsize##_mul(vec1d->impl[0], vec2d->impl[0]); \
254 vec1d->impl[1] = v##sign##int##bits##x##halfsize##_mul(vec1d->impl[1], vec2d->impl[1]); \ 294 vec1d->impl[1] = v##sign##int##bits##x##halfsize##_mul(vec1d->impl[1], vec2d->impl[1]); \
255 \ 295 \
256 return vec1d->vec; \ 296 return vec1d->vec; \
257 } \ 297 } \
258 \ 298 \
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) \ 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) \
260 { \ 300 { \
261 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ 301 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
262 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \ 302 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \
263 \ 303 \
264 vec1d->impl[0] = v##sign##int##bits##x##halfsize##_div(vec1d->impl[0], vec2d->impl[0]); \ 304 vec1d->impl[0] = v##sign##int##bits##x##halfsize##_div(vec1d->impl[0], vec2d->impl[0]); \
265 vec1d->impl[1] = v##sign##int##bits##x##halfsize##_div(vec1d->impl[1], vec2d->impl[1]); \ 305 vec1d->impl[1] = v##sign##int##bits##x##halfsize##_div(vec1d->impl[1], vec2d->impl[1]); \
266 \ 306 \
267 return vec1d->vec; \ 307 return vec1d->vec; \
268 } \ 308 } \
269 \ 309 \
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) \ 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) \
271 { \ 311 { \
272 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ 312 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
273 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \ 313 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \
274 \ 314 \
275 vec1d->impl[0] = v##sign##int##bits##x##halfsize##_avg(vec1d->impl[0], vec2d->impl[0]); \ 315 vec1d->impl[0] = v##sign##int##bits##x##halfsize##_avg(vec1d->impl[0], vec2d->impl[0]); \
276 vec1d->impl[1] = v##sign##int##bits##x##halfsize##_avg(vec1d->impl[1], vec2d->impl[1]); \ 316 vec1d->impl[1] = v##sign##int##bits##x##halfsize##_avg(vec1d->impl[1], vec2d->impl[1]); \
277 \ 317 \
278 return vec1d->vec; \ 318 return vec1d->vec; \
279 } \ 319 } \
280 \ 320 \
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) \ 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) \
282 { \ 322 { \
283 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ 323 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
284 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \ 324 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \
285 \ 325 \
286 vec1d->impl[0] = v##sign##int##bits##x##halfsize##_and(vec1d->impl[0], vec2d->impl[0]); \ 326 vec1d->impl[0] = v##sign##int##bits##x##halfsize##_and(vec1d->impl[0], vec2d->impl[0]); \
287 vec1d->impl[1] = v##sign##int##bits##x##halfsize##_and(vec1d->impl[1], vec2d->impl[1]); \ 327 vec1d->impl[1] = v##sign##int##bits##x##halfsize##_and(vec1d->impl[1], vec2d->impl[1]); \
288 \ 328 \
289 return vec1d->vec; \ 329 return vec1d->vec; \
290 } \ 330 } \
291 \ 331 \
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) \ 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) \
293 { \ 333 { \
294 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ 334 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
295 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \ 335 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \
296 \ 336 \
297 vec1d->impl[0] = v##sign##int##bits##x##halfsize##_or(vec1d->impl[0], vec2d->impl[0]); \ 337 vec1d->impl[0] = v##sign##int##bits##x##halfsize##_or(vec1d->impl[0], vec2d->impl[0]); \
298 vec1d->impl[1] = v##sign##int##bits##x##halfsize##_or(vec1d->impl[1], vec2d->impl[1]); \ 338 vec1d->impl[1] = v##sign##int##bits##x##halfsize##_or(vec1d->impl[1], vec2d->impl[1]); \
299 \ 339 \
300 return vec1d->vec; \ 340 return vec1d->vec; \
301 } \ 341 } \
302 \ 342 \
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) \ 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) \
304 { \ 344 { \
305 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ 345 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
306 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \ 346 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \
307 \ 347 \
308 vec1d->impl[0] = v##sign##int##bits##x##halfsize##_xor(vec1d->impl[0], vec2d->impl[0]); \ 348 vec1d->impl[0] = v##sign##int##bits##x##halfsize##_xor(vec1d->impl[0], vec2d->impl[0]); \
309 vec1d->impl[1] = v##sign##int##bits##x##halfsize##_xor(vec1d->impl[1], vec2d->impl[1]); \ 349 vec1d->impl[1] = v##sign##int##bits##x##halfsize##_xor(vec1d->impl[1], vec2d->impl[1]); \
310 \ 350 \
311 return vec1d->vec; \ 351 return vec1d->vec; \
312 } \ 352 } \
313 \ 353 \
314 v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_not(v##sign##int##bits##x##size vec1) \ 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) \
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) \
325 { \ 355 { \
326 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ 356 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
327 union vuint##bits##x##size##_impl_data *vec2d = (union vuint##bits##x##size##_impl_data *)&vec2; \ 357 union vuint##bits##x##size##_impl_data *vec2d = (union vuint##bits##x##size##_impl_data *)&vec2; \
328 \ 358 \
329 vec1d->impl[0] = v##sign##int##bits##x##halfsize##_lshift(vec1d->impl[0], vec2d->impl[0]); \ 359 vec1d->impl[0] = v##sign##int##bits##x##halfsize##_lshift(vec1d->impl[0], vec2d->impl[0]); \
330 vec1d->impl[1] = v##sign##int##bits##x##halfsize##_lshift(vec1d->impl[1], vec2d->impl[1]); \ 360 vec1d->impl[1] = v##sign##int##bits##x##halfsize##_lshift(vec1d->impl[1], vec2d->impl[1]); \
331 \ 361 \
332 return vec1d->vec; \ 362 return vec1d->vec; \
333 } \ 363 } \
334 \ 364 \
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) \ 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) \
336 { \ 366 { \
337 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ 367 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
338 union vuint##bits##x##size##_impl_data *vec2d = (union vuint##bits##x##size##_impl_data *)&vec2; \ 368 union vuint##bits##x##size##_impl_data *vec2d = (union vuint##bits##x##size##_impl_data *)&vec2; \
339 \ 369 \
340 vec1d->impl[0] = v##sign##int##bits##x##halfsize##_rshift(vec1d->impl[0], vec2d->impl[0]); \ 370 vec1d->impl[0] = v##sign##int##bits##x##halfsize##_rshift(vec1d->impl[0], vec2d->impl[0]); \
341 vec1d->impl[1] = v##sign##int##bits##x##halfsize##_rshift(vec1d->impl[1], vec2d->impl[1]); \ 371 vec1d->impl[1] = v##sign##int##bits##x##halfsize##_rshift(vec1d->impl[1], vec2d->impl[1]); \
342 \ 372 \
343 return vec1d->vec; \ 373 return vec1d->vec; \
344 } \ 374 } \
345 \ 375 \
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) \ 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) \
347 { \ 377 { \
348 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ 378 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
349 union vuint##bits##x##size##_impl_data *vec2d = (union vuint##bits##x##size##_impl_data *)&vec2; \ 379 union vuint##bits##x##size##_impl_data *vec2d = (union vuint##bits##x##size##_impl_data *)&vec2; \
350 \ 380 \
351 vec1d->impl[0] = v##sign##int##bits##x##halfsize##_lrshift(vec1d->impl[0], vec2d->impl[0]); \ 381 vec1d->impl[0] = v##sign##int##bits##x##halfsize##_lrshift(vec1d->impl[0], vec2d->impl[0]); \
352 vec1d->impl[1] = v##sign##int##bits##x##halfsize##_lrshift(vec1d->impl[1], vec2d->impl[1]); \ 382 vec1d->impl[1] = v##sign##int##bits##x##halfsize##_lrshift(vec1d->impl[1], vec2d->impl[1]); \
353 \ 383 \
354 return vec1d->vec; \ 384 return vec1d->vec; \
355 } \ 385 } \
356 \ 386 \
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) \ 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) \
358 { \ 388 { \
359 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ 389 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
360 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \ 390 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \
361 \ 391 \
362 vec1d->impl[0] = v##sign##int##bits##x##halfsize##_cmplt(vec1d->impl[0], vec2d->impl[0]); \ 392 vec1d->impl[0] = v##sign##int##bits##x##halfsize##_cmplt(vec1d->impl[0], vec2d->impl[0]); \
363 vec1d->impl[1] = v##sign##int##bits##x##halfsize##_cmplt(vec1d->impl[1], vec2d->impl[1]); \ 393 vec1d->impl[1] = v##sign##int##bits##x##halfsize##_cmplt(vec1d->impl[1], vec2d->impl[1]); \
364 \ 394 \
365 return vec1d->vec; \ 395 return vec1d->vec; \
366 } \ 396 } \
367 \ 397 \
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) \ 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) \
369 { \ 399 { \
370 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ 400 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
371 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \ 401 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \
372 \ 402 \
373 vec1d->impl[0] = v##sign##int##bits##x##halfsize##_cmple(vec1d->impl[0], vec2d->impl[0]); \ 403 vec1d->impl[0] = v##sign##int##bits##x##halfsize##_cmple(vec1d->impl[0], vec2d->impl[0]); \
374 vec1d->impl[1] = v##sign##int##bits##x##halfsize##_cmple(vec1d->impl[1], vec2d->impl[1]); \ 404 vec1d->impl[1] = v##sign##int##bits##x##halfsize##_cmple(vec1d->impl[1], vec2d->impl[1]); \
375 \ 405 \
376 return vec1d->vec; \ 406 return vec1d->vec; \
377 } \ 407 } \
378 \ 408 \
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) \ 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) \
380 { \ 410 { \
381 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ 411 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
382 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \ 412 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \
383 \ 413 \
384 vec1d->impl[0] = v##sign##int##bits##x##halfsize##_cmpeq(vec1d->impl[0], vec2d->impl[0]); \ 414 vec1d->impl[0] = v##sign##int##bits##x##halfsize##_cmpeq(vec1d->impl[0], vec2d->impl[0]); \
385 vec1d->impl[1] = v##sign##int##bits##x##halfsize##_cmpeq(vec1d->impl[1], vec2d->impl[1]); \ 415 vec1d->impl[1] = v##sign##int##bits##x##halfsize##_cmpeq(vec1d->impl[1], vec2d->impl[1]); \
386 \ 416 \
387 return vec1d->vec; \ 417 return vec1d->vec; \
388 } \ 418 } \
389 \ 419 \
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) \ 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) \
391 { \ 421 { \
392 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ 422 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
393 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \ 423 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \
394 \ 424 \
395 vec1d->impl[0] = v##sign##int##bits##x##halfsize##_cmpge(vec1d->impl[0], vec2d->impl[0]); \ 425 vec1d->impl[0] = v##sign##int##bits##x##halfsize##_cmpge(vec1d->impl[0], vec2d->impl[0]); \
396 vec1d->impl[1] = v##sign##int##bits##x##halfsize##_cmpge(vec1d->impl[1], vec2d->impl[1]); \ 426 vec1d->impl[1] = v##sign##int##bits##x##halfsize##_cmpge(vec1d->impl[1], vec2d->impl[1]); \
397 \ 427 \
398 return vec1d->vec; \ 428 return vec1d->vec; \
399 } \ 429 } \
400 \ 430 \
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) \ 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) \
402 { \ 432 { \
403 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ 433 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
404 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \ 434 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \
405 \ 435 \
406 vec1d->impl[0] = v##sign##int##bits##x##halfsize##_cmpgt(vec1d->impl[0], vec2d->impl[0]); \ 436 vec1d->impl[0] = v##sign##int##bits##x##halfsize##_cmpgt(vec1d->impl[0], vec2d->impl[0]); \
407 vec1d->impl[1] = v##sign##int##bits##x##halfsize##_cmpgt(vec1d->impl[1], vec2d->impl[1]); \ 437 vec1d->impl[1] = v##sign##int##bits##x##halfsize##_cmpgt(vec1d->impl[1], vec2d->impl[1]); \
408 \ 438 \
409 return vec1d->vec; \ 439 return vec1d->vec; \
410 } \ 440 } \
411 \ 441 \
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 \
412 const v##sign##int##bits##x##size##_impl v##sign##int##bits##x##size##_impl_generic = { \ 464 const v##sign##int##bits##x##size##_impl v##sign##int##bits##x##size##_impl_generic = { \
413 v##sign##int##bits##x##size##_generic_splat, \ 465 .splat = v##sign##int##bits##x##size##_generic_splat, \
414 v##sign##int##bits##x##size##_generic_load_aligned, \ 466 .load_aligned = v##sign##int##bits##x##size##_generic_load_aligned, \
415 v##sign##int##bits##x##size##_generic_load, \ 467 .load = v##sign##int##bits##x##size##_generic_load, \
416 v##sign##int##bits##x##size##_generic_store_aligned, \ 468 .store_aligned = v##sign##int##bits##x##size##_generic_store_aligned, \
417 v##sign##int##bits##x##size##_generic_store, \ 469 .store = v##sign##int##bits##x##size##_generic_store, \
418 v##sign##int##bits##x##size##_generic_add, \ 470 .add = v##sign##int##bits##x##size##_generic_add, \
419 v##sign##int##bits##x##size##_generic_sub, \ 471 .sub = v##sign##int##bits##x##size##_generic_sub, \
420 v##sign##int##bits##x##size##_generic_mul, \ 472 .mul = v##sign##int##bits##x##size##_generic_mul, \
421 v##sign##int##bits##x##size##_generic_div, \ 473 .div = v##sign##int##bits##x##size##_generic_div, \
422 v##sign##int##bits##x##size##_generic_avg, \ 474 .avg = v##sign##int##bits##x##size##_generic_avg, \
423 v##sign##int##bits##x##size##_generic_and, \ 475 .band = v##sign##int##bits##x##size##_generic_and, \
424 v##sign##int##bits##x##size##_generic_or, \ 476 .bor = v##sign##int##bits##x##size##_generic_or, \
425 v##sign##int##bits##x##size##_generic_xor, \ 477 .bxor = v##sign##int##bits##x##size##_generic_xor, \
426 v##sign##int##bits##x##size##_generic_not, \ 478 .lshift = v##sign##int##bits##x##size##_generic_lshift, \
427 v##sign##int##bits##x##size##_generic_lshift, \ 479 .rshift = v##sign##int##bits##x##size##_generic_rshift, \
428 v##sign##int##bits##x##size##_generic_rshift, \ 480 .lrshift = v##sign##int##bits##x##size##_generic_lrshift, \
429 v##sign##int##bits##x##size##_generic_lrshift, \ 481 .cmplt = v##sign##int##bits##x##size##_generic_cmplt, \
430 v##sign##int##bits##x##size##_generic_cmplt, \ 482 .cmple = v##sign##int##bits##x##size##_generic_cmple, \
431 v##sign##int##bits##x##size##_generic_cmple, \ 483 .cmpeq = v##sign##int##bits##x##size##_generic_cmpeq, \
432 v##sign##int##bits##x##size##_generic_cmpeq, \ 484 .cmpge = v##sign##int##bits##x##size##_generic_cmpge, \
433 v##sign##int##bits##x##size##_generic_cmpge, \ 485 .cmpgt = v##sign##int##bits##x##size##_generic_cmpgt, \
434 v##sign##int##bits##x##size##_generic_cmpgt, \ 486 .min = v##sign##int##bits##x##size##_generic_min, \
487 .max = v##sign##int##bits##x##size##_generic_max, \
435 }; 488 };
436 489
437 #define VEC_GENERIC_DEFINE_OPERATIONS(bits, size, halfsize) \ 490 #define VEC_GENERIC_DEFINE_OPERATIONS(bits, size, halfsize) \
438 VEC_GENERIC_DEFINE_OPERATIONS_SIGN(u, U, bits, size, halfsize) \ 491 VEC_GENERIC_DEFINE_OPERATIONS_SIGN(u, U, bits, size, halfsize) \
439 VEC_GENERIC_DEFINE_OPERATIONS_SIGN( , , bits, size, halfsize) 492 VEC_GENERIC_DEFINE_OPERATIONS_SIGN( , , bits, size, halfsize)