logic.h (76476B) - Raw
1 /*! @header 2 * The interfaces declared in this header provide logical and bitwise 3 * operations on vectors. Some of these function operate elementwise, 4 * and some produce a scalar result that depends on all lanes of the input. 5 * 6 * For functions returning a boolean value, the return type in C and 7 * Objective-C is _Bool; for C++ it is bool. 8 * 9 * Function Result 10 * ------------------------------------------------------------------ 11 * simd_all(comparison) True if and only if the comparison is true 12 * in every vector lane. e.g.: 13 * 14 * if (simd_all(x == 0.0f)) { 15 * // executed if every lane of x 16 * // contains zero. 17 * } 18 * 19 * The precise function of simd_all is to 20 * return the high-order bit of the result 21 * of a horizontal bitwise AND of all vector 22 * lanes. 23 * 24 * simd_any(comparison) True if and only if the comparison is true 25 * in at least one vector lane. e.g.: 26 * 27 * if (simd_any(x < 0.0f)) { 28 * // executed if any lane of x 29 * // contains a negative value. 30 * } 31 * 32 * The precise function of simd_all is to 33 * return the high-order bit of the result 34 * of a horizontal bitwise OR of all vector 35 * lanes. 36 * 37 * simd_select(x,y,mask) For each lane in the result, selects the 38 * corresponding element of x if the high- 39 * order bit of the corresponding element of 40 * mask is 0, and the corresponding element 41 * of y otherwise. 42 * 43 * simd_bitselect(x,y,mask) For each bit in the result, selects the 44 * corresponding bit of x if the corresponding 45 * bit of mask is clear, and the corresponding 46 * of y otherwise. 47 * 48 * In C++, these functions are available under the simd:: namespace: 49 * 50 * C++ Function Equivalent C Function 51 * -------------------------------------------------------------------- 52 * simd::all(comparison) simd_all(comparison) 53 * simd::any(comparison) simd_any(comparison) 54 * simd::select(x,y,mask) simd_select(x,y,mask) 55 * simd::bitselect(x,y,mask) simd_bitselect(x,y,mask) 56 * 57 * @copyright 2014-2017 Apple, Inc. All rights reserved. 58 * @unsorted */ 59 60 #ifndef SIMD_LOGIC_HEADER 61 #define SIMD_LOGIC_HEADER 62 63 #include <simd/base.h> 64 #if SIMD_COMPILER_HAS_REQUIRED_FEATURES 65 #include <simd/vector_make.h> 66 #include <stdint.h> 67 68 #ifdef __cplusplus 69 extern "C" { 70 #endif 71 72 /*! @abstract True if and only if the high-order bit of any lane of the 73 * vector is set. */ 74 static inline SIMD_CFUNC simd_bool simd_any(simd_char2 x); 75 /*! @abstract True if and only if the high-order bit of any lane of the 76 * vector is set. */ 77 static inline SIMD_CFUNC simd_bool simd_any(simd_char3 x); 78 /*! @abstract True if and only if the high-order bit of any lane of the 79 * vector is set. */ 80 static inline SIMD_CFUNC simd_bool simd_any(simd_char4 x); 81 /*! @abstract True if and only if the high-order bit of any lane of the 82 * vector is set. */ 83 static inline SIMD_CFUNC simd_bool simd_any(simd_char8 x); 84 /*! @abstract True if and only if the high-order bit of any lane of the 85 * vector is set. */ 86 static inline SIMD_CFUNC simd_bool simd_any(simd_char16 x); 87 /*! @abstract True if and only if the high-order bit of any lane of the 88 * vector is set. */ 89 static inline SIMD_CFUNC simd_bool simd_any(simd_char32 x); 90 /*! @abstract True if and only if the high-order bit of any lane of the 91 * vector is set. */ 92 static inline SIMD_CFUNC simd_bool simd_any(simd_char64 x); 93 /*! @abstract True if and only if the high-order bit of any lane of the 94 * vector is set. */ 95 static inline SIMD_CFUNC simd_bool simd_any(simd_uchar2 x); 96 /*! @abstract True if and only if the high-order bit of any lane of the 97 * vector is set. */ 98 static inline SIMD_CFUNC simd_bool simd_any(simd_uchar3 x); 99 /*! @abstract True if and only if the high-order bit of any lane of the 100 * vector is set. */ 101 static inline SIMD_CFUNC simd_bool simd_any(simd_uchar4 x); 102 /*! @abstract True if and only if the high-order bit of any lane of the 103 * vector is set. */ 104 static inline SIMD_CFUNC simd_bool simd_any(simd_uchar8 x); 105 /*! @abstract True if and only if the high-order bit of any lane of the 106 * vector is set. */ 107 static inline SIMD_CFUNC simd_bool simd_any(simd_uchar16 x); 108 /*! @abstract True if and only if the high-order bit of any lane of the 109 * vector is set. */ 110 static inline SIMD_CFUNC simd_bool simd_any(simd_uchar32 x); 111 /*! @abstract True if and only if the high-order bit of any lane of the 112 * vector is set. */ 113 static inline SIMD_CFUNC simd_bool simd_any(simd_uchar64 x); 114 /*! @abstract True if and only if the high-order bit of any lane of the 115 * vector is set. */ 116 static inline SIMD_CFUNC simd_bool simd_any(simd_short2 x); 117 /*! @abstract True if and only if the high-order bit of any lane of the 118 * vector is set. */ 119 static inline SIMD_CFUNC simd_bool simd_any(simd_short3 x); 120 /*! @abstract True if and only if the high-order bit of any lane of the 121 * vector is set. */ 122 static inline SIMD_CFUNC simd_bool simd_any(simd_short4 x); 123 /*! @abstract True if and only if the high-order bit of any lane of the 124 * vector is set. */ 125 static inline SIMD_CFUNC simd_bool simd_any(simd_short8 x); 126 /*! @abstract True if and only if the high-order bit of any lane of the 127 * vector is set. */ 128 static inline SIMD_CFUNC simd_bool simd_any(simd_short16 x); 129 /*! @abstract True if and only if the high-order bit of any lane of the 130 * vector is set. */ 131 static inline SIMD_CFUNC simd_bool simd_any(simd_short32 x); 132 /*! @abstract True if and only if the high-order bit of any lane of the 133 * vector is set. */ 134 static inline SIMD_CFUNC simd_bool simd_any(simd_ushort2 x); 135 /*! @abstract True if and only if the high-order bit of any lane of the 136 * vector is set. */ 137 static inline SIMD_CFUNC simd_bool simd_any(simd_ushort3 x); 138 /*! @abstract True if and only if the high-order bit of any lane of the 139 * vector is set. */ 140 static inline SIMD_CFUNC simd_bool simd_any(simd_ushort4 x); 141 /*! @abstract True if and only if the high-order bit of any lane of the 142 * vector is set. */ 143 static inline SIMD_CFUNC simd_bool simd_any(simd_ushort8 x); 144 /*! @abstract True if and only if the high-order bit of any lane of the 145 * vector is set. */ 146 static inline SIMD_CFUNC simd_bool simd_any(simd_ushort16 x); 147 /*! @abstract True if and only if the high-order bit of any lane of the 148 * vector is set. */ 149 static inline SIMD_CFUNC simd_bool simd_any(simd_ushort32 x); 150 /*! @abstract True if and only if the high-order bit of any lane of the 151 * vector is set. */ 152 static inline SIMD_CFUNC simd_bool simd_any(simd_int2 x); 153 /*! @abstract True if and only if the high-order bit of any lane of the 154 * vector is set. */ 155 static inline SIMD_CFUNC simd_bool simd_any(simd_int3 x); 156 /*! @abstract True if and only if the high-order bit of any lane of the 157 * vector is set. */ 158 static inline SIMD_CFUNC simd_bool simd_any(simd_int4 x); 159 /*! @abstract True if and only if the high-order bit of any lane of the 160 * vector is set. */ 161 static inline SIMD_CFUNC simd_bool simd_any(simd_int8 x); 162 /*! @abstract True if and only if the high-order bit of any lane of the 163 * vector is set. */ 164 static inline SIMD_CFUNC simd_bool simd_any(simd_int16 x); 165 /*! @abstract True if and only if the high-order bit of any lane of the 166 * vector is set. */ 167 static inline SIMD_CFUNC simd_bool simd_any(simd_uint2 x); 168 /*! @abstract True if and only if the high-order bit of any lane of the 169 * vector is set. */ 170 static inline SIMD_CFUNC simd_bool simd_any(simd_uint3 x); 171 /*! @abstract True if and only if the high-order bit of any lane of the 172 * vector is set. */ 173 static inline SIMD_CFUNC simd_bool simd_any(simd_uint4 x); 174 /*! @abstract True if and only if the high-order bit of any lane of the 175 * vector is set. */ 176 static inline SIMD_CFUNC simd_bool simd_any(simd_uint8 x); 177 /*! @abstract True if and only if the high-order bit of any lane of the 178 * vector is set. */ 179 static inline SIMD_CFUNC simd_bool simd_any(simd_uint16 x); 180 /*! @abstract True if and only if the high-order bit of any lane of the 181 * vector is set. */ 182 static inline SIMD_CFUNC simd_bool simd_any(simd_long2 x); 183 /*! @abstract True if and only if the high-order bit of any lane of the 184 * vector is set. */ 185 static inline SIMD_CFUNC simd_bool simd_any(simd_long3 x); 186 /*! @abstract True if and only if the high-order bit of any lane of the 187 * vector is set. */ 188 static inline SIMD_CFUNC simd_bool simd_any(simd_long4 x); 189 /*! @abstract True if and only if the high-order bit of any lane of the 190 * vector is set. */ 191 static inline SIMD_CFUNC simd_bool simd_any(simd_long8 x); 192 /*! @abstract True if and only if the high-order bit of any lane of the 193 * vector is set. */ 194 static inline SIMD_CFUNC simd_bool simd_any(simd_ulong2 x); 195 /*! @abstract True if and only if the high-order bit of any lane of the 196 * vector is set. */ 197 static inline SIMD_CFUNC simd_bool simd_any(simd_ulong3 x); 198 /*! @abstract True if and only if the high-order bit of any lane of the 199 * vector is set. */ 200 static inline SIMD_CFUNC simd_bool simd_any(simd_ulong4 x); 201 /*! @abstract True if and only if the high-order bit of any lane of the 202 * vector is set. */ 203 static inline SIMD_CFUNC simd_bool simd_any(simd_ulong8 x); 204 /*! @abstract True if and only if the high-order bit of any lane of the 205 * vector is set. 206 * @discussion Deprecated. Use simd_any instead. */ 207 #define vector_any simd_any 208 209 /*! @abstract True if and only if the high-order bit of every lane of the 210 * vector is set. */ 211 static inline SIMD_CFUNC simd_bool simd_all(simd_char2 x); 212 /*! @abstract True if and only if the high-order bit of every lane of the 213 * vector is set. */ 214 static inline SIMD_CFUNC simd_bool simd_all(simd_char3 x); 215 /*! @abstract True if and only if the high-order bit of every lane of the 216 * vector is set. */ 217 static inline SIMD_CFUNC simd_bool simd_all(simd_char4 x); 218 /*! @abstract True if and only if the high-order bit of every lane of the 219 * vector is set. */ 220 static inline SIMD_CFUNC simd_bool simd_all(simd_char8 x); 221 /*! @abstract True if and only if the high-order bit of every lane of the 222 * vector is set. */ 223 static inline SIMD_CFUNC simd_bool simd_all(simd_char16 x); 224 /*! @abstract True if and only if the high-order bit of every lane of the 225 * vector is set. */ 226 static inline SIMD_CFUNC simd_bool simd_all(simd_char32 x); 227 /*! @abstract True if and only if the high-order bit of every lane of the 228 * vector is set. */ 229 static inline SIMD_CFUNC simd_bool simd_all(simd_char64 x); 230 /*! @abstract True if and only if the high-order bit of every lane of the 231 * vector is set. */ 232 static inline SIMD_CFUNC simd_bool simd_all(simd_uchar2 x); 233 /*! @abstract True if and only if the high-order bit of every lane of the 234 * vector is set. */ 235 static inline SIMD_CFUNC simd_bool simd_all(simd_uchar3 x); 236 /*! @abstract True if and only if the high-order bit of every lane of the 237 * vector is set. */ 238 static inline SIMD_CFUNC simd_bool simd_all(simd_uchar4 x); 239 /*! @abstract True if and only if the high-order bit of every lane of the 240 * vector is set. */ 241 static inline SIMD_CFUNC simd_bool simd_all(simd_uchar8 x); 242 /*! @abstract True if and only if the high-order bit of every lane of the 243 * vector is set. */ 244 static inline SIMD_CFUNC simd_bool simd_all(simd_uchar16 x); 245 /*! @abstract True if and only if the high-order bit of every lane of the 246 * vector is set. */ 247 static inline SIMD_CFUNC simd_bool simd_all(simd_uchar32 x); 248 /*! @abstract True if and only if the high-order bit of every lane of the 249 * vector is set. */ 250 static inline SIMD_CFUNC simd_bool simd_all(simd_uchar64 x); 251 /*! @abstract True if and only if the high-order bit of every lane of the 252 * vector is set. */ 253 static inline SIMD_CFUNC simd_bool simd_all(simd_short2 x); 254 /*! @abstract True if and only if the high-order bit of every lane of the 255 * vector is set. */ 256 static inline SIMD_CFUNC simd_bool simd_all(simd_short3 x); 257 /*! @abstract True if and only if the high-order bit of every lane of the 258 * vector is set. */ 259 static inline SIMD_CFUNC simd_bool simd_all(simd_short4 x); 260 /*! @abstract True if and only if the high-order bit of every lane of the 261 * vector is set. */ 262 static inline SIMD_CFUNC simd_bool simd_all(simd_short8 x); 263 /*! @abstract True if and only if the high-order bit of every lane of the 264 * vector is set. */ 265 static inline SIMD_CFUNC simd_bool simd_all(simd_short16 x); 266 /*! @abstract True if and only if the high-order bit of every lane of the 267 * vector is set. */ 268 static inline SIMD_CFUNC simd_bool simd_all(simd_short32 x); 269 /*! @abstract True if and only if the high-order bit of every lane of the 270 * vector is set. */ 271 static inline SIMD_CFUNC simd_bool simd_all(simd_ushort2 x); 272 /*! @abstract True if and only if the high-order bit of every lane of the 273 * vector is set. */ 274 static inline SIMD_CFUNC simd_bool simd_all(simd_ushort3 x); 275 /*! @abstract True if and only if the high-order bit of every lane of the 276 * vector is set. */ 277 static inline SIMD_CFUNC simd_bool simd_all(simd_ushort4 x); 278 /*! @abstract True if and only if the high-order bit of every lane of the 279 * vector is set. */ 280 static inline SIMD_CFUNC simd_bool simd_all(simd_ushort8 x); 281 /*! @abstract True if and only if the high-order bit of every lane of the 282 * vector is set. */ 283 static inline SIMD_CFUNC simd_bool simd_all(simd_ushort16 x); 284 /*! @abstract True if and only if the high-order bit of every lane of the 285 * vector is set. */ 286 static inline SIMD_CFUNC simd_bool simd_all(simd_ushort32 x); 287 /*! @abstract True if and only if the high-order bit of every lane of the 288 * vector is set. */ 289 static inline SIMD_CFUNC simd_bool simd_all(simd_int2 x); 290 /*! @abstract True if and only if the high-order bit of every lane of the 291 * vector is set. */ 292 static inline SIMD_CFUNC simd_bool simd_all(simd_int3 x); 293 /*! @abstract True if and only if the high-order bit of every lane of the 294 * vector is set. */ 295 static inline SIMD_CFUNC simd_bool simd_all(simd_int4 x); 296 /*! @abstract True if and only if the high-order bit of every lane of the 297 * vector is set. */ 298 static inline SIMD_CFUNC simd_bool simd_all(simd_int8 x); 299 /*! @abstract True if and only if the high-order bit of every lane of the 300 * vector is set. */ 301 static inline SIMD_CFUNC simd_bool simd_all(simd_int16 x); 302 /*! @abstract True if and only if the high-order bit of every lane of the 303 * vector is set. */ 304 static inline SIMD_CFUNC simd_bool simd_all(simd_uint2 x); 305 /*! @abstract True if and only if the high-order bit of every lane of the 306 * vector is set. */ 307 static inline SIMD_CFUNC simd_bool simd_all(simd_uint3 x); 308 /*! @abstract True if and only if the high-order bit of every lane of the 309 * vector is set. */ 310 static inline SIMD_CFUNC simd_bool simd_all(simd_uint4 x); 311 /*! @abstract True if and only if the high-order bit of every lane of the 312 * vector is set. */ 313 static inline SIMD_CFUNC simd_bool simd_all(simd_uint8 x); 314 /*! @abstract True if and only if the high-order bit of every lane of the 315 * vector is set. */ 316 static inline SIMD_CFUNC simd_bool simd_all(simd_uint16 x); 317 /*! @abstract True if and only if the high-order bit of every lane of the 318 * vector is set. */ 319 static inline SIMD_CFUNC simd_bool simd_all(simd_long2 x); 320 /*! @abstract True if and only if the high-order bit of every lane of the 321 * vector is set. */ 322 static inline SIMD_CFUNC simd_bool simd_all(simd_long3 x); 323 /*! @abstract True if and only if the high-order bit of every lane of the 324 * vector is set. */ 325 static inline SIMD_CFUNC simd_bool simd_all(simd_long4 x); 326 /*! @abstract True if and only if the high-order bit of every lane of the 327 * vector is set. */ 328 static inline SIMD_CFUNC simd_bool simd_all(simd_long8 x); 329 /*! @abstract True if and only if the high-order bit of every lane of the 330 * vector is set. */ 331 static inline SIMD_CFUNC simd_bool simd_all(simd_ulong2 x); 332 /*! @abstract True if and only if the high-order bit of every lane of the 333 * vector is set. */ 334 static inline SIMD_CFUNC simd_bool simd_all(simd_ulong3 x); 335 /*! @abstract True if and only if the high-order bit of every lane of the 336 * vector is set. */ 337 static inline SIMD_CFUNC simd_bool simd_all(simd_ulong4 x); 338 /*! @abstract True if and only if the high-order bit of every lane of the 339 * vector is set. */ 340 static inline SIMD_CFUNC simd_bool simd_all(simd_ulong8 x); 341 /*! @abstract True if and only if the high-order bit of every lane of the 342 * vector is set. 343 * @discussion Deprecated. Use simd_all instead. */ 344 #define vector_all simd_all 345 346 /*! @abstract For each lane in the result, selects the corresponding element 347 * of x or y according to whether the high-order bit of the corresponding 348 * lane of mask is 0 or 1, respectively. */ 349 static inline SIMD_CFUNC simd_half2 simd_select(simd_half2 x, simd_half2 y, simd_short2 mask); 350 /*! @abstract For each lane in the result, selects the corresponding element 351 * of x or y according to whether the high-order bit of the corresponding 352 * lane of mask is 0 or 1, respectively. */ 353 static inline SIMD_CFUNC simd_half3 simd_select(simd_half3 x, simd_half3 y, simd_short3 mask); 354 /*! @abstract For each lane in the result, selects the corresponding element 355 * of x or y according to whether the high-order bit of the corresponding 356 * lane of mask is 0 or 1, respectively. */ 357 static inline SIMD_CFUNC simd_half4 simd_select(simd_half4 x, simd_half4 y, simd_short4 mask); 358 /*! @abstract For each lane in the result, selects the corresponding element 359 * of x or y according to whether the high-order bit of the corresponding 360 * lane of mask is 0 or 1, respectively. */ 361 static inline SIMD_CFUNC simd_half8 simd_select(simd_half8 x, simd_half8 y, simd_short8 mask); 362 /*! @abstract For each lane in the result, selects the corresponding element 363 * of x or y according to whether the high-order bit of the corresponding 364 * lane of mask is 0 or 1, respectively. */ 365 static inline SIMD_CFUNC simd_half16 simd_select(simd_half16 x, simd_half16 y, simd_short16 mask); 366 /*! @abstract For each lane in the result, selects the corresponding element 367 * of x or y according to whether the high-order bit of the corresponding 368 * lane of mask is 0 or 1, respectively. */ 369 static inline SIMD_CFUNC simd_half32 simd_select(simd_half32 x, simd_half32 y, simd_short32 mask); 370 /*! @abstract For each lane in the result, selects the corresponding element 371 * of x or y according to whether the high-order bit of the corresponding 372 * lane of mask is 0 or 1, respectively. */ 373 static inline SIMD_CFUNC simd_float2 simd_select(simd_float2 x, simd_float2 y, simd_int2 mask); 374 /*! @abstract For each lane in the result, selects the corresponding element 375 * of x or y according to whether the high-order bit of the corresponding 376 * lane of mask is 0 or 1, respectively. */ 377 static inline SIMD_CFUNC simd_float3 simd_select(simd_float3 x, simd_float3 y, simd_int3 mask); 378 /*! @abstract For each lane in the result, selects the corresponding element 379 * of x or y according to whether the high-order bit of the corresponding 380 * lane of mask is 0 or 1, respectively. */ 381 static inline SIMD_CFUNC simd_float4 simd_select(simd_float4 x, simd_float4 y, simd_int4 mask); 382 /*! @abstract For each lane in the result, selects the corresponding element 383 * of x or y according to whether the high-order bit of the corresponding 384 * lane of mask is 0 or 1, respectively. */ 385 static inline SIMD_CFUNC simd_float8 simd_select(simd_float8 x, simd_float8 y, simd_int8 mask); 386 /*! @abstract For each lane in the result, selects the corresponding element 387 * of x or y according to whether the high-order bit of the corresponding 388 * lane of mask is 0 or 1, respectively. */ 389 static inline SIMD_CFUNC simd_float16 simd_select(simd_float16 x, simd_float16 y, simd_int16 mask); 390 /*! @abstract For each lane in the result, selects the corresponding element 391 * of x or y according to whether the high-order bit of the corresponding 392 * lane of mask is 0 or 1, respectively. */ 393 static inline SIMD_CFUNC simd_double2 simd_select(simd_double2 x, simd_double2 y, simd_long2 mask); 394 /*! @abstract For each lane in the result, selects the corresponding element 395 * of x or y according to whether the high-order bit of the corresponding 396 * lane of mask is 0 or 1, respectively. */ 397 static inline SIMD_CFUNC simd_double3 simd_select(simd_double3 x, simd_double3 y, simd_long3 mask); 398 /*! @abstract For each lane in the result, selects the corresponding element 399 * of x or y according to whether the high-order bit of the corresponding 400 * lane of mask is 0 or 1, respectively. */ 401 static inline SIMD_CFUNC simd_double4 simd_select(simd_double4 x, simd_double4 y, simd_long4 mask); 402 /*! @abstract For each lane in the result, selects the corresponding element 403 * of x or y according to whether the high-order bit of the corresponding 404 * lane of mask is 0 or 1, respectively. */ 405 static inline SIMD_CFUNC simd_double8 simd_select(simd_double8 x, simd_double8 y, simd_long8 mask); 406 /*! @abstract For each lane in the result, selects the corresponding element 407 * of x or y according to whether the high-order bit of the corresponding 408 * lane of mask is 0 or 1, respectively. 409 * @discussion Deprecated. Use simd_select instead. */ 410 #define vector_select simd_select 411 412 /*! @abstract For each bit in the result, selects the corresponding bit of x 413 * or y according to whether the corresponding bit of mask is 0 or 1, 414 * respectively. */ 415 static inline SIMD_CFUNC simd_char2 simd_bitselect(simd_char2 x, simd_char2 y, simd_char2 mask); 416 /*! @abstract For each bit in the result, selects the corresponding bit of x 417 * or y according to whether the corresponding bit of mask is 0 or 1, 418 * respectively. */ 419 static inline SIMD_CFUNC simd_char3 simd_bitselect(simd_char3 x, simd_char3 y, simd_char3 mask); 420 /*! @abstract For each bit in the result, selects the corresponding bit of x 421 * or y according to whether the corresponding bit of mask is 0 or 1, 422 * respectively. */ 423 static inline SIMD_CFUNC simd_char4 simd_bitselect(simd_char4 x, simd_char4 y, simd_char4 mask); 424 /*! @abstract For each bit in the result, selects the corresponding bit of x 425 * or y according to whether the corresponding bit of mask is 0 or 1, 426 * respectively. */ 427 static inline SIMD_CFUNC simd_char8 simd_bitselect(simd_char8 x, simd_char8 y, simd_char8 mask); 428 /*! @abstract For each bit in the result, selects the corresponding bit of x 429 * or y according to whether the corresponding bit of mask is 0 or 1, 430 * respectively. */ 431 static inline SIMD_CFUNC simd_char16 simd_bitselect(simd_char16 x, simd_char16 y, simd_char16 mask); 432 /*! @abstract For each bit in the result, selects the corresponding bit of x 433 * or y according to whether the corresponding bit of mask is 0 or 1, 434 * respectively. */ 435 static inline SIMD_CFUNC simd_char32 simd_bitselect(simd_char32 x, simd_char32 y, simd_char32 mask); 436 /*! @abstract For each bit in the result, selects the corresponding bit of x 437 * or y according to whether the corresponding bit of mask is 0 or 1, 438 * respectively. */ 439 static inline SIMD_CFUNC simd_char64 simd_bitselect(simd_char64 x, simd_char64 y, simd_char64 mask); 440 /*! @abstract For each bit in the result, selects the corresponding bit of x 441 * or y according to whether the corresponding bit of mask is 0 or 1, 442 * respectively. */ 443 static inline SIMD_CFUNC simd_uchar2 simd_bitselect(simd_uchar2 x, simd_uchar2 y, simd_char2 mask); 444 /*! @abstract For each bit in the result, selects the corresponding bit of x 445 * or y according to whether the corresponding bit of mask is 0 or 1, 446 * respectively. */ 447 static inline SIMD_CFUNC simd_uchar3 simd_bitselect(simd_uchar3 x, simd_uchar3 y, simd_char3 mask); 448 /*! @abstract For each bit in the result, selects the corresponding bit of x 449 * or y according to whether the corresponding bit of mask is 0 or 1, 450 * respectively. */ 451 static inline SIMD_CFUNC simd_uchar4 simd_bitselect(simd_uchar4 x, simd_uchar4 y, simd_char4 mask); 452 /*! @abstract For each bit in the result, selects the corresponding bit of x 453 * or y according to whether the corresponding bit of mask is 0 or 1, 454 * respectively. */ 455 static inline SIMD_CFUNC simd_uchar8 simd_bitselect(simd_uchar8 x, simd_uchar8 y, simd_char8 mask); 456 /*! @abstract For each bit in the result, selects the corresponding bit of x 457 * or y according to whether the corresponding bit of mask is 0 or 1, 458 * respectively. */ 459 static inline SIMD_CFUNC simd_uchar16 simd_bitselect(simd_uchar16 x, simd_uchar16 y, simd_char16 mask); 460 /*! @abstract For each bit in the result, selects the corresponding bit of x 461 * or y according to whether the corresponding bit of mask is 0 or 1, 462 * respectively. */ 463 static inline SIMD_CFUNC simd_uchar32 simd_bitselect(simd_uchar32 x, simd_uchar32 y, simd_char32 mask); 464 /*! @abstract For each bit in the result, selects the corresponding bit of x 465 * or y according to whether the corresponding bit of mask is 0 or 1, 466 * respectively. */ 467 static inline SIMD_CFUNC simd_uchar64 simd_bitselect(simd_uchar64 x, simd_uchar64 y, simd_char64 mask); 468 /*! @abstract For each bit in the result, selects the corresponding bit of x 469 * or y according to whether the corresponding bit of mask is 0 or 1, 470 * respectively. */ 471 static inline SIMD_CFUNC simd_short2 simd_bitselect(simd_short2 x, simd_short2 y, simd_short2 mask); 472 /*! @abstract For each bit in the result, selects the corresponding bit of x 473 * or y according to whether the corresponding bit of mask is 0 or 1, 474 * respectively. */ 475 static inline SIMD_CFUNC simd_short3 simd_bitselect(simd_short3 x, simd_short3 y, simd_short3 mask); 476 /*! @abstract For each bit in the result, selects the corresponding bit of x 477 * or y according to whether the corresponding bit of mask is 0 or 1, 478 * respectively. */ 479 static inline SIMD_CFUNC simd_short4 simd_bitselect(simd_short4 x, simd_short4 y, simd_short4 mask); 480 /*! @abstract For each bit in the result, selects the corresponding bit of x 481 * or y according to whether the corresponding bit of mask is 0 or 1, 482 * respectively. */ 483 static inline SIMD_CFUNC simd_short8 simd_bitselect(simd_short8 x, simd_short8 y, simd_short8 mask); 484 /*! @abstract For each bit in the result, selects the corresponding bit of x 485 * or y according to whether the corresponding bit of mask is 0 or 1, 486 * respectively. */ 487 static inline SIMD_CFUNC simd_short16 simd_bitselect(simd_short16 x, simd_short16 y, simd_short16 mask); 488 /*! @abstract For each bit in the result, selects the corresponding bit of x 489 * or y according to whether the corresponding bit of mask is 0 or 1, 490 * respectively. */ 491 static inline SIMD_CFUNC simd_short32 simd_bitselect(simd_short32 x, simd_short32 y, simd_short32 mask); 492 /*! @abstract For each bit in the result, selects the corresponding bit of x 493 * or y according to whether the corresponding bit of mask is 0 or 1, 494 * respectively. */ 495 static inline SIMD_CFUNC simd_ushort2 simd_bitselect(simd_ushort2 x, simd_ushort2 y, simd_short2 mask); 496 /*! @abstract For each bit in the result, selects the corresponding bit of x 497 * or y according to whether the corresponding bit of mask is 0 or 1, 498 * respectively. */ 499 static inline SIMD_CFUNC simd_ushort3 simd_bitselect(simd_ushort3 x, simd_ushort3 y, simd_short3 mask); 500 /*! @abstract For each bit in the result, selects the corresponding bit of x 501 * or y according to whether the corresponding bit of mask is 0 or 1, 502 * respectively. */ 503 static inline SIMD_CFUNC simd_ushort4 simd_bitselect(simd_ushort4 x, simd_ushort4 y, simd_short4 mask); 504 /*! @abstract For each bit in the result, selects the corresponding bit of x 505 * or y according to whether the corresponding bit of mask is 0 or 1, 506 * respectively. */ 507 static inline SIMD_CFUNC simd_ushort8 simd_bitselect(simd_ushort8 x, simd_ushort8 y, simd_short8 mask); 508 /*! @abstract For each bit in the result, selects the corresponding bit of x 509 * or y according to whether the corresponding bit of mask is 0 or 1, 510 * respectively. */ 511 static inline SIMD_CFUNC simd_ushort16 simd_bitselect(simd_ushort16 x, simd_ushort16 y, simd_short16 mask); 512 /*! @abstract For each bit in the result, selects the corresponding bit of x 513 * or y according to whether the corresponding bit of mask is 0 or 1, 514 * respectively. */ 515 static inline SIMD_CFUNC simd_ushort32 simd_bitselect(simd_ushort32 x, simd_ushort32 y, simd_short32 mask); 516 /*! @abstract For each bit in the result, selects the corresponding bit of x 517 * or y according to whether the corresponding bit of mask is 0 or 1, 518 * respectively. */ 519 static inline SIMD_CFUNC simd_half2 simd_bitselect(simd_half2 x, simd_half2 y, simd_short2 mask); 520 /*! @abstract For each bit in the result, selects the corresponding bit of x 521 * or y according to whether the corresponding bit of mask is 0 or 1, 522 * respectively. */ 523 static inline SIMD_CFUNC simd_half3 simd_bitselect(simd_half3 x, simd_half3 y, simd_short3 mask); 524 /*! @abstract For each bit in the result, selects the corresponding bit of x 525 * or y according to whether the corresponding bit of mask is 0 or 1, 526 * respectively. */ 527 static inline SIMD_CFUNC simd_half4 simd_bitselect(simd_half4 x, simd_half4 y, simd_short4 mask); 528 /*! @abstract For each bit in the result, selects the corresponding bit of x 529 * or y according to whether the corresponding bit of mask is 0 or 1, 530 * respectively. */ 531 static inline SIMD_CFUNC simd_half8 simd_bitselect(simd_half8 x, simd_half8 y, simd_short8 mask); 532 /*! @abstract For each bit in the result, selects the corresponding bit of x 533 * or y according to whether the corresponding bit of mask is 0 or 1, 534 * respectively. */ 535 static inline SIMD_CFUNC simd_half16 simd_bitselect(simd_half16 x, simd_half16 y, simd_short16 mask); 536 /*! @abstract For each bit in the result, selects the corresponding bit of x 537 * or y according to whether the corresponding bit of mask is 0 or 1, 538 * respectively. */ 539 static inline SIMD_CFUNC simd_half32 simd_bitselect(simd_half32 x, simd_half32 y, simd_short32 mask); 540 /*! @abstract For each bit in the result, selects the corresponding bit of x 541 * or y according to whether the corresponding bit of mask is 0 or 1, 542 * respectively. */ 543 static inline SIMD_CFUNC simd_int2 simd_bitselect(simd_int2 x, simd_int2 y, simd_int2 mask); 544 /*! @abstract For each bit in the result, selects the corresponding bit of x 545 * or y according to whether the corresponding bit of mask is 0 or 1, 546 * respectively. */ 547 static inline SIMD_CFUNC simd_int3 simd_bitselect(simd_int3 x, simd_int3 y, simd_int3 mask); 548 /*! @abstract For each bit in the result, selects the corresponding bit of x 549 * or y according to whether the corresponding bit of mask is 0 or 1, 550 * respectively. */ 551 static inline SIMD_CFUNC simd_int4 simd_bitselect(simd_int4 x, simd_int4 y, simd_int4 mask); 552 /*! @abstract For each bit in the result, selects the corresponding bit of x 553 * or y according to whether the corresponding bit of mask is 0 or 1, 554 * respectively. */ 555 static inline SIMD_CFUNC simd_int8 simd_bitselect(simd_int8 x, simd_int8 y, simd_int8 mask); 556 /*! @abstract For each bit in the result, selects the corresponding bit of x 557 * or y according to whether the corresponding bit of mask is 0 or 1, 558 * respectively. */ 559 static inline SIMD_CFUNC simd_int16 simd_bitselect(simd_int16 x, simd_int16 y, simd_int16 mask); 560 /*! @abstract For each bit in the result, selects the corresponding bit of x 561 * or y according to whether the corresponding bit of mask is 0 or 1, 562 * respectively. */ 563 static inline SIMD_CFUNC simd_uint2 simd_bitselect(simd_uint2 x, simd_uint2 y, simd_int2 mask); 564 /*! @abstract For each bit in the result, selects the corresponding bit of x 565 * or y according to whether the corresponding bit of mask is 0 or 1, 566 * respectively. */ 567 static inline SIMD_CFUNC simd_uint3 simd_bitselect(simd_uint3 x, simd_uint3 y, simd_int3 mask); 568 /*! @abstract For each bit in the result, selects the corresponding bit of x 569 * or y according to whether the corresponding bit of mask is 0 or 1, 570 * respectively. */ 571 static inline SIMD_CFUNC simd_uint4 simd_bitselect(simd_uint4 x, simd_uint4 y, simd_int4 mask); 572 /*! @abstract For each bit in the result, selects the corresponding bit of x 573 * or y according to whether the corresponding bit of mask is 0 or 1, 574 * respectively. */ 575 static inline SIMD_CFUNC simd_uint8 simd_bitselect(simd_uint8 x, simd_uint8 y, simd_int8 mask); 576 /*! @abstract For each bit in the result, selects the corresponding bit of x 577 * or y according to whether the corresponding bit of mask is 0 or 1, 578 * respectively. */ 579 static inline SIMD_CFUNC simd_uint16 simd_bitselect(simd_uint16 x, simd_uint16 y, simd_int16 mask); 580 /*! @abstract For each bit in the result, selects the corresponding bit of x 581 * or y according to whether the corresponding bit of mask is 0 or 1, 582 * respectively. */ 583 static inline SIMD_CFUNC simd_float2 simd_bitselect(simd_float2 x, simd_float2 y, simd_int2 mask); 584 /*! @abstract For each bit in the result, selects the corresponding bit of x 585 * or y according to whether the corresponding bit of mask is 0 or 1, 586 * respectively. */ 587 static inline SIMD_CFUNC simd_float3 simd_bitselect(simd_float3 x, simd_float3 y, simd_int3 mask); 588 /*! @abstract For each bit in the result, selects the corresponding bit of x 589 * or y according to whether the corresponding bit of mask is 0 or 1, 590 * respectively. */ 591 static inline SIMD_CFUNC simd_float4 simd_bitselect(simd_float4 x, simd_float4 y, simd_int4 mask); 592 /*! @abstract For each bit in the result, selects the corresponding bit of x 593 * or y according to whether the corresponding bit of mask is 0 or 1, 594 * respectively. */ 595 static inline SIMD_CFUNC simd_float8 simd_bitselect(simd_float8 x, simd_float8 y, simd_int8 mask); 596 /*! @abstract For each bit in the result, selects the corresponding bit of x 597 * or y according to whether the corresponding bit of mask is 0 or 1, 598 * respectively. */ 599 static inline SIMD_CFUNC simd_float16 simd_bitselect(simd_float16 x, simd_float16 y, simd_int16 mask); 600 /*! @abstract For each bit in the result, selects the corresponding bit of x 601 * or y according to whether the corresponding bit of mask is 0 or 1, 602 * respectively. */ 603 static inline SIMD_CFUNC simd_long2 simd_bitselect(simd_long2 x, simd_long2 y, simd_long2 mask); 604 /*! @abstract For each bit in the result, selects the corresponding bit of x 605 * or y according to whether the corresponding bit of mask is 0 or 1, 606 * respectively. */ 607 static inline SIMD_CFUNC simd_long3 simd_bitselect(simd_long3 x, simd_long3 y, simd_long3 mask); 608 /*! @abstract For each bit in the result, selects the corresponding bit of x 609 * or y according to whether the corresponding bit of mask is 0 or 1, 610 * respectively. */ 611 static inline SIMD_CFUNC simd_long4 simd_bitselect(simd_long4 x, simd_long4 y, simd_long4 mask); 612 /*! @abstract For each bit in the result, selects the corresponding bit of x 613 * or y according to whether the corresponding bit of mask is 0 or 1, 614 * respectively. */ 615 static inline SIMD_CFUNC simd_long8 simd_bitselect(simd_long8 x, simd_long8 y, simd_long8 mask); 616 /*! @abstract For each bit in the result, selects the corresponding bit of x 617 * or y according to whether the corresponding bit of mask is 0 or 1, 618 * respectively. */ 619 static inline SIMD_CFUNC simd_ulong2 simd_bitselect(simd_ulong2 x, simd_ulong2 y, simd_long2 mask); 620 /*! @abstract For each bit in the result, selects the corresponding bit of x 621 * or y according to whether the corresponding bit of mask is 0 or 1, 622 * respectively. */ 623 static inline SIMD_CFUNC simd_ulong3 simd_bitselect(simd_ulong3 x, simd_ulong3 y, simd_long3 mask); 624 /*! @abstract For each bit in the result, selects the corresponding bit of x 625 * or y according to whether the corresponding bit of mask is 0 or 1, 626 * respectively. */ 627 static inline SIMD_CFUNC simd_ulong4 simd_bitselect(simd_ulong4 x, simd_ulong4 y, simd_long4 mask); 628 /*! @abstract For each bit in the result, selects the corresponding bit of x 629 * or y according to whether the corresponding bit of mask is 0 or 1, 630 * respectively. */ 631 static inline SIMD_CFUNC simd_ulong8 simd_bitselect(simd_ulong8 x, simd_ulong8 y, simd_long8 mask); 632 /*! @abstract For each bit in the result, selects the corresponding bit of x 633 * or y according to whether the corresponding bit of mask is 0 or 1, 634 * respectively. */ 635 static inline SIMD_CFUNC simd_double2 simd_bitselect(simd_double2 x, simd_double2 y, simd_long2 mask); 636 /*! @abstract For each bit in the result, selects the corresponding bit of x 637 * or y according to whether the corresponding bit of mask is 0 or 1, 638 * respectively. */ 639 static inline SIMD_CFUNC simd_double3 simd_bitselect(simd_double3 x, simd_double3 y, simd_long3 mask); 640 /*! @abstract For each bit in the result, selects the corresponding bit of x 641 * or y according to whether the corresponding bit of mask is 0 or 1, 642 * respectively. */ 643 static inline SIMD_CFUNC simd_double4 simd_bitselect(simd_double4 x, simd_double4 y, simd_long4 mask); 644 /*! @abstract For each bit in the result, selects the corresponding bit of x 645 * or y according to whether the corresponding bit of mask is 0 or 1, 646 * respectively. */ 647 static inline SIMD_CFUNC simd_double8 simd_bitselect(simd_double8 x, simd_double8 y, simd_long8 mask); 648 /*! @abstract For each bit in the result, selects the corresponding bit of x 649 * or y according to whether the corresponding bit of mask is 0 or 1, 650 * respectively. 651 * @discussion Deprecated. Use simd_bitselect instead. */ 652 #define vector_bitselect simd_bitselect 653 654 #ifdef __cplusplus 655 } /* extern "C" */ 656 657 namespace simd { 658 /*! @abstract True if and only if the high-order bit of every lane is set. */ 659 template <typename inttypeN> static SIMD_CPPFUNC simd_bool all(const inttypeN predicate) { return ::simd_all(predicate); } 660 /*! @abstract True if and only if the high-order bit of any lane is set. */ 661 template <typename inttypeN> static SIMD_CPPFUNC simd_bool any(const inttypeN predicate) { return ::simd_any(predicate); } 662 /*! @abstract Each lane of the result is selected from the corresponding lane 663 * of x or y according to whether the high-order bit of the corresponding 664 * lane of mask is 0 or 1, respectively. */ 665 template <typename inttypeN, typename fptypeN> static SIMD_CPPFUNC fptypeN select(const fptypeN x, const fptypeN y, const inttypeN predicate) { return ::simd_select(x,y,predicate); } 666 /*! @abstract For each bit in the result, selects the corresponding bit of x 667 * or y according to whether the corresponding bit of mask is 0 or 1, 668 * respectively. */ 669 template <typename inttypeN, typename typeN> static SIMD_CPPFUNC typeN bitselect(const typeN x, const typeN y, const inttypeN mask) { return ::simd_bitselect(x,y,mask); } 670 } 671 672 extern "C" { 673 #endif /* __cplusplus */ 674 675 #pragma mark - Implementations 676 677 static inline SIMD_CFUNC simd_bool simd_any(simd_char2 x) { 678 #if defined __SSE2__ 679 return (_mm_movemask_epi8((__m128i)simd_make_char16_undef(x)) & 0x3); 680 #elif defined __arm64__ || defined __aarch64__ 681 return simd_any(x.xyxy); 682 #else 683 union { uint16_t i; simd_char2 v; } u = { .v = x }; 684 return (u.i & 0x8080); 685 #endif 686 } 687 static inline SIMD_CFUNC simd_bool simd_any(simd_char3 x) { 688 #if defined __SSE2__ 689 return (_mm_movemask_epi8((__m128i)simd_make_char16_undef(x)) & 0x7); 690 #elif defined __arm64__ || defined __aarch64__ 691 return simd_any(x.xyzz); 692 #else 693 union { uint32_t i; simd_char3 v; } u = { .v = x }; 694 return (u.i & 0x808080); 695 #endif 696 } 697 static inline SIMD_CFUNC simd_bool simd_any(simd_char4 x) { 698 #if defined __SSE2__ 699 return (_mm_movemask_epi8((__m128i)simd_make_char16_undef(x)) & 0xf); 700 #elif defined __arm64__ || defined __aarch64__ 701 return simd_any(x.xyzwxyzw); 702 #else 703 union { uint32_t i; simd_char4 v; } u = { .v = x }; 704 return (u.i & 0x80808080); 705 #endif 706 } 707 static inline SIMD_CFUNC simd_bool simd_any(simd_char8 x) { 708 #if defined __SSE2__ 709 return (_mm_movemask_epi8((__m128i)simd_make_char16_undef(x)) & 0xff); 710 #elif defined __arm64__ || defined __aarch64__ 711 return vmaxv_u8(x) & 0x80; 712 #else 713 union { uint64_t i; simd_char8 v; } u = { .v = x }; 714 return (u.i & 0x8080808080808080); 715 #endif 716 } 717 static inline SIMD_CFUNC simd_bool simd_any(simd_char16 x) { 718 #if defined __SSE2__ 719 return _mm_movemask_epi8((__m128i)x); 720 #elif defined __arm64__ || defined __aarch64__ 721 return vmaxvq_u8(x) & 0x80; 722 #else 723 return simd_any(x.lo | x.hi); 724 #endif 725 } 726 static inline SIMD_CFUNC simd_bool simd_any(simd_char32 x) { 727 #if defined __AVX2__ 728 return _mm256_movemask_epi8(x); 729 #else 730 return simd_any(x.lo | x.hi); 731 #endif 732 } 733 static inline SIMD_CFUNC simd_bool simd_any(simd_char64 x) { 734 return simd_any(x.lo | x.hi); 735 } 736 static inline SIMD_CFUNC simd_bool simd_any(simd_uchar2 x) { 737 return simd_any((simd_char2)x); 738 } 739 static inline SIMD_CFUNC simd_bool simd_any(simd_uchar3 x) { 740 return simd_any((simd_char3)x); 741 } 742 static inline SIMD_CFUNC simd_bool simd_any(simd_uchar4 x) { 743 return simd_any((simd_char4)x); 744 } 745 static inline SIMD_CFUNC simd_bool simd_any(simd_uchar8 x) { 746 return simd_any((simd_char8)x); 747 } 748 static inline SIMD_CFUNC simd_bool simd_any(simd_uchar16 x) { 749 return simd_any((simd_char16)x); 750 } 751 static inline SIMD_CFUNC simd_bool simd_any(simd_uchar32 x) { 752 return simd_any((simd_char32)x); 753 } 754 static inline SIMD_CFUNC simd_bool simd_any(simd_uchar64 x) { 755 return simd_any((simd_char64)x); 756 } 757 static inline SIMD_CFUNC simd_bool simd_any(simd_short2 x) { 758 #if defined __SSE2__ 759 return (_mm_movemask_epi8((__m128i)simd_make_short8_undef(x)) & 0xa); 760 #elif defined __arm64__ || defined __aarch64__ 761 return simd_any(x.xyxy); 762 #else 763 union { uint32_t i; simd_short2 v; } u = { .v = x }; 764 return (u.i & 0x80008000); 765 #endif 766 } 767 static inline SIMD_CFUNC simd_bool simd_any(simd_short3 x) { 768 #if defined __SSE2__ 769 return (_mm_movemask_epi8((__m128i)simd_make_short8_undef(x)) & 0x2a); 770 #elif defined __arm64__ || defined __aarch64__ 771 return simd_any(x.xyzz); 772 #else 773 union { uint64_t i; simd_short3 v; } u = { .v = x }; 774 return (u.i & 0x800080008000); 775 #endif 776 } 777 static inline SIMD_CFUNC simd_bool simd_any(simd_short4 x) { 778 #if defined __SSE2__ 779 return (_mm_movemask_epi8((__m128i)simd_make_short8_undef(x)) & 0xaa); 780 #elif defined __arm64__ || defined __aarch64__ 781 return vmaxv_u16(x) & 0x8000; 782 #else 783 union { uint64_t i; simd_short4 v; } u = { .v = x }; 784 return (u.i & 0x8000800080008000); 785 #endif 786 } 787 static inline SIMD_CFUNC simd_bool simd_any(simd_short8 x) { 788 #if defined __SSE2__ 789 return (_mm_movemask_epi8((__m128i)x) & 0xaaaa); 790 #elif defined __arm64__ || defined __aarch64__ 791 return vmaxvq_u16(x) & 0x8000; 792 #else 793 return simd_any(x.lo | x.hi); 794 #endif 795 } 796 static inline SIMD_CFUNC simd_bool simd_any(simd_short16 x) { 797 #if defined __AVX2__ 798 return (_mm256_movemask_epi8(x) & 0xaaaaaaaa); 799 #else 800 return simd_any(x.lo | x.hi); 801 #endif 802 } 803 static inline SIMD_CFUNC simd_bool simd_any(simd_short32 x) { 804 return simd_any(x.lo | x.hi); 805 } 806 static inline SIMD_CFUNC simd_bool simd_any(simd_ushort2 x) { 807 return simd_any((simd_short2)x); 808 } 809 static inline SIMD_CFUNC simd_bool simd_any(simd_ushort3 x) { 810 return simd_any((simd_short3)x); 811 } 812 static inline SIMD_CFUNC simd_bool simd_any(simd_ushort4 x) { 813 return simd_any((simd_short4)x); 814 } 815 static inline SIMD_CFUNC simd_bool simd_any(simd_ushort8 x) { 816 return simd_any((simd_short8)x); 817 } 818 static inline SIMD_CFUNC simd_bool simd_any(simd_ushort16 x) { 819 return simd_any((simd_short16)x); 820 } 821 static inline SIMD_CFUNC simd_bool simd_any(simd_ushort32 x) { 822 return simd_any((simd_short32)x); 823 } 824 static inline SIMD_CFUNC simd_bool simd_any(simd_int2 x) { 825 #if defined __SSE2__ 826 return (_mm_movemask_ps((__m128)simd_make_int4_undef(x)) & 0x3); 827 #elif defined __arm64__ || defined __aarch64__ 828 return vmaxv_u32(x) & 0x80000000; 829 #else 830 union { uint64_t i; simd_int2 v; } u = { .v = x }; 831 return (u.i & 0x8000000080000000); 832 #endif 833 } 834 static inline SIMD_CFUNC simd_bool simd_any(simd_int3 x) { 835 #if defined __SSE2__ 836 return (_mm_movemask_ps((__m128)simd_make_int4_undef(x)) & 0x7); 837 #elif defined __arm64__ || defined __aarch64__ 838 return simd_any(x.xyzz); 839 #else 840 return (x.x | x.y | x.z) & 0x80000000; 841 #endif 842 } 843 static inline SIMD_CFUNC simd_bool simd_any(simd_int4 x) { 844 #if defined __SSE2__ 845 return _mm_movemask_ps((__m128)x); 846 #elif defined __arm64__ || defined __aarch64__ 847 return vmaxvq_u32(x) & 0x80000000; 848 #else 849 return simd_any(x.lo | x.hi); 850 #endif 851 } 852 static inline SIMD_CFUNC simd_bool simd_any(simd_int8 x) { 853 #if defined __AVX__ 854 return _mm256_movemask_ps(x); 855 #else 856 return simd_any(x.lo | x.hi); 857 #endif 858 } 859 static inline SIMD_CFUNC simd_bool simd_any(simd_int16 x) { 860 return simd_any(x.lo | x.hi); 861 } 862 static inline SIMD_CFUNC simd_bool simd_any(simd_uint2 x) { 863 return simd_any((simd_int2)x); 864 } 865 static inline SIMD_CFUNC simd_bool simd_any(simd_uint3 x) { 866 return simd_any((simd_int3)x); 867 } 868 static inline SIMD_CFUNC simd_bool simd_any(simd_uint4 x) { 869 return simd_any((simd_int4)x); 870 } 871 static inline SIMD_CFUNC simd_bool simd_any(simd_uint8 x) { 872 return simd_any((simd_int8)x); 873 } 874 static inline SIMD_CFUNC simd_bool simd_any(simd_uint16 x) { 875 return simd_any((simd_int16)x); 876 } 877 static inline SIMD_CFUNC simd_bool simd_any(simd_long2 x) { 878 #if defined __SSE2__ 879 return _mm_movemask_pd((__m128d)x); 880 #elif defined __arm64__ || defined __aarch64__ 881 return (x.x | x.y) & 0x8000000000000000U; 882 #else 883 return (x.x | x.y) & 0x8000000000000000U; 884 #endif 885 } 886 static inline SIMD_CFUNC simd_bool simd_any(simd_long3 x) { 887 #if defined __AVX__ 888 return (_mm256_movemask_pd(simd_make_long4_undef(x)) & 0x7); 889 #else 890 return (x.x | x.y | x.z) & 0x8000000000000000U; 891 #endif 892 } 893 static inline SIMD_CFUNC simd_bool simd_any(simd_long4 x) { 894 #if defined __AVX__ 895 return _mm256_movemask_pd(x); 896 #else 897 return simd_any(x.lo | x.hi); 898 #endif 899 } 900 static inline SIMD_CFUNC simd_bool simd_any(simd_long8 x) { 901 return simd_any(x.lo | x.hi); 902 } 903 static inline SIMD_CFUNC simd_bool simd_any(simd_ulong2 x) { 904 return simd_any((simd_long2)x); 905 } 906 static inline SIMD_CFUNC simd_bool simd_any(simd_ulong3 x) { 907 return simd_any((simd_long3)x); 908 } 909 static inline SIMD_CFUNC simd_bool simd_any(simd_ulong4 x) { 910 return simd_any((simd_long4)x); 911 } 912 static inline SIMD_CFUNC simd_bool simd_any(simd_ulong8 x) { 913 return simd_any((simd_long8)x); 914 } 915 916 static inline SIMD_CFUNC simd_bool simd_all(simd_char2 x) { 917 #if defined __SSE2__ 918 return (_mm_movemask_epi8((__m128i)simd_make_char16_undef(x)) & 0x3) == 0x3; 919 #elif defined __arm64__ || defined __aarch64__ 920 return simd_all(x.xyxy); 921 #else 922 union { uint16_t i; simd_char2 v; } u = { .v = x }; 923 return (u.i & 0x8080) == 0x8080; 924 #endif 925 } 926 static inline SIMD_CFUNC simd_bool simd_all(simd_char3 x) { 927 #if defined __SSE2__ 928 return (_mm_movemask_epi8((__m128i)simd_make_char16_undef(x)) & 0x7) == 0x7; 929 #elif defined __arm64__ || defined __aarch64__ 930 return simd_all(x.xyzz); 931 #else 932 union { uint32_t i; simd_char3 v; } u = { .v = x }; 933 return (u.i & 0x808080) == 0x808080; 934 #endif 935 } 936 static inline SIMD_CFUNC simd_bool simd_all(simd_char4 x) { 937 #if defined __SSE2__ 938 return (_mm_movemask_epi8((__m128i)simd_make_char16_undef(x)) & 0xf) == 0xf; 939 #elif defined __arm64__ || defined __aarch64__ 940 return simd_all(x.xyzwxyzw); 941 #else 942 union { uint32_t i; simd_char4 v; } u = { .v = x }; 943 return (u.i & 0x80808080) == 0x80808080; 944 #endif 945 } 946 static inline SIMD_CFUNC simd_bool simd_all(simd_char8 x) { 947 #if defined __SSE2__ 948 return (_mm_movemask_epi8((__m128i)simd_make_char16_undef(x)) & 0xff) == 0xff; 949 #elif defined __arm64__ || defined __aarch64__ 950 return vminv_u8(x) & 0x80; 951 #else 952 union { uint64_t i; simd_char8 v; } u = { .v = x }; 953 return (u.i & 0x8080808080808080) == 0x8080808080808080; 954 #endif 955 } 956 static inline SIMD_CFUNC simd_bool simd_all(simd_char16 x) { 957 #if defined __SSE2__ 958 return _mm_movemask_epi8((__m128i)x) == 0xffff; 959 #elif defined __arm64__ || defined __aarch64__ 960 return vminvq_u8(x) & 0x80; 961 #else 962 return simd_all(x.lo & x.hi); 963 #endif 964 } 965 static inline SIMD_CFUNC simd_bool simd_all(simd_char32 x) { 966 #if defined __AVX2__ 967 return _mm256_movemask_epi8(x) == 0xffffffff; 968 #else 969 return simd_all(x.lo & x.hi); 970 #endif 971 } 972 static inline SIMD_CFUNC simd_bool simd_all(simd_char64 x) { 973 return simd_all(x.lo & x.hi); 974 } 975 static inline SIMD_CFUNC simd_bool simd_all(simd_uchar2 x) { 976 return simd_all((simd_char2)x); 977 } 978 static inline SIMD_CFUNC simd_bool simd_all(simd_uchar3 x) { 979 return simd_all((simd_char3)x); 980 } 981 static inline SIMD_CFUNC simd_bool simd_all(simd_uchar4 x) { 982 return simd_all((simd_char4)x); 983 } 984 static inline SIMD_CFUNC simd_bool simd_all(simd_uchar8 x) { 985 return simd_all((simd_char8)x); 986 } 987 static inline SIMD_CFUNC simd_bool simd_all(simd_uchar16 x) { 988 return simd_all((simd_char16)x); 989 } 990 static inline SIMD_CFUNC simd_bool simd_all(simd_uchar32 x) { 991 return simd_all((simd_char32)x); 992 } 993 static inline SIMD_CFUNC simd_bool simd_all(simd_uchar64 x) { 994 return simd_all((simd_char64)x); 995 } 996 static inline SIMD_CFUNC simd_bool simd_all(simd_short2 x) { 997 #if defined __SSE2__ 998 return (_mm_movemask_epi8((__m128i)simd_make_short8_undef(x)) & 0xa) == 0xa; 999 #elif defined __arm64__ || defined __aarch64__ 1000 return simd_all(x.xyxy); 1001 #else 1002 union { uint32_t i; simd_short2 v; } u = { .v = x }; 1003 return (u.i & 0x80008000) == 0x80008000; 1004 #endif 1005 } 1006 static inline SIMD_CFUNC simd_bool simd_all(simd_short3 x) { 1007 #if defined __SSE2__ 1008 return (_mm_movemask_epi8((__m128i)simd_make_short8_undef(x)) & 0x2a) == 0x2a; 1009 #elif defined __arm64__ || defined __aarch64__ 1010 return simd_all(x.xyzz); 1011 #else 1012 union { uint64_t i; simd_short3 v; } u = { .v = x }; 1013 return (u.i & 0x800080008000) == 0x800080008000; 1014 #endif 1015 } 1016 static inline SIMD_CFUNC simd_bool simd_all(simd_short4 x) { 1017 #if defined __SSE2__ 1018 return (_mm_movemask_epi8((__m128i)simd_make_short8_undef(x)) & 0xaa) == 0xaa; 1019 #elif defined __arm64__ || defined __aarch64__ 1020 return vminv_u16(x) & 0x8000; 1021 #else 1022 union { uint64_t i; simd_short4 v; } u = { .v = x }; 1023 return (u.i & 0x8000800080008000) == 0x8000800080008000; 1024 #endif 1025 } 1026 static inline SIMD_CFUNC simd_bool simd_all(simd_short8 x) { 1027 #if defined __SSE2__ 1028 return (_mm_movemask_epi8((__m128i)x) & 0xaaaa) == 0xaaaa; 1029 #elif defined __arm64__ || defined __aarch64__ 1030 return vminvq_u16(x) & 0x8000; 1031 #else 1032 return simd_all(x.lo & x.hi); 1033 #endif 1034 } 1035 static inline SIMD_CFUNC simd_bool simd_all(simd_short16 x) { 1036 #if defined __AVX2__ 1037 return (_mm256_movemask_epi8(x) & 0xaaaaaaaa) == 0xaaaaaaaa; 1038 #else 1039 return simd_all(x.lo & x.hi); 1040 #endif 1041 } 1042 static inline SIMD_CFUNC simd_bool simd_all(simd_short32 x) { 1043 return simd_all(x.lo & x.hi); 1044 } 1045 static inline SIMD_CFUNC simd_bool simd_all(simd_ushort2 x) { 1046 return simd_all((simd_short2)x); 1047 } 1048 static inline SIMD_CFUNC simd_bool simd_all(simd_ushort3 x) { 1049 return simd_all((simd_short3)x); 1050 } 1051 static inline SIMD_CFUNC simd_bool simd_all(simd_ushort4 x) { 1052 return simd_all((simd_short4)x); 1053 } 1054 static inline SIMD_CFUNC simd_bool simd_all(simd_ushort8 x) { 1055 return simd_all((simd_short8)x); 1056 } 1057 static inline SIMD_CFUNC simd_bool simd_all(simd_ushort16 x) { 1058 return simd_all((simd_short16)x); 1059 } 1060 static inline SIMD_CFUNC simd_bool simd_all(simd_ushort32 x) { 1061 return simd_all((simd_short32)x); 1062 } 1063 static inline SIMD_CFUNC simd_bool simd_all(simd_int2 x) { 1064 #if defined __SSE2__ 1065 return (_mm_movemask_ps((__m128)simd_make_int4_undef(x)) & 0x3) == 0x3; 1066 #elif defined __arm64__ || defined __aarch64__ 1067 return vminv_u32(x) & 0x80000000; 1068 #else 1069 union { uint64_t i; simd_int2 v; } u = { .v = x }; 1070 return (u.i & 0x8000000080000000) == 0x8000000080000000; 1071 #endif 1072 } 1073 static inline SIMD_CFUNC simd_bool simd_all(simd_int3 x) { 1074 #if defined __SSE2__ 1075 return (_mm_movemask_ps((__m128)simd_make_int4_undef(x)) & 0x7) == 0x7; 1076 #elif defined __arm64__ || defined __aarch64__ 1077 return simd_all(x.xyzz); 1078 #else 1079 return (x.x & x.y & x.z) & 0x80000000; 1080 #endif 1081 } 1082 static inline SIMD_CFUNC simd_bool simd_all(simd_int4 x) { 1083 #if defined __SSE2__ 1084 return _mm_movemask_ps((__m128)x) == 0xf; 1085 #elif defined __arm64__ || defined __aarch64__ 1086 return vminvq_u32(x) & 0x80000000; 1087 #else 1088 return simd_all(x.lo & x.hi); 1089 #endif 1090 } 1091 static inline SIMD_CFUNC simd_bool simd_all(simd_int8 x) { 1092 #if defined __AVX__ 1093 return _mm256_movemask_ps(x) == 0xff; 1094 #else 1095 return simd_all(x.lo & x.hi); 1096 #endif 1097 } 1098 static inline SIMD_CFUNC simd_bool simd_all(simd_int16 x) { 1099 return simd_all(x.lo & x.hi); 1100 } 1101 static inline SIMD_CFUNC simd_bool simd_all(simd_uint2 x) { 1102 return simd_all((simd_int2)x); 1103 } 1104 static inline SIMD_CFUNC simd_bool simd_all(simd_uint3 x) { 1105 return simd_all((simd_int3)x); 1106 } 1107 static inline SIMD_CFUNC simd_bool simd_all(simd_uint4 x) { 1108 return simd_all((simd_int4)x); 1109 } 1110 static inline SIMD_CFUNC simd_bool simd_all(simd_uint8 x) { 1111 return simd_all((simd_int8)x); 1112 } 1113 static inline SIMD_CFUNC simd_bool simd_all(simd_uint16 x) { 1114 return simd_all((simd_int16)x); 1115 } 1116 static inline SIMD_CFUNC simd_bool simd_all(simd_long2 x) { 1117 #if defined __SSE2__ 1118 return _mm_movemask_pd((__m128d)x) == 0x3; 1119 #elif defined __arm64__ || defined __aarch64__ 1120 return (x.x & x.y) & 0x8000000000000000U; 1121 #else 1122 return (x.x & x.y) & 0x8000000000000000U; 1123 #endif 1124 } 1125 static inline SIMD_CFUNC simd_bool simd_all(simd_long3 x) { 1126 #if defined __AVX__ 1127 return (_mm256_movemask_pd(simd_make_long4_undef(x)) & 0x7) == 0x7; 1128 #else 1129 return (x.x & x.y & x.z) & 0x8000000000000000U; 1130 #endif 1131 } 1132 static inline SIMD_CFUNC simd_bool simd_all(simd_long4 x) { 1133 #if defined __AVX__ 1134 return _mm256_movemask_pd(x) == 0xf; 1135 #else 1136 return simd_all(x.lo & x.hi); 1137 #endif 1138 } 1139 static inline SIMD_CFUNC simd_bool simd_all(simd_long8 x) { 1140 return simd_all(x.lo & x.hi); 1141 } 1142 static inline SIMD_CFUNC simd_bool simd_all(simd_ulong2 x) { 1143 return simd_all((simd_long2)x); 1144 } 1145 static inline SIMD_CFUNC simd_bool simd_all(simd_ulong3 x) { 1146 return simd_all((simd_long3)x); 1147 } 1148 static inline SIMD_CFUNC simd_bool simd_all(simd_ulong4 x) { 1149 return simd_all((simd_long4)x); 1150 } 1151 static inline SIMD_CFUNC simd_bool simd_all(simd_ulong8 x) { 1152 return simd_all((simd_long8)x); 1153 } 1154 1155 static inline SIMD_CFUNC simd_half2 simd_select(simd_half2 x, simd_half2 y, simd_short2 mask) { 1156 return simd_make_half2(simd_select(simd_make_half8_undef(x), simd_make_half8_undef(y), simd_make_short8_undef(mask))); 1157 } 1158 static inline SIMD_CFUNC simd_half3 simd_select(simd_half3 x, simd_half3 y, simd_short3 mask) { 1159 return simd_make_half3(simd_select(simd_make_half8_undef(x), simd_make_half8_undef(y), simd_make_short8_undef(mask))); 1160 } 1161 static inline SIMD_CFUNC simd_half4 simd_select(simd_half4 x, simd_half4 y, simd_short4 mask) { 1162 return simd_make_half4(simd_select(simd_make_half8_undef(x), simd_make_half8_undef(y), simd_make_short8_undef(mask))); 1163 } 1164 static inline SIMD_CFUNC simd_half8 simd_select(simd_half8 x, simd_half8 y, simd_short8 mask) { 1165 return simd_bitselect(x, y, mask >> 15); 1166 } 1167 static inline SIMD_CFUNC simd_half16 simd_select(simd_half16 x, simd_half16 y, simd_short16 mask) { 1168 return simd_bitselect(x, y, mask >> 15); 1169 } 1170 static inline SIMD_CFUNC simd_half32 simd_select(simd_half32 x, simd_half32 y, simd_short32 mask) { 1171 return simd_bitselect(x, y, mask >> 15); 1172 } 1173 static inline SIMD_CFUNC simd_float2 simd_select(simd_float2 x, simd_float2 y, simd_int2 mask) { 1174 return simd_make_float2(simd_select(simd_make_float4_undef(x), simd_make_float4_undef(y), simd_make_int4_undef(mask))); 1175 } 1176 static inline SIMD_CFUNC simd_float3 simd_select(simd_float3 x, simd_float3 y, simd_int3 mask) { 1177 return simd_make_float3(simd_select(simd_make_float4_undef(x), simd_make_float4_undef(y), simd_make_int4_undef(mask))); 1178 } 1179 static inline SIMD_CFUNC simd_float4 simd_select(simd_float4 x, simd_float4 y, simd_int4 mask) { 1180 #if defined __SSE4_1__ 1181 return _mm_blendv_ps(x, y, (__m128)mask); 1182 #else 1183 return simd_bitselect(x, y, mask >> 31); 1184 #endif 1185 } 1186 static inline SIMD_CFUNC simd_float8 simd_select(simd_float8 x, simd_float8 y, simd_int8 mask) { 1187 #if defined __AVX__ 1188 return _mm256_blendv_ps(x, y, mask); 1189 #else 1190 return simd_bitselect(x, y, mask >> 31); 1191 #endif 1192 } 1193 static inline SIMD_CFUNC simd_float16 simd_select(simd_float16 x, simd_float16 y, simd_int16 mask) { 1194 return simd_bitselect(x, y, mask >> 31); 1195 } 1196 static inline SIMD_CFUNC simd_double2 simd_select(simd_double2 x, simd_double2 y, simd_long2 mask) { 1197 #if defined __SSE4_1__ 1198 return _mm_blendv_pd(x, y, (__m128d)mask); 1199 #else 1200 return simd_bitselect(x, y, mask >> 63); 1201 #endif 1202 } 1203 static inline SIMD_CFUNC simd_double3 simd_select(simd_double3 x, simd_double3 y, simd_long3 mask) { 1204 return simd_make_double3(simd_select(simd_make_double4_undef(x), simd_make_double4_undef(y), simd_make_long4_undef(mask))); 1205 } 1206 static inline SIMD_CFUNC simd_double4 simd_select(simd_double4 x, simd_double4 y, simd_long4 mask) { 1207 #if defined __AVX__ 1208 return _mm256_blendv_pd(x, y, mask); 1209 #else 1210 return simd_bitselect(x, y, mask >> 63); 1211 #endif 1212 } 1213 static inline SIMD_CFUNC simd_double8 simd_select(simd_double8 x, simd_double8 y, simd_long8 mask) { 1214 return simd_bitselect(x, y, mask >> 63); 1215 } 1216 1217 static inline SIMD_CFUNC simd_char2 simd_bitselect(simd_char2 x, simd_char2 y, simd_char2 mask) { 1218 return (x & ~mask) | (y & mask); 1219 } 1220 static inline SIMD_CFUNC simd_char3 simd_bitselect(simd_char3 x, simd_char3 y, simd_char3 mask) { 1221 return (x & ~mask) | (y & mask); 1222 } 1223 static inline SIMD_CFUNC simd_char4 simd_bitselect(simd_char4 x, simd_char4 y, simd_char4 mask) { 1224 return (x & ~mask) | (y & mask); 1225 } 1226 static inline SIMD_CFUNC simd_char8 simd_bitselect(simd_char8 x, simd_char8 y, simd_char8 mask) { 1227 return (x & ~mask) | (y & mask); 1228 } 1229 static inline SIMD_CFUNC simd_char16 simd_bitselect(simd_char16 x, simd_char16 y, simd_char16 mask) { 1230 return (x & ~mask) | (y & mask); 1231 } 1232 static inline SIMD_CFUNC simd_char32 simd_bitselect(simd_char32 x, simd_char32 y, simd_char32 mask) { 1233 return (x & ~mask) | (y & mask); 1234 } 1235 static inline SIMD_CFUNC simd_char64 simd_bitselect(simd_char64 x, simd_char64 y, simd_char64 mask) { 1236 return (x & ~mask) | (y & mask); 1237 } 1238 static inline SIMD_CFUNC simd_uchar2 simd_bitselect(simd_uchar2 x, simd_uchar2 y, simd_char2 mask) { 1239 return (simd_uchar2)simd_bitselect((simd_char2)x, (simd_char2)y, mask); 1240 } 1241 static inline SIMD_CFUNC simd_uchar3 simd_bitselect(simd_uchar3 x, simd_uchar3 y, simd_char3 mask) { 1242 return (simd_uchar3)simd_bitselect((simd_char3)x, (simd_char3)y, mask); 1243 } 1244 static inline SIMD_CFUNC simd_uchar4 simd_bitselect(simd_uchar4 x, simd_uchar4 y, simd_char4 mask) { 1245 return (simd_uchar4)simd_bitselect((simd_char4)x, (simd_char4)y, mask); 1246 } 1247 static inline SIMD_CFUNC simd_uchar8 simd_bitselect(simd_uchar8 x, simd_uchar8 y, simd_char8 mask) { 1248 return (simd_uchar8)simd_bitselect((simd_char8)x, (simd_char8)y, mask); 1249 } 1250 static inline SIMD_CFUNC simd_uchar16 simd_bitselect(simd_uchar16 x, simd_uchar16 y, simd_char16 mask) { 1251 return (simd_uchar16)simd_bitselect((simd_char16)x, (simd_char16)y, mask); 1252 } 1253 static inline SIMD_CFUNC simd_uchar32 simd_bitselect(simd_uchar32 x, simd_uchar32 y, simd_char32 mask) { 1254 return (simd_uchar32)simd_bitselect((simd_char32)x, (simd_char32)y, mask); 1255 } 1256 static inline SIMD_CFUNC simd_uchar64 simd_bitselect(simd_uchar64 x, simd_uchar64 y, simd_char64 mask) { 1257 return (simd_uchar64)simd_bitselect((simd_char64)x, (simd_char64)y, mask); 1258 } 1259 static inline SIMD_CFUNC simd_short2 simd_bitselect(simd_short2 x, simd_short2 y, simd_short2 mask) { 1260 return (x & ~mask) | (y & mask); 1261 } 1262 static inline SIMD_CFUNC simd_short3 simd_bitselect(simd_short3 x, simd_short3 y, simd_short3 mask) { 1263 return (x & ~mask) | (y & mask); 1264 } 1265 static inline SIMD_CFUNC simd_short4 simd_bitselect(simd_short4 x, simd_short4 y, simd_short4 mask) { 1266 return (x & ~mask) | (y & mask); 1267 } 1268 static inline SIMD_CFUNC simd_short8 simd_bitselect(simd_short8 x, simd_short8 y, simd_short8 mask) { 1269 return (x & ~mask) | (y & mask); 1270 } 1271 static inline SIMD_CFUNC simd_short16 simd_bitselect(simd_short16 x, simd_short16 y, simd_short16 mask) { 1272 return (x & ~mask) | (y & mask); 1273 } 1274 static inline SIMD_CFUNC simd_short32 simd_bitselect(simd_short32 x, simd_short32 y, simd_short32 mask) { 1275 return (x & ~mask) | (y & mask); 1276 } 1277 static inline SIMD_CFUNC simd_ushort2 simd_bitselect(simd_ushort2 x, simd_ushort2 y, simd_short2 mask) { 1278 return (simd_ushort2)simd_bitselect((simd_short2)x, (simd_short2)y, mask); 1279 } 1280 static inline SIMD_CFUNC simd_ushort3 simd_bitselect(simd_ushort3 x, simd_ushort3 y, simd_short3 mask) { 1281 return (simd_ushort3)simd_bitselect((simd_short3)x, (simd_short3)y, mask); 1282 } 1283 static inline SIMD_CFUNC simd_ushort4 simd_bitselect(simd_ushort4 x, simd_ushort4 y, simd_short4 mask) { 1284 return (simd_ushort4)simd_bitselect((simd_short4)x, (simd_short4)y, mask); 1285 } 1286 static inline SIMD_CFUNC simd_ushort8 simd_bitselect(simd_ushort8 x, simd_ushort8 y, simd_short8 mask) { 1287 return (simd_ushort8)simd_bitselect((simd_short8)x, (simd_short8)y, mask); 1288 } 1289 static inline SIMD_CFUNC simd_ushort16 simd_bitselect(simd_ushort16 x, simd_ushort16 y, simd_short16 mask) { 1290 return (simd_ushort16)simd_bitselect((simd_short16)x, (simd_short16)y, mask); 1291 } 1292 static inline SIMD_CFUNC simd_ushort32 simd_bitselect(simd_ushort32 x, simd_ushort32 y, simd_short32 mask) { 1293 return (simd_ushort32)simd_bitselect((simd_short32)x, (simd_short32)y, mask); 1294 } 1295 static inline SIMD_CFUNC simd_half2 simd_bitselect(simd_half2 x, simd_half2 y, simd_short2 mask) { 1296 return (simd_half2)simd_bitselect((simd_short2)x, (simd_short2)y, mask); 1297 } 1298 static inline SIMD_CFUNC simd_half3 simd_bitselect(simd_half3 x, simd_half3 y, simd_short3 mask) { 1299 return (simd_half3)simd_bitselect((simd_short3)x, (simd_short3)y, mask); 1300 } 1301 static inline SIMD_CFUNC simd_half4 simd_bitselect(simd_half4 x, simd_half4 y, simd_short4 mask) { 1302 return (simd_half4)simd_bitselect((simd_short4)x, (simd_short4)y, mask); 1303 } 1304 static inline SIMD_CFUNC simd_half8 simd_bitselect(simd_half8 x, simd_half8 y, simd_short8 mask) { 1305 return (simd_half8)simd_bitselect((simd_short8)x, (simd_short8)y, mask); 1306 } 1307 static inline SIMD_CFUNC simd_half16 simd_bitselect(simd_half16 x, simd_half16 y, simd_short16 mask) { 1308 return (simd_half16)simd_bitselect((simd_short16)x, (simd_short16)y, mask); 1309 } 1310 static inline SIMD_CFUNC simd_half32 simd_bitselect(simd_half32 x, simd_half32 y, simd_short32 mask) { 1311 return (simd_half32)simd_bitselect((simd_short32)x, (simd_short32)y, mask); 1312 } 1313 static inline SIMD_CFUNC simd_int2 simd_bitselect(simd_int2 x, simd_int2 y, simd_int2 mask) { 1314 return (x & ~mask) | (y & mask); 1315 } 1316 static inline SIMD_CFUNC simd_int3 simd_bitselect(simd_int3 x, simd_int3 y, simd_int3 mask) { 1317 return (x & ~mask) | (y & mask); 1318 } 1319 static inline SIMD_CFUNC simd_int4 simd_bitselect(simd_int4 x, simd_int4 y, simd_int4 mask) { 1320 return (x & ~mask) | (y & mask); 1321 } 1322 static inline SIMD_CFUNC simd_int8 simd_bitselect(simd_int8 x, simd_int8 y, simd_int8 mask) { 1323 return (x & ~mask) | (y & mask); 1324 } 1325 static inline SIMD_CFUNC simd_int16 simd_bitselect(simd_int16 x, simd_int16 y, simd_int16 mask) { 1326 return (x & ~mask) | (y & mask); 1327 } 1328 static inline SIMD_CFUNC simd_uint2 simd_bitselect(simd_uint2 x, simd_uint2 y, simd_int2 mask) { 1329 return (simd_uint2)simd_bitselect((simd_int2)x, (simd_int2)y, mask); 1330 } 1331 static inline SIMD_CFUNC simd_uint3 simd_bitselect(simd_uint3 x, simd_uint3 y, simd_int3 mask) { 1332 return (simd_uint3)simd_bitselect((simd_int3)x, (simd_int3)y, mask); 1333 } 1334 static inline SIMD_CFUNC simd_uint4 simd_bitselect(simd_uint4 x, simd_uint4 y, simd_int4 mask) { 1335 return (simd_uint4)simd_bitselect((simd_int4)x, (simd_int4)y, mask); 1336 } 1337 static inline SIMD_CFUNC simd_uint8 simd_bitselect(simd_uint8 x, simd_uint8 y, simd_int8 mask) { 1338 return (simd_uint8)simd_bitselect((simd_int8)x, (simd_int8)y, mask); 1339 } 1340 static inline SIMD_CFUNC simd_uint16 simd_bitselect(simd_uint16 x, simd_uint16 y, simd_int16 mask) { 1341 return (simd_uint16)simd_bitselect((simd_int16)x, (simd_int16)y, mask); 1342 } 1343 static inline SIMD_CFUNC simd_float2 simd_bitselect(simd_float2 x, simd_float2 y, simd_int2 mask) { 1344 return (simd_float2)simd_bitselect((simd_int2)x, (simd_int2)y, mask); 1345 } 1346 static inline SIMD_CFUNC simd_float3 simd_bitselect(simd_float3 x, simd_float3 y, simd_int3 mask) { 1347 return (simd_float3)simd_bitselect((simd_int3)x, (simd_int3)y, mask); 1348 } 1349 static inline SIMD_CFUNC simd_float4 simd_bitselect(simd_float4 x, simd_float4 y, simd_int4 mask) { 1350 return (simd_float4)simd_bitselect((simd_int4)x, (simd_int4)y, mask); 1351 } 1352 static inline SIMD_CFUNC simd_float8 simd_bitselect(simd_float8 x, simd_float8 y, simd_int8 mask) { 1353 return (simd_float8)simd_bitselect((simd_int8)x, (simd_int8)y, mask); 1354 } 1355 static inline SIMD_CFUNC simd_float16 simd_bitselect(simd_float16 x, simd_float16 y, simd_int16 mask) { 1356 return (simd_float16)simd_bitselect((simd_int16)x, (simd_int16)y, mask); 1357 } 1358 static inline SIMD_CFUNC simd_long2 simd_bitselect(simd_long2 x, simd_long2 y, simd_long2 mask) { 1359 return (x & ~mask) | (y & mask); 1360 } 1361 static inline SIMD_CFUNC simd_long3 simd_bitselect(simd_long3 x, simd_long3 y, simd_long3 mask) { 1362 return (x & ~mask) | (y & mask); 1363 } 1364 static inline SIMD_CFUNC simd_long4 simd_bitselect(simd_long4 x, simd_long4 y, simd_long4 mask) { 1365 return (x & ~mask) | (y & mask); 1366 } 1367 static inline SIMD_CFUNC simd_long8 simd_bitselect(simd_long8 x, simd_long8 y, simd_long8 mask) { 1368 return (x & ~mask) | (y & mask); 1369 } 1370 static inline SIMD_CFUNC simd_ulong2 simd_bitselect(simd_ulong2 x, simd_ulong2 y, simd_long2 mask) { 1371 return (simd_ulong2)simd_bitselect((simd_long2)x, (simd_long2)y, mask); 1372 } 1373 static inline SIMD_CFUNC simd_ulong3 simd_bitselect(simd_ulong3 x, simd_ulong3 y, simd_long3 mask) { 1374 return (simd_ulong3)simd_bitselect((simd_long3)x, (simd_long3)y, mask); 1375 } 1376 static inline SIMD_CFUNC simd_ulong4 simd_bitselect(simd_ulong4 x, simd_ulong4 y, simd_long4 mask) { 1377 return (simd_ulong4)simd_bitselect((simd_long4)x, (simd_long4)y, mask); 1378 } 1379 static inline SIMD_CFUNC simd_ulong8 simd_bitselect(simd_ulong8 x, simd_ulong8 y, simd_long8 mask) { 1380 return (simd_ulong8)simd_bitselect((simd_long8)x, (simd_long8)y, mask); 1381 } 1382 static inline SIMD_CFUNC simd_double2 simd_bitselect(simd_double2 x, simd_double2 y, simd_long2 mask) { 1383 return (simd_double2)simd_bitselect((simd_long2)x, (simd_long2)y, mask); 1384 } 1385 static inline SIMD_CFUNC simd_double3 simd_bitselect(simd_double3 x, simd_double3 y, simd_long3 mask) { 1386 return (simd_double3)simd_bitselect((simd_long3)x, (simd_long3)y, mask); 1387 } 1388 static inline SIMD_CFUNC simd_double4 simd_bitselect(simd_double4 x, simd_double4 y, simd_long4 mask) { 1389 return (simd_double4)simd_bitselect((simd_long4)x, (simd_long4)y, mask); 1390 } 1391 static inline SIMD_CFUNC simd_double8 simd_bitselect(simd_double8 x, simd_double8 y, simd_long8 mask) { 1392 return (simd_double8)simd_bitselect((simd_long8)x, (simd_long8)y, mask); 1393 } 1394 1395 #ifdef __cplusplus 1396 } 1397 #endif 1398 #endif /* SIMD_COMPILER_HAS_REQUIRED_FEATURES */ 1399 #endif /* __SIMD_LOGIC_HEADER__ */