Mercurial > vec
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) |