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