SuperTuxKart 1.5 upstream source (from official release tarball)
This commit is contained in:
@@ -0,0 +1,249 @@
|
||||
/* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Copyright:
|
||||
* 2020 Evan Nemerson <evan@nemerson.com>
|
||||
* 2020 Ashleigh Newman-Jones <ashnewman-jones@hotmail.co.uk>
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512_2INTERSECT_H)
|
||||
#define SIMDE_X86_AVX512_2INTERSECT_H
|
||||
|
||||
#include "types.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
void
|
||||
simde_mm_2intersect_epi32(simde__m128i a, simde__m128i b, simde__mmask8 *k1, simde__mmask8 *k2) {
|
||||
simde__m128i_private
|
||||
a_ = simde__m128i_to_private(a),
|
||||
b_ = simde__m128i_to_private(b);
|
||||
simde__mmask8
|
||||
k1_ = 0,
|
||||
k2_ = 0;
|
||||
|
||||
for (size_t i = 0 ; i < sizeof(a_.i32) / sizeof(a_.i32[0]) ; i++) {
|
||||
#if defined(SIMDE_ENABLE_OPENMP)
|
||||
#pragma omp simd reduction(|:k1_) reduction(|:k2_)
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
#endif
|
||||
for (size_t j = 0 ; j < sizeof(b_.i32) / sizeof(b_.i32[0]) ; j++) {
|
||||
const int32_t m = a_.i32[i] == b_.i32[j];
|
||||
k1_ |= m << i;
|
||||
k2_ |= m << j;
|
||||
}
|
||||
}
|
||||
|
||||
*k1 = k1_;
|
||||
*k2 = k2_;
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VP2INTERSECT_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
#define simde_mm_2intersect_epi32(a, b, k1, k2) _mm_2intersect_epi32(a, b, k1, k2)
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512VP2INTERSECT_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_2intersect_epi32
|
||||
#define _mm_2intersect_epi32(a, b, k1, k2) simde_mm_2intersect_epi32(a, b, k1, k2)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
void
|
||||
simde_mm_2intersect_epi64(simde__m128i a, simde__m128i b, simde__mmask8 *k1, simde__mmask8 *k2) {
|
||||
#if defined(SIMDE_X86_AVX512VP2INTERSECT_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
_mm_2intersect_epi64(a, b, k1, k2);
|
||||
#else
|
||||
simde__m128i_private
|
||||
a_ = simde__m128i_to_private(a),
|
||||
b_ = simde__m128i_to_private(b);
|
||||
simde__mmask8
|
||||
k1_ = 0,
|
||||
k2_ = 0;
|
||||
|
||||
for (size_t i = 0 ; i < sizeof(a_.i64) / sizeof(a_.i64[0]) ; i++) {
|
||||
#if defined(SIMDE_ENABLE_OPENMP)
|
||||
#pragma omp simd reduction(|:k1_) reduction(|:k2_)
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
#endif
|
||||
for (size_t j = 0 ; j < sizeof(b_.i64) / sizeof(b_.i64[0]) ; j++) {
|
||||
const int32_t m = a_.i64[i] == b_.i64[j];
|
||||
k1_ |= m << i;
|
||||
k2_ |= m << j;
|
||||
}
|
||||
}
|
||||
|
||||
*k1 = k1_;
|
||||
*k2 = k2_;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VP2INTERSECT_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_2intersect_epi64
|
||||
#define _mm_2intersect_epi64(a, b, k1, k2) simde_mm_2intersect_epi64(a, b, k1, k2)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
void
|
||||
simde_mm256_2intersect_epi32(simde__m256i a, simde__m256i b, simde__mmask8 *k1, simde__mmask8 *k2) {
|
||||
#if defined(SIMDE_X86_AVX512VP2INTERSECT_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
_mm256_2intersect_epi32(a, b, k1, k2);
|
||||
#else
|
||||
simde__m256i_private
|
||||
a_ = simde__m256i_to_private(a),
|
||||
b_ = simde__m256i_to_private(b);
|
||||
simde__mmask8
|
||||
k1_ = 0,
|
||||
k2_ = 0;
|
||||
|
||||
for (size_t i = 0 ; i < sizeof(a_.i32) / sizeof(a_.i32[0]) ; i++) {
|
||||
#if defined(SIMDE_ENABLE_OPENMP)
|
||||
#pragma omp simd reduction(|:k1_) reduction(|:k2_)
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
#endif
|
||||
for (size_t j = 0 ; j < sizeof(b_.i32) / sizeof(b_.i32[0]) ; j++) {
|
||||
const int32_t m = a_.i32[i] == b_.i32[j];
|
||||
k1_ |= m << i;
|
||||
k2_ |= m << j;
|
||||
}
|
||||
}
|
||||
|
||||
*k1 = k1_;
|
||||
*k2 = k2_;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VP2INTERSECT_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_2intersect_epi32
|
||||
#define _mm256_2intersect_epi32(a, b, k1, k2) simde_mm256_2intersect_epi32(a, b, k1, k2)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
void
|
||||
simde_mm256_2intersect_epi64(simde__m256i a, simde__m256i b, simde__mmask8 *k1, simde__mmask8 *k2) {
|
||||
#if defined(SIMDE_X86_AVX512VP2INTERSECT_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
_mm256_2intersect_epi64(a, b, k1, k2);
|
||||
#else
|
||||
simde__m256i_private
|
||||
a_ = simde__m256i_to_private(a),
|
||||
b_ = simde__m256i_to_private(b);
|
||||
simde__mmask8
|
||||
k1_ = 0,
|
||||
k2_ = 0;
|
||||
|
||||
for (size_t i = 0 ; i < sizeof(a_.i64) / sizeof(a_.i64[0]) ; i++) {
|
||||
#if defined(SIMDE_ENABLE_OPENMP)
|
||||
#pragma omp simd reduction(|:k1_) reduction(|:k2_)
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
#endif
|
||||
for (size_t j = 0 ; j < sizeof(b_.i64) / sizeof(b_.i64[0]) ; j++) {
|
||||
const int32_t m = a_.i64[i] == b_.i64[j];
|
||||
k1_ |= m << i;
|
||||
k2_ |= m << j;
|
||||
}
|
||||
}
|
||||
|
||||
*k1 = k1_;
|
||||
*k2 = k2_;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VP2INTERSECT_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_2intersect_epi64
|
||||
#define _mm256_2intersect_epi64(a, b, k1, k2) simde_mm256_2intersect_epi64(a, b, k1, k2)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
void
|
||||
simde_mm512_2intersect_epi32(simde__m512i a, simde__m512i b, simde__mmask16 *k1, simde__mmask16 *k2) {
|
||||
#if defined(SIMDE_X86_AVX512VP2INTERSECT_NATIVE)
|
||||
_mm512_2intersect_epi32(a, b, k1, k2);
|
||||
#else
|
||||
simde__m512i_private
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b);
|
||||
simde__mmask16
|
||||
k1_ = 0,
|
||||
k2_ = 0;
|
||||
|
||||
for (size_t i = 0 ; i < sizeof(a_.i32) / sizeof(a_.i32[0]) ; i++) {
|
||||
#if defined(SIMDE_ENABLE_OPENMP)
|
||||
#pragma omp simd reduction(|:k1_) reduction(|:k2_)
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
#endif
|
||||
for (size_t j = 0 ; j < sizeof(b_.i32) / sizeof(b_.i32[0]) ; j++) {
|
||||
const int32_t m = a_.i32[i] == b_.i32[j];
|
||||
k1_ |= m << i;
|
||||
k2_ |= m << j;
|
||||
}
|
||||
}
|
||||
|
||||
*k1 = k1_;
|
||||
*k2 = k2_;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VP2INTERSECT_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_2intersect_epi32
|
||||
#define _mm512_2intersect_epi32(a, b, k1, k2) simde_mm512_2intersect_epi32(a, b, k1, k2)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
void
|
||||
simde_mm512_2intersect_epi64(simde__m512i a, simde__m512i b, simde__mmask8 *k1, simde__mmask8 *k2) {
|
||||
#if defined(SIMDE_X86_AVX512VP2INTERSECT_NATIVE)
|
||||
_mm512_2intersect_epi64(a, b, k1, k2);
|
||||
#else
|
||||
simde__m512i_private
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b);
|
||||
simde__mmask8
|
||||
k1_ = 0,
|
||||
k2_ = 0;
|
||||
|
||||
for (size_t i = 0 ; i < sizeof(a_.i64) / sizeof(a_.i64[0]) ; i++) {
|
||||
#if defined(SIMDE_ENABLE_OPENMP)
|
||||
#pragma omp simd reduction(|:k1_) reduction(|:k2_)
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
#endif
|
||||
for (size_t j = 0 ; j < sizeof(b_.i64) / sizeof(b_.i64[0]) ; j++) {
|
||||
const int32_t m = a_.i64[i] == b_.i64[j];
|
||||
k1_ |= m << i;
|
||||
k2_ |= m << j;
|
||||
}
|
||||
}
|
||||
|
||||
*k1 = k1_;
|
||||
*k2 = k2_;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VP2INTERSECT_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_2intersect_epi64
|
||||
#define _mm512_2intersect_epi64(a, b, k1, k2) simde_mm512_2intersect_epi64(a, b, k1, k2)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_2INTERSECT_H) */
|
||||
@@ -0,0 +1,67 @@
|
||||
#if !defined(SIMDE_X86_AVX512_4DPWSSD_H)
|
||||
#define SIMDE_X86_AVX512_4DPWSSD_H
|
||||
|
||||
#include "types.h"
|
||||
#include "dpwssd.h"
|
||||
#include "set1.h"
|
||||
#include "mov.h"
|
||||
#include "add.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_4dpwssd_epi32 (simde__m512i src, simde__m512i a0, simde__m512i a1, simde__m512i a2, simde__m512i a3, simde__m128i* b) {
|
||||
#if defined(SIMDE_X86_AVX5124VNNIW_NATIVE)
|
||||
return _mm512_4dpwssd_epi32(src, a0, a1, a2, a3, b);
|
||||
#else
|
||||
simde__m128i_private bv = simde__m128i_to_private(simde_mm_loadu_epi32(b));
|
||||
simde__m512i r;
|
||||
|
||||
r = simde_mm512_dpwssd_epi32(src, a0, simde_mm512_set1_epi32(bv.i32[0]));
|
||||
r = simde_mm512_add_epi32(simde_mm512_dpwssd_epi32(src, a1, simde_mm512_set1_epi32(bv.i32[1])), r);
|
||||
r = simde_mm512_add_epi32(simde_mm512_dpwssd_epi32(src, a2, simde_mm512_set1_epi32(bv.i32[2])), r);
|
||||
r = simde_mm512_add_epi32(simde_mm512_dpwssd_epi32(src, a3, simde_mm512_set1_epi32(bv.i32[3])), r);
|
||||
|
||||
return r;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX5124VNNIW_ENABLE_NATIVE_ALIASES)
|
||||
#undef simde_mm512_4dpwssd_epi32
|
||||
#define _mm512_4dpwssd_epi32(src, a0, a1, a2, a3, b) simde_mm512_4dpwssd_epi32(src, a0, a1, a2, a3, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_4dpwssd_epi32 (simde__m512i src, simde__mmask16 k, simde__m512i a0, simde__m512i a1, simde__m512i a2, simde__m512i a3, simde__m128i* b) {
|
||||
#if defined(SIMDE_X86_AVX5124VNNIW_NATIVE)
|
||||
return _mm512_mask_4dpwssd_epi32(src, k, a0, a1, a2, a3, b);
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi32(src, k, simde_mm512_4dpwssd_epi32(src, a0, a1, a2, a3, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX5124VNNIW_ENABLE_NATIVE_ALIASES)
|
||||
#undef simde_mm512_mask_4dpwssd_epi32
|
||||
#define _mm512_mask_4dpwssd_epi32(src, k, a0, a1, a2, a3, b) simde_mm512_mask_4dpwssd_epi32(src, k, a0, a1, a2, a3, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_4dpwssd_epi32 (simde__mmask16 k, simde__m512i src, simde__m512i a0, simde__m512i a1, simde__m512i a2, simde__m512i a3, simde__m128i* b) {
|
||||
#if defined(SIMDE_X86_AVX5124VNNIW_NATIVE)
|
||||
return _mm512_mask_4dpwssd_epi32(k, src, a0, a1, a2, a3, b);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_epi32(k, simde_mm512_4dpwssd_epi32(src, a0, a1, a2, a3, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX5124VNNIW_ENABLE_NATIVE_ALIASES)
|
||||
#undef simde_mm512_maskz_4dpwssd_epi32
|
||||
#define _mm512_maskz_4dpwssd_epi32(k, src, a0, a1, a2, a3, b) simde_mm512_maskz_4dpwssd_epi32(k, src, a0, a1, a2, a3, b)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_4DPWSSD_H) */
|
||||
@@ -0,0 +1,67 @@
|
||||
#if !defined(SIMDE_X86_AVX512_4DPWSSDS_H)
|
||||
#define SIMDE_X86_AVX512_4DPWSSDS_H
|
||||
|
||||
#include "types.h"
|
||||
#include "dpwssds.h"
|
||||
#include "set1.h"
|
||||
#include "mov.h"
|
||||
#include "adds.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_4dpwssds_epi32 (simde__m512i src, simde__m512i a0, simde__m512i a1, simde__m512i a2, simde__m512i a3, simde__m128i* b) {
|
||||
#if defined(SIMDE_X86_AVX5124VNNIW_NATIVE)
|
||||
return _mm512_4dpwssds_epi32(src, a0, a1, a2, a3, b);
|
||||
#else
|
||||
simde__m128i_private bv = simde__m128i_to_private(simde_mm_loadu_epi32(b));
|
||||
simde__m512i r;
|
||||
|
||||
r = simde_mm512_dpwssds_epi32(src, a0, simde_mm512_set1_epi32(bv.i32[0]));
|
||||
r = simde_x_mm512_adds_epi32(simde_mm512_dpwssds_epi32(src, a1, simde_mm512_set1_epi32(bv.i32[1])), r);
|
||||
r = simde_x_mm512_adds_epi32(simde_mm512_dpwssds_epi32(src, a2, simde_mm512_set1_epi32(bv.i32[2])), r);
|
||||
r = simde_x_mm512_adds_epi32(simde_mm512_dpwssds_epi32(src, a3, simde_mm512_set1_epi32(bv.i32[3])), r);
|
||||
|
||||
return r;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX5124VNNIW_ENABLE_NATIVE_ALIASES)
|
||||
#undef simde_mm512_4dpwssds_epi32
|
||||
#define _mm512_4dpwssds_epi32(src, a0, a1, a2, a3, b) simde_mm512_4dpwssds_epi32(src, a0, a1, a2, a3, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_4dpwssds_epi32 (simde__m512i src, simde__mmask16 k, simde__m512i a0, simde__m512i a1, simde__m512i a2, simde__m512i a3, simde__m128i* b) {
|
||||
#if defined(SIMDE_X86_AVX5124VNNIW_NATIVE)
|
||||
return _mm512_mask_4dpwssds_epi32(src, k, a0, a1, a2, a3, b);
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi32(src, k, simde_mm512_4dpwssds_epi32(src, a0, a1, a2, a3, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX5124VNNIW_ENABLE_NATIVE_ALIASES)
|
||||
#undef simde_mm512_mask_4dpwssds_epi32
|
||||
#define _mm512_mask_4dpwssds_epi32(src, k, a0, a1, a2, a3, b) simde_mm512_mask_4dpwssds_epi32(src, k, a0, a1, a2, a3, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_4dpwssds_epi32 (simde__mmask16 k, simde__m512i src, simde__m512i a0, simde__m512i a1, simde__m512i a2, simde__m512i a3, simde__m128i* b) {
|
||||
#if defined(SIMDE_X86_AVX5124VNNIW_NATIVE)
|
||||
return _mm512_mask_4dpwssds_epi32(k, src, a0, a1, a2, a3, b);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_epi32(k, simde_mm512_4dpwssds_epi32(src, a0, a1, a2, a3, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX5124VNNIW_ENABLE_NATIVE_ALIASES)
|
||||
#undef simde_mm512_maskz_4dpwssds_epi32
|
||||
#define _mm512_maskz_4dpwssds_epi32(k, src, a0, a1, a2, a3, b) simde_mm512_maskz_4dpwssds_epi32(k, src, a0, a1, a2, a3, b)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_4DPWSSDS_H) */
|
||||
@@ -0,0 +1,580 @@
|
||||
/* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Copyright:
|
||||
* 2020 Evan Nemerson <evan@nemerson.com>
|
||||
* 2020 Hidayat Khan <huk2209@gmail.com>
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512_ABS_H)
|
||||
#define SIMDE_X86_AVX512_ABS_H
|
||||
|
||||
#include "types.h"
|
||||
#include "mov.h"
|
||||
#include "../avx2.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_mask_abs_epi8(simde__m128i src, simde__mmask16 k, simde__m128i a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm_mask_abs_epi8(src, k, a);
|
||||
#else
|
||||
return simde_mm_mask_mov_epi8(src, k, simde_mm_abs_epi8(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_abs_epi8
|
||||
#define _mm_mask_abs_epi8(src, k, a) simde_mm_mask_abs_epi8(src, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_maskz_abs_epi8(simde__mmask16 k, simde__m128i a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm_maskz_abs_epi8(k, a);
|
||||
#else
|
||||
return simde_mm_maskz_mov_epi8(k, simde_mm_abs_epi8(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_maskz_abs_epi8
|
||||
#define _mm_maskz_abs_epi8(k, a) simde_mm_maskz_abs_epi8(k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_mask_abs_epi16(simde__m128i src, simde__mmask8 k, simde__m128i a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm_mask_abs_epi16(src, k, a);
|
||||
#else
|
||||
return simde_mm_mask_mov_epi16(src, k, simde_mm_abs_epi16(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_abs_epi16
|
||||
#define _mm_mask_abs_epi16(src, k, a) simde_mm_mask_abs_epi16(src, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_maskz_abs_epi16(simde__mmask8 k, simde__m128i a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm_maskz_abs_epi16(k, a);
|
||||
#else
|
||||
return simde_mm_maskz_mov_epi16(k, simde_mm_abs_epi16(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_maskz_abs_epi16
|
||||
#define _mm_maskz_abs_epi16(k, a) simde_mm_maskz_abs_epi16(k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_mask_abs_epi32(simde__m128i src, simde__mmask8 k, simde__m128i a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_mask_abs_epi32(src, k, a);
|
||||
#else
|
||||
return simde_mm_mask_mov_epi32(src, k, simde_mm_abs_epi32(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_abs_epi32
|
||||
#define _mm_mask_abs_epi32(src, k, a) simde_mm_mask_abs_epi32(src, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_maskz_abs_epi32(simde__mmask8 k, simde__m128i a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_maskz_abs_epi32(k, a);
|
||||
#else
|
||||
return simde_mm_maskz_mov_epi32(k, simde_mm_abs_epi32(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_maskz_abs_epi32
|
||||
#define _mm_maskz_abs_epi32(k, a) simde_mm_maskz_abs_epi32(k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_abs_epi64(simde__m128i a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_abs_epi64(a);
|
||||
#elif defined(SIMDE_X86_SSE2_NATIVE)
|
||||
const __m128i m = _mm_srai_epi32(_mm_shuffle_epi32(a, 0xF5), 31);
|
||||
return _mm_sub_epi64(_mm_xor_si128(a, m), m);
|
||||
#else
|
||||
simde__m128i_private
|
||||
r_,
|
||||
a_ = simde__m128i_to_private(a);
|
||||
|
||||
#if defined(SIMDE_ARM_NEON_A64V8_NATIVE)
|
||||
r_.neon_i64 = vabsq_s64(a_.neon_i64);
|
||||
#elif defined(SIMDE_ARM_NEON_A32V7_NATIVE)
|
||||
const int64x2_t m = vshrq_n_s64(a_.neon_i64, 63);
|
||||
r_.neon_i64 = vsubq_s64(veorq_s64(a_.neon_i64, m), m);
|
||||
#elif (defined(SIMDE_POWER_ALTIVEC_P8_NATIVE) && !defined(HEDLEY_IBM_VERSION)) || defined(SIMDE_ZARCH_ZVECTOR_13_NATIVE)
|
||||
r_.altivec_i64 = vec_abs(a_.altivec_i64);
|
||||
#elif defined(SIMDE_WASM_SIMD128_NATIVE)
|
||||
r_.wasm_v128 = wasm_i64x2_abs(a_.wasm_v128);
|
||||
#elif defined(SIMDE_VECTOR_SUBSCRIPT_OPS)
|
||||
__typeof__(r_.i64) z = { 0, };
|
||||
__typeof__(r_.i64) m = HEDLEY_REINTERPRET_CAST(__typeof__(r_.i64), a_.i64 < z);
|
||||
r_.i64 = (-a_.i64 & m) | (a_.i64 & ~m);
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0; i < (sizeof(r_.i64) / sizeof(r_.i64[0])); i++) {
|
||||
r_.i64[i] = (a_.i64[i] < INT64_C(0)) ? -a_.i64[i] : a_.i64[i];
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m128i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_abs_epi64
|
||||
#define _mm_abs_epi64(a) simde_mm_abs_epi64(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_mask_abs_epi64(simde__m128i src, simde__mmask8 k, simde__m128i a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_mask_abs_epi64(src, k, a);
|
||||
#else
|
||||
return simde_mm_mask_mov_epi64(src, k, simde_mm_abs_epi64(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_abs_epi64
|
||||
#define _mm_mask_abs_epi64(src, k, a) simde_mm_mask_abs_epi64(src, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_maskz_abs_epi64(simde__mmask8 k, simde__m128i a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_maskz_abs_epi64(k, a);
|
||||
#else
|
||||
return simde_mm_maskz_mov_epi64(k, simde_mm_abs_epi64(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_maskz_abs_epi64
|
||||
#define _mm_maskz_abs_epi64(k, a) simde_mm_maskz_abs_epi64(k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_abs_epi64(simde__m256i a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_abs_epi64(a);
|
||||
#else
|
||||
simde__m256i_private
|
||||
r_,
|
||||
a_ = simde__m256i_to_private(a);
|
||||
|
||||
#if SIMDE_NATURAL_VECTOR_SIZE_LE(128)
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m128i) / sizeof(r_.m128i[0])) ; i++) {
|
||||
r_.m128i[i] = simde_mm_abs_epi64(a_.m128i[i]);
|
||||
}
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0; i < (sizeof(r_.i64) / sizeof(r_.i64[0])); i++) {
|
||||
r_.i64[i] = (a_.i64[i] < INT64_C(0)) ? -a_.i64[i] : a_.i64[i];
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m256i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_abs_epi64
|
||||
#define _mm256_abs_epi64(a) simde_mm256_abs_epi64(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_mask_abs_epi64(simde__m256i src, simde__mmask8 k, simde__m256i a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_mask_abs_epi64(src, k, a);
|
||||
#else
|
||||
return simde_mm256_mask_mov_epi64(src, k, simde_mm256_abs_epi64(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_mask_abs_epi64
|
||||
#define _mm256_mask_abs_epi64(src, k, a) simde_mm256_mask_abs_epi64(src, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_maskz_abs_epi64(simde__mmask8 k, simde__m256i a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_maskz_abs_epi64(k, a);
|
||||
#else
|
||||
return simde_mm256_maskz_mov_epi64(k, simde_mm256_abs_epi64(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_maskz_abs_epi64
|
||||
#define _mm256_maskz_abs_epi64(k, a) simde_mm256_maskz_abs_epi64(k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_abs_epi8 (simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_abs_epi8(a);
|
||||
#else
|
||||
simde__m512i_private
|
||||
r_,
|
||||
a_ = simde__m512i_to_private(a);
|
||||
|
||||
#if SIMDE_NATURAL_VECTOR_SIZE_LE(256)
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m256i) / sizeof(r_.m256i[0])) ; i++) {
|
||||
r_.m256i[i] = simde_mm256_abs_epi8(a_.m256i[i]);
|
||||
}
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i8) / sizeof(r_.i8[0])) ; i++) {
|
||||
r_.i8[i] = (a_.i8[i] < INT32_C(0)) ? -a_.i8[i] : a_.i8[i];
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_abs_epi8
|
||||
#define _mm512_abs_epi8(a) simde_mm512_abs_epi8(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_abs_epi8 (simde__m512i src, simde__mmask64 k, simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_mask_abs_epi8(src, k, a);
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi8(src, k, simde_mm512_abs_epi8(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_abs_epi8
|
||||
#define _mm512_mask_abs_epi8(src, k, a) simde_mm512_mask_abs_epi8(src, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_abs_epi8 (simde__mmask64 k, simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_maskz_abs_epi8(k, a);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_epi8(k, simde_mm512_abs_epi8(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_abs_epi8
|
||||
#define _mm512_maskz_abs_epi8(k, a) simde_mm512_maskz_abs_epi8(k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_abs_epi16 (simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_abs_epi16(a);
|
||||
#else
|
||||
simde__m512i_private
|
||||
r_,
|
||||
a_ = simde__m512i_to_private(a);
|
||||
|
||||
#if SIMDE_NATURAL_VECTOR_SIZE_LE(256)
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m256i) / sizeof(r_.m256i[0])) ; i++) {
|
||||
r_.m256i[i] = simde_mm256_abs_epi16(a_.m256i[i]);
|
||||
}
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i16) / sizeof(r_.i16[0])) ; i++) {
|
||||
r_.i16[i] = (a_.i16[i] < INT32_C(0)) ? -a_.i16[i] : a_.i16[i];
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_abs_epi16
|
||||
#define _mm512_abs_epi16(a) simde_mm512_abs_epi16(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_abs_epi16 (simde__m512i src, simde__mmask32 k, simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_mask_abs_epi16(src, k, a);
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi16(src, k, simde_mm512_abs_epi16(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_abs_epi16
|
||||
#define _mm512_mask_abs_epi16(src, k, a) simde_mm512_mask_abs_epi16(src, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_abs_epi16 (simde__mmask32 k, simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_maskz_abs_epi16(k, a);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_epi16(k, simde_mm512_abs_epi16(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_abs_epi16
|
||||
#define _mm512_maskz_abs_epi16(k, a) simde_mm512_maskz_abs_epi16(k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_abs_epi32(simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_abs_epi32(a);
|
||||
#else
|
||||
simde__m512i_private
|
||||
r_,
|
||||
a_ = simde__m512i_to_private(a);
|
||||
|
||||
#if SIMDE_NATURAL_VECTOR_SIZE_LE(256)
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m256i) / sizeof(r_.m256i[0])) ; i++) {
|
||||
r_.m256i[i] = simde_mm256_abs_epi32(a_.m256i[i]);
|
||||
}
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0; i < (sizeof(r_.i32) / sizeof(r_.i32[0])); i++) {
|
||||
r_.i32[i] = (a_.i32[i] < INT64_C(0)) ? -a_.i32[i] : a_.i32[i];
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_abs_epi32
|
||||
#define _mm512_abs_epi32(a) simde_mm512_abs_epi32(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_abs_epi32(simde__m512i src, simde__mmask16 k, simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_abs_epi32(src, k, a);
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi32(src, k, simde_mm512_abs_epi32(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_abs_epi32
|
||||
#define _mm512_mask_abs_epi32(src, k, a) simde_mm512_mask_abs_epi32(src, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_abs_epi32(simde__mmask16 k, simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_maskz_abs_epi32(k, a);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_epi32(k, simde_mm512_abs_epi32(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_abs_epi32
|
||||
#define _mm512_maskz_abs_epi32(k, a) simde_mm512_maskz_abs_epi32(k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_abs_epi64(simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_abs_epi64(a);
|
||||
#else
|
||||
simde__m512i_private
|
||||
r_,
|
||||
a_ = simde__m512i_to_private(a);
|
||||
|
||||
#if SIMDE_NATURAL_VECTOR_SIZE_LE(256)
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m256i) / sizeof(r_.m256i[0])) ; i++) {
|
||||
r_.m256i[i] = simde_mm256_abs_epi64(a_.m256i[i]);
|
||||
}
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0; i < (sizeof(r_.i64) / sizeof(r_.i64[0])); i++) {
|
||||
r_.i64[i] = (a_.i64[i] < INT64_C(0)) ? -a_.i64[i] : a_.i64[i];
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_abs_epi64
|
||||
#define _mm512_abs_epi64(a) simde_mm512_abs_epi64(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_abs_epi64(simde__m512i src, simde__mmask8 k, simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_abs_epi64(src, k, a);
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi64(src, k, simde_mm512_abs_epi64(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_abs_epi64
|
||||
#define _mm512_mask_abs_epi64(src, k, a) simde_mm512_mask_abs_epi64(src, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_abs_epi64(simde__mmask8 k, simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_maskz_abs_epi64(k, a);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_epi64(k, simde_mm512_abs_epi64(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_abs_epi64
|
||||
#define _mm512_maskz_abs_epi64(k, a) simde_mm512_maskz_abs_epi64(k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_abs_ps(simde__m512 v2) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && (!defined(HEDLEY_GCC_VERSION) || HEDLEY_GCC_VERSION_CHECK(7,0,0))
|
||||
return _mm512_abs_ps(v2);
|
||||
#else
|
||||
simde__m512_private
|
||||
r_,
|
||||
v2_ = simde__m512_to_private(v2);
|
||||
|
||||
#if defined(SIMDE_ARM_NEON_A32V7_NATIVE)
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m128_private) / sizeof(r_.m128_private[0])) ; i++) {
|
||||
r_.m128_private[i].neon_f32 = vabsq_f32(v2_.m128_private[i].neon_f32);
|
||||
}
|
||||
#elif defined(SIMDE_POWER_ALTIVEC_P7_NATIVE)
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m128_private) / sizeof(r_.m128_private[0])) ; i++) {
|
||||
r_.m128_private[i].altivec_f32 = vec_abs(v2_.m128_private[i].altivec_f32);
|
||||
}
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0; i < (sizeof(r_.f32) / sizeof(r_.f32[0])); i++) {
|
||||
r_.f32[i] = (v2_.f32[i] < INT64_C(0)) ? -v2_.f32[i] : v2_.f32[i];
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_abs_ps
|
||||
#define _mm512_abs_ps(v2) simde_mm512_abs_ps(v2)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_mask_abs_ps(simde__m512 src, simde__mmask16 k, simde__m512 v2) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && (!defined(HEDLEY_GCC_VERSION) || HEDLEY_GCC_VERSION_CHECK(7,0,0))
|
||||
return _mm512_mask_abs_ps(src, k, v2);
|
||||
#else
|
||||
return simde_mm512_mask_mov_ps(src, k, simde_mm512_abs_ps(v2));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_abs_ps
|
||||
#define _mm512_mask_abs_ps(src, k, v2) simde_mm512_mask_abs_ps(src, k, v2)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_abs_pd(simde__m512d v2) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && !defined(SIMDE_BUG_GCC_87467)
|
||||
return _mm512_abs_pd(v2);
|
||||
#elif defined(SIMDE_X86_AVX512F_NATIVE) && (!defined(HEDLEY_GCC_VERSION) || HEDLEY_GCC_VERSION_CHECK(7,0,0))
|
||||
/* gcc bug: https://gcc.gnu.org/legacy-ml/gcc-patches/2018-01/msg01962.html */
|
||||
return _mm512_abs_pd(_mm512_castpd_ps(v2));
|
||||
#else
|
||||
simde__m512d_private
|
||||
r_,
|
||||
v2_ = simde__m512d_to_private(v2);
|
||||
|
||||
#if defined(SIMDE_ARM_NEON_A64V8_NATIVE)
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m128d_private) / sizeof(r_.m128d_private[0])) ; i++) {
|
||||
r_.m128d_private[i].neon_f64 = vabsq_f64(v2_.m128d_private[i].neon_f64);
|
||||
}
|
||||
#elif defined(SIMDE_POWER_ALTIVEC_P7_NATIVE)
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m128d_private) / sizeof(r_.m128d_private[0])) ; i++) {
|
||||
r_.m128d_private[i].altivec_f64 = vec_abs(v2_.m128d_private[i].altivec_f64);
|
||||
}
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0; i < (sizeof(r_.f64) / sizeof(r_.f64[0])); i++) {
|
||||
r_.f64[i] = (v2_.f64[i] < INT64_C(0)) ? -v2_.f64[i] : v2_.f64[i];
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512d_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_abs_pd
|
||||
#define _mm512_abs_pd(v2) simde_mm512_abs_pd(v2)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_mask_abs_pd(simde__m512d src, simde__mmask8 k, simde__m512d v2) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && !defined(SIMDE_BUG_GCC_87467)
|
||||
return _mm512_mask_abs_pd(src, k, v2);
|
||||
#elif defined(SIMDE_X86_AVX512F_NATIVE) && (!defined(HEDLEY_GCC_VERSION) || HEDLEY_GCC_VERSION_CHECK(7,0,0))
|
||||
/* gcc bug: https://gcc.gnu.org/legacy-ml/gcc-patches/2018-01/msg01962.html */
|
||||
return _mm512_mask_abs_pd(src, k, _mm512_castpd_ps(v2));
|
||||
#else
|
||||
return simde_mm512_mask_mov_pd(src, k, simde_mm512_abs_pd(v2));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_abs_pd
|
||||
#define _mm512_mask_abs_pd(src, k, v2) simde_mm512_mask_abs_pd(src, k, v2)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_ABS_H) */
|
||||
@@ -0,0 +1,625 @@
|
||||
/* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Copyright:
|
||||
* 2020 Evan Nemerson <evan@nemerson.com>
|
||||
* 2020 Hidayat Khan <huk2209@gmail.com>
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512_ADD_H)
|
||||
#define SIMDE_X86_AVX512_ADD_H
|
||||
|
||||
#include "types.h"
|
||||
#include "../avx2.h"
|
||||
#include "mov.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_mask_add_epi8(simde__m128i src, simde__mmask16 k, simde__m128i a, simde__m128i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm_mask_add_epi8(src, k, a, b);
|
||||
#else
|
||||
return simde_mm_mask_mov_epi8(src, k, simde_mm_add_epi8(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_add_epi8
|
||||
#define _mm_mask_add_epi8(src, k, a, b) simde_mm_mask_add_epi8(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_maskz_add_epi8(simde__mmask16 k, simde__m128i a, simde__m128i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm_maskz_add_epi8(k, a, b);
|
||||
#else
|
||||
return simde_mm_maskz_mov_epi8(k, simde_mm_add_epi8(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_maskz_add_epi8
|
||||
#define _mm_maskz_add_epi8(k, a, b) simde_mm_maskz_add_epi8(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_mask_add_epi16(simde__m128i src, simde__mmask8 k, simde__m128i a, simde__m128i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm_mask_add_epi16(src, k, a, b);
|
||||
#else
|
||||
return simde_mm_mask_mov_epi16(src, k, simde_mm_add_epi16(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_add_epi16
|
||||
#define _mm_mask_add_epi16(src, k, a, b) simde_mm_mask_add_epi16(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_maskz_add_epi16(simde__mmask8 k, simde__m128i a, simde__m128i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm_maskz_add_epi16(k, a, b);
|
||||
#else
|
||||
return simde_mm_maskz_mov_epi16(k, simde_mm_add_epi16(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_maskz_add_epi16
|
||||
#define _mm_maskz_add_epi16(k, a, b) simde_mm_maskz_add_epi16(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_mask_add_epi32(simde__m128i src, simde__mmask8 k, simde__m128i a, simde__m128i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_mask_add_epi32(src, k, a, b);
|
||||
#else
|
||||
return simde_mm_mask_mov_epi32(src, k, simde_mm_add_epi32(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_add_epi32
|
||||
#define _mm_mask_add_epi32(src, k, a, b) simde_mm_mask_add_epi32(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_maskz_add_epi32(simde__mmask8 k, simde__m128i a, simde__m128i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_maskz_add_epi32(k, a, b);
|
||||
#else
|
||||
return simde_mm_maskz_mov_epi32(k, simde_mm_add_epi32(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_maskz_add_epi32
|
||||
#define _mm_maskz_add_epi32(k, a, b) simde_mm_maskz_add_epi32(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_mask_add_epi64(simde__m128i src, simde__mmask8 k, simde__m128i a, simde__m128i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_mask_add_epi64(src, k, a, b);
|
||||
#else
|
||||
return simde_mm_mask_mov_epi64(src, k, simde_mm_add_epi64(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_add_epi64
|
||||
#define _mm_mask_add_epi64(src, k, a, b) simde_mm_mask_add_epi64(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_maskz_add_epi64(simde__mmask8 k, simde__m128i a, simde__m128i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_maskz_add_epi64(k, a, b);
|
||||
#else
|
||||
return simde_mm_maskz_mov_epi64(k, simde_mm_add_epi64(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_maskz_add_epi64
|
||||
#define _mm_maskz_add_epi64(k, a, b) simde_mm_maskz_add_epi64(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128
|
||||
simde_mm_mask_add_ss(simde__m128 src, simde__mmask8 k, simde__m128 a, simde__m128 b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && (!defined(HEDLEY_GCC_VERSION) || HEDLEY_GCC_VERSION_CHECK(8,1,0))
|
||||
return _mm_mask_add_ss(src, k, a, b);
|
||||
#elif 1
|
||||
simde__m128_private
|
||||
src_ = simde__m128_to_private(src),
|
||||
a_ = simde__m128_to_private(a),
|
||||
b_ = simde__m128_to_private(b),
|
||||
r_ = simde__m128_to_private(a);
|
||||
|
||||
r_.f32[0] = (k & 1) ? (a_.f32[0] + b_.f32[0]) : src_.f32[0];
|
||||
|
||||
return simde__m128_from_private(r_);
|
||||
#else
|
||||
return simde_mm_move_ss(a, simde_mm_mask_mov_ps(src, k, simde_mm_add_ps(a, b)));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_add_ss
|
||||
#define _mm_mask_add_ss(src, k, a, b) simde_mm_mask_add_ss(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128
|
||||
simde_mm_maskz_add_ss(simde__mmask8 k, simde__m128 a, simde__m128 b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && (!defined(HEDLEY_GCC_VERSION) || HEDLEY_GCC_VERSION_CHECK(8,1,0))
|
||||
return _mm_maskz_add_ss(k, a, b);
|
||||
#elif 1
|
||||
simde__m128_private
|
||||
a_ = simde__m128_to_private(a),
|
||||
b_ = simde__m128_to_private(b),
|
||||
r_ = simde__m128_to_private(a);
|
||||
|
||||
r_.f32[0] = (k & 1) ? (a_.f32[0] + b_.f32[0]) : 0.0f;
|
||||
|
||||
return simde__m128_from_private(r_);
|
||||
#else
|
||||
return simde_mm_move_ss(a, simde_mm_maskz_mov_ps(k, simde_mm_add_ps(a, b)));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_maskz_add_ss
|
||||
#define _mm_maskz_add_ss(k, a, b) simde_mm_maskz_add_ss(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_mask_add_epi16(simde__m256i src, simde__mmask16 k, simde__m256i a, simde__m256i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm256_mask_add_epi16(src, k, a, b);
|
||||
#else
|
||||
return simde_mm256_mask_mov_epi16(src, k, simde_mm256_add_epi16(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_mask_add_epi16
|
||||
#define _mm256_mask_add_epi16(src, k, a, b) simde_mm256_mask_add_epi16(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_maskz_add_epi16(simde__mmask16 k, simde__m256i a, simde__m256i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm256_maskz_add_epi16(k, a, b);
|
||||
#else
|
||||
return simde_mm256_maskz_mov_epi16(k, simde_mm256_add_epi16(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_maskz_add_epi16
|
||||
#define _mm256_maskz_add_epi16(k, a, b) simde_mm256_maskz_add_epi16(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_mask_add_epi32(simde__m256i src, simde__mmask8 k, simde__m256i a, simde__m256i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_mask_add_epi32(src, k, a, b);
|
||||
#else
|
||||
return simde_mm256_mask_mov_epi32(src, k, simde_mm256_add_epi32(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_mask_add_epi32
|
||||
#define _mm256_mask_add_epi32(src, k, a, b) simde_mm256_mask_add_epi32(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_maskz_add_epi32(simde__mmask8 k, simde__m256i a, simde__m256i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_maskz_add_epi32(k, a, b);
|
||||
#else
|
||||
return simde_mm256_maskz_mov_epi32(k, simde_mm256_add_epi32(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_maskz_add_epi32
|
||||
#define _mm256_maskz_add_epi32(k, a, b) simde_mm256_maskz_add_epi32(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_mask_add_epi64(simde__m256i src, simde__mmask8 k, simde__m256i a, simde__m256i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_mask_add_epi64(src, k, a, b);
|
||||
#else
|
||||
return simde_mm256_mask_mov_epi64(src, k, simde_mm256_add_epi64(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_mask_add_epi64
|
||||
#define _mm256_mask_add_epi64(src, k, a, b) simde_mm256_mask_add_epi64(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_maskz_add_epi64(simde__mmask8 k, simde__m256i a, simde__m256i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_maskz_add_epi64(k, a, b);
|
||||
#else
|
||||
return simde_mm256_maskz_mov_epi64(k, simde_mm256_add_epi64(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_maskz_add_epi64
|
||||
#define _mm256_maskz_add_epi64(k, a, b) simde_mm256_maskz_add_epi64(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_add_epi8 (simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_add_epi8(a, b);
|
||||
#else
|
||||
simde__m512i_private
|
||||
r_,
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b);
|
||||
|
||||
#if defined(SIMDE_VECTOR_SUBSCRIPT_OPS)
|
||||
r_.i8 = a_.i8 + b_.i8;
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m256i) / sizeof(r_.m256i[0])) ; i++) {
|
||||
r_.m256i[i] = simde_mm256_add_epi8(a_.m256i[i], b_.m256i[i]);
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_add_epi8
|
||||
#define _mm512_add_epi8(a, b) simde_mm512_add_epi8(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_add_epi8 (simde__m512i src, simde__mmask64 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_mask_add_epi8(src, k, a, b);
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi8(src, k, simde_mm512_add_epi8(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_add_epi8
|
||||
#define _mm512_mask_add_epi8(src, k, a, b) simde_mm512_mask_add_epi8(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_add_epi8 (simde__mmask64 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_maskz_add_epi8(k, a, b);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_epi8(k, simde_mm512_add_epi8(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_add_epi8
|
||||
#define _mm512_maskz_add_epi8(k, a, b) simde_mm512_maskz_add_epi8(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_add_epi16 (simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_add_epi16(a, b);
|
||||
#else
|
||||
simde__m512i_private
|
||||
r_,
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b);
|
||||
|
||||
#if defined(SIMDE_VECTOR_SUBSCRIPT_OPS)
|
||||
r_.i16 = a_.i16 + b_.i16;
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m256i) / sizeof(r_.m256i[0])) ; i++) {
|
||||
r_.m256i[i] = simde_mm256_add_epi16(a_.m256i[i], b_.m256i[i]);
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_add_epi16
|
||||
#define _mm512_add_epi16(a, b) simde_mm512_add_epi16(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_add_epi16 (simde__m512i src, simde__mmask32 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_mask_add_epi16(src, k, a, b);
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi16(src, k, simde_mm512_add_epi16(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_add_epi16
|
||||
#define _mm512_mask_add_epi16(src, k, a, b) simde_mm512_mask_add_epi16(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_add_epi16 (simde__mmask32 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_maskz_add_epi16(k, a, b);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_epi16(k, simde_mm512_add_epi16(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_add_epi16
|
||||
#define _mm512_maskz_add_epi16(k, a, b) simde_mm512_maskz_add_epi16(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_add_epi32 (simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_add_epi32(a, b);
|
||||
#else
|
||||
simde__m512i_private
|
||||
r_,
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b);
|
||||
|
||||
#if defined(SIMDE_VECTOR_SUBSCRIPT_OPS)
|
||||
r_.i32 = a_.i32 + b_.i32;
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m256i) / sizeof(r_.m256i[0])) ; i++) {
|
||||
r_.m256i[i] = simde_mm256_add_epi32(a_.m256i[i], b_.m256i[i]);
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_add_epi32
|
||||
#define _mm512_add_epi32(a, b) simde_mm512_add_epi32(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_add_epi32(simde__m512i src, simde__mmask16 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_add_epi32(src, k, a, b);
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi32(src, k, simde_mm512_add_epi32(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_add_epi32
|
||||
#define _mm512_mask_add_epi32(src, k, a, b) simde_mm512_mask_add_epi32(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_add_epi32(simde__mmask16 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_maskz_add_epi32(k, a, b);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_epi32(k, simde_mm512_add_epi32(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_add_epi32
|
||||
#define _mm512_maskz_add_epi32(k, a, b) simde_mm512_maskz_add_epi32(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_add_epi64 (simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_add_epi64(a, b);
|
||||
#else
|
||||
simde__m512i_private
|
||||
r_,
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b);
|
||||
|
||||
#if SIMDE_NATURAL_VECTOR_SIZE_LE(256)
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m256i) / sizeof(r_.m256i[0])) ; i++) {
|
||||
r_.m256i[i] = simde_mm256_add_epi64(a_.m256i[i], b_.m256i[i]);
|
||||
}
|
||||
#elif defined(SIMDE_VECTOR_SUBSCRIPT_OPS) && !defined(SIMDE_BUG_CLANG_BAD_VI64_OPS)
|
||||
r_.i64 = a_.i64 + b_.i64;
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m256i) / sizeof(r_.m256i[0])) ; i++) {
|
||||
r_.m256i[i] = simde_mm256_add_epi64(a_.m256i[i], b_.m256i[i]);
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_add_epi64
|
||||
#define _mm512_add_epi64(a, b) simde_mm512_add_epi64(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_add_epi64(simde__m512i src, simde__mmask8 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_add_epi64(src, k, a, b);
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi64(src, k, simde_mm512_add_epi64(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_add_epi64
|
||||
#define _mm512_mask_add_epi64(src, k, a, b) simde_mm512_mask_add_epi64(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_add_epi64(simde__mmask8 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_maskz_add_epi64(k, a, b);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_epi64(k, simde_mm512_add_epi64(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_add_epi64
|
||||
#define _mm512_maskz_add_epi64(k, a, b) simde_mm512_maskz_add_epi64(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_add_ps (simde__m512 a, simde__m512 b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_add_ps(a, b);
|
||||
#else
|
||||
simde__m512_private
|
||||
r_,
|
||||
a_ = simde__m512_to_private(a),
|
||||
b_ = simde__m512_to_private(b);
|
||||
|
||||
#if defined(SIMDE_VECTOR_SUBSCRIPT_OPS)
|
||||
r_.f32 = a_.f32 + b_.f32;
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m256) / sizeof(r_.m256[0])) ; i++) {
|
||||
r_.m256[i] = simde_mm256_add_ps(a_.m256[i], b_.m256[i]);
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_add_ps
|
||||
#define _mm512_add_ps(a, b) simde_mm512_add_ps(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_mask_add_ps(simde__m512 src, simde__mmask16 k, simde__m512 a, simde__m512 b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_add_ps(src, k, a, b);
|
||||
#else
|
||||
return simde_mm512_mask_mov_ps(src, k, simde_mm512_add_ps(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_add_ps
|
||||
#define _mm512_mask_add_ps(src, k, a, b) simde_mm512_mask_add_ps(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_maskz_add_ps(simde__mmask16 k, simde__m512 a, simde__m512 b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_maskz_add_ps(k, a, b);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_ps(k, simde_mm512_add_ps(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_add_ps
|
||||
#define _mm512_maskz_add_ps(k, a, b) simde_mm512_maskz_add_ps(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_add_pd (simde__m512d a, simde__m512d b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_add_pd(a, b);
|
||||
#else
|
||||
simde__m512d_private
|
||||
r_,
|
||||
a_ = simde__m512d_to_private(a),
|
||||
b_ = simde__m512d_to_private(b);
|
||||
|
||||
#if defined(SIMDE_VECTOR_SUBSCRIPT_OPS)
|
||||
r_.f64 = a_.f64 + b_.f64;
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m256d) / sizeof(r_.m256d[0])) ; i++) {
|
||||
r_.m256d[i] = simde_mm256_add_pd(a_.m256d[i], b_.m256d[i]);
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512d_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_add_pd
|
||||
#define _mm512_add_pd(a, b) simde_mm512_add_pd(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_mask_add_pd(simde__m512d src, simde__mmask8 k, simde__m512d a, simde__m512d b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_add_pd(src, k, a, b);
|
||||
#else
|
||||
return simde_mm512_mask_mov_pd(src, k, simde_mm512_add_pd(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_add_pd
|
||||
#define _mm512_mask_add_pd(src, k, a, b) simde_mm512_mask_add_pd(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_maskz_add_pd(simde__mmask8 k, simde__m512d a, simde__m512d b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_maskz_add_pd(k, a, b);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_pd(k, simde_mm512_add_pd(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_add_pd
|
||||
#define _mm512_maskz_add_pd(k, a, b) simde_mm512_maskz_add_pd(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_ADD_H) */
|
||||
@@ -0,0 +1,529 @@
|
||||
/* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Copyright:
|
||||
* 2020 Evan Nemerson <evan@nemerson.com>
|
||||
* 2020 Himanshi Mathur <himanshi18037@iiitd.ac.in>
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512_ADDS_H)
|
||||
#define SIMDE_X86_AVX512_ADDS_H
|
||||
|
||||
#include "types.h"
|
||||
#include "../avx2.h"
|
||||
#include "mov.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_mask_adds_epi8(simde__m128i src, simde__mmask16 k, simde__m128i a, simde__m128i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm_mask_adds_epi8(src, k, a, b);
|
||||
#else
|
||||
return simde_mm_mask_mov_epi8(src, k, simde_mm_adds_epi8(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_adds_epi8
|
||||
#define _mm_mask_adds_epi8(src, k, a, b) simde_mm_mask_adds_epi8(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_maskz_adds_epi8(simde__mmask16 k, simde__m128i a, simde__m128i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm_maskz_adds_epi8(k, a, b);
|
||||
#else
|
||||
return simde_mm_maskz_mov_epi8(k, simde_mm_adds_epi8(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_maskz_adds_epi8
|
||||
#define _mm_maskz_adds_epi8(k, a, b) simde_mm_maskz_adds_epi8(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_mask_adds_epi16(simde__m128i src, simde__mmask8 k, simde__m128i a, simde__m128i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm_mask_adds_epi16(src, k, a, b);
|
||||
#else
|
||||
return simde_mm_mask_mov_epi16(src, k, simde_mm_adds_epi16(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_adds_epi16
|
||||
#define _mm_mask_adds_epi16(src, k, a, b) simde_mm_mask_adds_epi16(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_maskz_adds_epi16(simde__mmask8 k, simde__m128i a, simde__m128i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm_maskz_adds_epi16(k, a, b);
|
||||
#else
|
||||
return simde_mm_maskz_mov_epi16(k, simde_mm_adds_epi16(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_maskz_adds_epi16
|
||||
#define _mm_maskz_adds_epi16(k, a, b) simde_mm_maskz_adds_epi16(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_mask_adds_epi8(simde__m256i src, simde__mmask32 k, simde__m256i a, simde__m256i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm256_mask_adds_epi8(src, k, a, b);
|
||||
#else
|
||||
return simde_mm256_mask_mov_epi8(src, k, simde_mm256_adds_epi8(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_mask_adds_epi8
|
||||
#define _mm256_mask_adds_epi8(src, k, a, b) simde_mm256_mask_adds_epi8(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_maskz_adds_epi8(simde__mmask32 k, simde__m256i a, simde__m256i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm256_maskz_adds_epi8(k, a, b);
|
||||
#else
|
||||
return simde_mm256_maskz_mov_epi8(k, simde_mm256_adds_epi8(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_maskz_adds_epi8
|
||||
#define _mm256_maskz_adds_epi8(k, a, b) simde_mm256_maskz_adds_epi8(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_mask_adds_epi16(simde__m256i src, simde__mmask16 k, simde__m256i a, simde__m256i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm256_mask_adds_epi16(src, k, a, b);
|
||||
#else
|
||||
return simde_mm256_mask_mov_epi16(src, k, simde_mm256_adds_epi16(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_mask_adds_epi16
|
||||
#define _mm256_mask_adds_epi16(src, k, a, b) simde_mm256_mask_adds_epi16(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_maskz_adds_epi16(simde__mmask16 k, simde__m256i a, simde__m256i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm256_maskz_adds_epi16(k, a, b);
|
||||
#else
|
||||
return simde_mm256_maskz_mov_epi16(k, simde_mm256_adds_epi16(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_maskz_adds_epi16
|
||||
#define _mm256_maskz_adds_epi16(k, a, b) simde_mm256_maskz_adds_epi16(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_adds_epi8 (simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_adds_epi8(a, b);
|
||||
#else
|
||||
simde__m512i_private
|
||||
r_,
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b);
|
||||
|
||||
#if !defined(HEDLEY_INTEL_VERSION)
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m256i) / sizeof(r_.m256i[0])) ; i++) {
|
||||
r_.m256i[i] = simde_mm256_adds_epi8(a_.m256i[i], b_.m256i[i]);
|
||||
}
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i8) / sizeof(r_.i8[0])) ; i++) {
|
||||
r_.i8[i] = simde_math_adds_i8(a_.i8[i], b_.i8[i]);
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_adds_epi8
|
||||
#define _mm512_adds_epi8(a, b) simde_mm512_adds_epi8(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_adds_epi8 (simde__m512i src, simde__mmask64 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_mask_adds_epi8(src, k, a, b);
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi8(src, k, simde_mm512_adds_epi8(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_adds_epi8
|
||||
#define _mm512_mask_adds_epi8(src, k, a, b) simde_mm512_mask_adds_epi8(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_adds_epi8 (simde__mmask64 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_maskz_adds_epi8(k, a, b);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_epi8(k, simde_mm512_adds_epi8(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_adds_epi8
|
||||
#define _mm512_maskz_adds_epi8(k, a, b) simde_mm512_maskz_adds_epi8(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_adds_epi16 (simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_adds_epi16(a, b);
|
||||
#else
|
||||
simde__m512i_private
|
||||
r_,
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b);
|
||||
|
||||
#if !defined(HEDLEY_INTEL_VERSION)
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m256i) / sizeof(r_.m256i[0])) ; i++) {
|
||||
r_.m256i[i] = simde_mm256_adds_epi16(a_.m256i[i], b_.m256i[i]);
|
||||
}
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i16) / sizeof(r_.i16[0])) ; i++) {
|
||||
r_.i16[i] = simde_math_adds_i16(a_.i16[i], b_.i16[i]);
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_adds_epi16
|
||||
#define _mm512_adds_epi16(a, b) simde_mm512_adds_epi16(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_adds_epi16 (simde__m512i src, simde__mmask32 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_mask_adds_epi16(src, k, a, b);
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi16(src, k, simde_mm512_adds_epi16(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_adds_epi16
|
||||
#define _mm512_mask_adds_epi16(src, k, a, b) simde_mm512_mask_adds_epi16(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_adds_epi16 (simde__mmask32 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_maskz_adds_epi16(k, a, b);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_epi16(k, simde_mm512_adds_epi16(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_adds_epi16
|
||||
#define _mm512_maskz_adds_epi16(k, a, b) simde_mm512_maskz_adds_epi16(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_adds_epu8 (simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_adds_epu8(a, b);
|
||||
#else
|
||||
simde__m512i_private
|
||||
r_,
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b);
|
||||
|
||||
#if !defined(HEDLEY_INTEL_VERSION)
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m128i) / sizeof(r_.m128i[0])) ; i++) {
|
||||
r_.m128i[i] = simde_mm_adds_epu8(a_.m128i[i], b_.m128i[i]);
|
||||
}
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.u8) / sizeof(r_.u8[0])) ; i++) {
|
||||
r_.u8[i] = simde_math_adds_u8(a_.u8[i], b_.u8[i]);
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_adds_epu8
|
||||
#define _mm512_adds_epu8(a, b) simde_mm512_adds_epu8(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_adds_epu8 (simde__m512i src, simde__mmask64 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_mask_adds_epu8(src, k, a, b);
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi8(src, k, simde_mm512_adds_epu8(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_adds_epu8
|
||||
#define _mm512_mask_adds_epu8(src, k, a, b) simde_mm512_mask_adds_epu8(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_adds_epu8 (simde__mmask64 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_maskz_adds_epu8(k, a, b);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_epi8(k, simde_mm512_adds_epu8(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_adds_epu8
|
||||
#define _mm512_maskz_adds_epu8(k, a, b) simde_mm512_maskz_adds_epu8(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_adds_epu16 (simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_adds_epu16(a, b);
|
||||
#else
|
||||
simde__m512i_private
|
||||
r_,
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b);
|
||||
|
||||
#if !defined(HEDLEY_INTEL_VERSION)
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m256i) / sizeof(r_.m256i[0])) ; i++) {
|
||||
r_.m256i[i] = simde_mm256_adds_epu16(a_.m256i[i], b_.m256i[i]);
|
||||
}
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.u16) / sizeof(r_.u16[0])) ; i++) {
|
||||
r_.u16[i] = simde_math_adds_u16(a_.u16[i], b_.u16[i]);
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_adds_epu16
|
||||
#define _mm512_adds_epu16(a, b) simde_mm512_adds_epu16(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_adds_epu16 (simde__m512i src, simde__mmask32 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_mask_adds_epu16(src, k, a, b);
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi16(src, k, simde_mm512_adds_epu16(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_adds_epu16
|
||||
#define _mm512_mask_adds_epu16(src, k, a, b) simde_mm512_mask_adds_epu16(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_adds_epu16 (simde__mmask32 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_maskz_adds_epu16(k, a, b);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_epi16(k, simde_mm512_adds_epu16(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_adds_epu16
|
||||
#define _mm512_maskz_adds_epu16(k, a, b) simde_mm512_maskz_adds_epu16(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_x_mm_adds_epi32(simde__m128i a, simde__m128i b) {
|
||||
simde__m128i_private
|
||||
r_,
|
||||
a_ = simde__m128i_to_private(a),
|
||||
b_ = simde__m128i_to_private(b);
|
||||
|
||||
#if defined(SIMDE_ARM_NEON_A32V7_NATIVE)
|
||||
r_.neon_i32 = vqaddq_s32(a_.neon_i32, b_.neon_i32);
|
||||
#elif defined(SIMDE_POWER_ALTIVEC_P6)
|
||||
r_.altivec_i32 = vec_adds(a_.altivec_i32, b_.altivec_i32);
|
||||
#else
|
||||
#if defined(SIMDE_X86_SSE2_NATIVE)
|
||||
/* https://stackoverflow.com/a/56544654/501126 */
|
||||
const __m128i int_max = _mm_set1_epi32(INT32_MAX);
|
||||
|
||||
/* normal result (possibly wraps around) */
|
||||
const __m128i sum = _mm_add_epi32(a_.n, b_.n);
|
||||
|
||||
/* If result saturates, it has the same sign as both a and b */
|
||||
const __m128i sign_bit = _mm_srli_epi32(a_.n, 31); /* shift sign to lowest bit */
|
||||
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
const __m128i overflow = _mm_ternarylogic_epi32(a_.n, b_.n, sum, 0x42);
|
||||
#else
|
||||
const __m128i sign_xor = _mm_xor_si128(a_.n, b_.n);
|
||||
const __m128i overflow = _mm_andnot_si128(sign_xor, _mm_xor_si128(a_.n, sum));
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
r_.n = _mm_mask_add_epi32(sum, _mm_movepi32_mask(overflow), int_max, sign_bit);
|
||||
#else
|
||||
const __m128i saturated = _mm_add_epi32(int_max, sign_bit);
|
||||
|
||||
#if defined(SIMDE_X86_SSE4_1_NATIVE)
|
||||
r_.n =
|
||||
_mm_castps_si128(
|
||||
_mm_blendv_ps(
|
||||
_mm_castsi128_ps(sum),
|
||||
_mm_castsi128_ps(saturated),
|
||||
_mm_castsi128_ps(overflow)
|
||||
)
|
||||
);
|
||||
#else
|
||||
const __m128i overflow_mask = _mm_srai_epi32(overflow, 31);
|
||||
r_.n =
|
||||
_mm_or_si128(
|
||||
_mm_and_si128(overflow_mask, saturated),
|
||||
_mm_andnot_si128(overflow_mask, sum)
|
||||
);
|
||||
#endif
|
||||
#endif
|
||||
#elif defined(SIMDE_VECTOR_SCALAR)
|
||||
uint32_t au SIMDE_VECTOR(16) = HEDLEY_REINTERPRET_CAST(__typeof__(au), a_.i32);
|
||||
uint32_t bu SIMDE_VECTOR(16) = HEDLEY_REINTERPRET_CAST(__typeof__(bu), b_.i32);
|
||||
uint32_t ru SIMDE_VECTOR(16) = au + bu;
|
||||
|
||||
au = (au >> 31) + INT32_MAX;
|
||||
|
||||
uint32_t m SIMDE_VECTOR(16) = HEDLEY_REINTERPRET_CAST(__typeof__(m), HEDLEY_REINTERPRET_CAST(__typeof__(r_.i32), (au ^ bu) | ~(bu ^ ru)) < 0);
|
||||
r_.i32 = HEDLEY_REINTERPRET_CAST(__typeof__(r_.i32), (au & ~m) | (ru & m));
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i32) / sizeof(r_.i32[0])) ; i++) {
|
||||
r_.i32[i] = simde_math_adds_i32(a_.i32[i], b_.i32[i]);
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
return simde__m128i_from_private(r_);
|
||||
}
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_x_mm256_adds_epi32(simde__m256i a, simde__m256i b) {
|
||||
simde__m256i_private
|
||||
r_,
|
||||
a_ = simde__m256i_to_private(a),
|
||||
b_ = simde__m256i_to_private(b);
|
||||
|
||||
#if SIMDE_NATURAL_VECTOR_SIZE_LE(128)
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m128i) / sizeof(r_.m128i[0])) ; i++) {
|
||||
r_.m128i[i] = simde_x_mm_adds_epi32(a_.m128i[i], b_.m128i[i]);
|
||||
}
|
||||
#elif defined(SIMDE_VECTOR_SCALAR)
|
||||
uint32_t au SIMDE_VECTOR(32) = HEDLEY_REINTERPRET_CAST(__typeof__(au), a_.i32);
|
||||
uint32_t bu SIMDE_VECTOR(32) = HEDLEY_REINTERPRET_CAST(__typeof__(bu), b_.i32);
|
||||
uint32_t ru SIMDE_VECTOR(32) = au + bu;
|
||||
|
||||
au = (au >> 31) + INT32_MAX;
|
||||
|
||||
uint32_t m SIMDE_VECTOR(32) = HEDLEY_REINTERPRET_CAST(__typeof__(m), HEDLEY_REINTERPRET_CAST(__typeof__(r_.i32), (au ^ bu) | ~(bu ^ ru)) < 0);
|
||||
r_.i32 = HEDLEY_REINTERPRET_CAST(__typeof__(r_.i32), (au & ~m) | (ru & m));
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i32) / sizeof(r_.i32[0])) ; i++) {
|
||||
r_.i32[i] = simde_math_adds_i32(a_.i32[i], b_.i32[i]);
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m256i_from_private(r_);
|
||||
}
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_x_mm512_adds_epi32(simde__m512i a, simde__m512i b) {
|
||||
simde__m512i_private
|
||||
r_,
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b);
|
||||
|
||||
#if SIMDE_NATURAL_VECTOR_SIZE_LE(128)
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m128i) / sizeof(r_.m128i[0])) ; i++) {
|
||||
r_.m128i[i] = simde_x_mm_adds_epi32(a_.m128i[i], b_.m128i[i]);
|
||||
}
|
||||
#elif SIMDE_NATURAL_VECTOR_SIZE_LE(256)
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m256i) / sizeof(r_.m256i[0])) ; i++) {
|
||||
r_.m256i[i] = simde_x_mm256_adds_epi32(a_.m256i[i], b_.m256i[i]);
|
||||
}
|
||||
#elif defined(SIMDE_VECTOR_SCALAR)
|
||||
uint32_t au SIMDE_VECTOR(64) = HEDLEY_REINTERPRET_CAST(__typeof__(au), a_.i32);
|
||||
uint32_t bu SIMDE_VECTOR(64) = HEDLEY_REINTERPRET_CAST(__typeof__(bu), b_.i32);
|
||||
uint32_t ru SIMDE_VECTOR(64) = au + bu;
|
||||
|
||||
au = (au >> 31) + INT32_MAX;
|
||||
|
||||
uint32_t m SIMDE_VECTOR(64) = HEDLEY_REINTERPRET_CAST(__typeof__(m), HEDLEY_REINTERPRET_CAST(__typeof__(r_.i32), (au ^ bu) | ~(bu ^ ru)) < 0);
|
||||
r_.i32 = HEDLEY_REINTERPRET_CAST(__typeof__(r_.i32), (au & ~m) | (ru & m));
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i32) / sizeof(r_.i32[0])) ; i++) {
|
||||
r_.i32[i] = simde_math_adds_i32(a_.i32[i], b_.i32[i]);
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
}
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_ADDS_H) */
|
||||
@@ -0,0 +1,305 @@
|
||||
/* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Copyright:
|
||||
* 2020 Evan Nemerson <evan@nemerson.com>
|
||||
* 2020 Himanshi Mathur <himanshi18037@iiitd.ac.in>
|
||||
* 2020 Hidayat Khan <huk2209@gmail.com>
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512_AND_H)
|
||||
#define SIMDE_X86_AVX512_AND_H
|
||||
|
||||
#include "types.h"
|
||||
#include "../avx2.h"
|
||||
|
||||
#include "mov.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_and_pd (simde__m512d a, simde__m512d b) {
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
return _mm512_and_pd(a, b);
|
||||
#else
|
||||
simde__m512d_private
|
||||
r_,
|
||||
a_ = simde__m512d_to_private(a),
|
||||
b_ = simde__m512d_to_private(b);
|
||||
|
||||
#if defined(SIMDE_X86_AVX_NATIVE)
|
||||
r_.m256d[0] = simde_mm256_and_pd(a_.m256d[0], b_.m256d[0]);
|
||||
r_.m256d[1] = simde_mm256_and_pd(a_.m256d[1], b_.m256d[1]);
|
||||
#elif defined(SIMDE_VECTOR_SUBSCRIPT_OPS)
|
||||
r_.i32f = a_.i32f & b_.i32f;
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i32f) / sizeof(r_.i32f[0])) ; i++) {
|
||||
r_.i32f[i] = a_.i32f[i] & b_.i32f[i];
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512d_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_and_pd
|
||||
#define _mm512_and_pd(a, b) simde_mm512_and_pd(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_and_ps (simde__m512 a, simde__m512 b) {
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
return _mm512_and_ps(a, b);
|
||||
#else
|
||||
simde__m512_private
|
||||
r_,
|
||||
a_ = simde__m512_to_private(a),
|
||||
b_ = simde__m512_to_private(b);
|
||||
|
||||
#if defined(SIMDE_X86_AVX_NATIVE)
|
||||
r_.m256[0] = simde_mm256_and_ps(a_.m256[0], b_.m256[0]);
|
||||
r_.m256[1] = simde_mm256_and_ps(a_.m256[1], b_.m256[1]);
|
||||
#elif defined(SIMDE_VECTOR_SUBSCRIPT_OPS)
|
||||
r_.i32f = a_.i32f & b_.i32f;
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i32f) / sizeof(r_.i32f[0])) ; i++) {
|
||||
r_.i32f[i] = a_.i32f[i] & b_.i32f[i];
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_and_ps
|
||||
#define _mm512_and_ps(a, b) simde_mm512_and_ps(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_mask_and_ps(simde__m512 src, simde__mmask16 k, simde__m512 a, simde__m512 b) {
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
return _mm512_mask_and_ps(src, k, a, b);
|
||||
#else
|
||||
return simde_mm512_mask_mov_ps(src, k, simde_mm512_and_ps(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_and_ps
|
||||
#define _mm512_mask_and_ps(src, k, a, b) simde_mm512_mask_and_ps(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_maskz_and_ps(simde__mmask16 k, simde__m512 a, simde__m512 b) {
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
return _mm512_maskz_and_ps(k, a, b);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_ps(k, simde_mm512_and_ps(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_and_ps
|
||||
#define _mm512_maskz_and_ps(k, a, b) simde_mm512_maskz_and_ps(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_mask_and_pd(simde__m512d src, simde__mmask8 k, simde__m512d a, simde__m512d b) {
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
return _mm512_mask_and_pd(src, k, a, b);
|
||||
#else
|
||||
return simde_mm512_mask_mov_pd(src, k, simde_mm512_and_pd(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_and_pd
|
||||
#define _mm512_mask_and_pd(src, k, a, b) simde_mm512_mask_and_pd(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_maskz_and_pd(simde__mmask8 k, simde__m512d a, simde__m512d b) {
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
return _mm512_maskz_and_pd(k, a, b);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_pd(k, simde_mm512_and_pd(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_and_pd
|
||||
#define _mm512_maskz_and_pd(k, a, b) simde_mm512_maskz_and_pd(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_and_epi32 (simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_and_epi32(a, b);
|
||||
#else
|
||||
simde__m512i_private
|
||||
r_,
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b);
|
||||
|
||||
#if defined(SIMDE_VECTOR_SUBSCRIPT_OPS)
|
||||
r_.i32 = a_.i32 & b_.i32;
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i32) / sizeof(r_.i32[0])) ; i++) {
|
||||
r_.i32[i] = a_.i32[i] & b_.i32[i];
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_and_epi32
|
||||
#define _mm512_and_epi32(a, b) simde_mm512_and_epi32(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_and_epi32(simde__m512i src, simde__mmask16 k, simde__m512i v2, simde__m512i v3) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_and_epi32(src, k, v2, v3);
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi32(src, k, simde_mm512_and_epi32(v2, v3));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_and_epi32
|
||||
#define _mm512_mask_and_epi32(src, k, v2, v3) simde_mm512_mask_and_epi32(src, k, v2, v3)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_and_epi32(simde__mmask16 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_maskz_and_epi32(k, a, b);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_epi32(k, simde_mm512_and_epi32(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_and_epi32
|
||||
#define _mm512_maskz_and_epi32(k, a, b) simde_mm512_maskz_and_epi32(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_and_epi64 (simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_and_epi64(a, b);
|
||||
#else
|
||||
simde__m512i_private
|
||||
r_,
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b);
|
||||
|
||||
#if defined(SIMDE_VECTOR_SUBSCRIPT_OPS)
|
||||
r_.i64 = a_.i64 & b_.i64;
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i64) / sizeof(r_.i64[0])) ; i++) {
|
||||
r_.i64[i] = a_.i64[i] & b_.i64[i];
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_and_epi64
|
||||
#define _mm512_and_epi64(a, b) simde_mm512_and_epi64(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_and_epi64(simde__m512i src, simde__mmask8 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_and_epi64(src, k, a, b);
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi64(src, k, simde_mm512_and_epi64(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_and_epi64
|
||||
#define _mm512_mask_and_epi64(src, k, a, b) simde_mm512_mask_and_epi64(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_and_epi64(simde__mmask8 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_maskz_and_epi64(k, a, b);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_epi64(k, simde_mm512_and_epi64(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_and_epi64
|
||||
#define _mm512_maskz_and_epi64(k, a, b) simde_mm512_maskz_and_epi64(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_and_si512 (simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_and_si512(a, b);
|
||||
#else
|
||||
simde__m512i_private
|
||||
r_,
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b);
|
||||
|
||||
#if defined(SIMDE_X86_AVX2_NATIVE)
|
||||
r_.m256i[0] = simde_mm256_and_si256(a_.m256i[0], b_.m256i[0]);
|
||||
r_.m256i[1] = simde_mm256_and_si256(a_.m256i[1], b_.m256i[1]);
|
||||
#elif defined(SIMDE_VECTOR_SUBSCRIPT_OPS)
|
||||
r_.i32f = a_.i32f & b_.i32f;
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i32) / sizeof(r_.i32[0])) ; i++) {
|
||||
r_.i32[i] = a_.i32[i] & b_.i32[i];
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_and_si512
|
||||
#define _mm512_and_si512(a, b) simde_mm512_and_si512(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_AND_H) */
|
||||
@@ -0,0 +1,193 @@
|
||||
/* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Copyright:
|
||||
* 2020 Evan Nemerson <evan@nemerson.com>
|
||||
* 2020 Himanshi Mathur <himanshi18037@iiitd.ac.in>
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512_ANDNOT_H)
|
||||
#define SIMDE_X86_AVX512_ANDNOT_H
|
||||
|
||||
#include "types.h"
|
||||
#include "../avx2.h"
|
||||
#include "mov.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
#define simde_mm512_andnot_ps(a, b) _mm512_andnot_ps(a, b)
|
||||
#else
|
||||
#define simde_mm512_andnot_ps(a, b) simde_mm512_castsi512_ps(simde_mm512_andnot_si512(simde_mm512_castps_si512(a), simde_mm512_castps_si512(b)))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_andnot_ps
|
||||
#define _mm512_andnot_ps(a, b) simde_mm512_andnot_ps(a, b)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
#define simde_mm512_mask_andnot_ps(src, k, a, b) _mm512_mask_andnot_ps((src), (k), (a), (b))
|
||||
#else
|
||||
#define simde_mm512_mask_andnot_ps(src, k, a, b) simde_mm512_castsi512_ps(simde_mm512_mask_andnot_epi32(simde_mm512_castps_si512(src), k, simde_mm512_castps_si512(a), simde_mm512_castps_si512(b)))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_andnot_ps
|
||||
#define _mm512_mask_andnot_ps(src, k, a, b) simde_mm512_mask_andnot_ps(src, k, a, b)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
#define simde_mm512_maskz_andnot_ps(k, a, b) _mm512_maskz_andnot_ps((k), (a), (b))
|
||||
#else
|
||||
#define simde_mm512_maskz_andnot_ps(k, a, b) simde_mm512_castsi512_ps(simde_mm512_maskz_andnot_epi32(k, simde_mm512_castps_si512(a), simde_mm512_castps_si512(b)))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_andnot_ps
|
||||
#define _mm512_maskz_andnot_ps(k, a, b) simde_mm512_maskz_andnot_ps(k, a, b)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
#define simde_mm512_andnot_pd(a, b) _mm512_andnot_pd(a, b)
|
||||
#else
|
||||
#define simde_mm512_andnot_pd(a, b) simde_mm512_castsi512_pd(simde_mm512_andnot_si512(simde_mm512_castpd_si512(a), simde_mm512_castpd_si512(b)))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_andnot_pd
|
||||
#define _mm512_andnot_pd(a, b) simde_mm512_andnot_pd(a, b)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
#define simde_mm512_mask_andnot_pd(src, k, a, b) _mm512_mask_andnot_pd((src), (k), (a), (b))
|
||||
#else
|
||||
#define simde_mm512_mask_andnot_pd(src, k, a, b) simde_mm512_castsi512_pd(simde_mm512_mask_andnot_epi64(simde_mm512_castpd_si512(src), k, simde_mm512_castpd_si512(a), simde_mm512_castpd_si512(b)))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_andnot_pd
|
||||
#define _mm512_mask_andnot_pd(src, k, a, b) simde_mm512_mask_andnot_pd(src, k, a, b)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
#define simde_mm512_maskz_andnot_pd(k, a, b) _mm512_maskz_andnot_pd((k), (a), (b))
|
||||
#else
|
||||
#define simde_mm512_maskz_andnot_pd(k, a, b) simde_mm512_castsi512_pd(simde_mm512_maskz_andnot_epi64(k, simde_mm512_castpd_si512(a), simde_mm512_castpd_si512(b)))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_andnot_pd
|
||||
#define _mm512_maskz_andnot_pd(k, a, b) simde_mm512_maskz_andnot_pd(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_andnot_si512 (simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_andnot_si512(a, b);
|
||||
#else
|
||||
simde__m512i_private
|
||||
r_,
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b);
|
||||
|
||||
#if defined(SIMDE_X86_AVX2_NATIVE)
|
||||
r_.m256i[0] = simde_mm256_andnot_si256(a_.m256i[0], b_.m256i[0]);
|
||||
r_.m256i[1] = simde_mm256_andnot_si256(a_.m256i[1], b_.m256i[1]);
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i32f) / sizeof(r_.i32f[0])) ; i++) {
|
||||
r_.i32f[i] = ~(a_.i32f[i]) & b_.i32f[i];
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#define simde_mm512_andnot_epi32(a, b) simde_mm512_andnot_si512(a, b)
|
||||
#define simde_mm512_andnot_epi64(a, b) simde_mm512_andnot_si512(a, b)
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_andnot_si512
|
||||
#define _mm512_andnot_si512(a, b) simde_mm512_andnot_si512(a, b)
|
||||
#undef _mm512_andnot_epi32
|
||||
#define _mm512_andnot_epi32(a, b) simde_mm512_andnot_si512(a, b)
|
||||
#undef _mm512_andnot_epi64
|
||||
#define _mm512_andnot_epi64(a, b) simde_mm512_andnot_si512(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_andnot_epi32(simde__m512i src, simde__mmask16 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_andnot_epi32(src, k, a, b);
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi32(src, k, simde_mm512_andnot_epi32(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_andnot_epi32
|
||||
#define _mm512_mask_andnot_epi32(src, k, a, b) simde_mm512_mask_andnot_epi32(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_andnot_epi32(simde__mmask16 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_maskz_andnot_epi32(k, a, b);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_epi32(k, simde_mm512_andnot_epi32(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_andnot_epi32
|
||||
#define _mm512_maskz_andnot_epi32(k, a, b) simde_mm512_maskz_andnot_epi32(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_andnot_epi64(simde__m512i src, simde__mmask8 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_andnot_epi64(src, k, a, b);
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi64(src, k, simde_mm512_andnot_epi64(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_andnot_epi64
|
||||
#define _mm512_mask_andnot_epi64(src, k, a, b) simde_mm512_mask_andnot_epi64(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_andnot_epi64(simde__mmask8 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_maskz_andnot_epi64(k, a, b);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_epi64(k, simde_mm512_andnot_epi64(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_andnot_epi64
|
||||
#define _mm512_maskz_andnot_epi64(k, a, b) simde_mm512_maskz_andnot_epi64(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_ANDNOT_H) */
|
||||
@@ -0,0 +1,258 @@
|
||||
/* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Copyright:
|
||||
* 2020 Evan Nemerson <evan@nemerson.com>
|
||||
* 2020 Hidayat Khan <huk2209@gmail.com>
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512_AVG_H)
|
||||
#define SIMDE_X86_AVX512_AVG_H
|
||||
|
||||
#include "types.h"
|
||||
#include "mov.h"
|
||||
#include "../avx2.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_mask_avg_epu8(simde__m128i src, simde__mmask16 k, simde__m128i a, simde__m128i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm_mask_avg_epu8(src, k, a, b);
|
||||
#else
|
||||
return simde_mm_mask_mov_epi8(src, k, simde_mm_avg_epu8(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_avg_epu8
|
||||
#define _mm_mask_avg_epu8(src, k, a, b) simde_mm_mask_avg_epu8(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_maskz_avg_epu8(simde__mmask16 k, simde__m128i a, simde__m128i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm_maskz_avg_epu8(k, a, b);
|
||||
#else
|
||||
return simde_mm_maskz_mov_epi8(k, simde_mm_avg_epu8(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_maskz_avg_epu8
|
||||
#define _mm_maskz_avg_epu8(k, a, b) simde_mm_maskz_avg_epu8(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_mask_avg_epu16(simde__m128i src, simde__mmask8 k, simde__m128i a, simde__m128i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm_mask_avg_epu16(src, k, a, b);
|
||||
#else
|
||||
return simde_mm_mask_mov_epi16(src, k, simde_mm_avg_epu16(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_avg_epu16
|
||||
#define _mm_mask_avg_epu16(src, k, a, b) simde_mm_mask_avg_epu16(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_maskz_avg_epu16(simde__mmask8 k, simde__m128i a, simde__m128i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm_maskz_avg_epu16(k, a, b);
|
||||
#else
|
||||
return simde_mm_maskz_mov_epi16(k, simde_mm_avg_epu16(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_maskz_avg_epu16
|
||||
#define _mm_maskz_avg_epu16(k, a, b) simde_mm_maskz_avg_epu16(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_mask_avg_epu8(simde__m256i src, simde__mmask32 k, simde__m256i a, simde__m256i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm256_mask_avg_epu8(src, k, a, b);
|
||||
#else
|
||||
return simde_mm256_mask_mov_epi8(src, k, simde_mm256_avg_epu8(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_mask_avg_epu8
|
||||
#define _mm256_mask_avg_epu8(src, k, a, b) simde_mm256_mask_avg_epu8(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_maskz_avg_epu8(simde__mmask32 k, simde__m256i a, simde__m256i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm256_maskz_avg_epu8(k, a, b);
|
||||
#else
|
||||
return simde_mm256_maskz_mov_epi8(k, simde_mm256_avg_epu8(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_maskz_avg_epu8
|
||||
#define _mm256_maskz_avg_epu8(k, a, b) simde_mm256_maskz_avg_epu8(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_mask_avg_epu16(simde__m256i src, simde__mmask16 k, simde__m256i a, simde__m256i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm256_mask_avg_epu16(src, k, a, b);
|
||||
#else
|
||||
return simde_mm256_mask_mov_epi16(src, k, simde_mm256_avg_epu16(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_mask_avg_epu16
|
||||
#define _mm256_mask_avg_epu16(src, k, a, b) simde_mm256_mask_avg_epu16(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_maskz_avg_epu16(simde__mmask16 k, simde__m256i a, simde__m256i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm256_maskz_avg_epu16(k, a, b);
|
||||
#else
|
||||
return simde_mm256_maskz_mov_epi16(k, simde_mm256_avg_epu16(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_maskz_avg_epu16
|
||||
#define _mm256_maskz_avg_epu16(k, a, b) simde_mm256_maskz_avg_epu16(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_avg_epu8 (simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_avg_epu8(a, b);
|
||||
#else
|
||||
simde__m512i_private
|
||||
r_,
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b);
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.u8) / sizeof(r_.u8[0])) ; i++) {
|
||||
r_.u8[i] = (a_.u8[i] + b_.u8[i] + 1) >> 1;
|
||||
}
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_avg_epu8
|
||||
#define _mm512_avg_epu8(a, b) simde_mm512_avg_epu8(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_avg_epu8 (simde__m512i src, simde__mmask64 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_mask_avg_epu8(src, k, a, b);
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi8(src, k, simde_mm512_avg_epu8(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_avg_epu8
|
||||
#define _mm512_mask_avg_epu8(src, k, a, b) simde_mm512_mask_avg_epu8(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_avg_epu8 (simde__mmask64 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_maskz_avg_epu8(k, a, b);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_epi8(k, simde_mm512_avg_epu8(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_avg_epu8
|
||||
#define _mm512_maskz_avg_epu8(k, a, b) simde_mm512_maskz_avg_epu8(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_avg_epu16 (simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_avg_epu16(a, b);
|
||||
#else
|
||||
simde__m512i_private
|
||||
r_,
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b);
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.u16) / sizeof(r_.u16[0])) ; i++) {
|
||||
r_.u16[i] = (a_.u16[i] + b_.u16[i] + 1) >> 1;
|
||||
}
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_avg_epu16
|
||||
#define _mm512_avg_epu16(a, b) simde_mm512_avg_epu16(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_avg_epu16 (simde__m512i src, simde__mmask32 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_mask_avg_epu16(src, k, a, b);
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi16(src, k, simde_mm512_avg_epu16(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_avg_epu16
|
||||
#define _mm512_mask_avg_epu16(src, k, a, b) simde_mm512_mask_avg_epu16(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_avg_epu16 (simde__mmask32 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_maskz_avg_epu16(k, a, b);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_epi16(k, simde_mm512_avg_epu16(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_avg_epu16
|
||||
#define _mm512_maskz_avg_epu16(k, a, b) simde_mm512_maskz_avg_epu16(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_AVG_H) */
|
||||
@@ -0,0 +1,202 @@
|
||||
#if !defined(SIMDE_X86_AVX512_BITSHUFFLE_H)
|
||||
#define SIMDE_X86_AVX512_BITSHUFFLE_H
|
||||
|
||||
#include "types.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask16
|
||||
simde_mm_bitshuffle_epi64_mask (simde__m128i b, simde__m128i c) {
|
||||
#if defined(SIMDE_X86_AVX512BITALG_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_bitshuffle_epi64_mask(b, c);
|
||||
#else
|
||||
simde__m128i_private
|
||||
b_ = simde__m128i_to_private(b),
|
||||
c_ = simde__m128i_to_private(c);
|
||||
simde__mmask16 r = 0;
|
||||
|
||||
#if defined(SIMDE_VECTOR_SUBSCRIPT_SCALAR)
|
||||
__typeof__(b_.u64) rv = { 0, 0 };
|
||||
__typeof__(b_.u64) lshift = { 0, 8 };
|
||||
|
||||
for (int8_t i = 0 ; i < 8 ; i++) {
|
||||
__typeof__(b_.u64) ct = (HEDLEY_REINTERPRET_CAST(__typeof__(ct), c_.u8) >> (i * 8)) & 63;
|
||||
rv |= ((b_.u64 >> ct) & 1) << lshift;
|
||||
lshift += 1;
|
||||
}
|
||||
|
||||
r =
|
||||
HEDLEY_STATIC_CAST(simde__mmask16, rv[0]) |
|
||||
HEDLEY_STATIC_CAST(simde__mmask16, rv[1]);
|
||||
#else
|
||||
for (size_t i = 0 ; i < (sizeof(c_.m64_private) / sizeof(c_.m64_private[0])) ; i++) {
|
||||
SIMDE_VECTORIZE_REDUCTION(|:r)
|
||||
for (size_t j = 0 ; j < (sizeof(c_.m64_private[i].u8) / sizeof(c_.m64_private[i].u8[0])) ; j++) {
|
||||
r |= (((b_.u64[i] >> (c_.m64_private[i].u8[j]) & 63) & 1) << ((i * 8) + j));
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
return r;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BITALG_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_bitshuffle_epi64_mask
|
||||
#define _mm_bitshuffle_epi64_mask(b, c) simde_mm_bitshuffle_epi64_mask(b, c)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask16
|
||||
simde_mm_mask_bitshuffle_epi64_mask (simde__mmask16 k, simde__m128i b, simde__m128i c) {
|
||||
#if defined(SIMDE_X86_AVX512BITALG_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_mask_bitshuffle_epi64_mask(k, b, c);
|
||||
#else
|
||||
return (k & simde_mm_bitshuffle_epi64_mask(b, c));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BITALG_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_bitshuffle_epi64_mask
|
||||
#define _mm_mask_bitshuffle_epi64_mask(k, b, c) simde_mm_mask_bitshuffle_epi64_mask(k, b, c)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask32
|
||||
simde_mm256_bitshuffle_epi64_mask (simde__m256i b, simde__m256i c) {
|
||||
#if defined(SIMDE_X86_AVX512BITALG_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_bitshuffle_epi64_mask(b, c);
|
||||
#else
|
||||
simde__m256i_private
|
||||
b_ = simde__m256i_to_private(b),
|
||||
c_ = simde__m256i_to_private(c);
|
||||
simde__mmask32 r = 0;
|
||||
|
||||
#if SIMDE_NATURAL_VECTOR_SIZE_LE(128)
|
||||
for (size_t i = 0 ; i < sizeof(b_.m128i) / sizeof(b_.m128i[0]) ; i++) {
|
||||
r |= (HEDLEY_STATIC_CAST(simde__mmask32, simde_mm_bitshuffle_epi64_mask(b_.m128i[i], c_.m128i[i])) << (i * 16));
|
||||
}
|
||||
#elif defined(SIMDE_VECTOR_SUBSCRIPT_SCALAR)
|
||||
__typeof__(b_.u64) rv = { 0, 0, 0, 0 };
|
||||
__typeof__(b_.u64) lshift = { 0, 8, 16, 24 };
|
||||
|
||||
for (int8_t i = 0 ; i < 8 ; i++) {
|
||||
__typeof__(b_.u64) ct = (HEDLEY_REINTERPRET_CAST(__typeof__(ct), c_.u8) >> (i * 8)) & 63;
|
||||
rv |= ((b_.u64 >> ct) & 1) << lshift;
|
||||
lshift += 1;
|
||||
}
|
||||
|
||||
r =
|
||||
HEDLEY_STATIC_CAST(simde__mmask32, rv[0]) |
|
||||
HEDLEY_STATIC_CAST(simde__mmask32, rv[1]) |
|
||||
HEDLEY_STATIC_CAST(simde__mmask32, rv[2]) |
|
||||
HEDLEY_STATIC_CAST(simde__mmask32, rv[3]);
|
||||
#else
|
||||
for (size_t i = 0 ; i < (sizeof(c_.m128i_private) / sizeof(c_.m128i_private[0])) ; i++) {
|
||||
for (size_t j = 0 ; j < (sizeof(c_.m128i_private[i].m64_private) / sizeof(c_.m128i_private[i].m64_private[0])) ; j++) {
|
||||
SIMDE_VECTORIZE_REDUCTION(|:r)
|
||||
for (size_t k = 0 ; k < (sizeof(c_.m128i_private[i].m64_private[j].u8) / sizeof(c_.m128i_private[i].m64_private[j].u8[0])) ; k++) {
|
||||
r |= (((b_.m128i_private[i].u64[j] >> (c_.m128i_private[i].m64_private[j].u8[k]) & 63) & 1) << ((i * 16) + (j * 8) + k));
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
return r;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BITALG_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_bitshuffle_epi64_mask
|
||||
#define _mm256_bitshuffle_epi64_mask(b, c) simde_mm256_bitshuffle_epi64_mask(b, c)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask32
|
||||
simde_mm256_mask_bitshuffle_epi64_mask (simde__mmask32 k, simde__m256i b, simde__m256i c) {
|
||||
#if defined(SIMDE_X86_AVX512BITALG_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_mask_bitshuffle_epi64_mask(k, b, c);
|
||||
#else
|
||||
return (k & simde_mm256_bitshuffle_epi64_mask(b, c));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BITALG_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_mask_bitshuffle_epi64_mask
|
||||
#define _mm256_mask_bitshuffle_epi64_mask(k, b, c) simde_mm256_mask_bitshuffle_epi64_mask(k, b, c)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask64
|
||||
simde_mm512_bitshuffle_epi64_mask (simde__m512i b, simde__m512i c) {
|
||||
#if defined(SIMDE_X86_AVX512BITALG_NATIVE)
|
||||
return _mm512_bitshuffle_epi64_mask(b, c);
|
||||
#else
|
||||
simde__m512i_private
|
||||
b_ = simde__m512i_to_private(b),
|
||||
c_ = simde__m512i_to_private(c);
|
||||
simde__mmask64 r = 0;
|
||||
|
||||
#if SIMDE_NATURAL_VECTOR_SIZE_LE(128)
|
||||
for (size_t i = 0 ; i < (sizeof(b_.m128i) / sizeof(b_.m128i[0])) ; i++) {
|
||||
r |= (HEDLEY_STATIC_CAST(simde__mmask64, simde_mm_bitshuffle_epi64_mask(b_.m128i[i], c_.m128i[i])) << (i * 16));
|
||||
}
|
||||
#elif SIMDE_NATURAL_VECTOR_SIZE_LE(256)
|
||||
for (size_t i = 0 ; i < (sizeof(b_.m256i) / sizeof(b_.m256i[0])) ; i++) {
|
||||
r |= (HEDLEY_STATIC_CAST(simde__mmask64, simde_mm256_bitshuffle_epi64_mask(b_.m256i[i], c_.m256i[i])) << (i * 32));
|
||||
}
|
||||
#elif defined(SIMDE_VECTOR_SUBSCRIPT_SCALAR)
|
||||
__typeof__(b_.u64) rv = { 0, 0, 0, 0, 0, 0, 0, 0 };
|
||||
__typeof__(b_.u64) lshift = { 0, 8, 16, 24, 32, 40, 48, 56 };
|
||||
|
||||
for (int8_t i = 0 ; i < 8 ; i++) {
|
||||
__typeof__(b_.u64) ct = (HEDLEY_REINTERPRET_CAST(__typeof__(ct), c_.u8) >> (i * 8)) & 63;
|
||||
rv |= ((b_.u64 >> ct) & 1) << lshift;
|
||||
lshift += 1;
|
||||
}
|
||||
|
||||
r =
|
||||
HEDLEY_STATIC_CAST(simde__mmask64, rv[0]) |
|
||||
HEDLEY_STATIC_CAST(simde__mmask64, rv[1]) |
|
||||
HEDLEY_STATIC_CAST(simde__mmask64, rv[2]) |
|
||||
HEDLEY_STATIC_CAST(simde__mmask64, rv[3]) |
|
||||
HEDLEY_STATIC_CAST(simde__mmask64, rv[4]) |
|
||||
HEDLEY_STATIC_CAST(simde__mmask64, rv[5]) |
|
||||
HEDLEY_STATIC_CAST(simde__mmask64, rv[6]) |
|
||||
HEDLEY_STATIC_CAST(simde__mmask64, rv[7]);
|
||||
#else
|
||||
for (size_t i = 0 ; i < (sizeof(c_.m128i_private) / sizeof(c_.m128i_private[0])) ; i++) {
|
||||
for (size_t j = 0 ; j < (sizeof(c_.m128i_private[i].m64_private) / sizeof(c_.m128i_private[i].m64_private[0])) ; j++) {
|
||||
SIMDE_VECTORIZE_REDUCTION(|:r)
|
||||
for (size_t k = 0 ; k < (sizeof(c_.m128i_private[i].m64_private[j].u8) / sizeof(c_.m128i_private[i].m64_private[j].u8[0])) ; k++) {
|
||||
r |= (((b_.m128i_private[i].u64[j] >> (c_.m128i_private[i].m64_private[j].u8[k]) & 63) & 1) << ((i * 16) + (j * 8) + k));
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
return r;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BITALG_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_bitshuffle_epi64_mask
|
||||
#define _mm512_bitshuffle_epi64_mask(b, c) simde_mm512_bitshuffle_epi64_mask(b, c)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask64
|
||||
simde_mm512_mask_bitshuffle_epi64_mask (simde__mmask64 k, simde__m512i b, simde__m512i c) {
|
||||
#if defined(SIMDE_X86_AVX512BITALG_NATIVE)
|
||||
return _mm512_mask_bitshuffle_epi64_mask(k, b, c);
|
||||
#else
|
||||
return (k & simde_mm512_bitshuffle_epi64_mask(b, c));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BITALG_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_bitshuffle_epi64_mask
|
||||
#define _mm512_mask_bitshuffle_epi64_mask(k, b, c) simde_mm512_mask_bitshuffle_epi64_mask(k, b, c)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_BITSHUFFLE_H) */
|
||||
@@ -0,0 +1,293 @@
|
||||
/* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Copyright:
|
||||
* 2020 Evan Nemerson <evan@nemerson.com>
|
||||
* 2020 Hidayat Khan <huk2209@gmail.com>
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512_BLEND_H)
|
||||
#define SIMDE_X86_AVX512_BLEND_H
|
||||
|
||||
#include "types.h"
|
||||
#include "mov.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_mask_blend_epi8(simde__mmask16 k, simde__m128i a, simde__m128i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm_mask_blend_epi8(k, a, b);
|
||||
#else
|
||||
return simde_mm_mask_mov_epi8(a, k, b);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_blend_epi8
|
||||
#define _mm_mask_blend_epi8(k, a, b) simde_mm_mask_blend_epi8(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_mask_blend_epi16(simde__mmask8 k, simde__m128i a, simde__m128i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm_mask_blend_epi16(k, a, b);
|
||||
#else
|
||||
return simde_mm_mask_mov_epi16(a, k, b);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_blend_epi16
|
||||
#define _mm_mask_blend_epi16(k, a, b) simde_mm_mask_blend_epi16(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_mask_blend_epi32(simde__mmask8 k, simde__m128i a, simde__m128i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_mask_blend_epi32(k, a, b);
|
||||
#else
|
||||
return simde_mm_mask_mov_epi32(a, k, b);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_blend_epi32
|
||||
#define _mm_mask_blend_epi32(k, a, b) simde_mm_mask_blend_epi32(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_mask_blend_epi64(simde__mmask8 k, simde__m128i a, simde__m128i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_mask_blend_epi64(k, a, b);
|
||||
#else
|
||||
return simde_mm_mask_mov_epi64(a, k, b);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_blend_epi64
|
||||
#define _mm_mask_blend_epi64(k, a, b) simde_mm_mask_blend_epi64(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128
|
||||
simde_mm_mask_blend_ps(simde__mmask8 k, simde__m128 a, simde__m128 b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_mask_blend_ps(k, a, b);
|
||||
#else
|
||||
return simde_mm_mask_mov_ps(a, k, b);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_blend_ps
|
||||
#define _mm_mask_blend_ps(k, a, b) simde_mm_mask_blend_ps(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128d
|
||||
simde_mm_mask_blend_pd(simde__mmask8 k, simde__m128d a, simde__m128d b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_mask_blend_pd(k, a, b);
|
||||
#else
|
||||
return simde_mm_mask_mov_pd(a, k, b);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_blend_pd
|
||||
#define _mm_mask_blend_pd(k, a, b) simde_mm_mask_blend_pd(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_mask_blend_epi8(simde__mmask32 k, simde__m256i a, simde__m256i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm256_mask_blend_epi8(k, a, b);
|
||||
#else
|
||||
return simde_mm256_mask_mov_epi8(a, k, b);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_mask_blend_epi8
|
||||
#define _mm256_mask_blend_epi8(k, a, b) simde_mm256_mask_blend_epi8(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_mask_blend_epi16(simde__mmask16 k, simde__m256i a, simde__m256i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm256_mask_blend_epi16(k, a, b);
|
||||
#else
|
||||
return simde_mm256_mask_mov_epi16(a, k, b);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_mask_blend_epi16
|
||||
#define _mm256_mask_blend_epi16(k, a, b) simde_mm256_mask_blend_epi16(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_mask_blend_epi32(simde__mmask8 k, simde__m256i a, simde__m256i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_mask_blend_epi32(k, a, b);
|
||||
#else
|
||||
return simde_mm256_mask_mov_epi32(a, k, b);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_mask_blend_epi32
|
||||
#define _mm256_mask_blend_epi32(k, a, b) simde_mm256_mask_blend_epi32(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_mask_blend_epi64(simde__mmask8 k, simde__m256i a, simde__m256i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_mask_blend_epi64(k, a, b);
|
||||
#else
|
||||
return simde_mm256_mask_mov_epi64(a, k, b);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_mask_blend_epi64
|
||||
#define _mm256_mask_blend_epi64(k, a, b) simde_mm256_mask_blend_epi64(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256
|
||||
simde_mm256_mask_blend_ps(simde__mmask8 k, simde__m256 a, simde__m256 b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_mask_blend_ps(k, a, b);
|
||||
#else
|
||||
return simde_mm256_mask_mov_ps(a, k, b);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_mask_blend_ps
|
||||
#define _mm256_mask_blend_ps(k, a, b) simde_mm256_mask_blend_ps(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256d
|
||||
simde_mm256_mask_blend_pd(simde__mmask8 k, simde__m256d a, simde__m256d b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_mask_blend_pd(k, a, b);
|
||||
#else
|
||||
return simde_mm256_mask_mov_pd(a, k, b);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_mask_blend_pd
|
||||
#define _mm256_mask_blend_pd(k, a, b) simde_mm256_mask_blend_pd(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_blend_epi8(simde__mmask64 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_mask_blend_epi8(k, a, b);
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi8(a, k, b);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_blend_epi8
|
||||
#define _mm512_mask_blend_epi8(k, a, b) simde_mm512_mask_blend_epi8(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_blend_epi16(simde__mmask32 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_mask_blend_epi16(k, a, b);
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi16(a, k, b);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_blend_epi16
|
||||
#define _mm512_mask_blend_epi16(k, a, b) simde_mm512_mask_blend_epi16(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_blend_epi32(simde__mmask16 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_blend_epi32(k, a, b);
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi32(a, k, b);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_blend_epi32
|
||||
#define _mm512_mask_blend_epi32(k, a, b) simde_mm512_mask_blend_epi32(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_blend_epi64(simde__mmask8 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_blend_epi64(k, a, b);
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi64(a, k, b);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_blend_epi64
|
||||
#define _mm512_mask_blend_epi64(k, a, b) simde_mm512_mask_blend_epi64(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_mask_blend_ps(simde__mmask16 k, simde__m512 a, simde__m512 b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_blend_ps(k, a, b);
|
||||
#else
|
||||
return simde_mm512_mask_mov_ps(a, k, b);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_blend_ps
|
||||
#define _mm512_mask_blend_ps(k, a, b) simde_mm512_mask_blend_ps(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_mask_blend_pd(simde__mmask8 k, simde__m512d a, simde__m512d b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_blend_pd(k, a, b);
|
||||
#else
|
||||
return simde_mm512_mask_mov_pd(a, k, b);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_blend_pd
|
||||
#define _mm512_mask_blend_pd(k, a, b) simde_mm512_mask_blend_pd(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_BLEND_H) */
|
||||
@@ -0,0 +1,897 @@
|
||||
/* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Copyright:
|
||||
* 2020 Evan Nemerson <evan@nemerson.com>
|
||||
* 2020 Hidayat Khan <huk2209@gmail.com>
|
||||
* 2020 Christopher Moore <moore@free.fr>
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512_BROADCAST_H)
|
||||
#define SIMDE_X86_AVX512_BROADCAST_H
|
||||
|
||||
#include "types.h"
|
||||
#include "../avx2.h"
|
||||
|
||||
#include "mov.h"
|
||||
#include "cast.h"
|
||||
#include "set1.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256
|
||||
simde_mm256_broadcast_f32x2 (simde__m128 a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
return _mm256_broadcast_f32x2(a);
|
||||
#else
|
||||
simde__m256_private r_;
|
||||
simde__m128_private a_ = simde__m128_to_private(a);
|
||||
|
||||
#if defined(SIMDE_VECTOR_SUBSCRIPT) && HEDLEY_HAS_BUILTIN(__builtin_shufflevector)
|
||||
r_.f32 = __builtin_shufflevector(a_.f32, a_.f32, 0, 1, 0, 1, 0, 1, 0, 1);
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.f32) / sizeof(r_.f32[0])) ; i += 2) {
|
||||
r_.f32[ i ] = a_.f32[0];
|
||||
r_.f32[i + 1] = a_.f32[1];
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m256_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_broadcast_f32x2
|
||||
#define _mm256_broadcast_f32x2(a) simde_mm256_broadcast_f32x2(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256
|
||||
simde_mm256_mask_broadcast_f32x2(simde__m256 src, simde__mmask8 k, simde__m128 a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
return _mm256_mask_broadcast_f32x2(src, k, a);
|
||||
#else
|
||||
return simde_mm256_mask_mov_ps(src, k, simde_mm256_broadcast_f32x2(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_mask_broadcast_f32x2
|
||||
#define _mm256_mask_broadcast_f32x2(src, k, a) simde_mm256_mask_broadcast_f32x2(src, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256
|
||||
simde_mm256_maskz_broadcast_f32x2(simde__mmask8 k, simde__m128 a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
return _mm256_maskz_broadcast_f32x2(k, a);
|
||||
#else
|
||||
return simde_mm256_maskz_mov_ps(k, simde_mm256_broadcast_f32x2(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_maskz_broadcast_f32x2
|
||||
#define _mm256_maskz_broadcast_f32x2(k, a) simde_mm256_maskz_broadcast_f32x2(k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_broadcast_f32x2 (simde__m128 a) {
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
return _mm512_broadcast_f32x2(a);
|
||||
#else
|
||||
simde__m512_private r_;
|
||||
simde__m128_private a_ = simde__m128_to_private(a);
|
||||
|
||||
#if defined(SIMDE_VECTOR_SUBSCRIPT) && HEDLEY_HAS_BUILTIN(__builtin_shufflevector)
|
||||
r_.f32 = __builtin_shufflevector(a_.f32, a_.f32, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1);
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.f32) / sizeof(r_.f32[0])) ; i+=2) {
|
||||
r_.f32[ i ] = a_.f32[0];
|
||||
r_.f32[i + 1] = a_.f32[1];
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_broadcast_f32x2
|
||||
#define _mm512_broadcast_f32x2(a) simde_mm512_broadcast_f32x2(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_mask_broadcast_f32x2(simde__m512 src, simde__mmask16 k, simde__m128 a) {
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
return _mm512_mask_broadcast_f32x2(src, k, a);
|
||||
#else
|
||||
return simde_mm512_mask_mov_ps(src, k, simde_mm512_broadcast_f32x2(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_broadcast_f32x2
|
||||
#define _mm512_mask_broadcast_f32x2(src, k, a) simde_mm512_mask_broadcast_f32x2(src, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_maskz_broadcast_f32x2(simde__mmask16 k, simde__m128 a) {
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
return _mm512_maskz_broadcast_f32x2(k, a);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_ps(k, simde_mm512_broadcast_f32x2(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_broadcast_f32x2
|
||||
#define _mm512_maskz_broadcast_f32x2(k, a) simde_mm512_maskz_broadcast_f32x2(k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_broadcast_f32x8 (simde__m256 a) {
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
return _mm512_broadcast_f32x8(a);
|
||||
#else
|
||||
simde__m512_private r_;
|
||||
simde__m256_private a_ = simde__m256_to_private(a);
|
||||
|
||||
#if defined(SIMDE_VECTOR_SUBSCRIPT) && HEDLEY_HAS_BUILTIN(__builtin_shufflevector)
|
||||
r_.f32 = __builtin_shufflevector(a_.f32, a_.f32, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7);
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.f32) / sizeof(r_.f32[0])) ; i+=8) {
|
||||
r_.f32[ i ] = a_.f32[0];
|
||||
r_.f32[i + 1] = a_.f32[1];
|
||||
r_.f32[i + 2] = a_.f32[2];
|
||||
r_.f32[i + 3] = a_.f32[3];
|
||||
r_.f32[i + 4] = a_.f32[4];
|
||||
r_.f32[i + 5] = a_.f32[5];
|
||||
r_.f32[i + 6] = a_.f32[6];
|
||||
r_.f32[i + 7] = a_.f32[7];
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_broadcast_f32x8
|
||||
#define _mm512_broadcast_f32x8(a) simde_mm512_broadcast_f32x8(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_mask_broadcast_f32x8(simde__m512 src, simde__mmask16 k, simde__m256 a) {
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
return _mm512_mask_broadcast_f32x8(src, k, a);
|
||||
#else
|
||||
return simde_mm512_mask_mov_ps(src, k, simde_mm512_broadcast_f32x8(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_broadcast_f32x8
|
||||
#define _mm512_mask_broadcast_f32x8(src, k, a) simde_mm512_mask_broadcast_f32x8(src, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_maskz_broadcast_f32x8(simde__mmask16 k, simde__m256 a) {
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
return _mm512_maskz_broadcast_f32x8(k, a);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_ps(k, simde_mm512_broadcast_f32x8(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_broadcast_f32x8
|
||||
#define _mm512_maskz_broadcast_f32x8(k, a) simde_mm512_maskz_broadcast_f32x8(k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_broadcast_f64x2 (simde__m128d a) {
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
return _mm512_broadcast_f64x2(a);
|
||||
#else
|
||||
simde__m512d_private r_;
|
||||
simde__m128d_private a_ = simde__m128d_to_private(a);
|
||||
|
||||
#if defined(SIMDE_VECTOR_SUBSCRIPT) && HEDLEY_HAS_BUILTIN(__builtin_shufflevector) && !defined(SIMDE_BUG_CLANG_BAD_VI64_OPS)
|
||||
r_.f64 = __builtin_shufflevector(a_.f64, a_.f64, 0, 1, 0, 1, 0, 1, 0, 1);
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.f64) / sizeof(r_.f64[0])) ; i += 2) {
|
||||
r_.f64[ i ] = a_.f64[0];
|
||||
r_.f64[i + 1] = a_.f64[1];
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512d_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_broadcast_f64x2
|
||||
#define _mm512_broadcast_f64x2(a) simde_mm512_broadcast_f64x2(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_mask_broadcast_f64x2(simde__m512d src, simde__mmask8 k, simde__m128d a) {
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
return _mm512_mask_broadcast_f64x2(src, k, a);
|
||||
#else
|
||||
return simde_mm512_mask_mov_pd(src, k, simde_mm512_broadcast_f64x2(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_broadcast_f64x2
|
||||
#define _mm512_mask_broadcast_f64x2(src, k, a) simde_mm512_mask_broadcast_f64x2(src, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_maskz_broadcast_f64x2(simde__mmask8 k, simde__m128d a) {
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
return _mm512_maskz_broadcast_f64x2(k, a);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_pd(k, simde_mm512_broadcast_f64x2(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_broadcast_f64x2
|
||||
#define _mm512_maskz_broadcast_f64x2(k, a) simde_mm512_maskz_broadcast_f64x2(k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256
|
||||
simde_mm256_broadcast_f32x4 (simde__m128 a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_broadcast_f32x4(a);
|
||||
#else
|
||||
simde__m256_private r_;
|
||||
simde__m128_private a_ = simde__m128_to_private(a);
|
||||
|
||||
#if SIMDE_NATURAL_VECTOR_SIZE_LE(128)
|
||||
r_.m128_private[0] = a_;
|
||||
r_.m128_private[1] = a_;
|
||||
#elif defined(SIMDE_VECTOR_SUBSCRIPT) && HEDLEY_HAS_BUILTIN(__builtin_shufflevector)
|
||||
r_.f32 = __builtin_shufflevector(a_.f32, a_.f32, 0, 1, 2, 3, 0, 1, 2, 3);
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.f32) / sizeof(r_.f32[0])) ; i += 4) {
|
||||
r_.f32[ i ] = a_.f32[0];
|
||||
r_.f32[i + 1] = a_.f32[1];
|
||||
r_.f32[i + 2] = a_.f32[2];
|
||||
r_.f32[i + 3] = a_.f32[3];
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m256_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_broadcast_f32x4
|
||||
#define _mm256_broadcast_f32x4(a) simde_mm256_broadcast_f32x4(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256
|
||||
simde_mm256_mask_broadcast_f32x4(simde__m256 src, simde__mmask8 k, simde__m128 a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_mask_broadcast_f32x4(src, k, a);
|
||||
#else
|
||||
return simde_mm256_mask_mov_ps(src, k, simde_mm256_broadcast_f32x4(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_mask_broadcast_f32x4
|
||||
#define _mm256_mask_broadcast_f32x4(src, k, a) simde_mm256_mask_broadcast_f32x4(src, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256
|
||||
simde_mm256_maskz_broadcast_f32x4(simde__mmask8 k, simde__m128 a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_maskz_broadcast_f32x4(k, a);
|
||||
#else
|
||||
return simde_mm256_maskz_mov_ps(k, simde_mm256_broadcast_f32x4(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_maskz_broadcast_f32x4
|
||||
#define _mm256_maskz_broadcast_f32x4(k, a) simde_mm256_maskz_broadcast_f32x4(k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256d
|
||||
simde_mm256_broadcast_f64x2 (simde__m128d a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
return _mm256_broadcast_f64x2(a);
|
||||
#else
|
||||
simde__m256d_private r_;
|
||||
simde__m128d_private a_ = simde__m128d_to_private(a);
|
||||
|
||||
/* I don't have a bug # for this, but when compiled with clang-10 without optimization on aarch64
|
||||
* the __builtin_shufflevector version doesn't work correctly. clang 9 and 11 aren't a problem */
|
||||
#if defined(SIMDE_VECTOR_SUBSCRIPT) && HEDLEY_HAS_BUILTIN(__builtin_shufflevector) && \
|
||||
(!defined(__clang__) || (SIMDE_DETECT_CLANG_VERSION < 100000 || SIMDE_DETECT_CLANG_VERSION > 100000))
|
||||
r_.f64 = __builtin_shufflevector(a_.f64, a_.f64, 0, 1, 0, 1);
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.f64) / sizeof(r_.f64[0])) ; i += 2) {
|
||||
r_.f64[ i ] = a_.f64[0];
|
||||
r_.f64[i + 1] = a_.f64[1];
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m256d_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_broadcast_f64x2
|
||||
#define _mm256_broadcast_f64x2(a) simde_mm256_broadcast_f64x2(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256d
|
||||
simde_mm256_mask_broadcast_f64x2(simde__m256d src, simde__mmask8 k, simde__m128d a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
return _mm256_mask_broadcast_f64x2(src, k, a);
|
||||
#else
|
||||
return simde_mm256_mask_mov_pd(src, k, simde_mm256_broadcast_f64x2(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_mask_broadcast_f64x2
|
||||
#define _mm256_mask_broadcast_f64x2(src, k, a) simde_mm256_mask_broadcast_f64x2(src, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256d
|
||||
simde_mm256_maskz_broadcast_f64x2(simde__mmask8 k, simde__m128d a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
return _mm256_maskz_broadcast_f64x2(k, a);
|
||||
#else
|
||||
return simde_mm256_maskz_mov_pd(k, simde_mm256_broadcast_f64x2(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_maskz_broadcast_f64x2
|
||||
#define _mm256_maskz_broadcast_f64x2(k, a) simde_mm256_maskz_broadcast_f64x2(k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_broadcast_f32x4 (simde__m128 a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_broadcast_f32x4(a);
|
||||
#else
|
||||
simde__m512_private r_;
|
||||
|
||||
#if defined(SIMDE_X86_AVX2_NATIVE)
|
||||
r_.m256[1] = r_.m256[0] = simde_mm256_castsi256_ps(simde_mm256_broadcastsi128_si256(simde_mm_castps_si128(a)));
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m128) / sizeof(r_.m128[0])) ; i++) {
|
||||
r_.m128[i] = a;
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_broadcast_f32x4
|
||||
#define _mm512_broadcast_f32x4(a) simde_mm512_broadcast_f32x4(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_mask_broadcast_f32x4(simde__m512 src, simde__mmask16 k, simde__m128 a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_broadcast_f32x4(src, k, a);
|
||||
#else
|
||||
return simde_mm512_mask_mov_ps(src, k, simde_mm512_broadcast_f32x4(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_broadcast_f32x4
|
||||
#define _mm512_mask_broadcast_f32x4(src, k, a) simde_mm512_mask_broadcast_f32x4(src, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_maskz_broadcast_f32x4(simde__mmask16 k, simde__m128 a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_maskz_broadcast_f32x4(k, a);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_ps(k, simde_mm512_broadcast_f32x4(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_broadcast_f32x4
|
||||
#define _mm512_maskz_broadcast_f32x4(k, a) simde_mm512_maskz_broadcast_f32x4(k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_broadcast_f64x4 (simde__m256d a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_broadcast_f64x4(a);
|
||||
#else
|
||||
simde__m512d_private r_;
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m256d) / sizeof(r_.m256d[0])) ; i++) {
|
||||
r_.m256d[i] = a;
|
||||
}
|
||||
|
||||
return simde__m512d_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_broadcast_f64x4
|
||||
#define _mm512_broadcast_f64x4(a) simde_mm512_broadcast_f64x4(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_mask_broadcast_f64x4(simde__m512d src, simde__mmask8 k, simde__m256d a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_broadcast_f64x4(src, k, a);
|
||||
#else
|
||||
return simde_mm512_mask_mov_pd(src, k, simde_mm512_broadcast_f64x4(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_broadcast_f64x4
|
||||
#define _mm512_mask_broadcast_f64x4(src, k, a) simde_mm512_mask_broadcast_f64x4(src, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_maskz_broadcast_f64x4(simde__mmask8 k, simde__m256d a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_maskz_broadcast_f64x4(k, a);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_pd(k, simde_mm512_broadcast_f64x4(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_broadcast_f64x4
|
||||
#define _mm512_maskz_broadcast_f64x4(k, a) simde_mm512_maskz_broadcast_f64x4(k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_broadcast_i32x4 (simde__m128i a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_broadcast_i32x4(a);
|
||||
#else
|
||||
simde__m512i_private r_;
|
||||
|
||||
#if defined(SIMDE_X86_AVX2_NATIVE)
|
||||
r_.m256i[1] = r_.m256i[0] = simde_mm256_broadcastsi128_si256(a);
|
||||
#elif defined(SIMDE_X86_SSE2_NATIVE)
|
||||
r_.m128i[3] = r_.m128i[2] = r_.m128i[1] = r_.m128i[0] = a;
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m128i) / sizeof(r_.m128i[0])) ; i++) {
|
||||
r_.m128i[i] = a;
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_broadcast_i32x4
|
||||
#define _mm512_broadcast_i32x4(a) simde_mm512_broadcast_i32x4(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_broadcast_i32x4(simde__m512i src, simde__mmask16 k, simde__m128i a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_broadcast_i32x4(src, k, a);
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi32(src, k, simde_mm512_broadcast_i32x4(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_broadcast_i32x4
|
||||
#define _mm512_mask_broadcast_i32x4(src, k, a) simde_mm512_mask_broadcast_i32x4(src, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_broadcast_i32x4(simde__mmask16 k, simde__m128i a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_maskz_broadcast_i32x4(k, a);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_epi32(k, simde_mm512_broadcast_i32x4(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_broadcast_i32x4
|
||||
#define _mm512_maskz_broadcast_i32x4(k, a) simde_mm512_maskz_broadcast_i32x4(k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_broadcast_i64x4 (simde__m256i a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_broadcast_i64x4(a);
|
||||
#else
|
||||
simde__m512i_private r_;
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m256i) / sizeof(r_.m256i[0])) ; i++) {
|
||||
r_.m256i[i] = a;
|
||||
}
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_broadcast_i64x4
|
||||
#define _mm512_broadcast_i64x4(a) simde_mm512_broadcast_i64x4(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_broadcast_i64x4(simde__m512i src, simde__mmask8 k, simde__m256i a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_broadcast_i64x4(src, k, a);
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi64(src, k, simde_mm512_broadcast_i64x4(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_broadcast_i64x4
|
||||
#define _mm512_mask_broadcast_i64x4(src, k, a) simde_mm512_mask_broadcast_i64x4(src, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_broadcast_i64x4(simde__mmask8 k, simde__m256i a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_maskz_broadcast_i64x4(k, a);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_epi64(k, simde_mm512_broadcast_i64x4(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_broadcast_i64x4
|
||||
#define _mm512_maskz_broadcast_i64x4(k, a) simde_mm512_maskz_broadcast_i64x4(k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_broadcastd_epi32 (simde__m128i a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_broadcastd_epi32(a);
|
||||
#else
|
||||
simde__m512i_private r_;
|
||||
simde__m128i_private a_= simde__m128i_to_private(a);
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i32) / sizeof(r_.i32[0])) ; i++) {
|
||||
r_.i32[i] = a_.i32[0];
|
||||
}
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_broadcastd_epi32
|
||||
#define _mm512_broadcastd_epi32(a) simde_mm512_broadcastd_epi32(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_broadcastd_epi32(simde__m512i src, simde__mmask16 k, simde__m128i a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_broadcastd_epi32(src, k, a);
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi32(src, k, simde_mm512_broadcastd_epi32(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_broadcastd_epi32
|
||||
#define _mm512_mask_broadcastd_epi32(src, k, a) simde_mm512_mask_broadcastd_epi32(src, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_broadcastd_epi32(simde__mmask16 k, simde__m128i a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_maskz_broadcastd_epi32(k, a);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_epi32(k, simde_mm512_broadcastd_epi32(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_broadcastd_epi32
|
||||
#define _mm512_maskz_broadcastd_epi32(k, a) simde_mm512_maskz_broadcastd_epi32(k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_broadcastq_epi64 (simde__m128i a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_broadcastq_epi64(a);
|
||||
#else
|
||||
simde__m512i_private r_;
|
||||
simde__m128i_private a_= simde__m128i_to_private(a);
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i64) / sizeof(r_.i64[0])) ; i++) {
|
||||
r_.i64[i] = a_.i64[0];
|
||||
}
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_broadcastq_epi64
|
||||
#define _mm512_broadcastq_epi64(a) simde_mm512_broadcastq_epi64(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_broadcastq_epi64(simde__m512i src, simde__mmask8 k, simde__m128i a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_broadcastq_epi64(src, k, a);
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi64(src, k, simde_mm512_broadcastq_epi64(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_broadcastq_epi64
|
||||
#define _mm512_mask_broadcastq_epi64(src, k, a) simde_mm512_mask_broadcastq_epi64(src, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_broadcastq_epi64(simde__mmask8 k, simde__m128i a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_maskz_broadcastq_epi64(k, a);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_epi64(k, simde_mm512_broadcastq_epi64(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_broadcastq_epi64
|
||||
#define _mm512_maskz_broadcastq_epi64(k, a) simde_mm512_maskz_broadcastq_epi64(k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_broadcastss_ps (simde__m128 a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_broadcastss_ps(a);
|
||||
#else
|
||||
simde__m512_private r_;
|
||||
simde__m128_private a_= simde__m128_to_private(a);
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.f32) / sizeof(r_.f32[0])) ; i++) {
|
||||
r_.f32[i] = a_.f32[0];
|
||||
}
|
||||
|
||||
return simde__m512_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_broadcastss_ps
|
||||
#define _mm512_broadcastss_ps(a) simde_mm512_broadcastss_ps(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_mask_broadcastss_ps(simde__m512 src, simde__mmask16 k, simde__m128 a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_broadcastss_ps(src, k, a);
|
||||
#else
|
||||
simde__m512_private
|
||||
src_ = simde__m512_to_private(src),
|
||||
r_;
|
||||
simde__m128_private
|
||||
a_ = simde__m128_to_private(a);
|
||||
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.f32) / sizeof(r_.f32[0])) ; i++) {
|
||||
r_.f32[i] = ((k >> i) & 1) ? a_.f32[0] : src_.f32[i];
|
||||
}
|
||||
|
||||
return simde__m512_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_broadcastss_ps
|
||||
#define _mm512_mask_broadcastss_ps(src, k, a) simde_mm512_mask_broadcastss_ps(src, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_maskz_broadcastss_ps(simde__mmask16 k, simde__m128 a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_maskz_broadcastss_ps(k, a);
|
||||
#else
|
||||
simde__m512_private
|
||||
r_;
|
||||
simde__m128_private
|
||||
a_ = simde__m128_to_private(a);
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.f32) / sizeof(r_.f32[0])) ; i++) {
|
||||
r_.f32[i] = ((k >> i) & 1) ? a_.f32[0] : INT32_C(0);
|
||||
}
|
||||
|
||||
return simde__m512_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_broadcastss_ps
|
||||
#define _mm512_maskz_broadcastss_ps(k, a) simde_mm512_maskz_broadcastss_ps(k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_broadcastsd_pd (simde__m128d a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_broadcastsd_pd(a);
|
||||
#else
|
||||
simde__m512d_private r_;
|
||||
simde__m128d_private a_= simde__m128d_to_private(a);
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.f64) / sizeof(r_.f64[0])) ; i++) {
|
||||
r_.f64[i] = a_.f64[0];
|
||||
}
|
||||
|
||||
return simde__m512d_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_broadcastsd_pd
|
||||
#define _mm512_broadcastsd_pd(a) simde_mm512_broadcastsd_pd(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_mask_broadcastsd_pd(simde__m512d src, simde__mmask8 k, simde__m128d a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_broadcastsd_pd(src, k, a);
|
||||
#else
|
||||
simde__m512d_private
|
||||
src_ = simde__m512d_to_private(src),
|
||||
r_;
|
||||
simde__m128d_private
|
||||
a_ = simde__m128d_to_private(a);
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.f64) / sizeof(r_.f64[0])) ; i++) {
|
||||
r_.f64[i] = ((k >> i) & 1) ? a_.f64[0] : src_.f64[i];
|
||||
}
|
||||
|
||||
return simde__m512d_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_broadcastsd_pd
|
||||
#define _mm512_mask_broadcastsd_pd(src, k, a) simde_mm512_mask_broadcastsd_pd(src, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_maskz_broadcastsd_pd(simde__mmask8 k, simde__m128d a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_maskz_broadcastsd_pd(k, a);
|
||||
#else
|
||||
simde__m512d_private
|
||||
r_;
|
||||
simde__m128d_private
|
||||
a_ = simde__m128d_to_private(a);
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.f64) / sizeof(r_.f64[0])) ; i++) {
|
||||
r_.f64[i] = ((k >> i) & 1) ? a_.f64[0] : INT64_C(0);
|
||||
}
|
||||
|
||||
return simde__m512d_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_broadcastsd_pd
|
||||
#define _mm512_maskz_broadcastsd_pd(k, a) simde_mm512_maskz_broadcastsd_pd(k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_broadcastb_epi8 (simde__m128i a) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_broadcastb_epi8(a);
|
||||
#else
|
||||
simde__m128i_private a_= simde__m128i_to_private(a);
|
||||
return simde_mm512_set1_epi8(a_.i8[0]);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_broadcastb_epi8
|
||||
#define _mm512_broadcastb_epi8(a) simde_mm512_broadcastb_epi8(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_broadcastb_epi8 (simde__m512i src, simde__mmask64 k, simde__m128i a) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_mask_broadcastb_epi8(src, k, a);
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi8(src, k, simde_mm512_broadcastb_epi8(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_broadcastb_epi8
|
||||
#define _mm512_mask_broadcastb_epi8(src, k, a) simde_mm512_mask_broadcastb_epi8(src, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_broadcastb_epi8 (simde__mmask64 k, simde__m128i a) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_maskz_broadcastb_epi8(k, a);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_epi8(k, simde_mm512_broadcastb_epi8(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_broadcastb_epi8
|
||||
#define _mm512_maskz_broadcastb_epi8(k, a) simde_mm512_maskz_broadcastb_epi8(k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_broadcastw_epi16 (simde__m128i a) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_broadcastw_epi16(a);
|
||||
#else
|
||||
simde__m128i_private a_= simde__m128i_to_private(a);
|
||||
return simde_mm512_set1_epi16(a_.i16[0]);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_broadcastw_epi16
|
||||
#define _mm512_broadcastw_epi16(a) simde_mm512_broadcastw_epi16(a)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_BROADCAST_H) */
|
||||
@@ -0,0 +1,357 @@
|
||||
/* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Copyright:
|
||||
* 2020 Evan Nemerson <evan@nemerson.com>
|
||||
* 2020 Himanshi Mathur <himanshi18037@iiitd.ac.in>
|
||||
* 2020 Hidayat Khan <huk2209@gmail.com>
|
||||
* 2020 Christopher Moore <moore@free.fr>
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512_CAST_H)
|
||||
#define SIMDE_X86_AVX512_CAST_H
|
||||
|
||||
#include "types.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_castpd_ps (simde__m512d a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_castpd_ps(a);
|
||||
#else
|
||||
simde__m512 r;
|
||||
simde_memcpy(&r, &a, sizeof(r));
|
||||
return r;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_castpd_ps
|
||||
#define _mm512_castpd_ps(a) simde_mm512_castpd_ps(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_castpd_si512 (simde__m512d a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_castpd_si512(a);
|
||||
#else
|
||||
simde__m512i r;
|
||||
simde_memcpy(&r, &a, sizeof(r));
|
||||
return r;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_castpd_si512
|
||||
#define _mm512_castpd_si512(a) simde_mm512_castpd_si512(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_castps_pd (simde__m512 a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_castps_pd(a);
|
||||
#else
|
||||
simde__m512d r;
|
||||
simde_memcpy(&r, &a, sizeof(r));
|
||||
return r;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_castps_pd
|
||||
#define _mm512_castps_pd(a) simde_mm512_castps_pd(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_castps_si512 (simde__m512 a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_castps_si512(a);
|
||||
#else
|
||||
simde__m512i r;
|
||||
simde_memcpy(&r, &a, sizeof(r));
|
||||
return r;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_castps_si512
|
||||
#define _mm512_castps_si512(a) simde_mm512_castps_si512(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_castph_si512 (simde__m512h a) {
|
||||
#if defined(SIMDE_X86_AVX512FP16_NATIVE)
|
||||
return _mm512_castph_si512(a);
|
||||
#else
|
||||
simde__m512i r;
|
||||
simde_memcpy(&r, &a, sizeof(r));
|
||||
return r;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512FP16_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_castph_si512
|
||||
#define _mm512_castph_si512(a) simde_mm512_castph_si512(a)
|
||||
#endif
|
||||
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512h
|
||||
simde_mm512_castsi512_ph (simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512FP16_NATIVE)
|
||||
return _mm512_castsi512_ph(a);
|
||||
#else
|
||||
simde__m512h r;
|
||||
simde_memcpy(&r, &a, sizeof(r));
|
||||
return r;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512FP16_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_castsi512_ph
|
||||
#define _mm512_castsi512_ph(a) simde_mm512_castsi512_ph(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_castsi512_ps (simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_castsi512_ps(a);
|
||||
#else
|
||||
simde__m512 r;
|
||||
simde_memcpy(&r, &a, sizeof(r));
|
||||
return r;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_castsi512_ps
|
||||
#define _mm512_castsi512_ps(a) simde_mm512_castsi512_ps(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_castsi512_pd (simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_castsi512_pd(a);
|
||||
#else
|
||||
simde__m512d r;
|
||||
simde_memcpy(&r, &a, sizeof(r));
|
||||
return r;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_castsi512_pd
|
||||
#define _mm512_castsi512_pd(a) simde_mm512_castsi512_pd(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_castpd128_pd512 (simde__m128d a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_castpd128_pd512(a);
|
||||
#else
|
||||
simde__m512d_private r_;
|
||||
r_.m128d[0] = a;
|
||||
return simde__m512d_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_castpd128_pd512
|
||||
#define _mm512_castpd128_pd512(a) simde_mm512_castpd128_pd512(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_castpd256_pd512 (simde__m256d a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_castpd256_pd512(a);
|
||||
#else
|
||||
simde__m512d_private r_;
|
||||
r_.m256d[0] = a;
|
||||
return simde__m512d_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_castpd256_pd512
|
||||
#define _mm512_castpd256_pd512(a) simde_mm512_castpd256_pd512(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128d
|
||||
simde_mm512_castpd512_pd128 (simde__m512d a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_castpd512_pd128(a);
|
||||
#else
|
||||
simde__m512d_private a_ = simde__m512d_to_private(a);
|
||||
return a_.m128d[0];
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_castpd512_pd128
|
||||
#define _mm512_castpd512_pd128(a) simde_mm512_castpd512_pd128(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256d
|
||||
simde_mm512_castpd512_pd256 (simde__m512d a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_castpd512_pd256(a);
|
||||
#else
|
||||
simde__m512d_private a_ = simde__m512d_to_private(a);
|
||||
return a_.m256d[0];
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_castpd512_pd256
|
||||
#define _mm512_castpd512_pd256(a) simde_mm512_castpd512_pd256(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_castps128_ps512 (simde__m128 a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_castps128_ps512(a);
|
||||
#else
|
||||
simde__m512_private r_;
|
||||
r_.m128[0] = a;
|
||||
return simde__m512_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_castps128_ps512
|
||||
#define _mm512_castps128_ps512(a) simde_mm512_castps128_ps512(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_castps256_ps512 (simde__m256 a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_castps256_ps512(a);
|
||||
#else
|
||||
simde__m512_private r_;
|
||||
r_.m256[0] = a;
|
||||
return simde__m512_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_castps256_ps512
|
||||
#define _mm512_castps256_ps512(a) simde_mm512_castps256_ps512(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128
|
||||
simde_mm512_castps512_ps128 (simde__m512 a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_castps512_ps128(a);
|
||||
#else
|
||||
simde__m512_private a_ = simde__m512_to_private(a);
|
||||
return a_.m128[0];
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_castps512_ps128
|
||||
#define _mm512_castps512_ps128(a) simde_mm512_castps512_ps128(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256
|
||||
simde_mm512_castps512_ps256 (simde__m512 a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_castps512_ps256(a);
|
||||
#else
|
||||
simde__m512_private a_ = simde__m512_to_private(a);
|
||||
return a_.m256[0];
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_castps512_ps256
|
||||
#define _mm512_castps512_ps256(a) simde_mm512_castps512_ps256(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_castsi128_si512 (simde__m128i a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_castsi128_si512(a);
|
||||
#else
|
||||
simde__m512i_private r_;
|
||||
r_.m128i[0] = a;
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_castsi128_si512
|
||||
#define _mm512_castsi128_si512(a) simde_mm512_castsi128_si512(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_castsi256_si512 (simde__m256i a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_castsi256_si512(a);
|
||||
#else
|
||||
simde__m512i_private r_;
|
||||
r_.m256i[0] = a;
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_castsi256_si512
|
||||
#define _mm512_castsi256_si512(a) simde_mm512_castsi256_si512(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm512_castsi512_si128 (simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_castsi512_si128(a);
|
||||
#else
|
||||
simde__m512i_private a_ = simde__m512i_to_private(a);
|
||||
return a_.m128i[0];
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_castsi512_si128
|
||||
#define _mm512_castsi512_si128(a) simde_mm512_castsi512_si128(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm512_castsi512_si256 (simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_castsi512_si256(a);
|
||||
#else
|
||||
simde__m512i_private a_ = simde__m512i_to_private(a);
|
||||
return a_.m256i[0];
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_castsi512_si256
|
||||
#define _mm512_castsi512_si256(a) simde_mm512_castsi512_si256(a)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_CAST_H) */
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,241 @@
|
||||
/* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Copyright:
|
||||
* 2020-2021 Evan Nemerson <evan@nemerson.com>
|
||||
* 2020 Himanshi Mathur <himanshi18037@iiitd.ac.in>
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512_CMPEQ_H)
|
||||
#define SIMDE_X86_AVX512_CMPEQ_H
|
||||
|
||||
#include "types.h"
|
||||
#include "../avx2.h"
|
||||
#include "mov.h"
|
||||
#include "mov_mask.h"
|
||||
#include "cmp.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask64
|
||||
simde_mm512_cmpeq_epi8_mask (simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_cmpeq_epi8_mask(a, b);
|
||||
#else
|
||||
simde__m512i_private
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b);
|
||||
simde__mmask64 r;
|
||||
|
||||
#if SIMDE_NATURAL_VECTOR_SIZE_LE(256)
|
||||
r = 0;
|
||||
|
||||
SIMDE_VECTORIZE_REDUCTION(|:r)
|
||||
for (size_t i = 0 ; i < (sizeof(a_.m256i) / sizeof(a_.m256i[0])) ; i++) {
|
||||
const uint32_t t = HEDLEY_STATIC_CAST(uint32_t, simde_mm256_movemask_epi8(simde_mm256_cmpeq_epi8(a_.m256i[i], b_.m256i[i])));
|
||||
r |= HEDLEY_STATIC_CAST(uint64_t, t) << (i * 32);
|
||||
}
|
||||
#elif defined(SIMDE_VECTOR_SUBSCRIPT_OPS)
|
||||
simde__m512i_private tmp;
|
||||
|
||||
tmp.i8 = HEDLEY_REINTERPRET_CAST(__typeof__(tmp.i8), a_.i8 == b_.i8);
|
||||
r = simde_mm512_movepi8_mask(simde__m512i_from_private(tmp));
|
||||
#else
|
||||
r = 0;
|
||||
|
||||
SIMDE_VECTORIZE_REDUCTION(|:r)
|
||||
for (size_t i = 0 ; i < (sizeof(a_.u8) / sizeof(a_.u8[0])) ; i++) {
|
||||
r |= (a_.u8[i] == b_.u8[i]) ? (UINT64_C(1) << i) : 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
return r;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_cmpeq_epi8_mask
|
||||
#define _mm512_cmpeq_epi8_mask(a, b) simde_mm512_cmpeq_epi8_mask(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask64
|
||||
simde_mm512_mask_cmpeq_epi8_mask(simde__mmask64 k1, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_mask_cmpeq_epi8_mask(k1, a, b);
|
||||
#else
|
||||
return simde_mm512_cmpeq_epi8_mask(a, b) & k1;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_cmpeq_epi8_mask
|
||||
#define _mm512_mask_cmpeq_epi8_mask(k1, a, b) simde_mm512_mask_cmpeq_epi8_mask((k1), (a), (b))
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask16
|
||||
simde_mm512_cmpeq_epi32_mask (simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_cmpeq_epi32_mask(a, b);
|
||||
#else
|
||||
simde__m512i_private
|
||||
r_,
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b);
|
||||
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m256i) / sizeof(r_.m256i[0])) ; i++) {
|
||||
r_.m256i[i] = simde_mm256_cmpeq_epi32(a_.m256i[i], b_.m256i[i]);
|
||||
}
|
||||
|
||||
return simde_mm512_movepi32_mask(simde__m512i_from_private(r_));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_cmpeq_epi32_mask
|
||||
#define _mm512_cmpeq_epi32_mask(a, b) simde_mm512_cmpeq_epi32_mask(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask16
|
||||
simde_mm512_mask_cmpeq_epi32_mask (simde__mmask16 k1, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_cmpeq_epi32_mask(k1, a, b);
|
||||
#else
|
||||
return simde_mm512_cmpeq_epi32_mask(a, b) & k1;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_cmpeq_epi32_mask
|
||||
#define _mm512_mask_cmpeq_epi32_mask(k1, a, b) simde_mm512_mask_cmpeq_epi32_mask(k1, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask8
|
||||
simde_mm512_cmpeq_epi64_mask (simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_cmpeq_epi64_mask(a, b);
|
||||
#else
|
||||
simde__m512i_private
|
||||
r_,
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b);
|
||||
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m256i) / sizeof(r_.m256i[0])) ; i++) {
|
||||
r_.m256i[i] = simde_mm256_cmpeq_epi64(a_.m256i[i], b_.m256i[i]);
|
||||
}
|
||||
|
||||
return simde_mm512_movepi64_mask(simde__m512i_from_private(r_));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_cmpeq_epi64_mask
|
||||
#define _mm512_cmpeq_epi64_mask(a, b) simde_mm512_cmpeq_epi64_mask(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask8
|
||||
simde_mm512_mask_cmpeq_epi64_mask (simde__mmask8 k1, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_cmpeq_epi64_mask(k1, a, b);
|
||||
#else
|
||||
return simde_mm512_cmpeq_epi64_mask(a, b) & k1;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_cmpeq_epi64_mask
|
||||
#define _mm512_mask_cmpeq_epi64_mask(k1, a, b) simde_mm512_mask_cmpeq_epi64_mask(k1, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask32
|
||||
simde_mm512_cmpeq_epu16_mask (simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_cmpeq_epu16_mask(a, b);
|
||||
#else
|
||||
simde__m512i_private
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b);
|
||||
simde__mmask32 r;
|
||||
|
||||
#if defined(SIMDE_VECTOR_SUBSCRIPT_OPS)
|
||||
simde__m512i_private tmp;
|
||||
|
||||
tmp.u16 = HEDLEY_REINTERPRET_CAST(__typeof__(tmp.u16), a_.u16 == b_.u16);
|
||||
r = simde_mm512_movepi16_mask(simde__m512i_from_private(tmp));
|
||||
#else
|
||||
r = 0;
|
||||
|
||||
SIMDE_VECTORIZE_REDUCTION(|:r)
|
||||
for (size_t i = 0 ; i < (sizeof(a_.u16) / sizeof(a_.u16[0])) ; i++) {
|
||||
r |= (a_.u16[i] == b_.u16[i]) ? (UINT16_C(1) << i) : 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
return r;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_cmpeq_epu16_mask
|
||||
#define _mm512_cmpeq_epu16_mask(a, b) simde_mm512_cmpeq_epu16_mask((a), (b))
|
||||
#endif
|
||||
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask32
|
||||
simde_mm512_mask_cmpeq_epu16_mask(simde__mmask32 k1, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_mask_cmpeq_epu16_mask(k1, a, b);
|
||||
#else
|
||||
return k1 & simde_mm512_cmpeq_epu16_mask(a, b);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_cmpeq_epu16_mask
|
||||
#define _mm512_mask_cmpeq_epu16_mask(k1, a, b) simde_mm512_mask_cmpeq_epu16_mask(k1, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask16
|
||||
simde_mm512_cmpeq_ps_mask (simde__m512 a, simde__m512 b) {
|
||||
return simde_mm512_cmp_ps_mask(a, b, SIMDE_CMP_EQ_OQ);
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_cmpeq_ps_mask
|
||||
#define _mm512_cmpeq_ps_mask(a, b) simde_mm512_cmp_ps_mask(a, b, SIMDE_CMP_EQ_OQ)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask8
|
||||
simde_mm512_cmpeq_pd_mask (simde__m512d a, simde__m512d b) {
|
||||
return simde_mm512_cmp_pd_mask(a, b, SIMDE_CMP_EQ_OQ);
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_cmpeq_pd_mask
|
||||
#define _mm512_cmpeq_pd_mask(a, b) simde_mm512_cmp_pd_mask(a, b, SIMDE_CMP_EQ_OQ)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_CMPEQ_H) */
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,212 @@
|
||||
/* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Copyright:
|
||||
* 2020 Evan Nemerson <evan@nemerson.com>
|
||||
* 2020 Christopher Moore <moore@free.fr>
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512_CMPGT_H)
|
||||
#define SIMDE_X86_AVX512_CMPGT_H
|
||||
|
||||
#include "types.h"
|
||||
#include "../avx2.h"
|
||||
#include "mov.h"
|
||||
#include "mov_mask.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask64
|
||||
simde_mm512_cmpgt_epi8_mask (simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_cmpgt_epi8_mask(a, b);
|
||||
#else
|
||||
simde__m512i_private
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b);
|
||||
simde__mmask64 r;
|
||||
|
||||
#if SIMDE_NATURAL_VECTOR_SIZE_LE(256) && !defined(HEDLEY_INTEL_VERSION)
|
||||
r = 0;
|
||||
|
||||
SIMDE_VECTORIZE_REDUCTION(|:r)
|
||||
for (size_t i = 0 ; i < (sizeof(a_.m256i) / sizeof(a_.m256i[0])) ; i++) {
|
||||
const uint32_t t = HEDLEY_STATIC_CAST(uint32_t, simde_mm256_movemask_epi8(simde_mm256_cmpgt_epi8(a_.m256i[i], b_.m256i[i])));
|
||||
r |= HEDLEY_STATIC_CAST(uint64_t, t) << HEDLEY_STATIC_CAST(uint64_t, i * 32);
|
||||
}
|
||||
#elif defined(SIMDE_VECTOR_SUBSCRIPT_OPS)
|
||||
simde__m512i_private tmp;
|
||||
|
||||
tmp.i8 = HEDLEY_REINTERPRET_CAST(__typeof__(tmp.i8), a_.i8 > b_.i8);
|
||||
r = simde_mm512_movepi8_mask(simde__m512i_from_private(tmp));
|
||||
#else
|
||||
r = 0;
|
||||
|
||||
SIMDE_VECTORIZE_REDUCTION(|:r)
|
||||
for (size_t i = 0 ; i < (sizeof(a_.i8) / sizeof(a_.i8[0])) ; i++) {
|
||||
r |= (a_.i8[i] > b_.i8[i]) ? (UINT64_C(1) << i) : 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
return r;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_cmpgt_epi8_mask
|
||||
#define _mm512_cmpgt_epi8_mask(a, b) simde_mm512_cmpgt_epi8_mask(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask64
|
||||
simde_mm512_cmpgt_epu8_mask (simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_cmpgt_epu8_mask(a, b);
|
||||
#else
|
||||
simde__m512i_private
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b);
|
||||
simde__mmask64 r = 0;
|
||||
|
||||
#if defined(SIMDE_VECTOR_SUBSCRIPT_OPS)
|
||||
simde__m512i_private tmp;
|
||||
|
||||
tmp.i8 = HEDLEY_REINTERPRET_CAST(__typeof__(tmp.i8), a_.u8 > b_.u8);
|
||||
r = simde_mm512_movepi8_mask(simde__m512i_from_private(tmp));
|
||||
#else
|
||||
SIMDE_VECTORIZE_REDUCTION(|:r)
|
||||
for (size_t i = 0 ; i < (sizeof(a_.u8) / sizeof(a_.u8[0])) ; i++) {
|
||||
r |= (a_.u8[i] > b_.u8[i]) ? (UINT64_C(1) << i) : 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
return r;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_cmpgt_epu8_mask
|
||||
#define _mm512_cmpgt_epu8_mask(a, b) simde_mm512_cmpgt_epu8_mask(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask32
|
||||
simde_mm512_cmpgt_epi16_mask (simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_cmpgt_epi16_mask(a, b);
|
||||
#else
|
||||
simde__m512i_private
|
||||
r_,
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b);
|
||||
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m256i) / sizeof(r_.m256i[0])) ; i++) {
|
||||
r_.m256i[i] = simde_mm256_cmpgt_epi16(a_.m256i[i], b_.m256i[i]);
|
||||
}
|
||||
|
||||
return simde_mm512_movepi16_mask(simde__m512i_from_private(r_));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_cmpgt_epi16_mask
|
||||
#define _mm512_cmpgt_epi16_mask(a, b) simde_mm512_cmpgt_epi16_mask(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask16
|
||||
simde_mm512_cmpgt_epi32_mask (simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_cmpgt_epi32_mask(a, b);
|
||||
#else
|
||||
simde__m512i_private
|
||||
r_,
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b);
|
||||
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m256i) / sizeof(r_.m256i[0])) ; i++) {
|
||||
r_.m256i[i] = simde_mm256_cmpgt_epi32(a_.m256i[i], b_.m256i[i]);
|
||||
}
|
||||
|
||||
return simde_mm512_movepi32_mask(simde__m512i_from_private(r_));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_cmpgt_epi32_mask
|
||||
#define _mm512_cmpgt_epi32_mask(a, b) simde_mm512_cmpgt_epi32_mask(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask16
|
||||
simde_mm512_mask_cmpgt_epi32_mask (simde__mmask16 k1, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_cmpgt_epi32_mask(k1, a, b);
|
||||
#else
|
||||
return simde_mm512_cmpgt_epi32_mask(a, b) & k1;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_cmpgt_epi32_mask
|
||||
#define _mm512_mask_cmpgt_epi32_mask(k1, a, b) simde_mm512_mask_cmpgt_epi32_mask(k1, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask8
|
||||
simde_mm512_cmpgt_epi64_mask (simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_cmpgt_epi64_mask(a, b);
|
||||
#else
|
||||
simde__m512i_private
|
||||
r_,
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b);
|
||||
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m256i) / sizeof(r_.m256i[0])) ; i++) {
|
||||
r_.m256i[i] = simde_mm256_cmpgt_epi64(a_.m256i[i], b_.m256i[i]);
|
||||
}
|
||||
|
||||
return simde_mm512_movepi64_mask(simde__m512i_from_private(r_));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_cmpgt_epi64_mask
|
||||
#define _mm512_cmpgt_epi64_mask(a, b) simde_mm512_cmpgt_epi64_mask(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask8
|
||||
simde_mm512_mask_cmpgt_epi64_mask (simde__mmask8 k1, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_cmpgt_epi64_mask(k1, a, b);
|
||||
#else
|
||||
return simde_mm512_cmpgt_epi64_mask(a, b) & k1;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_cmpgt_epi64_mask
|
||||
#define _mm512_mask_cmpgt_epi64_mask(k1, a, b) simde_mm512_mask_cmpgt_epi64_mask(k1, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_CMPGT_H) */
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,123 @@
|
||||
/* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Copyright:
|
||||
* 2020 Evan Nemerson <evan@nemerson.com>
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512_CMPLT_H)
|
||||
#define SIMDE_X86_AVX512_CMPLT_H
|
||||
|
||||
#include "types.h"
|
||||
#include "mov.h"
|
||||
#include "cmp.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask16
|
||||
simde_mm512_cmplt_ps_mask (simde__m512 a, simde__m512 b) {
|
||||
return simde_mm512_cmp_ps_mask(a, b, SIMDE_CMP_LT_OQ);
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_cmplt_ps_mask
|
||||
#define _mm512_cmplt_ps_mask(a, b) simde_mm512_cmp_ps_mask(a, b, SIMDE_CMP_LT_OQ)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask8
|
||||
simde_mm512_cmplt_pd_mask (simde__m512d a, simde__m512d b) {
|
||||
return simde_mm512_cmp_pd_mask(a, b, SIMDE_CMP_LT_OQ);
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_cmplt_pd_mask
|
||||
#define _mm512_cmplt_pd_mask(a, b) simde_mm512_cmp_pd_mask(a, b, SIMDE_CMP_LT_OQ)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask64
|
||||
simde_mm512_cmplt_epi8_mask (simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_cmplt_epi8_mask(a, b);
|
||||
#else
|
||||
simde__m512i_private
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b);
|
||||
simde__mmask64 r = 0;
|
||||
|
||||
#if defined(SIMDE_VECTOR_SUBSCRIPT_OPS)
|
||||
simde__m512i_private tmp;
|
||||
|
||||
tmp.i8 = HEDLEY_REINTERPRET_CAST(__typeof__(tmp.i8), a_.i8 < b_.i8);
|
||||
r = simde_mm512_movepi8_mask(simde__m512i_from_private(tmp));
|
||||
#else
|
||||
SIMDE_VECTORIZE_REDUCTION(|:r)
|
||||
for (size_t i = 0 ; i < (sizeof(a_.i8) / sizeof(a_.i8[0])) ; i++) {
|
||||
r |= (a_.i8[i] < b_.i8[i]) ? (UINT64_C(1) << i) : 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
return r;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_cmplt_epi8_mask
|
||||
#define _mm512_cmplt_epi8_mask(a, b) simde_mm512_cmplt_epi8_mask(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask64
|
||||
simde_mm512_cmplt_epu8_mask (simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_cmplt_epu8_mask(a, b);
|
||||
#else
|
||||
simde__m512i_private
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b);
|
||||
simde__mmask64 r = 0;
|
||||
|
||||
#if defined(SIMDE_VECTOR_SUBSCRIPT_OPS)
|
||||
simde__m512i_private tmp;
|
||||
|
||||
tmp.i8 = HEDLEY_REINTERPRET_CAST(__typeof__(tmp.i8), a_.u8 < b_.u8);
|
||||
r = simde_mm512_movepi8_mask(simde__m512i_from_private(tmp));
|
||||
#else
|
||||
SIMDE_VECTORIZE_REDUCTION(|:r)
|
||||
for (size_t i = 0 ; i < (sizeof(a_.u8) / sizeof(a_.u8[0])) ; i++) {
|
||||
r |= (a_.u8[i] < b_.u8[i]) ? (UINT64_C(1) << i) : 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
return r;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_cmplt_epu8_mask
|
||||
#define _mm512_cmplt_epu8_mask(a, b) simde_mm512_cmplt_epu8_mask(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_CMPLT_H) */
|
||||
@@ -0,0 +1,490 @@
|
||||
/* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Copyright:
|
||||
* 2021 Evan Nemerson <evan@nemerson.com>
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512_CMPNEQ_H)
|
||||
#define SIMDE_X86_AVX512_CMPNEQ_H
|
||||
|
||||
#include "types.h"
|
||||
#include "../avx2.h"
|
||||
#include "mov.h"
|
||||
#include "mov_mask.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask16
|
||||
simde_mm_cmpneq_epi8_mask(simde__m128i a, simde__m128i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm_cmpneq_epi8_mask(a, b);
|
||||
#else
|
||||
return ~simde_mm_movepi8_mask(simde_mm_cmpeq_epi8(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) || defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_cmpneq_epi8_mask
|
||||
#define _mm_cmpneq_epi8_mask(a, b) simde_mm_cmpneq_epi8_mask((a), (b))
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask16
|
||||
simde_mm_mask_cmpneq_epi8_mask(simde__mmask16 k1, simde__m128i a, simde__m128i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm_mask_cmpneq_epi8_mask(k1, a, b);
|
||||
#else
|
||||
return simde_mm_cmpneq_epi8_mask(a, b) & k1;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) || defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_cmpneq_epi8_mask
|
||||
#define _mm_mask_cmpneq_epi8_mask(k1, a, b) simde_mm_mask_cmpneq_epi8_mask((k1), (a), (b))
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask16
|
||||
simde_mm_cmpneq_epu8_mask(simde__m128i a, simde__m128i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm_cmpneq_epu8_mask(a, b);
|
||||
#else
|
||||
return simde_mm_cmpneq_epi8_mask(a, b);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) || defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_cmpneq_epu8_mask
|
||||
#define _mm_cmpneq_epu8_mask(a, b) simde_mm_cmpneq_epu8_mask((a), (b))
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask16
|
||||
simde_mm_mask_cmpneq_epu8_mask(simde__mmask16 k1, simde__m128i a, simde__m128i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm_mask_cmpneq_epu8_mask(k1, a, b);
|
||||
#else
|
||||
return simde_mm_mask_cmpneq_epi8_mask(k1, a, b);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) || defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_cmpneq_epu8_mask
|
||||
#define _mm_mask_cmpneq_epu8_mask(k1, a, b) simde_mm_mask_cmpneq_epu8_mask((k1), (a), (b))
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask8
|
||||
simde_mm_cmpneq_epi16_mask(simde__m128i a, simde__m128i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm_cmpneq_epi16_mask(a, b);
|
||||
#else
|
||||
return ~simde_mm_movepi16_mask(simde_mm_cmpeq_epi16(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) || defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_cmpneq_epi16_mask
|
||||
#define _mm_cmpneq_epi16_mask(a, b) simde_mm_cmpneq_epi16_mask((a), (b))
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask8
|
||||
simde_mm_mask_cmpneq_epi16_mask(simde__mmask8 k1, simde__m128i a, simde__m128i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm_mask_cmpneq_epi16_mask(k1, a, b);
|
||||
#else
|
||||
return simde_mm_cmpneq_epi16_mask(a, b) & k1;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) || defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_cmpneq_epi16_mask
|
||||
#define _mm_mask_cmpneq_epi16_mask(k1, a, b) simde_mm_mask_cmpneq_epi16_mask((k1), (a), (b))
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask8
|
||||
simde_mm_cmpneq_epu16_mask(simde__m128i a, simde__m128i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm_cmpneq_epu16_mask(a, b);
|
||||
#else
|
||||
return simde_mm_cmpneq_epi16_mask(a, b);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) || defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_cmpneq_epu16_mask
|
||||
#define _mm_cmpneq_epu16_mask(a, b) simde_mm_cmpneq_epu16_mask((a), (b))
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask8
|
||||
simde_mm_mask_cmpneq_epu16_mask(simde__mmask8 k1, simde__m128i a, simde__m128i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm_mask_cmpneq_epu16_mask(k1, a, b);
|
||||
#else
|
||||
return simde_mm_mask_cmpneq_epi16_mask(k1, a, b);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) || defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_cmpneq_epu16_mask
|
||||
#define _mm_mask_cmpneq_epu16_mask(k1, a, b) simde_mm_mask_cmpneq_epu16_mask((k1), (a), (b))
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask8
|
||||
simde_mm_cmpneq_epi32_mask(simde__m128i a, simde__m128i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_cmpneq_epi32_mask(a, b);
|
||||
#else
|
||||
return (~simde_mm_movepi32_mask(simde_mm_cmpeq_epi32(a, b))) & 15;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_cmpneq_epi32_mask
|
||||
#define _mm_cmpneq_epi32_mask(a, b) simde_mm_cmpneq_epi32_mask((a), (b))
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask8
|
||||
simde_mm_mask_cmpneq_epi32_mask(simde__mmask8 k1, simde__m128i a, simde__m128i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_mask_cmpneq_epi32_mask(k1, a, b);
|
||||
#else
|
||||
return simde_mm_cmpneq_epi32_mask(a, b) & k1;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_cmpneq_epi32_mask
|
||||
#define _mm_mask_cmpneq_epi32_mask(k1, a, b) simde_mm_mask_cmpneq_epi32_mask((k1), (a), (b))
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask8
|
||||
simde_mm_cmpneq_epu32_mask(simde__m128i a, simde__m128i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_cmpneq_epu32_mask(a, b);
|
||||
#else
|
||||
return simde_mm_cmpneq_epi32_mask(a, b);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_cmpneq_epu32_mask
|
||||
#define _mm_cmpneq_epu32_mask(a, b) simde_mm_cmpneq_epu32_mask((a), (b))
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask8
|
||||
simde_mm_mask_cmpneq_epu32_mask(simde__mmask8 k1, simde__m128i a, simde__m128i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_mask_cmpneq_epu32_mask(k1, a, b);
|
||||
#else
|
||||
return simde_mm_mask_cmpneq_epi32_mask(k1, a, b);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_cmpneq_epu32_mask
|
||||
#define _mm_mask_cmpneq_epu32_mask(k1, a, b) simde_mm_mask_cmpneq_epu32_mask((k1), (a), (b))
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask8
|
||||
simde_mm_cmpneq_epi64_mask(simde__m128i a, simde__m128i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_cmpneq_epi64_mask(a, b);
|
||||
#else
|
||||
return (~simde_mm_movepi64_mask(simde_mm_cmpeq_epi64(a, b))) & 3;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_cmpneq_epi64_mask
|
||||
#define _mm_cmpneq_epi64_mask(a, b) simde_mm_cmpneq_epi64_mask((a), (b))
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask8
|
||||
simde_mm_mask_cmpneq_epi64_mask(simde__mmask8 k1, simde__m128i a, simde__m128i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_mask_cmpneq_epi64_mask(k1, a, b);
|
||||
#else
|
||||
return simde_mm_cmpneq_epi64_mask(a, b) & k1;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_cmpneq_epi64_mask
|
||||
#define _mm_mask_cmpneq_epi64_mask(k1, a, b) simde_mm_mask_cmpneq_epi64_mask((k1), (a), (b))
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask8
|
||||
simde_mm_cmpneq_epu64_mask(simde__m128i a, simde__m128i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_cmpneq_epu64_mask(a, b);
|
||||
#else
|
||||
return simde_mm_cmpneq_epi64_mask(a, b);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_cmpneq_epu64_mask
|
||||
#define _mm_cmpneq_epu64_mask(a, b) simde_mm_cmpneq_epu64_mask((a), (b))
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask8
|
||||
simde_mm_mask_cmpneq_epu64_mask(simde__mmask8 k1, simde__m128i a, simde__m128i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_mask_cmpneq_epu64_mask(k1, a, b);
|
||||
#else
|
||||
return simde_mm_mask_cmpneq_epi64_mask(k1, a, b);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_cmpneq_epu64_mask
|
||||
#define _mm_mask_cmpneq_epu64_mask(k1, a, b) simde_mm_mask_cmpneq_epu64_mask((k1), (a), (b))
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask32
|
||||
simde_mm256_cmpneq_epi8_mask(simde__m256i a, simde__m256i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm256_cmpneq_epi8_mask(a, b);
|
||||
#else
|
||||
return ~simde_mm256_movepi8_mask(simde_mm256_cmpeq_epi8(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) || defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_cmpneq_epi8_mask
|
||||
#define _mm256_cmpneq_epi8_mask(a, b) simde_mm256_cmpneq_epi8_mask((a), (b))
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask32
|
||||
simde_mm256_mask_cmpneq_epi8_mask(simde__mmask32 k1, simde__m256i a, simde__m256i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm256_mask_cmpneq_epi8_mask(k1, a, b);
|
||||
#else
|
||||
return simde_mm256_cmpneq_epi8_mask(a, b) & k1;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) || defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_mask_cmpneq_epi8_mask
|
||||
#define _mm256_mask_cmpneq_epi8_mask(k1, a, b) simde_mm256_mask_cmpneq_epi8_mask((k1), (a), (b))
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask32
|
||||
simde_mm256_cmpneq_epu8_mask(simde__m256i a, simde__m256i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm256_cmpneq_epu8_mask(a, b);
|
||||
#else
|
||||
return simde_mm256_cmpneq_epi8_mask(a, b);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) || defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_cmpneq_epu8_mask
|
||||
#define _mm256_cmpneq_epu8_mask(a, b) simde_mm256_cmpneq_epu8_mask((a), (b))
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask32
|
||||
simde_mm256_mask_cmpneq_epu8_mask(simde__mmask32 k1, simde__m256i a, simde__m256i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm256_mask_cmpneq_epu8_mask(k1, a, b);
|
||||
#else
|
||||
return simde_mm256_mask_cmpneq_epi8_mask(k1, a, b);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) || defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_mask_cmpneq_epu8_mask
|
||||
#define _mm256_mask_cmpneq_epu8_mask(k1, a, b) simde_mm256_mask_cmpneq_epu8_mask((k1), (a), (b))
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask16
|
||||
simde_mm256_cmpneq_epi16_mask(simde__m256i a, simde__m256i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm256_cmpneq_epi16_mask(a, b);
|
||||
#else
|
||||
return ~simde_mm256_movepi16_mask(simde_mm256_cmpeq_epi16(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) || defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_cmpneq_epi16_mask
|
||||
#define _mm256_cmpneq_epi16_mask(a, b) simde_mm256_cmpneq_epi16_mask((a), (b))
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask16
|
||||
simde_mm256_mask_cmpneq_epi16_mask(simde__mmask16 k1, simde__m256i a, simde__m256i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm256_mask_cmpneq_epi16_mask(k1, a, b);
|
||||
#else
|
||||
return simde_mm256_cmpneq_epi16_mask(a, b) & k1;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) || defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_mask_cmpneq_epi16_mask
|
||||
#define _mm256_mask_cmpneq_epi16_mask(k1, a, b) simde_mm256_mask_cmpneq_epi16_mask((k1), (a), (b))
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask16
|
||||
simde_mm256_cmpneq_epu16_mask(simde__m256i a, simde__m256i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm256_cmpneq_epu16_mask(a, b);
|
||||
#else
|
||||
return simde_mm256_cmpneq_epi16_mask(a, b);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) || defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_cmpneq_epu16_mask
|
||||
#define _mm256_cmpneq_epu16_mask(a, b) simde_mm256_cmpneq_epu16_mask((a), (b))
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask16
|
||||
simde_mm256_mask_cmpneq_epu16_mask(simde__mmask16 k1, simde__m256i a, simde__m256i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm256_mask_cmpneq_epu16_mask(k1, a, b);
|
||||
#else
|
||||
return simde_mm256_mask_cmpneq_epi16_mask(k1, a, b);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) || defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_mask_cmpneq_epu16_mask
|
||||
#define _mm256_mask_cmpneq_epu16_mask(k1, a, b) simde_mm256_mask_cmpneq_epu16_mask((k1), (a), (b))
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask8
|
||||
simde_mm256_cmpneq_epi32_mask(simde__m256i a, simde__m256i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_cmpneq_epi32_mask(a, b);
|
||||
#else
|
||||
return (~simde_mm256_movepi32_mask(simde_mm256_cmpeq_epi32(a, b)));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_cmpneq_epi32_mask
|
||||
#define _mm256_cmpneq_epi32_mask(a, b) simde_mm256_cmpneq_epi32_mask((a), (b))
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask8
|
||||
simde_mm256_mask_cmpneq_epi32_mask(simde__mmask8 k1, simde__m256i a, simde__m256i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_mask_cmpneq_epi32_mask(k1, a, b);
|
||||
#else
|
||||
return simde_mm256_cmpneq_epi32_mask(a, b) & k1;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_mask_cmpneq_epi32_mask
|
||||
#define _mm256_mask_cmpneq_epi32_mask(k1, a, b) simde_mm256_mask_cmpneq_epi32_mask((k1), (a), (b))
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask8
|
||||
simde_mm256_cmpneq_epu32_mask(simde__m256i a, simde__m256i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_cmpneq_epu32_mask(a, b);
|
||||
#else
|
||||
return simde_mm256_cmpneq_epi32_mask(a, b);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_cmpneq_epu32_mask
|
||||
#define _mm256_cmpneq_epu32_mask(a, b) simde_mm256_cmpneq_epu32_mask((a), (b))
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask8
|
||||
simde_mm256_mask_cmpneq_epu32_mask(simde__mmask8 k1, simde__m256i a, simde__m256i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_mask_cmpneq_epu32_mask(k1, a, b);
|
||||
#else
|
||||
return simde_mm256_mask_cmpneq_epi32_mask(k1, a, b);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_mask_cmpneq_epu32_mask
|
||||
#define _mm256_mask_cmpneq_epu32_mask(k1, a, b) simde_mm256_mask_cmpneq_epu32_mask((k1), (a), (b))
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask8
|
||||
simde_mm256_cmpneq_epi64_mask(simde__m256i a, simde__m256i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_cmpneq_epi64_mask(a, b);
|
||||
#else
|
||||
return (~simde_mm256_movepi64_mask(simde_mm256_cmpeq_epi64(a, b))) & 15;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_cmpneq_epi64_mask
|
||||
#define _mm256_cmpneq_epi64_mask(a, b) simde_mm256_cmpneq_epi64_mask((a), (b))
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask8
|
||||
simde_mm256_mask_cmpneq_epi64_mask(simde__mmask8 k1, simde__m256i a, simde__m256i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_mask_cmpneq_epi64_mask(k1, a, b);
|
||||
#else
|
||||
return simde_mm256_cmpneq_epi64_mask(a, b) & k1;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_mask_cmpneq_epi64_mask
|
||||
#define _mm256_mask_cmpneq_epi64_mask(k1, a, b) simde_mm256_mask_cmpneq_epi64_mask((k1), (a), (b))
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask8
|
||||
simde_mm256_cmpneq_epu64_mask(simde__m256i a, simde__m256i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_cmpneq_epu64_mask(a, b);
|
||||
#else
|
||||
return simde_mm256_cmpneq_epi64_mask(a, b);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_cmpneq_epu64_mask
|
||||
#define _mm256_cmpneq_epu64_mask(a, b) simde_mm256_cmpneq_epu64_mask((a), (b))
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask8
|
||||
simde_mm256_mask_cmpneq_epu64_mask(simde__mmask8 k1, simde__m256i a, simde__m256i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_mask_cmpneq_epu64_mask(k1, a, b);
|
||||
#else
|
||||
return simde_mm256_mask_cmpneq_epi64_mask(k1, a, b);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_mask_cmpneq_epu64_mask
|
||||
#define _mm256_mask_cmpneq_epu64_mask(k1, a, b) simde_mm256_mask_cmpneq_epu64_mask((k1), (a), (b))
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_CMPNEQ_H) */
|
||||
@@ -0,0 +1,755 @@
|
||||
#if !defined(SIMDE_X86_AVX512_COMPRESS_H)
|
||||
#define SIMDE_X86_AVX512_COMPRESS_H
|
||||
|
||||
#include "types.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256d
|
||||
simde_mm256_mask_compress_pd (simde__m256d src, simde__mmask8 k, simde__m256d a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm256_mask_compress_pd(src, k, a);
|
||||
#else
|
||||
simde__m256d_private
|
||||
a_ = simde__m256d_to_private(a),
|
||||
src_ = simde__m256d_to_private(src);
|
||||
size_t ri = 0;
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(a_.f64) / sizeof(a_.f64[0])) ; i++) {
|
||||
if ((k >> i) & 1) {
|
||||
a_.f64[ri++] = a_.f64[i];
|
||||
}
|
||||
}
|
||||
|
||||
for ( ; ri < (sizeof(a_.f64) / sizeof(a_.f64[0])) ; ri++) {
|
||||
a_.f64[ri] = src_.f64[ri];
|
||||
}
|
||||
|
||||
return simde__m256d_from_private(a_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_mask_compress_pd
|
||||
#define _mm256_mask_compress_pd(src, k, a) simde_mm256_mask_compress_pd(src, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
void
|
||||
simde_mm256_mask_compressstoreu_pd (void* base_addr, simde__mmask8 k, simde__m256d a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512F_NATIVE) && !defined(__znver4__)
|
||||
_mm256_mask_compressstoreu_pd(base_addr, k, a);
|
||||
#elif defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512F_NATIVE) && defined(__znver4__)
|
||||
simde__mmask8 store_mask = _pext_u32(-1, k);
|
||||
_mm256_mask_storeu_pd(base_addr, store_mask, _mm256_maskz_compress_pd(k, a));
|
||||
#else
|
||||
simde__m256d_private
|
||||
a_ = simde__m256d_to_private(a);
|
||||
size_t ri = 0;
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(a_.f64) / sizeof(a_.f64[0])) ; i++) {
|
||||
if ((k >> i) & 1) {
|
||||
a_.f64[ri++] = a_.f64[i];
|
||||
}
|
||||
}
|
||||
|
||||
simde_memcpy(base_addr, &a_, ri * sizeof(a_.f64[0]));
|
||||
|
||||
return;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_mask_compressstoreu_pd
|
||||
#define _mm256_mask_compressstoreu_pd(base_addr, k, a) simde_mm256_mask_compressstoreu_pd(base_addr, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256d
|
||||
simde_mm256_maskz_compress_pd (simde__mmask8 k, simde__m256d a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm256_maskz_compress_pd(k, a);
|
||||
#else
|
||||
simde__m256d_private
|
||||
a_ = simde__m256d_to_private(a);
|
||||
size_t ri = 0;
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(a_.f64) / sizeof(a_.f64[0])) ; i++) {
|
||||
if ((k >> i) & 1) {
|
||||
a_.f64[ri++] = a_.f64[i];
|
||||
}
|
||||
}
|
||||
|
||||
for ( ; ri < (sizeof(a_.f64) / sizeof(a_.f64[0])); ri++) {
|
||||
a_.f64[ri] = SIMDE_FLOAT64_C(0.0);
|
||||
}
|
||||
|
||||
return simde__m256d_from_private(a_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_maskz_compress_pd
|
||||
#define _mm256_maskz_compress_pd(k, a) simde_mm256_maskz_compress_pd(k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256
|
||||
simde_mm256_mask_compress_ps (simde__m256 src, simde__mmask8 k, simde__m256 a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm256_mask_compress_ps(src, k, a);
|
||||
#else
|
||||
simde__m256_private
|
||||
a_ = simde__m256_to_private(a),
|
||||
src_ = simde__m256_to_private(src);
|
||||
size_t ri = 0;
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(a_.f32) / sizeof(a_.f32[0])) ; i++) {
|
||||
if ((k >> i) & 1) {
|
||||
a_.f32[ri++] = a_.f32[i];
|
||||
}
|
||||
}
|
||||
|
||||
for ( ; ri < (sizeof(a_.f32) / sizeof(a_.f32[0])) ; ri++) {
|
||||
a_.f32[ri] = src_.f32[ri];
|
||||
}
|
||||
|
||||
return simde__m256_from_private(a_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_mask_compress_ps
|
||||
#define _mm256_mask_compress_ps(src, k, a) simde_mm256_mask_compress_ps(src, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
void
|
||||
simde_mm256_mask_compressstoreu_ps (void* base_addr, simde__mmask8 k, simde__m256 a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512F_NATIVE) && !defined(__znver4__)
|
||||
_mm256_mask_compressstoreu_ps(base_addr, k, a);
|
||||
#elif defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512F_NATIVE) && defined(__znver4__)
|
||||
simde__mmask8 store_mask = _pext_u32(-1, k);
|
||||
_mm256_mask_storeu_ps(base_addr, store_mask, _mm256_maskz_compress_ps(k, a));
|
||||
#else
|
||||
simde__m256_private
|
||||
a_ = simde__m256_to_private(a);
|
||||
size_t ri = 0;
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(a_.f32) / sizeof(a_.f32[0])) ; i++) {
|
||||
if ((k >> i) & 1) {
|
||||
a_.f32[ri++] = a_.f32[i];
|
||||
}
|
||||
}
|
||||
|
||||
simde_memcpy(base_addr, &a_, ri * sizeof(a_.f32[0]));
|
||||
|
||||
return;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_mask_compressstoreu_ps
|
||||
#define _mm256_mask_compressstoreu_ps(base_addr, k, a) simde_mm256_mask_compressstoreu_ps(base_addr, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256
|
||||
simde_mm256_maskz_compress_ps (simde__mmask8 k, simde__m256 a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm256_maskz_compress_ps(k, a);
|
||||
#else
|
||||
simde__m256_private
|
||||
a_ = simde__m256_to_private(a);
|
||||
size_t ri = 0;
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(a_.f32) / sizeof(a_.f32[0])) ; i++) {
|
||||
if ((k >> i) & 1) {
|
||||
a_.f32[ri++] = a_.f32[i];
|
||||
}
|
||||
}
|
||||
|
||||
for ( ; ri < (sizeof(a_.f32) / sizeof(a_.f32[0])); ri++) {
|
||||
a_.f32[ri] = SIMDE_FLOAT32_C(0.0);
|
||||
}
|
||||
|
||||
return simde__m256_from_private(a_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_maskz_compress_ps
|
||||
#define _mm256_maskz_compress_ps(k, a) simde_mm256_maskz_compress_ps(k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_mask_compress_epi32 (simde__m256i src, simde__mmask8 k, simde__m256i a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm256_mask_compress_epi32(src, k, a);
|
||||
#else
|
||||
simde__m256i_private
|
||||
a_ = simde__m256i_to_private(a),
|
||||
src_ = simde__m256i_to_private(src);
|
||||
size_t ri = 0;
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(a_.i32) / sizeof(a_.i32[0])) ; i++) {
|
||||
if ((k >> i) & 1) {
|
||||
a_.i32[ri++] = a_.i32[i];
|
||||
}
|
||||
}
|
||||
|
||||
for ( ; ri < (sizeof(a_.i32) / sizeof(a_.i32[0])) ; ri++) {
|
||||
a_.i32[ri] = src_.i32[ri];
|
||||
}
|
||||
|
||||
return simde__m256i_from_private(a_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_mask_compress_epi32
|
||||
#define _mm256_mask_compress_epi32(src, k, a) simde_mm256_mask_compress_epi32(src, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
void
|
||||
simde_mm256_mask_compressstoreu_epi32 (void* base_addr, simde__mmask8 k, simde__m256i a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512F_NATIVE) && !defined(__znver4__)
|
||||
_mm256_mask_compressstoreu_epi32(base_addr, k, a);
|
||||
#elif defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512F_NATIVE) && defined(__znver4__)
|
||||
simde__mmask8 store_mask = _pext_u32(-1, k);
|
||||
_mm256_mask_storeu_epi32(base_addr, store_mask, _mm256_maskz_compress_epi32(k, a));
|
||||
#else
|
||||
simde__m256i_private
|
||||
a_ = simde__m256i_to_private(a);
|
||||
size_t ri = 0;
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(a_.i32) / sizeof(a_.i32[0])) ; i++) {
|
||||
if ((k >> i) & 1) {
|
||||
a_.i32[ri++] = a_.i32[i];
|
||||
}
|
||||
}
|
||||
|
||||
simde_memcpy(base_addr, &a_, ri * sizeof(a_.i32[0]));
|
||||
|
||||
return;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_mask_compressstoreu_epi32
|
||||
#define _mm256_mask_compressstoreu_epi32(base_addr, k, a) simde_mm256_mask_compressstoreu_epi32(base_addr, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_maskz_compress_epi32 (simde__mmask8 k, simde__m256i a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm256_maskz_compress_epi32(k, a);
|
||||
#else
|
||||
simde__m256i_private
|
||||
a_ = simde__m256i_to_private(a);
|
||||
size_t ri = 0;
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(a_.i32) / sizeof(a_.i32[0])) ; i++) {
|
||||
if ((k >> i) & 1) {
|
||||
a_.i32[ri++] = a_.i32[i];
|
||||
}
|
||||
}
|
||||
|
||||
for ( ; ri < (sizeof(a_.i32) / sizeof(a_.i32[0])); ri++) {
|
||||
a_.f32[ri] = INT32_C(0);
|
||||
}
|
||||
|
||||
return simde__m256i_from_private(a_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_maskz_compress_epi32
|
||||
#define _mm256_maskz_compress_epi32(k, a) simde_mm256_maskz_compress_epi32(k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_mask_compress_epi64 (simde__m256i src, simde__mmask8 k, simde__m256i a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm256_mask_compress_epi64(src, k, a);
|
||||
#else
|
||||
simde__m256i_private
|
||||
a_ = simde__m256i_to_private(a),
|
||||
src_ = simde__m256i_to_private(src);
|
||||
size_t ri = 0;
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(a_.i64) / sizeof(a_.i64[0])) ; i++) {
|
||||
if ((k >> i) & 1) {
|
||||
a_.i64[ri++] = a_.i64[i];
|
||||
}
|
||||
}
|
||||
|
||||
for ( ; ri < (sizeof(a_.i64) / sizeof(a_.i64[0])) ; ri++) {
|
||||
a_.i64[ri] = src_.i64[ri];
|
||||
}
|
||||
|
||||
return simde__m256i_from_private(a_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_mask_compress_epi64
|
||||
#define _mm256_mask_compress_epi64(src, k, a) simde_mm256_mask_compress_epi64(src, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
void
|
||||
simde_mm256_mask_compressstoreu_epi64 (void* base_addr, simde__mmask8 k, simde__m256i a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512F_NATIVE) && !defined(__znver4__)
|
||||
_mm256_mask_compressstoreu_epi64(base_addr, k, a);
|
||||
#elif defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512F_NATIVE) && defined(__znver4__)
|
||||
simde__mmask8 store_mask = _pext_u32(-1, k);
|
||||
_mm256_mask_storeu_epi64(base_addr, store_mask, _mm256_maskz_compress_epi64(k, a));
|
||||
#else
|
||||
simde__m256i_private
|
||||
a_ = simde__m256i_to_private(a);
|
||||
size_t ri = 0;
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(a_.i64) / sizeof(a_.i64[0])) ; i++) {
|
||||
if ((k >> i) & 1) {
|
||||
a_.i64[ri++] = a_.i64[i];
|
||||
}
|
||||
}
|
||||
|
||||
simde_memcpy(base_addr, &a_, ri * sizeof(a_.i64[0]));
|
||||
|
||||
return;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_mask_compressstoreu_epi64
|
||||
#define _mm256_mask_compressstoreu_epi64(base_addr, k, a) simde_mm256_mask_compressstoreu_epi64(base_addr, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_maskz_compress_epi64 (simde__mmask8 k, simde__m256i a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm256_maskz_compress_epi64(k, a);
|
||||
#else
|
||||
simde__m256i_private
|
||||
a_ = simde__m256i_to_private(a);
|
||||
size_t ri = 0;
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(a_.i64) / sizeof(a_.i64[0])) ; i++) {
|
||||
if ((k >> i) & 1) {
|
||||
a_.i64[ri++] = a_.i64[i];
|
||||
}
|
||||
}
|
||||
|
||||
for ( ; ri < (sizeof(a_.i64) / sizeof(a_.i64[0])); ri++) {
|
||||
a_.i64[ri] = INT64_C(0);
|
||||
}
|
||||
|
||||
return simde__m256i_from_private(a_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_maskz_compress_epi64
|
||||
#define _mm256_maskz_compress_epi64(k, a) simde_mm256_maskz_compress_epi64(k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_mask_compress_pd (simde__m512d src, simde__mmask8 k, simde__m512d a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_compress_pd(src, k, a);
|
||||
#else
|
||||
simde__m512d_private
|
||||
a_ = simde__m512d_to_private(a),
|
||||
src_ = simde__m512d_to_private(src);
|
||||
size_t ri = 0;
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(a_.f64) / sizeof(a_.f64[0])) ; i++) {
|
||||
if ((k >> i) & 1) {
|
||||
a_.f64[ri++] = a_.f64[i];
|
||||
}
|
||||
}
|
||||
|
||||
for ( ; ri < (sizeof(a_.f64) / sizeof(a_.f64[0])) ; ri++) {
|
||||
a_.f64[ri] = src_.f64[ri];
|
||||
}
|
||||
|
||||
return simde__m512d_from_private(a_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_compress_pd
|
||||
#define _mm512_mask_compress_pd(src, k, a) simde_mm512_mask_compress_pd(src, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
void
|
||||
simde_mm512_mask_compressstoreu_pd (void* base_addr, simde__mmask8 k, simde__m512d a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512F_NATIVE) && !defined(__znver4__)
|
||||
_mm512_mask_compressstoreu_pd(base_addr, k, a);
|
||||
#elif defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512F_NATIVE) && defined(__znver4__)
|
||||
simde__mmask8 store_mask = _pext_u32(-1, k);
|
||||
_mm512_mask_storeu_pd(base_addr, store_mask, _mm512_maskz_compress_pd(k, a));
|
||||
#else
|
||||
simde__m512d_private
|
||||
a_ = simde__m512d_to_private(a);
|
||||
size_t ri = 0;
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(a_.f64) / sizeof(a_.f64[0])) ; i++) {
|
||||
if ((k >> i) & 1) {
|
||||
a_.f64[ri++] = a_.f64[i];
|
||||
}
|
||||
}
|
||||
|
||||
simde_memcpy(base_addr, &a_, ri * sizeof(a_.f64[0]));
|
||||
|
||||
return;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_compressstoreu_pd
|
||||
#define _mm512_mask_compressstoreu_pd(base_addr, k, a) simde_mm512_mask_compressstoreu_pd(base_addr, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_maskz_compress_pd (simde__mmask8 k, simde__m512d a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_maskz_compress_pd(k, a);
|
||||
#else
|
||||
simde__m512d_private
|
||||
a_ = simde__m512d_to_private(a);
|
||||
size_t ri = 0;
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(a_.f64) / sizeof(a_.f64[0])) ; i++) {
|
||||
if ((k >> i) & 1) {
|
||||
a_.f64[ri++] = a_.f64[i];
|
||||
}
|
||||
}
|
||||
|
||||
for ( ; ri < (sizeof(a_.f64) / sizeof(a_.f64[0])); ri++) {
|
||||
a_.f64[ri] = SIMDE_FLOAT64_C(0.0);
|
||||
}
|
||||
|
||||
return simde__m512d_from_private(a_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_compress_pd
|
||||
#define _mm512_maskz_compress_pd(k, a) simde_mm512_maskz_compress_pd(k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_mask_compress_ps (simde__m512 src, simde__mmask16 k, simde__m512 a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_compress_ps(src, k, a);
|
||||
#else
|
||||
simde__m512_private
|
||||
a_ = simde__m512_to_private(a),
|
||||
src_ = simde__m512_to_private(src);
|
||||
size_t ri = 0;
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(a_.f32) / sizeof(a_.f32[0])) ; i++) {
|
||||
if ((k >> i) & 1) {
|
||||
a_.f32[ri++] = a_.f32[i];
|
||||
}
|
||||
}
|
||||
|
||||
for ( ; ri < (sizeof(a_.f32) / sizeof(a_.f32[0])) ; ri++) {
|
||||
a_.f32[ri] = src_.f32[ri];
|
||||
}
|
||||
|
||||
return simde__m512_from_private(a_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_compress_ps
|
||||
#define _mm512_mask_compress_ps(src, k, a) simde_mm512_mask_compress_ps(src, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
void
|
||||
simde_mm512_mask_compressstoreu_ps (void* base_addr, simde__mmask16 k, simde__m512 a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512F_NATIVE) && !defined(__znver4__)
|
||||
_mm512_mask_compressstoreu_ps(base_addr, k, a);
|
||||
#elif defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512F_NATIVE) && defined(__znver4__)
|
||||
simde__mmask16 store_mask = _pext_u32(-1, k);
|
||||
_mm512_mask_storeu_ps(base_addr, store_mask, _mm512_maskz_compress_ps(k, a));
|
||||
#else
|
||||
simde__m512_private
|
||||
a_ = simde__m512_to_private(a);
|
||||
size_t ri = 0;
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(a_.f32) / sizeof(a_.f32[0])) ; i++) {
|
||||
if ((k >> i) & 1) {
|
||||
a_.f32[ri++] = a_.f32[i];
|
||||
}
|
||||
}
|
||||
|
||||
simde_memcpy(base_addr, &a_, ri * sizeof(a_.f32[0]));
|
||||
|
||||
return;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_compressstoreu_ps
|
||||
#define _mm512_mask_compressstoreu_ps(base_addr, k, a) simde_mm512_mask_compressstoreu_ps(base_addr, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_maskz_compress_ps (simde__mmask16 k, simde__m512 a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_maskz_compress_ps(k, a);
|
||||
#else
|
||||
simde__m512_private
|
||||
a_ = simde__m512_to_private(a);
|
||||
size_t ri = 0;
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(a_.f32) / sizeof(a_.f32[0])) ; i++) {
|
||||
if ((k >> i) & 1) {
|
||||
a_.f32[ri++] = a_.f32[i];
|
||||
}
|
||||
}
|
||||
|
||||
for ( ; ri < (sizeof(a_.f32) / sizeof(a_.f32[0])); ri++) {
|
||||
a_.f32[ri] = SIMDE_FLOAT32_C(0.0);
|
||||
}
|
||||
|
||||
return simde__m512_from_private(a_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_compress_ps
|
||||
#define _mm512_maskz_compress_ps(k, a) simde_mm512_maskz_compress_ps(k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_compress_epi32 (simde__m512i src, simde__mmask16 k, simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_compress_epi32(src, k, a);
|
||||
#else
|
||||
simde__m512i_private
|
||||
a_ = simde__m512i_to_private(a),
|
||||
src_ = simde__m512i_to_private(src);
|
||||
size_t ri = 0;
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(a_.i32) / sizeof(a_.i32[0])) ; i++) {
|
||||
if ((k >> i) & 1) {
|
||||
a_.i32[ri++] = a_.i32[i];
|
||||
}
|
||||
}
|
||||
|
||||
for ( ; ri < (sizeof(a_.i32) / sizeof(a_.i32[0])) ; ri++) {
|
||||
a_.i32[ri] = src_.i32[ri];
|
||||
}
|
||||
|
||||
return simde__m512i_from_private(a_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_compress_epi32
|
||||
#define _mm512_mask_compress_epi32(src, k, a) simde_mm512_mask_compress_epi32(src, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
void
|
||||
simde_mm512_mask_compressstoreu_epi16 (void* base_addr, simde__mmask32 k, simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512VBMI2_NATIVE) && !defined(__znver4__)
|
||||
_mm512_mask_compressstoreu_epi16(base_addr, k, a);
|
||||
#elif defined(SIMDE_X86_AVX512VBMI2_NATIVE) && defined(__znver4__)
|
||||
simde__mmask32 store_mask = _pext_u32(-1, k);
|
||||
_mm512_mask_storeu_epi16(base_addr, store_mask, _mm512_maskz_compress_epi16(k, a));
|
||||
#else
|
||||
simde__m512i_private
|
||||
a_ = simde__m512i_to_private(a);
|
||||
size_t ri = 0;
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(a_.i16) / sizeof(a_.i16[0])) ; i++) {
|
||||
if ((k >> i) & 1) {
|
||||
a_.i16[ri++] = a_.i16[i];
|
||||
}
|
||||
}
|
||||
|
||||
simde_memcpy(base_addr, &a_, ri * sizeof(a_.i16[0]));
|
||||
|
||||
return;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VBMI2_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_compressstoreu_epi16
|
||||
#define _mm512_mask_compressstoreu_epi16(base_addr, k, a) simde_mm512_mask_compressstoreu_epi16(base_addr, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
void
|
||||
simde_mm512_mask_compressstoreu_epi32 (void* base_addr, simde__mmask16 k, simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512F_NATIVE) && !defined(__znver4__)
|
||||
_mm512_mask_compressstoreu_epi32(base_addr, k, a);
|
||||
#elif defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512F_NATIVE) && defined(__znver4__)
|
||||
simde__mmask16 store_mask = _pext_u32(-1, k);
|
||||
_mm512_mask_storeu_epi32(base_addr, store_mask, _mm512_maskz_compress_epi32(k, a));
|
||||
#else
|
||||
simde__m512i_private
|
||||
a_ = simde__m512i_to_private(a);
|
||||
size_t ri = 0;
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(a_.i32) / sizeof(a_.i32[0])) ; i++) {
|
||||
if ((k >> i) & 1) {
|
||||
a_.i32[ri++] = a_.i32[i];
|
||||
}
|
||||
}
|
||||
|
||||
simde_memcpy(base_addr, &a_, ri * sizeof(a_.i32[0]));
|
||||
|
||||
return;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_compressstoreu_epi32
|
||||
#define _mm512_mask_compressstoreu_epi32(base_addr, k, a) simde_mm512_mask_compressstoreu_epi32(base_addr, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_compress_epi32 (simde__mmask16 k, simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_maskz_compress_epi32(k, a);
|
||||
#else
|
||||
simde__m512i_private
|
||||
a_ = simde__m512i_to_private(a);
|
||||
size_t ri = 0;
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(a_.i32) / sizeof(a_.i32[0])) ; i++) {
|
||||
if ((k >> i) & 1) {
|
||||
a_.i32[ri++] = a_.i32[i];
|
||||
}
|
||||
}
|
||||
|
||||
for ( ; ri < (sizeof(a_.i32) / sizeof(a_.i32[0])); ri++) {
|
||||
a_.f32[ri] = INT32_C(0);
|
||||
}
|
||||
|
||||
return simde__m512i_from_private(a_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_compress_epi32
|
||||
#define _mm512_maskz_compress_epi32(k, a) simde_mm512_maskz_compress_epi32(k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_compress_epi64 (simde__m512i src, simde__mmask8 k, simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_compress_epi64(src, k, a);
|
||||
#else
|
||||
simde__m512i_private
|
||||
a_ = simde__m512i_to_private(a),
|
||||
src_ = simde__m512i_to_private(src);
|
||||
size_t ri = 0;
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(a_.i64) / sizeof(a_.i64[0])) ; i++) {
|
||||
if ((k >> i) & 1) {
|
||||
a_.i64[ri++] = a_.i64[i];
|
||||
}
|
||||
}
|
||||
|
||||
for ( ; ri < (sizeof(a_.i64) / sizeof(a_.i64[0])) ; ri++) {
|
||||
a_.i64[ri] = src_.i64[ri];
|
||||
}
|
||||
|
||||
return simde__m512i_from_private(a_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_compress_epi64
|
||||
#define _mm512_mask_compress_epi64(src, k, a) simde_mm512_mask_compress_epi64(src, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
void
|
||||
simde_mm512_mask_compressstoreu_epi64 (void* base_addr, simde__mmask8 k, simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512F_NATIVE) && !defined(__znver4__)
|
||||
_mm512_mask_compressstoreu_epi64(base_addr, k, a);
|
||||
#elif defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512F_NATIVE) && defined(__znver4__)
|
||||
simde__mmask8 store_mask = _pext_u32(-1, k);
|
||||
_mm512_mask_storeu_epi64(base_addr, store_mask, _mm512_maskz_compress_epi64(k, a));
|
||||
#else
|
||||
simde__m512i_private
|
||||
a_ = simde__m512i_to_private(a);
|
||||
size_t ri = 0;
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(a_.i64) / sizeof(a_.i64[0])) ; i++) {
|
||||
if ((k >> i) & 1) {
|
||||
a_.i64[ri++] = a_.i64[i];
|
||||
}
|
||||
}
|
||||
|
||||
simde_memcpy(base_addr, &a_, ri * sizeof(a_.i64[0]));
|
||||
|
||||
return;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_compressstoreu_epi64
|
||||
#define _mm512_mask_compressstoreu_epi64(base_addr, k, a) simde_mm512_mask_compressstoreu_epi64(base_addr, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_compress_epi64 (simde__mmask8 k, simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_maskz_compress_epi64(k, a);
|
||||
#else
|
||||
simde__m512i_private
|
||||
a_ = simde__m512i_to_private(a);
|
||||
size_t ri = 0;
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(a_.i64) / sizeof(a_.i64[0])) ; i++) {
|
||||
if ((k >> i) & 1) {
|
||||
a_.i64[ri++] = a_.i64[i];
|
||||
}
|
||||
}
|
||||
|
||||
for ( ; ri < (sizeof(a_.i64) / sizeof(a_.i64[0])); ri++) {
|
||||
a_.i64[ri] = INT64_C(0);
|
||||
}
|
||||
|
||||
return simde__m512i_from_private(a_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_compress_epi64
|
||||
#define _mm512_maskz_compress_epi64(k, a) simde_mm512_maskz_compress_epi64(k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_COMPRESS_H) */
|
||||
@@ -0,0 +1,351 @@
|
||||
#if !defined(SIMDE_X86_AVX512_CONFLICT_H)
|
||||
#define SIMDE_X86_AVX512_CONFLICT_H
|
||||
|
||||
#include "types.h"
|
||||
#include "mov_mask.h"
|
||||
#include "mov.h"
|
||||
#include "cmpeq.h"
|
||||
#include "set1.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_conflict_epi32 (simde__m128i a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512CD_NATIVE)
|
||||
return _mm_conflict_epi32(a);
|
||||
#else
|
||||
simde__m128i_private
|
||||
r_ = simde__m128i_to_private(simde_mm_setzero_si128()),
|
||||
a_ = simde__m128i_to_private(a);
|
||||
|
||||
for (size_t i = 1 ; i < (sizeof(r_.i32) / sizeof(r_.i32[0])) ; i++) {
|
||||
r_.i32[i] =
|
||||
simde_mm_movemask_ps(
|
||||
simde_mm_castsi128_ps(
|
||||
simde_mm_cmpeq_epi32(simde_mm_set1_epi32(a_.i32[i]), a)
|
||||
)
|
||||
) & ((1 << i) - 1);
|
||||
}
|
||||
|
||||
return simde__m128i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512CD_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_conflict_epi32
|
||||
#define _mm_conflict_epi32(a) simde_mm_conflict_epi32(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_mask_conflict_epi32 (simde__m128i src, simde__mmask8 k, simde__m128i a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512CD_NATIVE)
|
||||
return _mm_mask_conflict_epi32(src, k, a);
|
||||
#else
|
||||
return simde_mm_mask_mov_epi32(src, k, simde_mm_conflict_epi32(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512CD_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_conflict_epi32
|
||||
#define _mm_mask_conflict_epi32(src, k, a) simde_mm_mask_conflict_epi32(src, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_maskz_conflict_epi32 (simde__mmask8 k, simde__m128i a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512CD_NATIVE)
|
||||
return _mm_maskz_conflict_epi32(k, a);
|
||||
#else
|
||||
return simde_mm_maskz_mov_epi32(k, simde_mm_conflict_epi32(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512CD_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_maskz_conflict_epi32
|
||||
#define _mm_maskz_conflict_epi32(k, a) simde_mm_maskz_conflict_epi32(k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_conflict_epi32 (simde__m256i a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512CD_NATIVE)
|
||||
return _mm256_conflict_epi32(a);
|
||||
#else
|
||||
simde__m256i_private
|
||||
r_ = simde__m256i_to_private(simde_mm256_setzero_si256()),
|
||||
a_ = simde__m256i_to_private(a);
|
||||
|
||||
for (size_t i = 1 ; i < (sizeof(r_.i32) / sizeof(r_.i32[0])) ; i++) {
|
||||
r_.i32[i] =
|
||||
simde_mm256_movemask_ps(
|
||||
simde_mm256_castsi256_ps(
|
||||
simde_mm256_cmpeq_epi32(simde_mm256_set1_epi32(a_.i32[i]), a)
|
||||
)
|
||||
) & ((1 << i) - 1);
|
||||
}
|
||||
|
||||
return simde__m256i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512CD_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_conflict_epi32
|
||||
#define _mm256_conflict_epi32(a) simde_mm256_conflict_epi32(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_mask_conflict_epi32 (simde__m256i src, simde__mmask8 k, simde__m256i a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512CD_NATIVE)
|
||||
return _mm256_mask_conflict_epi32(src, k, a);
|
||||
#else
|
||||
return simde_mm256_mask_mov_epi32(src, k, simde_mm256_conflict_epi32(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512CD_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_mask_conflict_epi32
|
||||
#define _mm256_mask_conflict_epi32(src, k, a) simde_mm256_mask_conflict_epi32(src, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_maskz_conflict_epi32 (simde__mmask8 k, simde__m256i a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512CD_NATIVE)
|
||||
return _mm256_maskz_conflict_epi32(k, a);
|
||||
#else
|
||||
return simde_mm256_maskz_mov_epi32(k, simde_mm256_conflict_epi32(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512CD_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_maskz_conflict_epi32
|
||||
#define _mm256_maskz_conflict_epi32(k, a) simde_mm256_maskz_conflict_epi32(k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_conflict_epi32 (simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512CD_NATIVE)
|
||||
return _mm512_conflict_epi32(a);
|
||||
#else
|
||||
simde__m512i_private
|
||||
r_ = simde__m512i_to_private(simde_mm512_setzero_si512()),
|
||||
a_ = simde__m512i_to_private(a);
|
||||
|
||||
for (size_t i = 1 ; i < (sizeof(r_.i32) / sizeof(r_.i32[0])) ; i++) {
|
||||
r_.i32[i] =
|
||||
HEDLEY_STATIC_CAST(
|
||||
int32_t,
|
||||
simde_mm512_cmpeq_epi32_mask(simde_mm512_set1_epi32(a_.i32[i]), a)
|
||||
) & ((1 << i) - 1);
|
||||
}
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512CD_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_conflict_epi32
|
||||
#define _mm512_conflict_epi32(a) simde_mm512_conflict_epi32(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_conflict_epi32 (simde__m512i src, simde__mmask16 k, simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512CD_NATIVE)
|
||||
return _mm512_mask_conflict_epi32(src, k, a);
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi32(src, k, simde_mm512_conflict_epi32(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512CD_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_conflict_epi32
|
||||
#define _mm512_mask_conflict_epi32(src, k, a) simde_mm512_mask_conflict_epi32(src, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_conflict_epi32 (simde__mmask16 k, simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512CD_NATIVE)
|
||||
return _mm512_maskz_conflict_epi32(k, a);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_epi32(k, simde_mm512_conflict_epi32(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512CD_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_conflict_epi32
|
||||
#define _mm512_maskz_conflict_epi32(k, a) simde_mm512_maskz_conflict_epi32(k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_conflict_epi64 (simde__m128i a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512CD_NATIVE)
|
||||
return _mm_conflict_epi64(a);
|
||||
#else
|
||||
simde__m128i_private
|
||||
r_ = simde__m128i_to_private(simde_mm_setzero_si128()),
|
||||
a_ = simde__m128i_to_private(a);
|
||||
|
||||
for (size_t i = 1 ; i < (sizeof(r_.i64) / sizeof(r_.i64[0])) ; i++) {
|
||||
r_.i64[i] =
|
||||
HEDLEY_STATIC_CAST(
|
||||
int64_t,
|
||||
simde_mm_movemask_pd(
|
||||
simde_mm_castsi128_pd(
|
||||
simde_mm_cmpeq_epi64(simde_mm_set1_epi64x(a_.i64[i]), a)
|
||||
)
|
||||
)
|
||||
) & ((1 << i) - 1);
|
||||
}
|
||||
|
||||
return simde__m128i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512CD_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_conflict_epi64
|
||||
#define _mm_conflict_epi64(a) simde_mm_conflict_epi64(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_mask_conflict_epi64 (simde__m128i src, simde__mmask8 k, simde__m128i a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512CD_NATIVE)
|
||||
return _mm_mask_conflict_epi64(src, k, a);
|
||||
#else
|
||||
return simde_mm_mask_mov_epi64(src, k, simde_mm_conflict_epi64(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512CD_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_conflict_epi64
|
||||
#define _mm_mask_conflict_epi64(src, k, a) simde_mm_mask_conflict_epi64(src, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_maskz_conflict_epi64 (simde__mmask8 k, simde__m128i a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512CD_NATIVE)
|
||||
return _mm_maskz_conflict_epi64(k, a);
|
||||
#else
|
||||
return simde_mm_maskz_mov_epi64(k, simde_mm_conflict_epi64(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512CD_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_maskz_conflict_epi64
|
||||
#define _mm_maskz_conflict_epi64(k, a) simde_mm_maskz_conflict_epi64(k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_conflict_epi64 (simde__m256i a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512CD_NATIVE)
|
||||
return _mm256_conflict_epi64(a);
|
||||
#else
|
||||
simde__m256i_private
|
||||
r_ = simde__m256i_to_private(simde_mm256_setzero_si256()),
|
||||
a_ = simde__m256i_to_private(a);
|
||||
|
||||
for (size_t i = 1 ; i < (sizeof(r_.i64) / sizeof(r_.i64[0])) ; i++) {
|
||||
r_.i64[i] =
|
||||
HEDLEY_STATIC_CAST(
|
||||
int64_t,
|
||||
simde_mm256_movemask_pd(
|
||||
simde_mm256_castsi256_pd(
|
||||
simde_mm256_cmpeq_epi64(simde_mm256_set1_epi64x(a_.i64[i]), a)
|
||||
)
|
||||
)
|
||||
) & ((1 << i) - 1);
|
||||
}
|
||||
|
||||
return simde__m256i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512CD_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_conflict_epi64
|
||||
#define _mm256_conflict_epi64(a) simde_mm256_conflict_epi64(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_mask_conflict_epi64 (simde__m256i src, simde__mmask8 k, simde__m256i a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512CD_NATIVE)
|
||||
return _mm256_mask_conflict_epi64(src, k, a);
|
||||
#else
|
||||
return simde_mm256_mask_mov_epi64(src, k, simde_mm256_conflict_epi64(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512CD_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_mask_conflict_epi64
|
||||
#define _mm256_mask_conflict_epi64(src, k, a) simde_mm256_mask_conflict_epi64(src, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_maskz_conflict_epi64 (simde__mmask8 k, simde__m256i a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512CD_NATIVE)
|
||||
return _mm256_maskz_conflict_epi64(k, a);
|
||||
#else
|
||||
return simde_mm256_maskz_mov_epi64(k, simde_mm256_conflict_epi64(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512CD_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_maskz_conflict_epi64
|
||||
#define _mm256_maskz_conflict_epi64(k, a) simde_mm256_maskz_conflict_epi64(k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_conflict_epi64 (simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512CD_NATIVE)
|
||||
return _mm512_conflict_epi64(a);
|
||||
#else
|
||||
simde__m512i_private
|
||||
r_ = simde__m512i_to_private(simde_mm512_setzero_si512()),
|
||||
a_ = simde__m512i_to_private(a);
|
||||
|
||||
for (size_t i = 1 ; i < (sizeof(r_.i64) / sizeof(r_.i64[0])) ; i++) {
|
||||
r_.i64[i] =
|
||||
HEDLEY_STATIC_CAST(
|
||||
int64_t,
|
||||
simde_mm512_cmpeq_epi64_mask(simde_mm512_set1_epi64(a_.i64[i]), a)
|
||||
) & ((1 << i) - 1);
|
||||
}
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512CD_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_conflict_epi64
|
||||
#define _mm512_conflict_epi64(a) simde_mm512_conflict_epi64(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_conflict_epi64 (simde__m512i src, simde__mmask8 k, simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512CD_NATIVE)
|
||||
return _mm512_mask_conflict_epi64(src, k, a);
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi64(src, k, simde_mm512_conflict_epi64(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512CD_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_conflict_epi64
|
||||
#define _mm512_mask_conflict_epi64(src, k, a) simde_mm512_mask_conflict_epi64(src, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_conflict_epi64 (simde__mmask8 k, simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512CD_NATIVE)
|
||||
return _mm512_maskz_conflict_epi64(k, a);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_epi64(k, simde_mm512_conflict_epi64(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512CD_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_conflict_epi64
|
||||
#define _mm512_maskz_conflict_epi64(k, a) simde_mm512_maskz_conflict_epi64(k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_CONFLICT_H) */
|
||||
@@ -0,0 +1,86 @@
|
||||
/* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Copyright:
|
||||
* 2020 Evan Nemerson <evan@nemerson.com>
|
||||
* 2020 Himanshi Mathur <himanshi18037@iiitd.ac.in>
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512_COPYSIGN_H)
|
||||
#define SIMDE_X86_AVX512_COPYSIGN_H
|
||||
|
||||
#include "types.h"
|
||||
#include "mov.h"
|
||||
#include "and.h"
|
||||
#include "andnot.h"
|
||||
#include "xor.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_x_mm512_copysign_ps(simde__m512 dest, simde__m512 src) {
|
||||
simde__m512_private
|
||||
r_,
|
||||
dest_ = simde__m512_to_private(dest),
|
||||
src_ = simde__m512_to_private(src);
|
||||
|
||||
#if defined(simde_math_copysignf)
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.f32) / sizeof(r_.f32[0])) ; i++) {
|
||||
r_.f32[i] = simde_math_copysignf(dest_.f32[i], src_.f32[i]);
|
||||
}
|
||||
#else
|
||||
simde__m512 sgnbit = simde_mm512_xor_ps(simde_mm512_set1_ps(SIMDE_FLOAT32_C(0.0)), simde_mm512_set1_ps(-SIMDE_FLOAT32_C(0.0)));
|
||||
return simde_mm512_xor_ps(simde_mm512_and_ps(sgnbit, src), simde_mm512_andnot_ps(sgnbit, dest));
|
||||
#endif
|
||||
|
||||
return simde__m512_from_private(r_);
|
||||
}
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_x_mm512_copysign_pd(simde__m512d dest, simde__m512d src) {
|
||||
simde__m512d_private
|
||||
r_,
|
||||
dest_ = simde__m512d_to_private(dest),
|
||||
src_ = simde__m512d_to_private(src);
|
||||
|
||||
#if defined(simde_math_copysign)
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.f64) / sizeof(r_.f64[0])) ; i++) {
|
||||
r_.f64[i] = simde_math_copysign(dest_.f64[i], src_.f64[i]);
|
||||
}
|
||||
#else
|
||||
simde__m512d sgnbit = simde_mm512_xor_pd(simde_mm512_set1_pd(SIMDE_FLOAT64_C(0.0)), simde_mm512_set1_pd(-SIMDE_FLOAT64_C(0.0)));
|
||||
return simde_mm512_xor_pd(simde_mm512_and_pd(sgnbit, src), simde_mm512_andnot_pd(sgnbit, dest));
|
||||
#endif
|
||||
|
||||
return simde__m512d_from_private(r_);
|
||||
}
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_COPYSIGN_H) */
|
||||
@@ -0,0 +1,402 @@
|
||||
/* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Copyright:
|
||||
* 2020-2021 Evan Nemerson <evan@nemerson.com>
|
||||
* 2020 Himanshi Mathur <himanshi18037@iiitd.ac.in>
|
||||
* 2020 Hidayat Khan <huk2209@gmail.com>
|
||||
* 2021 Andrew Rodriguez <anrodriguez@linkedin.com>
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512_CVT_H)
|
||||
#define SIMDE_X86_AVX512_CVT_H
|
||||
|
||||
#include "types.h"
|
||||
#include "mov.h"
|
||||
#include "../../simde-f16.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128d
|
||||
simde_mm_cvtepi64_pd (simde__m128i a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
return _mm_cvtepi64_pd(a);
|
||||
#else
|
||||
simde__m128d_private r_;
|
||||
simde__m128i_private a_ = simde__m128i_to_private(a);
|
||||
|
||||
#if defined(SIMDE_X86_SSE2_NATIVE)
|
||||
/* https://stackoverflow.com/questions/41144668/how-to-efficiently-perform-double-int64-conversions-with-sse-avx */
|
||||
__m128i xH = _mm_srai_epi32(a_.n, 16);
|
||||
#if defined(SIMDE_X86_SSE4_2_NATIVE)
|
||||
xH = _mm_blend_epi16(xH, _mm_setzero_si128(), 0x33);
|
||||
#else
|
||||
xH = _mm_and_si128(xH, _mm_set_epi16(~INT16_C(0), ~INT16_C(0), INT16_C(0), INT16_C(0), ~INT16_C(0), ~INT16_C(0), INT16_C(0), INT16_C(0)));
|
||||
#endif
|
||||
xH = _mm_add_epi64(xH, _mm_castpd_si128(_mm_set1_pd(442721857769029238784.0)));
|
||||
const __m128i e = _mm_castpd_si128(_mm_set1_pd(0x0010000000000000));
|
||||
#if defined(SIMDE_X86_SSE4_2_NATIVE)
|
||||
__m128i xL = _mm_blend_epi16(a_.n, e, 0x88);
|
||||
#else
|
||||
__m128i m = _mm_set_epi16(INT16_C(0), ~INT16_C(0), ~INT16_C(0), ~INT16_C(0), INT16_C(0), ~INT16_C(0), ~INT16_C(0), ~INT16_C(0));
|
||||
__m128i xL = _mm_or_si128(_mm_and_si128(m, a_.n), _mm_andnot_si128(m, e));
|
||||
#endif
|
||||
__m128d f = _mm_sub_pd(_mm_castsi128_pd(xH), _mm_set1_pd(442726361368656609280.0));
|
||||
return _mm_add_pd(f, _mm_castsi128_pd(xL));
|
||||
#elif defined(SIMDE_CONVERT_VECTOR_)
|
||||
SIMDE_CONVERT_VECTOR_(r_.f64, a_.i64);
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.f64) / sizeof(r_.f64[0])) ; i++) {
|
||||
r_.f64[i] = HEDLEY_STATIC_CAST(simde_float64, a_.i64[i]);
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m128d_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_cvtepi64_pd
|
||||
#define _mm_cvtepi64_pd(a) simde_mm_cvtepi64_pd(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128d
|
||||
simde_mm_mask_cvtepi64_pd(simde__m128d src, simde__mmask8 k, simde__m128i a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
return _mm_mask_cvtepi64_pd(src, k, a);
|
||||
#else
|
||||
return simde_mm_mask_mov_pd(src, k, simde_mm_cvtepi64_pd(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_cvtepi64_pd
|
||||
#define _mm_mask_cvtepi64_pd(src, k, a) simde_mm_mask_cvtepi64_pd(src, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128d
|
||||
simde_mm_maskz_cvtepi64_pd(simde__mmask8 k, simde__m128i a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
return _mm_maskz_cvtepi64_pd(k, a);
|
||||
#else
|
||||
return simde_mm_maskz_mov_pd(k, simde_mm_cvtepi64_pd(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) || defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_maskz_cvtepi64_pd
|
||||
#define _mm_maskz_cvtepi64_pd(k, a) simde_mm_maskz_cvtepi64_pd((k), (a))
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_cvtepi16_epi32 (simde__m256i a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_cvtepi16_epi32(a);
|
||||
#else
|
||||
simde__m512i_private r_;
|
||||
simde__m256i_private a_ = simde__m256i_to_private(a);
|
||||
|
||||
#if defined(SIMDE_CONVERT_VECTOR_)
|
||||
SIMDE_CONVERT_VECTOR_(r_.i32, a_.i16);
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i32) / sizeof(r_.i32[0])) ; i++) {
|
||||
r_.i32[i] = a_.i16[i];
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_cvtepi16_epi32
|
||||
#define _mm512_cvtepi16_epi32(a) simde_mm512_cvtepi16_epi32(a)
|
||||
#endif
|
||||
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm512_cvtepi16_epi8 (simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_cvtepi16_epi8(a);
|
||||
#else
|
||||
simde__m256i_private r_;
|
||||
simde__m512i_private a_ = simde__m512i_to_private(a);
|
||||
|
||||
#if defined(SIMDE_CONVERT_VECTOR_)
|
||||
SIMDE_CONVERT_VECTOR_(r_.i8, a_.i16);
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i8) / sizeof(r_.i8[0])) ; i++) {
|
||||
r_.i8[i] = HEDLEY_STATIC_CAST(int8_t, a_.i16[i]);
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m256i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES) || defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_cvtepi16_epi8
|
||||
#define _mm512_cvtepi16_epi8(a) simde_mm512_cvtepi16_epi8(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm512_mask_cvtepi16_epi8 (simde__m256i src, simde__mmask32 k, simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_mask_cvtepi16_epi8(src, k, a);
|
||||
#else
|
||||
return simde_mm256_mask_mov_epi8(src, k, simde_mm512_cvtepi16_epi8(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_cvtepi16_epi8
|
||||
#define _mm512_mask_cvtepi16_epi8(src, k, a) simde_mm512_mask_cvtepi16_epi8(src, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm512_maskz_cvtepi16_epi8 (simde__mmask32 k, simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_maskz_cvtepi16_epi8(k, a);
|
||||
#else
|
||||
return simde_mm256_maskz_mov_epi8(k, simde_mm512_cvtepi16_epi8(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_cvtepi16_epi8
|
||||
#define _mm512_maskz_cvtepi16_epi8(k, a) simde_mm512_maskz_cvtepi16_epi8(k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_cvtepi8_epi16 (simde__m256i a) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_cvtepi8_epi16(a);
|
||||
#else
|
||||
simde__m512i_private r_;
|
||||
simde__m256i_private a_ = simde__m256i_to_private(a);
|
||||
|
||||
#if defined(SIMDE_X86_AVX2_NATIVE)
|
||||
r_.m256i[0] = _mm256_cvtepi8_epi16(a_.m128i[0]);
|
||||
r_.m256i[1] = _mm256_cvtepi8_epi16(a_.m128i[1]);
|
||||
#elif defined(SIMDE_CONVERT_VECTOR_)
|
||||
SIMDE_CONVERT_VECTOR_(r_.i16, a_.i8);
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i16) / sizeof(r_.i16[0])) ; i++) {
|
||||
r_.i16[i] = a_.i8[i];
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_cvtepi8_epi16
|
||||
#define _mm512_cvtepi8_epi16(a) simde_mm512_cvtepi8_epi16(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_cvtepi32_ps (simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_cvtepi32_ps(a);
|
||||
#else
|
||||
simde__m512_private r_;
|
||||
simde__m512i_private a_ = simde__m512i_to_private(a);
|
||||
|
||||
#if defined(SIMDE_X86_AVX_NATIVE)
|
||||
r_.m256[0] = _mm256_cvtepi32_ps(a_.m256i[0]);
|
||||
r_.m256[1] = _mm256_cvtepi32_ps(a_.m256i[1]);
|
||||
#elif defined(SIMDE_CONVERT_VECTOR_)
|
||||
SIMDE_CONVERT_VECTOR_(r_.f32, a_.i32);
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i32) / sizeof(r_.i32[0])) ; i++) {
|
||||
r_.f32[i] = HEDLEY_STATIC_CAST(simde_float32, a_.i32[i]);
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_cvtepi32_ps
|
||||
#define _mm512_cvtepi32_ps(a) simde_mm512_cvtepi32_ps(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm512_cvtepi64_epi32 (simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_cvtepi64_epi32(a);
|
||||
#else
|
||||
simde__m256i_private r_;
|
||||
simde__m512i_private a_ = simde__m512i_to_private(a);
|
||||
|
||||
#if defined(SIMDE_CONVERT_VECTOR_)
|
||||
SIMDE_CONVERT_VECTOR_(r_.i32, a_.i64);
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i32) / sizeof(r_.i32[0])) ; i++) {
|
||||
r_.i32[i] = HEDLEY_STATIC_CAST(int32_t, a_.i64[i]);
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m256i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_cvtepi64_epi32
|
||||
#define _mm512_cvtepi64_epi32(a) simde_mm512_cvtepi64_epi32((a))
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_cvtepu16_epi32 (simde__m256i a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_cvtepu16_epi32(a);
|
||||
#else
|
||||
simde__m512i_private r_;
|
||||
simde__m256i_private a_ = simde__m256i_to_private(a);
|
||||
|
||||
#if defined(SIMDE_CONVERT_VECTOR_)
|
||||
SIMDE_CONVERT_VECTOR_(r_.i32, a_.u16);
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i32) / sizeof(r_.i32[0])) ; i++) {
|
||||
r_.i32[i] = HEDLEY_STATIC_CAST(int32_t, a_.u16[i]);
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_cvtepu16_epi32
|
||||
#define _mm512_cvtepu16_epi32(a) simde_mm512_cvtepu16_epi32(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_cvtepu32_ps (simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_cvtepu32_ps(a);
|
||||
#else
|
||||
simde__m512_private r_;
|
||||
simde__m512i_private a_ = simde__m512i_to_private(a);
|
||||
|
||||
#if defined(SIMDE_X86_SSE2_NATIVE)
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m128) / sizeof(r_.m128[0])) ; i++) {
|
||||
/* https://stackoverflow.com/a/34067907/501126 */
|
||||
const __m128 tmp = _mm_cvtepi32_ps(_mm_srli_epi32(a_.m128i[i], 1));
|
||||
r_.m128[i] =
|
||||
_mm_add_ps(
|
||||
_mm_add_ps(tmp, tmp),
|
||||
_mm_cvtepi32_ps(_mm_and_si128(a_.m128i[i], _mm_set1_epi32(1)))
|
||||
);
|
||||
}
|
||||
#elif defined(SIMDE_CONVERT_VECTOR_)
|
||||
SIMDE_CONVERT_VECTOR_(r_.f32, a_.u32);
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.u32) / sizeof(r_.u32[0])) ; i++) {
|
||||
r_.f32[i] = HEDLEY_STATIC_CAST(float, a_.u32[i]);
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_cvtepu32_ps
|
||||
#define _mm512_cvtepu32_ps(a) simde_mm512_cvtepu32_ps(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_cvtph_ps(simde__m256i a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_cvtph_ps(a);
|
||||
#endif
|
||||
simde__m256i_private a_ = simde__m256i_to_private(a);
|
||||
simde__m512_private r_;
|
||||
|
||||
#if defined(SIMDE_X86_F16C_NATIVE)
|
||||
r_.m256[0] = _mm256_cvtph_ps(a_.m128i[0]);
|
||||
r_.m256[1] = _mm256_cvtph_ps(a_.m128i[1]);
|
||||
#elif defined(SIMDE_FLOAT16_VECTOR)
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.f32) / sizeof(r_.f32[0])) ; i++) {
|
||||
r_.f32[i] = simde_float16_to_float32(a_.f16[i]);
|
||||
}
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.f32) / sizeof(r_.f32[0])) ; i++) {
|
||||
r_.f32[i] = simde_float16_to_float32(simde_uint16_as_float16(a_.u16[i]));
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512_from_private(r_);
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_cvtph_ps
|
||||
#define _mm512_cvtph_ps(a) simde_mm512_cvtph_ps(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_cvtps_epi32(simde__m512 a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_cvtps_epi32(a);
|
||||
#endif
|
||||
simde__m512_private a_ = simde__m512_to_private(a);
|
||||
simde__m512i_private r_;
|
||||
|
||||
#if defined(SIMDE_X86_AVX_NATIVE)
|
||||
r_.m256i[0] = _mm256_cvtps_epi32(a_.m256[0]);
|
||||
r_.m256i[1] = _mm256_cvtps_epi32(a_.m256[1]);
|
||||
#elif defined(simde_math_nearbyintf)
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i32) / sizeof(r_.i32[0])) ; i++) {
|
||||
r_.i32[i] = SIMDE_CONVERT_FTOI(int32_t, simde_math_nearbyintf(a_.f32[i]));
|
||||
}
|
||||
#else
|
||||
HEDLEY_UNREACHABLE();
|
||||
#endif
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_cvtps_epi32
|
||||
#define _mm512_cvtps_epi32(a) simde_mm512_cvtps_epi32(a)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_CVT_H) */
|
||||
@@ -0,0 +1,781 @@
|
||||
/* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Copyright:
|
||||
* 2020 Evan Nemerson <evan@nemerson.com>
|
||||
* 2020 Himanshi Mathur <himanshi18037@iiitd.ac.in>
|
||||
* 2020 Hidayat Khan <huk2209@gmail.com>
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512_CVTS_H)
|
||||
#define SIMDE_X86_AVX512_CVTS_H
|
||||
|
||||
#include "types.h"
|
||||
#include "mov.h"
|
||||
#include "storeu.h"
|
||||
#include "loadu.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_cvtsepi16_epi8 (simde__m128i a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm_cvtsepi16_epi8(a);
|
||||
#else
|
||||
simde__m128i_private r_ = simde__m128i_to_private(simde_mm_setzero_si128());
|
||||
simde__m128i_private a_ = simde__m128i_to_private(a);
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(a_.i16) / sizeof(a_.i16[0])) ; i++) {
|
||||
r_.i8[i] =
|
||||
(a_.i16[i] < INT8_MIN)
|
||||
? (INT8_MIN)
|
||||
: ((a_.i16[i] > INT8_MAX)
|
||||
? (INT8_MAX)
|
||||
: HEDLEY_STATIC_CAST(int8_t, a_.i16[i]));
|
||||
}
|
||||
|
||||
return simde__m128i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_cvtsepi16_epi8
|
||||
#define _mm_cvtsepi16_epi8(a) simde_mm_cvtsepi16_epi8(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm256_cvtsepi16_epi8 (simde__m256i a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm256_cvtsepi16_epi8(a);
|
||||
#else
|
||||
simde__m128i_private r_;
|
||||
simde__m256i_private a_ = simde__m256i_to_private(a);
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i8) / sizeof(r_.i8[0])) ; i++) {
|
||||
r_.i8[i] =
|
||||
(a_.i16[i] < INT8_MIN)
|
||||
? (INT8_MIN)
|
||||
: ((a_.i16[i] > INT8_MAX)
|
||||
? (INT8_MAX)
|
||||
: HEDLEY_STATIC_CAST(int8_t, a_.i16[i]));
|
||||
}
|
||||
|
||||
return simde__m128i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_cvtsepi16_epi8
|
||||
#define _mm256_cvtsepi16_epi8(a) simde_mm256_cvtsepi16_epi8(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_cvtsepi32_epi8 (simde__m128i a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm_cvtsepi32_epi8(a);
|
||||
#else
|
||||
simde__m128i_private r_ = simde__m128i_to_private(simde_mm_setzero_si128());
|
||||
simde__m128i_private a_ = simde__m128i_to_private(a);
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(a_.i32) / sizeof(a_.i32[0])) ; i++) {
|
||||
r_.i8[i] =
|
||||
(a_.i32[i] < INT8_MIN)
|
||||
? (INT8_MIN)
|
||||
: ((a_.i32[i] > INT8_MAX)
|
||||
? (INT8_MAX)
|
||||
: HEDLEY_STATIC_CAST(int8_t, a_.i32[i]));
|
||||
}
|
||||
|
||||
return simde__m128i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_cvtsepi32_epi8
|
||||
#define _mm_cvtsepi32_epi8(a) simde_mm_cvtsepi32_epi8(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm256_cvtsepi32_epi8 (simde__m256i a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm256_cvtsepi32_epi8(a);
|
||||
#else
|
||||
simde__m128i_private r_ = simde__m128i_to_private(simde_mm_setzero_si128());
|
||||
simde__m256i_private a_ = simde__m256i_to_private(a);
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(a_.i32) / sizeof(a_.i32[0])) ; i++) {
|
||||
r_.i8[i] =
|
||||
(a_.i32[i] < INT8_MIN)
|
||||
? (INT8_MIN)
|
||||
: ((a_.i32[i] > INT8_MAX)
|
||||
? (INT8_MAX)
|
||||
: HEDLEY_STATIC_CAST(int8_t, a_.i32[i]));
|
||||
}
|
||||
|
||||
return simde__m128i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_cvtsepi32_epi8
|
||||
#define _mm256_cvtsepi32_epi8(a) simde_mm256_cvtsepi32_epi8(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_cvtsepi32_epi16 (simde__m128i a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm_cvtsepi32_epi16(a);
|
||||
#else
|
||||
simde__m128i_private r_ = simde__m128i_to_private(simde_mm_setzero_si128());
|
||||
simde__m128i_private a_ = simde__m128i_to_private(a);
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(a_.i32) / sizeof(a_.i32[0])) ; i++) {
|
||||
r_.i16[i] =
|
||||
(a_.i32[i] < INT16_MIN)
|
||||
? (INT16_MIN)
|
||||
: ((a_.i32[i] > INT16_MAX)
|
||||
? (INT16_MAX)
|
||||
: HEDLEY_STATIC_CAST(int16_t, a_.i32[i]));
|
||||
}
|
||||
|
||||
return simde__m128i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_cvtsepi32_epi16
|
||||
#define _mm_cvtsepi32_epi16(a) simde_mm_cvtsepi32_epi16(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm256_cvtsepi32_epi16 (simde__m256i a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm256_cvtsepi32_epi16(a);
|
||||
#else
|
||||
simde__m128i_private r_ = simde__m128i_to_private(simde_mm_setzero_si128());
|
||||
simde__m256i_private a_ = simde__m256i_to_private(a);
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(a_.i32) / sizeof(a_.i32[0])) ; i++) {
|
||||
r_.i16[i] =
|
||||
(a_.i32[i] < INT16_MIN)
|
||||
? (INT16_MIN)
|
||||
: ((a_.i32[i] > INT16_MAX)
|
||||
? (INT16_MAX)
|
||||
: HEDLEY_STATIC_CAST(int16_t, a_.i32[i]));
|
||||
}
|
||||
|
||||
return simde__m128i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_cvtsepi32_epi16
|
||||
#define _mm256_cvtsepi32_epi16(a) simde_mm256_cvtsepi32_epi16(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_cvtsepi64_epi8 (simde__m128i a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm_cvtsepi64_epi8(a);
|
||||
#else
|
||||
simde__m128i_private r_ = simde__m128i_to_private(simde_mm_setzero_si128());
|
||||
simde__m128i_private a_ = simde__m128i_to_private(a);
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(a_.i64) / sizeof(a_.i64[0])) ; i++) {
|
||||
r_.i8[i] =
|
||||
(a_.i64[i] < INT8_MIN)
|
||||
? (INT8_MIN)
|
||||
: ((a_.i64[i] > INT8_MAX)
|
||||
? (INT8_MAX)
|
||||
: HEDLEY_STATIC_CAST(int8_t, a_.i64[i]));
|
||||
}
|
||||
|
||||
return simde__m128i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_cvtsepi64_epi8
|
||||
#define _mm_cvtsepi64_epi8(a) simde_mm_cvtsepi64_epi8(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm256_cvtsepi64_epi8 (simde__m256i a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm256_cvtsepi64_epi8(a);
|
||||
#else
|
||||
simde__m128i_private r_ = simde__m128i_to_private(simde_mm_setzero_si128());
|
||||
simde__m256i_private a_ = simde__m256i_to_private(a);
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(a_.i64) / sizeof(a_.i64[0])) ; i++) {
|
||||
r_.i8[i] =
|
||||
(a_.i64[i] < INT8_MIN)
|
||||
? (INT8_MIN)
|
||||
: ((a_.i64[i] > INT8_MAX)
|
||||
? (INT8_MAX)
|
||||
: HEDLEY_STATIC_CAST(int8_t, a_.i64[i]));
|
||||
}
|
||||
|
||||
return simde__m128i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_cvtsepi64_epi8
|
||||
#define _mm256_cvtsepi64_epi8(a) simde_mm256_cvtsepi64_epi8(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm512_cvtsepi16_epi8 (simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_cvtsepi16_epi8(a);
|
||||
#else
|
||||
simde__m256i_private r_;
|
||||
simde__m512i_private a_ = simde__m512i_to_private(a);
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i8) / sizeof(r_.i8[0])) ; i++) {
|
||||
r_.i8[i] =
|
||||
(a_.i16[i] < INT8_MIN)
|
||||
? (INT8_MIN)
|
||||
: ((a_.i16[i] > INT8_MAX)
|
||||
? (INT8_MAX)
|
||||
: HEDLEY_STATIC_CAST(int8_t, a_.i16[i]));
|
||||
}
|
||||
|
||||
return simde__m256i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_cvtsepi16_epi8
|
||||
#define _mm512_cvtsepi16_epi8(a) simde_mm512_cvtsepi16_epi8(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm512_mask_cvtsepi16_epi8 (simde__m256i src, simde__mmask32 k, simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_mask_cvtsepi16_epi8(src, k, a);
|
||||
#else
|
||||
return simde_mm256_mask_mov_epi8(src, k, simde_mm512_cvtsepi16_epi8(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_cvtsepi16_epi8
|
||||
#define _mm512_mask_cvtsepi16_epi8(src, k, a) simde_mm512_mask_cvtsepi16_epi8(src, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm512_maskz_cvtsepi16_epi8 (simde__mmask32 k, simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_maskz_cvtsepi16_epi8(k, a);
|
||||
#else
|
||||
return simde_mm256_maskz_mov_epi8(k, simde_mm512_cvtsepi16_epi8(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_cvtsepi16_epi8
|
||||
#define _mm512_maskz_cvtsepi16_epi8(k, a) simde_mm512_maskz_cvtsepi16_epi8(k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm512_cvtsepi32_epi8 (simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_cvtsepi32_epi8(a);
|
||||
#else
|
||||
simde__m128i_private r_;
|
||||
simde__m512i_private a_ = simde__m512i_to_private(a);
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(a_.i32) / sizeof(a_.i32[0])) ; i++) {
|
||||
r_.i8[i] =
|
||||
(a_.i32[i] < INT8_MIN)
|
||||
? (INT8_MIN)
|
||||
: ((a_.i32[i] > INT8_MAX)
|
||||
? (INT8_MAX)
|
||||
: HEDLEY_STATIC_CAST(int8_t, a_.i32[i]));
|
||||
}
|
||||
|
||||
return simde__m128i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_cvtsepi32_epi8
|
||||
#define _mm512_cvtsepi32_epi8(a) simde_mm512_cvtsepi32_epi8(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm512_mask_cvtsepi32_epi8 (simde__m128i src, simde__mmask16 k, simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_cvtsepi32_epi8(src, k, a);
|
||||
#else
|
||||
simde__m128i_private r_;
|
||||
simde__m128i_private src_ = simde__m128i_to_private(src);
|
||||
simde__m512i_private a_ = simde__m512i_to_private(a);
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(a_.i32) / sizeof(a_.i32[0])) ; i++) {
|
||||
r_.i8[i] = ((k>>i) &1 ) ?
|
||||
((a_.i32[i] < INT8_MIN)
|
||||
? (INT8_MIN)
|
||||
: ((a_.i32[i] > INT8_MAX)
|
||||
? (INT8_MAX)
|
||||
: HEDLEY_STATIC_CAST(int8_t, a_.i32[i]))) : src_.i8[i] ;
|
||||
}
|
||||
|
||||
return simde__m128i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_cvtsepi32_epi8
|
||||
#define _mm512_mask_cvtsepi32_epi8(src, k, a) simde_mm512_mask_cvtsepi32_epi8(src, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
void
|
||||
simde_mm512_mask_cvtsepi32_storeu_epi8 (void* base_addr, simde__mmask16 k, simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
_mm512_mask_cvtsepi32_storeu_epi8(base_addr, k, a);
|
||||
#else
|
||||
simde__m256i_private r_ = simde__m256i_to_private(simde_mm256_loadu_epi8(base_addr));
|
||||
simde__m512i_private a_ = simde__m512i_to_private(a);
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(a_.i32) / sizeof(a_.i32[0])) ; i++) {
|
||||
r_.i8[i] = ((k>>i) &1 ) ?
|
||||
((a_.i32[i] < INT8_MIN)
|
||||
? (INT8_MIN)
|
||||
: ((a_.i32[i] > INT8_MAX)
|
||||
? (INT8_MAX)
|
||||
: HEDLEY_STATIC_CAST(int8_t, a_.i32[i]))) : r_.i8[i];
|
||||
}
|
||||
|
||||
simde_mm256_storeu_epi8(base_addr, simde__m256i_from_private(r_));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_cvtsepi32_storeu_epi8
|
||||
#define _mm512_mask_cvtsepi32_storeu_epi8(base_addr, k, a) simde_mm512_mask_cvtsepi32_storeu_epi8(base_addr, k, a)
|
||||
#endif
|
||||
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm512_maskz_cvtsepi32_epi8 (simde__mmask16 k, simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_maskz_cvtsepi32_epi8(k, a);
|
||||
#else
|
||||
simde__m128i_private r_;
|
||||
simde__m512i_private a_ = simde__m512i_to_private(a);
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(a_.i32) / sizeof(a_.i32[0])) ; i++) {
|
||||
r_.i8[i] = ((k>>i) &1 ) ?
|
||||
((a_.i32[i] < INT8_MIN)
|
||||
? (INT8_MIN)
|
||||
: ((a_.i32[i] > INT8_MAX)
|
||||
? (INT8_MAX)
|
||||
: HEDLEY_STATIC_CAST(int8_t, a_.i32[i]))) : INT8_C(0) ;
|
||||
}
|
||||
|
||||
return simde__m128i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_cvtsepi32_epi8
|
||||
#define _mm512_maskz_cvtsepi32_epi8(k, a) simde_mm512_maskz_cvtsepi32_epi8(k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm512_cvtsepi32_epi16 (simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_cvtsepi32_epi16(a);
|
||||
#else
|
||||
simde__m256i_private r_;
|
||||
simde__m512i_private a_ = simde__m512i_to_private(a);
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(a_.i32) / sizeof(a_.i32[0])) ; i++) {
|
||||
r_.i16[i] =
|
||||
(a_.i32[i] < INT16_MIN)
|
||||
? (INT16_MIN)
|
||||
: ((a_.i32[i] > INT16_MAX)
|
||||
? (INT16_MAX)
|
||||
: HEDLEY_STATIC_CAST(int16_t, a_.i32[i]));
|
||||
}
|
||||
|
||||
return simde__m256i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_cvtsepi32_epi16
|
||||
#define _mm512_cvtsepi32_epi16(a) simde_mm512_cvtsepi32_epi16(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm512_mask_cvtsepi32_epi16 (simde__m256i src, simde__mmask16 k, simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_cvtsepi32_epi16(src, k, a);
|
||||
#else
|
||||
simde__m256i_private r_;
|
||||
simde__m256i_private src_ = simde__m256i_to_private(src);
|
||||
simde__m512i_private a_ = simde__m512i_to_private(a);
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(a_.i32) / sizeof(a_.i32[0])) ; i++) {
|
||||
r_.i16[i] = ((k>>i) &1 ) ?
|
||||
((a_.i32[i] < INT16_MIN)
|
||||
? (INT16_MIN)
|
||||
: ((a_.i32[i] > INT16_MAX)
|
||||
? (INT16_MAX)
|
||||
: HEDLEY_STATIC_CAST(int16_t, a_.i32[i]))) : src_.i16[i];
|
||||
}
|
||||
|
||||
return simde__m256i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_cvtsepi32_epi16
|
||||
#define _mm512_mask_cvtsepi32_epi16(src, k, a) simde_mm512_mask_cvtsepi32_epi16(src, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
void
|
||||
simde_mm512_mask_cvtsepi32_storeu_epi16 (void* base_addr, simde__mmask16 k, simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
_mm512_mask_cvtsepi32_storeu_epi16(base_addr, k, a);
|
||||
#else
|
||||
simde__m256i_private r_;
|
||||
simde__m256i_private src_ = simde__m256i_to_private(simde_mm256_loadu_epi16(base_addr));
|
||||
simde__m512i_private a_ = simde__m512i_to_private(a);
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(a_.i32) / sizeof(a_.i32[0])) ; i++) {
|
||||
r_.i16[i] = ((k>>i) &1 ) ?
|
||||
((a_.i32[i] < INT16_MIN)
|
||||
? (INT16_MIN)
|
||||
: ((a_.i32[i] > INT16_MAX)
|
||||
? (INT16_MAX)
|
||||
: HEDLEY_STATIC_CAST(int16_t, a_.i32[i]))) : src_.i16[i];
|
||||
}
|
||||
|
||||
simde_mm256_storeu_epi16(base_addr, simde__m256i_from_private(r_));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_cvtsepi32_storeu_epi16
|
||||
#define _mm512_mask_cvtsepi32_storeu_epi16(base_addr, k, a) simde_mm512_mask_cvtsepi32_storeu_epi16(base_addr, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm512_maskz_cvtsepi32_epi16 (simde__mmask16 k, simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_maskz_cvtsepi32_epi16(k, a);
|
||||
#else
|
||||
simde__m256i_private r_;
|
||||
simde__m512i_private a_ = simde__m512i_to_private(a);
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(a_.i32) / sizeof(a_.i32[0])) ; i++) {
|
||||
r_.i16[i] = ((k>>i) &1 ) ?
|
||||
((a_.i32[i] < INT16_MIN)
|
||||
? (INT16_MIN)
|
||||
: ((a_.i32[i] > INT16_MAX)
|
||||
? (INT16_MAX)
|
||||
: HEDLEY_STATIC_CAST(int16_t, a_.i32[i]))) : INT16_C(0);
|
||||
}
|
||||
|
||||
return simde__m256i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_cvtsepi32_epi16
|
||||
#define _mm512_maskz_cvtsepi32_epi16(k, a) simde_mm512_maskz_cvtsepi32_epi16(k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm512_cvtsepi64_epi8 (simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_cvtsepi64_epi8(a);
|
||||
#else
|
||||
simde__m128i_private r_ = simde__m128i_to_private(simde_mm_setzero_si128());
|
||||
simde__m512i_private a_ = simde__m512i_to_private(a);
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(a_.i64) / sizeof(a_.i64[0])) ; i++) {
|
||||
r_.i8[i] =
|
||||
(a_.i64[i] < INT8_MIN)
|
||||
? (INT8_MIN)
|
||||
: ((a_.i64[i] > INT8_MAX)
|
||||
? (INT8_MAX)
|
||||
: HEDLEY_STATIC_CAST(int8_t, a_.i64[i]));
|
||||
}
|
||||
|
||||
return simde__m128i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_cvtsepi64_epi8
|
||||
#define _mm512_cvtsepi64_epi8(a) simde_mm512_cvtsepi64_epi8(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm512_mask_cvtsepi64_epi8 (simde__m128i src, simde__mmask8 k, simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_cvtsepi64_epi8(src, k, a);
|
||||
#else
|
||||
simde__m128i_private r_ = simde__m128i_to_private(simde_mm_setzero_si128());
|
||||
simde__m128i_private src_ = simde__m128i_to_private(src);
|
||||
simde__m512i_private a_ = simde__m512i_to_private(a);
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(a_.i64) / sizeof(a_.i64[0])) ; i++) {
|
||||
r_.i8[i] = ((k>>i) &1 ) ?
|
||||
((a_.i64[i] < INT8_MIN)
|
||||
? (INT8_MIN)
|
||||
: ((a_.i64[i] > INT8_MAX)
|
||||
? (INT8_MAX)
|
||||
: HEDLEY_STATIC_CAST(int8_t, a_.i64[i]))) : src_.i8[i];
|
||||
}
|
||||
|
||||
return simde__m128i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_cvtsepi64_epi8
|
||||
#define _mm512_mask_cvtsepi64_epi8(src, k, a) simde_mm512_mask_cvtsepi64_epi8(src, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm512_maskz_cvtsepi64_epi8 (simde__mmask8 k, simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_maskz_cvtsepi64_epi8(k, a);
|
||||
#else
|
||||
simde__m128i_private r_ = simde__m128i_to_private(simde_mm_setzero_si128());
|
||||
simde__m512i_private a_ = simde__m512i_to_private(a);
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(a_.i64) / sizeof(a_.i64[0])) ; i++) {
|
||||
r_.i8[i] = ((k>>i) &1 ) ?
|
||||
((a_.i64[i] < INT8_MIN)
|
||||
? (INT8_MIN)
|
||||
: ((a_.i64[i] > INT8_MAX)
|
||||
? (INT8_MAX)
|
||||
: HEDLEY_STATIC_CAST(int8_t, a_.i64[i]))) : INT8_C(0);
|
||||
}
|
||||
|
||||
return simde__m128i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_cvtsepi64_epi8
|
||||
#define _mm512_maskz_cvtsepi64_epi8(k, a) simde_mm512_maskz_cvtsepi64_epi8(k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm512_cvtsepi64_epi16 (simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_cvtsepi64_epi16(a);
|
||||
#else
|
||||
simde__m128i_private r_ = simde__m128i_to_private(simde_mm_setzero_si128());
|
||||
simde__m512i_private a_ = simde__m512i_to_private(a);
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(a_.i64) / sizeof(a_.i64[0])) ; i++) {
|
||||
r_.i16[i] =
|
||||
(a_.i64[i] < INT16_MIN)
|
||||
? (INT16_MIN)
|
||||
: ((a_.i64[i] > INT16_MAX)
|
||||
? (INT16_MAX)
|
||||
: HEDLEY_STATIC_CAST(int16_t, a_.i64[i]));
|
||||
}
|
||||
|
||||
return simde__m128i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_cvtsepi64_epi16
|
||||
#define _mm512_cvtsepi64_epi16(a) simde_mm512_cvtsepi64_epi16(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm512_mask_cvtsepi64_epi16 (simde__m128i src, simde__mmask8 k, simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_cvtsepi64_epi16(src, k, a);
|
||||
#else
|
||||
simde__m128i_private r_ = simde__m128i_to_private(simde_mm_setzero_si128());
|
||||
simde__m128i_private src_ = simde__m128i_to_private(src);
|
||||
simde__m512i_private a_ = simde__m512i_to_private(a);
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(a_.i64) / sizeof(a_.i64[0])) ; i++) {
|
||||
r_.i16[i] = ((k>>i) & 1) ?
|
||||
((a_.i64[i] < INT16_MIN)
|
||||
? (INT16_MIN)
|
||||
: ((a_.i64[i] > INT16_MAX)
|
||||
? (INT16_MAX)
|
||||
: HEDLEY_STATIC_CAST(int16_t, a_.i64[i]))) : src_.i16[i];
|
||||
}
|
||||
|
||||
return simde__m128i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_cvtsepi64_epi16
|
||||
#define _mm512_mask_cvtsepi64_epi16(src, k, a) simde_mm512_mask_cvtsepi64_epi16(src, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm512_maskz_cvtsepi64_epi16 (simde__mmask8 k, simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_maskz_cvtsepi64_epi16(k, a);
|
||||
#else
|
||||
simde__m128i_private r_ = simde__m128i_to_private(simde_mm_setzero_si128());
|
||||
simde__m512i_private a_ = simde__m512i_to_private(a);
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(a_.i64) / sizeof(a_.i64[0])) ; i++) {
|
||||
r_.i16[i] = ((k>>i) & 1) ?
|
||||
((a_.i64[i] < INT16_MIN)
|
||||
? (INT16_MIN)
|
||||
: ((a_.i64[i] > INT16_MAX)
|
||||
? (INT16_MAX)
|
||||
: HEDLEY_STATIC_CAST(int16_t, a_.i64[i]))) : INT16_C(0);
|
||||
}
|
||||
|
||||
return simde__m128i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_cvtsepi64_epi16
|
||||
#define _mm512_maskz_cvtsepi64_epi16(k, a) simde_mm512_maskz_cvtsepi64_epi16(k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm512_cvtsepi64_epi32 (simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_cvtsepi64_epi32(a);
|
||||
#else
|
||||
simde__m256i_private r_;
|
||||
simde__m512i_private a_ = simde__m512i_to_private(a);
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(a_.i64) / sizeof(a_.i64[0])) ; i++) {
|
||||
r_.i32[i] =
|
||||
(a_.i64[i] < INT32_MIN)
|
||||
? (INT32_MIN)
|
||||
: ((a_.i64[i] > INT32_MAX)
|
||||
? (INT32_MAX)
|
||||
: HEDLEY_STATIC_CAST(int32_t, a_.i64[i]));
|
||||
}
|
||||
|
||||
return simde__m256i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_cvtsepi64_epi32
|
||||
#define _mm512_cvtsepi64_epi32(a) simde_mm512_cvtsepi64_epi32(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm512_mask_cvtsepi64_epi32 (simde__m256i src, simde__mmask8 k, simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_cvtsepi64_epi32(src, k, a);
|
||||
#else
|
||||
simde__m256i_private r_;
|
||||
simde__m256i_private src_ = simde__m256i_to_private(src);
|
||||
simde__m512i_private a_ = simde__m512i_to_private(a);
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(a_.i64) / sizeof(a_.i64[0])) ; i++) {
|
||||
r_.i32[i] = ((k>>i) & 1) ?
|
||||
((a_.i64[i] < INT32_MIN)
|
||||
? (INT32_MIN)
|
||||
: ((a_.i64[i] > INT32_MAX)
|
||||
? (INT32_MAX)
|
||||
: HEDLEY_STATIC_CAST(int32_t, a_.i64[i]))) : src_.i32[i];
|
||||
}
|
||||
|
||||
return simde__m256i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_cvtsepi64_epi32
|
||||
#define _mm512_mask_cvtsepi64_epi32(src, k, a) simde_mm512_mask_cvtsepi64_epi32(src, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm512_maskz_cvtsepi64_epi32 (simde__mmask8 k, simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_maskz_cvtsepi64_epi32(k, a);
|
||||
#else
|
||||
simde__m256i_private r_;
|
||||
simde__m512i_private a_ = simde__m512i_to_private(a);
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(a_.i64) / sizeof(a_.i64[0])) ; i++) {
|
||||
r_.i32[i] = ((k>>i) & 1) ?
|
||||
((a_.i64[i] < INT32_MIN)
|
||||
? (INT32_MIN)
|
||||
: ((a_.i64[i] > INT32_MAX)
|
||||
? (INT32_MAX)
|
||||
: HEDLEY_STATIC_CAST(int32_t, a_.i64[i]))) : INT32_C(0);
|
||||
}
|
||||
|
||||
return simde__m256i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_cvtsepi64_epi32
|
||||
#define _mm512_maskz_cvtsepi64_epi32(k, a) simde_mm512_maskz_cvtsepi64_epi32(k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_CVTS_H) */
|
||||
@@ -0,0 +1,130 @@
|
||||
/* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Copyright:
|
||||
* 2021 Evan Nemerson <evan@nemerson.com>
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512_CVTT_H)
|
||||
#define SIMDE_X86_AVX512_CVTT_H
|
||||
|
||||
#include "types.h"
|
||||
#include "mov.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_cvttpd_epi64 (simde__m128d a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
return _mm_cvttpd_epi64(a);
|
||||
#else
|
||||
simde__m128i_private r_;
|
||||
simde__m128d_private a_ = simde__m128d_to_private(a);
|
||||
|
||||
#if defined(SIMDE_X86_SSE2_NATIVE) && defined(SIMDE_ARCH_AMD64)
|
||||
r_.n =
|
||||
_mm_set_epi64x(
|
||||
_mm_cvttsd_si64(_mm_unpackhi_pd(a_.n, a_.n)),
|
||||
_mm_cvttsd_si64(a_.n)
|
||||
);
|
||||
#elif defined(SIMDE_ARM_NEON_A64V8_NATIVE)
|
||||
r_.neon_i64 = vcvtq_s64_f64(a_.neon_f64);
|
||||
#elif defined(SIMDE_POWER_ALTIVEC_P7_NATIVE) || defined(SIMDE_ZARCH_ZVECTOR_13_NATIVE)
|
||||
r_.altivec_i64 = vec_signed(a_.altivec_f64);
|
||||
#elif defined(SIMDE_CONVERT_VECTOR_)
|
||||
SIMDE_CONVERT_VECTOR_(r_.i64, a_.f64);
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i64) / sizeof(r_.i64[0])) ; i++) {
|
||||
r_.i64[i] = HEDLEY_STATIC_CAST(int64_t, a_.f64[i]);
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m128i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) || defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_cvttpd_epi64
|
||||
#define _mm_cvttpd_epi64(a) simde_mm_cvttpd_epi64(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_mask_cvttpd_epi64(simde__m128i src, simde__mmask8 k, simde__m128d a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
return _mm_mask_cvttpd_epi64(src, k, a);
|
||||
#else
|
||||
return simde_mm_mask_mov_epi64(src, k, simde_mm_cvttpd_epi64(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) || defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_cvttpd_epi64
|
||||
#define _mm_mask_cvttpd_epi64(src, k, a) simde_mm_mask_cvttpd_epi64(src, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_maskz_cvttpd_epi64(simde__mmask8 k, simde__m128d a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
return _mm_maskz_cvttpd_epi64(k, a);
|
||||
#else
|
||||
return simde_mm_maskz_mov_epi64(k, simde_mm_cvttpd_epi64(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) || defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_maskz_cvttpd_epi64
|
||||
#define _mm_maskz_cvttpd_epi64(k, a) simde_mm_maskz_cvttpd_epi64(k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_cvttps_epi32 (simde__m512 a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_cvttps_epi32(a);
|
||||
#else
|
||||
simde__m512i_private r_;
|
||||
simde__m512_private a_ = simde__m512_to_private(a);
|
||||
|
||||
#if defined(simde_math_truncf)
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i32) / sizeof(r_.i32[0])) ; i++) {
|
||||
r_.i32[i] = SIMDE_CONVERT_FTOI(int32_t, simde_math_truncf(a_.f32[i]));
|
||||
}
|
||||
#else
|
||||
HEDLEY_UNREACHABLE();
|
||||
#endif
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_cvttps_epi32
|
||||
#define _mm512_cvttps_epi32(a) simde_mm512_cvttps_epi32(a)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_CVTT_H) */
|
||||
@@ -0,0 +1,67 @@
|
||||
/* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Copyright:
|
||||
* 2023 Michael R. Crusoe <crusoe@debian.org>
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512_CVTUS_H)
|
||||
#define SIMDE_X86_AVX512_CVTUS_H
|
||||
|
||||
#include "types.h"
|
||||
#include "mov.h"
|
||||
#include "storeu.h"
|
||||
#include "loadu.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
void
|
||||
simde_mm512_mask_cvtusepi32_storeu_epi8 (void* base_addr, simde__mmask16 k, simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
_mm512_mask_cvtusepi32_storeu_epi8(base_addr, k, a);
|
||||
#else
|
||||
simde__m256i_private r_ = simde__m256i_to_private(simde_mm256_loadu_epi8(base_addr));
|
||||
simde__m512i_private a_ = simde__m512i_to_private(a);
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(a_.u32) / sizeof(a_.u32[0])) ; i++) {
|
||||
r_.i8[i] = ((k>>i) &1 ) ?
|
||||
((a_.u32[i] > UINT8_MAX)
|
||||
? (HEDLEY_STATIC_CAST(int8_t, UINT8_MAX))
|
||||
: HEDLEY_STATIC_CAST(int8_t, a_.u32[i])) : r_.i8[i];
|
||||
}
|
||||
|
||||
simde_mm256_storeu_epi8(base_addr, simde__m256i_from_private(r_));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_cvtusepi32_storeu_epi8
|
||||
#define _mm512_mask_cvtusepi32_storeu_epi8(base_addr, k, a) simde_mm512_mask_cvtusepi32_storeu_epi8((base_addr), (k), (a))
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_CVTUS_H) */
|
||||
@@ -0,0 +1,388 @@
|
||||
#if !defined(SIMDE_X86_AVX512_DBSAD_H)
|
||||
#define SIMDE_X86_AVX512_DBSAD_H
|
||||
|
||||
#include "types.h"
|
||||
#include "mov.h"
|
||||
#include "../avx2.h"
|
||||
#include "shuffle.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
#define simde_mm_dbsad_epu8(a, b, imm8) _mm_dbsad_epu8((a), (b), (imm8))
|
||||
#else
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_dbsad_epu8_internal_ (simde__m128i a, simde__m128i b) {
|
||||
simde__m128i_private
|
||||
r_,
|
||||
a_ = simde__m128i_to_private(a),
|
||||
b_ = simde__m128i_to_private(b);
|
||||
|
||||
#if defined(SIMDE_VECTOR_SUBSCRIPT_SCALAR) && HEDLEY_HAS_BUILTIN(__builtin_shufflevector)
|
||||
uint8_t a1 SIMDE_VECTOR(16) =
|
||||
SIMDE_SHUFFLE_VECTOR_(
|
||||
8, 16, a_.u8, a_.u8,
|
||||
0, 1, 0, 1,
|
||||
4, 5, 4, 5,
|
||||
8, 9, 8, 9,
|
||||
12, 13, 12, 13);
|
||||
uint8_t b1 SIMDE_VECTOR(16) =
|
||||
SIMDE_SHUFFLE_VECTOR_(
|
||||
8, 16, b_.u8, b_.u8,
|
||||
0, 1, 1, 2,
|
||||
2, 3, 3, 4,
|
||||
8, 9, 9, 10,
|
||||
10, 11, 11, 12);
|
||||
|
||||
__typeof__(r_.u8) abd1_mask = HEDLEY_REINTERPRET_CAST(__typeof__(abd1_mask), a1 < b1);
|
||||
__typeof__(r_.u8) abd1 = (((b1 - a1) & abd1_mask) | ((a1 - b1) & ~abd1_mask));
|
||||
|
||||
r_.u16 =
|
||||
__builtin_convertvector(__builtin_shufflevector(abd1, abd1, 0, 2, 4, 6, 8, 10, 12, 14), __typeof__(r_.u16)) +
|
||||
__builtin_convertvector(__builtin_shufflevector(abd1, abd1, 1, 3, 5, 7, 9, 11, 13, 15), __typeof__(r_.u16));
|
||||
|
||||
uint8_t a2 SIMDE_VECTOR(16) =
|
||||
SIMDE_SHUFFLE_VECTOR_(
|
||||
8, 16, a_.u8, a_.u8,
|
||||
2, 3, 2, 3,
|
||||
6, 7, 6, 7,
|
||||
10, 11, 10, 11,
|
||||
14, 15, 14, 15);
|
||||
uint8_t b2 SIMDE_VECTOR(16) =
|
||||
SIMDE_SHUFFLE_VECTOR_(
|
||||
8, 16, b_.u8, b_.u8,
|
||||
2, 3, 3, 4,
|
||||
4, 5, 5, 6,
|
||||
10, 11, 11, 12,
|
||||
12, 13, 13, 14);
|
||||
|
||||
__typeof__(r_.u8) abd2_mask = HEDLEY_REINTERPRET_CAST(__typeof__(abd2_mask), a2 < b2);
|
||||
__typeof__(r_.u8) abd2 = (((b2 - a2) & abd2_mask) | ((a2 - b2) & ~abd2_mask));
|
||||
|
||||
r_.u16 +=
|
||||
__builtin_convertvector(__builtin_shufflevector(abd2, abd2, 0, 2, 4, 6, 8, 10, 12, 14), __typeof__(r_.u16)) +
|
||||
__builtin_convertvector(__builtin_shufflevector(abd2, abd2, 1, 3, 5, 7, 9, 11, 13, 15), __typeof__(r_.u16));
|
||||
#else
|
||||
for (size_t i = 0 ; i < (sizeof(r_.u16) / sizeof(r_.u16[0])) ; i++) {
|
||||
r_.u16[i] = 0;
|
||||
for (size_t j = 0 ; j < 4 ; j++) {
|
||||
uint16_t A = HEDLEY_STATIC_CAST(uint16_t, a_.u8[((i << 1) & 12) + j]);
|
||||
uint16_t B = HEDLEY_STATIC_CAST(uint16_t, b_.u8[((i & 3) | ((i << 1) & 8)) + j]);
|
||||
r_.u16[i] += (A < B) ? (B - A) : (A - B);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m128i_from_private(r_);
|
||||
}
|
||||
#define simde_mm_dbsad_epu8(a, b, imm8) simde_mm_dbsad_epu8_internal_((a), simde_mm_shuffle_epi32((b), (imm8)))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_dbsad_epu8
|
||||
#define _mm_dbsad_epu8(a, b, imm8) simde_mm_dbsad_epu8(a, b, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
#define simde_mm_mask_dbsad_epu8(src, k, a, b, imm8) _mm_mask_dbsad_epu8((src), (k), (a), (b), (imm8))
|
||||
#else
|
||||
#define simde_mm_mask_dbsad_epu8(src, k, a, b, imm8) simde_mm_mask_mov_epi16(src, k, simde_mm_dbsad_epu8(a, b, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_dbsad_epu8
|
||||
#define _mm_mask_dbsad_epu8(src, k, a, b, imm8) simde_mm_mask_dbsad_epu8(src, k, a, b, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
#define simde_mm_maskz_dbsad_epu8(k, a, b, imm8) _mm_maskz_dbsad_epu8((k), (a), (b), (imm8))
|
||||
#else
|
||||
#define simde_mm_maskz_dbsad_epu8(k, a, b, imm8) simde_mm_maskz_mov_epi16(k, simde_mm_dbsad_epu8(a, b, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_maskz_dbsad_epu8
|
||||
#define _mm_maskz_dbsad_epu8(k, a, b, imm8) simde_mm_maskz_dbsad_epu8(k, a, b, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
#define simde_mm256_dbsad_epu8(a, b, imm8) _mm256_dbsad_epu8((a), (b), (imm8))
|
||||
#elif SIMDE_NATURAL_VECTOR_SIZE_LE(128) && defined(SIMDE_STATEMENT_EXPR_)
|
||||
#define simde_mm256_dbsad_epu8(a, b, imm8) SIMDE_STATEMENT_EXPR_(({ \
|
||||
simde__m256i_private \
|
||||
simde_mm256_dbsad_epu8_a_ = simde__m256i_to_private(a), \
|
||||
simde_mm256_dbsad_epu8_b_ = simde__m256i_to_private(b); \
|
||||
\
|
||||
simde_mm256_dbsad_epu8_a_.m128i[0] = simde_mm_dbsad_epu8(simde_mm256_dbsad_epu8_a_.m128i[0], simde_mm256_dbsad_epu8_b_.m128i[0], imm8); \
|
||||
simde_mm256_dbsad_epu8_a_.m128i[1] = simde_mm_dbsad_epu8(simde_mm256_dbsad_epu8_a_.m128i[1], simde_mm256_dbsad_epu8_b_.m128i[1], imm8); \
|
||||
\
|
||||
simde__m256i_from_private(simde_mm256_dbsad_epu8_a_); \
|
||||
}))
|
||||
#else
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_dbsad_epu8_internal_ (simde__m256i a, simde__m256i b) {
|
||||
simde__m256i_private
|
||||
r_,
|
||||
a_ = simde__m256i_to_private(a),
|
||||
b_ = simde__m256i_to_private(b);
|
||||
|
||||
#if defined(SIMDE_VECTOR_SUBSCRIPT_SCALAR) && HEDLEY_HAS_BUILTIN(__builtin_shufflevector)
|
||||
uint8_t a1 SIMDE_VECTOR(32) =
|
||||
SIMDE_SHUFFLE_VECTOR_(
|
||||
8, 32, a_.u8, a_.u8,
|
||||
0, 1, 0, 1,
|
||||
4, 5, 4, 5,
|
||||
8, 9, 8, 9,
|
||||
12, 13, 12, 13,
|
||||
16, 17, 16, 17,
|
||||
20, 21, 20, 21,
|
||||
24, 25, 24, 25,
|
||||
28, 29, 28, 29);
|
||||
uint8_t b1 SIMDE_VECTOR(32) =
|
||||
SIMDE_SHUFFLE_VECTOR_(
|
||||
8, 16, b_.u8, b_.u8,
|
||||
0, 1, 1, 2,
|
||||
2, 3, 3, 4,
|
||||
8, 9, 9, 10,
|
||||
10, 11, 11, 12,
|
||||
16, 17, 17, 18,
|
||||
18, 19, 19, 20,
|
||||
24, 25, 25, 26,
|
||||
26, 27, 27, 28);
|
||||
|
||||
__typeof__(r_.u8) abd1_mask = HEDLEY_REINTERPRET_CAST(__typeof__(abd1_mask), a1 < b1);
|
||||
__typeof__(r_.u8) abd1 = (((b1 - a1) & abd1_mask) | ((a1 - b1) & ~abd1_mask));
|
||||
|
||||
r_.u16 =
|
||||
__builtin_convertvector(__builtin_shufflevector(abd1, abd1, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30), __typeof__(r_.u16)) +
|
||||
__builtin_convertvector(__builtin_shufflevector(abd1, abd1, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31), __typeof__(r_.u16));
|
||||
|
||||
uint8_t a2 SIMDE_VECTOR(32) =
|
||||
SIMDE_SHUFFLE_VECTOR_(
|
||||
8, 32, a_.u8, a_.u8,
|
||||
2, 3, 2, 3,
|
||||
6, 7, 6, 7,
|
||||
10, 11, 10, 11,
|
||||
14, 15, 14, 15,
|
||||
18, 19, 18, 19,
|
||||
22, 23, 22, 23,
|
||||
26, 27, 26, 27,
|
||||
30, 31, 30, 31);
|
||||
uint8_t b2 SIMDE_VECTOR(32) =
|
||||
SIMDE_SHUFFLE_VECTOR_(
|
||||
8, 16, b_.u8, b_.u8,
|
||||
2, 3, 3, 4,
|
||||
4, 5, 5, 6,
|
||||
10, 11, 11, 12,
|
||||
12, 13, 13, 14,
|
||||
18, 19, 19, 20,
|
||||
20, 21, 21, 22,
|
||||
26, 27, 27, 28,
|
||||
28, 29, 29, 30);
|
||||
|
||||
__typeof__(r_.u8) abd2_mask = HEDLEY_REINTERPRET_CAST(__typeof__(abd2_mask), a2 < b2);
|
||||
__typeof__(r_.u8) abd2 = (((b2 - a2) & abd2_mask) | ((a2 - b2) & ~abd2_mask));
|
||||
|
||||
r_.u16 +=
|
||||
__builtin_convertvector(__builtin_shufflevector(abd2, abd2, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30), __typeof__(r_.u16)) +
|
||||
__builtin_convertvector(__builtin_shufflevector(abd2, abd2, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31), __typeof__(r_.u16));
|
||||
#else
|
||||
for (size_t i = 0 ; i < (sizeof(r_.u16) / sizeof(r_.u16[0])) ; i++) {
|
||||
r_.u16[i] = 0;
|
||||
for (size_t j = 0 ; j < 4 ; j++) {
|
||||
uint16_t A = HEDLEY_STATIC_CAST(uint16_t, a_.u8[(((i << 1) & 12) | ((i & 8) << 1)) + j]);
|
||||
uint16_t B = HEDLEY_STATIC_CAST(uint16_t, b_.u8[((i & 3) | ((i << 1) & 8) | ((i & 8) << 1)) + j]);
|
||||
r_.u16[i] += (A < B) ? (B - A) : (A - B);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m256i_from_private(r_);
|
||||
}
|
||||
#define simde_mm256_dbsad_epu8(a, b, imm8) simde_mm256_dbsad_epu8_internal_((a), simde_mm256_shuffle_epi32(b, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_dbsad_epu8
|
||||
#define _mm256_dbsad_epu8(a, b, imm8) simde_mm256_dbsad_epu8(a, b, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
#define simde_mm256_mask_dbsad_epu8(src, k, a, b, imm8) _mm256_mask_dbsad_epu8((src), (k), (a), (b), (imm8))
|
||||
#else
|
||||
#define simde_mm256_mask_dbsad_epu8(src, k, a, b, imm8) simde_mm256_mask_mov_epi16(src, k, simde_mm256_dbsad_epu8(a, b, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_mask_dbsad_epu8
|
||||
#define _mm256_mask_dbsad_epu8(src, k, a, b, imm8) simde_mm256_mask_dbsad_epu8(src, k, a, b, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
#define simde_mm256_maskz_dbsad_epu8(k, a, b, imm8) _mm256_maskz_dbsad_epu8((k), (a), (b), (imm8))
|
||||
#else
|
||||
#define simde_mm256_maskz_dbsad_epu8(k, a, b, imm8) simde_mm256_maskz_mov_epi16(k, simde_mm256_dbsad_epu8(a, b, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_maskz_dbsad_epu8
|
||||
#define _mm256_maskz_dbsad_epu8(k, a, b, imm8) simde_mm256_maskz_dbsad_epu8(k, a, b, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
#define simde_mm512_dbsad_epu8(a, b, imm8) _mm512_dbsad_epu8((a), (b), (imm8))
|
||||
#elif SIMDE_NATURAL_VECTOR_SIZE_LE(256) && defined(SIMDE_STATEMENT_EXPR_)
|
||||
#define simde_mm512_dbsad_epu8(a, b, imm8) SIMDE_STATEMENT_EXPR_(({ \
|
||||
simde__m512i_private \
|
||||
simde_mm512_dbsad_epu8_a_ = simde__m512i_to_private(a), \
|
||||
simde_mm512_dbsad_epu8_b_ = simde__m512i_to_private(b); \
|
||||
\
|
||||
simde_mm512_dbsad_epu8_a_.m256i[0] = simde_mm256_dbsad_epu8(simde_mm512_dbsad_epu8_a_.m256i[0], simde_mm512_dbsad_epu8_b_.m256i[0], imm8); \
|
||||
simde_mm512_dbsad_epu8_a_.m256i[1] = simde_mm256_dbsad_epu8(simde_mm512_dbsad_epu8_a_.m256i[1], simde_mm512_dbsad_epu8_b_.m256i[1], imm8); \
|
||||
\
|
||||
simde__m512i_from_private(simde_mm512_dbsad_epu8_a_); \
|
||||
}))
|
||||
#else
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_dbsad_epu8_internal_ (simde__m512i a, simde__m512i b) {
|
||||
simde__m512i_private
|
||||
r_,
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b);
|
||||
|
||||
#if defined(SIMDE_VECTOR_SUBSCRIPT_SCALAR) && HEDLEY_HAS_BUILTIN(__builtin_shufflevector)
|
||||
uint8_t a1 SIMDE_VECTOR(64) =
|
||||
SIMDE_SHUFFLE_VECTOR_(
|
||||
8, 64, a_.u8, a_.u8,
|
||||
0, 1, 0, 1,
|
||||
4, 5, 4, 5,
|
||||
8, 9, 8, 9,
|
||||
12, 13, 12, 13,
|
||||
16, 17, 16, 17,
|
||||
20, 21, 20, 21,
|
||||
24, 25, 24, 25,
|
||||
28, 29, 28, 29,
|
||||
32, 33, 32, 33,
|
||||
36, 37, 36, 37,
|
||||
40, 41, 40, 41,
|
||||
44, 45, 44, 45,
|
||||
48, 49, 48, 49,
|
||||
52, 53, 52, 53,
|
||||
56, 57, 56, 57,
|
||||
60, 61, 60, 61);
|
||||
uint8_t b1 SIMDE_VECTOR(64) =
|
||||
SIMDE_SHUFFLE_VECTOR_(
|
||||
8, 64, b_.u8, b_.u8,
|
||||
0, 1, 1, 2,
|
||||
2, 3, 3, 4,
|
||||
8, 9, 9, 10,
|
||||
10, 11, 11, 12,
|
||||
16, 17, 17, 18,
|
||||
18, 19, 19, 20,
|
||||
24, 25, 25, 26,
|
||||
26, 27, 27, 28,
|
||||
32, 33, 33, 34,
|
||||
34, 35, 35, 36,
|
||||
40, 41, 41, 42,
|
||||
42, 43, 43, 44,
|
||||
48, 49, 49, 50,
|
||||
50, 51, 51, 52,
|
||||
56, 57, 57, 58,
|
||||
58, 59, 59, 60);
|
||||
|
||||
__typeof__(r_.u8) abd1_mask = HEDLEY_REINTERPRET_CAST(__typeof__(abd1_mask), a1 < b1);
|
||||
__typeof__(r_.u8) abd1 = (((b1 - a1) & abd1_mask) | ((a1 - b1) & ~abd1_mask));
|
||||
|
||||
r_.u16 =
|
||||
__builtin_convertvector(__builtin_shufflevector(abd1, abd1, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62), __typeof__(r_.u16)) +
|
||||
__builtin_convertvector(__builtin_shufflevector(abd1, abd1, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53, 55, 57, 59, 61, 63), __typeof__(r_.u16));
|
||||
|
||||
uint8_t a2 SIMDE_VECTOR(64) =
|
||||
SIMDE_SHUFFLE_VECTOR_(
|
||||
8, 64, a_.u8, a_.u8,
|
||||
2, 3, 2, 3,
|
||||
6, 7, 6, 7,
|
||||
10, 11, 10, 11,
|
||||
14, 15, 14, 15,
|
||||
18, 19, 18, 19,
|
||||
22, 23, 22, 23,
|
||||
26, 27, 26, 27,
|
||||
30, 31, 30, 31,
|
||||
34, 35, 34, 35,
|
||||
38, 39, 38, 39,
|
||||
42, 43, 42, 43,
|
||||
46, 47, 46, 47,
|
||||
50, 51, 50, 51,
|
||||
54, 55, 54, 55,
|
||||
58, 59, 58, 59,
|
||||
62, 63, 62, 63);
|
||||
uint8_t b2 SIMDE_VECTOR(64) =
|
||||
SIMDE_SHUFFLE_VECTOR_(
|
||||
8, 64, b_.u8, b_.u8,
|
||||
2, 3, 3, 4,
|
||||
4, 5, 5, 6,
|
||||
10, 11, 11, 12,
|
||||
12, 13, 13, 14,
|
||||
18, 19, 19, 20,
|
||||
20, 21, 21, 22,
|
||||
26, 27, 27, 28,
|
||||
28, 29, 29, 30,
|
||||
34, 35, 35, 36,
|
||||
36, 37, 37, 38,
|
||||
42, 43, 43, 44,
|
||||
44, 45, 45, 46,
|
||||
50, 51, 51, 52,
|
||||
52, 53, 53, 54,
|
||||
58, 59, 59, 60,
|
||||
60, 61, 61, 62);
|
||||
|
||||
__typeof__(r_.u8) abd2_mask = HEDLEY_REINTERPRET_CAST(__typeof__(abd2_mask), a2 < b2);
|
||||
__typeof__(r_.u8) abd2 = (((b2 - a2) & abd2_mask) | ((a2 - b2) & ~abd2_mask));
|
||||
|
||||
r_.u16 +=
|
||||
__builtin_convertvector(__builtin_shufflevector(abd2, abd2, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62), __typeof__(r_.u16)) +
|
||||
__builtin_convertvector(__builtin_shufflevector(abd2, abd2, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53, 55, 57, 59, 61, 63), __typeof__(r_.u16));
|
||||
#else
|
||||
for (size_t i = 0 ; i < (sizeof(r_.u16) / sizeof(r_.u16[0])) ; i++) {
|
||||
r_.u16[i] = 0;
|
||||
for (size_t j = 0 ; j < 4 ; j++) {
|
||||
uint16_t A = HEDLEY_STATIC_CAST(uint16_t, a_.u8[(((i << 1) & 12) | ((i & 8) << 1) | ((i & 16) << 1)) + j]);
|
||||
uint16_t B = HEDLEY_STATIC_CAST(uint16_t, b_.u8[((i & 3) | ((i << 1) & 8) | ((i & 8) << 1) | ((i & 16) << 1)) + j]);
|
||||
r_.u16[i] += (A < B) ? (B - A) : (A - B);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
}
|
||||
#define simde_mm512_dbsad_epu8(a, b, imm8) simde_mm512_dbsad_epu8_internal_((a), simde_mm512_castps_si512(simde_mm512_shuffle_ps(simde_mm512_castsi512_ps(b), simde_mm512_castsi512_ps(b), imm8)))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_dbsad_epu8
|
||||
#define _mm512_dbsad_epu8(a, b, imm8) simde_mm512_dbsad_epu8(a, b, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
#define simde_mm512_mask_dbsad_epu8(src, k, a, b, imm8) _mm512_mask_dbsad_epu8((src), (k), (a), (b), (imm8))
|
||||
#else
|
||||
#define simde_mm512_mask_dbsad_epu8(src, k, a, b, imm8) simde_mm512_mask_mov_epi16(src, k, simde_mm512_dbsad_epu8(a, b, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_dbsad_epu8
|
||||
#define _mm512_mask_dbsad_epu8(src, k, a, b, imm8) simde_mm512_mask_dbsad_epu8(src, k, a, b, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
#define simde_mm512_maskz_dbsad_epu8(k, a, b, imm8) _mm512_maskz_dbsad_epu8((k), (a), (b), (imm8))
|
||||
#else
|
||||
#define simde_mm512_maskz_dbsad_epu8(k, a, b, imm8) simde_mm512_maskz_mov_epi16(k, simde_mm512_dbsad_epu8(a, b, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_dbsad_epu8
|
||||
#define _mm512_maskz_dbsad_epu8(k, a, b, imm8) simde_mm512_maskz_dbsad_epu8(k, a, b, imm8)
|
||||
#endif
|
||||
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_DBSAD_H) */
|
||||
@@ -0,0 +1,162 @@
|
||||
/* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Copyright:
|
||||
* 2020 Evan Nemerson <evan@nemerson.com>
|
||||
* 2020 Himanshi Mathur <himanshi18037@iiitd.ac.in>
|
||||
* 2020 Hidayat Khan <huk2209@gmail.com>
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512_DIV_H)
|
||||
#define SIMDE_X86_AVX512_DIV_H
|
||||
|
||||
#include "types.h"
|
||||
#include "mov.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_div_ps (simde__m512 a, simde__m512 b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_div_ps(a, b);
|
||||
#else
|
||||
simde__m512_private
|
||||
r_,
|
||||
a_ = simde__m512_to_private(a),
|
||||
b_ = simde__m512_to_private(b);
|
||||
|
||||
#if SIMDE_NATURAL_VECTOR_SIZE_LE(256)
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m256) / sizeof(r_.m256[0])) ; i++) {
|
||||
r_.m256[i] = simde_mm256_div_ps(a_.m256[i], b_.m256[i]);
|
||||
}
|
||||
#elif defined(SIMDE_VECTOR_SUBSCRIPT_OPS)
|
||||
r_.f32 = a_.f32 / b_.f32;
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m256) / sizeof(r_.m256[0])) ; i++) {
|
||||
r_.m256[i] = simde_mm256_div_ps(a_.m256[i], b_.m256[i]);
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_div_ps
|
||||
#define _mm512_div_ps(a, b) simde_mm512_div_ps(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_mask_div_ps(simde__m512 src, simde__mmask16 k, simde__m512 a, simde__m512 b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_div_ps(src, k, a, b);
|
||||
#else
|
||||
return simde_mm512_mask_mov_ps(src, k, simde_mm512_div_ps(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_div_ps
|
||||
#define _mm512_mask_div_ps(src, k, a, b) simde_mm512_mask_div_ps(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_maskz_div_ps(simde__mmask16 k, simde__m512 a, simde__m512 b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_maskz_div_ps(k, a, b);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_ps(k, simde_mm512_div_ps(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_div_ps
|
||||
#define _mm512_maskz_div_ps(k, a, b) simde_mm512_maskz_div_ps(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_div_pd (simde__m512d a, simde__m512d b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_div_pd(a, b);
|
||||
#else
|
||||
simde__m512d_private
|
||||
r_,
|
||||
a_ = simde__m512d_to_private(a),
|
||||
b_ = simde__m512d_to_private(b);
|
||||
|
||||
#if SIMDE_NATURAL_VECTOR_SIZE_LE(256)
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m256d) / sizeof(r_.m256d[0])) ; i++) {
|
||||
r_.m256d[i] = simde_mm256_div_pd(a_.m256d[i], b_.m256d[i]);
|
||||
}
|
||||
#elif defined(SIMDE_VECTOR_SUBSCRIPT_OPS)
|
||||
r_.f64 = a_.f64 / b_.f64;
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m256d) / sizeof(r_.m256d[0])) ; i++) {
|
||||
r_.m256d[i] = simde_mm256_div_pd(a_.m256d[i], b_.m256d[i]);
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512d_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_div_pd
|
||||
#define _mm512_div_pd(a, b) simde_mm512_div_pd(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_mask_div_pd(simde__m512d src, simde__mmask8 k, simde__m512d a, simde__m512d b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_div_pd(src, k, a, b);
|
||||
#else
|
||||
return simde_mm512_mask_mov_pd(src, k, simde_mm512_div_pd(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_div_pd
|
||||
#define _mm512_mask_div_pd(src, k, a, b) simde_mm512_mask_div_pd(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_maskz_div_pd(simde__mmask8 k, simde__m512d a, simde__m512d b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_maskz_div_pd(k, a, b);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_pd(k, simde_mm512_div_pd(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_div_pd
|
||||
#define _mm512_maskz_div_pd(k, a, b) simde_mm512_maskz_div_pd(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_DIV_H) */
|
||||
@@ -0,0 +1,281 @@
|
||||
#if !defined(SIMDE_X86_AVX512_DPBF16_H)
|
||||
#define SIMDE_X86_AVX512_DPBF16_H
|
||||
|
||||
#include "types.h"
|
||||
#include "mov.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128
|
||||
simde_mm_dpbf16_ps (simde__m128 src, simde__m128bh a, simde__m128bh b) {
|
||||
#if defined(SIMDE_X86_AVX512BF16_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_dpbf16_ps(src, a, b);
|
||||
#else
|
||||
simde__m128_private
|
||||
src_ = simde__m128_to_private(src);
|
||||
simde__m128bh_private
|
||||
a_ = simde__m128bh_to_private(a),
|
||||
b_ = simde__m128bh_to_private(b);
|
||||
|
||||
#if ! ( defined(SIMDE_ARCH_X86) && defined(HEDLEY_GCC_VERSION) ) && defined(SIMDE_VECTOR_SUBSCRIPT_SCALAR) && defined(SIMDE_CONVERT_VECTOR_) && defined(SIMDE_SHUFFLE_VECTOR_)
|
||||
uint32_t x1 SIMDE_VECTOR(32);
|
||||
uint32_t x2 SIMDE_VECTOR(32);
|
||||
simde__m128_private
|
||||
r1_[2],
|
||||
r2_[2];
|
||||
|
||||
a_.u16 =
|
||||
SIMDE_SHUFFLE_VECTOR_(
|
||||
16, 16,
|
||||
a_.u16, a_.u16,
|
||||
0, 2, 4, 6,
|
||||
1, 3, 5, 7
|
||||
);
|
||||
b_.u16 =
|
||||
SIMDE_SHUFFLE_VECTOR_(
|
||||
16, 16,
|
||||
b_.u16, b_.u16,
|
||||
0, 2, 4, 6,
|
||||
1, 3, 5, 7
|
||||
);
|
||||
|
||||
SIMDE_CONVERT_VECTOR_(x1, a_.u16);
|
||||
SIMDE_CONVERT_VECTOR_(x2, b_.u16);
|
||||
|
||||
x1 <<= 16;
|
||||
x2 <<= 16;
|
||||
|
||||
simde_memcpy(&r1_, &x1, sizeof(x1));
|
||||
simde_memcpy(&r2_, &x2, sizeof(x2));
|
||||
|
||||
src_.f32 +=
|
||||
HEDLEY_REINTERPRET_CAST(__typeof__(a_.f32), r1_[0].u32) * HEDLEY_REINTERPRET_CAST(__typeof__(a_.f32), r2_[0].u32) +
|
||||
HEDLEY_REINTERPRET_CAST(__typeof__(a_.f32), r1_[1].u32) * HEDLEY_REINTERPRET_CAST(__typeof__(a_.f32), r2_[1].u32);
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(a_.u16) / sizeof(a_.u16[0])) ; i++) {
|
||||
src_.f32[i / 2] += (simde_uint32_as_float32(HEDLEY_STATIC_CAST(uint32_t, a_.u16[i]) << 16) * simde_uint32_as_float32(HEDLEY_STATIC_CAST(uint32_t, b_.u16[i]) << 16));
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m128_from_private(src_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BF16_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_dpbf16_ps
|
||||
#define _mm_dpbf16_ps(src, a, b) simde_mm_dpbf16_ps(src, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128
|
||||
simde_mm_mask_dpbf16_ps (simde__m128 src, simde__mmask8 k, simde__m128bh a, simde__m128bh b) {
|
||||
#if defined(SIMDE_X86_AVX512BF16_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_mask_dpbf16_ps(src, k, a, b);
|
||||
#else
|
||||
return simde_mm_mask_mov_ps(src, k, simde_mm_dpbf16_ps(src, a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BF16_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_dpbf16_ps
|
||||
#define _mm_mask_dpbf16_ps(src, k, a, b) simde_mm_mask_dpbf16_ps(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128
|
||||
simde_mm_maskz_dpbf16_ps (simde__mmask8 k, simde__m128 src, simde__m128bh a, simde__m128bh b) {
|
||||
#if defined(SIMDE_X86_AVX512BF16_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_maskz_dpbf16_ps(k, src, a, b);
|
||||
#else
|
||||
return simde_mm_maskz_mov_ps(k, simde_mm_dpbf16_ps(src, a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BF16_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_maskz_dpbf16_ps
|
||||
#define _mm_maskz_dpbf16_ps(k, src, a, b) simde_mm_maskz_dpbf16_ps(k, src, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256
|
||||
simde_mm256_dpbf16_ps (simde__m256 src, simde__m256bh a, simde__m256bh b) {
|
||||
#if defined(SIMDE_X86_AVX512BF16_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_dpbf16_ps(src, a, b);
|
||||
#else
|
||||
simde__m256_private
|
||||
src_ = simde__m256_to_private(src);
|
||||
simde__m256bh_private
|
||||
a_ = simde__m256bh_to_private(a),
|
||||
b_ = simde__m256bh_to_private(b);
|
||||
|
||||
#if ! ( defined(SIMDE_ARCH_X86) && defined(HEDLEY_GCC_VERSION) ) && defined(SIMDE_VECTOR_SUBSCRIPT_SCALAR) && defined(SIMDE_CONVERT_VECTOR_) && defined(SIMDE_SHUFFLE_VECTOR_)
|
||||
uint32_t x1 SIMDE_VECTOR(64);
|
||||
uint32_t x2 SIMDE_VECTOR(64);
|
||||
simde__m256_private
|
||||
r1_[2],
|
||||
r2_[2];
|
||||
|
||||
a_.u16 =
|
||||
SIMDE_SHUFFLE_VECTOR_(
|
||||
16, 32,
|
||||
a_.u16, a_.u16,
|
||||
0, 2, 4, 6, 8, 10, 12, 14,
|
||||
1, 3, 5, 7, 9, 11, 13, 15
|
||||
);
|
||||
b_.u16 =
|
||||
SIMDE_SHUFFLE_VECTOR_(
|
||||
16, 32,
|
||||
b_.u16, b_.u16,
|
||||
0, 2, 4, 6, 8, 10, 12, 14,
|
||||
1, 3, 5, 7, 9, 11, 13, 15
|
||||
);
|
||||
|
||||
SIMDE_CONVERT_VECTOR_(x1, a_.u16);
|
||||
SIMDE_CONVERT_VECTOR_(x2, b_.u16);
|
||||
|
||||
x1 <<= 16;
|
||||
x2 <<= 16;
|
||||
|
||||
simde_memcpy(&r1_, &x1, sizeof(x1));
|
||||
simde_memcpy(&r2_, &x2, sizeof(x2));
|
||||
|
||||
src_.f32 +=
|
||||
HEDLEY_REINTERPRET_CAST(__typeof__(a_.f32), r1_[0].u32) * HEDLEY_REINTERPRET_CAST(__typeof__(a_.f32), r2_[0].u32) +
|
||||
HEDLEY_REINTERPRET_CAST(__typeof__(a_.f32), r1_[1].u32) * HEDLEY_REINTERPRET_CAST(__typeof__(a_.f32), r2_[1].u32);
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(a_.u16) / sizeof(a_.u16[0])) ; i++) {
|
||||
src_.f32[i / 2] += (simde_uint32_as_float32(HEDLEY_STATIC_CAST(uint32_t, a_.u16[i]) << 16) * simde_uint32_as_float32(HEDLEY_STATIC_CAST(uint32_t, b_.u16[i]) << 16));
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m256_from_private(src_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BF16_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_dpbf16_ps
|
||||
#define _mm256_dpbf16_ps(src, a, b) simde_mm256_dpbf16_ps(src, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256
|
||||
simde_mm256_mask_dpbf16_ps (simde__m256 src, simde__mmask8 k, simde__m256bh a, simde__m256bh b) {
|
||||
#if defined(SIMDE_X86_AVX512BF16_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_mask_dpbf16_ps(src, k, a, b);
|
||||
#else
|
||||
return simde_mm256_mask_mov_ps(src, k, simde_mm256_dpbf16_ps(src, a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BF16_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_mask_dpbf16_ps
|
||||
#define _mm256_mask_dpbf16_ps(src, k, a, b) simde_mm256_mask_dpbf16_ps(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256
|
||||
simde_mm256_maskz_dpbf16_ps (simde__mmask8 k, simde__m256 src, simde__m256bh a, simde__m256bh b) {
|
||||
#if defined(SIMDE_X86_AVX512BF16_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_maskz_dpbf16_ps(k, src, a, b);
|
||||
#else
|
||||
return simde_mm256_maskz_mov_ps(k, simde_mm256_dpbf16_ps(src, a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BF16_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_maskz_dpbf16_ps
|
||||
#define _mm256_maskz_dpbf16_ps(k, src, a, b) simde_mm256_maskz_dpbf16_ps(k, src, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_dpbf16_ps (simde__m512 src, simde__m512bh a, simde__m512bh b) {
|
||||
#if defined(SIMDE_X86_AVX512BF16_NATIVE)
|
||||
return _mm512_dpbf16_ps(src, a, b);
|
||||
#else
|
||||
simde__m512_private
|
||||
src_ = simde__m512_to_private(src);
|
||||
simde__m512bh_private
|
||||
a_ = simde__m512bh_to_private(a),
|
||||
b_ = simde__m512bh_to_private(b);
|
||||
|
||||
#if ! ( defined(SIMDE_ARCH_X86) && defined(HEDLEY_GCC_VERSION) ) && defined(SIMDE_VECTOR_SUBSCRIPT_SCALAR) && defined(SIMDE_CONVERT_VECTOR_) && defined(SIMDE_SHUFFLE_VECTOR_)
|
||||
uint32_t x1 SIMDE_VECTOR(128);
|
||||
uint32_t x2 SIMDE_VECTOR(128);
|
||||
simde__m512_private
|
||||
r1_[2],
|
||||
r2_[2];
|
||||
|
||||
a_.u16 =
|
||||
SIMDE_SHUFFLE_VECTOR_(
|
||||
16, 64,
|
||||
a_.u16, a_.u16,
|
||||
0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30,
|
||||
1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31
|
||||
);
|
||||
b_.u16 =
|
||||
SIMDE_SHUFFLE_VECTOR_(
|
||||
16, 64,
|
||||
b_.u16, b_.u16,
|
||||
0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30,
|
||||
1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31
|
||||
);
|
||||
|
||||
SIMDE_CONVERT_VECTOR_(x1, a_.u16);
|
||||
SIMDE_CONVERT_VECTOR_(x2, b_.u16);
|
||||
|
||||
x1 <<= 16;
|
||||
x2 <<= 16;
|
||||
|
||||
simde_memcpy(&r1_, &x1, sizeof(x1));
|
||||
simde_memcpy(&r2_, &x2, sizeof(x2));
|
||||
|
||||
src_.f32 +=
|
||||
HEDLEY_REINTERPRET_CAST(__typeof__(a_.f32), r1_[0].u32) * HEDLEY_REINTERPRET_CAST(__typeof__(a_.f32), r2_[0].u32) +
|
||||
HEDLEY_REINTERPRET_CAST(__typeof__(a_.f32), r1_[1].u32) * HEDLEY_REINTERPRET_CAST(__typeof__(a_.f32), r2_[1].u32);
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(a_.u16) / sizeof(a_.u16[0])) ; i++) {
|
||||
src_.f32[i / 2] += (simde_uint32_as_float32(HEDLEY_STATIC_CAST(uint32_t, a_.u16[i]) << 16) * simde_uint32_as_float32(HEDLEY_STATIC_CAST(uint32_t, b_.u16[i]) << 16));
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512_from_private(src_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BF16_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_dpbf16_ps
|
||||
#define _mm512_dpbf16_ps(src, a, b) simde_mm512_dpbf16_ps(src, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_mask_dpbf16_ps (simde__m512 src, simde__mmask16 k, simde__m512bh a, simde__m512bh b) {
|
||||
#if defined(SIMDE_X86_AVX512BF16_NATIVE)
|
||||
return _mm512_mask_dpbf16_ps(src, k, a, b);
|
||||
#else
|
||||
return simde_mm512_mask_mov_ps(src, k, simde_mm512_dpbf16_ps(src, a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BF16_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_dpbf16_ps
|
||||
#define _mm512_mask_dpbf16_ps(src, k, a, b) simde_mm512_mask_dpbf16_ps(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_maskz_dpbf16_ps (simde__mmask16 k, simde__m512 src, simde__m512bh a, simde__m512bh b) {
|
||||
#if defined(SIMDE_X86_AVX512BF16_NATIVE)
|
||||
return _mm512_maskz_dpbf16_ps(k, src, a, b);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_ps(k, simde_mm512_dpbf16_ps(src, a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BF16_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_dpbf16_ps
|
||||
#define _mm512_maskz_dpbf16_ps(k, src, a, b) simde_mm512_maskz_dpbf16_ps(k, src, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_DPBF16_H) */
|
||||
@@ -0,0 +1,292 @@
|
||||
#if !defined(SIMDE_X86_AVX512_DPBUSD_H)
|
||||
#define SIMDE_X86_AVX512_DPBUSD_H
|
||||
|
||||
#include "types.h"
|
||||
#include "mov.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_dpbusd_epi32(simde__m128i src, simde__m128i a, simde__m128i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512VNNI_NATIVE)
|
||||
return _mm_dpbusd_epi32(src, a, b);
|
||||
#else
|
||||
simde__m128i_private
|
||||
src_ = simde__m128i_to_private(src),
|
||||
a_ = simde__m128i_to_private(a),
|
||||
b_ = simde__m128i_to_private(b);
|
||||
#if defined(SIMDE_SHUFFLE_VECTOR_) && defined(SIMDE_CONVERT_VECTOR_)
|
||||
uint32_t x1_ SIMDE_VECTOR(64);
|
||||
int32_t x2_ SIMDE_VECTOR(64);
|
||||
simde__m128i_private
|
||||
r1_[4],
|
||||
r2_[4];
|
||||
|
||||
a_.u8 =
|
||||
SIMDE_SHUFFLE_VECTOR_(
|
||||
8, 16,
|
||||
a_.u8, a_.u8,
|
||||
0, 4, 8, 12,
|
||||
1, 5, 9, 13,
|
||||
2, 6, 10, 14,
|
||||
3, 7, 11, 15
|
||||
);
|
||||
b_.i8 =
|
||||
SIMDE_SHUFFLE_VECTOR_(
|
||||
8, 16,
|
||||
b_.i8, b_.i8,
|
||||
0, 4, 8, 12,
|
||||
1, 5, 9, 13,
|
||||
2, 6, 10, 14,
|
||||
3, 7, 11, 15
|
||||
);
|
||||
|
||||
SIMDE_CONVERT_VECTOR_(x1_, a_.u8);
|
||||
SIMDE_CONVERT_VECTOR_(x2_, b_.i8);
|
||||
|
||||
simde_memcpy(&r1_, &x1_, sizeof(x1_));
|
||||
simde_memcpy(&r2_, &x2_, sizeof(x2_));
|
||||
|
||||
src_.i32 +=
|
||||
(HEDLEY_REINTERPRET_CAST(__typeof__(a_.i32), r1_[0].u32) * r2_[0].i32) +
|
||||
(HEDLEY_REINTERPRET_CAST(__typeof__(a_.i32), r1_[1].u32) * r2_[1].i32) +
|
||||
(HEDLEY_REINTERPRET_CAST(__typeof__(a_.i32), r1_[2].u32) * r2_[2].i32) +
|
||||
(HEDLEY_REINTERPRET_CAST(__typeof__(a_.i32), r1_[3].u32) * r2_[3].i32);
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(a_.u8) / sizeof(a_.u8[0])) ; i++) {
|
||||
src_.i32[i / 4] += HEDLEY_STATIC_CAST(uint16_t, a_.u8[i]) * HEDLEY_STATIC_CAST(int16_t, b_.i8[i]);
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m128i_from_private(src_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VNNI_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_dpbusd_epi32
|
||||
#define _mm_dpbusd_epi32(src, a, b) simde_mm_dpbusd_epi32(src, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_mask_dpbusd_epi32(simde__m128i src, simde__mmask8 k, simde__m128i a, simde__m128i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512VNNI_NATIVE)
|
||||
return _mm_mask_dpbusd_epi32(src, k, a, b);
|
||||
#else
|
||||
return simde_mm_mask_mov_epi32(src, k, simde_mm_dpbusd_epi32(src, a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VNNI_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_dpbusd_epi32
|
||||
#define _mm_mask_dpbusd_epi32(src, k, a, b) simde_mm_mask_dpbusd_epi32(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_maskz_dpbusd_epi32(simde__mmask8 k, simde__m128i src, simde__m128i a, simde__m128i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512VNNI_NATIVE)
|
||||
return _mm_maskz_dpbusd_epi32(k, src, a, b);
|
||||
#else
|
||||
return simde_mm_maskz_mov_epi32(k, simde_mm_dpbusd_epi32(src, a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VNNI_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_maskz_dpbusd_epi32
|
||||
#define _mm_maskz_dpbusd_epi32(k, src, a, b) simde_mm_maskz_dpbusd_epi32(k, src, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_dpbusd_epi32(simde__m256i src, simde__m256i a, simde__m256i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512VNNI_NATIVE)
|
||||
return _mm256_dpbusd_epi32(src, a, b);
|
||||
#else
|
||||
simde__m256i_private
|
||||
src_ = simde__m256i_to_private(src),
|
||||
a_ = simde__m256i_to_private(a),
|
||||
b_ = simde__m256i_to_private(b);
|
||||
|
||||
#if SIMDE_NATURAL_VECTOR_SIZE_LE(128)
|
||||
src_.m128i[0] = simde_mm_dpbusd_epi32(src_.m128i[0], a_.m128i[0], b_.m128i[0]);
|
||||
src_.m128i[1] = simde_mm_dpbusd_epi32(src_.m128i[1], a_.m128i[1], b_.m128i[1]);
|
||||
#elif defined(SIMDE_SHUFFLE_VECTOR_) && defined(SIMDE_CONVERT_VECTOR_)
|
||||
uint32_t x1_ SIMDE_VECTOR(128);
|
||||
int32_t x2_ SIMDE_VECTOR(128);
|
||||
simde__m256i_private
|
||||
r1_[4],
|
||||
r2_[4];
|
||||
|
||||
a_.u8 =
|
||||
SIMDE_SHUFFLE_VECTOR_(
|
||||
8, 32,
|
||||
a_.u8, a_.u8,
|
||||
0, 4, 8, 12, 16, 20, 24, 28,
|
||||
1, 5, 9, 13, 17, 21, 25, 29,
|
||||
2, 6, 10, 14, 18, 22, 26, 30,
|
||||
3, 7, 11, 15, 19, 23, 27, 31
|
||||
);
|
||||
b_.i8 =
|
||||
SIMDE_SHUFFLE_VECTOR_(
|
||||
8, 32,
|
||||
b_.i8, b_.i8,
|
||||
0, 4, 8, 12, 16, 20, 24, 28,
|
||||
1, 5, 9, 13, 17, 21, 25, 29,
|
||||
2, 6, 10, 14, 18, 22, 26, 30,
|
||||
3, 7, 11, 15, 19, 23, 27, 31
|
||||
);
|
||||
|
||||
SIMDE_CONVERT_VECTOR_(x1_, a_.u8);
|
||||
SIMDE_CONVERT_VECTOR_(x2_, b_.i8);
|
||||
|
||||
simde_memcpy(&r1_, &x1_, sizeof(x1_));
|
||||
simde_memcpy(&r2_, &x2_, sizeof(x2_));
|
||||
|
||||
src_.i32 +=
|
||||
(HEDLEY_REINTERPRET_CAST(__typeof__(a_.i32), r1_[0].u32) * r2_[0].i32) +
|
||||
(HEDLEY_REINTERPRET_CAST(__typeof__(a_.i32), r1_[1].u32) * r2_[1].i32) +
|
||||
(HEDLEY_REINTERPRET_CAST(__typeof__(a_.i32), r1_[2].u32) * r2_[2].i32) +
|
||||
(HEDLEY_REINTERPRET_CAST(__typeof__(a_.i32), r1_[3].u32) * r2_[3].i32);
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(a_.u8) / sizeof(a_.u8[0])) ; i++) {
|
||||
src_.i32[i / 4] += HEDLEY_STATIC_CAST(uint16_t, a_.u8[i]) * HEDLEY_STATIC_CAST(int16_t, b_.i8[i]);
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m256i_from_private(src_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VNNI_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_dpbusd_epi32
|
||||
#define _mm256_dpbusd_epi32(src, a, b) simde_mm256_dpbusd_epi32(src, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_mask_dpbusd_epi32(simde__m256i src, simde__mmask8 k, simde__m256i a, simde__m256i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512VNNI_NATIVE)
|
||||
return _mm256_mask_dpbusd_epi32(src, k, a, b);
|
||||
#else
|
||||
return simde_mm256_mask_mov_epi32(src, k, simde_mm256_dpbusd_epi32(src, a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VNNI_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_mask_dpbusd_epi32
|
||||
#define _mm256_mask_dpbusd_epi32(src, k, a, b) simde_mm256_mask_dpbusd_epi32(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_maskz_dpbusd_epi32(simde__mmask8 k, simde__m256i src, simde__m256i a, simde__m256i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512VNNI_NATIVE)
|
||||
return _mm256_maskz_dpbusd_epi32(k, src, a, b);
|
||||
#else
|
||||
return simde_mm256_maskz_mov_epi32(k, simde_mm256_dpbusd_epi32(src, a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VNNI_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_maskz_dpbusd_epi32
|
||||
#define _mm256_maskz_dpbusd_epi32(k, src, a, b) simde_mm256_maskz_dpbusd_epi32(k, src, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_dpbusd_epi32(simde__m512i src, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512VNNI_NATIVE)
|
||||
return _mm512_dpbusd_epi32(src, a, b);
|
||||
#else
|
||||
simde__m512i_private
|
||||
src_ = simde__m512i_to_private(src),
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b);
|
||||
|
||||
#if SIMDE_NATURAL_VECTOR_SIZE_LE(256)
|
||||
src_.m256i[0] = simde_mm256_dpbusd_epi32(src_.m256i[0], a_.m256i[0], b_.m256i[0]);
|
||||
src_.m256i[1] = simde_mm256_dpbusd_epi32(src_.m256i[1], a_.m256i[1], b_.m256i[1]);
|
||||
#elif defined(SIMDE_SHUFFLE_VECTOR_) && defined(SIMDE_CONVERT_VECTOR_)
|
||||
uint32_t x1_ SIMDE_VECTOR(256);
|
||||
int32_t x2_ SIMDE_VECTOR(256);
|
||||
simde__m512i_private
|
||||
r1_[4],
|
||||
r2_[4];
|
||||
|
||||
a_.u8 =
|
||||
SIMDE_SHUFFLE_VECTOR_(
|
||||
8, 64,
|
||||
a_.u8, a_.u8,
|
||||
0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60,
|
||||
1, 5, 9, 13, 17, 21, 25, 29, 33, 37, 41, 45, 49, 53, 57, 61,
|
||||
2, 6, 10, 14, 18, 22, 26, 30, 34, 38, 42, 46, 50, 54, 58, 62,
|
||||
3, 7, 11, 15, 19, 23, 27, 31, 35, 39, 43, 47, 51, 55, 59, 63
|
||||
);
|
||||
b_.i8 =
|
||||
SIMDE_SHUFFLE_VECTOR_(
|
||||
8, 64,
|
||||
b_.i8, b_.i8,
|
||||
0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60,
|
||||
1, 5, 9, 13, 17, 21, 25, 29, 33, 37, 41, 45, 49, 53, 57, 61,
|
||||
2, 6, 10, 14, 18, 22, 26, 30, 34, 38, 42, 46, 50, 54, 58, 62,
|
||||
3, 7, 11, 15, 19, 23, 27, 31, 35, 39, 43, 47, 51, 55, 59, 63
|
||||
);
|
||||
|
||||
SIMDE_CONVERT_VECTOR_(x1_, a_.u8);
|
||||
SIMDE_CONVERT_VECTOR_(x2_, b_.i8);
|
||||
|
||||
simde_memcpy(&r1_, &x1_, sizeof(x1_));
|
||||
simde_memcpy(&r2_, &x2_, sizeof(x2_));
|
||||
|
||||
src_.i32 +=
|
||||
(HEDLEY_REINTERPRET_CAST(__typeof__(a_.i32), r1_[0].u32) * r2_[0].i32) +
|
||||
(HEDLEY_REINTERPRET_CAST(__typeof__(a_.i32), r1_[1].u32) * r2_[1].i32) +
|
||||
(HEDLEY_REINTERPRET_CAST(__typeof__(a_.i32), r1_[2].u32) * r2_[2].i32) +
|
||||
(HEDLEY_REINTERPRET_CAST(__typeof__(a_.i32), r1_[3].u32) * r2_[3].i32);
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(a_.u8) / sizeof(a_.u8[0])) ; i++) {
|
||||
src_.i32[i / 4] += HEDLEY_STATIC_CAST(uint16_t, a_.u8[i]) * HEDLEY_STATIC_CAST(int16_t, b_.i8[i]);
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512i_from_private(src_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VNNI_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_dpbusd_epi32
|
||||
#define _mm512_dpbusd_epi32(src, a, b) simde_mm512_dpbusd_epi32(src, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_dpbusd_epi32(simde__m512i src, simde__mmask16 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512VNNI_NATIVE)
|
||||
return _mm512_mask_dpbusd_epi32(src, k, a, b);
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi32(src, k, simde_mm512_dpbusd_epi32(src, a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VNNI_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_dpbusd_epi32
|
||||
#define _mm512_mask_dpbusd_epi32(src, k, a, b) simde_mm512_mask_dpbusd_epi32(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_dpbusd_epi32(simde__mmask16 k, simde__m512i src, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512VNNI_NATIVE)
|
||||
return _mm512_maskz_dpbusd_epi32(k, src, a, b);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_epi32(k, simde_mm512_dpbusd_epi32(src, a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VNNI_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_dpbusd_epi32
|
||||
#define _mm512_maskz_dpbusd_epi32(k, src, a, b) simde_mm512_maskz_dpbusd_epi32(k, src, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_DPBUSD_H) */
|
||||
@@ -0,0 +1,344 @@
|
||||
#if !defined(SIMDE_X86_AVX512_DPBUSDS_H)
|
||||
#define SIMDE_X86_AVX512_DPBUSDS_H
|
||||
|
||||
#include "types.h"
|
||||
#include "mov.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_dpbusds_epi32(simde__m128i src, simde__m128i a, simde__m128i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512VNNI_NATIVE)
|
||||
return _mm_dpbusds_epi32(src, a, b);
|
||||
#else
|
||||
simde__m128i_private
|
||||
src_ = simde__m128i_to_private(src),
|
||||
a_ = simde__m128i_to_private(a),
|
||||
b_ = simde__m128i_to_private(b);
|
||||
|
||||
#if defined(SIMDE_SHUFFLE_VECTOR_) && defined(SIMDE_CONVERT_VECTOR_) && defined(SIMDE_VECTOR_SUBSCRIPT_SCALAR)
|
||||
uint32_t x1_ SIMDE_VECTOR(64);
|
||||
int32_t x2_ SIMDE_VECTOR(64);
|
||||
simde__m128i_private
|
||||
r1_[4],
|
||||
r2_[4];
|
||||
|
||||
a_.u8 =
|
||||
SIMDE_SHUFFLE_VECTOR_(
|
||||
8, 16,
|
||||
a_.u8, a_.u8,
|
||||
0, 4, 8, 12,
|
||||
1, 5, 9, 13,
|
||||
2, 6, 10, 14,
|
||||
3, 7, 11, 15
|
||||
);
|
||||
b_.i8 =
|
||||
SIMDE_SHUFFLE_VECTOR_(
|
||||
8, 16,
|
||||
b_.i8, b_.i8,
|
||||
0, 4, 8, 12,
|
||||
1, 5, 9, 13,
|
||||
2, 6, 10, 14,
|
||||
3, 7, 11, 15
|
||||
);
|
||||
|
||||
SIMDE_CONVERT_VECTOR_(x1_, a_.u8);
|
||||
SIMDE_CONVERT_VECTOR_(x2_, b_.i8);
|
||||
|
||||
simde_memcpy(&r1_, &x1_, sizeof(x1_));
|
||||
simde_memcpy(&r2_, &x2_, sizeof(x2_));
|
||||
|
||||
uint32_t au SIMDE_VECTOR(16) =
|
||||
HEDLEY_REINTERPRET_CAST(
|
||||
__typeof__(au),
|
||||
(HEDLEY_REINTERPRET_CAST(__typeof__(a_.i32), r1_[0].u32) * r2_[0].i32) +
|
||||
(HEDLEY_REINTERPRET_CAST(__typeof__(a_.i32), r1_[1].u32) * r2_[1].i32) +
|
||||
(HEDLEY_REINTERPRET_CAST(__typeof__(a_.i32), r1_[2].u32) * r2_[2].i32) +
|
||||
(HEDLEY_REINTERPRET_CAST(__typeof__(a_.i32), r1_[3].u32) * r2_[3].i32)
|
||||
);
|
||||
uint32_t bu SIMDE_VECTOR(16) = HEDLEY_REINTERPRET_CAST(__typeof__(bu), src_.i32);
|
||||
uint32_t ru SIMDE_VECTOR(16) = au + bu;
|
||||
|
||||
au = (au >> 31) + INT32_MAX;
|
||||
|
||||
uint32_t m SIMDE_VECTOR(16) = HEDLEY_REINTERPRET_CAST(__typeof__(m), HEDLEY_REINTERPRET_CAST(__typeof__(src_.i32), (au ^ bu) | ~(bu ^ ru)) < 0);
|
||||
src_.i32 = HEDLEY_REINTERPRET_CAST(__typeof__(src_.i32), (au & ~m) | (ru & m));
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(a_.u8) / sizeof(a_.u8[0]) / 4) ; i++) {
|
||||
src_.i32[i] =
|
||||
simde_math_adds_i32(
|
||||
src_.i32[i],
|
||||
HEDLEY_STATIC_CAST(uint16_t, a_.u8[(4 * i) ]) * HEDLEY_STATIC_CAST(int16_t, b_.i8[(4 * i) ]) +
|
||||
HEDLEY_STATIC_CAST(uint16_t, a_.u8[(4 * i) + 1]) * HEDLEY_STATIC_CAST(int16_t, b_.i8[(4 * i) + 1]) +
|
||||
HEDLEY_STATIC_CAST(uint16_t, a_.u8[(4 * i) + 2]) * HEDLEY_STATIC_CAST(int16_t, b_.i8[(4 * i) + 2]) +
|
||||
HEDLEY_STATIC_CAST(uint16_t, a_.u8[(4 * i) + 3]) * HEDLEY_STATIC_CAST(int16_t, b_.i8[(4 * i) + 3])
|
||||
);
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m128i_from_private(src_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VNNI_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_dpbusds_epi32
|
||||
#define _mm_dpbusds_epi32(src, a, b) simde_mm_dpbusds_epi32(src, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_mask_dpbusds_epi32(simde__m128i src, simde__mmask8 k, simde__m128i a, simde__m128i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512VNNI_NATIVE)
|
||||
return _mm_mask_dpbusds_epi32(src, k, a, b);
|
||||
#else
|
||||
return simde_mm_mask_mov_epi32(src, k, simde_mm_dpbusds_epi32(src, a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VNNI_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_dpbusds_epi32
|
||||
#define _mm_mask_dpbusds_epi32(src, k, a, b) simde_mm_mask_dpbusds_epi32(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_maskz_dpbusds_epi32(simde__mmask8 k, simde__m128i src, simde__m128i a, simde__m128i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512VNNI_NATIVE)
|
||||
return _mm_maskz_dpbusds_epi32(k, src, a, b);
|
||||
#else
|
||||
return simde_mm_maskz_mov_epi32(k, simde_mm_dpbusds_epi32(src, a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VNNI_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_maskz_dpbusds_epi32
|
||||
#define _mm_maskz_dpbusds_epi32(k, src, a, b) simde_mm_maskz_dpbusds_epi32(k, src, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_dpbusds_epi32(simde__m256i src, simde__m256i a, simde__m256i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512VNNI_NATIVE)
|
||||
return _mm256_dpbusds_epi32(src, a, b);
|
||||
#else
|
||||
simde__m256i_private
|
||||
src_ = simde__m256i_to_private(src),
|
||||
a_ = simde__m256i_to_private(a),
|
||||
b_ = simde__m256i_to_private(b);
|
||||
|
||||
#if SIMDE_NATURAL_VECTOR_SIZE_LE(128)
|
||||
src_.m128i[0] = simde_mm_dpbusds_epi32(src_.m128i[0], a_.m128i[0], b_.m128i[0]);
|
||||
src_.m128i[1] = simde_mm_dpbusds_epi32(src_.m128i[1], a_.m128i[1], b_.m128i[1]);
|
||||
#elif defined(SIMDE_SHUFFLE_VECTOR_) && defined(SIMDE_CONVERT_VECTOR_) && defined(SIMDE_VECTOR_SUBSCRIPT_SCALAR)
|
||||
uint32_t x1_ SIMDE_VECTOR(128);
|
||||
int32_t x2_ SIMDE_VECTOR(128);
|
||||
simde__m256i_private
|
||||
r1_[4],
|
||||
r2_[4];
|
||||
|
||||
a_.u8 =
|
||||
SIMDE_SHUFFLE_VECTOR_(
|
||||
8, 32,
|
||||
a_.u8, a_.u8,
|
||||
0, 4, 8, 12, 16, 20, 24, 28,
|
||||
1, 5, 9, 13, 17, 21, 25, 29,
|
||||
2, 6, 10, 14, 18, 22, 26, 30,
|
||||
3, 7, 11, 15, 19, 23, 27, 31
|
||||
);
|
||||
b_.i8 =
|
||||
SIMDE_SHUFFLE_VECTOR_(
|
||||
8, 32,
|
||||
b_.i8, b_.i8,
|
||||
0, 4, 8, 12, 16, 20, 24, 28,
|
||||
1, 5, 9, 13, 17, 21, 25, 29,
|
||||
2, 6, 10, 14, 18, 22, 26, 30,
|
||||
3, 7, 11, 15, 19, 23, 27, 31
|
||||
);
|
||||
|
||||
SIMDE_CONVERT_VECTOR_(x1_, a_.u8);
|
||||
SIMDE_CONVERT_VECTOR_(x2_, b_.i8);
|
||||
|
||||
simde_memcpy(&r1_, &x1_, sizeof(x1_));
|
||||
simde_memcpy(&r2_, &x2_, sizeof(x2_));
|
||||
|
||||
uint32_t au SIMDE_VECTOR(32) =
|
||||
HEDLEY_REINTERPRET_CAST(
|
||||
__typeof__(au),
|
||||
(HEDLEY_REINTERPRET_CAST(__typeof__(a_.i32), r1_[0].u32) * r2_[0].i32) +
|
||||
(HEDLEY_REINTERPRET_CAST(__typeof__(a_.i32), r1_[1].u32) * r2_[1].i32) +
|
||||
(HEDLEY_REINTERPRET_CAST(__typeof__(a_.i32), r1_[2].u32) * r2_[2].i32) +
|
||||
(HEDLEY_REINTERPRET_CAST(__typeof__(a_.i32), r1_[3].u32) * r2_[3].i32)
|
||||
);
|
||||
uint32_t bu SIMDE_VECTOR(32) = HEDLEY_REINTERPRET_CAST(__typeof__(bu), src_.i32);
|
||||
uint32_t ru SIMDE_VECTOR(32) = au + bu;
|
||||
|
||||
au = (au >> 31) + INT32_MAX;
|
||||
|
||||
uint32_t m SIMDE_VECTOR(32) = HEDLEY_REINTERPRET_CAST(__typeof__(m), HEDLEY_REINTERPRET_CAST(__typeof__(src_.i32), (au ^ bu) | ~(bu ^ ru)) < 0);
|
||||
src_.i32 = HEDLEY_REINTERPRET_CAST(__typeof__(src_.i32), (au & ~m) | (ru & m));
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(a_.u8) / sizeof(a_.u8[0]) / 4) ; i++) {
|
||||
src_.i32[i] =
|
||||
simde_math_adds_i32(
|
||||
src_.i32[i],
|
||||
HEDLEY_STATIC_CAST(uint16_t, a_.u8[(4 * i) ]) * HEDLEY_STATIC_CAST(int16_t, b_.i8[(4 * i) ]) +
|
||||
HEDLEY_STATIC_CAST(uint16_t, a_.u8[(4 * i) + 1]) * HEDLEY_STATIC_CAST(int16_t, b_.i8[(4 * i) + 1]) +
|
||||
HEDLEY_STATIC_CAST(uint16_t, a_.u8[(4 * i) + 2]) * HEDLEY_STATIC_CAST(int16_t, b_.i8[(4 * i) + 2]) +
|
||||
HEDLEY_STATIC_CAST(uint16_t, a_.u8[(4 * i) + 3]) * HEDLEY_STATIC_CAST(int16_t, b_.i8[(4 * i) + 3])
|
||||
);
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m256i_from_private(src_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VNNI_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_dpbusds_epi32
|
||||
#define _mm256_dpbusds_epi32(src, a, b) simde_mm256_dpbusds_epi32(src, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_mask_dpbusds_epi32(simde__m256i src, simde__mmask8 k, simde__m256i a, simde__m256i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512VNNI_NATIVE)
|
||||
return _mm256_mask_dpbusds_epi32(src, k, a, b);
|
||||
#else
|
||||
return simde_mm256_mask_mov_epi32(src, k, simde_mm256_dpbusds_epi32(src, a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VNNI_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_mask_dpbusds_epi32
|
||||
#define _mm256_mask_dpbusds_epi32(src, k, a, b) simde_mm256_mask_dpbusds_epi32(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_maskz_dpbusds_epi32(simde__mmask8 k, simde__m256i src, simde__m256i a, simde__m256i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512VNNI_NATIVE)
|
||||
return _mm256_maskz_dpbusds_epi32(k, src, a, b);
|
||||
#else
|
||||
return simde_mm256_maskz_mov_epi32(k, simde_mm256_dpbusds_epi32(src, a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VNNI_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_maskz_dpbusds_epi32
|
||||
#define _mm256_maskz_dpbusds_epi32(k, src, a, b) simde_mm256_maskz_dpbusds_epi32(k, src, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_dpbusds_epi32(simde__m512i src, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512VNNI_NATIVE)
|
||||
return _mm512_dpbusds_epi32(src, a, b);
|
||||
#else
|
||||
simde__m512i_private
|
||||
src_ = simde__m512i_to_private(src),
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b);
|
||||
|
||||
#if SIMDE_NATURAL_VECTOR_SIZE_LE(256)
|
||||
src_.m256i[0] = simde_mm256_dpbusds_epi32(src_.m256i[0], a_.m256i[0], b_.m256i[0]);
|
||||
src_.m256i[1] = simde_mm256_dpbusds_epi32(src_.m256i[1], a_.m256i[1], b_.m256i[1]);
|
||||
#elif defined(SIMDE_SHUFFLE_VECTOR_) && defined(SIMDE_CONVERT_VECTOR_) && defined(SIMDE_VECTOR_SUBSCRIPT_SCALAR)
|
||||
uint32_t x1_ SIMDE_VECTOR(256);
|
||||
int32_t x2_ SIMDE_VECTOR(256);
|
||||
simde__m512i_private
|
||||
r1_[4],
|
||||
r2_[4];
|
||||
|
||||
a_.u8 =
|
||||
SIMDE_SHUFFLE_VECTOR_(
|
||||
8, 64,
|
||||
a_.u8, a_.u8,
|
||||
0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60,
|
||||
1, 5, 9, 13, 17, 21, 25, 29, 33, 37, 41, 45, 49, 53, 57, 61,
|
||||
2, 6, 10, 14, 18, 22, 26, 30, 34, 38, 42, 46, 50, 54, 58, 62,
|
||||
3, 7, 11, 15, 19, 23, 27, 31, 35, 39, 43, 47, 51, 55, 59, 63
|
||||
);
|
||||
b_.i8 =
|
||||
SIMDE_SHUFFLE_VECTOR_(
|
||||
8, 64,
|
||||
b_.i8, b_.i8,
|
||||
0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60,
|
||||
1, 5, 9, 13, 17, 21, 25, 29, 33, 37, 41, 45, 49, 53, 57, 61,
|
||||
2, 6, 10, 14, 18, 22, 26, 30, 34, 38, 42, 46, 50, 54, 58, 62,
|
||||
3, 7, 11, 15, 19, 23, 27, 31, 35, 39, 43, 47, 51, 55, 59, 63
|
||||
);
|
||||
|
||||
SIMDE_CONVERT_VECTOR_(x1_, a_.u8);
|
||||
SIMDE_CONVERT_VECTOR_(x2_, b_.i8);
|
||||
|
||||
simde_memcpy(&r1_, &x1_, sizeof(x1_));
|
||||
simde_memcpy(&r2_, &x2_, sizeof(x2_));
|
||||
|
||||
uint32_t au SIMDE_VECTOR(64) =
|
||||
HEDLEY_REINTERPRET_CAST(
|
||||
__typeof__(au),
|
||||
(HEDLEY_REINTERPRET_CAST(__typeof__(a_.i32), r1_[0].u32) * r2_[0].i32) +
|
||||
(HEDLEY_REINTERPRET_CAST(__typeof__(a_.i32), r1_[1].u32) * r2_[1].i32) +
|
||||
(HEDLEY_REINTERPRET_CAST(__typeof__(a_.i32), r1_[2].u32) * r2_[2].i32) +
|
||||
(HEDLEY_REINTERPRET_CAST(__typeof__(a_.i32), r1_[3].u32) * r2_[3].i32)
|
||||
);
|
||||
uint32_t bu SIMDE_VECTOR(64) = HEDLEY_REINTERPRET_CAST(__typeof__(bu), src_.i32);
|
||||
uint32_t ru SIMDE_VECTOR(64) = au + bu;
|
||||
|
||||
au = (au >> 31) + INT32_MAX;
|
||||
|
||||
uint32_t m SIMDE_VECTOR(64) = HEDLEY_REINTERPRET_CAST(__typeof__(m), HEDLEY_REINTERPRET_CAST(__typeof__(src_.i32), (au ^ bu) | ~(bu ^ ru)) < 0);
|
||||
src_.i32 = HEDLEY_REINTERPRET_CAST(__typeof__(src_.i32), (au & ~m) | (ru & m));
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(a_.u8) / sizeof(a_.u8[0]) / 4) ; i++) {
|
||||
src_.i32[i] =
|
||||
simde_math_adds_i32(
|
||||
src_.i32[i],
|
||||
HEDLEY_STATIC_CAST(uint16_t, a_.u8[(4 * i) ]) * HEDLEY_STATIC_CAST(int16_t, b_.i8[(4 * i) ]) +
|
||||
HEDLEY_STATIC_CAST(uint16_t, a_.u8[(4 * i) + 1]) * HEDLEY_STATIC_CAST(int16_t, b_.i8[(4 * i) + 1]) +
|
||||
HEDLEY_STATIC_CAST(uint16_t, a_.u8[(4 * i) + 2]) * HEDLEY_STATIC_CAST(int16_t, b_.i8[(4 * i) + 2]) +
|
||||
HEDLEY_STATIC_CAST(uint16_t, a_.u8[(4 * i) + 3]) * HEDLEY_STATIC_CAST(int16_t, b_.i8[(4 * i) + 3])
|
||||
);
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512i_from_private(src_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VNNI_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_dpbusds_epi32
|
||||
#define _mm512_dpbusds_epi32(src, a, b) simde_mm512_dpbusds_epi32(src, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_dpbusds_epi32(simde__m512i src, simde__mmask16 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512VNNI_NATIVE)
|
||||
return _mm512_mask_dpbusds_epi32(src, k, a, b);
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi32(src, k, simde_mm512_dpbusds_epi32(src, a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VNNI_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_dpbusds_epi32
|
||||
#define _mm512_mask_dpbusds_epi32(src, k, a, b) simde_mm512_mask_dpbusds_epi32(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_dpbusds_epi32(simde__mmask16 k, simde__m512i src, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512VNNI_NATIVE)
|
||||
return _mm512_maskz_dpbusds_epi32(k, src, a, b);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_epi32(k, simde_mm512_dpbusds_epi32(src, a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VNNI_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_dpbusds_epi32
|
||||
#define _mm512_maskz_dpbusds_epi32(k, src, a, b) simde_mm512_maskz_dpbusds_epi32(k, src, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_DPBUSDS_H) */
|
||||
@@ -0,0 +1,269 @@
|
||||
#if !defined(SIMDE_X86_AVX512_DPWSSD_H)
|
||||
#define SIMDE_X86_AVX512_DPWSSD_H
|
||||
|
||||
#include "types.h"
|
||||
#include "mov.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_dpwssd_epi32(simde__m128i src, simde__m128i a, simde__m128i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512VNNI_NATIVE)
|
||||
return _mm_dpwssd_epi32(src, a, b);
|
||||
#else
|
||||
simde__m128i_private
|
||||
src_ = simde__m128i_to_private(src),
|
||||
a_ = simde__m128i_to_private(a),
|
||||
b_ = simde__m128i_to_private(b);
|
||||
|
||||
#if defined(SIMDE_SHUFFLE_VECTOR_) && defined(SIMDE_CONVERT_VECTOR_)
|
||||
int32_t x1_ SIMDE_VECTOR(32);
|
||||
int32_t x2_ SIMDE_VECTOR(32);
|
||||
simde__m128i_private
|
||||
r1_[2],
|
||||
r2_[2];
|
||||
|
||||
a_.i16 =
|
||||
SIMDE_SHUFFLE_VECTOR_(
|
||||
16, 16,
|
||||
a_.i16, a_.i16,
|
||||
0, 2, 4, 6,
|
||||
1, 3, 5, 7
|
||||
);
|
||||
b_.i16 =
|
||||
SIMDE_SHUFFLE_VECTOR_(
|
||||
16, 16,
|
||||
b_.i16, b_.i16,
|
||||
0, 2, 4, 6,
|
||||
1, 3, 5, 7
|
||||
);
|
||||
|
||||
SIMDE_CONVERT_VECTOR_(x1_, a_.i16);
|
||||
SIMDE_CONVERT_VECTOR_(x2_, b_.i16);
|
||||
|
||||
simde_memcpy(&r1_, &x1_, sizeof(x1_));
|
||||
simde_memcpy(&r2_, &x2_, sizeof(x2_));
|
||||
|
||||
src_.i32 +=
|
||||
(r1_[0].i32 * r2_[0].i32) +
|
||||
(r1_[1].i32 * r2_[1].i32);
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(a_.u16) / sizeof(a_.i16[0])) ; i++) {
|
||||
src_.i32[i / 2] += HEDLEY_STATIC_CAST(int32_t, a_.i16[i]) * HEDLEY_STATIC_CAST(int32_t, b_.i16[i]);
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m128i_from_private(src_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VNNI_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_dpwssd_epi32
|
||||
#define _mm_dpwssd_epi32(src, a, b) simde_mm_dpwssd_epi32(src, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_mask_dpwssd_epi32(simde__m128i src, simde__mmask8 k, simde__m128i a, simde__m128i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512VNNI_NATIVE)
|
||||
return _mm_mask_dpwssd_epi32(src, k, a, b);
|
||||
#else
|
||||
return simde_mm_mask_mov_epi32(src, k, simde_mm_dpwssd_epi32(src, a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VNNI_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_dpwssd_epi32
|
||||
#define _mm_mask_dpwssd_epi32(src, k, a, b) simde_mm_mask_dpwssd_epi32(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_maskz_dpwssd_epi32(simde__mmask8 k, simde__m128i src, simde__m128i a, simde__m128i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512VNNI_NATIVE)
|
||||
return _mm_maskz_dpwssd_epi32(k, src, a, b);
|
||||
#else
|
||||
return simde_mm_maskz_mov_epi32(k, simde_mm_dpwssd_epi32(src, a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VNNI_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_maskz_dpwssd_epi32
|
||||
#define _mm_maskz_dpwssd_epi32(k, src, a, b) simde_mm_maskz_dpwssd_epi32(k, src, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_dpwssd_epi32(simde__m256i src, simde__m256i a, simde__m256i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512VNNI_NATIVE)
|
||||
return _mm256_dpwssd_epi32(src, a, b);
|
||||
#else
|
||||
simde__m256i_private
|
||||
src_ = simde__m256i_to_private(src),
|
||||
a_ = simde__m256i_to_private(a),
|
||||
b_ = simde__m256i_to_private(b);
|
||||
|
||||
#if defined(SIMDE_SHUFFLE_VECTOR_) && defined(SIMDE_CONVERT_VECTOR_)
|
||||
int32_t x1_ SIMDE_VECTOR(64);
|
||||
int32_t x2_ SIMDE_VECTOR(64);
|
||||
simde__m256i_private
|
||||
r1_[2],
|
||||
r2_[2];
|
||||
|
||||
a_.i16 =
|
||||
SIMDE_SHUFFLE_VECTOR_(
|
||||
16, 32,
|
||||
a_.i16, a_.i16,
|
||||
0, 2, 4, 6, 8, 10, 12, 14,
|
||||
1, 3, 5, 7, 9, 11, 13, 15
|
||||
);
|
||||
b_.i16 =
|
||||
SIMDE_SHUFFLE_VECTOR_(
|
||||
16, 32,
|
||||
b_.i16, b_.i16,
|
||||
0, 2, 4, 6, 8, 10, 12, 14,
|
||||
1, 3, 5, 7, 9, 11, 13, 15
|
||||
);
|
||||
|
||||
SIMDE_CONVERT_VECTOR_(x1_, a_.i16);
|
||||
SIMDE_CONVERT_VECTOR_(x2_, b_.i16);
|
||||
|
||||
simde_memcpy(&r1_, &x1_, sizeof(x1_));
|
||||
simde_memcpy(&r2_, &x2_, sizeof(x2_));
|
||||
|
||||
src_.i32 +=
|
||||
(r1_[0].i32 * r2_[0].i32) +
|
||||
(r1_[1].i32 * r2_[1].i32);
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(a_.u16) / sizeof(a_.i16[0])) ; i++) {
|
||||
src_.i32[i / 2] += HEDLEY_STATIC_CAST(int32_t, a_.i16[i]) * HEDLEY_STATIC_CAST(int32_t, b_.i16[i]);
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m256i_from_private(src_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VNNI_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_dpwssd_epi32
|
||||
#define _mm256_dpwssd_epi32(src, a, b) simde_mm256_dpwssd_epi32(src, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_mask_dpwssd_epi32(simde__m256i src, simde__mmask8 k, simde__m256i a, simde__m256i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512VNNI_NATIVE)
|
||||
return _mm256_mask_dpwssd_epi32(src, k, a, b);
|
||||
#else
|
||||
return simde_mm256_mask_mov_epi32(src, k, simde_mm256_dpwssd_epi32(src, a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VNNI_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_mask_dpwssd_epi32
|
||||
#define _mm256_mask_dpwssd_epi32(src, k, a, b) simde_mm256_mask_dpwssd_epi32(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_maskz_dpwssd_epi32(simde__mmask8 k, simde__m256i src, simde__m256i a, simde__m256i b) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512VNNI_NATIVE)
|
||||
return _mm256_maskz_dpwssd_epi32(k, src, a, b);
|
||||
#else
|
||||
return simde_mm256_maskz_mov_epi32(k, simde_mm256_dpwssd_epi32(src, a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VNNI_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_maskz_dpwssd_epi32
|
||||
#define _mm256_maskz_dpwssd_epi32(k, src, a, b) simde_mm256_maskz_dpwssd_epi32(k, src, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_dpwssd_epi32(simde__m512i src, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512VNNI_NATIVE)
|
||||
return _mm512_dpwssd_epi32(src, a, b);
|
||||
#else
|
||||
simde__m512i_private
|
||||
src_ = simde__m512i_to_private(src),
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b);
|
||||
|
||||
#if defined(SIMDE_SHUFFLE_VECTOR_) && defined(SIMDE_CONVERT_VECTOR_)
|
||||
int32_t x1_ SIMDE_VECTOR(128);
|
||||
int32_t x2_ SIMDE_VECTOR(128);
|
||||
simde__m512i_private
|
||||
r1_[2],
|
||||
r2_[2];
|
||||
|
||||
a_.i16 =
|
||||
SIMDE_SHUFFLE_VECTOR_(
|
||||
16, 64,
|
||||
a_.i16, a_.i16,
|
||||
0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30,
|
||||
1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31
|
||||
);
|
||||
b_.i16 =
|
||||
SIMDE_SHUFFLE_VECTOR_(
|
||||
16, 64,
|
||||
b_.i16, b_.i16,
|
||||
0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30,
|
||||
1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31
|
||||
);
|
||||
|
||||
SIMDE_CONVERT_VECTOR_(x1_, a_.i16);
|
||||
SIMDE_CONVERT_VECTOR_(x2_, b_.i16);
|
||||
|
||||
simde_memcpy(&r1_, &x1_, sizeof(x1_));
|
||||
simde_memcpy(&r2_, &x2_, sizeof(x2_));
|
||||
|
||||
src_.i32 +=
|
||||
(r1_[0].i32 * r2_[0].i32) +
|
||||
(r1_[1].i32 * r2_[1].i32);
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(a_.u16) / sizeof(a_.i16[0])) ; i++) {
|
||||
src_.i32[i / 2] += HEDLEY_STATIC_CAST(int32_t, a_.i16[i]) * HEDLEY_STATIC_CAST(int32_t, b_.i16[i]);
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512i_from_private(src_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VNNI_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_dpwssd_epi32
|
||||
#define _mm512_dpwssd_epi32(src, a, b) simde_mm512_dpwssd_epi32(src, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_dpwssd_epi32(simde__m512i src, simde__mmask16 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512VNNI_NATIVE)
|
||||
return _mm512_mask_dpwssd_epi32(src, k, a, b);
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi32(src, k, simde_mm512_dpwssd_epi32(src, a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VNNI_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_dpwssd_epi32
|
||||
#define _mm512_mask_dpwssd_epi32(src, k, a, b) simde_mm512_mask_dpwssd_epi32(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_dpwssd_epi32(simde__mmask16 k, simde__m512i src, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512VNNI_NATIVE)
|
||||
return _mm512_maskz_dpwssd_epi32(k, src, a, b);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_epi32(k, simde_mm512_dpwssd_epi32(src, a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VNNI_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_dpwssd_epi32
|
||||
#define _mm512_maskz_dpwssd_epi32(k, src, a, b) simde_mm512_maskz_dpwssd_epi32(k, src, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_DPWSSD_H) */
|
||||
@@ -0,0 +1,299 @@
|
||||
#if !defined(SIMDE_X86_AVX512_DPWSSDS_H)
|
||||
#define SIMDE_X86_AVX512_DPWSSDS_H
|
||||
|
||||
#include "types.h"
|
||||
#include "mov.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_dpwssds_epi32 (simde__m128i src, simde__m128i a, simde__m128i b) {
|
||||
#if defined(SIMDE_X86_AVX512VNNI_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_dpwssds_epi32(src, a, b);
|
||||
#else
|
||||
simde__m128i_private
|
||||
src_ = simde__m128i_to_private(src),
|
||||
a_ = simde__m128i_to_private(a),
|
||||
b_ = simde__m128i_to_private(b);
|
||||
|
||||
#if defined(SIMDE_SHUFFLE_VECTOR_) && defined(SIMDE_CONVERT_VECTOR_) && defined(SIMDE_VECTOR_SUBSCRIPT_SCALAR)
|
||||
int32_t x1_ SIMDE_VECTOR(32);
|
||||
int32_t x2_ SIMDE_VECTOR(32);
|
||||
simde__m128i_private
|
||||
r1_[2],
|
||||
r2_[2];
|
||||
|
||||
a_.i16 =
|
||||
SIMDE_SHUFFLE_VECTOR_(
|
||||
16, 16,
|
||||
a_.i16, a_.i16,
|
||||
0, 2, 4, 6,
|
||||
1, 3, 5, 7
|
||||
);
|
||||
b_.i16 =
|
||||
SIMDE_SHUFFLE_VECTOR_(
|
||||
16, 16,
|
||||
b_.i16, b_.i16,
|
||||
0, 2, 4, 6,
|
||||
1, 3, 5, 7
|
||||
);
|
||||
|
||||
SIMDE_CONVERT_VECTOR_(x1_, a_.i16);
|
||||
SIMDE_CONVERT_VECTOR_(x2_, b_.i16);
|
||||
|
||||
simde_memcpy(&r1_, &x1_, sizeof(x1_));
|
||||
simde_memcpy(&r2_, &x2_, sizeof(x2_));
|
||||
|
||||
uint32_t au SIMDE_VECTOR(16) = HEDLEY_REINTERPRET_CAST(__typeof__(src_.u32), ((r1_[0].i32 * r2_[0].i32) + (r1_[1].i32 * r2_[1].i32)));
|
||||
uint32_t bu SIMDE_VECTOR(16) = HEDLEY_REINTERPRET_CAST(__typeof__(src_.u32), src_.i32);
|
||||
uint32_t ru SIMDE_VECTOR(16) = au + bu;
|
||||
|
||||
au = (au >> 31) + INT32_MAX;
|
||||
|
||||
uint32_t m SIMDE_VECTOR(16) = HEDLEY_REINTERPRET_CAST(__typeof__(m), HEDLEY_REINTERPRET_CAST(__typeof__(src_.i32), (au ^ bu) | ~(bu ^ ru)) < 0);
|
||||
src_.i32 = HEDLEY_REINTERPRET_CAST(__typeof__(src_.i32), (au & ~m) | (ru & m));
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(a_.i16) / sizeof(a_.i16[0]) / 2) ; i++) {
|
||||
src_.i32[i] =
|
||||
simde_math_adds_i32(
|
||||
src_.i32[i],
|
||||
HEDLEY_STATIC_CAST(int32_t, a_.i16[(2 * i) ]) * HEDLEY_STATIC_CAST(int32_t, b_.i16[(2 * i) ]) +
|
||||
HEDLEY_STATIC_CAST(int32_t, a_.i16[(2 * i) + 1]) * HEDLEY_STATIC_CAST(int32_t, b_.i16[(2 * i) + 1])
|
||||
);
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m128i_from_private(src_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VNNI_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_dpwssds_epi32
|
||||
#define _mm_dpwssds_epi32(src, a, b) simde_mm_dpwssds_epi32(src, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_mask_dpwssds_epi32 (simde__m128i src, simde__mmask8 k, simde__m128i a, simde__m128i b) {
|
||||
#if defined(SIMDE_X86_AVX512VNNI_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_mask_dpwssds_epi32(src, k, a, b);
|
||||
#else
|
||||
return simde_mm_mask_mov_epi32(src, k, simde_mm_dpwssds_epi32(src, a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VNNI_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_dpwssds_epi32
|
||||
#define _mm_mask_dpwssds_epi32(src, k, a, b) simde_mm_mask_dpwssds_epi32(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_maskz_dpwssds_epi32 (simde__mmask8 k, simde__m128i src, simde__m128i a, simde__m128i b) {
|
||||
#if defined(SIMDE_X86_AVX512VNNI_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_maskz_dpwssds_epi32(k, src, a, b);
|
||||
#else
|
||||
return simde_mm_maskz_mov_epi32(k, simde_mm_dpwssds_epi32(src, a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VNNI_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_maskz_dpwssds_epi32
|
||||
#define _mm_maskz_dpwssds_epi32(k, src, a, b) simde_mm_maskz_dpwssds_epi32(k, src, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_dpwssds_epi32 (simde__m256i src, simde__m256i a, simde__m256i b) {
|
||||
#if defined(SIMDE_X86_AVX512VNNI_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_dpwssds_epi32(src, a, b);
|
||||
#else
|
||||
simde__m256i_private
|
||||
src_ = simde__m256i_to_private(src),
|
||||
a_ = simde__m256i_to_private(a),
|
||||
b_ = simde__m256i_to_private(b);
|
||||
|
||||
#if defined(SIMDE_SHUFFLE_VECTOR_) && defined(SIMDE_CONVERT_VECTOR_) && defined(SIMDE_VECTOR_SUBSCRIPT_SCALAR)
|
||||
int32_t x1_ SIMDE_VECTOR(64);
|
||||
int32_t x2_ SIMDE_VECTOR(64);
|
||||
simde__m256i_private
|
||||
r1_[2],
|
||||
r2_[2];
|
||||
|
||||
a_.i16 =
|
||||
SIMDE_SHUFFLE_VECTOR_(
|
||||
16, 32,
|
||||
a_.i16, a_.i16,
|
||||
0, 2, 4, 6, 8, 10, 12, 14,
|
||||
1, 3, 5, 7, 9, 11, 13, 15
|
||||
);
|
||||
b_.i16 =
|
||||
SIMDE_SHUFFLE_VECTOR_(
|
||||
16, 32,
|
||||
b_.i16, b_.i16,
|
||||
0, 2, 4, 6, 8, 10, 12, 14,
|
||||
1, 3, 5, 7, 9, 11, 13, 15
|
||||
);
|
||||
|
||||
SIMDE_CONVERT_VECTOR_(x1_, a_.i16);
|
||||
SIMDE_CONVERT_VECTOR_(x2_, b_.i16);
|
||||
|
||||
simde_memcpy(&r1_, &x1_, sizeof(x1_));
|
||||
simde_memcpy(&r2_, &x2_, sizeof(x2_));
|
||||
|
||||
uint32_t au SIMDE_VECTOR(32) = HEDLEY_REINTERPRET_CAST(__typeof__(src_.u32), ((r1_[0].i32 * r2_[0].i32) + (r1_[1].i32 * r2_[1].i32)));
|
||||
uint32_t bu SIMDE_VECTOR(32) = HEDLEY_REINTERPRET_CAST(__typeof__(src_.u32), src_.i32);
|
||||
uint32_t ru SIMDE_VECTOR(32) = au + bu;
|
||||
|
||||
au = (au >> 31) + INT32_MAX;
|
||||
|
||||
uint32_t m SIMDE_VECTOR(32) = HEDLEY_REINTERPRET_CAST(__typeof__(m), HEDLEY_REINTERPRET_CAST(__typeof__(src_.i32), (au ^ bu) | ~(bu ^ ru)) < 0);
|
||||
src_.i32 = HEDLEY_REINTERPRET_CAST(__typeof__(src_.i32), (au & ~m) | (ru & m));
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(a_.i16) / sizeof(a_.i16[0]) / 2) ; i++) {
|
||||
src_.i32[i] =
|
||||
simde_math_adds_i32(
|
||||
src_.i32[i],
|
||||
HEDLEY_STATIC_CAST(int32_t, a_.i16[(2 * i) ]) * HEDLEY_STATIC_CAST(int32_t, b_.i16[(2 * i) ]) +
|
||||
HEDLEY_STATIC_CAST(int32_t, a_.i16[(2 * i) + 1]) * HEDLEY_STATIC_CAST(int32_t, b_.i16[(2 * i) + 1])
|
||||
);
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m256i_from_private(src_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VNNI_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_dpwssds_epi32
|
||||
#define _mm256_dpwssds_epi32(src, a, b) simde_mm256_dpwssds_epi32(src, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_mask_dpwssds_epi32 (simde__m256i src, simde__mmask8 k, simde__m256i a, simde__m256i b) {
|
||||
#if defined(SIMDE_X86_AVX512VNNI_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_mask_dpwssds_epi32(src, k, a, b);
|
||||
#else
|
||||
return simde_mm256_mask_mov_epi32(src, k, simde_mm256_dpwssds_epi32(src, a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VNNI_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_mask_dpwssds_epi32
|
||||
#define _mm256_mask_dpwssds_epi32(src, k, a, b) simde_mm256_mask_dpwssds_epi32(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_maskz_dpwssds_epi32 (simde__mmask8 k, simde__m256i src, simde__m256i a, simde__m256i b) {
|
||||
#if defined(SIMDE_X86_AVX512VNNI_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_maskz_dpwssds_epi32(k, src, a, b);
|
||||
#else
|
||||
return simde_mm256_maskz_mov_epi32(k, simde_mm256_dpwssds_epi32(src, a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VNNI_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_maskz_dpwssds_epi32
|
||||
#define _mm256_maskz_dpwssds_epi32(k, src, a, b) simde_mm256_maskz_dpwssds_epi32(k, src, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_dpwssds_epi32 (simde__m512i src, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512VNNI_NATIVE)
|
||||
return _mm512_dpwssds_epi32(src, a, b);
|
||||
#else
|
||||
simde__m512i_private
|
||||
src_ = simde__m512i_to_private(src),
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b);
|
||||
|
||||
#if defined(SIMDE_SHUFFLE_VECTOR_) && defined(SIMDE_CONVERT_VECTOR_) && defined(SIMDE_VECTOR_SUBSCRIPT_SCALAR)
|
||||
int32_t x1_ SIMDE_VECTOR(128);
|
||||
int32_t x2_ SIMDE_VECTOR(128);
|
||||
simde__m512i_private
|
||||
r1_[2],
|
||||
r2_[2];
|
||||
|
||||
a_.i16 =
|
||||
SIMDE_SHUFFLE_VECTOR_(
|
||||
16, 64,
|
||||
a_.i16, a_.i16,
|
||||
0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30,
|
||||
1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31
|
||||
);
|
||||
b_.i16 =
|
||||
SIMDE_SHUFFLE_VECTOR_(
|
||||
16, 64,
|
||||
b_.i16, b_.i16,
|
||||
0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30,
|
||||
1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31
|
||||
);
|
||||
|
||||
SIMDE_CONVERT_VECTOR_(x1_, a_.i16);
|
||||
SIMDE_CONVERT_VECTOR_(x2_, b_.i16);
|
||||
|
||||
simde_memcpy(&r1_, &x1_, sizeof(x1_));
|
||||
simde_memcpy(&r2_, &x2_, sizeof(x2_));
|
||||
|
||||
uint32_t au SIMDE_VECTOR(64) = HEDLEY_REINTERPRET_CAST(__typeof__(src_.u32), ((r1_[0].i32 * r2_[0].i32) + (r1_[1].i32 * r2_[1].i32)));
|
||||
uint32_t bu SIMDE_VECTOR(64) = HEDLEY_REINTERPRET_CAST(__typeof__(src_.u32), src_.i32);
|
||||
uint32_t ru SIMDE_VECTOR(64) = au + bu;
|
||||
|
||||
au = (au >> 31) + INT32_MAX;
|
||||
|
||||
uint32_t m SIMDE_VECTOR(64) = HEDLEY_REINTERPRET_CAST(__typeof__(m), HEDLEY_REINTERPRET_CAST(__typeof__(src_.i32), (au ^ bu) | ~(bu ^ ru)) < 0);
|
||||
src_.i32 = HEDLEY_REINTERPRET_CAST(__typeof__(src_.i32), (au & ~m) | (ru & m));
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(a_.i16) / sizeof(a_.i16[0]) / 2) ; i++) {
|
||||
src_.i32[i] =
|
||||
simde_math_adds_i32(
|
||||
src_.i32[i],
|
||||
HEDLEY_STATIC_CAST(int32_t, a_.i16[(2 * i) ]) * HEDLEY_STATIC_CAST(int32_t, b_.i16[(2 * i) ]) +
|
||||
HEDLEY_STATIC_CAST(int32_t, a_.i16[(2 * i) + 1]) * HEDLEY_STATIC_CAST(int32_t, b_.i16[(2 * i) + 1])
|
||||
);
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512i_from_private(src_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VNNI_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_dpwssds_epi32
|
||||
#define _mm512_dpwssds_epi32(src, a, b) simde_mm512_dpwssds_epi32(src, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_dpwssds_epi32 (simde__m512i src, simde__mmask16 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512VNNI_NATIVE)
|
||||
return _mm512_mask_dpwssds_epi32(src, k, a, b);
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi32(src, k, simde_mm512_dpwssds_epi32(src, a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VNNI_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_dpwssds_epi32
|
||||
#define _mm512_mask_dpwssds_epi32(src, k, a, b) simde_mm512_mask_dpwssds_epi32(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_dpwssds_epi32 (simde__mmask16 k, simde__m512i src, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512VNNI_NATIVE)
|
||||
return _mm512_maskz_dpwssds_epi32(k, src, a, b);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_epi32(k, simde_mm512_dpwssds_epi32(src, a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VNNI_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_dpwssds_epi32
|
||||
#define _mm512_maskz_dpwssds_epi32(k, src, a, b) simde_mm512_maskz_dpwssds_epi32(k, src, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_DPWSSDS_H) */
|
||||
@@ -0,0 +1,97 @@
|
||||
/* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Copyright:
|
||||
* 2021 Andrew Rodriguez <anrodriguez@linkedin.com>
|
||||
* 2021 Evan Nemerson <evan@nemerson.com>
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512_EXPAND_H)
|
||||
#define SIMDE_X86_AVX512_EXPAND_H
|
||||
|
||||
#include "types.h"
|
||||
#include "mov.h"
|
||||
#include "mov_mask.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_mask_expand_epi32(simde__m256i src, simde__mmask8 k, simde__m256i a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_mask_expand_epi32(src, k, a);
|
||||
#else
|
||||
simde__m256i_private
|
||||
a_ = simde__m256i_to_private(a),
|
||||
src_ = simde__m256i_to_private(src);
|
||||
simde__m256i_private r_;
|
||||
|
||||
size_t src_idx = 0;
|
||||
for (size_t i = 0; i < (sizeof(r_.i32) / sizeof(r_.i32[0])) ; i++) {
|
||||
if (k & (UINT64_C(1) << i)) {
|
||||
r_.i32[i] = a_.i32[src_idx++];
|
||||
} else {
|
||||
r_.i32[i] = src_.i32[i];
|
||||
}
|
||||
}
|
||||
|
||||
return simde__m256i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_mask_expand_epi32
|
||||
#define _mm256_mask_expand_epi32(src, k, a) simde_mm256_mask_expand_epi32((src), (k), (a))
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_maskz_expand_epi32(simde__mmask8 k, simde__m256i a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_maskz_expand_epi32(k, a);
|
||||
#else
|
||||
simde__m256i_private
|
||||
a_ = simde__m256i_to_private(a),
|
||||
r_;
|
||||
|
||||
size_t src_idx = 0;
|
||||
for (size_t i = 0; i < (sizeof(r_.i32) / sizeof(r_.i32[0])) ; i++) {
|
||||
if (k & (UINT64_C(1) << i)) {
|
||||
r_.i32[i] = a_.i32[src_idx++];
|
||||
} else {
|
||||
r_.i32[i] = INT32_C(0);
|
||||
}
|
||||
}
|
||||
|
||||
return simde__m256i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_maskz_expand_epi32
|
||||
#define _mm256_maskz_expand_epi32(k, a) simde_mm256_maskz_expand_epi32((k), (a))
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_EXPAND_H) */
|
||||
@@ -0,0 +1,267 @@
|
||||
/* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Copyright:
|
||||
* 2020 Evan Nemerson <evan@nemerson.com>
|
||||
* 2020 Christopher Moore <moore@free.fr>
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512_EXTRACT_H)
|
||||
#define SIMDE_X86_AVX512_EXTRACT_H
|
||||
|
||||
#include "types.h"
|
||||
#include "mov.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128
|
||||
simde_mm256_extractf32x4_ps (simde__m256 a, int imm8)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 1) {
|
||||
simde__m256_private a_ = simde__m256_to_private(a);
|
||||
|
||||
return a_.m128[imm8 & 1];
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
#define simde_mm256_extractf32x4_ps(a, imm8) _mm256_extractf32x4_ps(a, imm8)
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_extractf32x4_ps
|
||||
#define _mm256_extractf32x4_ps(a, imm8) simde_mm256_extractf32x4_ps((a), (imm8))
|
||||
#endif
|
||||
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128
|
||||
simde_mm512_extractf32x4_ps (simde__m512 a, int imm8)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 3) {
|
||||
simde__m512_private a_ = simde__m512_to_private(a);
|
||||
|
||||
/* GCC 6 generates an ICE */
|
||||
#if defined(HEDLEY_GCC_VERSION) && !HEDLEY_GCC_VERSION_CHECK(7,0,0)
|
||||
return a_.m128[imm8 & 3];
|
||||
#else
|
||||
simde__m128_private r_;
|
||||
const size_t offset = HEDLEY_STATIC_CAST(size_t, imm8 & 3) * (sizeof(r_.f32) / sizeof(r_.f32[0]));
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.f32) / sizeof(r_.f32[0])) ; i++) {
|
||||
r_.f32[i] = a_.f32[i + offset];
|
||||
}
|
||||
|
||||
return simde__m128_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && (!defined(HEDLEY_GCC_VERSION) || HEDLEY_GCC_VERSION_CHECK(7,0,0))
|
||||
#define simde_mm512_extractf32x4_ps(a, imm8) _mm512_extractf32x4_ps(a, imm8)
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_extractf32x4_ps
|
||||
#define _mm512_extractf32x4_ps(a, imm8) simde_mm512_extractf32x4_ps((a), (imm8))
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && (!defined(HEDLEY_GCC_VERSION) || HEDLEY_GCC_VERSION_CHECK(7,0,0))
|
||||
#define simde_mm512_mask_extractf32x4_ps(src, k, a, imm8) _mm512_mask_extractf32x4_ps(src, k, a, imm8)
|
||||
#else
|
||||
#define simde_mm512_mask_extractf32x4_ps(src, k, a, imm8) simde_mm_mask_mov_ps((src), (k), simde_mm512_extractf32x4_ps((a), (imm8)))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_extractf32x4_ps
|
||||
#define _mm512_mask_extractf32x4_ps(src, k, a, imm8) simde_mm512_mask_extractf32x4_ps((src), (k), (a), (imm8))
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && (!defined(HEDLEY_GCC_VERSION) || HEDLEY_GCC_VERSION_CHECK(7,0,0))
|
||||
#define simde_mm512_maskz_extractf32x4_ps(k, a, imm8) _mm512_maskz_extractf32x4_ps(k, a, imm8)
|
||||
#else
|
||||
#define simde_mm512_maskz_extractf32x4_ps(k, a, imm8) simde_mm_maskz_mov_ps((k), simde_mm512_extractf32x4_ps((a), (imm8)))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_extractf32x4_ps
|
||||
#define _mm512_maskz_extractf32x4_ps(k, a, imm8) simde_mm512_maskz_extractf32x4_ps((k), (a), (imm8))
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256
|
||||
simde_mm512_extractf32x8_ps (simde__m512 a, int imm8)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 1) {
|
||||
simde__m512_private a_ = simde__m512_to_private(a);
|
||||
|
||||
return a_.m256[imm8 & 1];
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
#define simde_mm512_extractf32x8_ps(a, imm8) _mm512_extractf32x8_ps(a, imm8)
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_extractf32x8_ps
|
||||
#define _mm512_extractf32x8_ps(a, imm8) simde_mm512_extractf32x8_ps(a, imm8)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256d
|
||||
simde_mm512_extractf64x4_pd (simde__m512d a, int imm8)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 1) {
|
||||
simde__m512d_private a_ = simde__m512d_to_private(a);
|
||||
|
||||
return a_.m256d[imm8 & 1];
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && (!defined(HEDLEY_GCC_VERSION) || HEDLEY_GCC_VERSION_CHECK(7,0,0))
|
||||
#define simde_mm512_extractf64x4_pd(a, imm8) _mm512_extractf64x4_pd(a, imm8)
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_extractf64x4_pd
|
||||
#define _mm512_extractf64x4_pd(a, imm8) simde_mm512_extractf64x4_pd(a, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && (!defined(HEDLEY_GCC_VERSION) || HEDLEY_GCC_VERSION_CHECK(7,0,0))
|
||||
#define simde_mm512_mask_extractf64x4_pd(src, k, a, imm8) _mm512_mask_extractf64x4_pd(src, k, a, imm8)
|
||||
#else
|
||||
#define simde_mm512_mask_extractf64x4_pd(src, k, a, imm8) simde_mm256_mask_mov_pd(src, k, simde_mm512_extractf64x4_pd(a, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_extractf64x4_pd
|
||||
#define _mm512_mask_extractf64x4_pd(src, k, a, imm8) simde_mm512_mask_extractf64x4_pd(src, k, a, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && (!defined(HEDLEY_GCC_VERSION) || HEDLEY_GCC_VERSION_CHECK(7,0,0))
|
||||
#define simde_mm512_maskz_extractf64x4_pd(k, a, imm8) _mm512_maskz_extractf64x4_pd(k, a, imm8)
|
||||
#else
|
||||
#define simde_mm512_maskz_extractf64x4_pd(k, a, imm8) simde_mm256_maskz_mov_pd(k, simde_mm512_extractf64x4_pd(a, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_extractf64x4_pd
|
||||
#define _mm512_maskz_extractf64x4_pd(k, a, imm8) simde_mm512_maskz_extractf64x4_pd(k, a, imm8)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm512_extracti32x4_epi32 (simde__m512i a, int imm8)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 3) {
|
||||
simde__m512i_private a_ = simde__m512i_to_private(a);
|
||||
|
||||
return a_.m128i[imm8 & 3];
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && (!defined(HEDLEY_GCC_VERSION) || HEDLEY_GCC_VERSION_CHECK(7,0,0)) && !defined(SIMDE_BUG_CLANG_REV_299346)
|
||||
#define simde_mm512_extracti32x4_epi32(a, imm8) _mm512_extracti32x4_epi32(a, imm8)
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_extracti32x4_epi32
|
||||
#define _mm512_extracti32x4_epi32(a, imm8) simde_mm512_extracti32x4_epi32(a, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && (!defined(HEDLEY_GCC_VERSION) || HEDLEY_GCC_VERSION_CHECK(7,0,0)) && !defined(SIMDE_BUG_CLANG_REV_299346)
|
||||
#define simde_mm512_mask_extracti32x4_epi32(src, k, a, imm8) _mm512_mask_extracti32x4_epi32(src, k, a, imm8)
|
||||
#else
|
||||
#define simde_mm512_mask_extracti32x4_epi32(src, k, a, imm8) simde_mm_mask_mov_epi32(src, k, simde_mm512_extracti32x4_epi32(a, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_extracti32x4_epi32
|
||||
#define _mm512_mask_extracti32x4_epi32(src, k, a, imm8) simde_mm512_mask_extracti32x4_epi32(src, k, a, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && (!defined(HEDLEY_GCC_VERSION) || HEDLEY_GCC_VERSION_CHECK(7,0,0)) && !defined(SIMDE_BUG_CLANG_REV_299346)
|
||||
#define simde_mm512_maskz_extracti32x4_epi32(k, a, imm8) _mm512_maskz_extracti32x4_epi32(k, a, imm8)
|
||||
#else
|
||||
#define simde_mm512_maskz_extracti32x4_epi32(k, a, imm8) simde_mm_maskz_mov_epi32(k, simde_mm512_extracti32x4_epi32(a, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_extracti32x4_epi32
|
||||
#define _mm512_maskz_extracti32x4_epi32(k, a, imm8) simde_mm512_maskz_extracti32x4_epi32(k, a, imm8)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm512_extracti32x8_epi32 (simde__m512i a, int imm8)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 1) {
|
||||
simde__m512i_private a_ = simde__m512i_to_private(a);
|
||||
|
||||
return a_.m256i[imm8 & 1];
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE) && (!defined(HEDLEY_GCC_VERSION) || HEDLEY_GCC_VERSION_CHECK(7,0,0)) && !defined(SIMDE_BUG_CLANG_REV_299346)
|
||||
#define simde_mm512_extracti32x8_epi32(a, imm8) _mm512_extracti32x8_epi32(a, imm8)
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_extracti32x8_epi32
|
||||
#define _mm512_extracti32x8_epi32(a, imm8) simde_mm512_extracti32x8_epi32((a), (imm8))
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX51FDQ_NATIVE) && (!defined(HEDLEY_GCC_VERSION) || HEDLEY_GCC_VERSION_CHECK(7,0,0)) && !defined(SIMDE_BUG_CLANG_REV_299346)
|
||||
#define simde_mm512_mask_extracti32x8_epi32(src, k, a, imm8) _mm512_mask_extracti32x8_epi32(src, k, a, imm8)
|
||||
#else
|
||||
#define simde_mm512_mask_extracti32x8_epi32(src, k, a, imm8) simde_mm256_mask_mov_epi32((src), (k), simde_mm512_extracti32x8_epi32((a), (imm8)))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_extracti32x8_epi32
|
||||
#define _mm512_mask_extracti32x8_epi32(src, k, a, imm8) simde_mm512_mask_extracti32x8_epi32((src), (k), (a), (imm8))
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE) && (!defined(HEDLEY_GCC_VERSION) || HEDLEY_GCC_VERSION_CHECK(7,0,0)) && !defined(SIMDE_BUG_CLANG_REV_299346)
|
||||
#define simde_mm512_maskz_extracti32x8_epi32(k, a, imm8) _mm512_maskz_extracti32x8_epi32(k, a, imm8)
|
||||
#else
|
||||
#define simde_mm512_maskz_extracti32x8_epi32(k, a, imm8) simde_mm256_maskz_mov_epi32((k), simde_mm512_extracti32x8_epi32((a), (imm8)))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_extracti32x8_epi32
|
||||
#define _mm512_maskz_extracti32x8_epi32(k, a, imm8) simde_mm512_maskz_extracti32x8_epi32((k), (a), (imm8))
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm512_extracti64x4_epi64 (simde__m512i a, int imm8)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 1) {
|
||||
simde__m512i_private a_ = simde__m512i_to_private(a);
|
||||
|
||||
return a_.m256i[imm8 & 1];
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && (!defined(HEDLEY_GCC_VERSION) || HEDLEY_GCC_VERSION_CHECK(7,0,0)) && !defined(SIMDE_BUG_CLANG_REV_299346)
|
||||
#define simde_mm512_extracti64x4_epi64(a, imm8) _mm512_extracti64x4_epi64(a, imm8)
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_extracti64x4_epi64
|
||||
#define _mm512_extracti64x4_epi64(a, imm8) simde_mm512_extracti64x4_epi64((a), (imm8))
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && (!defined(HEDLEY_GCC_VERSION) || HEDLEY_GCC_VERSION_CHECK(7,0,0)) && !defined(SIMDE_BUG_CLANG_REV_299346)
|
||||
#define simde_mm512_mask_extracti64x4_epi64(src, k, a, imm8) _mm512_mask_extracti64x4_epi64(src, k, a, imm8)
|
||||
#else
|
||||
#define simde_mm512_mask_extracti64x4_epi64(src, k, a, imm8) simde_mm256_mask_mov_epi64((src), (k), simde_mm512_extracti64x4_epi64((a), (imm8)))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_extracti64x4_epi64
|
||||
#define _mm512_mask_extracti64x4_epi64(src, k, a, imm8) simde_mm512_mask_extracti64x4_epi64((src), (k), (a), (imm8))
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && (!defined(HEDLEY_GCC_VERSION) || HEDLEY_GCC_VERSION_CHECK(7,0,0)) && !defined(SIMDE_BUG_CLANG_REV_299346)
|
||||
#define simde_mm512_maskz_extracti64x4_epi64(k, a, imm8) _mm512_maskz_extracti64x4_epi64(k, a, imm8)
|
||||
#else
|
||||
#define simde_mm512_maskz_extracti64x4_epi64(k, a, imm8) simde_mm256_maskz_mov_epi64((k), simde_mm512_extracti64x4_epi64((a), (imm8)))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_extracti64x4_epi64
|
||||
#define _mm512_maskz_extracti64x4_epi64(k, a, imm8) simde_mm512_maskz_extracti64x4_epi64((k), (a), (imm8))
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_EXTRACT_H) */
|
||||
@@ -0,0 +1,900 @@
|
||||
#if !defined(SIMDE_X86_AVX512_FIXUPIMM_H)
|
||||
#define SIMDE_X86_AVX512_FIXUPIMM_H
|
||||
|
||||
#include "types.h"
|
||||
#include "flushsubnormal.h"
|
||||
#include "mov.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128
|
||||
simde_mm_fixupimm_ps (simde__m128 a, simde__m128 b, simde__m128i c, int imm8)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 255) {
|
||||
HEDLEY_STATIC_CAST(void, imm8);
|
||||
simde__m128_private
|
||||
r_,
|
||||
a_ = simde__m128_to_private(a),
|
||||
b_ = simde__m128_to_private(b),
|
||||
s_ = simde__m128_to_private(simde_x_mm_flushsubnormal_ps(b));
|
||||
simde__m128i_private c_ = simde__m128i_to_private(c);
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.f32) / sizeof(r_.f32[0])) ; i++) {
|
||||
int32_t select = 1;
|
||||
switch (simde_math_fpclassifyf(s_.f32[i])) {
|
||||
case SIMDE_MATH_FP_NORMAL:
|
||||
select = (s_.f32[i] < SIMDE_FLOAT32_C(0.0)) ? 6 : (s_.f32[i] == SIMDE_FLOAT32_C(1.0)) ? 3 : 7;
|
||||
break;
|
||||
case SIMDE_MATH_FP_ZERO:
|
||||
select = 2;
|
||||
break;
|
||||
case SIMDE_MATH_FP_NAN:
|
||||
select = 0;
|
||||
break;
|
||||
case SIMDE_MATH_FP_INFINITE:
|
||||
select = ((s_.f32[i] > SIMDE_FLOAT32_C(0.0)) ? 5 : 4);
|
||||
break;
|
||||
}
|
||||
|
||||
switch (((c_.i32[i] >> (select << 2)) & 15)) {
|
||||
case 0:
|
||||
r_.f32[i] = a_.f32[i];
|
||||
break;
|
||||
case 1:
|
||||
r_.f32[i] = b_.f32[i];
|
||||
break;
|
||||
case 2:
|
||||
r_.f32[i] = SIMDE_MATH_NANF;
|
||||
break;
|
||||
case 3:
|
||||
r_.f32[i] = -SIMDE_MATH_NANF;
|
||||
break;
|
||||
case 4:
|
||||
r_.f32[i] = -SIMDE_MATH_INFINITYF;
|
||||
break;
|
||||
case 5:
|
||||
r_.f32[i] = SIMDE_MATH_INFINITYF;
|
||||
break;
|
||||
case 6:
|
||||
r_.f32[i] = s_.f32[i] < SIMDE_FLOAT32_C(0.0) ? -SIMDE_MATH_INFINITYF : SIMDE_MATH_INFINITYF;
|
||||
break;
|
||||
case 7:
|
||||
r_.f32[i] = SIMDE_FLOAT32_C(-0.0);
|
||||
break;
|
||||
case 8:
|
||||
r_.f32[i] = SIMDE_FLOAT32_C(0.0);
|
||||
break;
|
||||
case 9:
|
||||
r_.f32[i] = SIMDE_FLOAT32_C(-1.0);
|
||||
break;
|
||||
case 10:
|
||||
r_.f32[i] = SIMDE_FLOAT32_C(1.0);
|
||||
break;
|
||||
case 11:
|
||||
r_.f32[i] = SIMDE_FLOAT32_C(0.5);
|
||||
break;
|
||||
case 12:
|
||||
r_.f32[i] = SIMDE_FLOAT32_C(90.0);
|
||||
break;
|
||||
case 13:
|
||||
r_.f32[i] = SIMDE_MATH_PIF / 2;
|
||||
break;
|
||||
case 14:
|
||||
r_.f32[i] = SIMDE_MATH_FLT_MAX;
|
||||
break;
|
||||
case 15:
|
||||
r_.f32[i] = -SIMDE_MATH_FLT_MAX;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return simde__m128_from_private(r_);
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
#define simde_mm_fixupimm_ps(a, b, c, imm8) _mm_fixupimm_ps(a, b, c, imm8)
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_fixupimm_ps
|
||||
#define _mm_fixupimm_ps(a, b, c, imm8) simde_mm_fixupimm_ps(a, b, c, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
#define simde_mm_mask_fixupimm_ps(a, k, b, c, imm8) _mm_mask_fixupimm_ps(a, k, b, c, imm8)
|
||||
#else
|
||||
#define simde_mm_mask_fixupimm_ps(a, k, b, c, imm8) simde_mm_mask_mov_ps(a, k, simde_mm_fixupimm_ps(a, b, c, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_fixupimm_ps
|
||||
#define _mm_mask_fixupimm_ps(a, k, b, c, imm8) simde_mm_mask_fixupimm_ps(a, k, b, c, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
#define simde_mm_maskz_fixupimm_ps(k, a, b, c, imm8) _mm_maskz_fixupimm_ps(k, a, b, c, imm8)
|
||||
#else
|
||||
#define simde_mm_maskz_fixupimm_ps(k, a, b, c, imm8) simde_mm_maskz_mov_ps(k, simde_mm_fixupimm_ps(a, b, c, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_maskz_fixupimm_ps
|
||||
#define _mm_maskz_fixupimm_ps(k, a, b, c, imm8) simde_mm_maskz_fixupimm_ps(k, a, b, c, imm8)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256
|
||||
simde_mm256_fixupimm_ps (simde__m256 a, simde__m256 b, simde__m256i c, int imm8)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 255) {
|
||||
HEDLEY_STATIC_CAST(void, imm8);
|
||||
simde__m256_private
|
||||
r_,
|
||||
a_ = simde__m256_to_private(a),
|
||||
b_ = simde__m256_to_private(b),
|
||||
s_ = simde__m256_to_private(simde_x_mm256_flushsubnormal_ps(b));
|
||||
simde__m256i_private c_ = simde__m256i_to_private(c);
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.f32) / sizeof(r_.f32[0])) ; i++) {
|
||||
int32_t select = 1;
|
||||
switch (simde_math_fpclassifyf(s_.f32[i])) {
|
||||
case SIMDE_MATH_FP_NORMAL:
|
||||
select = (s_.f32[i] < SIMDE_FLOAT32_C(0.0)) ? 6 : (s_.f32[i] == SIMDE_FLOAT32_C(1.0)) ? 3 : 7;
|
||||
break;
|
||||
case SIMDE_MATH_FP_ZERO:
|
||||
select = 2;
|
||||
break;
|
||||
case SIMDE_MATH_FP_NAN:
|
||||
select = 0;
|
||||
break;
|
||||
case SIMDE_MATH_FP_INFINITE:
|
||||
select = ((s_.f32[i] > SIMDE_FLOAT32_C(0.0)) ? 5 : 4);
|
||||
break;
|
||||
}
|
||||
|
||||
switch (((c_.i32[i] >> (select << 2)) & 15)) {
|
||||
case 0:
|
||||
r_.f32[i] = a_.f32[i];
|
||||
break;
|
||||
case 1:
|
||||
r_.f32[i] = b_.f32[i];
|
||||
break;
|
||||
case 2:
|
||||
r_.f32[i] = SIMDE_MATH_NANF;
|
||||
break;
|
||||
case 3:
|
||||
r_.f32[i] = -SIMDE_MATH_NANF;
|
||||
break;
|
||||
case 4:
|
||||
r_.f32[i] = -SIMDE_MATH_INFINITYF;
|
||||
break;
|
||||
case 5:
|
||||
r_.f32[i] = SIMDE_MATH_INFINITYF;
|
||||
break;
|
||||
case 6:
|
||||
r_.f32[i] = s_.f32[i] < SIMDE_FLOAT32_C(0.0) ? -SIMDE_MATH_INFINITYF : SIMDE_MATH_INFINITYF;
|
||||
break;
|
||||
case 7:
|
||||
r_.f32[i] = SIMDE_FLOAT32_C(-0.0);
|
||||
break;
|
||||
case 8:
|
||||
r_.f32[i] = SIMDE_FLOAT32_C(0.0);
|
||||
break;
|
||||
case 9:
|
||||
r_.f32[i] = SIMDE_FLOAT32_C(-1.0);
|
||||
break;
|
||||
case 10:
|
||||
r_.f32[i] = SIMDE_FLOAT32_C(1.0);
|
||||
break;
|
||||
case 11:
|
||||
r_.f32[i] = SIMDE_FLOAT32_C(0.5);
|
||||
break;
|
||||
case 12:
|
||||
r_.f32[i] = SIMDE_FLOAT32_C(90.0);
|
||||
break;
|
||||
case 13:
|
||||
r_.f32[i] = SIMDE_MATH_PIF / 2;
|
||||
break;
|
||||
case 14:
|
||||
r_.f32[i] = SIMDE_MATH_FLT_MAX;
|
||||
break;
|
||||
case 15:
|
||||
r_.f32[i] = -SIMDE_MATH_FLT_MAX;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return simde__m256_from_private(r_);
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
#define simde_mm256_fixupimm_ps(a, b, c, imm8) _mm256_fixupimm_ps(a, b, c, imm8)
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_fixupimm_ps
|
||||
#define _mm256_fixupimm_ps(a, b, c, imm8) simde_mm256_fixupimm_ps(a, b, c, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
#define simde_mm256_mask_fixupimm_ps(a, k, b, c, imm8) _mm256_mask_fixupimm_ps(a, k, b, c, imm8)
|
||||
#else
|
||||
#define simde_mm256_mask_fixupimm_ps(a, k, b, c, imm8) simde_mm256_mask_mov_ps(a, k, simde_mm256_fixupimm_ps(a, b, c, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_mask_fixupimm_ps
|
||||
#define _mm256_mask_fixupimm_ps(a, k, b, c, imm8) simde_mm256_mask_fixupimm_ps(a, k, b, c, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
#define simde_mm256_maskz_fixupimm_ps(k, a, b, c, imm8) _mm256_maskz_fixupimm_ps(k, a, b, c, imm8)
|
||||
#else
|
||||
#define simde_mm256_maskz_fixupimm_ps(k, a, b, c, imm8) simde_mm256_maskz_mov_ps(k, simde_mm256_fixupimm_ps(a, b, c, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_maskz_fixupimm_ps
|
||||
#define _mm256_maskz_fixupimm_ps(k, a, b, c, imm8) simde_mm256_maskz_fixupimm_ps(k, a, b, c, imm8)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_fixupimm_ps (simde__m512 a, simde__m512 b, simde__m512i c, int imm8)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 255) {
|
||||
HEDLEY_STATIC_CAST(void, imm8);
|
||||
simde__m512_private
|
||||
r_,
|
||||
a_ = simde__m512_to_private(a),
|
||||
b_ = simde__m512_to_private(b),
|
||||
s_ = simde__m512_to_private(simde_x_mm512_flushsubnormal_ps(b));
|
||||
simde__m512i_private c_ = simde__m512i_to_private(c);
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.f32) / sizeof(r_.f32[0])) ; i++) {
|
||||
int32_t select = 1;
|
||||
switch (simde_math_fpclassifyf(s_.f32[i])) {
|
||||
case SIMDE_MATH_FP_NORMAL:
|
||||
select = (s_.f32[i] < SIMDE_FLOAT32_C(0.0)) ? 6 : (s_.f32[i] == SIMDE_FLOAT32_C(1.0)) ? 3 : 7;
|
||||
break;
|
||||
case SIMDE_MATH_FP_ZERO:
|
||||
select = 2;
|
||||
break;
|
||||
case SIMDE_MATH_FP_NAN:
|
||||
select = 0;
|
||||
break;
|
||||
case SIMDE_MATH_FP_INFINITE:
|
||||
select = ((s_.f32[i] > SIMDE_FLOAT32_C(0.0)) ? 5 : 4);
|
||||
break;
|
||||
}
|
||||
|
||||
switch (((c_.i32[i] >> (select << 2)) & 15)) {
|
||||
case 0:
|
||||
r_.f32[i] = a_.f32[i];
|
||||
break;
|
||||
case 1:
|
||||
r_.f32[i] = b_.f32[i];
|
||||
break;
|
||||
case 2:
|
||||
r_.f32[i] = SIMDE_MATH_NANF;
|
||||
break;
|
||||
case 3:
|
||||
r_.f32[i] = -SIMDE_MATH_NANF;
|
||||
break;
|
||||
case 4:
|
||||
r_.f32[i] = -SIMDE_MATH_INFINITYF;
|
||||
break;
|
||||
case 5:
|
||||
r_.f32[i] = SIMDE_MATH_INFINITYF;
|
||||
break;
|
||||
case 6:
|
||||
r_.f32[i] = s_.f32[i] < SIMDE_FLOAT32_C(0.0) ? -SIMDE_MATH_INFINITYF : SIMDE_MATH_INFINITYF;
|
||||
break;
|
||||
case 7:
|
||||
r_.f32[i] = SIMDE_FLOAT32_C(-0.0);
|
||||
break;
|
||||
case 8:
|
||||
r_.f32[i] = SIMDE_FLOAT32_C(0.0);
|
||||
break;
|
||||
case 9:
|
||||
r_.f32[i] = SIMDE_FLOAT32_C(-1.0);
|
||||
break;
|
||||
case 10:
|
||||
r_.f32[i] = SIMDE_FLOAT32_C(1.0);
|
||||
break;
|
||||
case 11:
|
||||
r_.f32[i] = SIMDE_FLOAT32_C(0.5);
|
||||
break;
|
||||
case 12:
|
||||
r_.f32[i] = SIMDE_FLOAT32_C(90.0);
|
||||
break;
|
||||
case 13:
|
||||
r_.f32[i] = SIMDE_MATH_PIF / 2;
|
||||
break;
|
||||
case 14:
|
||||
r_.f32[i] = SIMDE_MATH_FLT_MAX;
|
||||
break;
|
||||
case 15:
|
||||
r_.f32[i] = -SIMDE_MATH_FLT_MAX;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return simde__m512_from_private(r_);
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define simde_mm512_fixupimm_ps(a, b, c, imm8) _mm512_fixupimm_ps(a, b, c, imm8)
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_fixupimm_ps
|
||||
#define _mm512_fixupimm_ps(a, b, c, imm8) simde_mm512_fixupimm_ps(a, b, c, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define simde_mm512_mask_fixupimm_ps(a, k, b, c, imm8) _mm512_mask_fixupimm_ps(a, k, b, c, imm8)
|
||||
#else
|
||||
#define simde_mm512_mask_fixupimm_ps(a, k, b, c, imm8) simde_mm512_mask_mov_ps(a, k, simde_mm512_fixupimm_ps(a, b, c, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_fixupimm_ps
|
||||
#define _mm512_mask_fixupimm_ps(a, k, b, c, imm8) simde_mm512_mask_fixupimm_ps(a, k, b, c, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define simde_mm512_maskz_fixupimm_ps(k, a, b, c, imm8) _mm512_maskz_fixupimm_ps(k, a, b, c, imm8)
|
||||
#else
|
||||
#define simde_mm512_maskz_fixupimm_ps(k, a, b, c, imm8) simde_mm512_maskz_mov_ps(k, simde_mm512_fixupimm_ps(a, b, c, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_fixupimm_ps
|
||||
#define _mm512_maskz_fixupimm_ps(k, a, b, c, imm8) simde_mm512_maskz_fixupimm_ps(k, a, b, c, imm8)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128
|
||||
simde_mm_fixupimm_ss (simde__m128 a, simde__m128 b, simde__m128i c, int imm8)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 255) {
|
||||
HEDLEY_STATIC_CAST(void, imm8);
|
||||
simde__m128_private
|
||||
a_ = simde__m128_to_private(a),
|
||||
b_ = simde__m128_to_private(b),
|
||||
s_ = simde__m128_to_private(simde_x_mm_flushsubnormal_ps(b));
|
||||
simde__m128i_private c_ = simde__m128i_to_private(c);
|
||||
|
||||
int32_t select = 1;
|
||||
switch (simde_math_fpclassifyf(s_.f32[0])) {
|
||||
case SIMDE_MATH_FP_NORMAL:
|
||||
select = (s_.f32[0] < SIMDE_FLOAT32_C(0.0)) ? 6 : (s_.f32[0] == SIMDE_FLOAT32_C(1.0)) ? 3 : 7;
|
||||
break;
|
||||
case SIMDE_MATH_FP_ZERO:
|
||||
select = 2;
|
||||
break;
|
||||
case SIMDE_MATH_FP_NAN:
|
||||
select = 0;
|
||||
break;
|
||||
case SIMDE_MATH_FP_INFINITE:
|
||||
select = ((s_.f32[0] > SIMDE_FLOAT32_C(0.0)) ? 5 : 4);
|
||||
break;
|
||||
}
|
||||
|
||||
switch (((c_.i32[0] >> (select << 2)) & 15)) {
|
||||
case 0:
|
||||
b_.f32[0] = a_.f32[0];
|
||||
break;
|
||||
case 2:
|
||||
b_.f32[0] = SIMDE_MATH_NANF;
|
||||
break;
|
||||
case 3:
|
||||
b_.f32[0] = -SIMDE_MATH_NANF;
|
||||
break;
|
||||
case 4:
|
||||
b_.f32[0] = -SIMDE_MATH_INFINITYF;
|
||||
break;
|
||||
case 5:
|
||||
b_.f32[0] = SIMDE_MATH_INFINITYF;
|
||||
break;
|
||||
case 6:
|
||||
b_.f32[0] = s_.f32[0] < SIMDE_FLOAT32_C(0.0) ? -SIMDE_MATH_INFINITYF : SIMDE_MATH_INFINITYF;
|
||||
break;
|
||||
case 7:
|
||||
b_.f32[0] = SIMDE_FLOAT32_C(-0.0);
|
||||
break;
|
||||
case 8:
|
||||
b_.f32[0] = SIMDE_FLOAT32_C(0.0);
|
||||
break;
|
||||
case 9:
|
||||
b_.f32[0] = SIMDE_FLOAT32_C(-1.0);
|
||||
break;
|
||||
case 10:
|
||||
b_.f32[0] = SIMDE_FLOAT32_C(1.0);
|
||||
break;
|
||||
case 11:
|
||||
b_.f32[0] = SIMDE_FLOAT32_C(0.5);
|
||||
break;
|
||||
case 12:
|
||||
b_.f32[0] = SIMDE_FLOAT32_C(90.0);
|
||||
break;
|
||||
case 13:
|
||||
b_.f32[0] = SIMDE_MATH_PIF / 2;
|
||||
break;
|
||||
case 14:
|
||||
b_.f32[0] = SIMDE_MATH_FLT_MAX;
|
||||
break;
|
||||
case 15:
|
||||
b_.f32[0] = -SIMDE_MATH_FLT_MAX;
|
||||
break;
|
||||
}
|
||||
|
||||
return simde__m128_from_private(b_);
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define simde_mm_fixupimm_ss(a, b, c, imm8) _mm_fixupimm_ss(a, b, c, imm8)
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_fixupimm_ss
|
||||
#define _mm_fixupimm_ss(a, b, c, imm8) simde_mm_fixupimm_ss(a, b, c, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define simde_mm_mask_fixupimm_ss(a, k, b, c, imm8) _mm_mask_fixupimm_ss(a, k, b, c, imm8)
|
||||
#else
|
||||
#define simde_mm_mask_fixupimm_ss(a, k, b, c, imm8) simde_mm_mask_mov_ps(a, ((k) | 14), simde_mm_fixupimm_ss(a, b, c, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_fixupimm_ss
|
||||
#define _mm_mask_fixupimm_ss(a, k, b, c, imm8) simde_mm_mask_fixupimm_ss(a, k, b, c, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define simde_mm_maskz_fixupimm_ss(k, a, b, c, imm8) _mm_maskz_fixupimm_ss(k, a, b, c, imm8)
|
||||
#else
|
||||
#define simde_mm_maskz_fixupimm_ss(k, a, b, c, imm8) simde_mm_maskz_mov_ps(((k) | 14), simde_mm_fixupimm_ss(a, b, c, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_maskz_fixupimm_ss
|
||||
#define _mm_maskz_fixupimm_ss(k, a, b, c, imm8) simde_mm_maskz_fixupimm_ss(k, a, b, c, imm8)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128d
|
||||
simde_mm_fixupimm_pd (simde__m128d a, simde__m128d b, simde__m128i c, int imm8)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 255) {
|
||||
HEDLEY_STATIC_CAST(void, imm8);
|
||||
simde__m128d_private
|
||||
r_,
|
||||
a_ = simde__m128d_to_private(a),
|
||||
b_ = simde__m128d_to_private(b),
|
||||
s_ = simde__m128d_to_private(simde_x_mm_flushsubnormal_pd(b));
|
||||
simde__m128i_private c_ = simde__m128i_to_private(c);
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.f64) / sizeof(r_.f64[0])) ; i++) {
|
||||
int32_t select = 1;
|
||||
switch (simde_math_fpclassify(s_.f64[i])) {
|
||||
case SIMDE_MATH_FP_NORMAL:
|
||||
select = (s_.f64[i] < SIMDE_FLOAT64_C(0.0)) ? 6 : (s_.f64[i] == SIMDE_FLOAT64_C(1.0)) ? 3 : 7;
|
||||
break;
|
||||
case SIMDE_MATH_FP_ZERO:
|
||||
select = 2;
|
||||
break;
|
||||
case SIMDE_MATH_FP_NAN:
|
||||
select = 0;
|
||||
break;
|
||||
case SIMDE_MATH_FP_INFINITE:
|
||||
select = ((s_.f64[i] > SIMDE_FLOAT64_C(0.0)) ? 5 : 4);
|
||||
break;
|
||||
}
|
||||
|
||||
switch (((c_.i64[i] >> (select << 2)) & 15)) {
|
||||
case 0:
|
||||
r_.f64[i] = a_.f64[i];
|
||||
break;
|
||||
case 1:
|
||||
r_.f64[i] = b_.f64[i];
|
||||
break;
|
||||
case 2:
|
||||
r_.f64[i] = SIMDE_MATH_NAN;
|
||||
break;
|
||||
case 3:
|
||||
r_.f64[i] = -SIMDE_MATH_NAN;
|
||||
break;
|
||||
case 4:
|
||||
r_.f64[i] = -SIMDE_MATH_INFINITY;
|
||||
break;
|
||||
case 5:
|
||||
r_.f64[i] = SIMDE_MATH_INFINITY;
|
||||
break;
|
||||
case 6:
|
||||
r_.f64[i] = s_.f64[i] < SIMDE_FLOAT64_C(0.0) ? -SIMDE_MATH_INFINITY : SIMDE_MATH_INFINITY;
|
||||
break;
|
||||
case 7:
|
||||
r_.f64[i] = SIMDE_FLOAT64_C(-0.0);
|
||||
break;
|
||||
case 8:
|
||||
r_.f64[i] = SIMDE_FLOAT64_C(0.0);
|
||||
break;
|
||||
case 9:
|
||||
r_.f64[i] = SIMDE_FLOAT64_C(-1.0);
|
||||
break;
|
||||
case 10:
|
||||
r_.f64[i] = SIMDE_FLOAT64_C(1.0);
|
||||
break;
|
||||
case 11:
|
||||
r_.f64[i] = SIMDE_FLOAT64_C(0.5);
|
||||
break;
|
||||
case 12:
|
||||
r_.f64[i] = SIMDE_FLOAT64_C(90.0);
|
||||
break;
|
||||
case 13:
|
||||
r_.f64[i] = SIMDE_MATH_PI / 2;
|
||||
break;
|
||||
case 14:
|
||||
r_.f64[i] = SIMDE_MATH_DBL_MAX;
|
||||
break;
|
||||
case 15:
|
||||
r_.f64[i] = -SIMDE_MATH_DBL_MAX;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return simde__m128d_from_private(r_);
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
#define simde_mm_fixupimm_pd(a, b, c, imm8) _mm_fixupimm_pd(a, b, c, imm8)
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_fixupimm_pd
|
||||
#define _mm_fixupimm_pd(a, b, c, imm8) simde_mm_fixupimm_pd(a, b, c, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
#define simde_mm_mask_fixupimm_pd(a, k, b, c, imm8) _mm_mask_fixupimm_pd(a, k, b, c, imm8)
|
||||
#else
|
||||
#define simde_mm_mask_fixupimm_pd(a, k, b, c, imm8) simde_mm_mask_mov_pd(a, k, simde_mm_fixupimm_pd(a, b, c, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_fixupimm_pd
|
||||
#define _mm_mask_fixupimm_pd(a, k, b, c, imm8) simde_mm_mask_fixupimm_pd(a, k, b, c, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
#define simde_mm_maskz_fixupimm_pd(k, a, b, c, imm8) _mm_maskz_fixupimm_pd(k, a, b, c, imm8)
|
||||
#else
|
||||
#define simde_mm_maskz_fixupimm_pd(k, a, b, c, imm8) simde_mm_maskz_mov_pd(k, simde_mm_fixupimm_pd(a, b, c, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_maskz_fixupimm_pd
|
||||
#define _mm_maskz_fixupimm_pd(k, a, b, c, imm8) simde_mm_maskz_fixupimm_pd(k, a, b, c, imm8)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256d
|
||||
simde_mm256_fixupimm_pd (simde__m256d a, simde__m256d b, simde__m256i c, int imm8)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 255) {
|
||||
HEDLEY_STATIC_CAST(void, imm8);
|
||||
simde__m256d_private
|
||||
r_,
|
||||
a_ = simde__m256d_to_private(a),
|
||||
b_ = simde__m256d_to_private(b),
|
||||
s_ = simde__m256d_to_private(simde_x_mm256_flushsubnormal_pd(b));
|
||||
simde__m256i_private c_ = simde__m256i_to_private(c);
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.f64) / sizeof(r_.f64[0])) ; i++) {
|
||||
int32_t select = 1;
|
||||
switch (simde_math_fpclassify(s_.f64[i])) {
|
||||
case SIMDE_MATH_FP_NORMAL:
|
||||
select = (s_.f64[i] < SIMDE_FLOAT64_C(0.0)) ? 6 : (s_.f64[i] == SIMDE_FLOAT64_C(1.0)) ? 3 : 7;
|
||||
break;
|
||||
case SIMDE_MATH_FP_ZERO:
|
||||
select = 2;
|
||||
break;
|
||||
case SIMDE_MATH_FP_NAN:
|
||||
select = 0;
|
||||
break;
|
||||
case SIMDE_MATH_FP_INFINITE:
|
||||
select = ((s_.f64[i] > SIMDE_FLOAT64_C(0.0)) ? 5 : 4);
|
||||
break;
|
||||
}
|
||||
|
||||
switch (((c_.i64[i] >> (select << 2)) & 15)) {
|
||||
case 0:
|
||||
r_.f64[i] = a_.f64[i];
|
||||
break;
|
||||
case 1:
|
||||
r_.f64[i] = b_.f64[i];
|
||||
break;
|
||||
case 2:
|
||||
r_.f64[i] = SIMDE_MATH_NAN;
|
||||
break;
|
||||
case 3:
|
||||
r_.f64[i] = -SIMDE_MATH_NAN;
|
||||
break;
|
||||
case 4:
|
||||
r_.f64[i] = -SIMDE_MATH_INFINITY;
|
||||
break;
|
||||
case 5:
|
||||
r_.f64[i] = SIMDE_MATH_INFINITY;
|
||||
break;
|
||||
case 6:
|
||||
r_.f64[i] = s_.f64[i] < SIMDE_FLOAT64_C(0.0) ? -SIMDE_MATH_INFINITY : SIMDE_MATH_INFINITY;
|
||||
break;
|
||||
case 7:
|
||||
r_.f64[i] = SIMDE_FLOAT64_C(-0.0);
|
||||
break;
|
||||
case 8:
|
||||
r_.f64[i] = SIMDE_FLOAT64_C(0.0);
|
||||
break;
|
||||
case 9:
|
||||
r_.f64[i] = SIMDE_FLOAT64_C(-1.0);
|
||||
break;
|
||||
case 10:
|
||||
r_.f64[i] = SIMDE_FLOAT64_C(1.0);
|
||||
break;
|
||||
case 11:
|
||||
r_.f64[i] = SIMDE_FLOAT64_C(0.5);
|
||||
break;
|
||||
case 12:
|
||||
r_.f64[i] = SIMDE_FLOAT64_C(90.0);
|
||||
break;
|
||||
case 13:
|
||||
r_.f64[i] = SIMDE_MATH_PI / 2;
|
||||
break;
|
||||
case 14:
|
||||
r_.f64[i] = SIMDE_MATH_DBL_MAX;
|
||||
break;
|
||||
case 15:
|
||||
r_.f64[i] = -SIMDE_MATH_DBL_MAX;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return simde__m256d_from_private(r_);
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
#define simde_mm256_fixupimm_pd(a, b, c, imm8) _mm256_fixupimm_pd(a, b, c, imm8)
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_fixupimm_pd
|
||||
#define _mm256_fixupimm_pd(a, b, c, imm8) simde_mm256_fixupimm_pd(a, b, c, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
#define simde_mm256_mask_fixupimm_pd(a, k, b, c, imm8) _mm256_mask_fixupimm_pd(a, k, b, c, imm8)
|
||||
#else
|
||||
#define simde_mm256_mask_fixupimm_pd(a, k, b, c, imm8) simde_mm256_mask_mov_pd(a, k, simde_mm256_fixupimm_pd(a, b, c, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_mask_fixupimm_pd
|
||||
#define _mm256_mask_fixupimm_pd(a, k, b, c, imm8) simde_mm256_mask_fixupimm_pd(a, k, b, c, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
#define simde_mm256_maskz_fixupimm_pd(k, a, b, c, imm8) _mm256_maskz_fixupimm_pd(k, a, b, c, imm8)
|
||||
#else
|
||||
#define simde_mm256_maskz_fixupimm_pd(k, a, b, c, imm8) simde_mm256_maskz_mov_pd(k, simde_mm256_fixupimm_pd(a, b, c, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_maskz_fixupimm_pd
|
||||
#define _mm256_maskz_fixupimm_pd(k, a, b, c, imm8) simde_mm256_maskz_fixupimm_pd(k, a, b, c, imm8)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_fixupimm_pd (simde__m512d a, simde__m512d b, simde__m512i c, int imm8)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 255) {
|
||||
HEDLEY_STATIC_CAST(void, imm8);
|
||||
simde__m512d_private
|
||||
r_,
|
||||
a_ = simde__m512d_to_private(a),
|
||||
b_ = simde__m512d_to_private(b),
|
||||
s_ = simde__m512d_to_private(simde_x_mm512_flushsubnormal_pd(b));
|
||||
simde__m512i_private c_ = simde__m512i_to_private(c);
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.f64) / sizeof(r_.f64[0])) ; i++) {
|
||||
int32_t select = 1;
|
||||
switch (simde_math_fpclassify(s_.f64[i])) {
|
||||
case SIMDE_MATH_FP_NORMAL:
|
||||
select = (s_.f64[i] < SIMDE_FLOAT64_C(0.0)) ? 6 : (s_.f64[i] == SIMDE_FLOAT64_C(1.0)) ? 3 : 7;
|
||||
break;
|
||||
case SIMDE_MATH_FP_ZERO:
|
||||
select = 2;
|
||||
break;
|
||||
case SIMDE_MATH_FP_NAN:
|
||||
select = 0;
|
||||
break;
|
||||
case SIMDE_MATH_FP_INFINITE:
|
||||
select = ((s_.f64[i] > SIMDE_FLOAT64_C(0.0)) ? 5 : 4);
|
||||
break;
|
||||
}
|
||||
|
||||
switch (((c_.i64[i] >> (select << 2)) & 15)) {
|
||||
case 0:
|
||||
r_.f64[i] = a_.f64[i];
|
||||
break;
|
||||
case 1:
|
||||
r_.f64[i] = b_.f64[i];
|
||||
break;
|
||||
case 2:
|
||||
r_.f64[i] = SIMDE_MATH_NAN;
|
||||
break;
|
||||
case 3:
|
||||
r_.f64[i] = -SIMDE_MATH_NAN;
|
||||
break;
|
||||
case 4:
|
||||
r_.f64[i] = -SIMDE_MATH_INFINITY;
|
||||
break;
|
||||
case 5:
|
||||
r_.f64[i] = SIMDE_MATH_INFINITY;
|
||||
break;
|
||||
case 6:
|
||||
r_.f64[i] = s_.f64[i] < SIMDE_FLOAT64_C(0.0) ? -SIMDE_MATH_INFINITY : SIMDE_MATH_INFINITY;
|
||||
break;
|
||||
case 7:
|
||||
r_.f64[i] = SIMDE_FLOAT64_C(-0.0);
|
||||
break;
|
||||
case 8:
|
||||
r_.f64[i] = SIMDE_FLOAT64_C(0.0);
|
||||
break;
|
||||
case 9:
|
||||
r_.f64[i] = SIMDE_FLOAT64_C(-1.0);
|
||||
break;
|
||||
case 10:
|
||||
r_.f64[i] = SIMDE_FLOAT64_C(1.0);
|
||||
break;
|
||||
case 11:
|
||||
r_.f64[i] = SIMDE_FLOAT64_C(0.5);
|
||||
break;
|
||||
case 12:
|
||||
r_.f64[i] = SIMDE_FLOAT64_C(90.0);
|
||||
break;
|
||||
case 13:
|
||||
r_.f64[i] = SIMDE_MATH_PI / 2;
|
||||
break;
|
||||
case 14:
|
||||
r_.f64[i] = SIMDE_MATH_DBL_MAX;
|
||||
break;
|
||||
case 15:
|
||||
r_.f64[i] = -SIMDE_MATH_DBL_MAX;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return simde__m512d_from_private(r_);
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define simde_mm512_fixupimm_pd(a, b, c, imm8) _mm512_fixupimm_pd(a, b, c, imm8)
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_fixupimm_pd
|
||||
#define _mm512_fixupimm_pd(a, b, c, imm8) simde_mm512_fixupimm_pd(a, b, c, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define simde_mm512_mask_fixupimm_pd(a, k, b, c, imm8) _mm512_mask_fixupimm_pd(a, k, b, c, imm8)
|
||||
#else
|
||||
#define simde_mm512_mask_fixupimm_pd(a, k, b, c, imm8) simde_mm512_mask_mov_pd(a, k, simde_mm512_fixupimm_pd(a, b, c, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_fixupimm_pd
|
||||
#define _mm512_mask_fixupimm_pd(a, k, b, c, imm8) simde_mm512_mask_fixupimm_pd(a, k, b, c, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define simde_mm512_maskz_fixupimm_pd(k, a, b, c, imm8) _mm512_maskz_fixupimm_pd(k, a, b, c, imm8)
|
||||
#else
|
||||
#define simde_mm512_maskz_fixupimm_pd(k, a, b, c, imm8) simde_mm512_maskz_mov_pd(k, simde_mm512_fixupimm_pd(a, b, c, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_fixupimm_pd
|
||||
#define _mm512_maskz_fixupimm_pd(k, a, b, c, imm8) simde_mm512_maskz_fixupimm_pd(k, a, b, c, imm8)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128d
|
||||
simde_mm_fixupimm_sd (simde__m128d a, simde__m128d b, simde__m128i c, int imm8)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 255) {
|
||||
HEDLEY_STATIC_CAST(void, imm8);
|
||||
simde__m128d_private
|
||||
a_ = simde__m128d_to_private(a),
|
||||
b_ = simde__m128d_to_private(b),
|
||||
s_ = simde__m128d_to_private(simde_x_mm_flushsubnormal_pd(b));
|
||||
simde__m128i_private c_ = simde__m128i_to_private(c);
|
||||
|
||||
int32_t select = 1;
|
||||
switch (simde_math_fpclassify(s_.f64[0])) {
|
||||
case SIMDE_MATH_FP_NORMAL:
|
||||
select = (s_.f64[0] < SIMDE_FLOAT64_C(0.0)) ? 6 : (s_.f64[0] == SIMDE_FLOAT64_C(1.0)) ? 3 : 7;
|
||||
break;
|
||||
case SIMDE_MATH_FP_ZERO:
|
||||
select = 2;
|
||||
break;
|
||||
case SIMDE_MATH_FP_NAN:
|
||||
select = 0;
|
||||
break;
|
||||
case SIMDE_MATH_FP_INFINITE:
|
||||
select = ((s_.f64[0] > SIMDE_FLOAT64_C(0.0)) ? 5 : 4);
|
||||
break;
|
||||
}
|
||||
|
||||
switch (((c_.i64[0] >> (select << 2)) & 15)) {
|
||||
case 0:
|
||||
b_.f64[0] = a_.f64[0];
|
||||
break;
|
||||
case 1:
|
||||
b_.f64[0] = b_.f64[0];
|
||||
break;
|
||||
case 2:
|
||||
b_.f64[0] = SIMDE_MATH_NAN;
|
||||
break;
|
||||
case 3:
|
||||
b_.f64[0] = -SIMDE_MATH_NAN;
|
||||
break;
|
||||
case 4:
|
||||
b_.f64[0] = -SIMDE_MATH_INFINITY;
|
||||
break;
|
||||
case 5:
|
||||
b_.f64[0] = SIMDE_MATH_INFINITY;
|
||||
break;
|
||||
case 6:
|
||||
b_.f64[0] = s_.f64[0] < SIMDE_FLOAT64_C(0.0) ? -SIMDE_MATH_INFINITY : SIMDE_MATH_INFINITY;
|
||||
break;
|
||||
case 7:
|
||||
b_.f64[0] = SIMDE_FLOAT64_C(-0.0);
|
||||
break;
|
||||
case 8:
|
||||
b_.f64[0] = SIMDE_FLOAT64_C(0.0);
|
||||
break;
|
||||
case 9:
|
||||
b_.f64[0] = SIMDE_FLOAT64_C(-1.0);
|
||||
break;
|
||||
case 10:
|
||||
b_.f64[0] = SIMDE_FLOAT64_C(1.0);
|
||||
break;
|
||||
case 11:
|
||||
b_.f64[0] = SIMDE_FLOAT64_C(0.5);
|
||||
break;
|
||||
case 12:
|
||||
b_.f64[0] = SIMDE_FLOAT64_C(90.0);
|
||||
break;
|
||||
case 13:
|
||||
b_.f64[0] = SIMDE_MATH_PI / 2;
|
||||
break;
|
||||
case 14:
|
||||
b_.f64[0] = SIMDE_MATH_DBL_MAX;
|
||||
break;
|
||||
case 15:
|
||||
b_.f64[0] = -SIMDE_MATH_DBL_MAX;
|
||||
break;
|
||||
}
|
||||
|
||||
return simde__m128d_from_private(b_);
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define simde_mm_fixupimm_sd(a, b, c, imm8) _mm_fixupimm_sd(a, b, c, imm8)
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_fixupimm_sd
|
||||
#define _mm_fixupimm_sd(a, b, c, imm8) simde_mm_fixupimm_sd(a, b, c, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define simde_mm_mask_fixupimm_sd(a, k, b, c, imm8) _mm_mask_fixupimm_sd(a, k, b, c, imm8)
|
||||
#else
|
||||
#define simde_mm_mask_fixupimm_sd(a, k, b, c, imm8) simde_mm_mask_mov_pd(a, ((k) | 2), simde_mm_fixupimm_sd(a, b, c, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_fixupimm_sd
|
||||
#define _mm_mask_fixupimm_sd(a, k, b, c, imm8) simde_mm_mask_fixupimm_sd(a, k, b, c, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define simde_mm_maskz_fixupimm_sd(k, a, b, c, imm8) _mm_maskz_fixupimm_sd(k, a, b, c, imm8)
|
||||
#else
|
||||
#define simde_mm_maskz_fixupimm_sd(k, a, b, c, imm8) simde_mm_maskz_mov_pd(((k) | 2), simde_mm_fixupimm_sd(a, b, c, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_maskz_fixupimm_sd
|
||||
#define _mm_maskz_fixupimm_sd(k, a, b, c, imm8) simde_mm_maskz_fixupimm_sd(k, a, b, c, imm8)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_FIXUPIMM_H) */
|
||||
@@ -0,0 +1,687 @@
|
||||
#if !defined(SIMDE_X86_AVX512_FIXUPIMM_ROUND_H)
|
||||
#define SIMDE_X86_AVX512_FIXUPIMM_ROUND_H
|
||||
|
||||
#include "types.h"
|
||||
#include "fixupimm.h"
|
||||
#include "mov.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define simde_mm512_fixupimm_round_ps(a, b, c, imm8, sae) _mm512_fixupimm_round_ps(a, b, c, imm8, sae)
|
||||
#elif defined(SIMDE_FAST_EXCEPTIONS)
|
||||
#define simde_mm512_fixupimm_round_ps(a, b, c, imm8, sae) simde_mm512_fixupimm_ps(a, b, c, imm8)
|
||||
#elif defined(SIMDE_STATEMENT_EXPR_)
|
||||
#if defined(SIMDE_HAVE_FENV_H)
|
||||
#define simde_mm512_fixupimm_round_ps(a, b, c, imm8, sae) SIMDE_STATEMENT_EXPR_(({ \
|
||||
simde__m512 simde_mm512_fixupimm_round_ps_r; \
|
||||
\
|
||||
if (sae & SIMDE_MM_FROUND_NO_EXC) { \
|
||||
fenv_t simde_mm512_fixupimm_round_ps_envp; \
|
||||
int simde_mm512_fixupimm_round_ps_x = feholdexcept(&simde_mm512_fixupimm_round_ps_envp); \
|
||||
simde_mm512_fixupimm_round_ps_r = simde_mm512_fixupimm_ps(a, b, c, imm8); \
|
||||
if (HEDLEY_LIKELY(simde_mm512_fixupimm_round_ps_x == 0)) \
|
||||
fesetenv(&simde_mm512_fixupimm_round_ps_envp); \
|
||||
} \
|
||||
else { \
|
||||
simde_mm512_fixupimm_round_ps_r = simde_mm512_fixupimm_ps(a, b, c, imm8); \
|
||||
} \
|
||||
\
|
||||
simde_mm512_fixupimm_round_ps_r; \
|
||||
}))
|
||||
#else
|
||||
#define simde_mm512_fixupimm_round_ps(a, b, c, imm8, sae) simde_mm512_fixupimm_ps(a, b, c, imm8)
|
||||
#endif
|
||||
#else
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_fixupimm_round_ps (simde__m512 a, simde__m512 b, simde__m512i c, int imm8, int sae)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 255)
|
||||
SIMDE_REQUIRE_CONSTANT(sae) {
|
||||
simde__m512 r;
|
||||
|
||||
if (sae & SIMDE_MM_FROUND_NO_EXC) {
|
||||
#if defined(SIMDE_HAVE_FENV_H)
|
||||
fenv_t envp;
|
||||
int x = feholdexcept(&envp);
|
||||
r = simde_mm512_fixupimm_ps(a, b, c, imm8);
|
||||
if (HEDLEY_LIKELY(x == 0))
|
||||
fesetenv(&envp);
|
||||
#else
|
||||
r = simde_mm512_fixupimm_ps(a, b, c, imm8);
|
||||
#endif
|
||||
}
|
||||
else {
|
||||
r = simde_mm512_fixupimm_ps(a, b, c, imm8);
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_fixupimm_round_ps
|
||||
#define _mm512_fixupimm_round_ps(a, b, c, imm8, sae) simde_mm512_fixupimm_round_ps(a, b, c, imm8, sae)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define simde_mm512_mask_fixupimm_round_ps(a, k, b, c, imm8, sae) _mm512_mask_fixupimm_round_ps(a, k, b, c, imm8, sae)
|
||||
#elif defined(SIMDE_FAST_EXCEPTIONS)
|
||||
#define simde_mm512_mask_fixupimm_round_ps(a, k, b, c, imm8, sae) simde_mm512_mask_fixupimm_ps(a, k, b, c, imm8)
|
||||
#elif defined(SIMDE_STATEMENT_EXPR_)
|
||||
#if defined(SIMDE_HAVE_FENV_H)
|
||||
#define simde_mm512_mask_fixupimm_round_ps(a, k, b, c, imm8, sae) SIMDE_STATEMENT_EXPR_(({ \
|
||||
simde__m512 simde_mm512_mask_fixupimm_round_ps_r; \
|
||||
\
|
||||
if (sae & SIMDE_MM_FROUND_NO_EXC) { \
|
||||
fenv_t simde_mm512_mask_fixupimm_round_ps_envp; \
|
||||
int simde_mm512_mask_fixupimm_round_ps_x = feholdexcept(&simde_mm512_mask_fixupimm_round_ps_envp); \
|
||||
simde_mm512_mask_fixupimm_round_ps_r = simde_mm512_mask_fixupimm_ps(a, k, b, c, imm8); \
|
||||
if (HEDLEY_LIKELY(simde_mm512_mask_fixupimm_round_ps_x == 0)) \
|
||||
fesetenv(&simde_mm512_mask_fixupimm_round_ps_envp); \
|
||||
} \
|
||||
else { \
|
||||
simde_mm512_mask_fixupimm_round_ps_r = simde_mm512_mask_fixupimm_ps(a, k, b, c, imm8); \
|
||||
} \
|
||||
\
|
||||
simde_mm512_mask_fixupimm_round_ps_r; \
|
||||
}))
|
||||
#else
|
||||
#define simde_mm512_mask_fixupimm_round_ps(a, k, b, c, imm8, sae) simde_mm512_mask_fixupimm_ps(a, k, b, c, imm8)
|
||||
#endif
|
||||
#else
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_mask_fixupimm_round_ps (simde__m512 a, simde__mmask16 k, simde__m512 b, simde__m512i c, int imm8, int sae)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 255)
|
||||
SIMDE_REQUIRE_CONSTANT(sae) {
|
||||
simde__m512 r;
|
||||
|
||||
if (sae & SIMDE_MM_FROUND_NO_EXC) {
|
||||
#if defined(SIMDE_HAVE_FENV_H)
|
||||
fenv_t envp;
|
||||
int x = feholdexcept(&envp);
|
||||
r = simde_mm512_mask_fixupimm_ps(a, k, b, c, imm8);
|
||||
if (HEDLEY_LIKELY(x == 0))
|
||||
fesetenv(&envp);
|
||||
#else
|
||||
r = simde_mm512_mask_fixupimm_ps(a, k, b, c, imm8);
|
||||
#endif
|
||||
}
|
||||
else {
|
||||
r = simde_mm512_mask_fixupimm_ps(a, k, b, c, imm8);
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_fixupimm_round_ps
|
||||
#define _mm512_mask_fixupimm_round_ps(a, k, b, c, imm8, sae) simde_mm512_mask_fixupimm_round_ps(a, k, b, c, imm8, sae)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define simde_mm512_maskz_fixupimm_round_ps(k, a, b, c, imm8, sae) _mm512_maskz_fixupimm_round_ps(k, a, b, c, imm8, sae)
|
||||
#elif defined(SIMDE_FAST_EXCEPTIONS)
|
||||
#define simde_mm512_maskz_fixupimm_round_ps(k, a, b, c, imm8, sae) simde_mm512_maskz_fixupimm_ps(k, a, b, c, imm8)
|
||||
#elif defined(SIMDE_STATEMENT_EXPR_)
|
||||
#if defined(SIMDE_HAVE_FENV_H)
|
||||
#define simde_mm512_maskz_fixupimm_round_ps(k, a, b, c, imm8, sae) SIMDE_STATEMENT_EXPR_(({ \
|
||||
simde__m512 simde_mm512_maskz_fixupimm_round_ps_r; \
|
||||
\
|
||||
if (sae & SIMDE_MM_FROUND_NO_EXC) { \
|
||||
fenv_t simde_mm512_maskz_fixupimm_round_ps_envp; \
|
||||
int simde_mm512_maskz_fixupimm_round_ps_x = feholdexcept(&simde_mm512_maskz_fixupimm_round_ps_envp); \
|
||||
simde_mm512_maskz_fixupimm_round_ps_r = simde_mm512_maskz_fixupimm_ps(k, a, b, c, imm8); \
|
||||
if (HEDLEY_LIKELY(simde_mm512_maskz_fixupimm_round_ps_x == 0)) \
|
||||
fesetenv(&simde_mm512_maskz_fixupimm_round_ps_envp); \
|
||||
} \
|
||||
else { \
|
||||
simde_mm512_maskz_fixupimm_round_ps_r = simde_mm512_maskz_fixupimm_ps(k, a, b, c, imm8); \
|
||||
} \
|
||||
\
|
||||
simde_mm512_maskz_fixupimm_round_ps_r; \
|
||||
}))
|
||||
#else
|
||||
#define simde_mm512_maskz_fixupimm_round_ps(k, a, b, c, imm8, sae) simde_mm512_maskz_fixupimm_ps(k, a, b, c, imm8)
|
||||
#endif
|
||||
#else
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_maskz_fixupimm_round_ps (simde__mmask16 k, simde__m512 a, simde__m512 b, simde__m512i c, int imm8, int sae)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 255)
|
||||
SIMDE_REQUIRE_CONSTANT(sae) {
|
||||
simde__m512 r;
|
||||
|
||||
if (sae & SIMDE_MM_FROUND_NO_EXC) {
|
||||
#if defined(SIMDE_HAVE_FENV_H)
|
||||
fenv_t envp;
|
||||
int x = feholdexcept(&envp);
|
||||
r = simde_mm512_maskz_fixupimm_ps(k, a, b, c, imm8);
|
||||
if (HEDLEY_LIKELY(x == 0))
|
||||
fesetenv(&envp);
|
||||
#else
|
||||
r = simde_mm512_maskz_fixupimm_ps(k, a, b, c, imm8);
|
||||
#endif
|
||||
}
|
||||
else {
|
||||
r = simde_mm512_maskz_fixupimm_ps(k, a, b, c, imm8);
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_fixupimm_round_ps
|
||||
#define _mm512_maskz_fixupimm_round_ps(k, a, b, c, imm8, sae) simde_mm512_maskz_fixupimm_round_ps(k, a, b, c, imm8, sae)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define simde_mm512_fixupimm_round_pd(a, b, c, imm8, sae) _mm512_fixupimm_round_pd(a, b, c, imm8, sae)
|
||||
#elif defined(SIMDE_FAST_EXCEPTIONS)
|
||||
#define simde_mm512_fixupimm_round_pd(a, b, c, imm8, sae) simde_mm512_fixupimm_pd(a, b, c, imm8)
|
||||
#elif defined(SIMDE_STATEMENT_EXPR_)
|
||||
#if defined(SIMDE_HAVE_FENV_H)
|
||||
#define simde_mm512_fixupimm_round_pd(a, b, c, imm8, sae) SIMDE_STATEMENT_EXPR_(({ \
|
||||
simde__m512d simde_mm512_fixupimm_round_pd_r; \
|
||||
\
|
||||
if (sae & SIMDE_MM_FROUND_NO_EXC) { \
|
||||
fenv_t simde_mm512_fixupimm_round_pd_envp; \
|
||||
int simde_mm512_fixupimm_round_pd_x = feholdexcept(&simde_mm512_fixupimm_round_pd_envp); \
|
||||
simde_mm512_fixupimm_round_pd_r = simde_mm512_fixupimm_pd(a, b, c, imm8); \
|
||||
if (HEDLEY_LIKELY(simde_mm512_fixupimm_round_pd_x == 0)) \
|
||||
fesetenv(&simde_mm512_fixupimm_round_pd_envp); \
|
||||
} \
|
||||
else { \
|
||||
simde_mm512_fixupimm_round_pd_r = simde_mm512_fixupimm_pd(a, b, c, imm8); \
|
||||
} \
|
||||
\
|
||||
simde_mm512_fixupimm_round_pd_r; \
|
||||
}))
|
||||
#else
|
||||
#define simde_mm512_fixupimm_round_pd(a, b, c, imm8, sae) simde_mm512_fixupimm_pd(a, b, c, imm8)
|
||||
#endif
|
||||
#else
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_fixupimm_round_pd (simde__m512d a, simde__m512d b, simde__m512i c, int imm8, int sae)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 255)
|
||||
SIMDE_REQUIRE_CONSTANT(sae) {
|
||||
simde__m512d r;
|
||||
|
||||
if (sae & SIMDE_MM_FROUND_NO_EXC) {
|
||||
#if defined(SIMDE_HAVE_FENV_H)
|
||||
fenv_t envp;
|
||||
int x = feholdexcept(&envp);
|
||||
r = simde_mm512_fixupimm_pd(a, b, c, imm8);
|
||||
if (HEDLEY_LIKELY(x == 0))
|
||||
fesetenv(&envp);
|
||||
#else
|
||||
r = simde_mm512_fixupimm_pd(a, b, c, imm8);
|
||||
#endif
|
||||
}
|
||||
else {
|
||||
r = simde_mm512_fixupimm_pd(a, b, c, imm8);
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_fixupimm_round_pd
|
||||
#define _mm512_fixupimm_round_pd(a, b, c, imm8, sae) simde_mm512_fixupimm_round_pd(a, b, c, imm8, sae)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define simde_mm512_mask_fixupimm_round_pd(a, k, b, c, imm8, sae) _mm512_mask_fixupimm_round_pd(a, k, b, c, imm8, sae)
|
||||
#elif defined(SIMDE_FAST_EXCEPTIONS)
|
||||
#define simde_mm512_mask_fixupimm_round_pd(a, k, b, c, imm8, sae) simde_mm512_mask_fixupimm_pd(a, k, b, c, imm8)
|
||||
#elif defined(SIMDE_STATEMENT_EXPR_)
|
||||
#if defined(SIMDE_HAVE_FENV_H)
|
||||
#define simde_mm512_mask_fixupimm_round_pd(a, k, b, c, imm8, sae) SIMDE_STATEMENT_EXPR_(({ \
|
||||
simde__m512d simde_mm512_mask_fixupimm_round_pd_r; \
|
||||
\
|
||||
if (sae & SIMDE_MM_FROUND_NO_EXC) { \
|
||||
fenv_t simde_mm512_mask_fixupimm_round_pd_envp; \
|
||||
int simde_mm512_mask_fixupimm_round_pd_x = feholdexcept(&simde_mm512_mask_fixupimm_round_pd_envp); \
|
||||
simde_mm512_mask_fixupimm_round_pd_r = simde_mm512_mask_fixupimm_pd(a, k, b, c, imm8); \
|
||||
if (HEDLEY_LIKELY(simde_mm512_mask_fixupimm_round_pd_x == 0)) \
|
||||
fesetenv(&simde_mm512_mask_fixupimm_round_pd_envp); \
|
||||
} \
|
||||
else { \
|
||||
simde_mm512_mask_fixupimm_round_pd_r = simde_mm512_mask_fixupimm_pd(a, k, b, c, imm8); \
|
||||
} \
|
||||
\
|
||||
simde_mm512_mask_fixupimm_round_pd_r; \
|
||||
}))
|
||||
#else
|
||||
#define simde_mm512_mask_fixupimm_round_pd(a, k, b, c, imm8, sae) simde_mm512_mask_fixupimm_pd(a, k, b, c, imm8)
|
||||
#endif
|
||||
#else
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_mask_fixupimm_round_pd (simde__m512d a, simde__mmask8 k, simde__m512d b, simde__m512i c, int imm8, int sae)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 255)
|
||||
SIMDE_REQUIRE_CONSTANT(sae) {
|
||||
simde__m512d r;
|
||||
|
||||
if (sae & SIMDE_MM_FROUND_NO_EXC) {
|
||||
#if defined(SIMDE_HAVE_FENV_H)
|
||||
fenv_t envp;
|
||||
int x = feholdexcept(&envp);
|
||||
r = simde_mm512_mask_fixupimm_pd(a, k, b, c, imm8);
|
||||
if (HEDLEY_LIKELY(x == 0))
|
||||
fesetenv(&envp);
|
||||
#else
|
||||
r = simde_mm512_mask_fixupimm_pd(a, k, b, c, imm8);
|
||||
#endif
|
||||
}
|
||||
else {
|
||||
r = simde_mm512_mask_fixupimm_pd(a, k, b, c, imm8);
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_fixupimm_round_pd
|
||||
#define _mm512_mask_fixupimm_round_pd(a, k, b, c, imm8, sae) simde_mm512_mask_fixupimm_round_pd(a, k, b, c, imm8, sae)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define simde_mm512_maskz_fixupimm_round_pd(k, a, b, c, imm8, sae) _mm512_maskz_fixupimm_round_pd(k, a, b, c, imm8, sae)
|
||||
#elif defined(SIMDE_FAST_EXCEPTIONS)
|
||||
#define simde_mm512_maskz_fixupimm_round_pd(k, a, b, c, imm8, sae) simde_mm512_maskz_fixupimm_pd(k, a, b, c, imm8)
|
||||
#elif defined(SIMDE_STATEMENT_EXPR_)
|
||||
#if defined(SIMDE_HAVE_FENV_H)
|
||||
#define simde_mm512_maskz_fixupimm_round_pd(k, a, b, c, imm8, sae) SIMDE_STATEMENT_EXPR_(({ \
|
||||
simde__m512d simde_mm512_maskz_fixupimm_round_pd_r; \
|
||||
\
|
||||
if (sae & SIMDE_MM_FROUND_NO_EXC) { \
|
||||
fenv_t simde_mm512_maskz_fixupimm_round_pd_envp; \
|
||||
int simde_mm512_maskz_fixupimm_round_pd_x = feholdexcept(&simde_mm512_maskz_fixupimm_round_pd_envp); \
|
||||
simde_mm512_maskz_fixupimm_round_pd_r = simde_mm512_maskz_fixupimm_pd(k, a, b, c, imm8); \
|
||||
if (HEDLEY_LIKELY(simde_mm512_maskz_fixupimm_round_pd_x == 0)) \
|
||||
fesetenv(&simde_mm512_maskz_fixupimm_round_pd_envp); \
|
||||
} \
|
||||
else { \
|
||||
simde_mm512_maskz_fixupimm_round_pd_r = simde_mm512_maskz_fixupimm_pd(k, a, b, c, imm8); \
|
||||
} \
|
||||
\
|
||||
simde_mm512_maskz_fixupimm_round_pd_r; \
|
||||
}))
|
||||
#else
|
||||
#define simde_mm512_maskz_fixupimm_round_pd(k, a, b, c, imm8, sae) simde_mm512_maskz_fixupimm_pd(k, a, b, c, imm8)
|
||||
#endif
|
||||
#else
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_maskz_fixupimm_round_pd (simde__mmask8 k, simde__m512d a, simde__m512d b, simde__m512i c, int imm8, int sae)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 255)
|
||||
SIMDE_REQUIRE_CONSTANT(sae) {
|
||||
simde__m512d r;
|
||||
|
||||
if (sae & SIMDE_MM_FROUND_NO_EXC) {
|
||||
#if defined(SIMDE_HAVE_FENV_H)
|
||||
fenv_t envp;
|
||||
int x = feholdexcept(&envp);
|
||||
r = simde_mm512_maskz_fixupimm_pd(k, a, b, c, imm8);
|
||||
if (HEDLEY_LIKELY(x == 0))
|
||||
fesetenv(&envp);
|
||||
#else
|
||||
r = simde_mm512_maskz_fixupimm_pd(k, a, b, c, imm8);
|
||||
#endif
|
||||
}
|
||||
else {
|
||||
r = simde_mm512_maskz_fixupimm_pd(k, a, b, c, imm8);
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_fixupimm_round_pd
|
||||
#define _mm512_maskz_fixupimm_round_pd(k, a, b, c, imm8, sae) simde_mm512_maskz_fixupimm_round_pd(k, a, b, c, imm8, sae)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define simde_mm_fixupimm_round_ss(a, b, c, imm8, sae) _mm_fixupimm_round_ss(a, b, c, imm8, sae)
|
||||
#elif defined(SIMDE_FAST_EXCEPTIONS)
|
||||
#define simde_mm_fixupimm_round_ss(a, b, c, imm8, sae) simde_mm_fixupimm_ss(a, b, c, imm8)
|
||||
#elif defined(SIMDE_STATEMENT_EXPR_)
|
||||
#if defined(SIMDE_HAVE_FENV_H)
|
||||
#define simde_mm_fixupimm_round_ss(a, b, c, imm8, sae) SIMDE_STATEMENT_EXPR_(({ \
|
||||
simde__m128 simde_mm_fixupimm_round_ss_r; \
|
||||
\
|
||||
if (sae & SIMDE_MM_FROUND_NO_EXC) { \
|
||||
fenv_t simde_mm_fixupimm_round_ss_envp; \
|
||||
int simde_mm_fixupimm_round_ss_x = feholdexcept(&simde_mm_fixupimm_round_ss_envp); \
|
||||
simde_mm_fixupimm_round_ss_r = simde_mm_fixupimm_ss(a, b, c, imm8); \
|
||||
if (HEDLEY_LIKELY(simde_mm_fixupimm_round_ss_x == 0)) \
|
||||
fesetenv(&simde_mm_fixupimm_round_ss_envp); \
|
||||
} \
|
||||
else { \
|
||||
simde_mm_fixupimm_round_ss_r = simde_mm_fixupimm_ss(a, b, c, imm8); \
|
||||
} \
|
||||
\
|
||||
simde_mm_fixupimm_round_ss_r; \
|
||||
}))
|
||||
#else
|
||||
#define simde_mm_fixupimm_round_ss(a, b, c, imm8, sae) simde_mm_fixupimm_ss(a, b, c, imm8)
|
||||
#endif
|
||||
#else
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128
|
||||
simde_mm_fixupimm_round_ss (simde__m128 a, simde__m128 b, simde__m128i c, int imm8, int sae)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 15)
|
||||
SIMDE_REQUIRE_CONSTANT(sae) {
|
||||
simde__m128 r;
|
||||
|
||||
if (sae & SIMDE_MM_FROUND_NO_EXC) {
|
||||
#if defined(SIMDE_HAVE_FENV_H)
|
||||
fenv_t envp;
|
||||
int x = feholdexcept(&envp);
|
||||
r = simde_mm_fixupimm_ss(a, b, c, imm8);
|
||||
if (HEDLEY_LIKELY(x == 0))
|
||||
fesetenv(&envp);
|
||||
#else
|
||||
r = simde_mm_fixupimm_ss(a, b, c, imm8);
|
||||
#endif
|
||||
}
|
||||
else {
|
||||
r = simde_mm_fixupimm_ss(a, b, c, imm8);
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_fixupimm_round_ss
|
||||
#define _mm_fixupimm_round_ss(a, b, c, imm8, sae) simde_mm_fixupimm_round_ss(a, b, c, imm8, sae)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define simde_mm_mask_fixupimm_round_ss(a, k, b, c, imm8, sae) _mm_mask_fixupimm_round_ss(a, k, b, c, imm8, sae)
|
||||
#elif defined(SIMDE_FAST_EXCEPTIONS)
|
||||
#define simde_mm_mask_fixupimm_round_ss(a, k, b, c, imm8, sae) simde_mm_mask_fixupimm_ss(a, k, b, c, imm8)
|
||||
#elif defined(SIMDE_STATEMENT_EXPR_)
|
||||
#if defined(SIMDE_HAVE_FENV_H)
|
||||
#define simde_mm_mask_fixupimm_round_ss(a, k, b, c, imm8, sae) SIMDE_STATEMENT_EXPR_(({ \
|
||||
simde__m128 simde_mm_mask_fixupimm_round_ss_r; \
|
||||
\
|
||||
if (sae & SIMDE_MM_FROUND_NO_EXC) { \
|
||||
fenv_t simde_mm_mask_fixupimm_round_ss_envp; \
|
||||
int simde_mm_mask_fixupimm_round_ss_x = feholdexcept(&simde_mm_mask_fixupimm_round_ss_envp); \
|
||||
simde_mm_mask_fixupimm_round_ss_r = simde_mm_mask_fixupimm_ss(a, k, b, c, imm8); \
|
||||
if (HEDLEY_LIKELY(simde_mm_mask_fixupimm_round_ss_x == 0)) \
|
||||
fesetenv(&simde_mm_mask_fixupimm_round_ss_envp); \
|
||||
} \
|
||||
else { \
|
||||
simde_mm_mask_fixupimm_round_ss_r = simde_mm_mask_fixupimm_ss(a, k, b, c, imm8); \
|
||||
} \
|
||||
\
|
||||
simde_mm_mask_fixupimm_round_ss_r; \
|
||||
}))
|
||||
#else
|
||||
#define simde_mm_mask_fixupimm_round_ss(a, k, b, c, imm8, sae) simde_mm_mask_fixupimm_ss(a, k, b, c, imm8)
|
||||
#endif
|
||||
#else
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128
|
||||
simde_mm_mask_fixupimm_round_ss (simde__m128 a, simde__mmask8 k, simde__m128 b, simde__m128i c, int imm8, int sae)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 15)
|
||||
SIMDE_REQUIRE_CONSTANT(sae) {
|
||||
simde__m128 r;
|
||||
|
||||
if (sae & SIMDE_MM_FROUND_NO_EXC) {
|
||||
#if defined(SIMDE_HAVE_FENV_H)
|
||||
fenv_t envp;
|
||||
int x = feholdexcept(&envp);
|
||||
r = simde_mm_mask_fixupimm_ss(a, k, b, c, imm8);
|
||||
if (HEDLEY_LIKELY(x == 0))
|
||||
fesetenv(&envp);
|
||||
#else
|
||||
r = simde_mm_mask_fixupimm_ss(a, k, b, c, imm8);
|
||||
#endif
|
||||
}
|
||||
else {
|
||||
r = simde_mm_mask_fixupimm_ss(a, k, b, c, imm8);
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_fixupimm_round_ss
|
||||
#define _mm_mask_fixupimm_round_ss(a, k, b, c, imm8, sae) simde_mm_mask_fixupimm_round_ss(a, k, b, c, imm8, sae)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define simde_mm_maskz_fixupimm_round_ss(k, a, b, c, imm8, sae) _mm_maskz_fixupimm_round_ss(k, a, b, c, imm8, sae)
|
||||
#elif defined(SIMDE_FAST_EXCEPTIONS)
|
||||
#define simde_mm_maskz_fixupimm_round_ss(k, a, b, c, imm8, sae) simde_mm_maskz_fixupimm_ss(k, a, b, c, imm8)
|
||||
#elif defined(SIMDE_STATEMENT_EXPR_)
|
||||
#if defined(SIMDE_HAVE_FENV_H)
|
||||
#define simde_mm_maskz_fixupimm_round_ss(k, a, b, c, imm8, sae) SIMDE_STATEMENT_EXPR_(({ \
|
||||
simde__m128 simde_mm_maskz_fixupimm_round_ss_r; \
|
||||
\
|
||||
if (sae & SIMDE_MM_FROUND_NO_EXC) { \
|
||||
fenv_t simde_mm_maskz_fixupimm_round_ss_envp; \
|
||||
int simde_mm_maskz_fixupimm_round_ss_x = feholdexcept(&simde_mm_maskz_fixupimm_round_ss_envp); \
|
||||
simde_mm_maskz_fixupimm_round_ss_r = simde_mm_maskz_fixupimm_ss(k, a, b, c, imm8); \
|
||||
if (HEDLEY_LIKELY(simde_mm_maskz_fixupimm_round_ss_x == 0)) \
|
||||
fesetenv(&simde_mm_maskz_fixupimm_round_ss_envp); \
|
||||
} \
|
||||
else { \
|
||||
simde_mm_maskz_fixupimm_round_ss_r = simde_mm_maskz_fixupimm_ss(k, a, b, c, imm8); \
|
||||
} \
|
||||
\
|
||||
simde_mm_maskz_fixupimm_round_ss_r; \
|
||||
}))
|
||||
#else
|
||||
#define simde_mm_maskz_fixupimm_round_ss(k, a, b, c, imm8, sae) simde_mm_maskz_fixupimm_ss(k, a, b, c, imm8)
|
||||
#endif
|
||||
#else
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128
|
||||
simde_mm_maskz_fixupimm_round_ss (simde__mmask8 k, simde__m128 a, simde__m128 b, simde__m128i c, int imm8, int sae)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 15)
|
||||
SIMDE_REQUIRE_CONSTANT(sae) {
|
||||
simde__m128 r;
|
||||
|
||||
if (sae & SIMDE_MM_FROUND_NO_EXC) {
|
||||
#if defined(SIMDE_HAVE_FENV_H)
|
||||
fenv_t envp;
|
||||
int x = feholdexcept(&envp);
|
||||
r = simde_mm_maskz_fixupimm_ss(k, a, b, c, imm8);
|
||||
if (HEDLEY_LIKELY(x == 0))
|
||||
fesetenv(&envp);
|
||||
#else
|
||||
r = simde_mm_maskz_fixupimm_ss(k, a, b, c, imm8);
|
||||
#endif
|
||||
}
|
||||
else {
|
||||
r = simde_mm_maskz_fixupimm_ss(k, a, b, c, imm8);
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_maskz_fixupimm_round_ss
|
||||
#define _mm_maskz_fixupimm_round_ss(k, a, b, c, imm8, sae) simde_mm_maskz_fixupimm_round_ss(k, a, b, c, imm8, sae)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define simde_mm_fixupimm_round_sd(a, b, c, imm8, sae) _mm_fixupimm_round_sd(a, b, c, imm8, sae)
|
||||
#elif defined(SIMDE_FAST_EXCEPTIONS)
|
||||
#define simde_mm_fixupimm_round_sd(a, b, c, imm8, sae) simde_mm_fixupimm_sd(a, b, c, imm8)
|
||||
#elif defined(SIMDE_STATEMENT_EXPR_)
|
||||
#if defined(SIMDE_HAVE_FENV_H)
|
||||
#define simde_mm_fixupimm_round_sd(a, b, c, imm8, sae) SIMDE_STATEMENT_EXPR_(({ \
|
||||
simde__m128d simde_mm_fixupimm_round_sd_r; \
|
||||
\
|
||||
if (sae & SIMDE_MM_FROUND_NO_EXC) { \
|
||||
fenv_t simde_mm_fixupimm_round_sd_envp; \
|
||||
int simde_mm_fixupimm_round_sd_x = feholdexcept(&simde_mm_fixupimm_round_sd_envp); \
|
||||
simde_mm_fixupimm_round_sd_r = simde_mm_fixupimm_sd(a, b, c, imm8); \
|
||||
if (HEDLEY_LIKELY(simde_mm_fixupimm_round_sd_x == 0)) \
|
||||
fesetenv(&simde_mm_fixupimm_round_sd_envp); \
|
||||
} \
|
||||
else { \
|
||||
simde_mm_fixupimm_round_sd_r = simde_mm_fixupimm_sd(a, b, c, imm8); \
|
||||
} \
|
||||
\
|
||||
simde_mm_fixupimm_round_sd_r; \
|
||||
}))
|
||||
#else
|
||||
#define simde_mm_fixupimm_round_sd(a, b, c, imm8, sae) simde_mm_fixupimm_sd(a, b, c, imm8)
|
||||
#endif
|
||||
#else
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128d
|
||||
simde_mm_fixupimm_round_sd (simde__m128d a, simde__m128d b, simde__m128i c, int imm8, int sae)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 15)
|
||||
SIMDE_REQUIRE_CONSTANT(sae) {
|
||||
simde__m128d r;
|
||||
|
||||
if (sae & SIMDE_MM_FROUND_NO_EXC) {
|
||||
#if defined(SIMDE_HAVE_FENV_H)
|
||||
fenv_t envp;
|
||||
int x = feholdexcept(&envp);
|
||||
r = simde_mm_fixupimm_sd(a, b, c, imm8);
|
||||
if (HEDLEY_LIKELY(x == 0))
|
||||
fesetenv(&envp);
|
||||
#else
|
||||
r = simde_mm_fixupimm_sd(a, b, c, imm8);
|
||||
#endif
|
||||
}
|
||||
else {
|
||||
r = simde_mm_fixupimm_sd(a, b, c, imm8);
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_fixupimm_round_sd
|
||||
#define _mm_fixupimm_round_sd(a, b, c, imm8, sae) simde_mm_fixupimm_round_sd(a, b, c, imm8, sae)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define simde_mm_mask_fixupimm_round_sd(a, k, b, c, imm8, sae) _mm_mask_fixupimm_round_sd(a, k, b, c, imm8, sae)
|
||||
#elif defined(SIMDE_FAST_EXCEPTIONS)
|
||||
#define simde_mm_mask_fixupimm_round_sd(a, k, b, c, imm8, sae) simde_mm_mask_fixupimm_sd(a, k, b, c, imm8)
|
||||
#elif defined(SIMDE_STATEMENT_EXPR_)
|
||||
#if defined(SIMDE_HAVE_FENV_H)
|
||||
#define simde_mm_mask_fixupimm_round_sd(a, k, b, c, imm8, sae) SIMDE_STATEMENT_EXPR_(({ \
|
||||
simde__m128d simde_mm_mask_fixupimm_round_sd_r; \
|
||||
\
|
||||
if (sae & SIMDE_MM_FROUND_NO_EXC) { \
|
||||
fenv_t simde_mm_mask_fixupimm_round_sd_envp; \
|
||||
int simde_mm_mask_fixupimm_round_sd_x = feholdexcept(&simde_mm_mask_fixupimm_round_sd_envp); \
|
||||
simde_mm_mask_fixupimm_round_sd_r = simde_mm_mask_fixupimm_sd(a, k, b, c, imm8); \
|
||||
if (HEDLEY_LIKELY(simde_mm_mask_fixupimm_round_sd_x == 0)) \
|
||||
fesetenv(&simde_mm_mask_fixupimm_round_sd_envp); \
|
||||
} \
|
||||
else { \
|
||||
simde_mm_mask_fixupimm_round_sd_r = simde_mm_mask_fixupimm_sd(a, k, b, c, imm8); \
|
||||
} \
|
||||
\
|
||||
simde_mm_mask_fixupimm_round_sd_r; \
|
||||
}))
|
||||
#else
|
||||
#define simde_mm_mask_fixupimm_round_sd(a, k, b, c, imm8, sae) simde_mm_mask_fixupimm_sd(a, k, b, c, imm8)
|
||||
#endif
|
||||
#else
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128d
|
||||
simde_mm_mask_fixupimm_round_sd (simde__m128d a, simde__mmask8 k, simde__m128d b, simde__m128i c, int imm8, int sae)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 15)
|
||||
SIMDE_REQUIRE_CONSTANT(sae) {
|
||||
simde__m128d r;
|
||||
|
||||
if (sae & SIMDE_MM_FROUND_NO_EXC) {
|
||||
#if defined(SIMDE_HAVE_FENV_H)
|
||||
fenv_t envp;
|
||||
int x = feholdexcept(&envp);
|
||||
r = simde_mm_mask_fixupimm_sd(a, k, b, c, imm8);
|
||||
if (HEDLEY_LIKELY(x == 0))
|
||||
fesetenv(&envp);
|
||||
#else
|
||||
r = simde_mm_mask_fixupimm_sd(a, k, b, c, imm8);
|
||||
#endif
|
||||
}
|
||||
else {
|
||||
r = simde_mm_mask_fixupimm_sd(a, k, b, c, imm8);
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_fixupimm_round_sd
|
||||
#define _mm_mask_fixupimm_round_sd(a, k, b, c, imm8, sae) simde_mm_mask_fixupimm_round_sd(a, k, b, c, imm8, sae)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define simde_mm_maskz_fixupimm_round_sd(k, a, b, c, imm8, sae) _mm_maskz_fixupimm_round_sd(k, a, b, c, imm8, sae)
|
||||
#elif defined(SIMDE_FAST_EXCEPTIONS)
|
||||
#define simde_mm_maskz_fixupimm_round_sd(k, a, b, c, imm8, sae) simde_mm_maskz_fixupimm_sd(k, a, b, c, imm8)
|
||||
#elif defined(SIMDE_STATEMENT_EXPR_)
|
||||
#if defined(SIMDE_HAVE_FENV_H)
|
||||
#define simde_mm_maskz_fixupimm_round_sd(k, a, b, c, imm8, sae) SIMDE_STATEMENT_EXPR_(({ \
|
||||
simde__m128d simde_mm_maskz_fixupimm_round_sd_r; \
|
||||
\
|
||||
if (sae & SIMDE_MM_FROUND_NO_EXC) { \
|
||||
fenv_t simde_mm_maskz_fixupimm_round_sd_envp; \
|
||||
int simde_mm_maskz_fixupimm_round_sd_x = feholdexcept(&simde_mm_maskz_fixupimm_round_sd_envp); \
|
||||
simde_mm_maskz_fixupimm_round_sd_r = simde_mm_maskz_fixupimm_sd(k, a, b, c, imm8); \
|
||||
if (HEDLEY_LIKELY(simde_mm_maskz_fixupimm_round_sd_x == 0)) \
|
||||
fesetenv(&simde_mm_maskz_fixupimm_round_sd_envp); \
|
||||
} \
|
||||
else { \
|
||||
simde_mm_maskz_fixupimm_round_sd_r = simde_mm_maskz_fixupimm_sd(k, a, b, c, imm8); \
|
||||
} \
|
||||
\
|
||||
simde_mm_maskz_fixupimm_round_sd_r; \
|
||||
}))
|
||||
#else
|
||||
#define simde_mm_maskz_fixupimm_round_sd(k, a, b, c, imm8, sae) simde_mm_maskz_fixupimm_sd(k, a, b, c, imm8)
|
||||
#endif
|
||||
#else
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128d
|
||||
simde_mm_maskz_fixupimm_round_sd (simde__mmask8 k, simde__m128d a, simde__m128d b, simde__m128i c, int imm8, int sae)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 15)
|
||||
SIMDE_REQUIRE_CONSTANT(sae) {
|
||||
simde__m128d r;
|
||||
|
||||
if (sae & SIMDE_MM_FROUND_NO_EXC) {
|
||||
#if defined(SIMDE_HAVE_FENV_H)
|
||||
fenv_t envp;
|
||||
int x = feholdexcept(&envp);
|
||||
r = simde_mm_maskz_fixupimm_sd(k, a, b, c, imm8);
|
||||
if (HEDLEY_LIKELY(x == 0))
|
||||
fesetenv(&envp);
|
||||
#else
|
||||
r = simde_mm_maskz_fixupimm_sd(k, a, b, c, imm8);
|
||||
#endif
|
||||
}
|
||||
else {
|
||||
r = simde_mm_maskz_fixupimm_sd(k, a, b, c, imm8);
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_maskz_fixupimm_round_sd
|
||||
#define _mm_maskz_fixupimm_round_sd(k, a, b, c, imm8, sae) simde_mm_maskz_fixupimm_round_sd(k, a, b, c, imm8, sae)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_FIXUPIMM_ROUND_H) */
|
||||
@@ -0,0 +1,91 @@
|
||||
#if !defined(SIMDE_X86_AVX512_FLUSHSUBNORMAL_H)
|
||||
#define SIMDE_X86_AVX512_FLUSHSUBNORMAL_H
|
||||
|
||||
#include "types.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128
|
||||
simde_x_mm_flushsubnormal_ps (simde__m128 a) {
|
||||
simde__m128_private a_ = simde__m128_to_private(a);
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(a_.f32) / sizeof(a_.f32[0])) ; i++) {
|
||||
a_.f32[i] = simde_math_issubnormalf(a_.f32[i]) ? 0 : a_.f32[i];
|
||||
}
|
||||
|
||||
return simde__m128_from_private(a_);
|
||||
}
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256
|
||||
simde_x_mm256_flushsubnormal_ps (simde__m256 a) {
|
||||
simde__m256_private a_ = simde__m256_to_private(a);
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(a_.f32) / sizeof(a_.f32[0])) ; i++) {
|
||||
a_.f32[i] = simde_math_issubnormalf(a_.f32[i]) ? 0 : a_.f32[i];
|
||||
}
|
||||
|
||||
return simde__m256_from_private(a_);
|
||||
}
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_x_mm512_flushsubnormal_ps (simde__m512 a) {
|
||||
simde__m512_private a_ = simde__m512_to_private(a);
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(a_.f32) / sizeof(a_.f32[0])) ; i++) {
|
||||
a_.f32[i] = simde_math_issubnormalf(a_.f32[i]) ? 0 : a_.f32[i];
|
||||
}
|
||||
|
||||
return simde__m512_from_private(a_);
|
||||
}
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128d
|
||||
simde_x_mm_flushsubnormal_pd (simde__m128d a) {
|
||||
simde__m128d_private a_ = simde__m128d_to_private(a);
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(a_.f64) / sizeof(a_.f64[0])) ; i++) {
|
||||
a_.f64[i] = simde_math_issubnormal(a_.f64[i]) ? 0 : a_.f64[i];
|
||||
}
|
||||
|
||||
return simde__m128d_from_private(a_);
|
||||
}
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256d
|
||||
simde_x_mm256_flushsubnormal_pd (simde__m256d a) {
|
||||
simde__m256d_private a_ = simde__m256d_to_private(a);
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(a_.f64) / sizeof(a_.f64[0])) ; i++) {
|
||||
a_.f64[i] = simde_math_issubnormal(a_.f64[i]) ? 0 : a_.f64[i];
|
||||
}
|
||||
|
||||
return simde__m256d_from_private(a_);
|
||||
}
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_x_mm512_flushsubnormal_pd (simde__m512d a) {
|
||||
simde__m512d_private a_ = simde__m512d_to_private(a);
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(a_.f64) / sizeof(a_.f64[0])) ; i++) {
|
||||
a_.f64[i] = simde_math_issubnormal(a_.f64[i]) ? 0 : a_.f64[i];
|
||||
}
|
||||
|
||||
return simde__m512d_from_private(a_);
|
||||
}
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_FLUSHSUBNORMAL_H) */
|
||||
@@ -0,0 +1,136 @@
|
||||
/* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Copyright:
|
||||
* 2020 Evan Nemerson <evan@nemerson.com>
|
||||
* 2020 Himanshi Mathur <himanshi18037@iiitd.ac.in>
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512_FMADD_H)
|
||||
#define SIMDE_X86_AVX512_FMADD_H
|
||||
|
||||
#include "types.h"
|
||||
#include "mov.h"
|
||||
#include "../fma.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_fmadd_ps (simde__m512 a, simde__m512 b, simde__m512 c) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_fmadd_ps(a, b, c);
|
||||
#else
|
||||
simde__m512_private
|
||||
r_,
|
||||
a_ = simde__m512_to_private(a),
|
||||
b_ = simde__m512_to_private(b),
|
||||
c_ = simde__m512_to_private(c);
|
||||
|
||||
#if SIMDE_NATURAL_VECTOR_SIZE_LE(256)
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m256) / sizeof(r_.m256[0])) ; i++) {
|
||||
r_.m256[i] = simde_mm256_fmadd_ps(a_.m256[i], b_.m256[i], c_.m256[i]);
|
||||
}
|
||||
#elif defined(SIMDE_VECTOR_SUBSCRIPT_OPS)
|
||||
r_.f32 = (a_.f32 * b_.f32) + c_.f32;
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.f32) / sizeof(r_.f32[0])) ; i++) {
|
||||
r_.f32[i] = (a_.f32[i] * b_.f32[i]) + c_.f32[i];
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_fmadd_ps
|
||||
#define _mm512_fmadd_ps(a, b, c) simde_mm512_fmadd_ps(a, b, c)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_mask_fmadd_ps(simde__m512 a, simde__mmask16 k, simde__m512 b, simde__m512 c) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_fmadd_ps(a, k, b, c);
|
||||
#else
|
||||
return simde_mm512_mask_mov_ps(a, k, simde_mm512_fmadd_ps(a, b, c));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_fmadd_ps
|
||||
#define _mm512_mask_fmadd_ps(a, k, b, c) simde_mm512_mask_fmadd_ps(a, k, b, c)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_maskz_fmadd_ps(simde__mmask16 k, simde__m512 a, simde__m512 b, simde__m512 c) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_maskz_fmadd_ps(k, a, b, c);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_ps(k, simde_mm512_fmadd_ps(a, b, c));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_fmadd_ps
|
||||
#define _mm512_maskz_fmadd_ps(k, a, b, c) simde_mm512_maskz_fmadd_ps(k, a, b, c)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_fmadd_pd (simde__m512d a, simde__m512d b, simde__m512d c) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_fmadd_pd(a, b, c);
|
||||
#else
|
||||
simde__m512d_private
|
||||
r_,
|
||||
a_ = simde__m512d_to_private(a),
|
||||
b_ = simde__m512d_to_private(b),
|
||||
c_ = simde__m512d_to_private(c);
|
||||
|
||||
#if SIMDE_NATURAL_VECTOR_SIZE_LE(256)
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m256d) / sizeof(r_.m256d[0])) ; i++) {
|
||||
r_.m256d[i] = simde_mm256_fmadd_pd(a_.m256d[i], b_.m256d[i], c_.m256d[i]);
|
||||
}
|
||||
#elif defined(SIMDE_VECTOR_SUBSCRIPT_OPS)
|
||||
r_.f64 = (a_.f64 * b_.f64) + c_.f64;
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.f64) / sizeof(r_.f64[0])) ; i++) {
|
||||
r_.f64[i] = (a_.f64[i] * b_.f64[i]) + c_.f64[i];
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512d_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_fmadd_pd
|
||||
#define _mm512_fmadd_pd(a, b, c) simde_mm512_fmadd_pd(a, b, c)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_FMADD_H) */
|
||||
@@ -0,0 +1,276 @@
|
||||
/* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Copyright:
|
||||
* 2020 Evan Nemerson <evan@nemerson.com>
|
||||
* 2020 kitegi <kitegi@users.noreply.github.com>
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512_FMSUB_H)
|
||||
#define SIMDE_X86_AVX512_FMSUB_H
|
||||
|
||||
#include "types.h"
|
||||
#include "mov.h"
|
||||
#include "../fma.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256d
|
||||
simde_mm256_mask3_fmsub_pd (simde__m256d a, simde__m256d b, simde__m256d c, simde__mmask8 k) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_mask3_fmsub_pd(a, b, c, k);
|
||||
#else
|
||||
return simde_mm256_mask_mov_pd(c, k, simde_mm256_fmsub_pd(a, b, c));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_mask3_fmsub_pd
|
||||
#define _mm256_mask3_fmsub_pd(a, b, c, k) simde_mm256_mask3_fmsub_pd(a, b, c, k)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256d
|
||||
simde_mm256_mask_fmsub_pd (simde__m256d a, simde__mmask8 k, simde__m256d b, simde__m256d c) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_mask_fmsub_pd(a, k, b, c);
|
||||
#else
|
||||
return simde_mm256_mask_mov_pd(a, k, simde_mm256_fmsub_pd(a, b, c));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_mask_fmsub_pd
|
||||
#define _mm256_mask_fmsub_pd(a, k, b, c) simde_mm256_mask_fmsub_pd(a, k, b, c)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256d
|
||||
simde_mm256_maskz_fmsub_pd (simde__mmask8 k, simde__m256d a, simde__m256d b, simde__m256d c) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_maskz_fmsub_pd(k, a, b, c);
|
||||
#else
|
||||
return simde_mm256_maskz_mov_pd(k, simde_mm256_fmsub_pd(a, b, c));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_maskz_fmsub_pd
|
||||
#define _mm256_maskz_fmsub_pd(k, a, b, c) simde_mm256_maskz_fmsub_pd(k, a, b, c)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128d
|
||||
simde_mm_mask3_fmsub_pd (simde__m128d a, simde__m128d b, simde__m128d c, simde__mmask8 k) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_mask3_fmsub_pd(a, b, c, k);
|
||||
#else
|
||||
return simde_mm_mask_mov_pd(c, k, simde_mm_fmsub_pd(a, b, c));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask3_fmsub_pd
|
||||
#define _mm_mask3_fmsub_pd(a, b, c, k) simde_mm_mask3_fmsub_pd(a, b, c, k)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128d
|
||||
simde_mm_mask_fmsub_pd (simde__m128d a, simde__mmask8 k, simde__m128d b, simde__m128d c) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_mask_fmsub_pd(a, k, b, c);
|
||||
#else
|
||||
return simde_mm_mask_mov_pd(a, k, simde_mm_fmsub_pd(a, b, c));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_fmsub_pd
|
||||
#define _mm_mask_fmsub_pd(a, k, b, c) simde_mm_mask_fmsub_pd(a, k, b, c)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128d
|
||||
simde_mm_maskz_fmsub_pd (simde__mmask8 k, simde__m128d a, simde__m128d b, simde__m128d c) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_maskz_fmsub_pd(k, a, b, c);
|
||||
#else
|
||||
return simde_mm_maskz_mov_pd(k, simde_mm_fmsub_pd(a, b, c));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_maskz_fmsub_pd
|
||||
#define _mm_maskz_fmsub_pd(k, a, b, c) simde_mm_maskz_fmsub_pd(k, a, b, c)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256
|
||||
simde_mm256_mask3_fmsub_ps (simde__m256 a, simde__m256 b, simde__m256 c, simde__mmask8 k) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_mask3_fmsub_ps(a, b, c, k);
|
||||
#else
|
||||
return simde_mm256_mask_mov_ps(c, k, simde_mm256_fmsub_ps(a, b, c));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_mask3_fmsub_ps
|
||||
#define _mm256_mask3_fmsub_ps(a, b, c, k) simde_mm256_mask3_fmsub_ps(a, b, c, k)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256
|
||||
simde_mm256_mask_fmsub_ps (simde__m256 a, simde__mmask8 k, simde__m256 b, simde__m256 c) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_mask_fmsub_ps(a, k, b, c);
|
||||
#else
|
||||
return simde_mm256_mask_mov_ps(a, k, simde_mm256_fmsub_ps(a, b, c));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_mask_fmsub_ps
|
||||
#define _mm256_mask_fmsub_ps(a, k, b, c) simde_mm256_mask_fmsub_ps(a, k, b, c)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256
|
||||
simde_mm256_maskz_fmsub_ps (simde__mmask8 k, simde__m256 a, simde__m256 b, simde__m256 c) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_maskz_fmsub_ps(k, a, b, c);
|
||||
#else
|
||||
return simde_mm256_maskz_mov_ps(k, simde_mm256_fmsub_ps(a, b, c));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_maskz_fmsub_ps
|
||||
#define _mm256_maskz_fmsub_ps(k, a, b, c) simde_mm256_maskz_fmsub_ps(k, a, b, c)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128
|
||||
simde_mm_mask3_fmsub_ps (simde__m128 a, simde__m128 b, simde__m128 c, simde__mmask8 k) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_mask3_fmsub_ps(a, b, c, k);
|
||||
#else
|
||||
return simde_mm_mask_mov_ps(c, k, simde_mm_fmsub_ps(a, b, c));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask3_fmsub_ps
|
||||
#define _mm_mask3_fmsub_ps(a, b, c, k) simde_mm_mask3_fmsub_ps(a, b, c, k)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128
|
||||
simde_mm_mask_fmsub_ps (simde__m128 a, simde__mmask8 k, simde__m128 b, simde__m128 c) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_mask_fmsub_ps(a, k, b, c);
|
||||
#else
|
||||
return simde_mm_mask_mov_ps(a, k, simde_mm_fmsub_ps(a, b, c));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_fmsub_ps
|
||||
#define _mm_mask_fmsub_ps(a, k, b, c) simde_mm_mask_fmsub_ps(a, k, b, c)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128
|
||||
simde_mm_maskz_fmsub_ps (simde__mmask8 k, simde__m128 a, simde__m128 b, simde__m128 c) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_maskz_fmsub_ps(k, a, b, c);
|
||||
#else
|
||||
return simde_mm_maskz_mov_ps(k, simde_mm_fmsub_ps(a, b, c));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_maskz_fmsub_ps
|
||||
#define _mm_maskz_fmsub_ps(k, a, b, c) simde_mm_maskz_fmsub_ps(k, a, b, c)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_fmsub_ps (simde__m512 a, simde__m512 b, simde__m512 c) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_fmsub_ps(a, b, c);
|
||||
#else
|
||||
simde__m512_private
|
||||
r_,
|
||||
a_ = simde__m512_to_private(a),
|
||||
b_ = simde__m512_to_private(b),
|
||||
c_ = simde__m512_to_private(c);
|
||||
|
||||
#if SIMDE_NATURAL_VECTOR_SIZE_LE(256)
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m256) / sizeof(r_.m256[0])) ; i++) {
|
||||
r_.m256[i] = simde_mm256_fmsub_ps(a_.m256[i], b_.m256[i], c_.m256[i]);
|
||||
}
|
||||
#elif defined(SIMDE_VECTOR_SUBSCRIPT_OPS)
|
||||
r_.f32 = (a_.f32 * b_.f32) - c_.f32;
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.f32) / sizeof(r_.f32[0])) ; i++) {
|
||||
r_.f32[i] = (a_.f32[i] * b_.f32[i]) - c_.f32[i];
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_fmsub_ps
|
||||
#define _mm512_fmsub_ps(a, b, c) simde_mm512_fmsub_ps(a, b, c)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_fmsub_pd (simde__m512d a, simde__m512d b, simde__m512d c) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_fmsub_pd(a, b, c);
|
||||
#else
|
||||
simde__m512d_private
|
||||
r_,
|
||||
a_ = simde__m512d_to_private(a),
|
||||
b_ = simde__m512d_to_private(b),
|
||||
c_ = simde__m512d_to_private(c);
|
||||
|
||||
#if SIMDE_NATURAL_VECTOR_SIZE_LE(256)
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m256d) / sizeof(r_.m256d[0])) ; i++) {
|
||||
r_.m256d[i] = simde_mm256_fmsub_pd(a_.m256d[i], b_.m256d[i], c_.m256d[i]);
|
||||
}
|
||||
#elif defined(SIMDE_VECTOR_SUBSCRIPT_OPS)
|
||||
r_.f64 = (a_.f64 * b_.f64) - c_.f64;
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.f64) / sizeof(r_.f64[0])) ; i++) {
|
||||
r_.f64[i] = (a_.f64[i] * b_.f64[i]) - c_.f64[i];
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512d_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_fmsub_pd
|
||||
#define _mm512_fmsub_pd(a, b, c) simde_mm512_fmsub_pd(a, b, c)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_FMSUB_H) */
|
||||
@@ -0,0 +1,108 @@
|
||||
/* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Copyright:
|
||||
* 2020 Evan Nemerson <evan@nemerson.com>
|
||||
* 2020 kitegi <kitegi@users.noreply.github.com>
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512_FNMADD_H)
|
||||
#define SIMDE_X86_AVX512_FNMADD_H
|
||||
|
||||
#include "types.h"
|
||||
#include "mov.h"
|
||||
#include "../fma.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_fnmadd_ps (simde__m512 a, simde__m512 b, simde__m512 c) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_fnmadd_ps(a, b, c);
|
||||
#else
|
||||
simde__m512_private
|
||||
r_,
|
||||
a_ = simde__m512_to_private(a),
|
||||
b_ = simde__m512_to_private(b),
|
||||
c_ = simde__m512_to_private(c);
|
||||
|
||||
#if SIMDE_NATURAL_VECTOR_SIZE_LE(256)
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m256) / sizeof(r_.m256[0])) ; i++) {
|
||||
r_.m256[i] = simde_mm256_fnmadd_ps(a_.m256[i], b_.m256[i], c_.m256[i]);
|
||||
}
|
||||
#elif defined(SIMDE_VECTOR_SUBSCRIPT_OPS)
|
||||
r_.f32 = -(a_.f32 * b_.f32) + c_.f32;
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.f32) / sizeof(r_.f32[0])) ; i++) {
|
||||
r_.f32[i] = -(a_.f32[i] * b_.f32[i]) + c_.f32[i];
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_fnmadd_ps
|
||||
#define _mm512_fnmadd_ps(a, b, c) simde_mm512_fnmadd_ps(a, b, c)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_fnmadd_pd (simde__m512d a, simde__m512d b, simde__m512d c) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_fnmadd_pd(a, b, c);
|
||||
#else
|
||||
simde__m512d_private
|
||||
r_,
|
||||
a_ = simde__m512d_to_private(a),
|
||||
b_ = simde__m512d_to_private(b),
|
||||
c_ = simde__m512d_to_private(c);
|
||||
|
||||
#if SIMDE_NATURAL_VECTOR_SIZE_LE(256)
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m256d) / sizeof(r_.m256d[0])) ; i++) {
|
||||
r_.m256d[i] = simde_mm256_fnmadd_pd(a_.m256d[i], b_.m256d[i], c_.m256d[i]);
|
||||
}
|
||||
#elif defined(SIMDE_VECTOR_SUBSCRIPT_OPS)
|
||||
r_.f64 = -(a_.f64 * b_.f64) + c_.f64;
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.f64) / sizeof(r_.f64[0])) ; i++) {
|
||||
r_.f64[i] = -(a_.f64[i] * b_.f64[i]) + c_.f64[i];
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512d_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_fnmadd_pd
|
||||
#define _mm512_fnmadd_pd(a, b, c) simde_mm512_fnmadd_pd(a, b, c)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_FNMADD_H) */
|
||||
@@ -0,0 +1,108 @@
|
||||
/* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Copyright:
|
||||
* 2020 Evan Nemerson <evan@nemerson.com>
|
||||
* 2020 kitegi <kitegi@users.noreply.github.com>
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512_FNMSUB_H)
|
||||
#define SIMDE_X86_AVX512_FNMSUB_H
|
||||
|
||||
#include "types.h"
|
||||
#include "mov.h"
|
||||
#include "../fma.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_fnmsub_ps (simde__m512 a, simde__m512 b, simde__m512 c) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_fnmsub_ps(a, b, c);
|
||||
#else
|
||||
simde__m512_private
|
||||
r_,
|
||||
a_ = simde__m512_to_private(a),
|
||||
b_ = simde__m512_to_private(b),
|
||||
c_ = simde__m512_to_private(c);
|
||||
|
||||
#if SIMDE_NATURAL_VECTOR_SIZE_LE(256)
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m256) / sizeof(r_.m256[0])) ; i++) {
|
||||
r_.m256[i] = simde_mm256_fnmsub_ps(a_.m256[i], b_.m256[i], c_.m256[i]);
|
||||
}
|
||||
#elif defined(SIMDE_VECTOR_SUBSCRIPT_OPS)
|
||||
r_.f32 = -(a_.f32 * b_.f32) - c_.f32;
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.f32) / sizeof(r_.f32[0])) ; i++) {
|
||||
r_.f32[i] = -(a_.f32[i] * b_.f32[i]) - c_.f32[i];
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_fnmsub_ps
|
||||
#define _mm512_fnmsub_ps(a, b, c) simde_mm512_fnmsub_ps(a, b, c)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_fnmsub_pd (simde__m512d a, simde__m512d b, simde__m512d c) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_fnmsub_pd(a, b, c);
|
||||
#else
|
||||
simde__m512d_private
|
||||
r_,
|
||||
a_ = simde__m512d_to_private(a),
|
||||
b_ = simde__m512d_to_private(b),
|
||||
c_ = simde__m512d_to_private(c);
|
||||
|
||||
#if SIMDE_NATURAL_VECTOR_SIZE_LE(256)
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m256d) / sizeof(r_.m256d[0])) ; i++) {
|
||||
r_.m256d[i] = simde_mm256_fnmsub_pd(a_.m256d[i], b_.m256d[i], c_.m256d[i]);
|
||||
}
|
||||
#elif defined(SIMDE_VECTOR_SUBSCRIPT_OPS)
|
||||
r_.f64 = -(a_.f64 * b_.f64) - c_.f64;
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.f64) / sizeof(r_.f64[0])) ; i++) {
|
||||
r_.f64[i] = -(a_.f64[i] * b_.f64[i]) - c_.f64[i];
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512d_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_fnmsub_pd
|
||||
#define _mm512_fnmsub_pd(a, b, c) simde_mm512_fnmsub_pd(a, b, c)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_FNMSUB_H) */
|
||||
@@ -0,0 +1,99 @@
|
||||
/* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Copyright:
|
||||
* 2023 Michael R. Crusoe <crusoe@debian.org>
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512_FPCLASS_H)
|
||||
#define SIMDE_X86_AVX512_FPCLASS_H
|
||||
|
||||
#include "types.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask8
|
||||
simde_mm256_fpclass_ps_mask(simde__m256 a, int imm8)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 0x88) {
|
||||
simde__mmask8 r = 0;
|
||||
simde__m256_private a_ = simde__m256_to_private(a);
|
||||
|
||||
for (size_t i = 0 ; i < (sizeof(a_.f32) / sizeof(a_.f32[0])) ; i++) {
|
||||
r |= simde_math_fpclassf(a_.f32[i], imm8) ? (UINT8_C(1) << i) : 0;
|
||||
}
|
||||
return r;
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
# define simde_mm256_fpclass_ps_mask(a, imm8) _mm256_fpclass_ps_mask((a), (imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
# undef _mm256_fpclass_ps_mask
|
||||
# define _mm256_fpclass_ps_mask(a, imm8) simde_mm256_fpclass_ps_mask((a), (imm8))
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask32
|
||||
simde_mm512_fpclass_ph_mask(simde__m512h a, int imm8)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 0x88) {
|
||||
simde__mmask32 r = 0;
|
||||
simde__m512h_private a_ = simde__m512h_to_private(a);
|
||||
|
||||
for (size_t i = 0 ; i < (sizeof(a_.f16) / sizeof(a_.f16[0])) ; i++) {
|
||||
r |= simde_fpclasshf(a_.f16[i], imm8) ? (UINT8_C(1) << i) : 0;
|
||||
}
|
||||
return r;
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512FP16_NATIVE)
|
||||
# define simde_mm512_fpclass_ph_mask(a, imm8) _mm512_fpclass_ph_mask((a), (imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512FP16_ENABLE_NATIVE_ALIASES)
|
||||
# undef _mm512_fpclass_ph_mask
|
||||
# define _mm512_fpclass_ph_mask(a, imm8) simde_mm512_fpclass_ph_mask((a), (imm8))
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask8
|
||||
simde_mm512_fpclass_pd_mask(simde__m512d a, int imm8)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 0x88) {
|
||||
simde__mmask8 r = 0;
|
||||
simde__m512d_private a_ = simde__m512d_to_private(a);
|
||||
|
||||
for (size_t i = 0 ; i < (sizeof(a_.f64) / sizeof(a_.f64[0])) ; i++) {
|
||||
r |= simde_math_fpclass(a_.f64[i], imm8) ? (UINT8_C(1) << i) : 0;
|
||||
}
|
||||
return r;
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
# define simde_mm512_fpclass_pd_mask(a, imm8) _mm512_fpclass_pd_mask((a), (imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
# undef _mm512_fpclass_pd_mask
|
||||
# define _mm512_fpclass_pd_mask(a, imm8) simde_mm512_fpclass_pd_mask((a), (imm8))
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_FPCLASS_H) */
|
||||
@@ -0,0 +1,312 @@
|
||||
/* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Copyright:
|
||||
* 2023 Michael R. Crusoe <crusoe@debian.org>
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512_GATHER_H)
|
||||
#define SIMDE_X86_AVX512_GATHER_H
|
||||
|
||||
#include "types.h"
|
||||
#include "../avx2.h"
|
||||
#include "extract.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_i32gather_ps(simde__m512i vindex, const void* base_addr, const int32_t scale)
|
||||
SIMDE_REQUIRE_CONSTANT(scale)
|
||||
HEDLEY_REQUIRE_MSG((scale && scale <= 8 && !(scale & (scale - 1))), "`scale' must be a power of two less than or equal to 8") {
|
||||
simde__m512i_private vindex_ = simde__m512i_to_private(vindex);
|
||||
simde__m512_private r_ = simde__m512_to_private(simde_mm512_setzero_ps());
|
||||
const uint8_t* addr = HEDLEY_REINTERPRET_CAST(const uint8_t*, base_addr);
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(vindex_.i32) / sizeof(vindex_.i32[0])) ; i++) {
|
||||
const uint8_t* src = addr + (HEDLEY_STATIC_CAST(size_t , vindex_.i32[i]) * HEDLEY_STATIC_CAST(size_t , scale));
|
||||
simde_float32 dst;
|
||||
simde_memcpy(&dst, src, sizeof(dst));
|
||||
r_.f32[i] = dst;
|
||||
}
|
||||
|
||||
return simde__m512_from_private(r_);
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && (!defined(__clang__) || SIMDE_DETECT_CLANG_VERSION_CHECK(10,0,0))
|
||||
#define simde_mm512_i32gather_ps(vindex, base_addr, scale) _mm512_i32gather_ps((vindex), (base_addr), (scale))
|
||||
#elif defined(SIMDE_X86_AVX2_NATIVE) && defined(SIMDE_STATEMENT_EXPR_)
|
||||
#define simde_mm512_i32gather_ps(vindex, base_addr, scale) SIMDE_STATEMENT_EXPR_(({\
|
||||
simde__m512_private simde_mm512_i32gather_ps_r_; \
|
||||
simde__m512i_private simde_mm512_i32gather_ps_vindex_ = simde__m512i_to_private((vindex)); \
|
||||
simde_mm512_i32gather_ps_r_.m256[0] = _mm256_i32gather_ps( \
|
||||
HEDLEY_STATIC_CAST(float const*, (base_addr)), simde_mm512_i32gather_ps_vindex_.m256i[0], (scale)); \
|
||||
simde_mm512_i32gather_ps_r_.m256[1] = _mm256_i32gather_ps( \
|
||||
HEDLEY_STATIC_CAST(float const*, (base_addr)), simde_mm512_i32gather_ps_vindex_.m256i[1], (scale)); \
|
||||
simde__m512_from_private(simde_mm512_i32gather_ps_r_); \
|
||||
}))
|
||||
#elif defined(SIMDE_X86_AVX2_NATIVE) && !defined(SIMDE_STATEMENT_EXPR_)
|
||||
#define simde_mm512_i32gather_ps(vindex, base_addr, scale) \
|
||||
simde_x_mm512_set_m256( \
|
||||
_mm256_i32gather_ps(HEDLEY_STATIC_CAST(float const*, (base_addr)), \
|
||||
simde_mm512_extracti32x8_epi32((vindex), 1), (scale)), \
|
||||
_mm256_i32gather_ps(HEDLEY_STATIC_CAST(float const*, (base_addr)), \
|
||||
simde_mm512_extracti32x8_epi32((vindex), 0), (scale)) )
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_i32gather_ps
|
||||
#define _mm512_i32gather_ps(vindex, base_addr, scale) simde_mm512_i32gather_ps((vindex), (base_addr), (scale))
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm512_i64gather_epi32(simde__m512i vindex, const void* base_addr, const int32_t scale)
|
||||
SIMDE_REQUIRE_CONSTANT(scale)
|
||||
HEDLEY_REQUIRE_MSG((scale && scale <= 8 && !(scale & (scale - 1))), "`scale' must be a power of two less than or equal to 8") {
|
||||
simde__m512i_private vindex_;
|
||||
simde__m256i_private r_;
|
||||
vindex_ = simde__m512i_to_private(vindex);
|
||||
r_ = simde__m256i_to_private(simde_mm256_setzero_si256());
|
||||
const uint8_t* addr = HEDLEY_REINTERPRET_CAST(const uint8_t*, base_addr);
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(vindex_.i64) / sizeof(vindex_.i64[0])) ; i++) {
|
||||
const uint8_t* src = addr + (HEDLEY_STATIC_CAST(size_t , vindex_.i64[i]) * HEDLEY_STATIC_CAST(size_t , scale));
|
||||
int32_t dst;
|
||||
simde_memcpy(&dst, src, sizeof(dst));
|
||||
r_.i32[i] = dst;
|
||||
}
|
||||
|
||||
return simde__m256i_from_private(r_);
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define simde_mm512_i64gather_epi32(vindex, base_addr, scale) _mm512_i64gather_epi32((vindex), (base_addr), (scale))
|
||||
#elif defined(SIMDE_X86_AVX2_NATIVE) && defined(SIMDE_STATEMENT_EXPR_)
|
||||
#define simde_mm512_i64gather_epi32(vindex, base_addr, scale) SIMDE_STATEMENT_EXPR_(({\
|
||||
simde__m256i_private simde_mm512_i64gather_epi32_r_; \
|
||||
simde__m512i_private simde_mm512_i64gather_epi32_vindex_ = simde__m512i_to_private((vindex)); \
|
||||
simde_mm512_i64gather_epi32_r_.m128i[0] = _mm256_i64gather_epi32( \
|
||||
HEDLEY_STATIC_CAST(int const*, (base_addr)), simde_mm512_i64gather_epi32_vindex_.m256i[0], (scale)); \
|
||||
simde_mm512_i64gather_epi32_r_.m128i[1] = _mm256_i64gather_epi32( \
|
||||
HEDLEY_STATIC_CAST(int const*, (base_addr)), simde_mm512_i64gather_epi32_vindex_.m256i[1], (scale)); \
|
||||
simde__m256i_from_private(simde_mm512_i64gather_epi32_r_); \
|
||||
}))
|
||||
#elif defined(SIMDE_X86_AVX2_NATIVE) && !defined(SIMDE_STATEMENT_EXPR_)
|
||||
#define simde_mm512_i64gather_epi32(vindex, base_addr, scale) \
|
||||
_mm256_insertf128_si256( \
|
||||
_mm256_castsi128_si256( \
|
||||
_mm256_i64gather_epi32(HEDLEY_STATIC_CAST(int const*, (base_addr)), \
|
||||
simde_mm512_extracti64x4_epi64((vindex), 0), (scale))), \
|
||||
_mm256_i64gather_epi32(HEDLEY_STATIC_CAST(int const*, (base_addr)), \
|
||||
simde_mm512_extracti64x4_epi64((vindex), 1), (scale)), \
|
||||
1)
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_i64gather_epi32
|
||||
#define _mm512_i64gather_epi32(vindex, base_addr, scale) simde_mm512_i64gather_epi32((vindex), (base_addr), (scale))
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define simde_mm512_mask_i64gather_epi32(src, k, vindex, base_addr, scale) _mm512_mask_i64gather_epi32((src), (k), (vindex), (base_addr), (scale))
|
||||
#else
|
||||
#define simde_mm512_mask_i64gather_epi32(src, k, vindex, base_addr, scale) simde_mm256_mask_mov_epi32(src, k, simde_mm512_i64gather_epi32((vindex), (base_addr), (scale)))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_i64gather_epi32
|
||||
#define _mm512_mask_i64gather_epi32(src, k, vindex, base_addr, scale) simde_mm512_mask_i64gather_epi32((src), (k), (vindex), (base_addr), (scale))
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_i64gather_epi64(simde__m512i vindex, const void* base_addr, const int32_t scale)
|
||||
SIMDE_REQUIRE_CONSTANT(scale)
|
||||
HEDLEY_REQUIRE_MSG((scale && scale <= 8 && !(scale & (scale - 1))), "`scale' must be a power of two less than or equal to 8") {
|
||||
simde__m512i_private
|
||||
vindex_ = simde__m512i_to_private(vindex),
|
||||
r_ = simde__m512i_to_private(simde_mm512_setzero_si512());
|
||||
const uint8_t* addr = HEDLEY_REINTERPRET_CAST(const uint8_t*, base_addr);
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(vindex_.i64) / sizeof(vindex_.i64[0])) ; i++) {
|
||||
const uint8_t* src = addr + (HEDLEY_STATIC_CAST(size_t , vindex_.i64[i]) * HEDLEY_STATIC_CAST(size_t , scale));
|
||||
int64_t dst;
|
||||
simde_memcpy(&dst, src, sizeof(dst));
|
||||
r_.i64[i] = dst;
|
||||
}
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define simde_mm512_i64gather_epi64(vindex, base_addr, scale) _mm512_i64gather_epi64((vindex), (base_addr), (scale))
|
||||
#elif defined(SIMDE_X86_AVX2_NATIVE) && defined(SIMDE_STATEMENT_EXPR_)
|
||||
#define simde_mm512_i64gather_epi64(vindex, base_addr, scale) SIMDE_STATEMENT_EXPR_(({\
|
||||
simde__m512i_private simde_mm512_i64gather_epi64_r_, \
|
||||
simde_mm512_i64gather_epi64_vindex_ = simde__m512i_to_private((vindex)); \
|
||||
simde_mm512_i64gather_epi64_r_.m256i[0] = _mm256_i64gather_epi64( \
|
||||
HEDLEY_STATIC_CAST(long long const*, (base_addr)), simde_mm512_i64gather_epi64_vindex_.m256i[0], (scale)); \
|
||||
simde_mm512_i64gather_epi64_r_.m256i[1] = _mm256_i64gather_epi64( \
|
||||
HEDLEY_STATIC_CAST(long long const*, (base_addr)), simde_mm512_i64gather_epi64_vindex_.m256i[1], (scale)); \
|
||||
simde__m512i_from_private(simde_mm512_i64gather_epi64_r_); \
|
||||
}))
|
||||
#elif defined(SIMDE_X86_AVX2_NATIVE) && !defined(SIMDE_STATEMENT_EXPR_)
|
||||
#define simde_mm512_i64gather_epi64(vindex, base_addr, scale) \
|
||||
simde_x_mm512_set_m256i( \
|
||||
_mm256_i64gather_epi64(HEDLEY_STATIC_CAST(long long const*, (base_addr)), \
|
||||
simde_mm512_extracti32x8_epi32((vindex), 1), (scale)), \
|
||||
_mm256_i64gather_epi64(HEDLEY_STATIC_CAST(long long const*, (base_addr)), \
|
||||
simde_mm512_extracti32x8_epi32((vindex), 0), (scale)) )
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_i64gather_epi64
|
||||
#define _mm512_i64gather_epi64(vindex, base_addr, scale) simde_mm512_i64gather_epi64(vindex, (base_addr), (scale))
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define simde_mm512_mask_i64gather_epi64(src, k, vindex, base_addr, scale) _mm512_mask_i64gather_epi64((src), (k), (vindex), (base_addr), (scale))
|
||||
#else
|
||||
#define simde_mm512_mask_i64gather_epi64(src, k, vindex, base_addr, scale) simde_mm512_mask_mov_epi64((src), (k), simde_mm512_i64gather_epi64((vindex), (base_addr), (scale)))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_i64gather_epi64
|
||||
#define _mm512_mask_i64gather_epi64(src, k, vindex, base_addr, scale) simde_mm512_mask_i64gather_epi64((src), (k), (vindex), (base_addr), (scale))
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_i64gather_pd(simde__m512i vindex, const void* base_addr, const int32_t scale)
|
||||
SIMDE_REQUIRE_CONSTANT(scale)
|
||||
HEDLEY_REQUIRE_MSG((scale && scale <= 8 && !(scale & (scale - 1))), "`scale' must be a power of two less than or equal to 8") {
|
||||
simde__m512i_private vindex_;
|
||||
simde__m512d_private r_;
|
||||
vindex_ = simde__m512i_to_private(vindex);
|
||||
r_ = simde__m512d_to_private(simde_mm512_setzero_pd());
|
||||
const uint8_t* addr = HEDLEY_REINTERPRET_CAST(const uint8_t*, base_addr);
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(vindex_.i64) / sizeof(vindex_.i64[0])) ; i++) {
|
||||
const uint8_t* src = addr + (HEDLEY_STATIC_CAST(size_t , vindex_.i64[i]) * HEDLEY_STATIC_CAST(size_t , scale));
|
||||
simde_float64 dst;
|
||||
simde_memcpy(&dst, src, sizeof(dst));
|
||||
r_.f64[i] = dst;
|
||||
}
|
||||
|
||||
return simde__m512d_from_private(r_);
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define simde_mm512_i64gather_pd(vindex, base_addr, scale) _mm512_i64gather_pd((vindex), (base_addr), (scale))
|
||||
#elif defined(SIMDE_X86_AVX2_NATIVE) && defined(SIMDE_STATEMENT_EXPR_)
|
||||
#define simde_mm512_i64gather_pd(vindex, base_addr, scale) SIMDE_STATEMENT_EXPR_(({\
|
||||
simde__m512d_private simde_mm512_i64gather_pd_r_; \
|
||||
simde__m512i_private simde_mm512_i64gather_pd_vindex_ = simde__m512i_to_private((vindex)); \
|
||||
simde_mm512_i64gather_pd_r_.m256d[0] = _mm256_i64gather_pd( \
|
||||
HEDLEY_STATIC_CAST(double const*, (base_addr)), simde_mm512_i64gather_pd_vindex_.m256i[0], (scale)); \
|
||||
simde_mm512_i64gather_pd_r_.m256d[1] = _mm256_i64gather_pd( \
|
||||
HEDLEY_STATIC_CAST(double const*, (base_addr)), simde_mm512_i64gather_pd_vindex_.m256i[1], (scale)); \
|
||||
simde__m512d_from_private(simde_mm512_i64gather_pd_r_); \
|
||||
}))
|
||||
#elif defined(SIMDE_X86_AVX2_NATIVE) && !defined(SIMDE_STATEMENT_EXPR_)
|
||||
#define simde_mm512_i64gather_pd(vindex, base_addr, scale) \
|
||||
simde_x_mm512_set_m256d( \
|
||||
_mm256_i64gather_pd(HEDLEY_STATIC_CAST(double const*, (base_addr)), \
|
||||
simde_mm512_extracti64x4_epi64((vindex), 1), (scale)), \
|
||||
_mm256_i64gather_pd(HEDLEY_STATIC_CAST(double const*, (base_addr)), \
|
||||
simde_mm512_extracti64x4_epi64((vindex), 0), (scale)) )
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_i64gather_pd
|
||||
#define _mm512_i64gather_pd(vindex, base_addr, scale) simde_mm512_i64gather_pd((vindex), (base_addr), (scale))
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define simde_mm512_mask_i64gather_pd(src, k, vindex, base_addr, scale) _mm512_mask_i64gather_pd((src), (k), (vindex), (base_addr), (scale))
|
||||
#else
|
||||
#define simde_mm512_mask_i64gather_pd(src, k, vindex, base_addr, scale) simde_mm512_mask_mov_pd((src), (k), simde_mm512_i64gather_pd((vindex), (base_addr), (scale)))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_i64gather_pd
|
||||
#define _mm512_mask_i64gather_pd(src, k, vindex, base_addr, scale) simde_mm512_mask_i64gather_pd((src), (k), (vindex), (base_addr), (scale))
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256
|
||||
simde_mm512_i64gather_ps(simde__m512i vindex, const void* base_addr, const int32_t scale)
|
||||
SIMDE_REQUIRE_CONSTANT(scale)
|
||||
HEDLEY_REQUIRE_MSG((scale && scale <= 8 && !(scale & (scale - 1))), "`scale' must be a power of two less than or equal to 8") {
|
||||
simde__m512i_private vindex_;
|
||||
simde__m256_private r_;
|
||||
vindex_ = simde__m512i_to_private(vindex);
|
||||
r_ = simde__m256_to_private(simde_mm256_setzero_ps());
|
||||
const uint8_t* addr = HEDLEY_REINTERPRET_CAST(const uint8_t*, base_addr);
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(vindex_.i64) / sizeof(vindex_.i64[0])) ; i++) {
|
||||
const uint8_t* src = addr + (HEDLEY_STATIC_CAST(size_t , vindex_.i64[i]) * HEDLEY_STATIC_CAST(size_t , scale));
|
||||
simde_float32 dst;
|
||||
simde_memcpy(&dst, src, sizeof(dst));
|
||||
r_.f32[i] = dst;
|
||||
}
|
||||
|
||||
return simde__m256_from_private(r_);
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define simde_mm512_i64gather_ps(vindex, base_addr, scale) _mm512_i64gather_ps((vindex), (base_addr), (scale))
|
||||
#elif defined(SIMDE_X86_AVX2_NATIVE) && defined(SIMDE_STATEMENT_EXPR_)
|
||||
#define simde_mm512_i64gather_ps(vindex, base_addr, scale) SIMDE_STATEMENT_EXPR_(({\
|
||||
simde__m256_private simde_mm512_i64gather_ps_r_; \
|
||||
simde__m512i_private simde_mm512_i64gather_ps_vindex_ = simde__m512i_to_private((vindex)); \
|
||||
simde_mm512_i64gather_ps_r_.m128[0] = _mm256_i64gather_ps( \
|
||||
HEDLEY_STATIC_CAST(float const*, (base_addr)), simde_mm512_i64gather_ps_vindex_.m256i[0], (scale)); \
|
||||
simde_mm512_i64gather_ps_r_.m128[1] = _mm256_i64gather_ps( \
|
||||
HEDLEY_STATIC_CAST(float const*, (base_addr)), simde_mm512_i64gather_ps_vindex_.m256i[1], (scale)); \
|
||||
simde__m256_from_private(simde_mm512_i64gather_ps_r_); \
|
||||
}))
|
||||
#elif defined(SIMDE_X86_AVX2_NATIVE) && !defined(SIMDE_STATEMENT_EXPR_)
|
||||
#define simde_mm512_i64gather_ps(vindex, base_addr, scale) \
|
||||
_mm256_insertf128_ps( \
|
||||
_mm256_castps128_ps256( \
|
||||
_mm256_i64gather_ps(HEDLEY_STATIC_CAST(float const*, (base_addr)), \
|
||||
simde_mm512_extracti64x4_epi64((vindex), 0), (scale))), \
|
||||
_mm256_i64gather_ps(HEDLEY_STATIC_CAST(float const*, (base_addr)), \
|
||||
simde_mm512_extracti64x4_epi64((vindex), 1), (scale)), \
|
||||
1)
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_i64gather_ps
|
||||
#define _mm512_i64gather_ps(vindex, base_addr, scale) simde_mm512_i64gather_ps((vindex), (base_addr), (scale))
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define simde_mm512_mask_i64gather_ps(src, k, vindex, base_addr, scale) _mm512_mask_i64gather_ps((src), (k), (vindex), (base_addr), (scale))
|
||||
#else
|
||||
#define simde_mm512_mask_i64gather_ps(src, k, vindex, base_addr, scale) simde_mm256_mask_mov_ps((src), (k), simde_mm512_i64gather_ps((vindex), (base_addr), (scale)))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_i64gather_ps
|
||||
#define _mm512_mask_i64gather_ps(src, k, vindex, base_addr, scale) simde_mm512_mask_i64gather_ps((src), (k), (vindex), (base_addr), (scale))
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_GATHER_H) */
|
||||
@@ -0,0 +1,490 @@
|
||||
/* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Copyright:
|
||||
* 2020 Evan Nemerson <evan@nemerson.com>
|
||||
* 2020 Christopher Moore <moore@free.fr>
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512_INSERT_H)
|
||||
#define SIMDE_X86_AVX512_INSERT_H
|
||||
|
||||
#include "types.h"
|
||||
#include "mov.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_insertf32x4 (simde__m512 a, simde__m128 b, int imm8)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 3) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
simde__m512 r;
|
||||
switch(imm8) {
|
||||
case 0: r = _mm512_insertf32x4(a, b, 0); break;
|
||||
case 1: r = _mm512_insertf32x4(a, b, 1); break;
|
||||
case 2: r = _mm512_insertf32x4(a, b, 2); break;
|
||||
case 3: r = _mm512_insertf32x4(a, b, 3); break;
|
||||
default: HEDLEY_UNREACHABLE(); r = simde_mm512_setzero_ps(); break;
|
||||
}
|
||||
return r;
|
||||
#else
|
||||
simde__m512_private a_ = simde__m512_to_private(a);
|
||||
|
||||
a_.m128[imm8 & 3] = b;
|
||||
|
||||
return simde__m512_from_private(a_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_insertf32x4
|
||||
#define _mm512_insertf32x4(a, b, imm8) simde_mm512_insertf32x4(a, b, imm8)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_mask_insertf32x4 (simde__m512 src, simde__mmask16 k, simde__m512 a, simde__m128 b, int imm8)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 3) {
|
||||
simde__m512 r;
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && (!defined(HEDLEY_GCC_VERSION) || HEDLEY_GCC_VERSION_CHECK(8,0,0))
|
||||
SIMDE_CONSTIFY_4_(_mm512_mask_insertf32x4, r, (HEDLEY_UNREACHABLE(), simde_mm512_setzero_ps ()), imm8, src, k, a, b);
|
||||
return r;
|
||||
#else
|
||||
SIMDE_CONSTIFY_4_(simde_mm512_insertf32x4, r, (HEDLEY_UNREACHABLE(), simde_mm512_setzero_ps ()), imm8, a, b);
|
||||
return simde_mm512_mask_mov_ps(src, k, r);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_insertf32x4
|
||||
#define _mm512_mask_insertf32x4(src, k, a, b, imm8) simde_mm512_mask_insertf32x4(src, k, a, b, imm8)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_maskz_insertf32x4 (simde__mmask16 k, simde__m512 a, simde__m128 b, int imm8)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 3) {
|
||||
simde__m512 r;
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && (!defined(HEDLEY_GCC_VERSION) || HEDLEY_GCC_VERSION_CHECK(8,0,0))
|
||||
SIMDE_CONSTIFY_4_(_mm512_maskz_insertf32x4, r, (HEDLEY_UNREACHABLE(), simde_mm512_setzero_ps ()), imm8, k, a, b);
|
||||
return r;
|
||||
#else
|
||||
SIMDE_CONSTIFY_4_(simde_mm512_insertf32x4, r, (HEDLEY_UNREACHABLE(), simde_mm512_setzero_ps ()), imm8, a, b);
|
||||
return simde_mm512_maskz_mov_ps(k, r);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_insertf32x4
|
||||
#define _mm512_maskz_insertf32x4(k, a, b, imm8) simde_mm512_maskz_insertf32x4(k, a, b, imm8)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_insertf64x4 (simde__m512d a, simde__m256d b, int imm8)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 1) {
|
||||
simde__m512d_private a_ = simde__m512d_to_private(a);
|
||||
|
||||
a_.m256d[imm8 & 1] = b;
|
||||
|
||||
return simde__m512d_from_private(a_);
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define simde_mm512_insertf64x4(a, b, imm8) _mm512_insertf64x4(a, b, imm8)
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_insertf64x4
|
||||
#define _mm512_insertf64x4(a, b, imm8) simde_mm512_insertf64x4(a, b, imm8)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_mask_insertf64x4 (simde__m512d src, simde__mmask8 k, simde__m512d a, simde__m256d b, int imm8)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 1) {
|
||||
simde__m512d r;
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
SIMDE_CONSTIFY_2_(_mm512_mask_insertf64x4, r, (HEDLEY_UNREACHABLE(), simde_mm512_setzero_pd ()), imm8, src, k, a, b);
|
||||
return r;
|
||||
#else
|
||||
SIMDE_CONSTIFY_2_(simde_mm512_insertf64x4, r, (HEDLEY_UNREACHABLE(), simde_mm512_setzero_pd ()), imm8, a, b);
|
||||
return simde_mm512_mask_mov_pd(src, k, r);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_insertf64x4
|
||||
#define _mm512_mask_insertf64x4(src, k, a, b, imm8) simde_mm512_mask_insertf64x4(src, k, a, b, imm8)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_maskz_insertf64x4 (simde__mmask8 k, simde__m512d a, simde__m256d b, int imm8)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 1) {
|
||||
simde__m512d r;
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
SIMDE_CONSTIFY_2_(_mm512_maskz_insertf64x4, r, (HEDLEY_UNREACHABLE(), simde_mm512_setzero_pd ()), imm8, k, a, b);
|
||||
return r;
|
||||
#else
|
||||
SIMDE_CONSTIFY_2_(simde_mm512_insertf64x4, r, (HEDLEY_UNREACHABLE(), simde_mm512_setzero_pd ()), imm8, a, b);
|
||||
return simde_mm512_maskz_mov_pd(k, r);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_insertf64x4
|
||||
#define _mm512_maskz_insertf64x4(k, a, b, imm8) simde_mm512_maskz_insertf64x4(k, a, b, imm8)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_inserti32x4 (simde__m512i a, simde__m128i b, int imm8)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 3) {
|
||||
simde__m512i_private a_ = simde__m512i_to_private(a);
|
||||
|
||||
a_.m128i[imm8 & 3] = b;
|
||||
|
||||
return simde__m512i_from_private(a_);
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define simde_mm512_inserti32x4(a, b, imm8) _mm512_inserti32x4(a, b, imm8)
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_inserti32x4
|
||||
#define _mm512_inserti32x4(a, b, imm8) simde_mm512_inserti32x4(a, b, imm8)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_inserti32x4 (simde__m512i src, simde__mmask16 k, simde__m512i a, simde__m128i b, int imm8)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 3) {
|
||||
simde__m512i r;
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && (!defined(HEDLEY_GCC_VERSION) || HEDLEY_GCC_VERSION_CHECK(8,0,0))
|
||||
SIMDE_CONSTIFY_4_(_mm512_mask_inserti32x4, r, (HEDLEY_UNREACHABLE(), simde_mm512_setzero_si512 ()), imm8, src, k, a, b);
|
||||
return r;
|
||||
#else
|
||||
SIMDE_CONSTIFY_4_(simde_mm512_inserti32x4, r, (HEDLEY_UNREACHABLE(), simde_mm512_setzero_si512 ()), imm8, a, b);
|
||||
return simde_mm512_mask_mov_epi32(src, k, r);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_inserti32x4
|
||||
#define _mm512_mask_inserti32x4(src, k, a, b, imm8) simde_mm512_mask_inserti32x4(src, k, a, b, imm8)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_inserti32x4 (simde__mmask16 k, simde__m512i a, simde__m128i b, int imm8)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 3) {
|
||||
simde__m512i r;
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && (!defined(HEDLEY_GCC_VERSION) || HEDLEY_GCC_VERSION_CHECK(8,0,0))
|
||||
SIMDE_CONSTIFY_4_(_mm512_maskz_inserti32x4, r, (HEDLEY_UNREACHABLE(), simde_mm512_setzero_si512 ()), imm8, k, a, b);
|
||||
return r;
|
||||
#else
|
||||
SIMDE_CONSTIFY_4_(simde_mm512_inserti32x4, r, (HEDLEY_UNREACHABLE(), simde_mm512_setzero_si512 ()), imm8, a, b);
|
||||
return simde_mm512_maskz_mov_epi32(k, r);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_inserti32x4
|
||||
#define _mm512_maskz_inserti32x4(k, a, b, imm8) simde_mm512_maskz_inserti32x4(k, a, b, imm8)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_inserti64x4 (simde__m512i a, simde__m256i b, int imm8)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 1) {
|
||||
simde__m512i_private a_ = simde__m512i_to_private(a);
|
||||
|
||||
a_.m256i[imm8 & 1] = b;
|
||||
|
||||
return simde__m512i_from_private(a_);
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define simde_mm512_inserti64x4(a, b, imm8) _mm512_inserti64x4(a, b, imm8)
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_inserti64x4
|
||||
#define _mm512_inserti64x4(a, b, imm8) simde_mm512_inserti64x4(a, b, imm8)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_inserti64x4 (simde__m512i src, simde__mmask8 k, simde__m512i a, simde__m256i b, int imm8)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 2) {
|
||||
simde__m512i r;
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
SIMDE_CONSTIFY_2_(_mm512_mask_inserti64x4, r, (HEDLEY_UNREACHABLE(), simde_mm512_setzero_si512 ()), imm8, src, k, a, b);
|
||||
return r;
|
||||
#else
|
||||
SIMDE_CONSTIFY_2_(simde_mm512_inserti64x4, r, (HEDLEY_UNREACHABLE(), simde_mm512_setzero_si512 ()), imm8, a, b);
|
||||
return simde_mm512_mask_mov_epi64(src, k, r);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_inserti64x4
|
||||
#define _mm512_mask_inserti64x4(src, k, a, b, imm8) simde_mm512_mask_inserti64x4(src, k, a, b, imm8)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_inserti64x4 (simde__mmask8 k, simde__m512i a, simde__m256i b, int imm8)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 2) {
|
||||
simde__m512i r;
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
SIMDE_CONSTIFY_2_(_mm512_maskz_inserti64x4, r, (HEDLEY_UNREACHABLE(), simde_mm512_setzero_si512 ()), imm8, k, a, b);
|
||||
return r;
|
||||
#else
|
||||
SIMDE_CONSTIFY_2_(simde_mm512_inserti64x4, r, (HEDLEY_UNREACHABLE(), simde_mm512_setzero_si512 ()), imm8, a, b);
|
||||
return simde_mm512_maskz_mov_epi64(k, r);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_inserti64x4
|
||||
#define _mm512_maskz_inserti64x4(k, a, b, imm8) simde_mm512_maskz_inserti64x4(k, a, b, imm8)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_insertf32x8 (simde__m512 a, simde__m256 b, int imm8)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 1) {
|
||||
simde__m512_private a_ = simde__m512_to_private(a);
|
||||
|
||||
a_.m256[imm8 & 1] = b;
|
||||
|
||||
return simde__m512_from_private(a_);
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
#define simde_mm512_insertf32x8(a, b, imm8) _mm512_insertf32x8(a, b, imm8)
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_insertf32x8
|
||||
#define _mm512_insertf32x8(a, b, imm8) simde_mm512_insertf32x8(a, b, imm8)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_mask_insertf32x8(simde__m512 src, simde__mmask16 k, simde__m512 a, simde__m256 b, const int imm8) {
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
simde__m512 r;
|
||||
SIMDE_CONSTIFY_2_(_mm512_mask_insertf32x8, r, (HEDLEY_UNREACHABLE(), simde_mm512_setzero_ps ()), imm8, src, k, a, b);
|
||||
return r;
|
||||
#else
|
||||
simde__m512 r;
|
||||
SIMDE_CONSTIFY_2_(simde_mm512_insertf32x8, r, (HEDLEY_UNREACHABLE(), simde_mm512_setzero_ps ()), imm8, a, b);
|
||||
return simde_mm512_mask_mov_ps(src, k, r);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_insertf32x8
|
||||
#define _mm512_mask_insertf32x8(src, k, a, b, imm8) simde_mm512_mask_insertf32x8(src, k, a, b, imm8)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_maskz_insertf32x8(simde__mmask16 k, simde__m512 a, simde__m256 b, const int imm8) {
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
simde__m512 r;
|
||||
SIMDE_CONSTIFY_2_(_mm512_maskz_insertf32x8, r, (HEDLEY_UNREACHABLE(), simde_mm512_setzero_ps ()), imm8, k, a, b);
|
||||
return r;
|
||||
#else
|
||||
simde__m512 r;
|
||||
SIMDE_CONSTIFY_2_(simde_mm512_insertf32x8, r, (HEDLEY_UNREACHABLE(), simde_mm512_setzero_ps ()), imm8, a, b);
|
||||
return simde_mm512_maskz_mov_ps(k, r);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_insertf32x8
|
||||
#define _mm512_maskz_insertf32x8(k, a, b, imm8) simde_mm512_maskz_insertf32x8(k, a, b, imm8)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_insertf64x2 (simde__m512d a, simde__m128d b, int imm8)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 3) {
|
||||
simde__m512d_private a_ = simde__m512d_to_private(a);
|
||||
|
||||
a_.m128d[imm8 & 3] = b;
|
||||
|
||||
return simde__m512d_from_private(a_);
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
#define simde_mm512_insertf64x2(a, b, imm8) _mm512_insertf64x2(a, b, imm8)
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_insertf64x2
|
||||
#define _mm512_insertf64x2(a, b, imm8) simde_mm512_insertf64x2(a, b, imm8)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_mask_insertf64x2(simde__m512d src, simde__mmask8 k, simde__m512d a, simde__m128d b, const int imm8) {
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
simde__m512d r;
|
||||
SIMDE_CONSTIFY_4_(_mm512_mask_insertf64x2, r, (HEDLEY_UNREACHABLE(), simde_mm512_setzero_pd ()), imm8, src, k, a, b);
|
||||
return r;
|
||||
#else
|
||||
simde__m512d r;
|
||||
SIMDE_CONSTIFY_4_(simde_mm512_insertf64x2, r, (HEDLEY_UNREACHABLE(), simde_mm512_setzero_pd ()), imm8, a, b);
|
||||
return simde_mm512_mask_mov_pd(src, k, r);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_insertf64x2
|
||||
#define _mm512_mask_insertf64x2(src, k, a, b, imm8) simde_mm512_mask_insertf64x2(src, k, a, b, imm8)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_maskz_insertf64x2(simde__mmask8 k, simde__m512d a, simde__m128d b, const int imm8) {
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
simde__m512d r;
|
||||
SIMDE_CONSTIFY_4_(_mm512_maskz_insertf64x2, r, (HEDLEY_UNREACHABLE(), simde_mm512_setzero_pd ()), imm8, k, a, b);
|
||||
return r;
|
||||
#else
|
||||
simde__m512d r;
|
||||
SIMDE_CONSTIFY_4_(simde_mm512_insertf64x2, r, (HEDLEY_UNREACHABLE(), simde_mm512_setzero_pd ()), imm8, a, b);
|
||||
return simde_mm512_maskz_mov_pd(k, r);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_insertf64x2
|
||||
#define _mm512_maskz_insertf64x2(k, a, b, imm8) simde_mm512_maskz_insertf64x2(k, a, b, imm8)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_inserti32x8 (simde__m512i a, simde__m256i b, int imm8)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 1) {
|
||||
simde__m512i_private a_ = simde__m512i_to_private(a);
|
||||
|
||||
a_.m256i[imm8 & 1] = b;
|
||||
|
||||
return simde__m512i_from_private(a_);
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
#define simde_mm512_inserti32x8(a, b, imm8) _mm512_inserti32x8(a, b, imm8)
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_inserti32x8
|
||||
#define _mm512_inserti32x8(a, b, imm8) simde_mm512_inserti32x8(a, b, imm8)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_inserti32x8(simde__m512i src, simde__mmask16 k, simde__m512i a, simde__m256i b, const int imm8) {
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
simde__m512i r;
|
||||
SIMDE_CONSTIFY_2_(_mm512_mask_inserti32x8, r, (HEDLEY_UNREACHABLE(), simde_mm512_setzero_epi32 ()), imm8, src, k, a, b);
|
||||
return r;
|
||||
#else
|
||||
simde__m512i r;
|
||||
SIMDE_CONSTIFY_2_(simde_mm512_inserti32x8, r, (HEDLEY_UNREACHABLE(), simde_mm512_setzero_epi32 ()), imm8, a, b);
|
||||
return simde_mm512_mask_mov_epi32(src, k, r);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_inserti32x8
|
||||
#define _mm512_mask_inserti32x8(src, k, a, b, imm8) simde_mm512_mask_inserti32x8(src, k, a, b, imm8)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_inserti32x8(simde__mmask16 k, simde__m512i a, simde__m256i b, const int imm8) {
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
simde__m512i r;
|
||||
SIMDE_CONSTIFY_2_(_mm512_maskz_inserti32x8, r, (HEDLEY_UNREACHABLE(), simde_mm512_setzero_epi32 ()), imm8, k, a, b);
|
||||
return r;
|
||||
#else
|
||||
simde__m512i r;
|
||||
SIMDE_CONSTIFY_2_(simde_mm512_inserti32x8, r, (HEDLEY_UNREACHABLE(), simde_mm512_setzero_epi32 ()), imm8, a, b);
|
||||
return simde_mm512_maskz_mov_epi32(k, r);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_inserti32x8
|
||||
#define _mm512_maskz_inserti32x8(k, a, b, imm8) simde_mm512_maskz_inserti32x8(k, a, b, imm8)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_inserti64x2 (simde__m512i a, simde__m128i b, int imm8)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 3) {
|
||||
simde__m512i_private a_ = simde__m512i_to_private(a);
|
||||
|
||||
a_.m128i[imm8 & 3] = b;
|
||||
|
||||
return simde__m512i_from_private(a_);
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
#define simde_mm512_inserti64x2(a, b, imm8) _mm512_inserti64x2(a, b, imm8)
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_inserti64x2
|
||||
#define _mm512_inserti64x2(a, b, imm8) simde_mm512_inserti64x2(a, b, imm8)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_inserti64x2(simde__m512i src, simde__mmask8 k, simde__m512i a, simde__m128i b, const int imm8) {
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
simde__m512i r;
|
||||
SIMDE_CONSTIFY_4_(_mm512_mask_inserti64x2, r, (HEDLEY_UNREACHABLE(), simde_mm512_setzero_si512 ()), imm8, src, k, a, b);
|
||||
return r;
|
||||
#else
|
||||
simde__m512i r;
|
||||
SIMDE_CONSTIFY_4_(simde_mm512_inserti64x2, r, (HEDLEY_UNREACHABLE(), simde_mm512_setzero_si512 ()), imm8, a, b);
|
||||
return simde_mm512_mask_mov_epi64(src, k, r);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_inserti64x2
|
||||
#define _mm512_mask_inserti64x2(src, k, a, b, imm8) simde_mm512_mask_inserti64x2(src, k, a, b, imm8)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_inserti64x2(simde__mmask8 k, simde__m512i a, simde__m128i b, const int imm8) {
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
simde__m512i r;
|
||||
SIMDE_CONSTIFY_4_(_mm512_maskz_inserti64x2, r, (HEDLEY_UNREACHABLE(), simde_mm512_setzero_si512 ()), imm8, k, a, b);
|
||||
return r;
|
||||
#else
|
||||
simde__m512i r;
|
||||
SIMDE_CONSTIFY_4_(simde_mm512_inserti64x2, r, (HEDLEY_UNREACHABLE(), simde_mm512_setzero_si512 ()), imm8, a, b);
|
||||
return simde_mm512_maskz_mov_epi64(k, r);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_inserti64x2
|
||||
#define _mm512_maskz_inserti64x2(k, a, b, imm8) simde_mm512_maskz_inserti64x2(k, a, b, imm8)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_INSERT_H) */
|
||||
@@ -0,0 +1,53 @@
|
||||
/* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Copyright:
|
||||
* 2023 Michael R. Crusoe <crusoe@debian.org>
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512_KAND_H)
|
||||
#define SIMDE_X86_AVX512_KAND_H
|
||||
|
||||
#include "types.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask16
|
||||
simde_mm512_kand (simde__mmask16 a, simde__mmask16 b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_kand(a, b);
|
||||
#else
|
||||
return a & b;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_kand
|
||||
#define _mm512_kand(a, b) simde_mm512_kand((a), (b))
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_KAND_H) */
|
||||
@@ -0,0 +1,106 @@
|
||||
/* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Copyright:
|
||||
* 2023 Michael R. Crusoe <crusoe@debian.org>
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512_KNOT_H)
|
||||
#define SIMDE_X86_AVX512_KNOT_H
|
||||
|
||||
#include "types.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask8
|
||||
simde_knot_mask8 (simde__mmask8 a) {
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE) \
|
||||
&& (!defined(__clang__) || SIMDE_DETECT_CLANG_VERSION_CHECK(8,0,0)) \
|
||||
&& (!defined(HEDLEY_MSVC_VERSION) || HEDLEY_MSVC_VERSION_CHECK(19,20,0))
|
||||
return _knot_mask8(a);
|
||||
#else
|
||||
return ~a;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _knot_mask8
|
||||
#define _knot_mask8(a) simde_knot_mask8(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask16
|
||||
simde_knot_mask16 (simde__mmask16 a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) \
|
||||
&& (!defined(__clang__) || SIMDE_DETECT_CLANG_VERSION_CHECK(8,0,0)) \
|
||||
&& (!defined(HEDLEY_MSVC_VERSION) || HEDLEY_MSVC_VERSION_CHECK(19,20,0))
|
||||
return _knot_mask16(a);
|
||||
#else
|
||||
return ~a;
|
||||
#endif
|
||||
}
|
||||
#define simde_mm512_knot(a) simde_knot_mask16(a)
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _knot_mask16
|
||||
#undef _mm512_knot
|
||||
#define _knot_mask16(a) simde_knot_mask16(a)
|
||||
#define _mm512_knot(a) simde_knot_mask16(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask32
|
||||
simde_knot_mask32 (simde__mmask32 a) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE) \
|
||||
&& (!defined(__clang__) || SIMDE_DETECT_CLANG_VERSION_CHECK(8,0,0)) \
|
||||
&& (!defined(HEDLEY_MSVC_VERSION) || HEDLEY_MSVC_VERSION_CHECK(19,20,0))
|
||||
return _knot_mask32(a);
|
||||
#else
|
||||
return ~a;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _knot_mask32
|
||||
#define _knot_mask32(a) simde_knot_mask32(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask64
|
||||
simde_knot_mask64 (simde__mmask64 a) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE) \
|
||||
&& (!defined(__clang__) || SIMDE_DETECT_CLANG_VERSION_CHECK(8,0,0)) \
|
||||
&& (!defined(HEDLEY_MSVC_VERSION) || HEDLEY_MSVC_VERSION_CHECK(19,20,0))
|
||||
return _knot_mask64(a);
|
||||
#else
|
||||
return ~a;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _knot_mask64
|
||||
#define _knot_mask64(a) simde_knot_mask64(a)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_KNOT_H) */
|
||||
@@ -0,0 +1,152 @@
|
||||
/* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Copyright:
|
||||
* 2020 Evan Nemerson <evan@nemerson.com>
|
||||
* 2020 Christopher Moore <moore@free.fr>
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512_KSHIFT_H)
|
||||
#define SIMDE_X86_AVX512_KSHIFT_H
|
||||
|
||||
#include "types.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask16
|
||||
simde_kshiftli_mask16 (simde__mmask16 a, unsigned int count)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(count, 0, 255) {
|
||||
return HEDLEY_STATIC_CAST(simde__mmask16, (count <= 15) ? (a << count) : 0);
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && (!defined(HEDLEY_GCC_VERSION) || HEDLEY_GCC_VERSION_CHECK(7,0,0)) && (!defined(SIMDE_DETECT_CLANG_VERSION) && SIMDE_DETECT_CLANG_VERSION_CHECK(8,0,0))
|
||||
#define simde_kshiftli_mask16(a, count) _kshiftli_mask16(a, count)
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _kshiftli_mask16
|
||||
#define _kshiftli_mask16(a, count) simde_kshiftli_mask16(a, count)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask32
|
||||
simde_kshiftli_mask32 (simde__mmask32 a, unsigned int count)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(count, 0, 255) {
|
||||
return (count <= 31) ? (a << count) : 0;
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE) && (!defined(HEDLEY_GCC_VERSION) || HEDLEY_GCC_VERSION_CHECK(7,0,0)) && (!defined(SIMDE_DETECT_CLANG_VERSION) && SIMDE_DETECT_CLANG_VERSION_CHECK(8,0,0))
|
||||
#define simde_kshiftli_mask32(a, count) _kshiftli_mask32(a, count)
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _kshiftli_mask32
|
||||
#define _kshiftli_mask32(a, count) simde_kshiftli_mask32(a, count)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask64
|
||||
simde_kshiftli_mask64 (simde__mmask64 a, unsigned int count)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(count, 0, 255) {
|
||||
return (count <= 63) ? (a << count) : 0;
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE) && (!defined(HEDLEY_GCC_VERSION) || HEDLEY_GCC_VERSION_CHECK(7,0,0)) && (!defined(SIMDE_DETECT_CLANG_VERSION) && SIMDE_DETECT_CLANG_VERSION_CHECK(8,0,0))
|
||||
#define simde_kshiftli_mask64(a, count) _kshiftli_mask64(a, count)
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _kshiftli_mask64
|
||||
#define _kshiftli_mask64(a, count) simde_kshiftli_mask64(a, count)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask8
|
||||
simde_kshiftli_mask8 (simde__mmask8 a, unsigned int count)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(count, 0, 255) {
|
||||
return HEDLEY_STATIC_CAST(simde__mmask8, (count <= 7) ? (a << count) : 0);
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE) && (!defined(HEDLEY_GCC_VERSION) || HEDLEY_GCC_VERSION_CHECK(7,0,0)) && (!defined(SIMDE_DETECT_CLANG_VERSION) && SIMDE_DETECT_CLANG_VERSION_CHECK(8,0,0))
|
||||
#define simde_kshiftli_mask8(a, count) _kshiftli_mask8(a, count)
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _kshiftli_mask8
|
||||
#define _kshiftli_mask8(a, count) simde_kshiftli_mask8(a, count)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask16
|
||||
simde_kshiftri_mask16 (simde__mmask16 a, unsigned int count)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(count, 0, 255) {
|
||||
return HEDLEY_STATIC_CAST(simde__mmask16, (count <= 15) ? (a >> count) : 0);
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && (!defined(HEDLEY_GCC_VERSION) || HEDLEY_GCC_VERSION_CHECK(7,0,0)) && (!defined(SIMDE_DETECT_CLANG_VERSION) && SIMDE_DETECT_CLANG_VERSION_CHECK(8,0,0))
|
||||
#define simde_kshiftri_mask16(a, count) _kshiftri_mask16(a, count)
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _kshiftri_mask16
|
||||
#define _kshiftri_mask16(a, count) simde_kshiftri_mask16(a, count)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask32
|
||||
simde_kshiftri_mask32 (simde__mmask32 a, unsigned int count)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(count, 0, 255) {
|
||||
return (count <= 31) ? (a >> count) : 0;
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE) && (!defined(HEDLEY_GCC_VERSION) || HEDLEY_GCC_VERSION_CHECK(7,0,0)) && (!defined(SIMDE_DETECT_CLANG_VERSION) && SIMDE_DETECT_CLANG_VERSION_CHECK(8,0,0))
|
||||
#define simde_kshiftri_mask32(a, count) _kshiftri_mask32(a, count)
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _kshiftri_mask32
|
||||
#define _kshiftri_mask32(a, count) simde_kshiftri_mask32(a, count)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask64
|
||||
simde_kshiftri_mask64 (simde__mmask64 a, unsigned int count)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(count, 0, 255) {
|
||||
return (count <= 63) ? (a >> count) : 0;
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE) && (!defined(HEDLEY_GCC_VERSION) || HEDLEY_GCC_VERSION_CHECK(7,0,0)) && (!defined(SIMDE_DETECT_CLANG_VERSION) && SIMDE_DETECT_CLANG_VERSION_CHECK(8,0,0))
|
||||
#define simde_kshiftri_mask64(a, count) _kshiftri_mask64(a, count)
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _kshiftri_mask64
|
||||
#define _kshiftri_mask64(a, count) simde_kshiftri_mask64(a, count)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask8
|
||||
simde_kshiftri_mask8 (simde__mmask8 a, unsigned int count)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(count, 0, 255) {
|
||||
return HEDLEY_STATIC_CAST(simde__mmask8, (count <= 7) ? (a >> count) : 0);
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE) && (!defined(HEDLEY_GCC_VERSION) || HEDLEY_GCC_VERSION_CHECK(7,0,0)) && (!defined(SIMDE_DETECT_CLANG_VERSION) && SIMDE_DETECT_CLANG_VERSION_CHECK(8,0,0))
|
||||
#define simde_kshiftri_mask8(a, count) _kshiftri_mask8(a, count)
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _kshiftri_mask8
|
||||
#define _kshiftri_mask8(a, count) simde_kshiftri_mask8(a, count)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_KSHIFT_H) */
|
||||
@@ -0,0 +1,107 @@
|
||||
/* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Copyright:
|
||||
* 2023 Michael R. Crusoe <crusoe@debian.org>
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512_KXOR_H)
|
||||
#define SIMDE_X86_AVX512_KXOR_H
|
||||
|
||||
#include "types.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask8
|
||||
simde_kxor_mask8 (simde__mmask8 a, simde__mmask8 b) {
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE) \
|
||||
&& (!defined(__clang__) || SIMDE_DETECT_CLANG_VERSION_CHECK(8,0,0)) \
|
||||
&& (!defined(HEDLEY_MSVC_VERSION) || HEDLEY_MSVC_VERSION_CHECK(19,20,0))
|
||||
return _kxor_mask8(a, b);
|
||||
#else
|
||||
return a^b;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _kxor_mask8
|
||||
#define _kxor_mask8(a, b) simde_kxor_mask8(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask16
|
||||
simde_kxor_mask16 (simde__mmask16 a, simde__mmask16 b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) \
|
||||
&& (!defined(__clang__) || SIMDE_DETECT_CLANG_VERSION_CHECK(8,0,0)) \
|
||||
&& (!defined(HEDLEY_MSVC_VERSION) || HEDLEY_MSVC_VERSION_CHECK(19,20,0))
|
||||
return _kxor_mask16(a, b);
|
||||
#else
|
||||
return a^b;
|
||||
#endif
|
||||
}
|
||||
#define simde_mm512_kxor(a, b) simde_kxor_mask16(a, b)
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _kxor_mask16
|
||||
#undef _mm512_kxor
|
||||
#define _kxor_mask16(a, b) simde_kxor_mask16(a, b)
|
||||
#define _mm512_kxor(a, b) simde_kxor_mask16(a, b)
|
||||
#endif
|
||||
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask32
|
||||
simde_kxor_mask32 (simde__mmask32 a, simde__mmask32 b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE) \
|
||||
&& (!defined(__clang__) || SIMDE_DETECT_CLANG_VERSION_CHECK(8,0,0)) \
|
||||
&& (!defined(HEDLEY_MSVC_VERSION) || HEDLEY_MSVC_VERSION_CHECK(19,20,0))
|
||||
return _kxor_mask32(a, b);
|
||||
#else
|
||||
return a^b;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _kxor_mask32
|
||||
#define _kxor_mask32(a, b) simde_kxor_mask32(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask64
|
||||
simde_kxor_mask64 (simde__mmask64 a, simde__mmask64 b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE) \
|
||||
&& (!defined(__clang__) || SIMDE_DETECT_CLANG_VERSION_CHECK(8,0,0)) \
|
||||
&& (!defined(HEDLEY_MSVC_VERSION) || HEDLEY_MSVC_VERSION_CHECK(19,20,0))
|
||||
return _kxor_mask64(a, b);
|
||||
#else
|
||||
return a^b;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _kxor_mask64
|
||||
#define _kxor_mask64(a, b) simde_kxor_mask64(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_KXOR_H) */
|
||||
@@ -0,0 +1,115 @@
|
||||
/* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Copyright:
|
||||
* 2020 Evan Nemerson <evan@nemerson.com>
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512_LOAD_H)
|
||||
#define SIMDE_X86_AVX512_LOAD_H
|
||||
|
||||
#include "types.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_load_pd (void const * mem_addr) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_load_pd(SIMDE_ALIGN_ASSUME_LIKE(mem_addr, simde__m512d));
|
||||
#else
|
||||
simde__m512d r;
|
||||
simde_memcpy(&r, SIMDE_ALIGN_ASSUME_LIKE(mem_addr, simde__m512d), sizeof(r));
|
||||
return r;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_load_pd
|
||||
#define _mm512_load_pd(a) simde_mm512_load_pd(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_load_ps (void const * mem_addr) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_load_ps(SIMDE_ALIGN_ASSUME_LIKE(mem_addr, simde__m512));
|
||||
#else
|
||||
simde__m512 r;
|
||||
simde_memcpy(&r, SIMDE_ALIGN_ASSUME_LIKE(mem_addr, simde__m512), sizeof(r));
|
||||
return r;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_load_ps
|
||||
#define _mm512_load_ps(a) simde_mm512_load_ps(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512h
|
||||
simde_mm512_load_ph (void const * mem_addr) {
|
||||
#if defined(SIMDE_X86_AVX512FP16_NATIVE)
|
||||
return _mm512_load_ph(SIMDE_ALIGN_ASSUME_LIKE(mem_addr, simde__m512h));
|
||||
#else
|
||||
simde__m512h r;
|
||||
simde_memcpy(&r, SIMDE_ALIGN_ASSUME_LIKE(mem_addr, simde__m512h), sizeof(r));
|
||||
return r;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512FP16_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_load_ph
|
||||
#define _mm512_load_ph(a) simde_mm512_load_ph(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_load_si512 (void const * mem_addr) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_load_si512(SIMDE_ALIGN_ASSUME_LIKE(mem_addr, simde__m512i));
|
||||
#else
|
||||
simde__m512i r;
|
||||
simde_memcpy(&r, SIMDE_ALIGN_ASSUME_LIKE(mem_addr, simde__m512i), sizeof(r));
|
||||
return r;
|
||||
#endif
|
||||
}
|
||||
#define simde_mm512_load_epi8(mem_addr) simde_mm512_load_si512(mem_addr)
|
||||
#define simde_mm512_load_epi16(mem_addr) simde_mm512_load_si512(mem_addr)
|
||||
#define simde_mm512_load_epi32(mem_addr) simde_mm512_load_si512(mem_addr)
|
||||
#define simde_mm512_load_epi64(mem_addr) simde_mm512_load_si512(mem_addr)
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_load_epi8
|
||||
#undef _mm512_load_epi16
|
||||
#undef _mm512_load_epi32
|
||||
#undef _mm512_load_epi64
|
||||
#undef _mm512_load_si512
|
||||
#define _mm512_load_si512(a) simde_mm512_load_si512(a)
|
||||
#define _mm512_load_epi8(a) simde_mm512_load_si512(a)
|
||||
#define _mm512_load_epi16(a) simde_mm512_load_si512(a)
|
||||
#define _mm512_load_epi32(a) simde_mm512_load_si512(a)
|
||||
#define _mm512_load_epi64(a) simde_mm512_load_si512(a)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_LOAD_H) */
|
||||
@@ -0,0 +1,297 @@
|
||||
/* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Copyright:
|
||||
* 2020 Evan Nemerson <evan@nemerson.com>
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512_LOADU_H)
|
||||
#define SIMDE_X86_AVX512_LOADU_H
|
||||
|
||||
#include "types.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_loadu_ps (void const * mem_addr) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#if defined(SIMDE_BUG_CLANG_REV_298042)
|
||||
return _mm512_loadu_ps(SIMDE_ALIGN_CAST(const float *, mem_addr));
|
||||
#else
|
||||
return _mm512_loadu_ps(mem_addr);
|
||||
#endif
|
||||
#else
|
||||
simde__m512 r;
|
||||
simde_memcpy(&r, mem_addr, sizeof(r));
|
||||
return r;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_loadu_ps
|
||||
#define _mm512_loadu_ps(a) simde_mm512_loadu_ps(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_loadu_pd (void const * mem_addr) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#if defined(SIMDE_BUG_CLANG_REV_298042)
|
||||
return _mm512_loadu_pd(SIMDE_ALIGN_CAST(const double *, mem_addr));
|
||||
#else
|
||||
return _mm512_loadu_pd(mem_addr);
|
||||
#endif
|
||||
#else
|
||||
simde__m512d r;
|
||||
simde_memcpy(&r, mem_addr, sizeof(r));
|
||||
return r;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_loadu_pd
|
||||
#define _mm512_loadu_pd(a) simde_mm512_loadu_pd(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512h
|
||||
simde_mm512_loadu_ph (void const * mem_addr) {
|
||||
#if defined(SIMDE_X86_AVX512FP16_NATIVE)
|
||||
return _mm512_loadu_ph(mem_addr);
|
||||
#else
|
||||
simde__m512h r;
|
||||
simde_memcpy(&r, mem_addr, sizeof(r));
|
||||
return r;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512FP16_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_loadu_ph
|
||||
#define _mm512_loadu_ph(a) simde_mm512_loadu_ph(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_loadu_si512 (void const * mem_addr) {
|
||||
simde__m512i r;
|
||||
#if HEDLEY_GNUC_HAS_ATTRIBUTE(may_alias,3,3,0)
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DIAGNOSTIC_DISABLE_PACKED_
|
||||
struct simde_mm512_loadu_si512_s {
|
||||
__typeof__(r) v;
|
||||
} __attribute__((__packed__, __may_alias__));
|
||||
r = HEDLEY_REINTERPRET_CAST(const struct simde_mm512_loadu_si512_s *, mem_addr)->v;
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
#else
|
||||
simde_memcpy(&r, mem_addr, sizeof(r));
|
||||
#endif
|
||||
|
||||
return r;
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && (!defined(HEDLEY_GCC_VERSION) || HEDLEY_GCC_VERSION_CHECK(10,0,0)) && (!defined(__clang__) || SIMDE_DETECT_CLANG_VERSION_CHECK(8,0,0))
|
||||
#define simde_mm512_loadu_si512(mem_addr) _mm512_loadu_si512(mem_addr)
|
||||
#define simde_mm512_loadu_epi32(mem_addr) _mm512_loadu_epi32(mem_addr)
|
||||
#define simde_mm512_loadu_epi64(mem_addr) _mm512_loadu_epi64(mem_addr)
|
||||
#else
|
||||
#define simde_mm512_loadu_epi32(mem_addr) simde_mm512_loadu_si512(mem_addr)
|
||||
#define simde_mm512_loadu_epi64(mem_addr) simde_mm512_loadu_si512(mem_addr)
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE) && (!defined(HEDLEY_GCC_VERSION) || HEDLEY_GCC_VERSION_CHECK(11,0,0)) && (!defined(__clang__) || SIMDE_DETECT_CLANG_VERSION_CHECK(8,0,0))
|
||||
#define simde_mm512_loadu_epi8(mem_addr) _mm512_loadu_epi8(mem_addr)
|
||||
#define simde_mm512_loadu_epi16(mem_addr) _mm512_loadu_epi16(mem_addr)
|
||||
#else
|
||||
#define simde_mm512_loadu_epi8(mem_addr) simde_mm512_loadu_si512(mem_addr)
|
||||
#define simde_mm512_loadu_epi16(mem_addr) simde_mm512_loadu_si512(mem_addr)
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_loadu_epi8
|
||||
#undef _mm512_loadu_epi16
|
||||
#define _mm512_loadu_epi8(a) simde_mm512_loadu_epi8(a)
|
||||
#define _mm512_loadu_epi16(a) simde_mm512_loadu_epi16(a)
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_loadu_epi32
|
||||
#undef _mm512_loadu_epi64
|
||||
#undef _mm512_loadu_si512
|
||||
#define _mm512_loadu_si512(a) simde_mm512_loadu_si512(a)
|
||||
#define _mm512_loadu_epi32(a) simde_mm512_loadu_epi32(a)
|
||||
#define _mm512_loadu_epi64(a) simde_mm512_loadu_epi64(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_maskz_loadu_epi16 (simde__mmask16 k, void const * mem_addr) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_maskz_loadu_epi16(k, HEDLEY_REINTERPRET_CAST(void const*, mem_addr));
|
||||
#else
|
||||
return simde_mm256_maskz_mov_epi16(k, simde_mm256_loadu_epi16(mem_addr));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_maskz_loadu_epi16
|
||||
#define _mm256_maskz_loadu_epi16(k, mem_addr) simde_mm256_maskz_loadu_epi16(k, mem_addr)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256
|
||||
simde_mm256_maskz_loadu_ps (simde__mmask8 k, void const * mem_addr) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_maskz_loadu_ps(k, HEDLEY_REINTERPRET_CAST(void const*, mem_addr));
|
||||
#else
|
||||
return simde_mm256_maskz_mov_ps(k, simde_mm256_loadu_ps(HEDLEY_REINTERPRET_CAST(const float*, mem_addr)));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_maskz_loadu_ps
|
||||
#define _mm256_maskz_loadu_ps(k, mem_addr) simde_mm256_maskz_loadu_ps(k, mem_addr)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_loadu_epi16 (simde__m512i src, simde__mmask32 k, void const * mem_addr) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_mask_loadu_epi16(src, k, HEDLEY_REINTERPRET_CAST(void const*, mem_addr));
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi16(src, k, simde_mm512_loadu_epi16(mem_addr));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_loadu_epi16
|
||||
#define _mm512_mask_loadu_epi16(src, k, mem_addr) simde_mm512_mask_loadu_epi16(src, k, mem_addr)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_loadu_epi16 (simde__mmask32 k, void const * mem_addr) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_maskz_loadu_epi16(k, HEDLEY_REINTERPRET_CAST(void const*, mem_addr));
|
||||
#else
|
||||
return simde_mm512_maskz_mov_epi16(k, simde_mm512_loadu_epi16(mem_addr));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_loadu_epi16
|
||||
#define _mm512_maskz_loadu_epi16(k, mem_addr) simde_mm512_maskz_loadu_epi16(k, mem_addr)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_loadu_epi32 (simde__m512i src, simde__mmask16 k, void const * mem_addr) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_loadu_epi32(src, k, HEDLEY_REINTERPRET_CAST(void const*, mem_addr));
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi32(src, k, simde_mm512_loadu_epi32(mem_addr));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_loadu_epi32
|
||||
#define _mm512_mask_loadu_epi32(src, k, mem_addr) simde_mm512_mask_loadu_epi32(src, k, mem_addr)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_loadu_epi64 (simde__m512i src, simde__mmask8 k, void const * mem_addr) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_loadu_epi64(src, k, HEDLEY_REINTERPRET_CAST(void const*, mem_addr));
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi64(src, k, simde_mm512_loadu_epi64(mem_addr));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_loadu_epi64
|
||||
#define _mm512_mask_loadu_epi64(src, k, mem_addr) simde_mm512_mask_loadu_epi64(src, k, mem_addr)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_loadu_epi64 (simde__mmask8 k, void const * mem_addr) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_maskz_loadu_epi64(k, HEDLEY_REINTERPRET_CAST(void const*, mem_addr));
|
||||
#else
|
||||
return simde_mm512_maskz_mov_epi64(k, simde_mm512_loadu_epi64(mem_addr));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_loadu_epi64
|
||||
#define _mm512_maskz_loadu_epi64(k, mem_addr) simde_mm512_maskz_loadu_epi64((k), (mem_addr))
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_mask_loadu_pd (simde__m512d src, simde__mmask8 k, void const * mem_addr) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_loadu_pd(src, k, HEDLEY_REINTERPRET_CAST(void const*, mem_addr));
|
||||
#else
|
||||
return simde_mm512_mask_mov_pd(src, k, simde_mm512_loadu_pd(mem_addr));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_loadu_pd
|
||||
#define _mm512_mask_loadu_pd(src, k, mem_addr) simde_mm512_mask_loadu_pd(src, k, mem_addr)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_mask_loadu_ps (simde__m512 src, simde__mmask16 k, void const * mem_addr) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_loadu_ps(src, k, HEDLEY_REINTERPRET_CAST(void const*, mem_addr));
|
||||
#else
|
||||
return simde_mm512_mask_mov_ps(src, k, simde_mm512_loadu_ps(mem_addr));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_loadu_ps
|
||||
#define _mm512_mask_loadu_ps(src, k, mem_addr) simde_mm512_mask_loadu_ps(src, k, mem_addr)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_maskz_loadu_ps (simde__mmask16 k, void const * mem_addr) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_maskz_loadu_ps(k, HEDLEY_REINTERPRET_CAST(void const*, mem_addr));
|
||||
#else
|
||||
return simde_mm512_maskz_mov_ps(k, simde_mm512_loadu_ps(mem_addr));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_loadu_ps
|
||||
#define _mm512_maskz_loadu_ps(k, mem_addr) simde_mm512_maskz_loadu_ps(k, mem_addr)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_maskz_loadu_pd (simde__mmask8 k, void const * mem_addr) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_maskz_loadu_pd(k, HEDLEY_REINTERPRET_CAST(void const*, mem_addr));
|
||||
#else
|
||||
return simde_mm512_maskz_mov_pd(k, simde_mm512_loadu_pd(mem_addr));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_loadu_pd
|
||||
#define _mm512_maskz_loadu_pd(k, mem_addr) simde_mm512_maskz_loadu_pd(k, mem_addr)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_LOADU_H) */
|
||||
@@ -0,0 +1,220 @@
|
||||
/* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Copyright:
|
||||
* 2020 Evan Nemerson <evan@nemerson.com>
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512_LZCNT_H)
|
||||
#define SIMDE_X86_AVX512_LZCNT_H
|
||||
|
||||
#include "types.h"
|
||||
#include "mov.h"
|
||||
#if HEDLEY_MSVC_VERSION_CHECK(14,0,0)
|
||||
#include <intrin.h>
|
||||
#pragma intrinsic(_BitScanReverse)
|
||||
#if defined(_M_AMD64) || defined(_M_ARM64)
|
||||
#pragma intrinsic(_BitScanReverse64)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
#if \
|
||||
( HEDLEY_HAS_BUILTIN(__builtin_clz) || \
|
||||
HEDLEY_GCC_VERSION_CHECK(3,4,0) || \
|
||||
HEDLEY_ARM_VERSION_CHECK(4,1,0) ) && \
|
||||
defined(__INT_MAX__) && defined(__LONG_MAX__) && defined(__LONG_LONG_MAX__) && \
|
||||
defined(__INT32_MAX__) && defined(__INT64_MAX__)
|
||||
#if __INT_MAX__ == __INT32_MAX__
|
||||
#define simde_x_clz32(v) __builtin_clz(HEDLEY_STATIC_CAST(unsigned int, (v)))
|
||||
#elif __LONG_MAX__ == __INT32_MAX__
|
||||
#define simde_x_clz32(v) __builtin_clzl(HEDLEY_STATIC_CAST(unsigned long, (v)))
|
||||
#elif __LONG_LONG_MAX__ == __INT32_MAX__
|
||||
#define simde_x_clz32(v) __builtin_clzll(HEDLEY_STATIC_CAST(unsigned long long, (v)))
|
||||
#endif
|
||||
|
||||
#if __INT_MAX__ == __INT64_MAX__
|
||||
#define simde_x_clz64(v) __builtin_clz(HEDLEY_STATIC_CAST(unsigned int, (v)))
|
||||
#elif __LONG_MAX__ == __INT64_MAX__
|
||||
#define simde_x_clz64(v) __builtin_clzl(HEDLEY_STATIC_CAST(unsigned long, (v)))
|
||||
#elif __LONG_LONG_MAX__ == __INT64_MAX__
|
||||
#define simde_x_clz64(v) __builtin_clzll(HEDLEY_STATIC_CAST(unsigned long long, (v)))
|
||||
#endif
|
||||
#elif HEDLEY_MSVC_VERSION_CHECK(14,0,0)
|
||||
static int simde_x_clz32(uint32_t x) {
|
||||
unsigned long r;
|
||||
_BitScanReverse(&r, x);
|
||||
return 31 - HEDLEY_STATIC_CAST(int, r);
|
||||
}
|
||||
#define simde_x_clz32 simde_x_clz32
|
||||
|
||||
static int simde_x_clz64(uint64_t x) {
|
||||
unsigned long r;
|
||||
|
||||
#if defined(_M_AMD64) || defined(_M_ARM64)
|
||||
_BitScanReverse64(&r, x);
|
||||
return 63 - HEDLEY_STATIC_CAST(int, r);
|
||||
#else
|
||||
uint32_t high = HEDLEY_STATIC_CAST(uint32_t, x >> 32);
|
||||
if (high != 0)
|
||||
return _BitScanReverse(&r, HEDLEY_STATIC_CAST(unsigned long, high));
|
||||
else
|
||||
return _BitScanReverse(&r, HEDLEY_STATIC_CAST(unsigned long, x & ~UINT32_C(0))) + 32;
|
||||
#endif
|
||||
}
|
||||
#define simde_x_clz64 simde_x_clz64
|
||||
#endif
|
||||
|
||||
#if !defined(simde_x_clz32) || !defined(simde_x_clz64)
|
||||
static uint8_t simde_x_avx512cd_lz_lookup(const uint8_t value) {
|
||||
static const uint8_t lut[256] = {
|
||||
7, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4,
|
||||
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
|
||||
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
||||
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
||||
};
|
||||
return lut[value];
|
||||
};
|
||||
|
||||
#if !defined(simde_x_clz32)
|
||||
static int simde_x_clz32(uint32_t x) {
|
||||
size_t s = sizeof(x) * 8;
|
||||
uint32_t r;
|
||||
|
||||
while ((s -= 8) != 0) {
|
||||
r = x >> s;
|
||||
if (r != 0)
|
||||
return simde_x_avx512cd_lz_lookup(HEDLEY_STATIC_CAST(uint8_t, r)) +
|
||||
(((sizeof(x) - 1) * 8) - s);
|
||||
}
|
||||
|
||||
if (x == 0)
|
||||
return (int) ((sizeof(x) * 8) - 1);
|
||||
else
|
||||
return simde_x_avx512cd_lz_lookup(HEDLEY_STATIC_CAST(uint8_t, x)) +
|
||||
((sizeof(x) - 1) * 8);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if !defined(simde_x_clz64)
|
||||
static int simde_x_clz64(uint64_t x) {
|
||||
size_t s = sizeof(x) * 8;
|
||||
uint64_t r;
|
||||
|
||||
while ((s -= 8) != 0) {
|
||||
r = x >> s;
|
||||
if (r != 0)
|
||||
return simde_x_avx512cd_lz_lookup(HEDLEY_STATIC_CAST(uint8_t, r)) +
|
||||
(((sizeof(x) - 1) * 8) - s);
|
||||
}
|
||||
|
||||
if (x == 0)
|
||||
return (int) ((sizeof(x) * 8) - 1);
|
||||
else
|
||||
return simde_x_avx512cd_lz_lookup(HEDLEY_STATIC_CAST(uint8_t, x)) +
|
||||
((sizeof(x) - 1) * 8);
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_lzcnt_epi32(simde__m128i a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512CD_NATIVE)
|
||||
return _mm_lzcnt_epi32(a);
|
||||
#elif defined(SIMDE_X86_SSE2_NATIVE)
|
||||
/* https://stackoverflow.com/a/58827596/501126 */
|
||||
a = _mm_andnot_si128(_mm_srli_epi32(a, 8), a);
|
||||
a = _mm_castps_si128(_mm_cvtepi32_ps(a));
|
||||
a = _mm_srli_epi32(a, 23);
|
||||
a = _mm_subs_epu16(_mm_set1_epi32(158), a);
|
||||
a = _mm_min_epi16(a, _mm_set1_epi32(32));
|
||||
return a;
|
||||
#else
|
||||
simde__m128i_private
|
||||
r_,
|
||||
a_ = simde__m128i_to_private(a);
|
||||
|
||||
#if defined(SIMDE_POWER_ALTIVEC_P8_NATIVE) || defined(SIMDE_ZARCH_ZVECTOR_13_NATIVE)
|
||||
r_.altivec_u32 = vec_cntlz(a_.altivec_u32);
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0; i < (sizeof(r_.i32) / sizeof(r_.i32[0])); i++) {
|
||||
r_.i32[i] = (HEDLEY_UNLIKELY(a_.i32[i] == 0) ? HEDLEY_STATIC_CAST(int32_t, sizeof(int32_t) * CHAR_BIT) : HEDLEY_STATIC_CAST(int32_t, simde_x_clz32(HEDLEY_STATIC_CAST(uint32_t, a_.i32[i]))));
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m128i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512CD_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_lzcnt_epi32
|
||||
#define _mm_lzcnt_epi32(a) simde_mm_lzcnt_epi32(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_mask_lzcnt_epi32(simde__m128i src, simde__mmask8 k, simde__m128i a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512CD_NATIVE)
|
||||
return _mm_mask_lzcnt_epi32(src, k, a);
|
||||
#else
|
||||
return simde_mm_mask_mov_epi32(src, k, simde_mm_lzcnt_epi32(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_lzcnt_epi32
|
||||
#define _mm_mask_lzcnt_epi32(src, k, a) simde_mm_mask_lzcnt_epi32(src, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_maskz_lzcnt_epi32(simde__mmask8 k, simde__m128i a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512CD_NATIVE)
|
||||
return _mm_maskz_lzcnt_epi32(k, a);
|
||||
#else
|
||||
return simde_mm_maskz_mov_epi32(k, simde_mm_lzcnt_epi32(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_maskz_lzcnt_epi32
|
||||
#define _mm_maskz_lzcnt_epi32(k, a) simde_mm_maskz_lzcnt_epi32(k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_LZCNT_H) */
|
||||
@@ -0,0 +1,157 @@
|
||||
/* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Copyright:
|
||||
* 2020 Evan Nemerson <evan@nemerson.com>
|
||||
* 2020 Ashleigh Newman-Jones <ashnewman-jones@hotmail.co.uk>
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512_MADD_H)
|
||||
#define SIMDE_X86_AVX512_MADD_H
|
||||
|
||||
#include "types.h"
|
||||
#include "mov.h"
|
||||
#include "../avx2.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_mask_madd_epi16 (simde__m128i src, simde__mmask8 k, simde__m128i a, simde__m128i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_mask_madd_epi16(src, k, a, b);
|
||||
#else
|
||||
return simde_mm_mask_mov_epi32(src, k, simde_mm_madd_epi16(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_madd_epi16
|
||||
#define _mm_mask_madd_epi16(src, k, a, b) simde_mm_mask_madd_epi16(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_maskz_madd_epi16 (simde__mmask8 k, simde__m128i a, simde__m128i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_maskz_madd_epi16(k, a, b);
|
||||
#else
|
||||
return simde_mm_maskz_mov_epi32(k, simde_mm_madd_epi16(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_maskz_madd_epi16
|
||||
#define _mm_maskz_madd_epi16(k, a, b) simde_mm_maskz_madd_epi16(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_mask_madd_epi16 (simde__m256i src, simde__mmask8 k, simde__m256i a, simde__m256i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_mask_madd_epi16(src, k, a, b);
|
||||
#else
|
||||
return simde_mm256_mask_mov_epi32(src, k, simde_mm256_madd_epi16(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_mask_madd_epi16
|
||||
#define _mm256_mask_madd_epi16(src, k, a, b) simde_mm256_mask_madd_epi16(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_maskz_madd_epi16 (simde__mmask8 k, simde__m256i a, simde__m256i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_maskz_madd_epi16(k, a, b);
|
||||
#else
|
||||
return simde_mm256_maskz_mov_epi32(k, simde_mm256_madd_epi16(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_maskz_madd_epi16
|
||||
#define _mm256_maskz_madd_epi16(k, a, b) simde_mm256_maskz_madd_epi16(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_madd_epi16 (simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_madd_epi16(a, b);
|
||||
#else
|
||||
simde__m512i_private r_,
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b);
|
||||
|
||||
#if 0 && SIMDE_NATURAL_VECTOR_SIZE_LE(256) || defined(SIMDE_BUG_CLANG_BAD_MADD)
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m256i) / sizeof(r_.m256i[0])) ; i++) {
|
||||
r_.m256i[i] = simde_mm256_madd_epi16(a_.m256i[i], b_.m256i[i]);
|
||||
}
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_) / sizeof(r_.i16[0])) ; i += 2) {
|
||||
r_.i32[i / 2] =
|
||||
(HEDLEY_STATIC_CAST(int32_t, a_.i16[ i ]) * HEDLEY_STATIC_CAST(int32_t, b_.i16[ i ])) +
|
||||
(HEDLEY_STATIC_CAST(int32_t, a_.i16[i + 1]) * HEDLEY_STATIC_CAST(int32_t, b_.i16[i + 1]));
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_madd_epi16
|
||||
#define _mm512_madd_epi16(a, b) simde_mm512_madd_epi16(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_madd_epi16 (simde__m512i src, simde__mmask16 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_mask_madd_epi16(src, k, a, b);
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi32(src, k, simde_mm512_madd_epi16(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_madd_epi16
|
||||
#define _mm512_mask_madd_epi16(src, k, a, b) simde_mm512_mask_madd_epi16(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_madd_epi16 (simde__mmask16 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_maskz_madd_epi16(k, a, b);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_epi32(k, simde_mm512_madd_epi16(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_madd_epi16
|
||||
#define _mm512_maskz_madd_epi16(k, a, b) simde_mm512_maskz_madd_epi16(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_MADD_H) */
|
||||
@@ -0,0 +1,159 @@
|
||||
/* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Copyright:
|
||||
* 2020 Evan Nemerson <evan@nemerson.com>
|
||||
* 2020 Ashleigh Newman-Jones <ashnewman-jones@hotmail.co.uk>
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512_MADDUBS_H)
|
||||
#define SIMDE_X86_AVX512_MADDUBS_H
|
||||
|
||||
#include "types.h"
|
||||
#include "mov.h"
|
||||
#include "../avx2.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_mask_maddubs_epi16 (simde__m128i src, simde__mmask8 k, simde__m128i a, simde__m128i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_mask_maddubs_epi16(src, k, a, b);
|
||||
#else
|
||||
return simde_mm_mask_mov_epi16(src, k, simde_mm_maddubs_epi16(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_maddubs_epi16
|
||||
#define _mm_mask_maddubs_epi16(src, k, a, b) simde_mm_mask_maddubs_epi16(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_maskz_maddubs_epi16 (simde__mmask8 k, simde__m128i a, simde__m128i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE ) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_maskz_maddubs_epi16(k, a, b);
|
||||
#else
|
||||
return simde_mm_maskz_mov_epi16(k, simde_mm_maddubs_epi16(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_maskz_maddubs_epi16
|
||||
#define _mm_maskz_maddubs_epi16(k, a, b) simde_mm_maskz_maddubs_epi16(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_mask_maddubs_epi16 (simde__m256i src, simde__mmask16 k, simde__m256i a, simde__m256i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_mask_maddubs_epi16(src, k, a, b);
|
||||
#else
|
||||
return simde_mm256_mask_mov_epi16(src, k, simde_mm256_maddubs_epi16(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_mask_maddubs_epi16
|
||||
#define _mm256_mask_maddubs_epi16(src, k, a, b) simde_mm256_mask_maddubs_epi16(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_maskz_maddubs_epi16 (simde__mmask16 k, simde__m256i a, simde__m256i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_maskz_maddubs_epi16(k, a, b);
|
||||
#else
|
||||
return simde_mm256_maskz_mov_epi16(k, simde_mm256_maddubs_epi16(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_maskz_maddubs_epi16
|
||||
#define _mm256_maskz_maddubs_epi16(k, a, b) simde_mm256_maskz_maddubs_epi16(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maddubs_epi16 (simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_maddubs_epi16(a, b);
|
||||
#else
|
||||
simde__m512i_private r_,
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b);
|
||||
|
||||
#if SIMDE_NATURAL_VECTOR_SIZE_LE(256) || defined(SIMDE_BUG_CLANG_BAD_MADD)
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m256i) / sizeof(r_.m256i[0])) ; i++) {
|
||||
r_.m256i[i] = simde_mm256_maddubs_epi16(a_.m256i[i], b_.m256i[i]);
|
||||
}
|
||||
#else
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i16) / sizeof(r_.i16[0])) ; i++) {
|
||||
const int idx = HEDLEY_STATIC_CAST(int, i) << 1;
|
||||
int32_t ts =
|
||||
(HEDLEY_STATIC_CAST(int16_t, a_.u8[ idx ]) * HEDLEY_STATIC_CAST(int16_t, b_.i8[ idx ])) +
|
||||
(HEDLEY_STATIC_CAST(int16_t, a_.u8[idx + 1]) * HEDLEY_STATIC_CAST(int16_t, b_.i8[idx + 1]));
|
||||
r_.i16[i] = (ts > INT16_MIN) ? ((ts < INT16_MAX) ? HEDLEY_STATIC_CAST(int16_t, ts) : INT16_MAX) : INT16_MIN;
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maddubs_epi16
|
||||
#define _mm512_maddubs_epi16(a, b) simde_mm512_maddubs_epi16(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_maddubs_epi16 (simde__m512i src, simde__mmask32 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_mask_maddubs_epi16(src, k, a, b);
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi16(src, k, simde_mm512_maddubs_epi16(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_maddubs_epi16
|
||||
#define _mm512_mask_maddubs_epi16(src, k, a, b) simde_mm512_mask_maddubs_epi16(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_maddubs_epi16 (simde__mmask32 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_maskz_maddubs_epi16(k, a, b);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_epi16(k, simde_mm512_maddubs_epi16(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_maddubs_epi16
|
||||
#define _mm512_maskz_maddubs_epi16(k, a, b) simde_mm512_maskz_maddubs_epi16(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_MADDUBS_H) */
|
||||
@@ -0,0 +1,611 @@
|
||||
/* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Copyright:
|
||||
* 2020 Evan Nemerson <evan@nemerson.com>
|
||||
* 2020 Hidayat Khan <huk2209@gmail.com>
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512_MAX_H)
|
||||
#define SIMDE_X86_AVX512_MAX_H
|
||||
|
||||
#include "types.h"
|
||||
#include "../avx2.h"
|
||||
#include "mov.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_max_epi8 (simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_max_epi8(a, b);
|
||||
#else
|
||||
simde__m512i_private
|
||||
r_,
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b);
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i8) / sizeof(r_.i8[0])) ; i++) {
|
||||
r_.i8[i] = (a_.i8[i] > b_.i8[i]) ? a_.i8[i] : b_.i8[i];
|
||||
}
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
# define _mm512_max_epi8(a, b) simde_mm512_max_epi8(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_max_epi8 (simde__m512i src, simde__mmask64 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_mask_max_epi8(src, k, a, b);
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi8(src, k, simde_mm512_max_epi8(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_max_epi8
|
||||
#define _mm512_mask_max_epi8(src, k, a, b) simde_mm512_mask_max_epi8(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_max_epi8 (simde__mmask64 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_maskz_max_epi8(k, a, b);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_epi8(k, simde_mm512_max_epi8(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_max_epi8
|
||||
#define _mm512_maskz_max_epi8(k, a, b) simde_mm512_maskz_max_epi8(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_max_epu8 (simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_max_epu8(a, b);
|
||||
#else
|
||||
simde__m512i_private
|
||||
r_,
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b);
|
||||
|
||||
#if SIMDE_NATURAL_VECTOR_SIZE_LE(256)
|
||||
for (size_t i = 0 ; i < (sizeof(a_.m256i) / sizeof(a_.m256i[0])) ; i++) {
|
||||
r_.m256i[i] = simde_mm256_max_epu8(a_.m256i[i], b_.m256i[i]);
|
||||
}
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.u8) / sizeof(r_.u8[0])) ; i++) {
|
||||
r_.u8[i] = (a_.u8[i] > b_.u8[i]) ? a_.u8[i] : b_.u8[i];
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_max_epu8
|
||||
#define _mm512_max_epu8(a, b) simde_mm512_max_epu8(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_max_epu8 (simde__m512i src, simde__mmask64 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_mask_max_epu8(src, k, a, b);
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi8(src, k, simde_mm512_max_epu8(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_max_epu8
|
||||
#define _mm512_mask_max_epu8(src, k, a, b) simde_mm512_mask_max_epu8(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_max_epu8 (simde__mmask64 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_maskz_max_epu8(k, a, b);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_epi8(k, simde_mm512_max_epu8(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_max_epu8
|
||||
#define _mm512_maskz_max_epu8(k, a, b) simde_mm512_maskz_max_epu8(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_max_epi16 (simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_max_epi16(a, b);
|
||||
#else
|
||||
simde__m512i_private
|
||||
r_,
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b);
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i16) / sizeof(r_.i16[0])) ; i++) {
|
||||
r_.i16[i] = (a_.i16[i] > b_.i16[i]) ? a_.i16[i] : b_.i16[i];
|
||||
}
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
# define _mm512_max_epi16(a, b) simde_mm512_max_epi16(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_max_epi16 (simde__m512i src, simde__mmask32 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_mask_max_epi16(src, k, a, b);
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi16(src, k, simde_mm512_max_epi16(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_max_epi16
|
||||
#define _mm512_mask_max_epi16(src, k, a, b) simde_mm512_mask_max_epi16(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_max_epi16 (simde__mmask32 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_maskz_max_epi16(k, a, b);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_epi16(k, simde_mm512_max_epi16(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_max_epi16
|
||||
#define _mm512_maskz_max_epi16(k, a, b) simde_mm512_maskz_max_epi16(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_max_epu16 (simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_max_epu16(a, b);
|
||||
#else
|
||||
simde__m512i_private
|
||||
r_,
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b);
|
||||
|
||||
#if SIMDE_NATURAL_VECTOR_SIZE_LE(256)
|
||||
for (size_t i = 0 ; i < (sizeof(a_.m256i) / sizeof(a_.m256i[0])) ; i++) {
|
||||
r_.m256i[i] = simde_mm256_max_epu16(a_.m256i[i], b_.m256i[i]);
|
||||
}
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.u16) / sizeof(r_.u16[0])) ; i++) {
|
||||
r_.u16[i] = (a_.u16[i] > b_.u16[i]) ? a_.u16[i] : b_.u16[i];
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_max_epu16
|
||||
#define _mm512_max_epu16(a, b) simde_mm512_max_epu16(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_max_epu16 (simde__m512i src, simde__mmask32 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_mask_max_epu16(src, k, a, b);
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi16(src, k, simde_mm512_max_epu16(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_max_epu16
|
||||
#define _mm512_mask_max_epu16(src, k, a, b) simde_mm512_mask_max_epu16(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_max_epu16 (simde__mmask32 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_maskz_max_epu16(k, a, b);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_epi16(k, simde_mm512_max_epu16(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_max_epu16
|
||||
#define _mm512_maskz_max_epu16(k, a, b) simde_mm512_maskz_max_epu16(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_max_epi32 (simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_max_epi32(a, b);
|
||||
#else
|
||||
simde__m512i_private
|
||||
r_,
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b);
|
||||
|
||||
#if defined(SIMDE_X86_AVX2_NATIVE)
|
||||
r_.m256i[0] = simde_mm256_max_epi32(a_.m256i[0], b_.m256i[0]);
|
||||
r_.m256i[1] = simde_mm256_max_epi32(a_.m256i[1], b_.m256i[1]);
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i32) / sizeof(r_.i32[0])) ; i++) {
|
||||
r_.i32[i] = a_.i32[i] > b_.i32[i] ? a_.i32[i] : b_.i32[i];
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_max_epi32
|
||||
#define _mm512_max_epi32(a, b) simde_mm512_max_epi32(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_max_epi32(simde__m512i src, simde__mmask16 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_max_epi32(src, k, a, b);
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi32(src, k, simde_mm512_max_epi32(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_max_epi32
|
||||
#define _mm512_mask_max_epi32(src, k, a, b) simde_mm512_mask_max_epi32(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_max_epi32(simde__mmask16 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_maskz_max_epi32(k, a, b);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_epi32(k, simde_mm512_max_epi32(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_max_epi32
|
||||
#define _mm512_maskz_max_epi32(k, a, b) simde_mm512_maskz_max_epi32(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_max_epu32 (simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_max_epu32(a, b);
|
||||
#else
|
||||
simde__m512i_private
|
||||
r_,
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b);
|
||||
|
||||
#if defined(SIMDE_X86_AVX2_NATIVE)
|
||||
r_.m256i[0] = simde_mm256_max_epu32(a_.m256i[0], b_.m256i[0]);
|
||||
r_.m256i[1] = simde_mm256_max_epu32(a_.m256i[1], b_.m256i[1]);
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.u32) / sizeof(r_.u32[0])) ; i++) {
|
||||
r_.u32[i] = (a_.u32[i] > b_.u32[i]) ? a_.u32[i] : b_.u32[i];
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_max_epu32
|
||||
#define _mm512_max_epu32(a, b) simde_mm512_max_epu32(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_max_epu32(simde__m512i src, simde__mmask16 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_max_epu32(src, k, a, b);
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi32(src, k, simde_mm512_max_epu32(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_max_epu32
|
||||
#define _mm512_mask_max_epu32(src, k, a, b) simde_mm512_mask_max_epu32(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_max_epu32(simde__mmask16 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_maskz_max_epu32(k, a, b);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_epi32(k, simde_mm512_max_epu32(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_max_epu32
|
||||
#define _mm512_maskz_max_epu32(k, a, b) simde_mm512_maskz_max_epu32(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_max_epi64 (simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_max_epi64(a, b);
|
||||
#else
|
||||
simde__m512i_private
|
||||
r_,
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b);
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i64) / sizeof(r_.i64[0])) ; i++) {
|
||||
r_.i64[i] = a_.i64[i] > b_.i64[i] ? a_.i64[i] : b_.i64[i];
|
||||
}
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_max_epi64
|
||||
#define _mm512_max_epi64(a, b) simde_mm512_max_epi64(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_max_epi64(simde__m512i src, simde__mmask8 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_max_epi64(src, k, a, b);
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi64(src, k, simde_mm512_max_epi64(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_max_epi64
|
||||
#define _mm512_mask_max_epi64(src, k, a, b) simde_mm512_mask_max_epi64(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_max_epi64(simde__mmask8 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_maskz_max_epi64(k, a, b);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_epi64(k, simde_mm512_max_epi64(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_max_epi64
|
||||
#define _mm512_maskz_max_epi64(k, a, b) simde_mm512_maskz_max_epi64(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_max_epu64 (simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_max_epu64(a, b);
|
||||
#else
|
||||
simde__m512i_private
|
||||
r_,
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b);
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.u64) / sizeof(r_.u64[0])) ; i++) {
|
||||
r_.u64[i] = (a_.u64[i] > b_.u64[i]) ? a_.u64[i] : b_.u64[i];
|
||||
}
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_max_epu64
|
||||
#define _mm512_max_epu64(a, b) simde_mm512_max_epu64(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_max_epu64(simde__m512i src, simde__mmask8 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_max_epu64(src, k, a, b);
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi64(src, k, simde_mm512_max_epu64(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_max_epu64
|
||||
#define _mm512_mask_max_epu64(src, k, a, b) simde_mm512_mask_max_epu64(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_max_epu64(simde__mmask8 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_maskz_max_epu64(k, a, b);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_epi64(k, simde_mm512_max_epu64(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_max_epu64
|
||||
#define _mm512_maskz_max_epu64(k, a, b) simde_mm512_maskz_max_epu64(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_max_ps (simde__m512 a, simde__m512 b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_max_ps(a, b);
|
||||
#else
|
||||
simde__m512_private
|
||||
r_,
|
||||
a_ = simde__m512_to_private(a),
|
||||
b_ = simde__m512_to_private(b);
|
||||
|
||||
#if defined(SIMDE_X86_AVX2_NATIVE)
|
||||
r_.m256[0] = simde_mm256_max_ps(a_.m256[0], b_.m256[0]);
|
||||
r_.m256[1] = simde_mm256_max_ps(a_.m256[1], b_.m256[1]);
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.f32) / sizeof(r_.f32[0])) ; i++) {
|
||||
r_.f32[i] = a_.f32[i] > b_.f32[i] ? a_.f32[i] : b_.f32[i];
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_max_ps
|
||||
#define _mm512_max_ps(a, b) simde_mm512_max_ps(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_mask_max_ps(simde__m512 src, simde__mmask16 k, simde__m512 a, simde__m512 b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_max_ps(src, k, a, b);
|
||||
#else
|
||||
return simde_mm512_mask_mov_ps(src, k, simde_mm512_max_ps(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_max_ps
|
||||
#define _mm512_mask_max_ps(src, k, a, b) simde_mm512_mask_max_ps(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_maskz_max_ps(simde__mmask16 k, simde__m512 a, simde__m512 b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_maskz_max_ps(k, a, b);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_ps(k, simde_mm512_max_ps(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_max_ps
|
||||
#define _mm512_maskz_max_ps(k, a, b) simde_mm512_maskz_max_ps(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_max_pd (simde__m512d a, simde__m512d b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_max_pd(a, b);
|
||||
#else
|
||||
simde__m512d_private
|
||||
r_,
|
||||
a_ = simde__m512d_to_private(a),
|
||||
b_ = simde__m512d_to_private(b);
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.f64) / sizeof(r_.f64[0])) ; i++) {
|
||||
r_.f64[i] = a_.f64[i] > b_.f64[i] ? a_.f64[i] : b_.f64[i];
|
||||
}
|
||||
|
||||
return simde__m512d_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_max_pd
|
||||
#define _mm512_max_pd(a, b) simde_mm512_max_pd(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512h
|
||||
simde_mm512_max_ph (simde__m512h a, simde__m512h b) {
|
||||
#if defined(SIMDE_X86_AVX512FP16_NATIVE)
|
||||
return _mm512_max_ph(a, b);
|
||||
#else
|
||||
simde__m512h_private
|
||||
r_,
|
||||
a_ = simde__m512h_to_private(a),
|
||||
b_ = simde__m512h_to_private(b);
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.f16) / sizeof(r_.f16[0])) ; i++) {
|
||||
r_.f16[i] = simde_float16_to_float32(a_.f16[i]) > simde_float16_to_float32(b_.f16[i]) ? a_.f16[i] : b_.f16[i];
|
||||
}
|
||||
|
||||
return simde__m512h_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512FP16_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_max_ph
|
||||
#define _mm512_max_ph(a, b) simde_mm512_max_ph(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_mask_max_pd(simde__m512d src, simde__mmask8 k, simde__m512d a, simde__m512d b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_max_pd(src, k, a, b);
|
||||
#else
|
||||
return simde_mm512_mask_mov_pd(src, k, simde_mm512_max_pd(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_max_pd
|
||||
#define _mm512_mask_max_pd(src, k, a, b) simde_mm512_mask_max_pd(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_maskz_max_pd(simde__mmask8 k, simde__m512d a, simde__m512d b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_maskz_max_pd(k, a, b);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_pd(k, simde_mm512_max_pd(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_max_pd
|
||||
#define _mm512_maskz_max_pd(k, a, b) simde_mm512_maskz_max_pd(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_MAX_H) */
|
||||
@@ -0,0 +1,611 @@
|
||||
/* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Copyright:
|
||||
* 2020 Evan Nemerson <evan@nemerson.com>
|
||||
* 2020 Hidayat Khan <huk2209@gmail.com>
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512_MIN_H)
|
||||
#define SIMDE_X86_AVX512_MIN_H
|
||||
|
||||
#include "types.h"
|
||||
#include "../avx2.h"
|
||||
#include "mov.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_min_epi8 (simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_min_epi8(a, b);
|
||||
#else
|
||||
simde__m512i_private
|
||||
r_,
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b);
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i8) / sizeof(r_.i8[0])) ; i++) {
|
||||
r_.i8[i] = (a_.i8[i] < b_.i8[i]) ? a_.i8[i] : b_.i8[i];
|
||||
}
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
# define _mm512_min_epi8(a, b) simde_mm512_min_epi8(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_min_epi8 (simde__m512i src, simde__mmask64 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_mask_min_epi8(src, k, a, b);
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi8(src, k, simde_mm512_min_epi8(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_min_epi8
|
||||
#define _mm512_mask_min_epi8(src, k, a, b) simde_mm512_mask_min_epi8(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_min_epi8 (simde__mmask64 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_maskz_min_epi8(k, a, b);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_epi8(k, simde_mm512_min_epi8(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_min_epi8
|
||||
#define _mm512_maskz_min_epi8(k, a, b) simde_mm512_maskz_min_epi8(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_min_epu8 (simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_min_epu8(a, b);
|
||||
#else
|
||||
simde__m512i_private
|
||||
r_,
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b);
|
||||
|
||||
#if SIMDE_NATURAL_VECTOR_SIZE_LE(256)
|
||||
for (size_t i = 0 ; i < (sizeof(a_.m256i) / sizeof(a_.m256i[0])) ; i++) {
|
||||
r_.m256i[i] = simde_mm256_min_epu8(a_.m256i[i], b_.m256i[i]);
|
||||
}
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.u8) / sizeof(r_.u8[0])) ; i++) {
|
||||
r_.u8[i] = (a_.u8[i] < b_.u8[i]) ? a_.u8[i] : b_.u8[i];
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_min_epu8
|
||||
#define _mm512_min_epu8(a, b) simde_mm512_min_epu8(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_min_epu8 (simde__m512i src, simde__mmask64 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_mask_min_epu8(src, k, a, b);
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi8(src, k, simde_mm512_min_epu8(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_min_epu8
|
||||
#define _mm512_mask_min_epu8(src, k, a, b) simde_mm512_mask_min_epu8(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_min_epu8 (simde__mmask64 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_maskz_min_epu8(k, a, b);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_epi8(k, simde_mm512_min_epu8(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_min_epu8
|
||||
#define _mm512_maskz_min_epu8(k, a, b) simde_mm512_maskz_min_epu8(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_min_epi16 (simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_min_epi16(a, b);
|
||||
#else
|
||||
simde__m512i_private
|
||||
r_,
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b);
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i16) / sizeof(r_.i16[0])) ; i++) {
|
||||
r_.i16[i] = (a_.i16[i] < b_.i16[i]) ? a_.i16[i] : b_.i16[i];
|
||||
}
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
# define _mm512_min_epi16(a, b) simde_mm512_min_epi16(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_min_epi16 (simde__m512i src, simde__mmask32 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_mask_min_epi16(src, k, a, b);
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi16(src, k, simde_mm512_min_epi16(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_min_epi16
|
||||
#define _mm512_mask_min_epi16(src, k, a, b) simde_mm512_mask_min_epi16(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_min_epi16 (simde__mmask32 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_maskz_min_epi16(k, a, b);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_epi16(k, simde_mm512_min_epi16(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_min_epi16
|
||||
#define _mm512_maskz_min_epi16(k, a, b) simde_mm512_maskz_min_epi16(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_min_epu16 (simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_min_epu16(a, b);
|
||||
#else
|
||||
simde__m512i_private
|
||||
r_,
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b);
|
||||
|
||||
#if SIMDE_NATURAL_VECTOR_SIZE_LE(256)
|
||||
for (size_t i = 0 ; i < (sizeof(a_.m256i) / sizeof(a_.m256i[0])) ; i++) {
|
||||
r_.m256i[i] = simde_mm256_min_epu16(a_.m256i[i], b_.m256i[i]);
|
||||
}
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.u16) / sizeof(r_.u16[0])) ; i++) {
|
||||
r_.u16[i] = (a_.u16[i] < b_.u16[i]) ? a_.u16[i] : b_.u16[i];
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_min_epu16
|
||||
#define _mm512_min_epu16(a, b) simde_mm512_min_epu16(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_min_epu16 (simde__m512i src, simde__mmask32 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_mask_min_epu16(src, k, a, b);
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi16(src, k, simde_mm512_min_epu16(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_min_epu16
|
||||
#define _mm512_mask_min_epu16(src, k, a, b) simde_mm512_mask_min_epu16(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_min_epu16 (simde__mmask32 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_maskz_min_epu16(k, a, b);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_epi16(k, simde_mm512_min_epu16(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_min_epu16
|
||||
#define _mm512_maskz_min_epu16(k, a, b) simde_mm512_maskz_min_epu16(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_min_epi32 (simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_min_epi32(a, b);
|
||||
#else
|
||||
simde__m512i_private
|
||||
r_,
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b);
|
||||
|
||||
#if defined(SIMDE_X86_AVX2_NATIVE)
|
||||
r_.m256i[0] = simde_mm256_min_epi32(a_.m256i[0], b_.m256i[0]);
|
||||
r_.m256i[1] = simde_mm256_min_epi32(a_.m256i[1], b_.m256i[1]);
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i32) / sizeof(r_.i32[0])) ; i++) {
|
||||
r_.i32[i] = a_.i32[i] < b_.i32[i] ? a_.i32[i] : b_.i32[i];
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_min_epi32
|
||||
#define _mm512_min_epi32(a, b) simde_mm512_min_epi32(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_min_epi32(simde__m512i src, simde__mmask16 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_min_epi32(src, k, a, b);
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi32(src, k, simde_mm512_min_epi32(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_min_epi32
|
||||
#define _mm512_mask_min_epi32(src, k, a, b) simde_mm512_mask_min_epi32(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_min_epi32(simde__mmask16 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_maskz_min_epi32(k, a, b);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_epi32(k, simde_mm512_min_epi32(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_min_epi32
|
||||
#define _mm512_maskz_min_epi32(k, a, b) simde_mm512_maskz_min_epi32(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_min_epu32 (simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_min_epu32(a, b);
|
||||
#else
|
||||
simde__m512i_private
|
||||
r_,
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b);
|
||||
|
||||
#if defined(SIMDE_X86_AVX2_NATIVE)
|
||||
r_.m256i[0] = simde_mm256_min_epu32(a_.m256i[0], b_.m256i[0]);
|
||||
r_.m256i[1] = simde_mm256_min_epu32(a_.m256i[1], b_.m256i[1]);
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.u32) / sizeof(r_.u32[0])) ; i++) {
|
||||
r_.u32[i] = (a_.u32[i] < b_.u32[i]) ? a_.u32[i] : b_.u32[i];
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_min_epu32
|
||||
#define _mm512_min_epu32(a, b) simde_mm512_min_epu32(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_min_epu32(simde__m512i src, simde__mmask16 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_min_epu32(src, k, a, b);
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi32(src, k, simde_mm512_min_epu32(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_min_epu32
|
||||
#define _mm512_mask_min_epu32(src, k, a, b) simde_mm512_mask_min_epu32(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_min_epu32(simde__mmask16 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_maskz_min_epu32(k, a, b);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_epi32(k, simde_mm512_min_epu32(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_min_epu32
|
||||
#define _mm512_maskz_min_epu32(k, a, b) simde_mm512_maskz_min_epu32(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_min_epi64 (simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_min_epi64(a, b);
|
||||
#else
|
||||
simde__m512i_private
|
||||
r_,
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b);
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i64) / sizeof(r_.i64[0])) ; i++) {
|
||||
r_.i64[i] = a_.i64[i] < b_.i64[i] ? a_.i64[i] : b_.i64[i];
|
||||
}
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_min_epi64
|
||||
#define _mm512_min_epi64(a, b) simde_mm512_min_epi64(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_min_epi64(simde__m512i src, simde__mmask8 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_min_epi64(src, k, a, b);
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi64(src, k, simde_mm512_min_epi64(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_min_epi64
|
||||
#define _mm512_mask_min_epi64(src, k, a, b) simde_mm512_mask_min_epi64(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_min_epi64(simde__mmask8 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_maskz_min_epi64(k, a, b);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_epi64(k, simde_mm512_min_epi64(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_min_epi64
|
||||
#define _mm512_maskz_min_epi64(k, a, b) simde_mm512_maskz_min_epi64(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_min_epu64 (simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_min_epu64(a, b);
|
||||
#else
|
||||
simde__m512i_private
|
||||
r_,
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b);
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.u64) / sizeof(r_.u64[0])) ; i++) {
|
||||
r_.u64[i] = (a_.u64[i] < b_.u64[i]) ? a_.u64[i] : b_.u64[i];
|
||||
}
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_min_epu64
|
||||
#define _mm512_min_epu64(a, b) simde_mm512_min_epu64(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_min_epu64(simde__m512i src, simde__mmask8 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_min_epu64(src, k, a, b);
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi64(src, k, simde_mm512_min_epu64(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_min_epu64
|
||||
#define _mm512_mask_min_epu64(src, k, a, b) simde_mm512_mask_min_epu64(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_min_epu64(simde__mmask8 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_maskz_min_epu64(k, a, b);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_epi64(k, simde_mm512_min_epu64(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_min_epu64
|
||||
#define _mm512_maskz_min_epu64(k, a, b) simde_mm512_maskz_min_epu64(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_min_ps (simde__m512 a, simde__m512 b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_min_ps(a, b);
|
||||
#else
|
||||
simde__m512_private
|
||||
r_,
|
||||
a_ = simde__m512_to_private(a),
|
||||
b_ = simde__m512_to_private(b);
|
||||
|
||||
#if defined(SIMDE_X86_AVX2_NATIVE)
|
||||
r_.m256[0] = simde_mm256_min_ps(a_.m256[0], b_.m256[0]);
|
||||
r_.m256[1] = simde_mm256_min_ps(a_.m256[1], b_.m256[1]);
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.f32) / sizeof(r_.f32[0])) ; i++) {
|
||||
r_.f32[i] = a_.f32[i] < b_.f32[i] ? a_.f32[i] : b_.f32[i];
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_min_ps
|
||||
#define _mm512_min_ps(a, b) simde_mm512_min_ps(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_mask_min_ps(simde__m512 src, simde__mmask16 k, simde__m512 a, simde__m512 b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_min_ps(src, k, a, b);
|
||||
#else
|
||||
return simde_mm512_mask_mov_ps(src, k, simde_mm512_min_ps(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_min_ps
|
||||
#define _mm512_mask_min_ps(src, k, a, b) simde_mm512_mask_min_ps(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_maskz_min_ps(simde__mmask16 k, simde__m512 a, simde__m512 b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_maskz_min_ps(k, a, b);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_ps(k, simde_mm512_min_ps(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_min_ps
|
||||
#define _mm512_maskz_min_ps(k, a, b) simde_mm512_maskz_min_ps(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_min_pd (simde__m512d a, simde__m512d b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_min_pd(a, b);
|
||||
#else
|
||||
simde__m512d_private
|
||||
r_,
|
||||
a_ = simde__m512d_to_private(a),
|
||||
b_ = simde__m512d_to_private(b);
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.f64) / sizeof(r_.f64[0])) ; i++) {
|
||||
r_.f64[i] = a_.f64[i] < b_.f64[i] ? a_.f64[i] : b_.f64[i];
|
||||
}
|
||||
|
||||
return simde__m512d_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_min_pd
|
||||
#define _mm512_min_pd(a, b) simde_mm512_min_pd(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_mask_min_pd(simde__m512d src, simde__mmask8 k, simde__m512d a, simde__m512d b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_min_pd(src, k, a, b);
|
||||
#else
|
||||
return simde_mm512_mask_mov_pd(src, k, simde_mm512_min_pd(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_min_pd
|
||||
#define _mm512_mask_min_pd(src, k, a, b) simde_mm512_mask_min_pd(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_maskz_min_pd(simde__mmask8 k, simde__m512d a, simde__m512d b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_maskz_min_pd(k, a, b);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_pd(k, simde_mm512_min_pd(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_min_pd
|
||||
#define _mm512_maskz_min_pd(k, a, b) simde_mm512_maskz_min_pd(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512h
|
||||
simde_mm512_min_ph (simde__m512h a, simde__m512h b) {
|
||||
#if defined(SIMDE_X86_AVX512FP16_NATIVE)
|
||||
return _mm512_min_ph(a, b);
|
||||
#else
|
||||
simde__m512h_private
|
||||
r_,
|
||||
a_ = simde__m512h_to_private(a),
|
||||
b_ = simde__m512h_to_private(b);
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.f16) / sizeof(r_.f16[0])) ; i++) {
|
||||
r_.f16[i] = simde_float16_to_float32(a_.f16[i]) < simde_float16_to_float32(b_.f16[i]) ? a_.f16[i] : b_.f16[i];
|
||||
}
|
||||
|
||||
return simde__m512h_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512FP16_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_min_ph
|
||||
#define _mm512_min_ph(a, b) simde_mm512_min_ph(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_MIN_H) */
|
||||
@@ -0,0 +1,865 @@
|
||||
/* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Copyright:
|
||||
* 2020 Evan Nemerson <evan@nemerson.com>
|
||||
* 2020 Christopher Moore <moore@free.fr>
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512_MOV_H)
|
||||
#define SIMDE_X86_AVX512_MOV_H
|
||||
|
||||
#include "types.h"
|
||||
#include "cast.h"
|
||||
#include "set.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_mask_mov_epi8 (simde__m128i src, simde__mmask16 k, simde__m128i a) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_mask_mov_epi8(src, k, a);
|
||||
#else
|
||||
simde__m128i_private
|
||||
src_ = simde__m128i_to_private(src),
|
||||
a_ = simde__m128i_to_private(a),
|
||||
r_;
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i8) / sizeof(r_.i8[0])) ; i++) {
|
||||
r_.i8[i] = ((k >> i) & 1) ? a_.i8[i] : src_.i8[i];
|
||||
}
|
||||
|
||||
return simde__m128i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_mov_epi8
|
||||
#define _mm_mask_mov_epi8(src, k, a) simde_mm_mask_mov_epi8(src, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_mask_mov_epi16 (simde__m128i src, simde__mmask8 k, simde__m128i a) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_mask_mov_epi16(src, k, a);
|
||||
#else
|
||||
simde__m128i_private
|
||||
src_ = simde__m128i_to_private(src),
|
||||
a_ = simde__m128i_to_private(a),
|
||||
r_;
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i16) / sizeof(r_.i16[0])) ; i++) {
|
||||
r_.i16[i] = ((k >> i) & 1) ? a_.i16[i] : src_.i16[i];
|
||||
}
|
||||
|
||||
return simde__m128i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_mov_epi16
|
||||
#define _mm_mask_mov_epi16(src, k, a) simde_mm_mask_mov_epi16(src, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_mask_mov_epi32 (simde__m128i src, simde__mmask8 k, simde__m128i a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_mask_mov_epi32(src, k, a);
|
||||
#else
|
||||
simde__m128i_private
|
||||
src_ = simde__m128i_to_private(src),
|
||||
a_ = simde__m128i_to_private(a),
|
||||
r_;
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i32) / sizeof(r_.i32[0])) ; i++) {
|
||||
r_.i32[i] = ((k >> i) & 1) ? a_.i32[i] : src_.i32[i];
|
||||
}
|
||||
|
||||
return simde__m128i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_mov_epi32
|
||||
#define _mm_mask_mov_epi32(src, k, a) simde_mm_mask_mov_epi32(src, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_mask_mov_epi64 (simde__m128i src, simde__mmask8 k, simde__m128i a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_mask_mov_epi64(src, k, a);
|
||||
#else
|
||||
simde__m128i_private
|
||||
src_ = simde__m128i_to_private(src),
|
||||
a_ = simde__m128i_to_private(a),
|
||||
r_;
|
||||
|
||||
/* N.B. CM: No fallbacks as there are only two elements */
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i64) / sizeof(r_.i64[0])) ; i++) {
|
||||
r_.i64[i] = ((k >> i) & 1) ? a_.i64[i] : src_.i64[i];
|
||||
}
|
||||
|
||||
return simde__m128i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_mov_epi64
|
||||
#define _mm_mask_mov_epi64(src, k, a) simde_mm_mask_mov_epi64(src, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128d
|
||||
simde_mm_mask_mov_pd(simde__m128d src, simde__mmask8 k, simde__m128d a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_mask_mov_pd(src, k, a);
|
||||
#else
|
||||
return simde_mm_castsi128_pd(simde_mm_mask_mov_epi64(simde_mm_castpd_si128(src), k, simde_mm_castpd_si128(a)));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_mov_pd
|
||||
#define _mm_mask_mov_pd(src, k, a) simde_mm_mask_mov_pd(src, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128
|
||||
simde_mm_mask_mov_ps (simde__m128 src, simde__mmask8 k, simde__m128 a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_mask_mov_ps(src, k, a);
|
||||
#else
|
||||
return simde_mm_castsi128_ps(simde_mm_mask_mov_epi32(simde_mm_castps_si128(src), k, simde_mm_castps_si128(a)));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_mov_ps
|
||||
#define _mm_mask_mov_ps(src, k, a) simde_mm_mask_mov_ps(src, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_mask_mov_epi8 (simde__m256i src, simde__mmask32 k, simde__m256i a) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_mask_mov_epi8(src, k, a);
|
||||
#else
|
||||
simde__m256i_private
|
||||
r_,
|
||||
src_ = simde__m256i_to_private(src),
|
||||
a_ = simde__m256i_to_private(a);
|
||||
|
||||
#if defined(SIMDE_X86_SSSE3_NATIVE)
|
||||
r_.m128i[0] = simde_mm_mask_mov_epi8(src_.m128i[0], HEDLEY_STATIC_CAST(simde__mmask16, k ), a_.m128i[0]);
|
||||
r_.m128i[1] = simde_mm_mask_mov_epi8(src_.m128i[1], HEDLEY_STATIC_CAST(simde__mmask16, k >> 16), a_.m128i[1]);
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i8) / sizeof(r_.i8[0])) ; i++) {
|
||||
r_.i8[i] = ((k >> i) & 1) ? a_.i8[i] : src_.i8[i];
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m256i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_mask_mov_epi8
|
||||
#define _mm256_mask_mov_epi8(src, k, a) simde_mm256_mask_mov_epi8(src, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_mask_mov_epi16 (simde__m256i src, simde__mmask16 k, simde__m256i a) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_mask_mov_epi16(src, k, a);
|
||||
#else
|
||||
simde__m256i_private
|
||||
src_ = simde__m256i_to_private(src),
|
||||
a_ = simde__m256i_to_private(a),
|
||||
r_;
|
||||
|
||||
#if defined(SIMDE_X86_SSE2_NATIVE)
|
||||
r_.m128i[0] = simde_mm_mask_mov_epi16(src_.m128i[0], HEDLEY_STATIC_CAST(simde__mmask8, k ), a_.m128i[0]);
|
||||
r_.m128i[1] = simde_mm_mask_mov_epi16(src_.m128i[1], HEDLEY_STATIC_CAST(simde__mmask8, k >> 8), a_.m128i[1]);
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i16) / sizeof(r_.i16[0])) ; i++) {
|
||||
r_.i16[i] = ((k >> i) & 1) ? a_.i16[i] : src_.i16[i];
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m256i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_mask_mov_epi16
|
||||
#define _mm256_mask_mov_epi16(src, k, a) simde_mm256_mask_mov_epi16(src, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_mask_mov_epi32 (simde__m256i src, simde__mmask8 k, simde__m256i a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_mask_mov_epi32(src, k, a);
|
||||
#else
|
||||
simde__m256i_private
|
||||
src_ = simde__m256i_to_private(src),
|
||||
a_ = simde__m256i_to_private(a),
|
||||
r_;
|
||||
|
||||
#if defined(SIMDE_X86_SSE2_NATIVE)
|
||||
r_.m128i[0] = simde_mm_mask_mov_epi32(src_.m128i[0], k , a_.m128i[0]);
|
||||
r_.m128i[1] = simde_mm_mask_mov_epi32(src_.m128i[1], k >> 4, a_.m128i[1]);
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i32) / sizeof(r_.i32[0])) ; i++) {
|
||||
r_.i32[i] = ((k >> i) & 1) ? a_.i32[i] : src_.i32[i];
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m256i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_mask_mov_epi32
|
||||
#define _mm256_mask_mov_epi32(src, k, a) simde_mm256_mask_mov_epi32(src, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_mask_mov_epi64 (simde__m256i src, simde__mmask8 k, simde__m256i a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_mask_mov_epi64(src, k, a);
|
||||
#else
|
||||
simde__m256i_private
|
||||
src_ = simde__m256i_to_private(src),
|
||||
a_ = simde__m256i_to_private(a),
|
||||
r_;
|
||||
|
||||
/* N.B. CM: This fallback may not be faster as there are only four elements */
|
||||
#if defined(SIMDE_X86_SSE2_NATIVE)
|
||||
r_.m128i[0] = simde_mm_mask_mov_epi64(src_.m128i[0], k , a_.m128i[0]);
|
||||
r_.m128i[1] = simde_mm_mask_mov_epi64(src_.m128i[1], k >> 2, a_.m128i[1]);
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i64) / sizeof(r_.i64[0])) ; i++) {
|
||||
r_.i64[i] = ((k >> i) & 1) ? a_.i64[i] : src_.i64[i];
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m256i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_mask_mov_epi64
|
||||
#define _mm256_mask_mov_epi64(src, k, a) simde_mm256_mask_mov_epi64(src, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256d
|
||||
simde_mm256_mask_mov_pd (simde__m256d src, simde__mmask8 k, simde__m256d a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_mask_mov_pd(src, k, a);
|
||||
#else
|
||||
return simde_mm256_castsi256_pd(simde_mm256_mask_mov_epi64(simde_mm256_castpd_si256(src), k, simde_mm256_castpd_si256(a)));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_mask_mov_pd
|
||||
#define _mm256_mask_mov_pd(src, k, a) simde_mm256_mask_mov_pd(src, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256
|
||||
simde_mm256_mask_mov_ps (simde__m256 src, simde__mmask8 k, simde__m256 a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_mask_mov_ps(src, k, a);
|
||||
#else
|
||||
return simde_mm256_castsi256_ps(simde_mm256_mask_mov_epi32(simde_mm256_castps_si256(src), k, simde_mm256_castps_si256(a)));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_mask_mov_ps
|
||||
#define _mm256_mask_mov_ps(src, k, a) simde_mm256_mask_mov_ps(src, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_mov_epi8 (simde__m512i src, simde__mmask64 k, simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_mask_mov_epi8(src, k, a);
|
||||
#else
|
||||
simde__m512i_private
|
||||
src_ = simde__m512i_to_private(src),
|
||||
a_ = simde__m512i_to_private(a),
|
||||
r_;
|
||||
|
||||
#if defined(SIMDE_X86_SSSE3_NATIVE)
|
||||
r_.m256i[0] = simde_mm256_mask_mov_epi8(src_.m256i[0], HEDLEY_STATIC_CAST(simde__mmask32, k ), a_.m256i[0]);
|
||||
r_.m256i[1] = simde_mm256_mask_mov_epi8(src_.m256i[1], HEDLEY_STATIC_CAST(simde__mmask32, k >> 32), a_.m256i[1]);
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i8) / sizeof(r_.i8[0])) ; i++) {
|
||||
r_.i8[i] = ((k >> i) & 1) ? a_.i8[i] : src_.i8[i];
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_mov_epi8
|
||||
#define _mm512_mask_mov_epi8(src, k, a) simde_mm512_mask_mov_epi8(src, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_mov_epi16 (simde__m512i src, simde__mmask32 k, simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_mask_mov_epi16(src, k, a);
|
||||
#else
|
||||
simde__m512i_private
|
||||
src_ = simde__m512i_to_private(src),
|
||||
a_ = simde__m512i_to_private(a),
|
||||
r_;
|
||||
|
||||
#if defined(SIMDE_X86_SSE2_NATIVE)
|
||||
r_.m256i[0] = simde_mm256_mask_mov_epi16(src_.m256i[0], HEDLEY_STATIC_CAST(simde__mmask16, k ), a_.m256i[0]);
|
||||
r_.m256i[1] = simde_mm256_mask_mov_epi16(src_.m256i[1], HEDLEY_STATIC_CAST(simde__mmask16, k >> 16), a_.m256i[1]);
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i16) / sizeof(r_.i16[0])) ; i++) {
|
||||
r_.i16[i] = ((k >> i) & 1) ? a_.i16[i] : src_.i16[i];
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_mov_epi16
|
||||
#define _mm512_mask_mov_epi16(src, k, a) simde_mm512_mask_mov_epi16(src, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_mov_epi32 (simde__m512i src, simde__mmask16 k, simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_mov_epi32(src, k, a);
|
||||
#else
|
||||
simde__m512i_private
|
||||
src_ = simde__m512i_to_private(src),
|
||||
a_ = simde__m512i_to_private(a),
|
||||
r_;
|
||||
|
||||
#if defined(SIMDE_X86_SSE2_NATIVE)
|
||||
r_.m256i[0] = simde_mm256_mask_mov_epi32(src_.m256i[0], HEDLEY_STATIC_CAST(simde__mmask8, k ), a_.m256i[0]);
|
||||
r_.m256i[1] = simde_mm256_mask_mov_epi32(src_.m256i[1], HEDLEY_STATIC_CAST(simde__mmask8, k >> 8), a_.m256i[1]);
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i32) / sizeof(r_.i32[0])) ; i++) {
|
||||
r_.i32[i] = ((k >> i) & 1) ? a_.i32[i] : src_.i32[i];
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_mov_epi32
|
||||
#define _mm512_mask_mov_epi32(src, k, a) simde_mm512_mask_mov_epi32(src, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_mov_epi64 (simde__m512i src, simde__mmask8 k, simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_mov_epi64(src, k, a);
|
||||
#else
|
||||
simde__m512i_private
|
||||
src_ = simde__m512i_to_private(src),
|
||||
a_ = simde__m512i_to_private(a),
|
||||
r_;
|
||||
|
||||
/* N.B. CM: Without AVX2 this fallback may not be faster as there are only eight elements */
|
||||
#if defined(SIMDE_X86_SSE2_NATIVE)
|
||||
r_.m256i[0] = simde_mm256_mask_mov_epi64(src_.m256i[0], k , a_.m256i[0]);
|
||||
r_.m256i[1] = simde_mm256_mask_mov_epi64(src_.m256i[1], k >> 4, a_.m256i[1]);
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i64) / sizeof(r_.i64[0])) ; i++) {
|
||||
r_.i64[i] = ((k >> i) & 1) ? a_.i64[i] : src_.i64[i];
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_mov_epi64
|
||||
#define _mm512_mask_mov_epi64(src, k, a) simde_mm512_mask_mov_epi64(src, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_mask_mov_pd (simde__m512d src, simde__mmask8 k, simde__m512d a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_mov_pd(src, k, a);
|
||||
#else
|
||||
return simde_mm512_castsi512_pd(simde_mm512_mask_mov_epi64(simde_mm512_castpd_si512(src), k, simde_mm512_castpd_si512(a)));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_mov_pd
|
||||
#define _mm512_mask_mov_pd(src, k, a) simde_mm512_mask_mov_pd(src, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_mask_mov_ps (simde__m512 src, simde__mmask16 k, simde__m512 a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_mov_ps(src, k, a);
|
||||
#else
|
||||
return simde_mm512_castsi512_ps(simde_mm512_mask_mov_epi32(simde_mm512_castps_si512(src), k, simde_mm512_castps_si512(a)));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_mov_ps
|
||||
#define _mm512_mask_mov_ps(src, k, a) simde_mm512_mask_mov_ps(src, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512h
|
||||
simde_x_mm512_mask_mov_ph (simde__m512h src, simde__mmask32 k, simde__m512h a) {
|
||||
return simde_mm512_castsi512_ph(simde_mm512_mask_mov_epi16(simde_mm512_castph_si512(src), k, simde_mm512_castph_si512(a)));
|
||||
}
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_maskz_mov_epi8 (simde__mmask16 k, simde__m128i a) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_maskz_mov_epi8(k, a);
|
||||
#else
|
||||
simde__m128i_private
|
||||
a_ = simde__m128i_to_private(a),
|
||||
r_;
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i8) / sizeof(r_.i8[0])) ; i++) {
|
||||
r_.i8[i] = ((k >> i) & 1) ? a_.i8[i] : INT8_C(0);
|
||||
}
|
||||
|
||||
return simde__m128i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_maskz_mov_epi8
|
||||
#define _mm_maskz_mov_epi8(k, a) simde_mm_maskz_mov_epi8(k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_maskz_mov_epi16 (simde__mmask8 k, simde__m128i a) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_maskz_mov_epi16(k, a);
|
||||
#else
|
||||
simde__m128i_private
|
||||
a_ = simde__m128i_to_private(a),
|
||||
r_;
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i16) / sizeof(r_.i16[0])) ; i++) {
|
||||
r_.i16[i] = ((k >> i) & 1) ? a_.i16[i] : INT16_C(0);
|
||||
}
|
||||
|
||||
return simde__m128i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_maskz_mov_epi16
|
||||
#define _mm_maskz_mov_epi16(k, a) simde_mm_maskz_mov_epi16(k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_maskz_mov_epi32 (simde__mmask8 k, simde__m128i a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_maskz_mov_epi32(k, a);
|
||||
#else
|
||||
simde__m128i_private
|
||||
a_ = simde__m128i_to_private(a),
|
||||
r_;
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i32) / sizeof(r_.i32[0])) ; i++) {
|
||||
r_.i32[i] = ((k >> i) & 1) ? a_.i32[i] : INT32_C(0);
|
||||
}
|
||||
|
||||
return simde__m128i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_maskz_mov_epi32
|
||||
#define _mm_maskz_mov_epi32(k, a) simde_mm_maskz_mov_epi32(k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_maskz_mov_epi64 (simde__mmask8 k, simde__m128i a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_maskz_mov_epi64(k, a);
|
||||
#else
|
||||
simde__m128i_private
|
||||
a_ = simde__m128i_to_private(a),
|
||||
r_;
|
||||
|
||||
/* N.B. CM: No fallbacks as there are only two elements */
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i64) / sizeof(r_.i64[0])) ; i++) {
|
||||
r_.i64[i] = ((k >> i) & 1) ? a_.i64[i] : INT64_C(0);
|
||||
}
|
||||
|
||||
return simde__m128i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_maskz_mov_epi64
|
||||
#define _mm_maskz_mov_epi64(k, a) simde_mm_maskz_mov_epi64(k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128d
|
||||
simde_mm_maskz_mov_pd (simde__mmask8 k, simde__m128d a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_maskz_mov_pd(k, a);
|
||||
#else
|
||||
return simde_mm_castsi128_pd(simde_mm_maskz_mov_epi64(k, simde_mm_castpd_si128(a)));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_maskz_mov_pd
|
||||
#define _mm_maskz_mov_pd(k, a) simde_mm_maskz_mov_pd(k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128
|
||||
simde_mm_maskz_mov_ps (simde__mmask8 k, simde__m128 a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_maskz_mov_ps(k, a);
|
||||
#else
|
||||
return simde_mm_castsi128_ps(simde_mm_maskz_mov_epi32(k, simde_mm_castps_si128(a)));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_maskz_mov_ps
|
||||
#define _mm_maskz_mov_ps(k, a) simde_mm_maskz_mov_ps(k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_maskz_mov_epi8 (simde__mmask32 k, simde__m256i a) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_maskz_mov_epi8(k, a);
|
||||
#else
|
||||
simde__m256i_private
|
||||
a_ = simde__m256i_to_private(a),
|
||||
r_;
|
||||
|
||||
#if defined(SIMDE_X86_SSSE3_NATIVE)
|
||||
r_.m128i[0] = simde_mm_maskz_mov_epi8(HEDLEY_STATIC_CAST(simde__mmask16, k ), a_.m128i[0]);
|
||||
r_.m128i[1] = simde_mm_maskz_mov_epi8(HEDLEY_STATIC_CAST(simde__mmask16, k >> 16), a_.m128i[1]);
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i8) / sizeof(r_.i8[0])) ; i++) {
|
||||
r_.i8[i] = ((k >> i) & 1) ? a_.i8[i] : INT8_C(0);
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m256i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_maskz_mov_epi8
|
||||
#define _mm256_maskz_mov_epi8(k, a) simde_mm256_maskz_mov_epi8(k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_maskz_mov_epi16 (simde__mmask16 k, simde__m256i a) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_maskz_mov_epi16(k, a);
|
||||
#else
|
||||
simde__m256i_private
|
||||
a_ = simde__m256i_to_private(a),
|
||||
r_;
|
||||
|
||||
#if defined(SIMDE_X86_SSE2_NATIVE)
|
||||
r_.m128i[0] = simde_mm_maskz_mov_epi16(HEDLEY_STATIC_CAST(simde__mmask8, k ), a_.m128i[0]);
|
||||
r_.m128i[1] = simde_mm_maskz_mov_epi16(HEDLEY_STATIC_CAST(simde__mmask8, k >> 8), a_.m128i[1]);
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i16) / sizeof(r_.i16[0])) ; i++) {
|
||||
r_.i16[i] = ((k >> i) & 1) ? a_.i16[i] : INT16_C(0);
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m256i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_maskz_mov_epi16
|
||||
#define _mm256_maskz_mov_epi16(k, a) simde_mm256_maskz_mov_epi16(k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_maskz_mov_epi32 (simde__mmask8 k, simde__m256i a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_maskz_mov_epi32(k, a);
|
||||
#else
|
||||
simde__m256i_private
|
||||
a_ = simde__m256i_to_private(a),
|
||||
r_;
|
||||
|
||||
#if defined(SIMDE_X86_SSE2_NATIVE)
|
||||
r_.m128i[0] = simde_mm_maskz_mov_epi32(k , a_.m128i[0]);
|
||||
r_.m128i[1] = simde_mm_maskz_mov_epi32(k >> 4, a_.m128i[1]);
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i32) / sizeof(r_.i32[0])) ; i++) {
|
||||
r_.i32[i] = ((k >> i) & 1) ? a_.i32[i] : INT32_C(0);
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m256i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_maskz_mov_epi32
|
||||
#define _mm256_maskz_mov_epi32(k, a) simde_mm256_maskz_mov_epi32(k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_maskz_mov_epi64 (simde__mmask8 k, simde__m256i a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_maskz_mov_epi64(k, a);
|
||||
#else
|
||||
simde__m256i_private
|
||||
a_ = simde__m256i_to_private(a),
|
||||
r_;
|
||||
|
||||
/* N.B. CM: This fallback may not be faster as there are only four elements */
|
||||
#if defined(SIMDE_X86_SSE2_NATIVE)
|
||||
r_.m128i[0] = simde_mm_maskz_mov_epi64(k , a_.m128i[0]);
|
||||
r_.m128i[1] = simde_mm_maskz_mov_epi64(k >> 2, a_.m128i[1]);
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i64) / sizeof(r_.i64[0])) ; i++) {
|
||||
r_.i64[i] = ((k >> i) & 1) ? a_.i64[i] : INT64_C(0);
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m256i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_maskz_mov_epi64
|
||||
#define _mm256_maskz_mov_epi64(k, a) simde_mm256_maskz_mov_epi64(k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256d
|
||||
simde_mm256_maskz_mov_pd (simde__mmask8 k, simde__m256d a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_maskz_mov_pd(k, a);
|
||||
#else
|
||||
return simde_mm256_castsi256_pd(simde_mm256_maskz_mov_epi64(k, simde_mm256_castpd_si256(a)));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_maskz_mov_pd
|
||||
#define _mm256_maskz_mov_pd(k, a) simde_mm256_maskz_mov_pd(k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256
|
||||
simde_mm256_maskz_mov_ps (simde__mmask8 k, simde__m256 a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_maskz_mov_ps(k, a);
|
||||
#else
|
||||
return simde_mm256_castsi256_ps(simde_mm256_maskz_mov_epi32(k, simde_mm256_castps_si256(a)));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_maskz_mov_ps
|
||||
#define _mm256_maskz_mov_ps(k, a) simde_mm256_maskz_mov_ps(k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_mov_epi8 (simde__mmask64 k, simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_maskz_mov_epi8(k, a);
|
||||
#else
|
||||
simde__m512i_private
|
||||
a_ = simde__m512i_to_private(a),
|
||||
r_;
|
||||
|
||||
#if defined(SIMDE_X86_SSSE3_NATIVE)
|
||||
r_.m256i[0] = simde_mm256_maskz_mov_epi8(HEDLEY_STATIC_CAST(simde__mmask32, k ), a_.m256i[0]);
|
||||
r_.m256i[1] = simde_mm256_maskz_mov_epi8(HEDLEY_STATIC_CAST(simde__mmask32, k >> 32), a_.m256i[1]);
|
||||
#else
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i8) / sizeof(r_.i8[0])) ; i++) {
|
||||
r_.i8[i] = ((k >> i) & 1) ? a_.i8[i] : INT8_C(0);
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_mov_epi8
|
||||
#define _mm512_maskz_mov_epi8(k, a) simde_mm512_maskz_mov_epi8(k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_mov_epi16 (simde__mmask32 k, simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_maskz_mov_epi16(k, a);
|
||||
#else
|
||||
simde__m512i_private
|
||||
a_ = simde__m512i_to_private(a),
|
||||
r_;
|
||||
|
||||
#if defined(SIMDE_X86_SSE2_NATIVE)
|
||||
r_.m256i[0] = simde_mm256_maskz_mov_epi16(HEDLEY_STATIC_CAST(simde__mmask16, k ), a_.m256i[0]);
|
||||
r_.m256i[1] = simde_mm256_maskz_mov_epi16(HEDLEY_STATIC_CAST(simde__mmask16, k >> 16), a_.m256i[1]);
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i16) / sizeof(r_.i16[0])) ; i++) {
|
||||
r_.i16[i] = ((k >> i) & 1) ? a_.i16[i] : INT16_C(0);
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_mov_epi16
|
||||
#define _mm512_maskz_mov_epi16(k, a) simde_mm512_maskz_mov_epi16(k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_mov_epi32 (simde__mmask16 k, simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_maskz_mov_epi32(k, a);
|
||||
#else
|
||||
simde__m512i_private
|
||||
a_ = simde__m512i_to_private(a),
|
||||
r_;
|
||||
|
||||
#if defined(SIMDE_X86_SSE2_NATIVE)
|
||||
r_.m256i[0] = simde_mm256_maskz_mov_epi32(HEDLEY_STATIC_CAST(simde__mmask8, k ), a_.m256i[0]);
|
||||
r_.m256i[1] = simde_mm256_maskz_mov_epi32(HEDLEY_STATIC_CAST(simde__mmask8, k >> 8), a_.m256i[1]);
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i32) / sizeof(r_.i32[0])) ; i++) {
|
||||
r_.i32[i] = ((k >> i) & 1) ? a_.i32[i] : INT32_C(0);
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_mov_epi32
|
||||
#define _mm512_maskz_mov_epi32(k, a) simde_mm512_maskz_mov_epi32(k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_mov_epi64 (simde__mmask8 k, simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_maskz_mov_epi64(k, a);
|
||||
#else
|
||||
simde__m512i_private
|
||||
a_ = simde__m512i_to_private(a),
|
||||
r_;
|
||||
|
||||
/* N.B. CM: Without AVX2 this fallback may not be faster as there are only eight elements */
|
||||
#if defined(SIMDE_X86_SSE2_NATIVE)
|
||||
r_.m256i[0] = simde_mm256_maskz_mov_epi64(k , a_.m256i[0]);
|
||||
r_.m256i[1] = simde_mm256_maskz_mov_epi64(k >> 4, a_.m256i[1]);
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i64) / sizeof(r_.i64[0])) ; i++) {
|
||||
r_.i64[i] = ((k >> i) & 1) ? a_.i64[i] : INT64_C(0);
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_mov_epi64
|
||||
#define _mm512_maskz_mov_epi64(k, a) simde_mm512_maskz_mov_epi64(k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_maskz_mov_pd (simde__mmask8 k, simde__m512d a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_maskz_mov_pd(k, a);
|
||||
#else
|
||||
return simde_mm512_castsi512_pd(simde_mm512_maskz_mov_epi64(k, simde_mm512_castpd_si512(a)));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_mov_pd
|
||||
#define _mm512_maskz_mov_pd(k, a) simde_mm512_maskz_mov_pd(k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_maskz_mov_ps (simde__mmask16 k, simde__m512 a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_maskz_mov_ps(k, a);
|
||||
#else
|
||||
return simde_mm512_castsi512_ps(simde_mm512_maskz_mov_epi32(k, simde_mm512_castps_si512(a)));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_mov_ps
|
||||
#define _mm512_maskz_mov_ps(k, a) simde_mm512_maskz_mov_ps(k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_MOV_H) */
|
||||
@@ -0,0 +1,372 @@
|
||||
/* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Copyright:
|
||||
* 2020 Evan Nemerson <evan@nemerson.com>
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512_MOV_MASK_H)
|
||||
#define SIMDE_X86_AVX512_MOV_MASK_H
|
||||
|
||||
#include "types.h"
|
||||
#include "../avx2.h"
|
||||
|
||||
#include "cast.h"
|
||||
#include "set.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask16
|
||||
simde_mm_movepi8_mask (simde__m128i a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm_movepi8_mask(a);
|
||||
#elif defined(SIMDE_X86_SSE2_NATIVE)
|
||||
return HEDLEY_STATIC_CAST(simde__mmask16, simde_mm_movemask_epi8(a));
|
||||
#else
|
||||
simde__m128i_private a_ = simde__m128i_to_private(a);
|
||||
simde__mmask16 r = 0;
|
||||
|
||||
SIMDE_VECTORIZE_REDUCTION(|:r)
|
||||
for (size_t i = 0 ; i < (sizeof(a_.i8) / sizeof(a_.i8[0])) ; i++) {
|
||||
r |= (a_.i8[i] < 0) ? (UINT64_C(1) << i) : 0;
|
||||
}
|
||||
|
||||
return r;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_movepi8_mask
|
||||
#define _mm_movepi8_mask(a) simde_mm_movepi8_mask(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask8
|
||||
simde_mm_movepi16_mask (simde__m128i a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm_movepi16_mask(a);
|
||||
#elif defined(SIMDE_X86_SSE2_NATIVE)
|
||||
/* There is no 32-bit _mm_movemask_* function, so we use
|
||||
* _mm_movemask_epi8 then extract the odd bits. */
|
||||
uint_fast16_t r = HEDLEY_STATIC_CAST(uint_fast16_t, simde_mm_movemask_epi8(a));
|
||||
r = ( (r >> 1)) & UINT32_C(0x5555);
|
||||
r = (r | (r >> 1)) & UINT32_C(0x3333);
|
||||
r = (r | (r >> 2)) & UINT32_C(0x0f0f);
|
||||
r = (r | (r >> 4)) & UINT32_C(0x00ff);
|
||||
return HEDLEY_STATIC_CAST(simde__mmask8, r);
|
||||
#else
|
||||
simde__m128i_private a_ = simde__m128i_to_private(a);
|
||||
simde__mmask8 r = 0;
|
||||
|
||||
SIMDE_VECTORIZE_REDUCTION(|:r)
|
||||
for (size_t i = 0 ; i < (sizeof(a_.i16) / sizeof(a_.i16[0])) ; i++) {
|
||||
r |= (a_.i16[i] < 0) ? (UINT32_C(1) << i) : 0;
|
||||
}
|
||||
|
||||
return r;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_movepi16_mask
|
||||
#define _mm_movepi16_mask(a) simde_mm_movepi16_mask(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask8
|
||||
simde_mm_movepi32_mask (simde__m128i a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
return _mm_movepi32_mask(a);
|
||||
#elif SIMDE_NATURAL_VECTOR_SIZE_GE(128)
|
||||
return HEDLEY_STATIC_CAST(simde__mmask8, simde_mm_movemask_ps(simde_mm_castsi128_ps(a)));
|
||||
#else
|
||||
simde__m128i_private a_ = simde__m128i_to_private(a);
|
||||
simde__mmask8 r = 0;
|
||||
|
||||
SIMDE_VECTORIZE_REDUCTION(|:r)
|
||||
for (size_t i = 0 ; i < (sizeof(a_.i32) / sizeof(a_.i32[0])) ; i++) {
|
||||
r |= (a_.i32[i] < 0) ? (UINT32_C(1) << i) : 0;
|
||||
}
|
||||
|
||||
return r;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_movepi32_mask
|
||||
#define _mm_movepi32_mask(a) simde_mm_movepi32_mask(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask8
|
||||
simde_mm_movepi64_mask (simde__m128i a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
return _mm_movepi64_mask(a);
|
||||
#elif defined(SIMDE_X86_SSE2_NATIVE)
|
||||
return HEDLEY_STATIC_CAST(simde__mmask8, simde_mm_movemask_pd(simde_mm_castsi128_pd(a)));
|
||||
#else
|
||||
simde__m128i_private a_ = simde__m128i_to_private(a);
|
||||
simde__mmask8 r = 0;
|
||||
|
||||
SIMDE_VECTORIZE_REDUCTION(|:r)
|
||||
for (size_t i = 0 ; i < (sizeof(a_.i64) / sizeof(a_.i64[0])) ; i++) {
|
||||
r |= (a_.i64[i] < 0) ? (UINT32_C(1) << i) : 0;
|
||||
}
|
||||
|
||||
return r;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_movepi64_mask
|
||||
#define _mm_movepi64_mask(a) simde_mm_movepi64_mask(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask32
|
||||
simde_mm256_movepi8_mask (simde__m256i a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm256_movepi8_mask(a);
|
||||
#else
|
||||
simde__m256i_private a_ = simde__m256i_to_private(a);
|
||||
simde__mmask32 r = 0;
|
||||
|
||||
#if SIMDE_NATURAL_VECTOR_SIZE_LE(128)
|
||||
for (size_t i = 0 ; i < (sizeof(a_.m128i) / sizeof(a_.m128i[0])) ; i++) {
|
||||
r |= HEDLEY_STATIC_CAST(simde__mmask32, simde_mm_movepi8_mask(a_.m128i[i])) << (i * 16);
|
||||
}
|
||||
#else
|
||||
SIMDE_VECTORIZE_REDUCTION(|:r)
|
||||
for (size_t i = 0 ; i < (sizeof(a_.i8) / sizeof(a_.i8[0])) ; i++) {
|
||||
r |= (a_.i8[i] < 0) ? (UINT64_C(1) << i) : 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
return HEDLEY_STATIC_CAST(simde__mmask32, r);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_movepi8_mask
|
||||
#define _mm256_movepi8_mask(a) simde_mm256_movepi8_mask(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask16
|
||||
simde_mm256_movepi16_mask (simde__m256i a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm256_movepi16_mask(a);
|
||||
#else
|
||||
simde__m256i_private a_ = simde__m256i_to_private(a);
|
||||
simde__mmask16 r = 0;
|
||||
|
||||
#if SIMDE_NATURAL_VECTOR_SIZE_LE(128)
|
||||
for (size_t i = 0 ; i < (sizeof(a_.m128i) / sizeof(a_.m128i[0])) ; i++) {
|
||||
r |= HEDLEY_STATIC_CAST(simde__mmask16, simde_mm_movepi16_mask(a_.m128i[i])) << (i * 8);
|
||||
}
|
||||
#else
|
||||
SIMDE_VECTORIZE_REDUCTION(|:r)
|
||||
for (size_t i = 0 ; i < (sizeof(a_.i16) / sizeof(a_.i16[0])) ; i++) {
|
||||
r |= (a_.i16[i] < 0) ? (UINT32_C(1) << i) : 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
return r;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_movepi16_mask
|
||||
#define _mm256_movepi16_mask(a) simde_mm256_movepi16_mask(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask8
|
||||
simde_mm256_movepi32_mask (simde__m256i a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
return _mm256_movepi32_mask(a);
|
||||
#else
|
||||
simde__m256i_private a_ = simde__m256i_to_private(a);
|
||||
simde__mmask8 r = 0;
|
||||
|
||||
#if SIMDE_NATURAL_VECTOR_SIZE_LE(128)
|
||||
for (size_t i = 0 ; i < (sizeof(a_.m128i) / sizeof(a_.m128i[0])) ; i++) {
|
||||
r |= HEDLEY_STATIC_CAST(simde__mmask16, simde_mm_movepi32_mask(a_.m128i[i])) << (i * 4);
|
||||
}
|
||||
#else
|
||||
SIMDE_VECTORIZE_REDUCTION(|:r)
|
||||
for (size_t i = 0 ; i < (sizeof(a_.i32) / sizeof(a_.i32[0])) ; i++) {
|
||||
r |= (a_.i32[i] < 0) ? (UINT32_C(1) << i) : 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
return r;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_movepi32_mask
|
||||
#define _mm256_movepi32_mask(a) simde_mm256_movepi32_mask(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask8
|
||||
simde_mm256_movepi64_mask (simde__m256i a) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
return _mm256_movepi64_mask(a);
|
||||
#else
|
||||
simde__m256i_private a_ = simde__m256i_to_private(a);
|
||||
simde__mmask8 r = 0;
|
||||
|
||||
#if SIMDE_NATURAL_VECTOR_SIZE_LE(128)
|
||||
for (size_t i = 0 ; i < (sizeof(a_.m128i) / sizeof(a_.m128i[0])) ; i++) {
|
||||
r |= HEDLEY_STATIC_CAST(simde__mmask8, simde_mm_movepi64_mask(a_.m128i[i])) << (i * 2);
|
||||
}
|
||||
#else
|
||||
SIMDE_VECTORIZE_REDUCTION(|:r)
|
||||
for (size_t i = 0 ; i < (sizeof(a_.i64) / sizeof(a_.i64[0])) ; i++) {
|
||||
r |= (a_.i64[i] < 0) ? (UINT32_C(1) << i) : 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
return r;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_movepi64_mask
|
||||
#define _mm256_movepi64_mask(a) simde_mm256_movepi64_mask(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask64
|
||||
simde_mm512_movepi8_mask (simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_movepi8_mask(a);
|
||||
#else
|
||||
simde__m512i_private a_ = simde__m512i_to_private(a);
|
||||
simde__mmask64 r = 0;
|
||||
|
||||
#if SIMDE_NATURAL_VECTOR_SIZE_LE(256)
|
||||
for (size_t i = 0 ; i < (sizeof(a_.m256i) / sizeof(a_.m256i[0])) ; i++) {
|
||||
r |= HEDLEY_STATIC_CAST(simde__mmask64, simde_mm256_movepi8_mask(a_.m256i[i])) << (i * 32);
|
||||
}
|
||||
#else
|
||||
r = 0;
|
||||
|
||||
SIMDE_VECTORIZE_REDUCTION(|:r)
|
||||
for (size_t i = 0 ; i < (sizeof(a_.i8) / sizeof(a_.i8[0])) ; i++) {
|
||||
r |= (a_.i8[i] < 0) ? (UINT64_C(1) << i) : 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
return HEDLEY_STATIC_CAST(simde__mmask64, r);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_movepi8_mask
|
||||
#define _mm512_movepi8_mask(a) simde_mm512_movepi8_mask(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask32
|
||||
simde_mm512_movepi16_mask (simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_movepi16_mask(a);
|
||||
#else
|
||||
simde__m512i_private a_ = simde__m512i_to_private(a);
|
||||
simde__mmask32 r = 0;
|
||||
|
||||
#if SIMDE_NATURAL_VECTOR_SIZE_LE(256)
|
||||
for (size_t i = 0 ; i < (sizeof(a_.m256i) / sizeof(a_.m256i[0])) ; i++) {
|
||||
r |= HEDLEY_STATIC_CAST(simde__mmask32, simde_mm256_movepi16_mask(a_.m256i[i])) << (i * 16);
|
||||
}
|
||||
#else
|
||||
SIMDE_VECTORIZE_REDUCTION(|:r)
|
||||
for (size_t i = 0 ; i < (sizeof(a_.i16) / sizeof(a_.i16[0])) ; i++) {
|
||||
r |= (a_.i16[i] < 0) ? (UINT32_C(1) << i) : 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
return r;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_movepi16_mask
|
||||
#define _mm512_movepi16_mask(a) simde_mm512_movepi16_mask(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask16
|
||||
simde_mm512_movepi32_mask (simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
return _mm512_movepi32_mask(a);
|
||||
#else
|
||||
simde__m512i_private a_ = simde__m512i_to_private(a);
|
||||
simde__mmask16 r = 0;
|
||||
|
||||
#if SIMDE_NATURAL_VECTOR_SIZE_LE(256)
|
||||
for (size_t i = 0 ; i < (sizeof(a_.m256i) / sizeof(a_.m256i[0])) ; i++) {
|
||||
r |= HEDLEY_STATIC_CAST(simde__mmask16, simde_mm256_movepi32_mask(a_.m256i[i])) << (i * 8);
|
||||
}
|
||||
#else
|
||||
SIMDE_VECTORIZE_REDUCTION(|:r)
|
||||
for (size_t i = 0 ; i < (sizeof(a_.i32) / sizeof(a_.i32[0])) ; i++) {
|
||||
r |= (a_.i32[i] < 0) ? (UINT32_C(1) << i) : 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
return r;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_movepi32_mask
|
||||
#define _mm512_movepi32_mask(a) simde_mm512_movepi32_mask(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__mmask8
|
||||
simde_mm512_movepi64_mask (simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
return _mm512_movepi64_mask(a);
|
||||
#else
|
||||
simde__m512i_private a_ = simde__m512i_to_private(a);
|
||||
simde__mmask8 r = 0;
|
||||
|
||||
#if SIMDE_NATURAL_VECTOR_SIZE_LE(256)
|
||||
for (size_t i = 0 ; i < (sizeof(a_.m256i) / sizeof(a_.m256i[0])) ; i++) {
|
||||
r |= simde_mm256_movepi64_mask(a_.m256i[i]) << (i * 4);
|
||||
}
|
||||
#else
|
||||
SIMDE_VECTORIZE_REDUCTION(|:r)
|
||||
for (size_t i = 0 ; i < (sizeof(a_.i64) / sizeof(a_.i64[0])) ; i++) {
|
||||
r |= (a_.i64[i] < 0) ? (UINT32_C(1) << i) : 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
return r;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_movepi64_mask
|
||||
#define _mm512_movepi64_mask(a) simde_mm512_movepi64_mask(a)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_MOV_MASK_H) */
|
||||
@@ -0,0 +1,460 @@
|
||||
/* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Copyright:
|
||||
* 2020 Evan Nemerson <evan@nemerson.com>
|
||||
* 2020 Christopher Moore <moore@free.fr>
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512_MOVM_H)
|
||||
#define SIMDE_X86_AVX512_MOVM_H
|
||||
|
||||
#include "types.h"
|
||||
#include "../avx2.h"
|
||||
#include "set.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_movm_epi8 (simde__mmask16 k) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_movm_epi8(k);
|
||||
#elif defined(SIMDE_X86_SSSE3_NATIVE)
|
||||
const simde__m128i zero = simde_mm_setzero_si128();
|
||||
const simde__m128i bits = simde_mm_set_epi16(0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80);
|
||||
const simde__m128i shuffle = simde_mm_set_epi8(15, 13, 11, 9, 7, 5, 3, 1, 14, 12, 10, 8, 6, 4, 2, 0);
|
||||
simde__m128i r;
|
||||
|
||||
r = simde_mm_set1_epi16(HEDLEY_STATIC_CAST(short, k));
|
||||
r = simde_mm_mullo_epi16(r, bits);
|
||||
r = simde_mm_shuffle_epi8(r, shuffle);
|
||||
r = simde_mm_cmpgt_epi8(zero, r);
|
||||
|
||||
return r;
|
||||
#else
|
||||
simde__m128i_private r_;
|
||||
|
||||
#if defined(SIMDE_ARM_NEON_A32V7_NATIVE)
|
||||
static const int8_t pos_data[] = { 7, 6, 5, 4, 3, 2, 1, 0 };
|
||||
int8x8_t pos = vld1_s8(pos_data);
|
||||
r_.neon_i8 = vcombine_s8(
|
||||
vshr_n_s8(vshl_s8(vdup_n_s8(HEDLEY_STATIC_CAST(int8_t, k)), pos), 7),
|
||||
vshr_n_s8(vshl_s8(vdup_n_s8(HEDLEY_STATIC_CAST(int8_t, k >> 8)), pos), 7));
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i8) / sizeof(r_.i8[0])) ; i++) {
|
||||
r_.i8[i] = ((k >> i) & 1) ? ~INT8_C(0) : INT8_C(0);
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m128i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_movm_epi8
|
||||
#define _mm_movm_epi8(k) simde_mm_movm_epi8(k)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_movm_epi8 (simde__mmask32 k) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_movm_epi8(k);
|
||||
#elif defined(SIMDE_X86_AVX2_NATIVE)
|
||||
const simde__m256i zero = simde_mm256_setzero_si256();
|
||||
const simde__m256i bits = simde_mm256_broadcastsi128_si256(simde_mm_set_epi16(0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80));
|
||||
const simde__m256i shuffle = simde_mm256_broadcastsi128_si256(simde_mm_set_epi8(15, 13, 11, 9, 7, 5, 3, 1, 14, 12, 10, 8, 6, 4, 2, 0));
|
||||
simde__m256i r;
|
||||
|
||||
r = simde_mm256_set_m128i(_mm_set1_epi16(HEDLEY_STATIC_CAST(short, k >> 16)), _mm_set1_epi16(HEDLEY_STATIC_CAST(short, k)));
|
||||
r = simde_mm256_mullo_epi16(r, bits);
|
||||
r = simde_mm256_shuffle_epi8(r, shuffle);
|
||||
r = simde_mm256_cmpgt_epi8(zero, r);
|
||||
|
||||
return r;
|
||||
#else
|
||||
simde__m256i_private r_;
|
||||
|
||||
#if SIMDE_NATURAL_VECTOR_SIZE_LE(128)
|
||||
r_.m128i[0] = simde_mm_movm_epi8(HEDLEY_STATIC_CAST(simde__mmask16, k));
|
||||
r_.m128i[1] = simde_mm_movm_epi8(HEDLEY_STATIC_CAST(simde__mmask16, k >> 16));
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i8) / sizeof(r_.i8[0])) ; i++) {
|
||||
r_.i8[i] = ((k >> i) & 1) ? ~INT8_C(0) : INT8_C(0);
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m256i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_movm_epi8
|
||||
#define _mm256_movm_epi8(k) simde_mm256_movm_epi8(k)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_movm_epi8 (simde__mmask64 k) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_movm_epi8(k);
|
||||
#else
|
||||
simde__m512i_private r_;
|
||||
|
||||
#if SIMDE_NATURAL_VECTOR_SIZE_LE(256)
|
||||
r_.m256i[0] = simde_mm256_movm_epi8(HEDLEY_STATIC_CAST(simde__mmask32, k));
|
||||
r_.m256i[1] = simde_mm256_movm_epi8(HEDLEY_STATIC_CAST(simde__mmask32, k >> 32));
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i8) / sizeof(r_.i8[0])) ; i++) {
|
||||
r_.i8[i] = ((k >> i) & 1) ? ~INT8_C(0) : INT8_C(0);
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_movm_epi8
|
||||
#define _mm512_movm_epi8(k) simde_mm512_movm_epi8(k)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_movm_epi16 (simde__mmask8 k) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_movm_epi16(k);
|
||||
#elif defined(SIMDE_X86_SSE2_NATIVE)
|
||||
const simde__m128i bits = simde_mm_set_epi16(0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000, INT16_MIN /* 0x8000 */);
|
||||
simde__m128i r;
|
||||
|
||||
r = simde_mm_set1_epi16(HEDLEY_STATIC_CAST(short, k));
|
||||
r = simde_mm_mullo_epi16(r, bits);
|
||||
r = simde_mm_srai_epi16(r, 15);
|
||||
|
||||
return r;
|
||||
#else
|
||||
simde__m128i_private r_;
|
||||
|
||||
#if defined(SIMDE_ARM_NEON_A32V7_NATIVE)
|
||||
static const int16_t pos_data[] = { 15, 14, 13, 12, 11, 10, 9, 8 };
|
||||
const int16x8_t pos = vld1q_s16(pos_data);
|
||||
r_.neon_i16 = vshrq_n_s16(vshlq_s16(vdupq_n_s16(HEDLEY_STATIC_CAST(int16_t, k)), pos), 15);
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i16) / sizeof(r_.i16[0])) ; i++) {
|
||||
r_.i16[i] = ((k >> i) & 1) ? ~INT16_C(0) : INT16_C(0);
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m128i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_movm_epi16
|
||||
#define _mm_movm_epi16(k) simde_mm_movm_epi16(k)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_movm_epi16 (simde__mmask16 k) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_movm_epi16(k);
|
||||
#elif defined(SIMDE_X86_AVX2_NATIVE)
|
||||
const __m256i bits = _mm256_set_epi16(0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080,
|
||||
0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000, INT16_MIN /* 0x8000 */);
|
||||
__m256i r;
|
||||
|
||||
r = _mm256_set1_epi16(HEDLEY_STATIC_CAST(short, k));
|
||||
r = _mm256_mullo_epi16(r, bits);
|
||||
r = _mm256_srai_epi16(r, 15);
|
||||
|
||||
return r;
|
||||
#else
|
||||
simde__m256i_private r_;
|
||||
|
||||
#if SIMDE_NATURAL_VECTOR_SIZE_LE(128)
|
||||
r_.m128i[0] = simde_mm_movm_epi16(HEDLEY_STATIC_CAST(simde__mmask8, k));
|
||||
r_.m128i[1] = simde_mm_movm_epi16(HEDLEY_STATIC_CAST(simde__mmask8, k >> 8));
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i16) / sizeof(r_.i16[0])) ; i++) {
|
||||
r_.i16[i] = ((k >> i) & 1) ? ~INT16_C(0) : INT16_C(0);
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m256i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_movm_epi16
|
||||
#define _mm256_movm_epi16(k) simde_mm256_movm_epi16(k)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_movm_epi16 (simde__mmask32 k) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm512_movm_epi16(k);
|
||||
#else
|
||||
simde__m512i_private r_;
|
||||
|
||||
#if SIMDE_NATURAL_VECTOR_SIZE_LE(256)
|
||||
r_.m256i[0] = simde_mm256_movm_epi16(HEDLEY_STATIC_CAST(simde__mmask16, k));
|
||||
r_.m256i[1] = simde_mm256_movm_epi16(HEDLEY_STATIC_CAST(simde__mmask16, k >> 16));
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i16) / sizeof(r_.i16[0])) ; i++) {
|
||||
r_.i16[i] = ((k >> i) & 1) ? ~INT16_C(0) : INT16_C(0);
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_movm_epi16
|
||||
#define _mm512_movm_epi16(k) simde_mm512_movm_epi16(k)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_movm_epi32 (simde__mmask8 k) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
return _mm_movm_epi32(k);
|
||||
#elif defined(SIMDE_X86_AVX2_NATIVE)
|
||||
const __m128i shifts = _mm_set_epi32(28, 29, 30, 31);
|
||||
__m128i r;
|
||||
|
||||
r = _mm_set1_epi32(HEDLEY_STATIC_CAST(int, k));
|
||||
r = _mm_sllv_epi32(r, shifts);
|
||||
r = _mm_srai_epi32(r, 31);
|
||||
|
||||
return r;
|
||||
#elif defined(SIMDE_X86_SSE2_NATIVE)
|
||||
const simde__m128i bits = simde_mm_set_epi32(0x10000000, 0x20000000, 0x40000000, INT32_MIN /* 0x80000000 */);
|
||||
simde__m128i r;
|
||||
|
||||
r = simde_mm_set1_epi16(HEDLEY_STATIC_CAST(short, k));
|
||||
r = simde_mm_mullo_epi16(r, bits);
|
||||
r = simde_mm_srai_epi32(r, 31);
|
||||
|
||||
return r;
|
||||
#else
|
||||
simde__m128i_private r_;
|
||||
|
||||
#if defined(SIMDE_ARM_NEON_A32V7_NATIVE)
|
||||
static const int32_t pos_data[] = { 31, 30, 29, 28 };
|
||||
const int32x4_t pos = vld1q_s32(pos_data);
|
||||
r_.neon_i32 = vshrq_n_s32(vshlq_s32(vdupq_n_s32(HEDLEY_STATIC_CAST(int32_t, k)), pos), 31);
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i32) / sizeof(r_.i32[0])) ; i++) {
|
||||
r_.i32[i] = ((k >> i) & 1) ? ~INT32_C(0) : INT32_C(0);
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m128i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_movm_epi32
|
||||
#define _mm_movm_epi32(k) simde_mm_movm_epi32(k)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_movm_epi32 (simde__mmask8 k) {
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
return _mm256_movm_epi32(k);
|
||||
#elif defined(SIMDE_X86_AVX2_NATIVE)
|
||||
const __m256i shifts = _mm256_set_epi32(24, 25, 26, 27, 28, 29, 30, 31);
|
||||
__m256i r;
|
||||
|
||||
r = _mm256_set1_epi32(HEDLEY_STATIC_CAST(int, k));
|
||||
r = _mm256_sllv_epi32(r, shifts);
|
||||
r = _mm256_srai_epi32(r, 31);
|
||||
|
||||
return r;
|
||||
#else
|
||||
simde__m256i_private r_;
|
||||
|
||||
#if SIMDE_NATURAL_VECTOR_SIZE_LE(128)
|
||||
r_.m128i[0] = simde_mm_movm_epi32(k );
|
||||
r_.m128i[1] = simde_mm_movm_epi32(k >> 4);
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i32) / sizeof(r_.i32[0])) ; i++) {
|
||||
r_.i32[i] = ((k >> i) & 1) ? ~INT32_C(0) : INT32_C(0);
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m256i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_movm_epi32
|
||||
#define _mm256_movm_epi32(k) simde_mm256_movm_epi32(k)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_movm_epi32 (simde__mmask16 k) {
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
return _mm512_movm_epi32(k);
|
||||
#else
|
||||
simde__m512i_private r_;
|
||||
|
||||
#if SIMDE_NATURAL_VECTOR_SIZE_LE(256)
|
||||
r_.m256i[0] = simde_mm256_movm_epi32(HEDLEY_STATIC_CAST(simde__mmask8, k ));
|
||||
r_.m256i[1] = simde_mm256_movm_epi32(HEDLEY_STATIC_CAST(simde__mmask8, k >> 8));
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i32) / sizeof(r_.i32[0])) ; i++) {
|
||||
r_.i32[i] = ((k >> i) & 1) ? ~INT32_C(0) : INT32_C(0);
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_movm_epi32
|
||||
#define _mm512_movm_epi32(k) simde_mm512_movm_epi32(k)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_movm_epi64 (simde__mmask8 k) {
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_movm_epi64(k);
|
||||
/* N.B. CM: These fallbacks may not be faster as there are only two elements */
|
||||
#elif defined(SIMDE_X86_AVX2_NATIVE)
|
||||
const __m128i shifts = _mm_set_epi32(30, 30, 31, 31);
|
||||
__m128i r;
|
||||
|
||||
r = _mm_set1_epi32(HEDLEY_STATIC_CAST(int, k));
|
||||
r = _mm_sllv_epi32(r, shifts);
|
||||
r = _mm_srai_epi32(r, 31);
|
||||
|
||||
return r;
|
||||
#elif defined(SIMDE_X86_SSE2_NATIVE)
|
||||
const simde__m128i bits = simde_mm_set_epi32(0x40000000, 0x40000000, INT32_MIN /* 0x80000000 */, INT32_MIN /* 0x80000000 */);
|
||||
simde__m128i r;
|
||||
|
||||
r = simde_mm_set1_epi16(HEDLEY_STATIC_CAST(short, k));
|
||||
r = simde_mm_mullo_epi16(r, bits);
|
||||
r = simde_mm_srai_epi32(r, 31);
|
||||
|
||||
return r;
|
||||
#else
|
||||
simde__m128i_private r_;
|
||||
|
||||
#if defined(SIMDE_ARM_NEON_A32V7_NATIVE)
|
||||
static const int64_t pos_data[] = { 63, 62 };
|
||||
const int64x2_t pos = vld1q_s64(pos_data);
|
||||
r_.neon_i64 = vshrq_n_s64(vshlq_s64(vdupq_n_s64(HEDLEY_STATIC_CAST(int64_t, k)), pos), 63);
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i64) / sizeof(r_.i64[0])) ; i++) {
|
||||
r_.i64[i] = ((k >> i) & 1) ? ~INT64_C(0) : INT64_C(0);
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m128i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_movm_epi64
|
||||
#define _mm_movm_epi64(k) simde_mm_movm_epi64(k)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_movm_epi64 (simde__mmask8 k) {
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_movm_epi64(k);
|
||||
#elif defined(SIMDE_X86_AVX2_NATIVE)
|
||||
const __m256i shifts = _mm256_set_epi32(28, 28, 29, 29, 30, 30, 31, 31);
|
||||
__m256i r;
|
||||
|
||||
r = _mm256_set1_epi32(HEDLEY_STATIC_CAST(int, k));
|
||||
r = _mm256_sllv_epi32(r, shifts);
|
||||
r = _mm256_srai_epi32(r, 31);
|
||||
|
||||
return r;
|
||||
#else
|
||||
simde__m256i_private r_;
|
||||
|
||||
/* N.B. CM: This fallback may not be faster as there are only four elements */
|
||||
#if SIMDE_NATURAL_VECTOR_SIZE_LE(128)
|
||||
r_.m128i[0] = simde_mm_movm_epi64(k );
|
||||
r_.m128i[1] = simde_mm_movm_epi64(k >> 2);
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i64) / sizeof(r_.i64[0])) ; i++) {
|
||||
r_.i64[i] = ((k >> i) & 1) ? ~INT64_C(0) : INT64_C(0);
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m256i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_movm_epi64
|
||||
#define _mm256_movm_epi64(k) simde_mm256_movm_epi64(k)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_movm_epi64 (simde__mmask8 k) {
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
return _mm512_movm_epi64(k);
|
||||
#else
|
||||
simde__m512i_private r_;
|
||||
|
||||
/* N.B. CM: Without AVX2 this fallback may not be faster as there are only eight elements */
|
||||
#if SIMDE_NATURAL_VECTOR_SIZE_LE(256)
|
||||
r_.m256i[0] = simde_mm256_movm_epi64(k );
|
||||
r_.m256i[1] = simde_mm256_movm_epi64(k >> 4);
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i64) / sizeof(r_.i64[0])) ; i++) {
|
||||
r_.i64[i] = ((k >> i) & 1) ? ~INT64_C(0) : INT64_C(0);
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_movm_epi64
|
||||
#define _mm512_movm_epi64(k) simde_mm512_movm_epi64(k)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_MOVM_H) */
|
||||
@@ -0,0 +1,279 @@
|
||||
/* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Copyright:
|
||||
* 2020 Evan Nemerson <evan@nemerson.com>
|
||||
* 2020 Himanshi Mathur <himanshi18037@iiitd.ac.in>
|
||||
* 2020 Hidayat Khan <huk2209@gmail.com>
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512_MUL_H)
|
||||
#define SIMDE_X86_AVX512_MUL_H
|
||||
|
||||
#include "types.h"
|
||||
#include "mov.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_mul_ps (simde__m512 a, simde__m512 b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mul_ps(a, b);
|
||||
#else
|
||||
simde__m512_private
|
||||
r_,
|
||||
a_ = simde__m512_to_private(a),
|
||||
b_ = simde__m512_to_private(b);
|
||||
|
||||
#if defined(SIMDE_VECTOR_SUBSCRIPT_OPS)
|
||||
r_.f32 = a_.f32 * b_.f32;
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m256) / sizeof(r_.m256[0])) ; i++) {
|
||||
r_.m256[i] = simde_mm256_mul_ps(a_.m256[i], b_.m256[i]);
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mul_ps
|
||||
#define _mm512_mul_ps(a, b) simde_mm512_mul_ps(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_mask_mul_ps(simde__m512 src, simde__mmask16 k, simde__m512 a, simde__m512 b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_mul_ps(src, k, a, b);
|
||||
#else
|
||||
return simde_mm512_mask_mov_ps(src, k, simde_mm512_mul_ps(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_mul_ps
|
||||
#define _mm512_mask_mul_ps(src, k, a, b) simde_mm512_mask_mul_ps(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_maskz_mul_ps(simde__mmask16 k, simde__m512 a, simde__m512 b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_maskz_mul_ps(k, a, b);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_ps(k, simde_mm512_mul_ps(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_mul_ps
|
||||
#define _mm512_maskz_mul_ps(k, a, b) simde_mm512_maskz_mul_ps(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_mul_pd (simde__m512d a, simde__m512d b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mul_pd(a, b);
|
||||
#else
|
||||
simde__m512d_private
|
||||
r_,
|
||||
a_ = simde__m512d_to_private(a),
|
||||
b_ = simde__m512d_to_private(b);
|
||||
|
||||
#if defined(SIMDE_VECTOR_SUBSCRIPT_OPS)
|
||||
r_.f64 = a_.f64 * b_.f64;
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m256d) / sizeof(r_.m256d[0])) ; i++) {
|
||||
r_.m256d[i] = simde_mm256_mul_pd(a_.m256d[i], b_.m256d[i]);
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512d_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mul_pd
|
||||
#define _mm512_mul_pd(a, b) simde_mm512_mul_pd(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_mask_mul_pd(simde__m512d src, simde__mmask8 k, simde__m512d a, simde__m512d b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_mul_pd(src, k, a, b);
|
||||
#else
|
||||
return simde_mm512_mask_mov_pd(src, k, simde_mm512_mul_pd(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_mul_pd
|
||||
#define _mm512_mask_mul_pd(src, k, a, b) simde_mm512_mask_mul_pd(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_maskz_mul_pd(simde__mmask8 k, simde__m512d a, simde__m512d b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_maskz_mul_pd(k, a, b);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_pd(k, simde_mm512_mul_pd(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_mul_pd
|
||||
#define _mm512_maskz_mul_pd(k, a, b) simde_mm512_maskz_mul_pd(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mul_epi32 (simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mul_epi32(a, b);
|
||||
#else
|
||||
simde__m512i_private
|
||||
r_,
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b);
|
||||
|
||||
#if defined(SIMDE_CONVERT_VECTOR_) && defined(SIMDE_SHUFFLE_VECTOR_)
|
||||
simde__m512i_private x;
|
||||
__typeof__(r_.i64) ta, tb;
|
||||
|
||||
/* Get even numbered 32-bit values */
|
||||
x.i32 = SIMDE_SHUFFLE_VECTOR_(32, 64, a_.i32, b_.i32, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30);
|
||||
/* Cast to 64 bits */
|
||||
SIMDE_CONVERT_VECTOR_(ta, x.m256i_private[0].i32);
|
||||
SIMDE_CONVERT_VECTOR_(tb, x.m256i_private[1].i32);
|
||||
r_.i64 = ta * tb;
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i64) / sizeof(r_.i64[0])) ; i++) {
|
||||
r_.i64[i] = HEDLEY_STATIC_CAST(int64_t, a_.i32[i << 1]) * HEDLEY_STATIC_CAST(int64_t, b_.i32[i << 1]);
|
||||
}
|
||||
#endif
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mul_epi32
|
||||
#define _mm512_mul_epi32(a, b) simde_mm512_mul_epi32(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_mul_epi32(simde__m512i src, simde__mmask8 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_mul_epi32(src, k, a, b);
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi64(src, k, simde_mm512_mul_epi32(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_mul_epi32
|
||||
#define _mm512_mask_mul_epi32(src, k, a, b) simde_mm512_mask_mul_epi32(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_mul_epi32(simde__mmask8 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_maskz_mul_epi32(k, a, b);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_epi64(k, simde_mm512_mul_epi32(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_mul_epi32
|
||||
#define _mm512_maskz_mul_epi32(k, a, b) simde_mm512_maskz_mul_epi32(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mul_epu32 (simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mul_epu32(a, b);
|
||||
#else
|
||||
simde__m512i_private
|
||||
r_,
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b);
|
||||
|
||||
#if defined(SIMDE_CONVERT_VECTOR_) && defined(SIMDE_SHUFFLE_VECTOR_)
|
||||
simde__m512i_private x;
|
||||
__typeof__(r_.u64) ta, tb;
|
||||
|
||||
x.u32 = SIMDE_SHUFFLE_VECTOR_(32, 64, a_.u32, b_.u32, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30);
|
||||
SIMDE_CONVERT_VECTOR_(ta, x.m256i_private[0].u32);
|
||||
SIMDE_CONVERT_VECTOR_(tb, x.m256i_private[1].u32);
|
||||
r_.u64 = ta * tb;
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.u64) / sizeof(r_.u64[0])) ; i++) {
|
||||
r_.u64[i] = HEDLEY_STATIC_CAST(uint64_t, a_.u32[i << 1]) * HEDLEY_STATIC_CAST(uint64_t, b_.u32[i << 1]);
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mul_epu32
|
||||
#define _mm512_mul_epu32(a, b) simde_mm512_mul_epu32(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_mul_epu32(simde__m512i src, simde__mmask8 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_mul_epu32(src, k, a, b);
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi64(src, k, simde_mm512_mul_epu32(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_mul_epu32
|
||||
#define _mm512_mask_mul_epu32(src, k, a, b) simde_mm512_mask_mul_epu32(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_mul_epu32(simde__mmask8 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_maskz_mul_epu32(k, a, b);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_epi64(k, simde_mm512_mul_epu32(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_mul_epu32
|
||||
#define _mm512_maskz_mul_epu32(k, a, b) simde_mm512_maskz_mul_epu32(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_MUL_H) */
|
||||
@@ -0,0 +1,65 @@
|
||||
/* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Copyright:
|
||||
* 2020 Evan Nemerson <evan@nemerson.com>
|
||||
* 2020 Hidayat Khan <huk2209@gmail.com>
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512_MULHI_H)
|
||||
#define SIMDE_X86_AVX512_MULHI_H
|
||||
|
||||
#include "types.h"
|
||||
#include "mov.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mulhi_epi16 (simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_mulhi_epi16(a, b);
|
||||
#else
|
||||
simde__m512i_private
|
||||
r_,
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b);
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i16) / sizeof(r_.i16[0])) ; i++) {
|
||||
r_.u16[i] = HEDLEY_STATIC_CAST(uint16_t, (HEDLEY_STATIC_CAST(uint32_t, HEDLEY_STATIC_CAST(int32_t, a_.i16[i]) * HEDLEY_STATIC_CAST(int32_t, b_.i16[i])) >> 16));
|
||||
}
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mulhi_epi16
|
||||
#define _mm512_mulhi_epi16(a, b) simde_mm512_mulhi_epi16(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_MULHI_H) */
|
||||
@@ -0,0 +1,65 @@
|
||||
/* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Copyright:
|
||||
* 2020 Evan Nemerson <evan@nemerson.com>
|
||||
* 2020 Hidayat Khan <huk2209@gmail.com>
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512_MULHRS_H)
|
||||
#define SIMDE_X86_AVX512_MULHRS_H
|
||||
|
||||
#include "types.h"
|
||||
#include "mov.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mulhrs_epi16 (simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_mulhrs_epi16(a, b);
|
||||
#else
|
||||
simde__m512i_private
|
||||
r_,
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b);
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i16) / sizeof(r_.i16[0])) ; i++) {
|
||||
r_.i16[i] = HEDLEY_STATIC_CAST(int16_t, (((HEDLEY_STATIC_CAST(int32_t, a_.i16[i]) * HEDLEY_STATIC_CAST(int32_t, b_.i16[i])) + 0x4000) >> 15));
|
||||
}
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mulhrs_epi16
|
||||
#define _mm512_mulhrs_epi16(a, b) simde_mm512_mulhrs_epi16(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_MULHRS_H) */
|
||||
@@ -0,0 +1,169 @@
|
||||
/* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Copyright:
|
||||
* 2020 Evan Nemerson <evan@nemerson.com>
|
||||
* 2020 Hidayat Khan <huk2209@gmail.com>
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512_MULLO_H)
|
||||
#define SIMDE_X86_AVX512_MULLO_H
|
||||
|
||||
#include "types.h"
|
||||
#include "mov.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mullo_epi16 (simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_mullo_epi16(a, b);
|
||||
#else
|
||||
simde__m512i_private
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b),
|
||||
r_;
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i16) / sizeof(r_.i16[0])) ; i++) {
|
||||
r_.i16[i] = HEDLEY_STATIC_CAST(int16_t, a_.i16[i] * b_.i16[i]);
|
||||
}
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mullo_epi16
|
||||
#define _mm512_mullo_epi16(a, b) simde_mm512_mullo_epi16(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mullo_epi32 (simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mullo_epi32(a, b);
|
||||
#else
|
||||
simde__m512i_private
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b),
|
||||
r_;
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i32) / sizeof(r_.i32[0])) ; i++) {
|
||||
r_.i32[i] = HEDLEY_STATIC_CAST(int32_t, a_.i32[i] * b_.i32[i]);
|
||||
}
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mullo_epi32
|
||||
#define _mm512_mullo_epi32(a, b) simde_mm512_mullo_epi32(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_mullo_epi32(simde__m512i src, simde__mmask16 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_mullo_epi32(src, k, a, b);
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi32(src, k, simde_mm512_mullo_epi32(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_mullo_epi32
|
||||
#define _mm512_mask_mullo_epi32(src, k, a, b) simde_mm512_mask_mullo_epi32(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_mullo_epi32(simde__mmask16 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_maskz_mullo_epi32(k, a, b);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_epi32(k, simde_mm512_mullo_epi32(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_mullo_epi32
|
||||
#define _mm512_maskz_mullo_epi32(k, a, b) simde_mm512_maskz_mullo_epi32(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mullo_epi64 (simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
return _mm512_mullo_epi64(a, b);
|
||||
#else
|
||||
simde__m512i_private
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b),
|
||||
r_;
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i64) / sizeof(r_.i64[0])) ; i++) {
|
||||
r_.i64[i] = HEDLEY_STATIC_CAST(int64_t, a_.i64[i] * b_.i64[i]);
|
||||
}
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mullo_epi64
|
||||
#define _mm512_mullo_epi64(a, b) simde_mm512_mullo_epi64(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_mullo_epi64(simde__m512i src, simde__mmask8 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
return _mm512_mask_mullo_epi64(src, k, a, b);
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi64(src, k, simde_mm512_mullo_epi64(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_mullo_epi64
|
||||
#define _mm512_mask_mullo_epi64(src, k, a, b) simde_mm512_mask_mullo_epi64(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_mullo_epi64(simde__mmask8 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
return _mm512_maskz_mullo_epi64(k, a, b);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_epi64(k, simde_mm512_mullo_epi64(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_mullo_epi64
|
||||
#define _mm512_maskz_mullo_epi64(k, a, b) simde_mm512_maskz_mullo_epi64(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_MULLO_H) */
|
||||
@@ -0,0 +1,170 @@
|
||||
#if !defined(SIMDE_X86_AVX512_MULTISHIFT_H)
|
||||
#define SIMDE_X86_AVX512_MULTISHIFT_H
|
||||
|
||||
#include "types.h"
|
||||
#include "mov.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_multishift_epi64_epi8 (simde__m128i a, simde__m128i b) {
|
||||
#if defined(SIMDE_X86_AVX512VBMI_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_multishift_epi64_epi8(a, b);
|
||||
#else
|
||||
simde__m128i_private
|
||||
r_,
|
||||
a_ = simde__m128i_to_private(a),
|
||||
b_ = simde__m128i_to_private(b);
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < sizeof(r_.u8) / sizeof(r_.u8[0]) ; i++) {
|
||||
r_.u8[i] = HEDLEY_STATIC_CAST(uint8_t, (b_.u64[i / 8] >> (a_.u8[i] & 63)) | (b_.u64[i / 8] << (64 - (a_.u8[i] & 63))));
|
||||
}
|
||||
|
||||
return simde__m128i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VBMI_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_multishift_epi64_epi8
|
||||
#define _mm_multishift_epi64_epi8(a, b) simde_mm_multishift_epi64_epi8(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_mask_multishift_epi64_epi8 (simde__m128i src, simde__mmask16 k, simde__m128i a, simde__m128i b) {
|
||||
#if defined(SIMDE_X86_AVX512VBMI_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_mask_multishift_epi64_epi8(src, k, a, b);
|
||||
#else
|
||||
return simde_mm_mask_mov_epi8(src, k, simde_mm_multishift_epi64_epi8(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VBMI_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_multishift_epi64_epi8
|
||||
#define _mm_mask_multishift_epi64_epi8(src, k, a, b) simde_mm_mask_multishift_epi64_epi8(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_maskz_multishift_epi64_epi8 (simde__mmask16 k, simde__m128i a, simde__m128i b) {
|
||||
#if defined(SIMDE_X86_AVX512VBMI_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_maskz_multishift_epi64_epi8(k, a, b);
|
||||
#else
|
||||
return simde_mm_maskz_mov_epi8(k, simde_mm_multishift_epi64_epi8(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VBMI_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_maskz_multishift_epi64_epi8
|
||||
#define _mm_maskz_multishift_epi64_epi8(k, a, b) simde_mm_maskz_multishift_epi64_epi8(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_multishift_epi64_epi8 (simde__m256i a, simde__m256i b) {
|
||||
#if defined(SIMDE_X86_AVX512VBMI_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_multishift_epi64_epi8(a, b);
|
||||
#else
|
||||
simde__m256i_private
|
||||
r_,
|
||||
a_ = simde__m256i_to_private(a),
|
||||
b_ = simde__m256i_to_private(b);
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < sizeof(r_.u8) / sizeof(r_.u8[0]) ; i++) {
|
||||
r_.u8[i] = HEDLEY_STATIC_CAST(uint8_t, (b_.u64[i / 8] >> (a_.u8[i] & 63)) | (b_.u64[i / 8] << (64 - (a_.u8[i] & 63))));
|
||||
}
|
||||
|
||||
return simde__m256i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VBMI_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_multishift_epi64_epi8
|
||||
#define _mm256_multishift_epi64_epi8(a, b) simde_mm256_multishift_epi64_epi8(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_mask_multishift_epi64_epi8 (simde__m256i src, simde__mmask32 k, simde__m256i a, simde__m256i b) {
|
||||
#if defined(SIMDE_X86_AVX512VBMI_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_mask_multishift_epi64_epi8(src, k, a, b);
|
||||
#else
|
||||
return simde_mm256_mask_mov_epi8(src, k, simde_mm256_multishift_epi64_epi8(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VBMI_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_mask_multishift_epi64_epi8
|
||||
#define _mm256_mask_multishift_epi64_epi8(src, k, a, b) simde_mm256_mask_multishift_epi64_epi8(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_maskz_multishift_epi64_epi8 (simde__mmask32 k, simde__m256i a, simde__m256i b) {
|
||||
#if defined(SIMDE_X86_AVX512VBMI_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_maskz_multishift_epi64_epi8(k, a, b);
|
||||
#else
|
||||
return simde_mm256_maskz_mov_epi8(k, simde_mm256_multishift_epi64_epi8(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VBMI_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_maskz_multishift_epi64_epi8
|
||||
#define _mm256_maskz_multishift_epi64_epi8(k, a, b) simde_mm256_maskz_multishift_epi64_epi8(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_multishift_epi64_epi8 (simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512VBMI_NATIVE)
|
||||
return _mm512_multishift_epi64_epi8(a, b);
|
||||
#else
|
||||
simde__m512i_private
|
||||
r_,
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b);
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < sizeof(r_.u8) / sizeof(r_.u8[0]) ; i++) {
|
||||
r_.u8[i] = HEDLEY_STATIC_CAST(uint8_t, (b_.u64[i / 8] >> (a_.u8[i] & 63)) | (b_.u64[i / 8] << (64 - (a_.u8[i] & 63))));
|
||||
}
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VBMI_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_multishift_epi64_epi8
|
||||
#define _mm512_multishift_epi64_epi8(a, b) simde_mm512_multishift_epi64_epi8(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_multishift_epi64_epi8 (simde__m512i src, simde__mmask64 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512VBMI_NATIVE)
|
||||
return _mm512_mask_multishift_epi64_epi8(src, k, a, b);
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi8(src, k, simde_mm512_multishift_epi64_epi8(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VBMI_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_multishift_epi64_epi8
|
||||
#define _mm512_mask_multishift_epi64_epi8(src, k, a, b) simde_mm512_mask_multishift_epi64_epi8(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_multishift_epi64_epi8 (simde__mmask64 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512VBMI_NATIVE)
|
||||
return _mm512_maskz_multishift_epi64_epi8(k, a, b);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_epi8(k, simde_mm512_multishift_epi64_epi8(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VBMI_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_multishift_epi64_epi8
|
||||
#define _mm512_maskz_multishift_epi64_epi8(k, a, b) simde_mm512_maskz_multishift_epi64_epi8(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_MULTISHIFT_H) */
|
||||
@@ -0,0 +1,88 @@
|
||||
/* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Copyright:
|
||||
* 2020 Evan Nemerson <evan@nemerson.com>
|
||||
* 2020 Himanshi Mathur <himanshi18037@iiitd.ac.in>
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512_NEGATE_H)
|
||||
#define SIMDE_X86_AVX512_NEGATE_H
|
||||
|
||||
#include "types.h"
|
||||
#include "mov.h"
|
||||
#include "xor.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_x_mm512_negate_ps(simde__m512 a) {
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
return simde_mm512_xor_ps(a,_mm512_set1_ps(SIMDE_FLOAT32_C(-0.0)));
|
||||
#else
|
||||
simde__m512_private
|
||||
r_,
|
||||
a_ = simde__m512_to_private(a);
|
||||
|
||||
#if defined(SIMDE_VECTOR_NEGATE)
|
||||
r_.f32 = -a_.f32;
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.f32) / sizeof(r_.f32[0])) ; i++) {
|
||||
r_.f32[i] = -a_.f32[i];
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_x_mm512_negate_pd(simde__m512d a) {
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
return simde_mm512_xor_pd(a, _mm512_set1_pd(SIMDE_FLOAT64_C(-0.0)));
|
||||
#else
|
||||
simde__m512d_private
|
||||
r_,
|
||||
a_ = simde__m512d_to_private(a);
|
||||
|
||||
#if defined(SIMDE_VECTOR_NEGATE)
|
||||
r_.f64 = -a_.f64;
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.f64) / sizeof(r_.f64[0])) ; i++) {
|
||||
r_.f64[i] = -a_.f64[i];
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512d_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_NEGATE_H) */
|
||||
@@ -0,0 +1,308 @@
|
||||
/* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Copyright:
|
||||
* 2020 Evan Nemerson <evan@nemerson.com>
|
||||
* 2020 Himanshi Mathur <himanshi18037@iiitd.ac.in>
|
||||
* 2020 Hidayat Khan <huk2209@gmail.com>
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512_OR_H)
|
||||
#define SIMDE_X86_AVX512_OR_H
|
||||
|
||||
#include "types.h"
|
||||
#include "../avx2.h"
|
||||
#include "mov.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_or_ps (simde__m512 a, simde__m512 b) {
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
return _mm512_or_ps(a, b);
|
||||
#else
|
||||
simde__m512_private
|
||||
r_,
|
||||
a_ = simde__m512_to_private(a),
|
||||
b_ = simde__m512_to_private(b);
|
||||
|
||||
#if SIMDE_NATURAL_VECTOR_SIZE_LE(256)
|
||||
r_.m256[0] = simde_mm256_or_ps(a_.m256[0], b_.m256[0]);
|
||||
r_.m256[1] = simde_mm256_or_ps(a_.m256[1], b_.m256[1]);
|
||||
#elif defined(SIMDE_VECTOR_SUBSCRIPT_OPS) && !defined(SIMDE_BUG_CLANG_BAD_VI64_OPS)
|
||||
r_.i32f = a_.i32f | b_.i32f;
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i32f) / sizeof(r_.i32f[0])) ; i++) {
|
||||
r_.i32f[i] = a_.i32f[i] | b_.i32f[i];
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_or_ps
|
||||
#define _mm512_or_ps(a, b) simde_mm512_or_ps(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_mask_or_ps(simde__m512 src, simde__mmask16 k, simde__m512 a, simde__m512 b) {
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
return _mm512_mask_or_ps(src, k, a, b);
|
||||
#else
|
||||
return simde_mm512_mask_mov_ps(src, k, simde_mm512_or_ps(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_or_ps
|
||||
#define _mm512_mask_or_ps(src, k, a, b) simde_mm512_mask_or_ps(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_maskz_or_ps(simde__mmask16 k, simde__m512 a, simde__m512 b) {
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
return _mm512_maskz_or_ps(k, a, b);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_ps(k, simde_mm512_or_ps(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_or_ps
|
||||
#define _mm512_maskz_or_ps(k, a, b) simde_mm512_maskz_or_ps(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_or_pd (simde__m512d a, simde__m512d b) {
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
return _mm512_or_pd(a, b);
|
||||
#else
|
||||
simde__m512d_private
|
||||
r_,
|
||||
a_ = simde__m512d_to_private(a),
|
||||
b_ = simde__m512d_to_private(b);
|
||||
|
||||
#if SIMDE_NATURAL_VECTOR_SIZE_LE(256)
|
||||
r_.m256d[0] = simde_mm256_or_pd(a_.m256d[0], b_.m256d[0]);
|
||||
r_.m256d[1] = simde_mm256_or_pd(a_.m256d[1], b_.m256d[1]);
|
||||
#elif defined(SIMDE_VECTOR_SUBSCRIPT_OPS) && !defined(SIMDE_BUG_CLANG_BAD_VI64_OPS)
|
||||
r_.i32f = a_.i32f | b_.i32f;
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i32f) / sizeof(r_.i32f[0])) ; i++) {
|
||||
r_.i32f[i] = a_.i32f[i] | b_.i32f[i];
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512d_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_or_pd
|
||||
#define _mm512_or_pd(a, b) simde_mm512_or_pd(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_mask_or_pd(simde__m512d src, simde__mmask8 k, simde__m512d a, simde__m512d b) {
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
return _mm512_mask_or_pd(src, k, a, b);
|
||||
#else
|
||||
return simde_mm512_mask_mov_pd(src, k, simde_mm512_or_pd(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_or_pd
|
||||
#define _mm512_mask_or_pd(src, k, a, b) simde_mm512_mask_or_pd(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_maskz_or_pd(simde__mmask8 k, simde__m512d a, simde__m512d b) {
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
return _mm512_maskz_or_pd(k, a, b);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_pd(k, simde_mm512_or_pd(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_or_pd
|
||||
#define _mm512_maskz_or_pd(k, a, b) simde_mm512_maskz_or_pd(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_or_epi32 (simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_or_epi32(a, b);
|
||||
#else
|
||||
simde__m512i_private
|
||||
r_,
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b);
|
||||
|
||||
#if defined(SIMDE_VECTOR_SUBSCRIPT_OPS)
|
||||
r_.i32 = a_.i32 | b_.i32;
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i32) / sizeof(r_.i32[0])) ; i++) {
|
||||
r_.i32[i] = a_.i32[i] | b_.i32[i];
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_or_epi32
|
||||
#define _mm512_or_epi32(a, b) simde_mm512_or_epi32(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_or_epi32(simde__m512i src, simde__mmask16 k, simde__m512i v2, simde__m512i v3) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_or_epi32(src, k, v2, v3);
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi32(src, k, simde_mm512_or_epi32(v2, v3));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_or_epi32
|
||||
#define _mm512_mask_or_epi32(src, k, v2, v3) simde_mm512_mask_or_epi32(src, k, v2, v3)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_or_epi32(simde__mmask16 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_maskz_or_epi32(k, a, b);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_epi32(k, simde_mm512_or_epi32(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_or_epi32
|
||||
#define _mm512_maskz_or_epi32(k, a, b) simde_mm512_maskz_or_epi32(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_or_epi64 (simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_or_epi64(a, b);
|
||||
#else
|
||||
simde__m512i_private
|
||||
r_,
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b);
|
||||
|
||||
#if SIMDE_NATURAL_VECTOR_SIZE_LE(256)
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m256i) / sizeof(r_.m256i[0])) ; i++) {
|
||||
r_.m256i[i] = simde_mm256_or_si256(a_.m256i[i], b_.m256i[i]);
|
||||
}
|
||||
#elif defined(SIMDE_VECTOR_SUBSCRIPT_OPS) && !defined(SIMDE_BUG_CLANG_BAD_VI64_OPS)
|
||||
r_.i32f = a_.i32f | b_.i32f;
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i32f) / sizeof(r_.i32f[0])) ; i++) {
|
||||
r_.i32f[i] = a_.i32f[i] | b_.i32f[i];
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_or_epi64
|
||||
#define _mm512_or_epi64(a, b) simde_mm512_or_epi64(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_or_epi64(simde__m512i src, simde__mmask8 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_or_epi64(src, k, a, b);
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi64(src, k, simde_mm512_or_epi64(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_or_epi64
|
||||
#define _mm512_mask_or_epi64(src, k, a, b) simde_mm512_mask_or_epi64(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_or_epi64(simde__mmask8 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_maskz_or_epi64(k, a, b);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_epi64(k, simde_mm512_or_epi64(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_or_epi64
|
||||
#define _mm512_maskz_or_epi64(k, a, b) simde_mm512_maskz_or_epi64(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_or_si512 (simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_or_si512(a, b);
|
||||
#else
|
||||
simde__m512i_private
|
||||
r_,
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b);
|
||||
|
||||
#if defined(SIMDE_X86_AVX2_NATIVE)
|
||||
r_.m256i[0] = simde_mm256_or_si256(a_.m256i[0], b_.m256i[0]);
|
||||
r_.m256i[1] = simde_mm256_or_si256(a_.m256i[1], b_.m256i[1]);
|
||||
#elif defined(SIMDE_VECTOR_SUBSCRIPT_OPS)
|
||||
r_.i32f = a_.i32f | b_.i32f;
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i32) / sizeof(r_.i32[0])) ; i++) {
|
||||
r_.i32f[i] = a_.i32f[i] | b_.i32f[i];
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_or_si512
|
||||
#define _mm512_or_si512(a, b) simde_mm512_or_si512(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_OR_H) */
|
||||
@@ -0,0 +1,122 @@
|
||||
/* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Copyright:
|
||||
* 2020 Evan Nemerson <evan@nemerson.com>
|
||||
* 2020 Hidayat Khan <huk2209@gmail.com>
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512_PACKS_H)
|
||||
#define SIMDE_X86_AVX512_PACKS_H
|
||||
|
||||
#include "types.h"
|
||||
#include "../avx2.h"
|
||||
#include "mov.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_packs_epi16 (simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_packs_epi16(a, b);
|
||||
#else
|
||||
simde__m512i_private
|
||||
r_,
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b);
|
||||
|
||||
#if SIMDE_NATURAL_VECTOR_SIZE_LE(256)
|
||||
r_.m256i[0] = simde_mm256_packs_epi16(a_.m256i[0], b_.m256i[0]);
|
||||
r_.m256i[1] = simde_mm256_packs_epi16(a_.m256i[1], b_.m256i[1]);
|
||||
#else
|
||||
const size_t halfway_point = (sizeof(r_.i8) / sizeof(r_.i8[0])) / 2;
|
||||
const size_t quarter_point = (sizeof(r_.i8) / sizeof(r_.i8[0])) / 4;
|
||||
const size_t octet_point = (sizeof(r_.i8) / sizeof(r_.i8[0])) / 8;
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < octet_point ; i++) {
|
||||
r_.i8[i] = (a_.i16[i] > INT8_MAX) ? INT8_MAX : ((a_.i16[i] < INT8_MIN) ? INT8_MIN : HEDLEY_STATIC_CAST(int8_t, a_.i16[i]));
|
||||
r_.i8[i + octet_point] = (b_.i16[i] > INT8_MAX) ? INT8_MAX : ((b_.i16[i] < INT8_MIN) ? INT8_MIN : HEDLEY_STATIC_CAST(int8_t, b_.i16[i]));
|
||||
r_.i8[quarter_point + i] = (a_.i16[octet_point + i] > INT8_MAX) ? INT8_MAX : ((a_.i16[octet_point + i] < INT8_MIN) ? INT8_MIN : HEDLEY_STATIC_CAST(int8_t, a_.i16[octet_point + i]));
|
||||
r_.i8[quarter_point + i + octet_point] = (b_.i16[octet_point + i] > INT8_MAX) ? INT8_MAX : ((b_.i16[octet_point + i] < INT8_MIN) ? INT8_MIN : HEDLEY_STATIC_CAST(int8_t, b_.i16[octet_point + i]));
|
||||
r_.i8[halfway_point + i] = (a_.i16[quarter_point + i] > INT8_MAX) ? INT8_MAX : ((a_.i16[quarter_point + i] < INT8_MIN) ? INT8_MIN : HEDLEY_STATIC_CAST(int8_t, a_.i16[quarter_point + i]));
|
||||
r_.i8[halfway_point + i + octet_point] = (b_.i16[quarter_point + i] > INT8_MAX) ? INT8_MAX : ((b_.i16[quarter_point + i] < INT8_MIN) ? INT8_MIN : HEDLEY_STATIC_CAST(int8_t, b_.i16[quarter_point + i]));
|
||||
r_.i8[halfway_point + quarter_point + i] = (a_.i16[quarter_point + octet_point + i] > INT8_MAX) ? INT8_MAX : ((a_.i16[quarter_point + octet_point + i] < INT8_MIN) ? INT8_MIN : HEDLEY_STATIC_CAST(int8_t, a_.i16[quarter_point + octet_point + i]));
|
||||
r_.i8[halfway_point + quarter_point + i + octet_point] = (b_.i16[quarter_point + octet_point + i] > INT8_MAX) ? INT8_MAX : ((b_.i16[quarter_point + octet_point + i] < INT8_MIN) ? INT8_MIN : HEDLEY_STATIC_CAST(int8_t, b_.i16[quarter_point + octet_point + i]));
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_packs_epi16
|
||||
#define _mm512_packs_epi16(a, b) simde_mm512_packs_epi16(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_packs_epi32 (simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_packs_epi32(a, b);
|
||||
#else
|
||||
simde__m512i_private
|
||||
r_,
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b);
|
||||
|
||||
#if SIMDE_NATURAL_VECTOR_SIZE_LE(256)
|
||||
r_.m256i[0] = simde_mm256_packs_epi32(a_.m256i[0], b_.m256i[0]);
|
||||
r_.m256i[1] = simde_mm256_packs_epi32(a_.m256i[1], b_.m256i[1]);
|
||||
#else
|
||||
const size_t halfway_point = (sizeof(r_.i16) / sizeof(r_.i16[0])) / 2;
|
||||
const size_t quarter_point = (sizeof(r_.i16) / sizeof(r_.i16[0])) / 4;
|
||||
const size_t octet_point = (sizeof(r_.i16) / sizeof(r_.i16[0])) / 8;
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < octet_point ; i++) {
|
||||
r_.i16[i] = (a_.i32[i] > INT16_MAX) ? INT16_MAX : ((a_.i32[i] < INT16_MIN) ? INT16_MIN : HEDLEY_STATIC_CAST(int16_t, a_.i32[i]));
|
||||
r_.i16[i + octet_point] = (b_.i32[i] > INT16_MAX) ? INT16_MAX : ((b_.i32[i] < INT16_MIN) ? INT16_MIN : HEDLEY_STATIC_CAST(int16_t, b_.i32[i]));
|
||||
r_.i16[quarter_point + i] = (a_.i32[octet_point + i] > INT16_MAX) ? INT16_MAX : ((a_.i32[octet_point + i] < INT16_MIN) ? INT16_MIN : HEDLEY_STATIC_CAST(int16_t, a_.i32[octet_point + i]));
|
||||
r_.i16[quarter_point + i + octet_point] = (b_.i32[octet_point + i] > INT16_MAX) ? INT16_MAX : ((b_.i32[octet_point + i] < INT16_MIN) ? INT16_MIN : HEDLEY_STATIC_CAST(int16_t, b_.i32[octet_point + i]));
|
||||
r_.i16[halfway_point + i] = (a_.i32[quarter_point + i] > INT16_MAX) ? INT16_MAX : ((a_.i32[quarter_point +i] < INT16_MIN) ? INT16_MIN : HEDLEY_STATIC_CAST(int16_t, a_.i32[quarter_point + i]));
|
||||
r_.i16[halfway_point + i + octet_point] = (b_.i32[quarter_point + i] > INT16_MAX) ? INT16_MAX : ((b_.i32[quarter_point + i] < INT16_MIN) ? INT16_MIN : HEDLEY_STATIC_CAST(int16_t, b_.i32[quarter_point +i]));
|
||||
r_.i16[halfway_point + quarter_point + i] = (a_.i32[quarter_point + octet_point + i] > INT16_MAX) ? INT16_MAX : ((a_.i32[quarter_point + octet_point + i] < INT16_MIN) ? INT16_MIN : HEDLEY_STATIC_CAST(int16_t, a_.i32[quarter_point + octet_point + i]));
|
||||
r_.i16[halfway_point + quarter_point + i + octet_point] = (b_.i32[quarter_point + octet_point + i] > INT16_MAX) ? INT16_MAX : ((b_.i32[quarter_point + octet_point + i] < INT16_MIN) ? INT16_MIN : HEDLEY_STATIC_CAST(int16_t, b_.i32[quarter_point + octet_point + i]));
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_packs_epi32
|
||||
#define _mm512_packs_epi32(a, b) simde_mm512_packs_epi32(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_PACKS_H) */
|
||||
@@ -0,0 +1,122 @@
|
||||
/* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Copyright:
|
||||
* 2020 Evan Nemerson <evan@nemerson.com>
|
||||
* 2020 Hidayat Khan <huk2209@gmail.com>
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512_PACKUS_H)
|
||||
#define SIMDE_X86_AVX512_PACKUS_H
|
||||
|
||||
#include "types.h"
|
||||
#include "../avx2.h"
|
||||
#include "mov.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_packus_epi16 (simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_packus_epi16(a, b);
|
||||
#else
|
||||
simde__m512i_private
|
||||
r_,
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b);
|
||||
|
||||
#if SIMDE_NATURAL_VECTOR_SIZE_LE(256)
|
||||
r_.m256i[0] = simde_mm256_packus_epi16(a_.m256i[0], b_.m256i[0]);
|
||||
r_.m256i[1] = simde_mm256_packus_epi16(a_.m256i[1], b_.m256i[1]);
|
||||
#else
|
||||
const size_t halfway_point = (sizeof(r_.i8) / sizeof(r_.i8[0])) / 2;
|
||||
const size_t quarter_point = (sizeof(r_.i8) / sizeof(r_.i8[0])) / 4;
|
||||
const size_t octet_point = (sizeof(r_.i8) / sizeof(r_.i8[0])) / 8;
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < octet_point ; i++) {
|
||||
r_.u8[i] = (a_.i16[i] > UINT8_MAX) ? UINT8_MAX : ((a_.i16[i] < 0) ? UINT8_C(0) : HEDLEY_STATIC_CAST(uint8_t, a_.i16[i]));
|
||||
r_.u8[i + octet_point] = (b_.i16[i] > UINT8_MAX) ? UINT8_MAX : ((b_.i16[i] < 0) ? UINT8_C(0) : HEDLEY_STATIC_CAST(uint8_t, b_.i16[i]));
|
||||
r_.u8[quarter_point + i] = (a_.i16[octet_point + i] > UINT8_MAX) ? UINT8_MAX : ((a_.i16[octet_point + i] < 0) ? UINT8_C(0) : HEDLEY_STATIC_CAST(uint8_t, a_.i16[octet_point + i]));
|
||||
r_.u8[quarter_point + i + octet_point] = (b_.i16[octet_point + i] > UINT8_MAX) ? UINT8_MAX : ((b_.i16[octet_point + i] < 0) ? UINT8_C(0) : HEDLEY_STATIC_CAST(uint8_t, b_.i16[octet_point + i]));
|
||||
r_.u8[halfway_point + i] = (a_.i16[quarter_point + i] > UINT8_MAX) ? UINT8_MAX : ((a_.i16[quarter_point + i] < 0) ? UINT8_C(0) : HEDLEY_STATIC_CAST(uint8_t, a_.i16[quarter_point + i]));
|
||||
r_.u8[halfway_point + i + octet_point] = (b_.i16[quarter_point + i] > UINT8_MAX) ? UINT8_MAX : ((b_.i16[quarter_point + i] < 0) ? UINT8_C(0) : HEDLEY_STATIC_CAST(uint8_t, b_.i16[quarter_point + i]));
|
||||
r_.u8[halfway_point + quarter_point + i] = (a_.i16[quarter_point + octet_point + i] > UINT8_MAX) ? UINT8_MAX : ((a_.i16[quarter_point + octet_point + i] < 0) ? UINT8_C(0) : HEDLEY_STATIC_CAST(uint8_t, a_.i16[quarter_point + octet_point + i]));
|
||||
r_.u8[halfway_point + quarter_point + i + octet_point] = (b_.i16[quarter_point + octet_point + i] > UINT8_MAX) ? UINT8_MAX : ((b_.i16[quarter_point + octet_point + i] < 0) ? UINT8_C(0) : HEDLEY_STATIC_CAST(uint8_t, b_.i16[quarter_point + octet_point + i]));
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_packus_epi16
|
||||
#define _mm512_packus_epi16(a, b) simde_mm512_packus_epi16(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_packus_epi32 (simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_packus_epi32(a, b);
|
||||
#else
|
||||
simde__m512i_private
|
||||
r_,
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b);
|
||||
|
||||
#if SIMDE_NATURAL_VECTOR_SIZE_LE(256)
|
||||
for (size_t i = 0 ; i < (sizeof(a_.m256i) / sizeof(a_.m256i[0])) ; i++) {
|
||||
r_.m256i[i] = simde_mm256_packus_epi32(a_.m256i[i], b_.m256i[i]);
|
||||
}
|
||||
#else
|
||||
const size_t halfway_point = (sizeof(r_.i16) / sizeof(r_.i16[0])) / 2;
|
||||
const size_t quarter_point = (sizeof(r_.i16) / sizeof(r_.i16[0])) / 4;
|
||||
const size_t octet_point = (sizeof(r_.i16) / sizeof(r_.i16[0])) / 8;
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < octet_point ; i++) {
|
||||
r_.u16[i] = (a_.i32[i] > UINT16_MAX) ? UINT16_MAX : ((a_.i32[i] < 0) ? UINT16_C(0) : HEDLEY_STATIC_CAST(uint16_t, a_.i32[i]));
|
||||
r_.u16[i + octet_point] = (b_.i32[i] > UINT16_MAX) ? UINT16_MAX : ((b_.i32[i] < 0) ? UINT16_C(0) : HEDLEY_STATIC_CAST(uint16_t, b_.i32[i]));
|
||||
r_.u16[quarter_point + i] = (a_.i32[octet_point + i] > UINT16_MAX) ? UINT16_MAX : ((a_.i32[octet_point + i] < 0) ? UINT16_C(0) : HEDLEY_STATIC_CAST(uint16_t, a_.i32[octet_point + i]));
|
||||
r_.u16[quarter_point + i + octet_point] = (b_.i32[octet_point + i] > UINT16_MAX) ? UINT16_MAX : ((b_.i32[octet_point + i] < 0) ? UINT16_C(0) : HEDLEY_STATIC_CAST(uint16_t, b_.i32[octet_point + i]));
|
||||
r_.u16[halfway_point + i] = (a_.i32[quarter_point + i] > UINT16_MAX) ? UINT16_MAX : ((a_.i32[quarter_point +i] < 0) ? UINT16_C(0) : HEDLEY_STATIC_CAST(uint16_t, a_.i32[quarter_point + i]));
|
||||
r_.u16[halfway_point + i + octet_point] = (b_.i32[quarter_point + i] > UINT16_MAX) ? UINT16_MAX : ((b_.i32[quarter_point + i] < 0) ? UINT16_C(0) : HEDLEY_STATIC_CAST(uint16_t, b_.i32[quarter_point +i]));
|
||||
r_.u16[halfway_point + quarter_point + i] = (a_.i32[quarter_point + octet_point + i] > UINT16_MAX) ? UINT16_MAX : ((a_.i32[quarter_point + octet_point + i] < 0) ? UINT16_C(0) : HEDLEY_STATIC_CAST(uint16_t, a_.i32[quarter_point + octet_point + i]));
|
||||
r_.u16[halfway_point + quarter_point + i + octet_point] = (b_.i32[quarter_point + octet_point + i] > UINT16_MAX) ? UINT16_MAX : ((b_.i32[quarter_point + octet_point + i] < 0) ? UINT16_C(0) : HEDLEY_STATIC_CAST(uint16_t, b_.i32[quarter_point + octet_point + i]));
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_packus_epi32
|
||||
#define _mm512_packus_epi32(a, b) simde_mm512_packus_epi32(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_PACKUS_H) */
|
||||
@@ -0,0 +1,101 @@
|
||||
/* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Copyright:
|
||||
* 2023 Michael R. Crusoe <crusoe@debian.org>
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512_PERMUTEX_H)
|
||||
#define SIMDE_X86_AVX512_PERMUTEX_H
|
||||
|
||||
#include "types.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_permutex_epi64 (simde__m256i a, const int imm8) {
|
||||
simde__m256i_private
|
||||
a_ = simde__m256i_to_private(a),
|
||||
r_;
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i64) / sizeof(r_.i64[0])) ; i++) {
|
||||
r_.i64[i] = a_.i64[(imm8 >> (i*2)) & 3];
|
||||
}
|
||||
|
||||
return simde__m256i_from_private(r_);
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
#define simde_mm256_permutex_epi64(a, imm8) _mm256_permutex_epi64((a), (imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_permutex_epi64
|
||||
#define _mm256_permutex_epi64(a, imm8) simde_mm256_permutex_epi64((a), (imm8))
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_permutex_epi64 (simde__m512i a, const int imm8) {
|
||||
simde__m512i_private
|
||||
a_ = simde__m512i_to_private(a),
|
||||
r_;
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m256i_private[0].i64) / sizeof(r_.m256i_private[0].i64[0])) ; i++) {
|
||||
r_.m256i_private[0].i64[i] = a_.m256i_private[0].i64[(imm8 >> (i*2)) & 3];
|
||||
r_.m256i_private[1].i64[i] = a_.m256i_private[1].i64[(imm8 >> (i*2)) & 3];
|
||||
}
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define simde_mm512_permutex_epi64(a, imm8) _mm512_permutex_epi64((a), (imm8))
|
||||
#elif defined(SIMDE_STATEMENT_EXPR_)
|
||||
#define simde_mm512_permutex_epi64(a, imm8) SIMDE_STATEMENT_EXPR_(({\
|
||||
simde__m512i_private simde_mm512_permutex_epi64_a_ = simde__m512i_to_private((a)), simde_mm512_permutex_epi64_r_; \
|
||||
simde_mm512_permutex_epi64_r_.m256i[0] = simde_mm256_permutex_epi64(simde_mm512_permutex_epi64_a_.m256i[0], (imm8)); \
|
||||
simde_mm512_permutex_epi64_r_.m256i[1] = simde_mm256_permutex_epi64(simde_mm512_permutex_epi64_a_.m256i[1], (imm8)); \
|
||||
simde__m512i_from_private(simde_mm512_permutex_epi64_r_); \
|
||||
}))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_permutex_epi64
|
||||
#define _mm512_permutex_epi64(a, imm8) simde_mm512_permutex_epi64((a), (imm8))
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define simde_mm512_mask_permutex_epi64(src, k, a, imm8) _mm512_mask_permutex_epi64((src), (k), (a), (imm8))
|
||||
#else
|
||||
#define simde_mm512_mask_permutex_epi64(src, k, a, imm8) simde_mm512_mask_mov_epi64((src), (k), simde_mm512_permutex_epi64((a), (imm8)))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_permutex_epi64
|
||||
#define _mm512_mask_permutex_epi64(src, k, a, imm8) simde_mm512_mask_permutex_epi64((src), (k), (a), (imm8))
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_PERMUTEX_H) */
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,745 @@
|
||||
#if !defined(SIMDE_X86_AVX512_RANGE_H)
|
||||
#define SIMDE_X86_AVX512_RANGE_H
|
||||
|
||||
#include "types.h"
|
||||
#include "max.h"
|
||||
#include "min.h"
|
||||
#include "set1.h"
|
||||
#include "copysign.h"
|
||||
#include "abs.h"
|
||||
#include "setzero.h"
|
||||
#include "cmp.h"
|
||||
#include "or.h"
|
||||
#include "andnot.h"
|
||||
#include "insert.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128
|
||||
simde_mm_range_ps (simde__m128 a, simde__m128 b, int imm8)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 15) {
|
||||
simde__m128 r;
|
||||
|
||||
switch (imm8 & 3) {
|
||||
case 0:
|
||||
r = simde_mm_min_ps(a, b);
|
||||
break;
|
||||
case 1:
|
||||
r = simde_mm_max_ps(a, b);
|
||||
break;
|
||||
case 2:
|
||||
r = simde_x_mm_select_ps(b, a, simde_mm_cmple_ps(simde_x_mm_abs_ps(a), simde_x_mm_abs_ps(b)));
|
||||
break;
|
||||
case 3:
|
||||
r = simde_x_mm_select_ps(b, a, simde_mm_cmpge_ps(simde_x_mm_abs_ps(a), simde_x_mm_abs_ps(b)));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
switch (imm8 & 12) {
|
||||
case 0:
|
||||
r = simde_x_mm_copysign_ps(r, a);
|
||||
break;
|
||||
case 8:
|
||||
r = simde_mm_andnot_ps(simde_mm_set1_ps(SIMDE_FLOAT32_C(-0.0)), r);
|
||||
break;
|
||||
case 12:
|
||||
r = simde_mm_or_ps(simde_mm_set1_ps(SIMDE_FLOAT32_C(-0.0)), r);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
#define simde_mm_range_ps(a, b, imm8) _mm_range_ps((a), (b), (imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_range_ps
|
||||
#define _mm_range_ps(a, b, imm8) simde_mm_range_ps(a, b, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
#define simde_mm_mask_range_ps(src, k, a, b, imm8) _mm_mask_range_ps(src, k, a, b, imm8)
|
||||
#else
|
||||
#define simde_mm_mask_range_ps(src, k, a, b, imm8) simde_mm_mask_mov_ps(src, k, simde_mm_range_ps(a, b, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_range_ps
|
||||
#define _mm_mask_range_ps(src, k, a, b, imm8) simde_mm_mask_range_ps(src, k, a, b, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
#define simde_mm_maskz_range_ps(k, a, b, imm8) _mm_maskz_range_ps(k, a, b, imm8)
|
||||
#else
|
||||
#define simde_mm_maskz_range_ps(k, a, b, imm8) simde_mm_maskz_mov_ps(k, simde_mm_range_ps(a, b, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_maskz_range_ps
|
||||
#define _mm_maskz_range_ps(k, a, b, imm8) simde_mm_maskz_range_ps(k, a, b, imm8)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256
|
||||
simde_mm256_range_ps (simde__m256 a, simde__m256 b, int imm8)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 15) {
|
||||
simde__m256 r;
|
||||
|
||||
switch (imm8 & 3) {
|
||||
case 0:
|
||||
r = simde_mm256_min_ps(a, b);
|
||||
break;
|
||||
case 1:
|
||||
r = simde_mm256_max_ps(a, b);
|
||||
break;
|
||||
case 2:
|
||||
r = simde_x_mm256_select_ps(b, a, simde_mm256_cmp_ps(simde_x_mm256_abs_ps(a), simde_x_mm256_abs_ps(b), SIMDE_CMP_LE_OQ));
|
||||
break;
|
||||
case 3:
|
||||
r = simde_x_mm256_select_ps(b, a, simde_mm256_cmp_ps(simde_x_mm256_abs_ps(a), simde_x_mm256_abs_ps(b), SIMDE_CMP_GE_OQ));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
switch (imm8 & 12) {
|
||||
case 0:
|
||||
r = simde_x_mm256_copysign_ps(r, a);
|
||||
break;
|
||||
case 8:
|
||||
r = simde_mm256_andnot_ps(simde_mm256_set1_ps(SIMDE_FLOAT32_C(-0.0)), r);
|
||||
break;
|
||||
case 12:
|
||||
r = simde_mm256_or_ps(simde_mm256_set1_ps(SIMDE_FLOAT32_C(-0.0)), r);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
#define simde_mm256_range_ps(a, b, imm8) _mm256_range_ps((a), (b), (imm8))
|
||||
#elif SIMDE_NATURAL_VECTOR_SIZE_LE(128) && defined(SIMDE_STATEMENT_EXPR_)
|
||||
#define simde_mm256_range_ps(a, b, imm8) SIMDE_STATEMENT_EXPR_(({ \
|
||||
simde__m256_private \
|
||||
simde_mm256_range_ps_r_ = simde__m256_to_private(simde_mm256_setzero_ps()), \
|
||||
simde_mm256_range_ps_a_ = simde__m256_to_private(a), \
|
||||
simde_mm256_range_ps_b_ = simde__m256_to_private(b); \
|
||||
\
|
||||
for (size_t simde_mm256_range_ps_i = 0 ; simde_mm256_range_ps_i < (sizeof(simde_mm256_range_ps_r_.m128) / sizeof(simde_mm256_range_ps_r_.m128[0])) ; simde_mm256_range_ps_i++) { \
|
||||
simde_mm256_range_ps_r_.m128[simde_mm256_range_ps_i] = simde_mm_range_ps(simde_mm256_range_ps_a_.m128[simde_mm256_range_ps_i], simde_mm256_range_ps_b_.m128[simde_mm256_range_ps_i], imm8); \
|
||||
} \
|
||||
\
|
||||
simde__m256_from_private(simde_mm256_range_ps_r_); \
|
||||
}))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_range_ps
|
||||
#define _mm256_range_ps(a, b, imm8) simde_mm256_range_ps(a, b, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
#define simde_mm256_mask_range_ps(src, k, a, b, imm8) _mm256_mask_range_ps(src, k, a, b, imm8)
|
||||
#else
|
||||
#define simde_mm256_mask_range_ps(src, k, a, b, imm8) simde_mm256_mask_mov_ps(src, k, simde_mm256_range_ps(a, b, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_mask_range_ps
|
||||
#define _mm256_mask_range_ps(src, k, a, b, imm8) simde_mm256_mask_range_ps(src, k, a, b, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
#define simde_mm256_maskz_range_ps(k, a, b, imm8) _mm256_maskz_range_ps(k, a, b, imm8)
|
||||
#else
|
||||
#define simde_mm256_maskz_range_ps(k, a, b, imm8) simde_mm256_maskz_mov_ps(k, simde_mm256_range_ps(a, b, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_maskz_range_ps
|
||||
#define _mm256_maskz_range_ps(k, a, b, imm8) simde_mm256_maskz_range_ps(k, a, b, imm8)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_range_ps (simde__m512 a, simde__m512 b, int imm8)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 15) {
|
||||
simde__m512 r;
|
||||
|
||||
switch (imm8 & 3) {
|
||||
case 0:
|
||||
r = simde_mm512_min_ps(a, b);
|
||||
break;
|
||||
case 1:
|
||||
r = simde_mm512_max_ps(a, b);
|
||||
break;
|
||||
case 2:
|
||||
r = simde_mm512_mask_mov_ps(b, simde_mm512_cmp_ps_mask(simde_mm512_abs_ps(a), simde_mm512_abs_ps(b), SIMDE_CMP_LE_OS), a);
|
||||
break;
|
||||
case 3:
|
||||
r = simde_mm512_mask_mov_ps(a, simde_mm512_cmp_ps_mask(simde_mm512_abs_ps(b), simde_mm512_abs_ps(a), SIMDE_CMP_GE_OS), b);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
switch (imm8 & 12) {
|
||||
case 0:
|
||||
r = simde_x_mm512_copysign_ps(r, a);
|
||||
break;
|
||||
case 8:
|
||||
r = simde_mm512_andnot_ps(simde_mm512_set1_ps(SIMDE_FLOAT32_C(-0.0)), r);
|
||||
break;
|
||||
case 12:
|
||||
r = simde_mm512_or_ps(simde_mm512_set1_ps(SIMDE_FLOAT32_C(-0.0)), r);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
#define simde_mm512_range_ps(a, b, imm8) _mm512_range_ps((a), (b), (imm8))
|
||||
#elif SIMDE_NATURAL_VECTOR_SIZE_LE(128) && defined(SIMDE_STATEMENT_EXPR_)
|
||||
#define simde_mm512_range_ps(a, b, imm8) SIMDE_STATEMENT_EXPR_(({ \
|
||||
simde__m512_private \
|
||||
simde_mm512_range_ps_r_ = simde__m512_to_private(simde_mm512_setzero_ps()), \
|
||||
simde_mm512_range_ps_a_ = simde__m512_to_private(a), \
|
||||
simde_mm512_range_ps_b_ = simde__m512_to_private(b); \
|
||||
\
|
||||
for (size_t simde_mm512_range_ps_i = 0 ; simde_mm512_range_ps_i < (sizeof(simde_mm512_range_ps_r_.m128) / sizeof(simde_mm512_range_ps_r_.m128[0])) ; simde_mm512_range_ps_i++) { \
|
||||
simde_mm512_range_ps_r_.m128[simde_mm512_range_ps_i] = simde_mm_range_ps(simde_mm512_range_ps_a_.m128[simde_mm512_range_ps_i], simde_mm512_range_ps_b_.m128[simde_mm512_range_ps_i], imm8); \
|
||||
} \
|
||||
\
|
||||
simde__m512_from_private(simde_mm512_range_ps_r_); \
|
||||
}))
|
||||
#elif SIMDE_NATURAL_VECTOR_SIZE_LE(256) && defined(SIMDE_STATEMENT_EXPR_)
|
||||
#define simde_mm512_range_ps(a, b, imm8) SIMDE_STATEMENT_EXPR_(({ \
|
||||
simde__m512_private \
|
||||
simde_mm512_range_ps_r_ = simde__m512_to_private(simde_mm512_setzero_ps()), \
|
||||
simde_mm512_range_ps_a_ = simde__m512_to_private(a), \
|
||||
simde_mm512_range_ps_b_ = simde__m512_to_private(b); \
|
||||
\
|
||||
for (size_t simde_mm512_range_ps_i = 0 ; simde_mm512_range_ps_i < (sizeof(simde_mm512_range_ps_r_.m256) / sizeof(simde_mm512_range_ps_r_.m256[0])) ; simde_mm512_range_ps_i++) { \
|
||||
simde_mm512_range_ps_r_.m256[simde_mm512_range_ps_i] = simde_mm256_range_ps(simde_mm512_range_ps_a_.m256[simde_mm512_range_ps_i], simde_mm512_range_ps_b_.m256[simde_mm512_range_ps_i], imm8); \
|
||||
} \
|
||||
\
|
||||
simde__m512_from_private(simde_mm512_range_ps_r_); \
|
||||
}))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_range_ps
|
||||
#define _mm512_range_ps(a, b, imm8) simde_mm512_range_ps(a, b, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
#define simde_mm512_mask_range_ps(src, k, a, b, imm8) _mm512_mask_range_ps(src, k, a, b, imm8)
|
||||
#else
|
||||
#define simde_mm512_mask_range_ps(src, k, a, b, imm8) simde_mm512_mask_mov_ps(src, k, simde_mm512_range_ps(a, b, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_range_ps
|
||||
#define _mm512_mask_range_ps(src, k, a, b, imm8) simde_mm512_mask_range_ps(src, k, a, b, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
#define simde_mm512_maskz_range_ps(k, a, b, imm8) _mm512_maskz_range_ps(k, a, b, imm8)
|
||||
#else
|
||||
#define simde_mm512_maskz_range_ps(k, a, b, imm8) simde_mm512_maskz_mov_ps(k, simde_mm512_range_ps(a, b, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_range_ps
|
||||
#define _mm512_maskz_range_ps(k, a, b, imm8) simde_mm512_maskz_range_ps(k, a, b, imm8)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128d
|
||||
simde_mm_range_pd (simde__m128d a, simde__m128d b, int imm8)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 15) {
|
||||
simde__m128d r;
|
||||
|
||||
switch (imm8 & 3) {
|
||||
case 0:
|
||||
r = simde_mm_min_pd(a, b);
|
||||
break;
|
||||
case 1:
|
||||
r = simde_mm_max_pd(a, b);
|
||||
break;
|
||||
case 2:
|
||||
r = simde_x_mm_select_pd(b, a, simde_mm_cmple_pd(simde_x_mm_abs_pd(a), simde_x_mm_abs_pd(b)));
|
||||
break;
|
||||
case 3:
|
||||
r = simde_x_mm_select_pd(b, a, simde_mm_cmpge_pd(simde_x_mm_abs_pd(a), simde_x_mm_abs_pd(b)));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
switch (imm8 & 12) {
|
||||
case 0:
|
||||
r = simde_x_mm_copysign_pd(r, a);
|
||||
break;
|
||||
case 8:
|
||||
r = simde_mm_andnot_pd(simde_mm_set1_pd(SIMDE_FLOAT64_C(-0.0)), r);
|
||||
break;
|
||||
case 12:
|
||||
r = simde_mm_or_pd(simde_mm_set1_pd(SIMDE_FLOAT64_C(-0.0)), r);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
#define simde_mm_range_pd(a, b, imm8) _mm_range_pd((a), (b), (imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_range_pd
|
||||
#define _mm_range_pd(a, b, imm8) simde_mm_range_pd(a, b, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
#define simde_mm_mask_range_pd(src, k, a, b, imm8) _mm_mask_range_pd(src, k, a, b, imm8)
|
||||
#else
|
||||
#define simde_mm_mask_range_pd(src, k, a, b, imm8) simde_mm_mask_mov_pd(src, k, simde_mm_range_pd(a, b, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_range_pd
|
||||
#define _mm_mask_range_pd(src, k, a, b, imm8) simde_mm_mask_range_pd(src, k, a, b, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
#define simde_mm_maskz_range_pd(k, a, b, imm8) _mm_maskz_range_pd(k, a, b, imm8)
|
||||
#else
|
||||
#define simde_mm_maskz_range_pd(k, a, b, imm8) simde_mm_maskz_mov_pd(k, simde_mm_range_pd(a, b, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_maskz_range_pd
|
||||
#define _mm_maskz_range_pd(k, a, b, imm8) simde_mm_maskz_range_pd(k, a, b, imm8)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256d
|
||||
simde_mm256_range_pd (simde__m256d a, simde__m256d b, int imm8)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 15) {
|
||||
simde__m256d r;
|
||||
|
||||
switch (imm8 & 3) {
|
||||
case 0:
|
||||
r = simde_mm256_min_pd(a, b);
|
||||
break;
|
||||
case 1:
|
||||
r = simde_mm256_max_pd(a, b);
|
||||
break;
|
||||
case 2:
|
||||
r = simde_x_mm256_select_pd(b, a, simde_mm256_cmp_pd(simde_x_mm256_abs_pd(a), simde_x_mm256_abs_pd(b), SIMDE_CMP_LE_OQ));
|
||||
break;
|
||||
case 3:
|
||||
r = simde_x_mm256_select_pd(b, a, simde_mm256_cmp_pd(simde_x_mm256_abs_pd(a), simde_x_mm256_abs_pd(b), SIMDE_CMP_GE_OQ));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
switch (imm8 & 12) {
|
||||
case 0:
|
||||
r = simde_x_mm256_copysign_pd(r, a);
|
||||
break;
|
||||
case 8:
|
||||
r = simde_mm256_andnot_pd(simde_mm256_set1_pd(SIMDE_FLOAT64_C(-0.0)), r);
|
||||
break;
|
||||
case 12:
|
||||
r = simde_mm256_or_pd(simde_mm256_set1_pd(SIMDE_FLOAT64_C(-0.0)), r);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
#define simde_mm256_range_pd(a, b, imm8) _mm256_range_pd((a), (b), (imm8))
|
||||
#elif SIMDE_NATURAL_VECTOR_SIZE_LE(128) && defined(SIMDE_STATEMENT_EXPR_)
|
||||
#define simde_mm256_range_pd(a, b, imm8) SIMDE_STATEMENT_EXPR_(({ \
|
||||
simde__m256d_private \
|
||||
simde_mm256_range_pd_r_ = simde__m256d_to_private(simde_mm256_setzero_pd()), \
|
||||
simde_mm256_range_pd_a_ = simde__m256d_to_private(a), \
|
||||
simde_mm256_range_pd_b_ = simde__m256d_to_private(b); \
|
||||
\
|
||||
for (size_t simde_mm256_range_pd_i = 0 ; simde_mm256_range_pd_i < (sizeof(simde_mm256_range_pd_r_.m128d) / sizeof(simde_mm256_range_pd_r_.m128d[0])) ; simde_mm256_range_pd_i++) { \
|
||||
simde_mm256_range_pd_r_.m128d[simde_mm256_range_pd_i] = simde_mm_range_pd(simde_mm256_range_pd_a_.m128d[simde_mm256_range_pd_i], simde_mm256_range_pd_b_.m128d[simde_mm256_range_pd_i], imm8); \
|
||||
} \
|
||||
\
|
||||
simde__m256d_from_private(simde_mm256_range_pd_r_); \
|
||||
}))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_range_pd
|
||||
#define _mm256_range_pd(a, b, imm8) simde_mm256_range_pd(a, b, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
#define simde_mm256_mask_range_pd(src, k, a, b, imm8) _mm256_mask_range_pd(src, k, a, b, imm8)
|
||||
#else
|
||||
#define simde_mm256_mask_range_pd(src, k, a, b, imm8) simde_mm256_mask_mov_pd(src, k, simde_mm256_range_pd(a, b, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_mask_range_pd
|
||||
#define _mm256_mask_range_pd(src, k, a, b, imm8) simde_mm256_mask_range_pd(src, k, a, b, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
#define simde_mm256_maskz_range_pd(k, a, b, imm8) _mm256_maskz_range_pd(k, a, b, imm8)
|
||||
#else
|
||||
#define simde_mm256_maskz_range_pd(k, a, b, imm8) simde_mm256_maskz_mov_pd(k, simde_mm256_range_pd(a, b, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_maskz_range_pd
|
||||
#define _mm256_maskz_range_pd(k, a, b, imm8) simde_mm256_maskz_range_pd(k, a, b, imm8)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_range_pd (simde__m512d a, simde__m512d b, int imm8)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 15) {
|
||||
simde__m512d r;
|
||||
|
||||
switch (imm8 & 3) {
|
||||
case 0:
|
||||
r = simde_mm512_min_pd(a, b);
|
||||
break;
|
||||
case 1:
|
||||
r = simde_mm512_max_pd(a, b);
|
||||
break;
|
||||
case 2:
|
||||
r = simde_mm512_mask_mov_pd(b, simde_mm512_cmp_pd_mask(simde_mm512_abs_pd(a), simde_mm512_abs_pd(b), SIMDE_CMP_LE_OS), a);
|
||||
break;
|
||||
case 3:
|
||||
r = simde_mm512_mask_mov_pd(a, simde_mm512_cmp_pd_mask(simde_mm512_abs_pd(b), simde_mm512_abs_pd(a), SIMDE_CMP_GE_OS), b);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
switch (imm8 & 12) {
|
||||
case 0:
|
||||
r = simde_x_mm512_copysign_pd(r, a);
|
||||
break;
|
||||
case 8:
|
||||
r = simde_mm512_andnot_pd(simde_mm512_set1_pd(SIMDE_FLOAT64_C(-0.0)), r);
|
||||
break;
|
||||
case 12:
|
||||
r = simde_mm512_or_pd(simde_mm512_set1_pd(SIMDE_FLOAT64_C(-0.0)), r);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
#define simde_mm512_range_pd(a, b, imm8) _mm512_range_pd((a), (b), (imm8))
|
||||
#elif SIMDE_NATURAL_VECTOR_SIZE_LE(128) && defined(SIMDE_STATEMENT_EXPR_)
|
||||
#define simde_mm512_range_pd(a, b, imm8) SIMDE_STATEMENT_EXPR_(({ \
|
||||
simde__m512d_private \
|
||||
simde_mm512_range_pd_r_ = simde__m512d_to_private(simde_mm512_setzero_pd()), \
|
||||
simde_mm512_range_pd_a_ = simde__m512d_to_private(a), \
|
||||
simde_mm512_range_pd_b_ = simde__m512d_to_private(b); \
|
||||
\
|
||||
for (size_t simde_mm512_range_pd_i = 0 ; simde_mm512_range_pd_i < (sizeof(simde_mm512_range_pd_r_.m128d) / sizeof(simde_mm512_range_pd_r_.m128d[0])) ; simde_mm512_range_pd_i++) { \
|
||||
simde_mm512_range_pd_r_.m128d[simde_mm512_range_pd_i] = simde_mm_range_pd(simde_mm512_range_pd_a_.m128d[simde_mm512_range_pd_i], simde_mm512_range_pd_b_.m128d[simde_mm512_range_pd_i], imm8); \
|
||||
} \
|
||||
\
|
||||
simde__m512d_from_private(simde_mm512_range_pd_r_); \
|
||||
}))
|
||||
#elif SIMDE_NATURAL_VECTOR_SIZE_LE(256) && defined(SIMDE_STATEMENT_EXPR_)
|
||||
#define simde_mm512_range_pd(a, b, imm8) SIMDE_STATEMENT_EXPR_(({ \
|
||||
simde__m512d_private \
|
||||
simde_mm512_range_pd_r_ = simde__m512d_to_private(simde_mm512_setzero_pd()), \
|
||||
simde_mm512_range_pd_a_ = simde__m512d_to_private(a), \
|
||||
simde_mm512_range_pd_b_ = simde__m512d_to_private(b); \
|
||||
\
|
||||
for (size_t simde_mm512_range_pd_i = 0 ; simde_mm512_range_pd_i < (sizeof(simde_mm512_range_pd_r_.m256d) / sizeof(simde_mm512_range_pd_r_.m256d[0])) ; simde_mm512_range_pd_i++) { \
|
||||
simde_mm512_range_pd_r_.m256d[simde_mm512_range_pd_i] = simde_mm256_range_pd(simde_mm512_range_pd_a_.m256d[simde_mm512_range_pd_i], simde_mm512_range_pd_b_.m256d[simde_mm512_range_pd_i], imm8); \
|
||||
} \
|
||||
\
|
||||
simde__m512d_from_private(simde_mm512_range_pd_r_); \
|
||||
}))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_range_pd
|
||||
#define _mm512_range_pd(a, b, imm8) simde_mm512_range_pd(a, b, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
#define simde_mm512_mask_range_pd(src, k, a, b, imm8) _mm512_mask_range_pd(src, k, a, b, imm8)
|
||||
#else
|
||||
#define simde_mm512_mask_range_pd(src, k, a, b, imm8) simde_mm512_mask_mov_pd(src, k, simde_mm512_range_pd(a, b, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_range_pd
|
||||
#define _mm512_mask_range_pd(src, k, a, b, imm8) simde_mm512_mask_range_pd(src, k, a, b, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
#define simde_mm512_maskz_range_pd(k, a, b, imm8) _mm512_maskz_range_pd(k, a, b, imm8)
|
||||
#else
|
||||
#define simde_mm512_maskz_range_pd(k, a, b, imm8) simde_mm512_maskz_mov_pd(k, simde_mm512_range_pd(a, b, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_range_pd
|
||||
#define _mm512_maskz_range_pd(k, a, b, imm8) simde_mm512_maskz_range_pd(k, a, b, imm8)
|
||||
#endif
|
||||
|
||||
#if (SIMDE_NATURAL_VECTOR_SIZE > 0) && defined(SIMDE_FAST_EXCEPTIONS)
|
||||
#define simde_x_mm_range_ss(a, b, imm8) simde_mm_move_ss(a, simde_mm_range_ps(a, b, imm8))
|
||||
#elif (SIMDE_NATURAL_VECTOR_SIZE > 0)
|
||||
#define simde_x_mm_range_ss(a, b, imm8) simde_mm_move_ss(a, simde_mm_range_ps(simde_x_mm_broadcastlow_ps(a), simde_x_mm_broadcastlow_ps(b), imm8))
|
||||
#else
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128
|
||||
simde_x_mm_range_ss (simde__m128 a, simde__m128 b, int imm8)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 15) {
|
||||
simde__m128_private
|
||||
r_ = simde__m128_to_private(a),
|
||||
a_ = simde__m128_to_private(a),
|
||||
b_ = simde__m128_to_private(b);
|
||||
simde_float32 abs_a = simde_uint32_as_float32(a_.u32[0] & UINT32_C(2147483647));
|
||||
simde_float32 abs_b = simde_uint32_as_float32(b_.u32[0] & UINT32_C(2147483647));
|
||||
|
||||
switch (imm8 & 3) {
|
||||
case 0:
|
||||
r_ = simde__m128_to_private(simde_mm_min_ss(a, b));
|
||||
break;
|
||||
case 1:
|
||||
r_ = simde__m128_to_private(simde_mm_max_ss(a, b));
|
||||
break;
|
||||
case 2:
|
||||
r_.f32[0] = abs_a <= abs_b ? a_.f32[0] : b_.f32[0];
|
||||
break;
|
||||
case 3:
|
||||
r_.f32[0] = abs_b >= abs_a ? b_.f32[0] : a_.f32[0];
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
switch (imm8 & 12) {
|
||||
case 0:
|
||||
r_.f32[0] = simde_uint32_as_float32((a_.u32[0] & UINT32_C(2147483648)) ^ (r_.u32[0] & UINT32_C(2147483647)));
|
||||
break;
|
||||
case 8:
|
||||
r_.f32[0] = simde_uint32_as_float32(r_.u32[0] & UINT32_C(2147483647));
|
||||
break;
|
||||
case 12:
|
||||
r_.f32[0] = simde_uint32_as_float32(r_.u32[0] | UINT32_C(2147483648));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return simde__m128_from_private(r_);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
#define simde_mm_mask_range_ss(src, k, a, b, imm8) _mm_mask_range_ss(src, k, a, b, imm8)
|
||||
#elif defined(SIMDE_STATEMENT_EXPR_)
|
||||
#define simde_mm_mask_range_ss(src, k, a, b, imm8) SIMDE_STATEMENT_EXPR_(({ \
|
||||
simde__m128_private \
|
||||
simde_mm_mask_range_ss_r_ = simde__m128_to_private(a), \
|
||||
simde_mm_mask_range_ss_src_ = simde__m128_to_private(src); \
|
||||
\
|
||||
if (k & 1) \
|
||||
simde_mm_mask_range_ss_r_ = simde__m128_to_private(simde_x_mm_range_ss(a, b, imm8)); \
|
||||
else \
|
||||
simde_mm_mask_range_ss_r_.f32[0] = simde_mm_mask_range_ss_src_.f32[0]; \
|
||||
\
|
||||
simde__m128_from_private(simde_mm_mask_range_ss_r_); \
|
||||
}))
|
||||
#else
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128
|
||||
simde_mm_mask_range_ss (simde__m128 src, simde__mmask8 k, simde__m128 a, simde__m128 b, int imm8)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 15) {
|
||||
simde__m128_private
|
||||
r_ = simde__m128_to_private(a),
|
||||
src_ = simde__m128_to_private(src);
|
||||
|
||||
if (k & 1)
|
||||
r_ = simde__m128_to_private(simde_x_mm_range_ss(a, b, imm8));
|
||||
else
|
||||
r_.f32[0] = src_.f32[0];
|
||||
|
||||
return simde__m128_from_private(r_);
|
||||
}
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_range_ss
|
||||
#define _mm_mask_range_ss(src, k, a, b, imm8) simde_mm_mask_range_ss(src, k, a, b, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
#define simde_mm_maskz_range_ss(k, a, b, imm8) _mm_maskz_range_ss(k, a, b, imm8)
|
||||
#elif defined(SIMDE_STATEMENT_EXPR_)
|
||||
#define simde_mm_maskz_range_ss(k, a, b, imm8) SIMDE_STATEMENT_EXPR_(({ \
|
||||
simde__m128_private simde_mm_maskz_range_ss_r_ = simde__m128_to_private(a); \
|
||||
\
|
||||
if (k & 1) \
|
||||
simde_mm_maskz_range_ss_r_ = simde__m128_to_private(simde_x_mm_range_ss(a, b, imm8)); \
|
||||
else \
|
||||
simde_mm_maskz_range_ss_r_.f32[0] = SIMDE_FLOAT32_C(0.0); \
|
||||
\
|
||||
simde__m128_from_private(simde_mm_maskz_range_ss_r_); \
|
||||
}))
|
||||
#else
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128
|
||||
simde_mm_maskz_range_ss (simde__mmask8 k, simde__m128 a, simde__m128 b, int imm8)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 15) {
|
||||
simde__m128_private r_ = simde__m128_to_private(a);
|
||||
|
||||
if (k & 1)
|
||||
r_ = simde__m128_to_private(simde_x_mm_range_ss(a, b, imm8));
|
||||
else
|
||||
r_.f32[0] = SIMDE_FLOAT32_C(0.0);
|
||||
|
||||
return simde__m128_from_private(r_);
|
||||
}
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_maskz_range_ss
|
||||
#define _mm_maskz_range_ss(k, a, b, imm8) simde_mm_maskz_range_ss(k, a, b, imm8)
|
||||
#endif
|
||||
|
||||
#if (SIMDE_NATURAL_VECTOR_SIZE > 0) && defined(SIMDE_FAST_EXCEPTIONS)
|
||||
#define simde_x_mm_range_sd(a, b, imm8) simde_mm_move_sd(a, simde_mm_range_pd(a, b, imm8))
|
||||
#elif (SIMDE_NATURAL_VECTOR_SIZE > 0)
|
||||
#define simde_x_mm_range_sd(a, b, imm8) simde_mm_move_sd(a, simde_mm_range_pd(simde_x_mm_broadcastlow_pd(a), simde_x_mm_broadcastlow_pd(b), imm8))
|
||||
#else
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128d
|
||||
simde_x_mm_range_sd (simde__m128d a, simde__m128d b, int imm8)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 15) {
|
||||
simde__m128d_private
|
||||
r_ = simde__m128d_to_private(a),
|
||||
a_ = simde__m128d_to_private(a),
|
||||
b_ = simde__m128d_to_private(b);
|
||||
simde_float64 abs_a = simde_uint64_as_float64(a_.u64[0] & UINT64_C(9223372036854775807));
|
||||
simde_float64 abs_b = simde_uint64_as_float64(b_.u64[0] & UINT64_C(9223372036854775807));
|
||||
|
||||
switch (imm8 & 3) {
|
||||
case 0:
|
||||
r_ = simde__m128d_to_private(simde_mm_min_sd(a, b));
|
||||
break;
|
||||
case 1:
|
||||
r_ = simde__m128d_to_private(simde_mm_max_sd(a, b));
|
||||
break;
|
||||
case 2:
|
||||
r_.f64[0] = abs_a <= abs_b ? a_.f64[0] : b_.f64[0];
|
||||
break;
|
||||
case 3:
|
||||
r_.f64[0] = abs_b >= abs_a ? b_.f64[0] : a_.f64[0];
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
switch (imm8 & 12) {
|
||||
case 0:
|
||||
r_.f64[0] = simde_uint64_as_float64((a_.u64[0] & UINT64_C(9223372036854775808)) ^ (r_.u64[0] & UINT64_C(9223372036854775807)));
|
||||
break;
|
||||
case 8:
|
||||
r_.f64[0] = simde_uint64_as_float64(r_.u64[0] & UINT64_C(9223372036854775807));
|
||||
break;
|
||||
case 12:
|
||||
r_.f64[0] = simde_uint64_as_float64(r_.u64[0] | UINT64_C(9223372036854775808));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return simde__m128d_from_private(r_);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
#define simde_mm_mask_range_sd(src, k, a, b, imm8) _mm_mask_range_sd(src, k, a, b, imm8)
|
||||
#elif defined(SIMDE_STATEMENT_EXPR_)
|
||||
#define simde_mm_mask_range_sd(src, k, a, b, imm8) SIMDE_STATEMENT_EXPR_(({ \
|
||||
simde__m128d_private \
|
||||
simde_mm_mask_range_sd_r_ = simde__m128d_to_private(a), \
|
||||
simde_mm_mask_range_sd_src_ = simde__m128d_to_private(src); \
|
||||
\
|
||||
if (k & 1) \
|
||||
simde_mm_mask_range_sd_r_ = simde__m128d_to_private(simde_x_mm_range_sd(a, b, imm8)); \
|
||||
else \
|
||||
simde_mm_mask_range_sd_r_.f64[0] = simde_mm_mask_range_sd_src_.f64[0]; \
|
||||
\
|
||||
simde__m128d_from_private(simde_mm_mask_range_sd_r_); \
|
||||
}))
|
||||
#else
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128d
|
||||
simde_mm_mask_range_sd (simde__m128d src, simde__mmask8 k, simde__m128d a, simde__m128d b, int imm8)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 15) {
|
||||
simde__m128d_private
|
||||
r_ = simde__m128d_to_private(a),
|
||||
src_ = simde__m128d_to_private(src);
|
||||
|
||||
if (k & 1)
|
||||
r_ = simde__m128d_to_private(simde_x_mm_range_sd(a, b, imm8));
|
||||
else
|
||||
r_.f64[0] = src_.f64[0];
|
||||
|
||||
return simde__m128d_from_private(r_);
|
||||
}
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_range_sd
|
||||
#define _mm_mask_range_sd(src, k, a, b, imm8) simde_mm_mask_range_sd(src, k, a, b, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
#define simde_mm_maskz_range_sd(k, a, b, imm8) _mm_maskz_range_sd(k, a, b, imm8)
|
||||
#elif defined(SIMDE_STATEMENT_EXPR_)
|
||||
#define simde_mm_maskz_range_sd(k, a, b, imm8) SIMDE_STATEMENT_EXPR_(({ \
|
||||
simde__m128d_private simde_mm_maskz_range_sd_r_ = simde__m128d_to_private(a); \
|
||||
\
|
||||
if (k & 1) \
|
||||
simde_mm_maskz_range_sd_r_ = simde__m128d_to_private(simde_x_mm_range_sd(a, b, imm8)); \
|
||||
else \
|
||||
simde_mm_maskz_range_sd_r_.f64[0] = SIMDE_FLOAT64_C(0.0); \
|
||||
\
|
||||
simde__m128d_from_private(simde_mm_maskz_range_sd_r_); \
|
||||
}))
|
||||
#else
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128d
|
||||
simde_mm_maskz_range_sd (simde__mmask8 k, simde__m128d a, simde__m128d b, int imm8)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 15) {
|
||||
simde__m128d_private r_ = simde__m128d_to_private(a);
|
||||
|
||||
if (k & 1)
|
||||
r_ = simde__m128d_to_private(simde_x_mm_range_sd(a, b, imm8));
|
||||
else
|
||||
r_.f64[0] = SIMDE_FLOAT64_C(0.0);
|
||||
|
||||
return simde__m128d_from_private(r_);
|
||||
}
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_maskz_range_sd
|
||||
#define _mm_maskz_range_sd(k, a, b, imm8) simde_mm_maskz_range_sd(k, a, b, imm8)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_RANGE_H) */
|
||||
@@ -0,0 +1,686 @@
|
||||
#if !defined(SIMDE_X86_AVX512_RANGE_ROUND_H)
|
||||
#define SIMDE_X86_AVX512_RANGE_ROUND_H
|
||||
|
||||
#include "types.h"
|
||||
#include "range.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
#define simde_mm512_range_round_ps(a, b, imm8, sae) _mm512_range_round_ps(a, b, imm8, sae)
|
||||
#elif defined(SIMDE_FAST_EXCEPTIONS)
|
||||
#define simde_mm512_range_round_ps(a, b, imm8, sae) simde_mm512_range_ps(a, b, imm8)
|
||||
#elif defined(SIMDE_STATEMENT_EXPR_)
|
||||
#if defined(SIMDE_HAVE_FENV_H)
|
||||
#define simde_mm512_range_round_ps(a, b, imm8, sae) SIMDE_STATEMENT_EXPR_(({ \
|
||||
simde__m512 simde_mm512_range_round_ps_r; \
|
||||
\
|
||||
if (sae & SIMDE_MM_FROUND_NO_EXC) { \
|
||||
fenv_t simde_mm512_range_round_ps_envp; \
|
||||
int simde_mm512_range_round_ps_x = feholdexcept(&simde_mm512_range_round_ps_envp); \
|
||||
simde_mm512_range_round_ps_r = simde_mm512_range_ps(a, b, imm8); \
|
||||
if (HEDLEY_LIKELY(simde_mm512_range_round_ps_x == 0)) \
|
||||
fesetenv(&simde_mm512_range_round_ps_envp); \
|
||||
} \
|
||||
else { \
|
||||
simde_mm512_range_round_ps_r = simde_mm512_range_ps(a, b, imm8); \
|
||||
} \
|
||||
\
|
||||
simde_mm512_range_round_ps_r; \
|
||||
}))
|
||||
#else
|
||||
#define simde_mm512_range_round_ps(a, b, imm8, sae) simde_mm512_range_ps(a, b, imm8)
|
||||
#endif
|
||||
#else
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_range_round_ps (simde__m512 a, simde__m512 b, int imm8, int sae)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 15)
|
||||
SIMDE_REQUIRE_CONSTANT(sae) {
|
||||
simde__m512 r;
|
||||
|
||||
if (sae & SIMDE_MM_FROUND_NO_EXC) {
|
||||
#if defined(SIMDE_HAVE_FENV_H)
|
||||
fenv_t envp;
|
||||
int x = feholdexcept(&envp);
|
||||
r = simde_mm512_range_ps(a, b, imm8);
|
||||
if (HEDLEY_LIKELY(x == 0))
|
||||
fesetenv(&envp);
|
||||
#else
|
||||
r = simde_mm512_range_ps(a, b, imm8);
|
||||
#endif
|
||||
}
|
||||
else {
|
||||
r = simde_mm512_range_ps(a, b, imm8);
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_range_round_ps
|
||||
#define _mm512_range_round_ps(a, b, imm8, sae) simde_mm512_range_round_ps(a, b, imm8, sae)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
#define simde_mm512_mask_range_round_ps(src, k, a, b, imm8, sae) _mm512_mask_range_round_ps(src, k, a, b, imm8, sae)
|
||||
#elif defined(SIMDE_FAST_EXCEPTIONS)
|
||||
#define simde_mm512_mask_range_round_ps(src, k, a, b, imm8, sae) simde_mm512_mask_range_ps(src, k, a, b, imm8)
|
||||
#elif defined(SIMDE_STATEMENT_EXPR_)
|
||||
#if defined(SIMDE_HAVE_FENV_H)
|
||||
#define simde_mm512_mask_range_round_ps(src, k, a, b, imm8, sae) SIMDE_STATEMENT_EXPR_(({ \
|
||||
simde__m512 simde_mm512_mask_range_round_ps_r; \
|
||||
\
|
||||
if (sae & SIMDE_MM_FROUND_NO_EXC) { \
|
||||
fenv_t simde_mm512_mask_range_round_ps_envp; \
|
||||
int simde_mm512_mask_range_round_ps_x = feholdexcept(&simde_mm512_mask_range_round_ps_envp); \
|
||||
simde_mm512_mask_range_round_ps_r = simde_mm512_mask_range_ps(src, k, a, b, imm8); \
|
||||
if (HEDLEY_LIKELY(simde_mm512_mask_range_round_ps_x == 0)) \
|
||||
fesetenv(&simde_mm512_mask_range_round_ps_envp); \
|
||||
} \
|
||||
else { \
|
||||
simde_mm512_mask_range_round_ps_r = simde_mm512_mask_range_ps(src, k, a, b, imm8); \
|
||||
} \
|
||||
\
|
||||
simde_mm512_mask_range_round_ps_r; \
|
||||
}))
|
||||
#else
|
||||
#define simde_mm512_mask_range_round_ps(src, k, a, b, imm8, sae) simde_mm512_mask_range_ps(src, k, a, b, imm8)
|
||||
#endif
|
||||
#else
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_mask_range_round_ps (simde__m512 src, simde__mmask16 k, simde__m512 a, simde__m512 b, int imm8, int sae)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 15)
|
||||
SIMDE_REQUIRE_CONSTANT(sae) {
|
||||
simde__m512 r;
|
||||
|
||||
if (sae & SIMDE_MM_FROUND_NO_EXC) {
|
||||
#if defined(SIMDE_HAVE_FENV_H)
|
||||
fenv_t envp;
|
||||
int x = feholdexcept(&envp);
|
||||
r = simde_mm512_mask_range_ps(src, k, a, b, imm8);
|
||||
if (HEDLEY_LIKELY(x == 0))
|
||||
fesetenv(&envp);
|
||||
#else
|
||||
r = simde_mm512_mask_range_ps(src, k, a, b, imm8);
|
||||
#endif
|
||||
}
|
||||
else {
|
||||
r = simde_mm512_mask_range_ps(src, k, a, b, imm8);
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_range_round_ps
|
||||
#define _mm512_mask_range_round_ps(src, k, a, b, imm8, sae) simde_mm512_mask_range_round_ps(src, k, a, b, imm8, sae)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
#define simde_mm512_maskz_range_round_ps(k, a, b, imm8, sae) _mm512_maskz_range_round_ps(k, a, b, imm8, sae)
|
||||
#elif defined(SIMDE_FAST_EXCEPTIONS)
|
||||
#define simde_mm512_maskz_range_round_ps(k, a, b, imm8, sae) simde_mm512_maskz_range_ps(k, a, b, imm8)
|
||||
#elif defined(SIMDE_STATEMENT_EXPR_)
|
||||
#if defined(SIMDE_HAVE_FENV_H)
|
||||
#define simde_mm512_maskz_range_round_ps(k, a, b, imm8, sae) SIMDE_STATEMENT_EXPR_(({ \
|
||||
simde__m512 simde_mm512_maskz_range_round_ps_r; \
|
||||
\
|
||||
if (sae & SIMDE_MM_FROUND_NO_EXC) { \
|
||||
fenv_t simde_mm512_maskz_range_round_ps_envp; \
|
||||
int simde_mm512_maskz_range_round_ps_x = feholdexcept(&simde_mm512_maskz_range_round_ps_envp); \
|
||||
simde_mm512_maskz_range_round_ps_r = simde_mm512_maskz_range_ps(k, a, b, imm8); \
|
||||
if (HEDLEY_LIKELY(simde_mm512_maskz_range_round_ps_x == 0)) \
|
||||
fesetenv(&simde_mm512_maskz_range_round_ps_envp); \
|
||||
} \
|
||||
else { \
|
||||
simde_mm512_maskz_range_round_ps_r = simde_mm512_maskz_range_ps(k, a, b, imm8); \
|
||||
} \
|
||||
\
|
||||
simde_mm512_maskz_range_round_ps_r; \
|
||||
}))
|
||||
#else
|
||||
#define simde_mm512_maskz_range_round_ps(k, a, b, imm8, sae) simde_mm512_maskz_range_ps(k, a, b, imm8)
|
||||
#endif
|
||||
#else
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_maskz_range_round_ps (simde__mmask16 k, simde__m512 a, simde__m512 b, int imm8, int sae)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 15)
|
||||
SIMDE_REQUIRE_CONSTANT(sae) {
|
||||
simde__m512 r;
|
||||
|
||||
if (sae & SIMDE_MM_FROUND_NO_EXC) {
|
||||
#if defined(SIMDE_HAVE_FENV_H)
|
||||
fenv_t envp;
|
||||
int x = feholdexcept(&envp);
|
||||
r = simde_mm512_maskz_range_ps(k, a, b, imm8);
|
||||
if (HEDLEY_LIKELY(x == 0))
|
||||
fesetenv(&envp);
|
||||
#else
|
||||
r = simde_mm512_maskz_range_ps(k, a, b, imm8);
|
||||
#endif
|
||||
}
|
||||
else {
|
||||
r = simde_mm512_maskz_range_ps(k, a, b, imm8);
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_range_round_ps
|
||||
#define _mm512_maskz_range_round_ps(k, a, b, imm8, sae) simde_mm512_maskz_range_round_ps(k, a, b, imm8, sae)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
#define simde_mm512_range_round_pd(a, b, imm8, sae) _mm512_range_round_pd(a, b, imm8, sae)
|
||||
#elif defined(SIMDE_FAST_EXCEPTIONS)
|
||||
#define simde_mm512_range_round_pd(a, b, imm8, sae) simde_mm512_range_pd(a, b, imm8)
|
||||
#elif defined(SIMDE_STATEMENT_EXPR_)
|
||||
#if defined(SIMDE_HAVE_FENV_H)
|
||||
#define simde_mm512_range_round_pd(a, b, imm8, sae) SIMDE_STATEMENT_EXPR_(({ \
|
||||
simde__m512d simde_mm512_range_round_pd_r; \
|
||||
\
|
||||
if (sae & SIMDE_MM_FROUND_NO_EXC) { \
|
||||
fenv_t simde_mm512_range_round_pd_envp; \
|
||||
int simde_mm512_range_round_pd_x = feholdexcept(&simde_mm512_range_round_pd_envp); \
|
||||
simde_mm512_range_round_pd_r = simde_mm512_range_pd(a, b, imm8); \
|
||||
if (HEDLEY_LIKELY(simde_mm512_range_round_pd_x == 0)) \
|
||||
fesetenv(&simde_mm512_range_round_pd_envp); \
|
||||
} \
|
||||
else { \
|
||||
simde_mm512_range_round_pd_r = simde_mm512_range_pd(a, b, imm8); \
|
||||
} \
|
||||
\
|
||||
simde_mm512_range_round_pd_r; \
|
||||
}))
|
||||
#else
|
||||
#define simde_mm512_range_round_pd(a, b, imm8, sae) simde_mm512_range_pd(a, b, imm8)
|
||||
#endif
|
||||
#else
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_range_round_pd (simde__m512d a, simde__m512d b, int imm8, int sae)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 15)
|
||||
SIMDE_REQUIRE_CONSTANT(sae) {
|
||||
simde__m512d r;
|
||||
|
||||
if (sae & SIMDE_MM_FROUND_NO_EXC) {
|
||||
#if defined(SIMDE_HAVE_FENV_H)
|
||||
fenv_t envp;
|
||||
int x = feholdexcept(&envp);
|
||||
r = simde_mm512_range_pd(a, b, imm8);
|
||||
if (HEDLEY_LIKELY(x == 0))
|
||||
fesetenv(&envp);
|
||||
#else
|
||||
r = simde_mm512_range_pd(a, b, imm8);
|
||||
#endif
|
||||
}
|
||||
else {
|
||||
r = simde_mm512_range_pd(a, b, imm8);
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_range_round_pd
|
||||
#define _mm512_range_round_pd(a, b, imm8, sae) simde_mm512_range_round_pd(a, b, imm8, sae)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
#define simde_mm512_mask_range_round_pd(src, k, a, b, imm8, sae) _mm512_mask_range_round_pd(src, k, a, b, imm8, sae)
|
||||
#elif defined(SIMDE_FAST_EXCEPTIONS)
|
||||
#define simde_mm512_mask_range_round_pd(src, k, a, b, imm8, sae) simde_mm512_mask_range_pd(src, k, a, b, imm8)
|
||||
#elif defined(SIMDE_STATEMENT_EXPR_)
|
||||
#if defined(SIMDE_HAVE_FENV_H)
|
||||
#define simde_mm512_mask_range_round_pd(src, k, a, b, imm8, sae) SIMDE_STATEMENT_EXPR_(({ \
|
||||
simde__m512d simde_mm512_mask_range_round_pd_r; \
|
||||
\
|
||||
if (sae & SIMDE_MM_FROUND_NO_EXC) { \
|
||||
fenv_t simde_mm512_mask_range_round_pd_envp; \
|
||||
int simde_mm512_mask_range_round_pd_x = feholdexcept(&simde_mm512_mask_range_round_pd_envp); \
|
||||
simde_mm512_mask_range_round_pd_r = simde_mm512_mask_range_pd(src, k, a, b, imm8); \
|
||||
if (HEDLEY_LIKELY(simde_mm512_mask_range_round_pd_x == 0)) \
|
||||
fesetenv(&simde_mm512_mask_range_round_pd_envp); \
|
||||
} \
|
||||
else { \
|
||||
simde_mm512_mask_range_round_pd_r = simde_mm512_mask_range_pd(src, k, a, b, imm8); \
|
||||
} \
|
||||
\
|
||||
simde_mm512_mask_range_round_pd_r; \
|
||||
}))
|
||||
#else
|
||||
#define simde_mm512_mask_range_round_pd(src, k, a, b, imm8, sae) simde_mm512_mask_range_pd(src, k, a, b, imm8)
|
||||
#endif
|
||||
#else
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_mask_range_round_pd (simde__m512d src, simde__mmask8 k, simde__m512d a, simde__m512d b, int imm8, int sae)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 15)
|
||||
SIMDE_REQUIRE_CONSTANT(sae) {
|
||||
simde__m512d r;
|
||||
|
||||
if (sae & SIMDE_MM_FROUND_NO_EXC) {
|
||||
#if defined(SIMDE_HAVE_FENV_H)
|
||||
fenv_t envp;
|
||||
int x = feholdexcept(&envp);
|
||||
r = simde_mm512_mask_range_pd(src, k, a, b, imm8);
|
||||
if (HEDLEY_LIKELY(x == 0))
|
||||
fesetenv(&envp);
|
||||
#else
|
||||
r = simde_mm512_mask_range_pd(src, k, a, b, imm8);
|
||||
#endif
|
||||
}
|
||||
else {
|
||||
r = simde_mm512_mask_range_pd(src, k, a, b, imm8);
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_range_round_pd
|
||||
#define _mm512_mask_range_round_pd(src, k, a, b, imm8, sae) simde_mm512_mask_range_round_pd(src, k, a, b, imm8, sae)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
#define simde_mm512_maskz_range_round_pd(k, a, b, imm8, sae) _mm512_maskz_range_round_pd(k, a, b, imm8, sae)
|
||||
#elif defined(SIMDE_FAST_EXCEPTIONS)
|
||||
#define simde_mm512_maskz_range_round_pd(k, a, b, imm8, sae) simde_mm512_maskz_range_pd(k, a, b, imm8)
|
||||
#elif defined(SIMDE_STATEMENT_EXPR_)
|
||||
#if defined(SIMDE_HAVE_FENV_H)
|
||||
#define simde_mm512_maskz_range_round_pd(k, a, b, imm8, sae) SIMDE_STATEMENT_EXPR_(({ \
|
||||
simde__m512d simde_mm512_maskz_range_round_pd_r; \
|
||||
\
|
||||
if (sae & SIMDE_MM_FROUND_NO_EXC) { \
|
||||
fenv_t simde_mm512_maskz_range_round_pd_envp; \
|
||||
int simde_mm512_maskz_range_round_pd_x = feholdexcept(&simde_mm512_maskz_range_round_pd_envp); \
|
||||
simde_mm512_maskz_range_round_pd_r = simde_mm512_maskz_range_pd(k, a, b, imm8); \
|
||||
if (HEDLEY_LIKELY(simde_mm512_maskz_range_round_pd_x == 0)) \
|
||||
fesetenv(&simde_mm512_maskz_range_round_pd_envp); \
|
||||
} \
|
||||
else { \
|
||||
simde_mm512_maskz_range_round_pd_r = simde_mm512_maskz_range_pd(k, a, b, imm8); \
|
||||
} \
|
||||
\
|
||||
simde_mm512_maskz_range_round_pd_r; \
|
||||
}))
|
||||
#else
|
||||
#define simde_mm512_maskz_range_round_pd(k, a, b, imm8, sae) simde_mm512_maskz_range_pd(k, a, b, imm8)
|
||||
#endif
|
||||
#else
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_maskz_range_round_pd (simde__mmask8 k, simde__m512d a, simde__m512d b, int imm8, int sae)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 15)
|
||||
SIMDE_REQUIRE_CONSTANT(sae) {
|
||||
simde__m512d r;
|
||||
|
||||
if (sae & SIMDE_MM_FROUND_NO_EXC) {
|
||||
#if defined(SIMDE_HAVE_FENV_H)
|
||||
fenv_t envp;
|
||||
int x = feholdexcept(&envp);
|
||||
r = simde_mm512_maskz_range_pd(k, a, b, imm8);
|
||||
if (HEDLEY_LIKELY(x == 0))
|
||||
fesetenv(&envp);
|
||||
#else
|
||||
r = simde_mm512_maskz_range_pd(k, a, b, imm8);
|
||||
#endif
|
||||
}
|
||||
else {
|
||||
r = simde_mm512_maskz_range_pd(k, a, b, imm8);
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_range_round_pd
|
||||
#define _mm512_maskz_range_round_pd(k, a, b, imm8, sae) simde_mm512_maskz_range_round_pd(k, a, b, imm8, sae)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
#define simde_mm_range_round_ss(a, b, imm8, sae) _mm_range_round_ss(a, b, imm8, sae)
|
||||
#elif defined(SIMDE_FAST_EXCEPTIONS)
|
||||
#define simde_mm_range_round_ss(a, b, imm8, sae) simde_x_mm_range_ss(a, b, imm8)
|
||||
#elif defined(SIMDE_STATEMENT_EXPR_)
|
||||
#if defined(SIMDE_HAVE_FENV_H)
|
||||
#define simde_mm_range_round_ss(a, b, imm8, sae) SIMDE_STATEMENT_EXPR_(({ \
|
||||
simde__m128 simde_mm_range_round_ss_r; \
|
||||
\
|
||||
if (sae & SIMDE_MM_FROUND_NO_EXC) { \
|
||||
fenv_t simde_mm_range_round_ss_envp; \
|
||||
int simde_mm_range_round_ss_x = feholdexcept(&simde_mm_range_round_ss_envp); \
|
||||
simde_mm_range_round_ss_r = simde_x_mm_range_ss(a, b, imm8); \
|
||||
if (HEDLEY_LIKELY(simde_mm_range_round_ss_x == 0)) \
|
||||
fesetenv(&simde_mm_range_round_ss_envp); \
|
||||
} \
|
||||
else { \
|
||||
simde_mm_range_round_ss_r = simde_x_mm_range_ss(a, b, imm8); \
|
||||
} \
|
||||
\
|
||||
simde_mm_range_round_ss_r; \
|
||||
}))
|
||||
#else
|
||||
#define simde_mm_range_round_ss(a, b, imm8, sae) simde_x_mm_range_ss(a, b, imm8)
|
||||
#endif
|
||||
#else
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128
|
||||
simde_mm_range_round_ss (simde__m128 a, simde__m128 b, int imm8, int sae)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 15)
|
||||
SIMDE_REQUIRE_CONSTANT(sae) {
|
||||
simde__m128 r;
|
||||
|
||||
if (sae & SIMDE_MM_FROUND_NO_EXC) {
|
||||
#if defined(SIMDE_HAVE_FENV_H)
|
||||
fenv_t envp;
|
||||
int x = feholdexcept(&envp);
|
||||
r = simde_x_mm_range_ss(a, b, imm8);
|
||||
if (HEDLEY_LIKELY(x == 0))
|
||||
fesetenv(&envp);
|
||||
#else
|
||||
r = simde_x_mm_range_ss(a, b, imm8);
|
||||
#endif
|
||||
}
|
||||
else {
|
||||
r = simde_x_mm_range_ss(a, b, imm8);
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_range_round_ss
|
||||
#define _mm_range_round_ss(a, b, imm8, sae) simde_mm_range_round_ss(a, b, imm8, sae)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
#define simde_mm_mask_range_round_ss(src, k, a, b, imm8, sae) _mm_mask_range_round_ss(src, k, a, b, imm8, sae)
|
||||
#elif defined(SIMDE_FAST_EXCEPTIONS)
|
||||
#define simde_mm_mask_range_round_ss(src, k, a, b, imm8, sae) simde_mm_mask_range_ss(src, k, a, b, imm8)
|
||||
#elif defined(SIMDE_STATEMENT_EXPR_)
|
||||
#if defined(SIMDE_HAVE_FENV_H)
|
||||
#define simde_mm_mask_range_round_ss(src, k, a, b, imm8, sae) SIMDE_STATEMENT_EXPR_(({ \
|
||||
simde__m128 simde_mm_mask_range_round_ss_r; \
|
||||
\
|
||||
if (sae & SIMDE_MM_FROUND_NO_EXC) { \
|
||||
fenv_t simde_mm_mask_range_round_ss_envp; \
|
||||
int simde_mm_mask_range_round_ss_x = feholdexcept(&simde_mm_mask_range_round_ss_envp); \
|
||||
simde_mm_mask_range_round_ss_r = simde_mm_mask_range_ss(src, k, a, b, imm8); \
|
||||
if (HEDLEY_LIKELY(simde_mm_mask_range_round_ss_x == 0)) \
|
||||
fesetenv(&simde_mm_mask_range_round_ss_envp); \
|
||||
} \
|
||||
else { \
|
||||
simde_mm_mask_range_round_ss_r = simde_mm_mask_range_ss(src, k, a, b, imm8); \
|
||||
} \
|
||||
\
|
||||
simde_mm_mask_range_round_ss_r; \
|
||||
}))
|
||||
#else
|
||||
#define simde_mm_mask_range_round_ss(src, k, a, b, imm8, sae) simde_mm_mask_range_ss(src, k, a, b, imm8)
|
||||
#endif
|
||||
#else
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128
|
||||
simde_mm_mask_range_round_ss (simde__m128 src, simde__mmask8 k, simde__m128 a, simde__m128 b, int imm8, int sae)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 15)
|
||||
SIMDE_REQUIRE_CONSTANT(sae) {
|
||||
simde__m128 r;
|
||||
|
||||
if (sae & SIMDE_MM_FROUND_NO_EXC) {
|
||||
#if defined(SIMDE_HAVE_FENV_H)
|
||||
fenv_t envp;
|
||||
int x = feholdexcept(&envp);
|
||||
r = simde_mm_mask_range_ss(src, k, a, b, imm8);
|
||||
if (HEDLEY_LIKELY(x == 0))
|
||||
fesetenv(&envp);
|
||||
#else
|
||||
r = simde_mm_mask_range_ss(src, k, a, b, imm8);
|
||||
#endif
|
||||
}
|
||||
else {
|
||||
r = simde_mm_mask_range_ss(src, k, a, b, imm8);
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_range_round_ss
|
||||
#define _mm_mask_range_round_ss(src, k, a, b, imm8, sae) simde_mm_mask_range_round_ss(src, k, a, b, imm8, sae)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
#define simde_mm_maskz_range_round_ss(k, a, b, imm8, sae) _mm_maskz_range_round_ss(k, a, b, imm8, sae)
|
||||
#elif defined(SIMDE_FAST_EXCEPTIONS)
|
||||
#define simde_mm_maskz_range_round_ss(k, a, b, imm8, sae) simde_mm_maskz_range_ss(k, a, b, imm8)
|
||||
#elif defined(SIMDE_STATEMENT_EXPR_)
|
||||
#if defined(SIMDE_HAVE_FENV_H)
|
||||
#define simde_mm_maskz_range_round_ss(k, a, b, imm8, sae) SIMDE_STATEMENT_EXPR_(({ \
|
||||
simde__m128 simde_mm_maskz_range_round_ss_r; \
|
||||
\
|
||||
if (sae & SIMDE_MM_FROUND_NO_EXC) { \
|
||||
fenv_t simde_mm_maskz_range_round_ss_envp; \
|
||||
int simde_mm_maskz_range_round_ss_x = feholdexcept(&simde_mm_maskz_range_round_ss_envp); \
|
||||
simde_mm_maskz_range_round_ss_r = simde_mm_maskz_range_ss(k, a, b, imm8); \
|
||||
if (HEDLEY_LIKELY(simde_mm_maskz_range_round_ss_x == 0)) \
|
||||
fesetenv(&simde_mm_maskz_range_round_ss_envp); \
|
||||
} \
|
||||
else { \
|
||||
simde_mm_maskz_range_round_ss_r = simde_mm_maskz_range_ss(k, a, b, imm8); \
|
||||
} \
|
||||
\
|
||||
simde_mm_maskz_range_round_ss_r; \
|
||||
}))
|
||||
#else
|
||||
#define simde_mm_maskz_range_round_ss(k, a, b, imm8, sae) simde_mm_maskz_range_ss(k, a, b, imm8)
|
||||
#endif
|
||||
#else
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128
|
||||
simde_mm_maskz_range_round_ss (simde__mmask8 k, simde__m128 a, simde__m128 b, int imm8, int sae)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 15)
|
||||
SIMDE_REQUIRE_CONSTANT(sae) {
|
||||
simde__m128 r;
|
||||
|
||||
if (sae & SIMDE_MM_FROUND_NO_EXC) {
|
||||
#if defined(SIMDE_HAVE_FENV_H)
|
||||
fenv_t envp;
|
||||
int x = feholdexcept(&envp);
|
||||
r = simde_mm_maskz_range_ss(k, a, b, imm8);
|
||||
if (HEDLEY_LIKELY(x == 0))
|
||||
fesetenv(&envp);
|
||||
#else
|
||||
r = simde_mm_maskz_range_ss(k, a, b, imm8);
|
||||
#endif
|
||||
}
|
||||
else {
|
||||
r = simde_mm_maskz_range_ss(k, a, b, imm8);
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_maskz_range_round_ss
|
||||
#define _mm_maskz_range_round_ss(k, a, b, imm8, sae) simde_mm_maskz_range_round_ss(k, a, b, imm8, sae)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
#define simde_mm_range_round_sd(a, b, imm8, sae) _mm_range_round_sd(a, b, imm8, sae)
|
||||
#elif defined(SIMDE_FAST_EXCEPTIONS)
|
||||
#define simde_mm_range_round_sd(a, b, imm8, sae) simde_x_mm_range_sd(a, b, imm8)
|
||||
#elif defined(SIMDE_STATEMENT_EXPR_)
|
||||
#if defined(SIMDE_HAVE_FENV_H)
|
||||
#define simde_mm_range_round_sd(a, b, imm8, sae) SIMDE_STATEMENT_EXPR_(({ \
|
||||
simde__m128d simde_mm_range_round_sd_r; \
|
||||
\
|
||||
if (sae & SIMDE_MM_FROUND_NO_EXC) { \
|
||||
fenv_t simde_mm_range_round_sd_envp; \
|
||||
int simde_mm_range_round_sd_x = feholdexcept(&simde_mm_range_round_sd_envp); \
|
||||
simde_mm_range_round_sd_r = simde_x_mm_range_sd(a, b, imm8); \
|
||||
if (HEDLEY_LIKELY(simde_mm_range_round_sd_x == 0)) \
|
||||
fesetenv(&simde_mm_range_round_sd_envp); \
|
||||
} \
|
||||
else { \
|
||||
simde_mm_range_round_sd_r = simde_x_mm_range_sd(a, b, imm8); \
|
||||
} \
|
||||
\
|
||||
simde_mm_range_round_sd_r; \
|
||||
}))
|
||||
#else
|
||||
#define simde_mm_range_round_sd(a, b, imm8, sae) simde_x_mm_range_sd(a, b, imm8)
|
||||
#endif
|
||||
#else
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128d
|
||||
simde_mm_range_round_sd (simde__m128d a, simde__m128d b, int imm8, int sae)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 15)
|
||||
SIMDE_REQUIRE_CONSTANT(sae) {
|
||||
simde__m128d r;
|
||||
|
||||
if (sae & SIMDE_MM_FROUND_NO_EXC) {
|
||||
#if defined(SIMDE_HAVE_FENV_H)
|
||||
fenv_t envp;
|
||||
int x = feholdexcept(&envp);
|
||||
r = simde_x_mm_range_sd(a, b, imm8);
|
||||
if (HEDLEY_LIKELY(x == 0))
|
||||
fesetenv(&envp);
|
||||
#else
|
||||
r = simde_x_mm_range_sd(a, b, imm8);
|
||||
#endif
|
||||
}
|
||||
else {
|
||||
r = simde_x_mm_range_sd(a, b, imm8);
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_range_round_sd
|
||||
#define _mm_range_round_sd(a, b, imm8, sae) simde_mm_range_round_sd(a, b, imm8, sae)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
#define simde_mm_mask_range_round_sd(src, k, a, b, imm8, sae) _mm_mask_range_round_sd(src, k, a, b, imm8, sae)
|
||||
#elif defined(SIMDE_FAST_EXCEPTIONS)
|
||||
#define simde_mm_mask_range_round_sd(src, k, a, b, imm8, sae) simde_mm_mask_range_sd(src, k, a, b, imm8)
|
||||
#elif defined(SIMDE_STATEMENT_EXPR_)
|
||||
#if defined(SIMDE_HAVE_FENV_H)
|
||||
#define simde_mm_mask_range_round_sd(src, k, a, b, imm8, sae) SIMDE_STATEMENT_EXPR_(({ \
|
||||
simde__m128d simde_mm_mask_range_round_sd_r; \
|
||||
\
|
||||
if (sae & SIMDE_MM_FROUND_NO_EXC) { \
|
||||
fenv_t simde_mm_mask_range_round_sd_envp; \
|
||||
int simde_mm_mask_range_round_sd_x = feholdexcept(&simde_mm_mask_range_round_sd_envp); \
|
||||
simde_mm_mask_range_round_sd_r = simde_mm_mask_range_sd(src, k, a, b, imm8); \
|
||||
if (HEDLEY_LIKELY(simde_mm_mask_range_round_sd_x == 0)) \
|
||||
fesetenv(&simde_mm_mask_range_round_sd_envp); \
|
||||
} \
|
||||
else { \
|
||||
simde_mm_mask_range_round_sd_r = simde_mm_mask_range_sd(src, k, a, b, imm8); \
|
||||
} \
|
||||
\
|
||||
simde_mm_mask_range_round_sd_r; \
|
||||
}))
|
||||
#else
|
||||
#define simde_mm_mask_range_round_sd(src, k, a, b, imm8, sae) simde_mm_mask_range_sd(src, k, a, b, imm8)
|
||||
#endif
|
||||
#else
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128d
|
||||
simde_mm_mask_range_round_sd (simde__m128d src, simde__mmask8 k, simde__m128d a, simde__m128d b, int imm8, int sae)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 15)
|
||||
SIMDE_REQUIRE_CONSTANT(sae) {
|
||||
simde__m128d r;
|
||||
|
||||
if (sae & SIMDE_MM_FROUND_NO_EXC) {
|
||||
#if defined(SIMDE_HAVE_FENV_H)
|
||||
fenv_t envp;
|
||||
int x = feholdexcept(&envp);
|
||||
r = simde_mm_mask_range_sd(src, k, a, b, imm8);
|
||||
if (HEDLEY_LIKELY(x == 0))
|
||||
fesetenv(&envp);
|
||||
#else
|
||||
r = simde_mm_mask_range_sd(src, k, a, b, imm8);
|
||||
#endif
|
||||
}
|
||||
else {
|
||||
r = simde_mm_mask_range_sd(src, k, a, b, imm8);
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_range_round_sd
|
||||
#define _mm_mask_range_round_sd(src, k, a, b, imm8, sae) simde_mm_mask_range_round_sd(src, k, a, b, imm8, sae)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
#define simde_mm_maskz_range_round_sd(k, a, b, imm8, sae) _mm_maskz_range_round_sd(k, a, b, imm8, sae)
|
||||
#elif defined(SIMDE_FAST_EXCEPTIONS)
|
||||
#define simde_mm_maskz_range_round_sd(k, a, b, imm8, sae) simde_mm_maskz_range_sd(k, a, b, imm8)
|
||||
#elif defined(SIMDE_STATEMENT_EXPR_)
|
||||
#if defined(SIMDE_HAVE_FENV_H)
|
||||
#define simde_mm_maskz_range_round_sd(k, a, b, imm8, sae) SIMDE_STATEMENT_EXPR_(({ \
|
||||
simde__m128d simde_mm_maskz_range_round_sd_r; \
|
||||
\
|
||||
if (sae & SIMDE_MM_FROUND_NO_EXC) { \
|
||||
fenv_t simde_mm_maskz_range_round_sd_envp; \
|
||||
int simde_mm_maskz_range_round_sd_x = feholdexcept(&simde_mm_maskz_range_round_sd_envp); \
|
||||
simde_mm_maskz_range_round_sd_r = simde_mm_maskz_range_sd(k, a, b, imm8); \
|
||||
if (HEDLEY_LIKELY(simde_mm_maskz_range_round_sd_x == 0)) \
|
||||
fesetenv(&simde_mm_maskz_range_round_sd_envp); \
|
||||
} \
|
||||
else { \
|
||||
simde_mm_maskz_range_round_sd_r = simde_mm_maskz_range_sd(k, a, b, imm8); \
|
||||
} \
|
||||
\
|
||||
simde_mm_maskz_range_round_sd_r; \
|
||||
}))
|
||||
#else
|
||||
#define simde_mm_maskz_range_round_sd(k, a, b, imm8, sae) simde_mm_maskz_range_sd(k, a, b, imm8)
|
||||
#endif
|
||||
#else
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128d
|
||||
simde_mm_maskz_range_round_sd (simde__mmask8 k, simde__m128d a, simde__m128d b, int imm8, int sae)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 15)
|
||||
SIMDE_REQUIRE_CONSTANT(sae) {
|
||||
simde__m128d r;
|
||||
|
||||
if (sae & SIMDE_MM_FROUND_NO_EXC) {
|
||||
#if defined(SIMDE_HAVE_FENV_H)
|
||||
fenv_t envp;
|
||||
int x = feholdexcept(&envp);
|
||||
r = simde_mm_maskz_range_sd(k, a, b, imm8);
|
||||
if (HEDLEY_LIKELY(x == 0))
|
||||
fesetenv(&envp);
|
||||
#else
|
||||
r = simde_mm_maskz_range_sd(k, a, b, imm8);
|
||||
#endif
|
||||
}
|
||||
else {
|
||||
r = simde_mm_maskz_range_sd(k, a, b, imm8);
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_maskz_range_round_sd
|
||||
#define _mm_maskz_range_round_sd(k, a, b, imm8, sae) simde_mm_maskz_range_round_sd(k, a, b, imm8, sae)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_RANGE_ROUND_H) */
|
||||
@@ -0,0 +1,65 @@
|
||||
/* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Copyright:
|
||||
* 2023 Michael R. Crusoe <crusoe@debian.org>
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512_RCP_H)
|
||||
#define SIMDE_X86_AVX512_RCP_H
|
||||
|
||||
#include "types.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
// TODO: "The maximum relative error for this approximation is less than 2^-14."
|
||||
// vs 1.5*2^-12 for _mm{,256}_rcp_ps
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_rcp14_ps (simde__m512 a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_rcp14_ps(a);
|
||||
#else
|
||||
simde__m512_private
|
||||
r_,
|
||||
a_ = simde__m512_to_private(a);
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.f32) / sizeof(r_.f32[0])) ; i++) {
|
||||
r_.f32[i] = SIMDE_FLOAT32_C(1.0) / a_.f32[i];
|
||||
}
|
||||
|
||||
return simde__m512_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_rcp14_ps
|
||||
#define _mm512_rcp14_ps(a) simde_mm512_rcp14_ps(a)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_RCP_H) */
|
||||
@@ -0,0 +1,355 @@
|
||||
/* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Copyright:
|
||||
* 2023 Michael R. Crusoe <crusoe@debian.org>
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512_REDUCE_H)
|
||||
#define SIMDE_X86_AVX512_REDUCE_H
|
||||
|
||||
#include "types.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
#if defined(__clang__) && SIMDE_FLOAT16_API == SIMDE_FLOAT16_API_FP16
|
||||
SIMDE_DIAGNOSTIC_DISABLE_DOUBLE_PROMOTION_
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde_float16
|
||||
simde_mm512_reduce_max_ph(simde__m512h a) {
|
||||
#if defined(SIMDE_X86_AVX512FP16_NATIVE)
|
||||
return _mm512_reduce_max_ph(a);
|
||||
#else
|
||||
simde__m512h_private a_;
|
||||
simde_float16 r;
|
||||
a_ = simde__m512h_to_private(a);
|
||||
|
||||
r = SIMDE_NINFINITYHF;
|
||||
#if defined(SIMDE_FLOAT16_VECTOR)
|
||||
SIMDE_VECTORIZE_REDUCTION(max:r)
|
||||
#endif
|
||||
for (size_t i = 0 ; i < (sizeof(a_.f16) / sizeof(a_.f16[0])) ; i++) {
|
||||
r = simde_float16_to_float32(a_.f16[i]) > simde_float16_to_float32(r) ? a_.f16[i] : r;
|
||||
}
|
||||
return r;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512FP16_ENABLE_NATIVE_ALIASES)
|
||||
# define _mm512_reduce_max_ph(a) simde_mm512_reduce_max_ph((a))
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde_float16
|
||||
simde_mm512_reduce_min_ph(simde__m512h a) {
|
||||
#if defined(SIMDE_X86_AVX512FP16_NATIVE)
|
||||
return _mm512_reduce_min_ph(a);
|
||||
#else
|
||||
simde__m512h_private a_;
|
||||
simde_float16 r;
|
||||
a_ = simde__m512h_to_private(a);
|
||||
|
||||
r = SIMDE_INFINITYHF;
|
||||
#if defined(SIMDE_FLOAT16_VECTOR)
|
||||
SIMDE_VECTORIZE_REDUCTION(min:r)
|
||||
#endif
|
||||
for (size_t i = 0 ; i < (sizeof(a_.f16) / sizeof(a_.f16[0])) ; i++) {
|
||||
r = simde_float16_to_float32(a_.f16[i]) < simde_float16_to_float32(r) ? a_.f16[i] : r;
|
||||
}
|
||||
return r;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512FP16_ENABLE_NATIVE_ALIASES)
|
||||
# define _mm512_reduce_min_ph(a) simde_mm512_reduce_min_ph((a))
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
int32_t
|
||||
simde_mm512_reduce_max_epi32(simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_reduce_max_epi32(a);
|
||||
#else
|
||||
simde__m512i_private a_;
|
||||
int32_t r;
|
||||
a_ = simde__m512i_to_private(a);
|
||||
|
||||
r = -INT32_MAX;
|
||||
SIMDE_VECTORIZE_REDUCTION(max:r)
|
||||
for (size_t i = 0 ; i < (sizeof(a_.i32) / sizeof(a_.i32[0])) ; i++) {
|
||||
r = a_.i32[i] > r ? a_.i32[i] : r;
|
||||
}
|
||||
return r;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
# define _mm512_reduce_max_epi32(a) simde_mm512_reduce_max_epi32((a))
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
int64_t
|
||||
simde_mm512_reduce_max_epi64(simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_reduce_max_epi64(a);
|
||||
#else
|
||||
simde__m512i_private a_;
|
||||
int64_t r;
|
||||
a_ = simde__m512i_to_private(a);
|
||||
|
||||
r = -INT64_MAX;
|
||||
SIMDE_VECTORIZE_REDUCTION(max:r)
|
||||
for (size_t i = 0 ; i < (sizeof(a_.i64) / sizeof(a_.i64[0])) ; i++) {
|
||||
r = a_.i64[i] > r ? a_.i64[i] : r;
|
||||
}
|
||||
return r;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
# define _mm512_reduce_max_epi64(a) simde_mm512_reduce_max_epi64((a))
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
uint32_t
|
||||
simde_mm512_reduce_max_epu32(simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_reduce_max_epu32(a);
|
||||
#else
|
||||
simde__m512i_private a_;
|
||||
uint32_t r;
|
||||
a_ = simde__m512i_to_private(a);
|
||||
|
||||
r = 0;
|
||||
SIMDE_VECTORIZE_REDUCTION(max:r)
|
||||
for (size_t i = 0 ; i < (sizeof(a_.u32) / sizeof(a_.u32[0])) ; i++) {
|
||||
r = a_.u32[i] > r ? a_.u32[i] : r;
|
||||
}
|
||||
return r;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
# define _mm512_reduce_max_epu32(a) simde_mm512_reduce_max_epu32((a))
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
uint64_t
|
||||
simde_mm512_reduce_max_epu64(simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_reduce_max_epu64(a);
|
||||
#else
|
||||
simde__m512i_private a_;
|
||||
uint64_t r;
|
||||
a_ = simde__m512i_to_private(a);
|
||||
|
||||
r = 0;
|
||||
SIMDE_VECTORIZE_REDUCTION(max:r)
|
||||
for (size_t i = 0 ; i < (sizeof(a_.u64) / sizeof(a_.u64[0])) ; i++) {
|
||||
r = a_.u64[i] > r ? a_.u64[i] : r;
|
||||
}
|
||||
return r;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
# define _mm512_reduce_max_epu64(a) simde_mm512_reduce_max_epu64((a))
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde_float64
|
||||
simde_mm512_reduce_max_pd(simde__m512d a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_reduce_max_pd(a);
|
||||
#else
|
||||
simde__m512d_private a_;
|
||||
simde_float64 r;
|
||||
a_ = simde__m512d_to_private(a);
|
||||
|
||||
r = -SIMDE_MATH_INFINITY;
|
||||
SIMDE_VECTORIZE_REDUCTION(max:r)
|
||||
for (size_t i = 0 ; i < (sizeof(a_.f64) / sizeof(a_.f64[0])) ; i++) {
|
||||
r = a_.f64[i] > r ? a_.f64[i] : r;
|
||||
}
|
||||
return r;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
# define _mm512_reduce_max_pd(a) simde_mm512_reduce_max_pd((a))
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde_float32
|
||||
simde_mm512_reduce_max_ps(simde__m512 a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_reduce_max_ps(a);
|
||||
#else
|
||||
simde__m512_private a_;
|
||||
simde_float32 r;
|
||||
a_ = simde__m512_to_private(a);
|
||||
|
||||
r = -SIMDE_MATH_INFINITYF;
|
||||
SIMDE_VECTORIZE_REDUCTION(max:r)
|
||||
for (size_t i = 0 ; i < (sizeof(a_.f32) / sizeof(a_.f32[0])) ; i++) {
|
||||
r = a_.f32[i] > r ? a_.f32[i] : r;
|
||||
}
|
||||
return r;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
# define _mm512_reduce_max_ps(a) simde_mm512_reduce_max_ps((a))
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
int32_t
|
||||
simde_mm512_reduce_min_epi32(simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_reduce_min_epi32(a);
|
||||
#else
|
||||
simde__m512i_private a_;
|
||||
int32_t r;
|
||||
a_ = simde__m512i_to_private(a);
|
||||
|
||||
r = INT32_MAX;
|
||||
SIMDE_VECTORIZE_REDUCTION(min:r)
|
||||
for (size_t i = 0 ; i < (sizeof(a_.i32) / sizeof(a_.i32[0])) ; i++) {
|
||||
r = a_.i32[i] < r ? a_.i32[i] : r;
|
||||
}
|
||||
return r;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
# define _mm512_reduce_min_epi32(a) simde_mm512_reduce_min_epi32((a))
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
int64_t
|
||||
simde_mm512_reduce_min_epi64(simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_reduce_min_epi64(a);
|
||||
#else
|
||||
simde__m512i_private a_;
|
||||
int64_t r;
|
||||
a_ = simde__m512i_to_private(a);
|
||||
|
||||
r = INT64_MAX;
|
||||
SIMDE_VECTORIZE_REDUCTION(min:r)
|
||||
for (size_t i = 0 ; i < (sizeof(a_.i64) / sizeof(a_.i64[0])) ; i++) {
|
||||
r = a_.i64[i] < r ? a_.i64[i] : r;
|
||||
}
|
||||
return r;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
# define _mm512_reduce_min_epi64(a) simde_mm512_reduce_min_epi64((a))
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
uint32_t
|
||||
simde_mm512_reduce_min_epu32(simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_reduce_min_epu32(a);
|
||||
#else
|
||||
simde__m512i_private a_;
|
||||
uint32_t r;
|
||||
a_ = simde__m512i_to_private(a);
|
||||
|
||||
r = UINT32_MAX;
|
||||
SIMDE_VECTORIZE_REDUCTION(min:r)
|
||||
for (size_t i = 0 ; i < (sizeof(a_.u32) / sizeof(a_.u32[0])) ; i++) {
|
||||
r = a_.u32[i] < r ? a_.u32[i] : r;
|
||||
}
|
||||
return r;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
# define _mm512_reduce_min_epu32(a) simde_mm512_reduce_min_epu32((a))
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
uint64_t
|
||||
simde_mm512_reduce_min_epu64(simde__m512i a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_reduce_min_epu64(a);
|
||||
#else
|
||||
simde__m512i_private a_;
|
||||
uint64_t r;
|
||||
a_ = simde__m512i_to_private(a);
|
||||
|
||||
r = UINT64_MAX;
|
||||
SIMDE_VECTORIZE_REDUCTION(min:r)
|
||||
for (size_t i = 0 ; i < (sizeof(a_.u64) / sizeof(a_.u64[0])) ; i++) {
|
||||
r = a_.u64[i] < r ? a_.u64[i] : r;
|
||||
}
|
||||
return r;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
# define _mm512_reduce_min_epu64(a) simde_mm512_reduce_min_epu64((a))
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde_float64
|
||||
simde_mm512_reduce_min_pd(simde__m512d a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_reduce_min_pd(a);
|
||||
#else
|
||||
simde__m512d_private a_;
|
||||
simde_float64 r;
|
||||
a_ = simde__m512d_to_private(a);
|
||||
|
||||
r = SIMDE_MATH_INFINITY;
|
||||
SIMDE_VECTORIZE_REDUCTION(min:r)
|
||||
for (size_t i = 0 ; i < (sizeof(a_.f64) / sizeof(a_.f64[0])) ; i++) {
|
||||
r = a_.f64[i] < r ? a_.f64[i] : r;
|
||||
}
|
||||
return r;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
# define _mm512_reduce_min_pd(a) simde_mm512_reduce_min_pd((a))
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde_float32
|
||||
simde_mm512_reduce_min_ps(simde__m512 a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_reduce_min_ps(a);
|
||||
#else
|
||||
simde__m512_private a_;
|
||||
simde_float32 r;
|
||||
a_ = simde__m512_to_private(a);
|
||||
|
||||
r = SIMDE_MATH_INFINITYF;
|
||||
SIMDE_VECTORIZE_REDUCTION(min:r)
|
||||
for (size_t i = 0 ; i < (sizeof(a_.f32) / sizeof(a_.f32[0])) ; i++) {
|
||||
r = a_.f32[i] < r ? a_.f32[i] : r;
|
||||
}
|
||||
return r;
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
# define _mm512_reduce_min_ps(a) simde_mm512_reduce_min_ps((a))
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_REDUCE_H) */
|
||||
@@ -0,0 +1,410 @@
|
||||
#if !defined(SIMDE_X86_AVX512_ROL_H)
|
||||
#define SIMDE_X86_AVX512_ROL_H
|
||||
|
||||
#include "types.h"
|
||||
#include "mov.h"
|
||||
#include "or.h"
|
||||
#include "srli.h"
|
||||
#include "slli.h"
|
||||
#include "../avx2.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
#define simde_mm_rol_epi32(a, imm8) _mm_rol_epi32(a, imm8)
|
||||
#else
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_rol_epi32 (simde__m128i a, int imm8)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE (imm8, 0, 255) {
|
||||
simde__m128i_private
|
||||
r_,
|
||||
a_ = simde__m128i_to_private(a);
|
||||
|
||||
#if defined(SIMDE_POWER_ALTIVEC_P6_NATIVE)
|
||||
r_.altivec_i32 = vec_rl(a_.altivec_i32, vec_splats(HEDLEY_STATIC_CAST(unsigned int, imm8)));
|
||||
#elif defined(SIMDE_VECTOR_SUBSCRIPT_SCALAR)
|
||||
switch (imm8 & 31) {
|
||||
case 0:
|
||||
r_ = a_;
|
||||
break;
|
||||
default:
|
||||
r_.u32 = (a_.u32 << (imm8 & 31)) | (a_.u32 >> (32 - (imm8 & 31)));
|
||||
break;
|
||||
}
|
||||
#else
|
||||
switch (imm8 & 31) {
|
||||
case 0:
|
||||
r_ = a_;
|
||||
break;
|
||||
default:
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.u32) / sizeof(r_.u32[0])) ; i++) {
|
||||
r_.u32[i] = (a_.u32[i] << (imm8 & 31)) | (a_.u32[i] >> (32 - (imm8 & 31)));
|
||||
}
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m128i_from_private(r_);
|
||||
}
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_rol_epi32
|
||||
#define _mm_rol_epi32(a, imm8) simde_mm_rol_epi32(a, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
#define simde_mm_mask_rol_epi32(src, k, a, imm8) _mm_mask_rol_epi32(src, k, a, imm8)
|
||||
#else
|
||||
#define simde_mm_mask_rol_epi32(src, k, a, imm8) simde_mm_mask_mov_epi32(src, k, simde_mm_rol_epi32(a, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_rol_epi32
|
||||
#define _mm_mask_rol_epi32(src, k, a, imm8) simde_mm_mask_rol_epi32(src, k, a, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
#define simde_mm_maskz_rol_epi32(k, a, imm8) _mm_maskz_rol_epi32(k, a, imm8)
|
||||
#else
|
||||
#define simde_mm_maskz_rol_epi32(k, a, imm8) simde_mm_maskz_mov_epi32(k, simde_mm_rol_epi32(a, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_maskz_rol_epi32
|
||||
#define _mm_maskz_rol_epi32(k, a, imm8) simde_mm_maskz_rol_epi32(k, a, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
#define simde_mm256_rol_epi32(a, imm8) _mm256_rol_epi32(a, imm8)
|
||||
#else
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_rol_epi32 (simde__m256i a, int imm8)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE (imm8, 0, 255) {
|
||||
simde__m256i_private
|
||||
r_,
|
||||
a_ = simde__m256i_to_private(a);
|
||||
|
||||
#if defined(SIMDE_POWER_ALTIVEC_P6_NATIVE)
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m128i_private) / sizeof(r_.m128i_private[0])) ; i++) {
|
||||
r_.m128i_private[i].altivec_i32 = vec_rl(a_.m128i_private[i].altivec_i32, vec_splats(HEDLEY_STATIC_CAST(unsigned int, imm8)));
|
||||
}
|
||||
#elif defined(SIMDE_VECTOR_SUBSCRIPT_SCALAR)
|
||||
switch (imm8 & 31) {
|
||||
case 0:
|
||||
r_ = a_;
|
||||
break;
|
||||
default:
|
||||
r_.u32 = (a_.u32 << (imm8 & 31)) | (a_.u32 >> (32 - (imm8 & 31)));
|
||||
break;
|
||||
}
|
||||
#else
|
||||
switch (imm8 & 31) {
|
||||
case 0:
|
||||
r_ = a_;
|
||||
break;
|
||||
default:
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.u32) / sizeof(r_.u32[0])) ; i++) {
|
||||
r_.u32[i] = (a_.u32[i] << (imm8 & 31)) | (a_.u32[i] >> (32 - (imm8 & 31)));
|
||||
}
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m256i_from_private(r_);
|
||||
}
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_rol_epi32
|
||||
#define _mm256_rol_epi32(a, imm8) simde_mm256_rol_epi32(a, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
#define simde_mm256_mask_rol_epi32(src, k, a, imm8) _mm256_mask_rol_epi32(src, k, a, imm8)
|
||||
#else
|
||||
#define simde_mm256_mask_rol_epi32(src, k, a, imm8) simde_mm256_mask_mov_epi32(src, k, simde_mm256_rol_epi32(a, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_mask_rol_epi32
|
||||
#define _mm256_mask_rol_epi32(src, k, a, imm8) simde_mm256_mask_rol_epi32(src, k, a, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
#define simde_mm256_maskz_rol_epi32(k, a, imm8) _mm256_maskz_rol_epi32(k, a, imm8)
|
||||
#else
|
||||
#define simde_mm256_maskz_rol_epi32(k, a, imm8) simde_mm256_maskz_mov_epi32(k, simde_mm256_rol_epi32(a, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_maskz_rol_epi32
|
||||
#define _mm256_maskz_rol_epi32(k, a, imm8) simde_mm256_maskz_rol_epi32(k, a, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define simde_mm512_rol_epi32(a, imm8) _mm512_rol_epi32(a, imm8)
|
||||
#else
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_rol_epi32 (simde__m512i a, int imm8)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE (imm8, 0, 255) {
|
||||
simde__m512i_private
|
||||
r_,
|
||||
a_ = simde__m512i_to_private(a);
|
||||
|
||||
#if defined(SIMDE_POWER_ALTIVEC_P6_NATIVE)
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m128i_private) / sizeof(r_.m128i_private[0])) ; i++) {
|
||||
r_.m128i_private[i].altivec_i32 = vec_rl(a_.m128i_private[i].altivec_i32, vec_splats(HEDLEY_STATIC_CAST(unsigned int, imm8)));
|
||||
}
|
||||
#elif defined(SIMDE_VECTOR_SUBSCRIPT_SCALAR)
|
||||
switch (imm8 & 31) {
|
||||
case 0:
|
||||
r_ = a_;
|
||||
break;
|
||||
default:
|
||||
r_.u32 = (a_.u32 << (imm8 & 31)) | (a_.u32 >> (32 - (imm8 & 31)));
|
||||
break;
|
||||
}
|
||||
#else
|
||||
switch (imm8 & 31) {
|
||||
case 0:
|
||||
r_ = a_;
|
||||
break;
|
||||
default:
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.u32) / sizeof(r_.u32[0])) ; i++) {
|
||||
r_.u32[i] = (a_.u32[i] << (imm8 & 31)) | (a_.u32[i] >> (32 - (imm8 & 31)));
|
||||
}
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
}
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_rol_epi32
|
||||
#define _mm512_rol_epi32(a, imm8) simde_mm512_rol_epi32(a, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define simde_mm512_mask_rol_epi32(src, k, a, imm8) _mm512_mask_rol_epi32(src, k, a, imm8)
|
||||
#else
|
||||
#define simde_mm512_mask_rol_epi32(src, k, a, imm8) simde_mm512_mask_mov_epi32(src, k, simde_mm512_rol_epi32(a, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_rol_epi32
|
||||
#define _mm512_mask_rol_epi32(src, k, a, imm8) simde_mm512_mask_rol_epi32(src, k, a, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define simde_mm512_maskz_rol_epi32(k, a, imm8) _mm512_maskz_rol_epi32(k, a, imm8)
|
||||
#else
|
||||
#define simde_mm512_maskz_rol_epi32(k, a, imm8) simde_mm512_maskz_mov_epi32(k, simde_mm512_rol_epi32(a, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_rol_epi32
|
||||
#define _mm512_maskz_rol_epi32(k, a, imm8) simde_mm512_maskz_rol_epi32(k, a, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
#define simde_mm_rol_epi64(a, imm8) _mm_rol_epi64(a, imm8)
|
||||
#else
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_rol_epi64 (simde__m128i a, int imm8)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE (imm8, 0, 255) {
|
||||
simde__m128i_private
|
||||
r_,
|
||||
a_ = simde__m128i_to_private(a);
|
||||
|
||||
#if defined(SIMDE_POWER_ALTIVEC_P8_NATIVE)
|
||||
r_.altivec_i64 = vec_rl(a_.altivec_i64, vec_splats(HEDLEY_STATIC_CAST(unsigned long long, imm8)));
|
||||
#elif defined(SIMDE_VECTOR_SUBSCRIPT_SCALAR)
|
||||
switch (imm8 & 63) {
|
||||
case 0:
|
||||
r_ = a_;
|
||||
break;
|
||||
default:
|
||||
r_.u64 = (a_.u64 << (imm8 & 63)) | (a_.u64 >> (64 - (imm8 & 63)));
|
||||
break;
|
||||
}
|
||||
#else
|
||||
switch (imm8 & 63) {
|
||||
case 0:
|
||||
r_ = a_;
|
||||
break;
|
||||
default:
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.u64) / sizeof(r_.u64[0])) ; i++) {
|
||||
r_.u64[i] = (a_.u64[i] << (imm8 & 63)) | (a_.u64[i] >> (64 - (imm8 & 63)));
|
||||
}
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m128i_from_private(r_);
|
||||
}
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_rol_epi64
|
||||
#define _mm_rol_epi64(a, imm8) simde_mm_rol_epi64(a, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
#define simde_mm_mask_rol_epi64(src, k, a, imm8) _mm_mask_rol_epi64(src, k, a, imm8)
|
||||
#else
|
||||
#define simde_mm_mask_rol_epi64(src, k, a, imm8) simde_mm_mask_mov_epi64(src, k, simde_mm_rol_epi64(a, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_rol_epi64
|
||||
#define _mm_mask_rol_epi64(src, k, a, imm8) simde_mm_mask_rol_epi64(src, k, a, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
#define simde_mm_maskz_rol_epi64(k, a, imm8) _mm_maskz_rol_epi64(k, a, imm8)
|
||||
#else
|
||||
#define simde_mm_maskz_rol_epi64(k, a, imm8) simde_mm_maskz_mov_epi64(k, simde_mm_rol_epi64(a, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_maskz_rol_epi64
|
||||
#define _mm_maskz_rol_epi64(k, a, imm8) simde_mm_maskz_rol_epi64(k, a, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
#define simde_mm256_rol_epi64(a, imm8) _mm256_rol_epi64(a, imm8)
|
||||
#else
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_rol_epi64 (simde__m256i a, int imm8)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE (imm8, 0, 255) {
|
||||
simde__m256i_private
|
||||
r_,
|
||||
a_ = simde__m256i_to_private(a);
|
||||
|
||||
#if defined(SIMDE_POWER_ALTIVEC_P8_NATIVE)
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m128i_private) / sizeof(r_.m128i_private[0])) ; i++) {
|
||||
r_.m128i_private[i].altivec_i64 = vec_rl(a_.m128i_private[i].altivec_i64, vec_splats(HEDLEY_STATIC_CAST(unsigned long long, imm8)));
|
||||
}
|
||||
#elif defined(SIMDE_VECTOR_SUBSCRIPT_SCALAR)
|
||||
switch (imm8 & 63) {
|
||||
case 0:
|
||||
r_ = a_;
|
||||
break;
|
||||
default:
|
||||
r_.u64 = (a_.u64 << (imm8 & 63)) | (a_.u64 >> (64 - (imm8 & 63)));
|
||||
break;
|
||||
}
|
||||
#else
|
||||
switch (imm8 & 63) {
|
||||
case 0:
|
||||
r_ = a_;
|
||||
break;
|
||||
default:
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.u64) / sizeof(r_.u64[0])) ; i++) {
|
||||
r_.u64[i] = (a_.u64[i] << (imm8 & 63)) | (a_.u64[i] >> (64 - (imm8 & 63)));
|
||||
}
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m256i_from_private(r_);
|
||||
}
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_rol_epi64
|
||||
#define _mm256_rol_epi64(a, imm8) simde_mm256_rol_epi64(a, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
#define simde_mm256_mask_rol_epi64(src, k, a, imm8) _mm256_mask_rol_epi64(src, k, a, imm8)
|
||||
#else
|
||||
#define simde_mm256_mask_rol_epi64(src, k, a, imm8) simde_mm256_mask_mov_epi64(src, k, simde_mm256_rol_epi64(a, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_mask_rol_epi64
|
||||
#define _mm256_mask_rol_epi64(src, k, a, imm8) simde_mm256_mask_rol_epi64(src, k, a, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
#define simde_mm256_maskz_rol_epi64(k, a, imm8) _mm256_maskz_rol_epi64(k, a, imm8)
|
||||
#else
|
||||
#define simde_mm256_maskz_rol_epi64(k, a, imm8) simde_mm256_maskz_mov_epi64(k, simde_mm256_rol_epi64(a, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_maskz_rol_epi64
|
||||
#define _mm256_maskz_rol_epi64(k, a, imm8) simde_mm256_maskz_rol_epi64(k, a, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define simde_mm512_rol_epi64(a, imm8) _mm512_rol_epi64(a, imm8)
|
||||
#else
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_rol_epi64 (simde__m512i a, int imm8)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE (imm8, 0, 255) {
|
||||
simde__m512i_private
|
||||
r_,
|
||||
a_ = simde__m512i_to_private(a);
|
||||
|
||||
#if defined(SIMDE_POWER_ALTIVEC_P8_NATIVE)
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m128i_private) / sizeof(r_.m128i_private[0])) ; i++) {
|
||||
r_.m128i_private[i].altivec_i64 = vec_rl(a_.m128i_private[i].altivec_i64, vec_splats(HEDLEY_STATIC_CAST(unsigned long long, imm8)));
|
||||
}
|
||||
#elif defined(SIMDE_VECTOR_SUBSCRIPT_SCALAR)
|
||||
switch (imm8 & 63) {
|
||||
case 0:
|
||||
r_ = a_;
|
||||
break;
|
||||
default:
|
||||
r_.u64 = (a_.u64 << (imm8 & 63)) | (a_.u64 >> (64 - (imm8 & 63)));
|
||||
break;
|
||||
}
|
||||
#else
|
||||
switch (imm8 & 63) {
|
||||
case 0:
|
||||
r_ = a_;
|
||||
break;
|
||||
default:
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.u64) / sizeof(r_.u64[0])) ; i++) {
|
||||
r_.u64[i] = (a_.u64[i] << (imm8 & 63)) | (a_.u64[i] >> (64 - (imm8 & 63)));
|
||||
}
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
}
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_rol_epi64
|
||||
#define _mm512_rol_epi64(a, imm8) simde_mm512_rol_epi64(a, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define simde_mm512_mask_rol_epi64(src, k, a, imm8) _mm512_mask_rol_epi64(src, k, a, imm8)
|
||||
#else
|
||||
#define simde_mm512_mask_rol_epi64(src, k, a, imm8) simde_mm512_mask_mov_epi64(src, k, simde_mm512_rol_epi64(a, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_rol_epi64
|
||||
#define _mm512_mask_rol_epi64(src, k, a, imm8) simde_mm512_mask_rol_epi64(src, k, a, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define simde_mm512_maskz_rol_epi64(k, a, imm8) _mm512_maskz_rol_epi64(k, a, imm8)
|
||||
#else
|
||||
#define simde_mm512_maskz_rol_epi64(k, a, imm8) simde_mm512_maskz_mov_epi64(k, simde_mm512_rol_epi64(a, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_rol_epi64
|
||||
#define _mm512_maskz_rol_epi64(k, a, imm8) simde_mm512_maskz_rol_epi64(k, a, imm8)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_ROL_H) */
|
||||
@@ -0,0 +1,415 @@
|
||||
#if !defined(SIMDE_X86_AVX512_ROLV_H)
|
||||
#define SIMDE_X86_AVX512_ROLV_H
|
||||
|
||||
#include "types.h"
|
||||
#include "../avx2.h"
|
||||
#include "mov.h"
|
||||
#include "srlv.h"
|
||||
#include "sllv.h"
|
||||
#include "or.h"
|
||||
#include "and.h"
|
||||
#include "sub.h"
|
||||
#include "set1.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_rolv_epi32 (simde__m128i a, simde__m128i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_rolv_epi32(a, b);
|
||||
#else
|
||||
simde__m128i_private
|
||||
r_,
|
||||
a_ = simde__m128i_to_private(a),
|
||||
b_ = simde__m128i_to_private(b);
|
||||
|
||||
#if defined(SIMDE_POWER_ALTIVEC_P6_NATIVE)
|
||||
r_.altivec_u32 = vec_rl(a_.altivec_u32, b_.altivec_u32);
|
||||
|
||||
return simde__m128i_from_private(r_);
|
||||
#else
|
||||
HEDLEY_STATIC_CAST(void, r_);
|
||||
HEDLEY_STATIC_CAST(void, a_);
|
||||
HEDLEY_STATIC_CAST(void, b_);
|
||||
|
||||
simde__m128i
|
||||
count1 = simde_mm_and_si128(b, simde_mm_set1_epi32(31)),
|
||||
count2 = simde_mm_sub_epi32(simde_mm_set1_epi32(32), count1);
|
||||
|
||||
return simde_mm_or_si128(simde_mm_sllv_epi32(a, count1), simde_mm_srlv_epi32(a, count2));
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_rolv_epi32
|
||||
#define _mm_rolv_epi32(a, b) simde_mm_rolv_epi32(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_mask_rolv_epi32 (simde__m128i src, simde__mmask8 k, simde__m128i a, simde__m128i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_mask_rolv_epi32(src, k, a, b);
|
||||
#else
|
||||
return simde_mm_mask_mov_epi32(src, k, simde_mm_rolv_epi32(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_rolv_epi32
|
||||
#define _mm_mask_rolv_epi32(src, k, a, b) simde_mm_mask_rolv_epi32(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_maskz_rolv_epi32 (simde__mmask8 k, simde__m128i a, simde__m128i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_maskz_rolv_epi32(k, a, b);
|
||||
#else
|
||||
return simde_mm_maskz_mov_epi32(k, simde_mm_rolv_epi32(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_maskz_rolv_epi32
|
||||
#define _mm_maskz_rolv_epi32(k, a, b) simde_mm_maskz_rolv_epi32(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_rolv_epi32 (simde__m256i a, simde__m256i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_rolv_epi32(a, b);
|
||||
#else
|
||||
simde__m256i_private
|
||||
r_,
|
||||
a_ = simde__m256i_to_private(a),
|
||||
b_ = simde__m256i_to_private(b);
|
||||
|
||||
#if defined(SIMDE_POWER_ALTIVEC_P6_NATIVE)
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m128i_private) / sizeof(r_.m128i_private[0])) ; i++) {
|
||||
r_.m128i_private[i].altivec_u32 = vec_rl(a_.m128i_private[i].altivec_u32, b_.m128i_private[i].altivec_u32);
|
||||
}
|
||||
|
||||
return simde__m256i_from_private(r_);
|
||||
#elif SIMDE_NATURAL_VECTOR_SIZE_LE(128)
|
||||
r_.m128i[0] = simde_mm_rolv_epi32(a_.m128i[0], b_.m128i[0]);
|
||||
r_.m128i[1] = simde_mm_rolv_epi32(a_.m128i[1], b_.m128i[1]);
|
||||
|
||||
return simde__m256i_from_private(r_);
|
||||
#else
|
||||
HEDLEY_STATIC_CAST(void, r_);
|
||||
HEDLEY_STATIC_CAST(void, a_);
|
||||
HEDLEY_STATIC_CAST(void, b_);
|
||||
|
||||
simde__m256i
|
||||
count1 = simde_mm256_and_si256(b, simde_mm256_set1_epi32(31)),
|
||||
count2 = simde_mm256_sub_epi32(simde_mm256_set1_epi32(32), count1);
|
||||
|
||||
return simde_mm256_or_si256(simde_mm256_sllv_epi32(a, count1), simde_mm256_srlv_epi32(a, count2));
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_rolv_epi32
|
||||
#define _mm256_rolv_epi32(a, b) simde_mm256_rolv_epi32(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_mask_rolv_epi32 (simde__m256i src, simde__mmask8 k, simde__m256i a, simde__m256i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_mask_rolv_epi32(src, k, a, b);
|
||||
#else
|
||||
return simde_mm256_mask_mov_epi32(src, k, simde_mm256_rolv_epi32(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_mask_rolv_epi32
|
||||
#define _mm256_mask_rolv_epi32(src, k, a, b) simde_mm256_mask_rolv_epi32(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_maskz_rolv_epi32 (simde__mmask8 k, simde__m256i a, simde__m256i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_maskz_rolv_epi32(k, a, b);
|
||||
#else
|
||||
return simde_mm256_maskz_mov_epi32(k, simde_mm256_rolv_epi32(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_maskz_rolv_epi32
|
||||
#define _mm256_maskz_rolv_epi32(k, a, b) simde_mm256_maskz_rolv_epi32(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_rolv_epi32 (simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_rolv_epi32(a, b);
|
||||
#else
|
||||
simde__m512i_private
|
||||
r_,
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b);
|
||||
|
||||
#if defined(SIMDE_POWER_ALTIVEC_P6_NATIVE)
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m128i_private) / sizeof(r_.m128i_private[0])) ; i++) {
|
||||
r_.m128i_private[i].altivec_u32 = vec_rl(a_.m128i_private[i].altivec_u32, b_.m128i_private[i].altivec_u32);
|
||||
}
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#elif SIMDE_NATURAL_VECTOR_SIZE_LE(256)
|
||||
r_.m256i[0] = simde_mm256_rolv_epi32(a_.m256i[0], b_.m256i[0]);
|
||||
r_.m256i[1] = simde_mm256_rolv_epi32(a_.m256i[1], b_.m256i[1]);
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#else
|
||||
HEDLEY_STATIC_CAST(void, r_);
|
||||
HEDLEY_STATIC_CAST(void, a_);
|
||||
HEDLEY_STATIC_CAST(void, b_);
|
||||
|
||||
simde__m512i
|
||||
count1 = simde_mm512_and_si512(b, simde_mm512_set1_epi32(31)),
|
||||
count2 = simde_mm512_sub_epi32(simde_mm512_set1_epi32(32), count1);
|
||||
|
||||
return simde_mm512_or_si512(simde_mm512_sllv_epi32(a, count1), simde_mm512_srlv_epi32(a, count2));
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_rolv_epi32
|
||||
#define _mm512_rolv_epi32(a, b) simde_mm512_rolv_epi32(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_rolv_epi32 (simde__m512i src, simde__mmask16 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_rolv_epi32(src, k, a, b);
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi32(src, k, simde_mm512_rolv_epi32(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_rolv_epi32
|
||||
#define _mm512_mask_rolv_epi32(src, k, a, b) simde_mm512_mask_rolv_epi32(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_rolv_epi32 (simde__mmask16 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_maskz_rolv_epi32(k, a, b);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_epi32(k, simde_mm512_rolv_epi32(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_rolv_epi32
|
||||
#define _mm512_maskz_rolv_epi32(k, a, b) simde_mm512_maskz_rolv_epi32(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_rolv_epi64 (simde__m128i a, simde__m128i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_rolv_epi64(a, b);
|
||||
#else
|
||||
simde__m128i_private
|
||||
r_,
|
||||
a_ = simde__m128i_to_private(a),
|
||||
b_ = simde__m128i_to_private(b);
|
||||
|
||||
#if defined(SIMDE_POWER_ALTIVEC_P8_NATIVE)
|
||||
r_.altivec_u64 = vec_rl(a_.altivec_u64, b_.altivec_u64);
|
||||
|
||||
return simde__m128i_from_private(r_);
|
||||
#else
|
||||
HEDLEY_STATIC_CAST(void, r_);
|
||||
HEDLEY_STATIC_CAST(void, a_);
|
||||
HEDLEY_STATIC_CAST(void, b_);
|
||||
|
||||
simde__m128i
|
||||
count1 = simde_mm_and_si128(b, simde_mm_set1_epi64x(63)),
|
||||
count2 = simde_mm_sub_epi64(simde_mm_set1_epi64x(64), count1);
|
||||
|
||||
return simde_mm_or_si128(simde_mm_sllv_epi64(a, count1), simde_mm_srlv_epi64(a, count2));
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_rolv_epi64
|
||||
#define _mm_rolv_epi64(a, b) simde_mm_rolv_epi64(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_mask_rolv_epi64 (simde__m128i src, simde__mmask8 k, simde__m128i a, simde__m128i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_mask_rolv_epi64(src, k, a, b);
|
||||
#else
|
||||
return simde_mm_mask_mov_epi64(src, k, simde_mm_rolv_epi64(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_rolv_epi64
|
||||
#define _mm_mask_rolv_epi64(src, k, a, b) simde_mm_mask_rolv_epi64(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_maskz_rolv_epi64 (simde__mmask8 k, simde__m128i a, simde__m128i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_maskz_rolv_epi64(k, a, b);
|
||||
#else
|
||||
return simde_mm_maskz_mov_epi64(k, simde_mm_rolv_epi64(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_maskz_rolv_epi64
|
||||
#define _mm_maskz_rolv_epi64(k, a, b) simde_mm_maskz_rolv_epi64(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_rolv_epi64 (simde__m256i a, simde__m256i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_rolv_epi64(a, b);
|
||||
#else
|
||||
simde__m256i_private
|
||||
r_,
|
||||
a_ = simde__m256i_to_private(a),
|
||||
b_ = simde__m256i_to_private(b);
|
||||
|
||||
#if defined(SIMDE_POWER_ALTIVEC_P8_NATIVE)
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m128i_private) / sizeof(r_.m128i_private[0])) ; i++) {
|
||||
r_.m128i_private[i].altivec_u64 = vec_rl(a_.m128i_private[i].altivec_u64, b_.m128i_private[i].altivec_u64);
|
||||
}
|
||||
|
||||
return simde__m256i_from_private(r_);
|
||||
#elif SIMDE_NATURAL_VECTOR_SIZE_LE(128)
|
||||
r_.m128i[0] = simde_mm_rolv_epi64(a_.m128i[0], b_.m128i[0]);
|
||||
r_.m128i[1] = simde_mm_rolv_epi64(a_.m128i[1], b_.m128i[1]);
|
||||
|
||||
return simde__m256i_from_private(r_);
|
||||
#else
|
||||
HEDLEY_STATIC_CAST(void, r_);
|
||||
HEDLEY_STATIC_CAST(void, a_);
|
||||
HEDLEY_STATIC_CAST(void, b_);
|
||||
|
||||
simde__m256i
|
||||
count1 = simde_mm256_and_si256(b, simde_mm256_set1_epi64x(63)),
|
||||
count2 = simde_mm256_sub_epi64(simde_mm256_set1_epi64x(64), count1);
|
||||
|
||||
return simde_mm256_or_si256(simde_mm256_sllv_epi64(a, count1), simde_mm256_srlv_epi64(a, count2));
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_rolv_epi64
|
||||
#define _mm256_rolv_epi64(a, b) simde_mm256_rolv_epi64(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_mask_rolv_epi64 (simde__m256i src, simde__mmask8 k, simde__m256i a, simde__m256i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_mask_rolv_epi64(src, k, a, b);
|
||||
#else
|
||||
return simde_mm256_mask_mov_epi64(src, k, simde_mm256_rolv_epi64(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_mask_rolv_epi64
|
||||
#define _mm256_mask_rolv_epi64(src, k, a, b) simde_mm256_mask_rolv_epi64(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_maskz_rolv_epi64 (simde__mmask8 k, simde__m256i a, simde__m256i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_maskz_rolv_epi64(k, a, b);
|
||||
#else
|
||||
return simde_mm256_maskz_mov_epi64(k, simde_mm256_rolv_epi64(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_maskz_rolv_epi64
|
||||
#define _mm256_maskz_rolv_epi64(k, a, b) simde_mm256_maskz_rolv_epi64(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_rolv_epi64 (simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_rolv_epi64(a, b);
|
||||
#else
|
||||
simde__m512i_private
|
||||
r_,
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b);
|
||||
|
||||
#if defined(SIMDE_POWER_ALTIVEC_P8_NATIVE)
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m128i_private) / sizeof(r_.m128i_private[0])) ; i++) {
|
||||
r_.m128i_private[i].altivec_u64 = vec_rl(a_.m128i_private[i].altivec_u64, b_.m128i_private[i].altivec_u64);
|
||||
}
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#elif SIMDE_NATURAL_VECTOR_SIZE_LE(256)
|
||||
r_.m256i[0] = simde_mm256_rolv_epi64(a_.m256i[0], b_.m256i[0]);
|
||||
r_.m256i[1] = simde_mm256_rolv_epi64(a_.m256i[1], b_.m256i[1]);
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#else
|
||||
HEDLEY_STATIC_CAST(void, r_);
|
||||
HEDLEY_STATIC_CAST(void, a_);
|
||||
HEDLEY_STATIC_CAST(void, b_);
|
||||
|
||||
simde__m512i
|
||||
count1 = simde_mm512_and_si512(b, simde_mm512_set1_epi64(63)),
|
||||
count2 = simde_mm512_sub_epi64(simde_mm512_set1_epi64(64), count1);
|
||||
|
||||
return simde_mm512_or_si512(simde_mm512_sllv_epi64(a, count1), simde_mm512_srlv_epi64(a, count2));
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_rolv_epi64
|
||||
#define _mm512_rolv_epi64(a, b) simde_mm512_rolv_epi64(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_rolv_epi64 (simde__m512i src, simde__mmask8 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_rolv_epi64(src, k, a, b);
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi64(src, k, simde_mm512_rolv_epi64(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_rolv_epi64
|
||||
#define _mm512_mask_rolv_epi64(src, k, a, b) simde_mm512_mask_rolv_epi64(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_rolv_epi64 (simde__mmask8 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_maskz_rolv_epi64(k, a, b);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_epi64(k, simde_mm512_rolv_epi64(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_rolv_epi64
|
||||
#define _mm512_maskz_rolv_epi64(k, a, b) simde_mm512_maskz_rolv_epi64(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_ROLV_H) */
|
||||
@@ -0,0 +1,410 @@
|
||||
#if !defined(SIMDE_X86_AVX512_ROR_H)
|
||||
#define SIMDE_X86_AVX512_ROR_H
|
||||
|
||||
#include "types.h"
|
||||
#include "mov.h"
|
||||
#include "or.h"
|
||||
#include "srli.h"
|
||||
#include "slli.h"
|
||||
#include "../avx2.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
#define simde_mm_ror_epi32(a, imm8) _mm_ror_epi32(a, imm8)
|
||||
#else
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_ror_epi32 (simde__m128i a, int imm8)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE (imm8, 0, 255) {
|
||||
simde__m128i_private
|
||||
r_,
|
||||
a_ = simde__m128i_to_private(a);
|
||||
|
||||
#if defined(SIMDE_POWER_ALTIVEC_P6_NATIVE)
|
||||
r_.altivec_i32 = vec_rl(a_.altivec_i32, vec_splats(HEDLEY_STATIC_CAST(unsigned int, 32 - imm8)));
|
||||
#elif defined(SIMDE_VECTOR_SUBSCRIPT_SCALAR)
|
||||
switch (imm8 & 31) {
|
||||
case 0:
|
||||
r_ = a_;
|
||||
break;
|
||||
default:
|
||||
r_.u32 = (a_.u32 >> (imm8 & 31)) | (a_.u32 << (32 - (imm8 & 31)));
|
||||
break;
|
||||
}
|
||||
#else
|
||||
switch (imm8 & 31) {
|
||||
case 0:
|
||||
r_ = a_;
|
||||
break;
|
||||
default:
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.u32) / sizeof(r_.u32[0])) ; i++) {
|
||||
r_.u32[i] = (a_.u32[i] >> (imm8 & 31)) | (a_.u32[i] << (32 - (imm8 & 31)));
|
||||
}
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m128i_from_private(r_);
|
||||
}
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_ror_epi32
|
||||
#define _mm_ror_epi32(a, imm8) simde_mm_ror_epi32(a, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
#define simde_mm_mask_ror_epi32(src, k, a, imm8) _mm_mask_ror_epi32(src, k, a, imm8)
|
||||
#else
|
||||
#define simde_mm_mask_ror_epi32(src, k, a, imm8) simde_mm_mask_mov_epi32(src, k, simde_mm_ror_epi32(a, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_ror_epi32
|
||||
#define _mm_mask_ror_epi32(src, k, a, imm8) simde_mm_mask_ror_epi32(src, k, a, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
#define simde_mm_maskz_ror_epi32(k, a, imm8) _mm_maskz_ror_epi32(k, a, imm8)
|
||||
#else
|
||||
#define simde_mm_maskz_ror_epi32(k, a, imm8) simde_mm_maskz_mov_epi32(k, simde_mm_ror_epi32(a, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_maskz_ror_epi32
|
||||
#define _mm_maskz_ror_epi32(k, a, imm8) simde_mm_maskz_ror_epi32(k, a, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
#define simde_mm256_ror_epi32(a, imm8) _mm256_ror_epi32(a, imm8)
|
||||
#else
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_ror_epi32 (simde__m256i a, int imm8)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE (imm8, 0, 255) {
|
||||
simde__m256i_private
|
||||
r_,
|
||||
a_ = simde__m256i_to_private(a);
|
||||
|
||||
#if defined(SIMDE_POWER_ALTIVEC_P6_NATIVE)
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m128i_private) / sizeof(r_.m128i_private[0])) ; i++) {
|
||||
r_.m128i_private[i].altivec_i32 = vec_rl(a_.m128i_private[i].altivec_i32, vec_splats(HEDLEY_STATIC_CAST(unsigned int, 32 - imm8)));
|
||||
}
|
||||
#elif defined(SIMDE_VECTOR_SUBSCRIPT_SCALAR)
|
||||
switch (imm8 & 31) {
|
||||
case 0:
|
||||
r_ = a_;
|
||||
break;
|
||||
default:
|
||||
r_.u32 = (a_.u32 >> (imm8 & 31)) | (a_.u32 << (32 - (imm8 & 31)));
|
||||
break;
|
||||
}
|
||||
#else
|
||||
switch (imm8 & 31) {
|
||||
case 0:
|
||||
r_ = a_;
|
||||
break;
|
||||
default:
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.u32) / sizeof(r_.u32[0])) ; i++) {
|
||||
r_.u32[i] = (a_.u32[i] >> (imm8 & 31)) | (a_.u32[i] << (32 - (imm8 & 31)));
|
||||
}
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m256i_from_private(r_);
|
||||
}
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_ror_epi32
|
||||
#define _mm256_ror_epi32(a, imm8) simde_mm256_ror_epi32(a, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
#define simde_mm256_mask_ror_epi32(src, k, a, imm8) _mm256_mask_ror_epi32(src, k, a, imm8)
|
||||
#else
|
||||
#define simde_mm256_mask_ror_epi32(src, k, a, imm8) simde_mm256_mask_mov_epi32(src, k, simde_mm256_ror_epi32(a, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_mask_ror_epi32
|
||||
#define _mm256_mask_ror_epi32(src, k, a, imm8) simde_mm256_mask_ror_epi32(src, k, a, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
#define simde_mm256_maskz_ror_epi32(k, a, imm8) _mm256_maskz_ror_epi32(k, a, imm8)
|
||||
#else
|
||||
#define simde_mm256_maskz_ror_epi32(k, a, imm8) simde_mm256_maskz_mov_epi32(k, simde_mm256_ror_epi32(a, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_maskz_ror_epi32
|
||||
#define _mm256_maskz_ror_epi32(k, a, imm8) simde_mm256_maskz_ror_epi32(k, a, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define simde_mm512_ror_epi32(a, imm8) _mm512_ror_epi32(a, imm8)
|
||||
#else
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_ror_epi32 (simde__m512i a, int imm8)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE (imm8, 0, 255) {
|
||||
simde__m512i_private
|
||||
r_,
|
||||
a_ = simde__m512i_to_private(a);
|
||||
|
||||
#if defined(SIMDE_POWER_ALTIVEC_P6_NATIVE)
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m128i_private) / sizeof(r_.m128i_private[0])) ; i++) {
|
||||
r_.m128i_private[i].altivec_i32 = vec_rl(a_.m128i_private[i].altivec_i32, vec_splats(HEDLEY_STATIC_CAST(unsigned int, 32 - imm8)));
|
||||
}
|
||||
#elif defined(SIMDE_VECTOR_SUBSCRIPT_SCALAR)
|
||||
switch (imm8 & 31) {
|
||||
case 0:
|
||||
r_ = a_;
|
||||
break;
|
||||
default:
|
||||
r_.u32 = (a_.u32 >> (imm8 & 31)) | (a_.u32 << (32 - (imm8 & 31)));
|
||||
break;
|
||||
}
|
||||
#else
|
||||
switch (imm8 & 31) {
|
||||
case 0:
|
||||
r_ = a_;
|
||||
break;
|
||||
default:
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.u32) / sizeof(r_.u32[0])) ; i++) {
|
||||
r_.u32[i] = (a_.u32[i] >> (imm8 & 31)) | (a_.u32[i] << (32 - (imm8 & 31)));
|
||||
}
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
}
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_ror_epi32
|
||||
#define _mm512_ror_epi32(a, imm8) simde_mm512_ror_epi32(a, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define simde_mm512_mask_ror_epi32(src, k, a, imm8) _mm512_mask_ror_epi32(src, k, a, imm8)
|
||||
#else
|
||||
#define simde_mm512_mask_ror_epi32(src, k, a, imm8) simde_mm512_mask_mov_epi32(src, k, simde_mm512_ror_epi32(a, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_ror_epi32
|
||||
#define _mm512_mask_ror_epi32(src, k, a, imm8) simde_mm512_mask_ror_epi32(src, k, a, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define simde_mm512_maskz_ror_epi32(k, a, imm8) _mm512_maskz_ror_epi32(k, a, imm8)
|
||||
#else
|
||||
#define simde_mm512_maskz_ror_epi32(k, a, imm8) simde_mm512_maskz_mov_epi32(k, simde_mm512_ror_epi32(a, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_ror_epi32
|
||||
#define _mm512_maskz_ror_epi32(k, a, imm8) simde_mm512_maskz_ror_epi32(k, a, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
#define simde_mm_ror_epi64(a, imm8) _mm_ror_epi64(a, imm8)
|
||||
#else
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_ror_epi64 (simde__m128i a, int imm8)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE (imm8, 0, 255) {
|
||||
simde__m128i_private
|
||||
r_,
|
||||
a_ = simde__m128i_to_private(a);
|
||||
|
||||
#if defined(SIMDE_POWER_ALTIVEC_P8_NATIVE)
|
||||
r_.altivec_i64 = vec_rl(a_.altivec_i64, vec_splats(HEDLEY_STATIC_CAST(unsigned long long, 64 - imm8)));
|
||||
#elif defined(SIMDE_VECTOR_SUBSCRIPT_SCALAR)
|
||||
switch (imm8 & 63) {
|
||||
case 0:
|
||||
r_ = a_;
|
||||
break;
|
||||
default:
|
||||
r_.u64 = (a_.u64 >> (imm8 & 63)) | (a_.u64 << (64 - (imm8 & 63)));
|
||||
break;
|
||||
}
|
||||
#else
|
||||
switch (imm8 & 63) {
|
||||
case 0:
|
||||
r_ = a_;
|
||||
break;
|
||||
default:
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.u64) / sizeof(r_.u64[0])) ; i++) {
|
||||
r_.u64[i] = (a_.u64[i] >> (imm8 & 63)) | (a_.u64[i] << (64 - (imm8 & 63)));
|
||||
}
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m128i_from_private(r_);
|
||||
}
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_ror_epi64
|
||||
#define _mm_ror_epi64(a, imm8) simde_mm_ror_epi64(a, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
#define simde_mm_mask_ror_epi64(src, k, a, imm8) _mm_mask_ror_epi64(src, k, a, imm8)
|
||||
#else
|
||||
#define simde_mm_mask_ror_epi64(src, k, a, imm8) simde_mm_mask_mov_epi64(src, k, simde_mm_ror_epi64(a, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_ror_epi64
|
||||
#define _mm_mask_ror_epi64(src, k, a, imm8) simde_mm_mask_ror_epi64(src, k, a, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
#define simde_mm_maskz_ror_epi64(k, a, imm8) _mm_maskz_ror_epi64(k, a, imm8)
|
||||
#else
|
||||
#define simde_mm_maskz_ror_epi64(k, a, imm8) simde_mm_maskz_mov_epi64(k, simde_mm_ror_epi64(a, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_maskz_ror_epi64
|
||||
#define _mm_maskz_ror_epi64(k, a, imm8) simde_mm_maskz_ror_epi64(k, a, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
#define simde_mm256_ror_epi64(a, imm8) _mm256_ror_epi64(a, imm8)
|
||||
#else
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_ror_epi64 (simde__m256i a, int imm8)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE (imm8, 0, 255) {
|
||||
simde__m256i_private
|
||||
r_,
|
||||
a_ = simde__m256i_to_private(a);
|
||||
|
||||
#if defined(SIMDE_POWER_ALTIVEC_P8_NATIVE)
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m128i_private) / sizeof(r_.m128i_private[0])) ; i++) {
|
||||
r_.m128i_private[i].altivec_i64 = vec_rl(a_.m128i_private[i].altivec_i64, vec_splats(HEDLEY_STATIC_CAST(unsigned long long, 64 - imm8)));
|
||||
}
|
||||
#elif defined(SIMDE_VECTOR_SUBSCRIPT_SCALAR)
|
||||
switch (imm8 & 63) {
|
||||
case 0:
|
||||
r_ = a_;
|
||||
break;
|
||||
default:
|
||||
r_.u64 = (a_.u64 >> (imm8 & 63)) | (a_.u64 << (64 - (imm8 & 63)));
|
||||
break;
|
||||
}
|
||||
#else
|
||||
switch (imm8 & 63) {
|
||||
case 0:
|
||||
r_ = a_;
|
||||
break;
|
||||
default:
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.u64) / sizeof(r_.u64[0])) ; i++) {
|
||||
r_.u64[i] = (a_.u64[i] >> (imm8 & 63)) | (a_.u64[i] << (64 - (imm8 & 63)));
|
||||
}
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m256i_from_private(r_);
|
||||
}
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_ror_epi64
|
||||
#define _mm256_ror_epi64(a, imm8) simde_mm256_ror_epi64(a, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
#define simde_mm256_mask_ror_epi64(src, k, a, imm8) _mm256_mask_ror_epi64(src, k, a, imm8)
|
||||
#else
|
||||
#define simde_mm256_mask_ror_epi64(src, k, a, imm8) simde_mm256_mask_mov_epi64(src, k, simde_mm256_ror_epi64(a, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_mask_ror_epi64
|
||||
#define _mm256_mask_ror_epi64(src, k, a, imm8) simde_mm256_mask_ror_epi64(src, k, a, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
#define simde_mm256_maskz_ror_epi64(k, a, imm8) _mm256_maskz_ror_epi64(k, a, imm8)
|
||||
#else
|
||||
#define simde_mm256_maskz_ror_epi64(k, a, imm8) simde_mm256_maskz_mov_epi64(k, simde_mm256_ror_epi64(a, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_maskz_ror_epi64
|
||||
#define _mm256_maskz_ror_epi64(k, a, imm8) simde_mm256_maskz_ror_epi64(k, a, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define simde_mm512_ror_epi64(a, imm8) _mm512_ror_epi64(a, imm8)
|
||||
#else
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_ror_epi64 (simde__m512i a, int imm8)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE (imm8, 0, 255) {
|
||||
simde__m512i_private
|
||||
r_,
|
||||
a_ = simde__m512i_to_private(a);
|
||||
|
||||
#if defined(SIMDE_POWER_ALTIVEC_P8_NATIVE)
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m128i_private) / sizeof(r_.m128i_private[0])) ; i++) {
|
||||
r_.m128i_private[i].altivec_i64 = vec_rl(a_.m128i_private[i].altivec_i64, vec_splats(HEDLEY_STATIC_CAST(unsigned long long, 64 - imm8)));
|
||||
}
|
||||
#elif defined(SIMDE_VECTOR_SUBSCRIPT_SCALAR)
|
||||
switch (imm8 & 63) {
|
||||
case 0:
|
||||
r_ = a_;
|
||||
break;
|
||||
default:
|
||||
r_.u64 = (a_.u64 >> (imm8 & 63)) | (a_.u64 << (64 - (imm8 & 63)));
|
||||
break;
|
||||
}
|
||||
#else
|
||||
switch (imm8 & 63) {
|
||||
case 0:
|
||||
r_ = a_;
|
||||
break;
|
||||
default:
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.u64) / sizeof(r_.u64[0])) ; i++) {
|
||||
r_.u64[i] = (a_.u64[i] >> (imm8 & 63)) | (a_.u64[i] << (64 - (imm8 & 63)));
|
||||
}
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
}
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_ror_epi64
|
||||
#define _mm512_ror_epi64(a, imm8) simde_mm512_ror_epi64(a, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define simde_mm512_mask_ror_epi64(src, k, a, imm8) _mm512_mask_ror_epi64(src, k, a, imm8)
|
||||
#else
|
||||
#define simde_mm512_mask_ror_epi64(src, k, a, imm8) simde_mm512_mask_mov_epi64(src, k, simde_mm512_ror_epi64(a, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_ror_epi64
|
||||
#define _mm512_mask_ror_epi64(src, k, a, imm8) simde_mm512_mask_ror_epi64(src, k, a, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define simde_mm512_maskz_ror_epi64(k, a, imm8) _mm512_maskz_ror_epi64(k, a, imm8)
|
||||
#else
|
||||
#define simde_mm512_maskz_ror_epi64(k, a, imm8) simde_mm512_maskz_mov_epi64(k, simde_mm512_ror_epi64(a, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_ror_epi64
|
||||
#define _mm512_maskz_ror_epi64(k, a, imm8) simde_mm512_maskz_ror_epi64(k, a, imm8)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_ROR_H) */
|
||||
@@ -0,0 +1,391 @@
|
||||
#if !defined(SIMDE_X86_AVX512_RORV_H)
|
||||
#define SIMDE_X86_AVX512_RORV_H
|
||||
|
||||
#include "types.h"
|
||||
#include "../avx2.h"
|
||||
#include "mov.h"
|
||||
#include "srlv.h"
|
||||
#include "sllv.h"
|
||||
#include "or.h"
|
||||
#include "and.h"
|
||||
#include "sub.h"
|
||||
#include "set1.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_rorv_epi32 (simde__m128i a, simde__m128i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_rorv_epi32(a, b);
|
||||
#elif defined(SIMDE_POWER_ALTIVEC_P6_NATIVE)
|
||||
simde__m128i_private
|
||||
r_,
|
||||
a_ = simde__m128i_to_private(a),
|
||||
b_ = simde__m128i_to_private(b);
|
||||
|
||||
r_.altivec_i32 = vec_rl(a_.altivec_i32, vec_sub(vec_splats(HEDLEY_STATIC_CAST(unsigned int, 32)), b_.altivec_u32));
|
||||
return simde__m128i_from_private(r_);
|
||||
#else
|
||||
simde__m128i
|
||||
count1 = simde_mm_and_si128(b, simde_mm_set1_epi32(31)),
|
||||
count2 = simde_mm_sub_epi32(simde_mm_set1_epi32(32), count1);
|
||||
return simde_mm_or_si128(simde_mm_srlv_epi32(a, count1), simde_mm_sllv_epi32(a, count2));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_rorv_epi32
|
||||
#define _mm_rorv_epi32(a, b) simde_mm_rorv_epi32(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_mask_rorv_epi32 (simde__m128i src, simde__mmask8 k, simde__m128i a, simde__m128i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_mask_rorv_epi32(src, k, a, b);
|
||||
#else
|
||||
return simde_mm_mask_mov_epi32(src, k, simde_mm_rorv_epi32(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_rorv_epi32
|
||||
#define _mm_mask_rorv_epi32(src, k, a, b) simde_mm_mask_rorv_epi32(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_maskz_rorv_epi32 (simde__mmask8 k, simde__m128i a, simde__m128i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_maskz_rorv_epi32(k, a, b);
|
||||
#else
|
||||
return simde_mm_maskz_mov_epi32(k, simde_mm_rorv_epi32(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_maskz_rorv_epi32
|
||||
#define _mm_maskz_rorv_epi32(k, a, b) simde_mm_maskz_rorv_epi32(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_rorv_epi32 (simde__m256i a, simde__m256i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_rorv_epi32(a, b);
|
||||
#elif defined(SIMDE_POWER_ALTIVEC_P6_NATIVE)
|
||||
simde__m256i_private
|
||||
r_,
|
||||
a_ = simde__m256i_to_private(a),
|
||||
b_ = simde__m256i_to_private(b);
|
||||
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m128i_private) / sizeof(r_.m128i_private[0])) ; i++) {
|
||||
r_.m128i_private[i].altivec_i32 = vec_rl(a_.m128i_private[i].altivec_i32, vec_sub(vec_splats(HEDLEY_STATIC_CAST(unsigned int, 32)), b_.m128i_private[i].altivec_u32));
|
||||
}
|
||||
|
||||
return simde__m256i_from_private(r_);
|
||||
#elif SIMDE_NATURAL_VECTOR_SIZE_LE(128)
|
||||
simde__m256i_private
|
||||
r_,
|
||||
a_ = simde__m256i_to_private(a),
|
||||
b_ = simde__m256i_to_private(b);
|
||||
|
||||
r_.m128i[0] = simde_mm_rorv_epi32(a_.m128i[0], b_.m128i[0]);
|
||||
r_.m128i[1] = simde_mm_rorv_epi32(a_.m128i[1], b_.m128i[1]);
|
||||
|
||||
return simde__m256i_from_private(r_);
|
||||
#else
|
||||
simde__m256i
|
||||
count1 = simde_mm256_and_si256(b, simde_mm256_set1_epi32(31)),
|
||||
count2 = simde_mm256_sub_epi32(simde_mm256_set1_epi32(32), count1);
|
||||
return simde_mm256_or_si256(simde_mm256_srlv_epi32(a, count1), simde_mm256_sllv_epi32(a, count2));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_rorv_epi32
|
||||
#define _mm256_rorv_epi32(a, b) simde_mm256_rorv_epi32(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_mask_rorv_epi32 (simde__m256i src, simde__mmask8 k, simde__m256i a, simde__m256i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_mask_rorv_epi32(src, k, a, b);
|
||||
#else
|
||||
return simde_mm256_mask_mov_epi32(src, k, simde_mm256_rorv_epi32(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_mask_rorv_epi32
|
||||
#define _mm256_mask_rorv_epi32(src, k, a, b) simde_mm256_mask_rorv_epi32(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_maskz_rorv_epi32 (simde__mmask8 k, simde__m256i a, simde__m256i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_maskz_rorv_epi32(k, a, b);
|
||||
#else
|
||||
return simde_mm256_maskz_mov_epi32(k, simde_mm256_rorv_epi32(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_maskz_rorv_epi32
|
||||
#define _mm256_maskz_rorv_epi32(k, a, b) simde_mm256_maskz_rorv_epi32(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_rorv_epi32 (simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_rorv_epi32(a, b);
|
||||
#elif defined(SIMDE_POWER_ALTIVEC_P6_NATIVE)
|
||||
simde__m512i_private
|
||||
r_,
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b);
|
||||
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m128i_private) / sizeof(r_.m128i_private[0])) ; i++) {
|
||||
r_.m128i_private[i].altivec_i32 = vec_rl(a_.m128i_private[i].altivec_i32, vec_sub(vec_splats(HEDLEY_STATIC_CAST(unsigned int, 32)), b_.m128i_private[i].altivec_u32));
|
||||
}
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#elif SIMDE_NATURAL_VECTOR_SIZE_LE(256)
|
||||
simde__m512i_private
|
||||
r_,
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b);
|
||||
|
||||
r_.m256i[0] = simde_mm256_rorv_epi32(a_.m256i[0], b_.m256i[0]);
|
||||
r_.m256i[1] = simde_mm256_rorv_epi32(a_.m256i[1], b_.m256i[1]);
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#else
|
||||
simde__m512i
|
||||
count1 = simde_mm512_and_si512(b, simde_mm512_set1_epi32(31)),
|
||||
count2 = simde_mm512_sub_epi32(simde_mm512_set1_epi32(32), count1);
|
||||
return simde_mm512_or_si512(simde_mm512_srlv_epi32(a, count1), simde_mm512_sllv_epi32(a, count2));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_rorv_epi32
|
||||
#define _mm512_rorv_epi32(a, b) simde_mm512_rorv_epi32(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_rorv_epi32 (simde__m512i src, simde__mmask16 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_rorv_epi32(src, k, a, b);
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi32(src, k, simde_mm512_rorv_epi32(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_rorv_epi32
|
||||
#define _mm512_mask_rorv_epi32(src, k, a, b) simde_mm512_mask_rorv_epi32(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_rorv_epi32 (simde__mmask16 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_maskz_rorv_epi32(k, a, b);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_epi32(k, simde_mm512_rorv_epi32(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_rorv_epi32
|
||||
#define _mm512_maskz_rorv_epi32(k, a, b) simde_mm512_maskz_rorv_epi32(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_rorv_epi64 (simde__m128i a, simde__m128i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_rorv_epi64(a, b);
|
||||
#elif defined(SIMDE_POWER_ALTIVEC_P8_NATIVE)
|
||||
simde__m128i_private
|
||||
r_,
|
||||
a_ = simde__m128i_to_private(a),
|
||||
b_ = simde__m128i_to_private(b);
|
||||
|
||||
r_.altivec_i64 = vec_rl(a_.altivec_i64, vec_sub(vec_splats(HEDLEY_STATIC_CAST(unsigned long long, 64)), b_.altivec_u64));
|
||||
return simde__m128i_from_private(r_);
|
||||
#else
|
||||
simde__m128i
|
||||
count1 = simde_mm_and_si128(b, simde_mm_set1_epi64x(63)),
|
||||
count2 = simde_mm_sub_epi64(simde_mm_set1_epi64x(64), count1);
|
||||
return simde_mm_or_si128(simde_mm_srlv_epi64(a, count1), simde_mm_sllv_epi64(a, count2));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_rorv_epi64
|
||||
#define _mm_rorv_epi64(a, b) simde_mm_rorv_epi64(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_mask_rorv_epi64 (simde__m128i src, simde__mmask8 k, simde__m128i a, simde__m128i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_mask_rorv_epi64(src, k, a, b);
|
||||
#else
|
||||
return simde_mm_mask_mov_epi64(src, k, simde_mm_rorv_epi64(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_rorv_epi64
|
||||
#define _mm_mask_rorv_epi64(src, k, a, b) simde_mm_mask_rorv_epi64(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_maskz_rorv_epi64 (simde__mmask8 k, simde__m128i a, simde__m128i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_maskz_rorv_epi64(k, a, b);
|
||||
#else
|
||||
return simde_mm_maskz_mov_epi64(k, simde_mm_rorv_epi64(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_maskz_rorv_epi64
|
||||
#define _mm_maskz_rorv_epi64(k, a, b) simde_mm_maskz_rorv_epi64(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_rorv_epi64 (simde__m256i a, simde__m256i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_rorv_epi64(a, b);
|
||||
#elif defined(SIMDE_POWER_ALTIVEC_P8_NATIVE)
|
||||
simde__m256i_private
|
||||
r_,
|
||||
a_ = simde__m256i_to_private(a),
|
||||
b_ = simde__m256i_to_private(b);
|
||||
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m128i_private) / sizeof(r_.m128i_private[0])) ; i++) {
|
||||
r_.m128i_private[i].altivec_i64 = vec_rl(a_.m128i_private[i].altivec_i64, vec_sub(vec_splats(HEDLEY_STATIC_CAST(unsigned long long, 64)), b_.m128i_private[i].altivec_u64));
|
||||
}
|
||||
|
||||
return simde__m256i_from_private(r_);
|
||||
#elif SIMDE_NATURAL_VECTOR_SIZE_LE(128)
|
||||
simde__m256i_private
|
||||
r_,
|
||||
a_ = simde__m256i_to_private(a),
|
||||
b_ = simde__m256i_to_private(b);
|
||||
|
||||
r_.m128i[0] = simde_mm_rorv_epi64(a_.m128i[0], b_.m128i[0]);
|
||||
r_.m128i[1] = simde_mm_rorv_epi64(a_.m128i[1], b_.m128i[1]);
|
||||
|
||||
return simde__m256i_from_private(r_);
|
||||
#else
|
||||
simde__m256i
|
||||
count1 = simde_mm256_and_si256(b, simde_mm256_set1_epi64x(63)),
|
||||
count2 = simde_mm256_sub_epi64(simde_mm256_set1_epi64x(64), count1);
|
||||
return simde_mm256_or_si256(simde_mm256_srlv_epi64(a, count1), simde_mm256_sllv_epi64(a, count2));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_rorv_epi64
|
||||
#define _mm256_rorv_epi64(a, b) simde_mm256_rorv_epi64(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_mask_rorv_epi64 (simde__m256i src, simde__mmask8 k, simde__m256i a, simde__m256i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_mask_rorv_epi64(src, k, a, b);
|
||||
#else
|
||||
return simde_mm256_mask_mov_epi64(src, k, simde_mm256_rorv_epi64(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_mask_rorv_epi64
|
||||
#define _mm256_mask_rorv_epi64(src, k, a, b) simde_mm256_mask_rorv_epi64(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_maskz_rorv_epi64 (simde__mmask8 k, simde__m256i a, simde__m256i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_maskz_rorv_epi64(k, a, b);
|
||||
#else
|
||||
return simde_mm256_maskz_mov_epi64(k, simde_mm256_rorv_epi64(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_maskz_rorv_epi64
|
||||
#define _mm256_maskz_rorv_epi64(k, a, b) simde_mm256_maskz_rorv_epi64(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_rorv_epi64 (simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_rorv_epi64(a, b);
|
||||
#elif defined(SIMDE_POWER_ALTIVEC_P8_NATIVE)
|
||||
simde__m512i_private
|
||||
r_,
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b);
|
||||
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m128i_private) / sizeof(r_.m128i_private[0])) ; i++) {
|
||||
r_.m128i_private[i].altivec_i64 = vec_rl(a_.m128i_private[i].altivec_i64, vec_sub(vec_splats(HEDLEY_STATIC_CAST(unsigned long long, 64)), b_.m128i_private[i].altivec_u64));
|
||||
}
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#elif SIMDE_NATURAL_VECTOR_SIZE_LE(256)
|
||||
simde__m512i_private
|
||||
r_,
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b);
|
||||
|
||||
r_.m256i[0] = simde_mm256_rorv_epi64(a_.m256i[0], b_.m256i[0]);
|
||||
r_.m256i[1] = simde_mm256_rorv_epi64(a_.m256i[1], b_.m256i[1]);
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#else
|
||||
simde__m512i
|
||||
count1 = simde_mm512_and_si512(b, simde_mm512_set1_epi64(63)),
|
||||
count2 = simde_mm512_sub_epi64(simde_mm512_set1_epi64(64), count1);
|
||||
return simde_mm512_or_si512(simde_mm512_srlv_epi64(a, count1), simde_mm512_sllv_epi64(a, count2));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_rorv_epi64
|
||||
#define _mm512_rorv_epi64(a, b) simde_mm512_rorv_epi64(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_rorv_epi64 (simde__m512i src, simde__mmask8 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_rorv_epi64(src, k, a, b);
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi64(src, k, simde_mm512_rorv_epi64(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_rorv_epi64
|
||||
#define _mm512_mask_rorv_epi64(src, k, a, b) simde_mm512_mask_rorv_epi64(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_rorv_epi64 (simde__mmask8 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_maskz_rorv_epi64(k, a, b);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_epi64(k, simde_mm512_rorv_epi64(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_rorv_epi64
|
||||
#define _mm512_maskz_rorv_epi64(k, a, b) simde_mm512_maskz_rorv_epi64(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_RORV_H) */
|
||||
@@ -0,0 +1,282 @@
|
||||
#if !defined(SIMDE_X86_AVX512_ROUND_H)
|
||||
#define SIMDE_X86_AVX512_ROUND_H
|
||||
|
||||
#include "types.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
#if SIMDE_NATURAL_VECTOR_SIZE_LE(256) && defined(SIMDE_STATEMENT_EXPR_)
|
||||
#define simde_x_mm512_round_ps(a, rounding) SIMDE_STATEMENT_EXPR_(({ \
|
||||
simde__m512_private \
|
||||
simde_x_mm512_round_ps_r_ = simde__m512_to_private(simde_mm512_setzero_ps()), \
|
||||
simde_x_mm512_round_ps_a_ = simde__m512_to_private(a); \
|
||||
\
|
||||
for (size_t simde_x_mm512_round_ps_i = 0 ; simde_x_mm512_round_ps_i < (sizeof(simde_x_mm512_round_ps_r_.m256) / sizeof(simde_x_mm512_round_ps_r_.m256[0])) ; simde_x_mm512_round_ps_i++) { \
|
||||
simde_x_mm512_round_ps_r_.m256[simde_x_mm512_round_ps_i] = simde_mm256_round_ps(simde_x_mm512_round_ps_a_.m256[simde_x_mm512_round_ps_i], rounding); \
|
||||
} \
|
||||
\
|
||||
simde__m512_from_private(simde_x_mm512_round_ps_r_); \
|
||||
}))
|
||||
#else
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_x_mm512_round_ps (simde__m512 a, int rounding)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(rounding, 0, 15) {
|
||||
simde__m512_private
|
||||
r_,
|
||||
a_ = simde__m512_to_private(a);
|
||||
|
||||
/* For architectures which lack a current direction SIMD instruction.
|
||||
*
|
||||
* Note that NEON actually has a current rounding mode instruction,
|
||||
* but in ARMv8+ the rounding mode is ignored and nearest is always
|
||||
* used, so we treat ARMv7 as having a rounding mode but ARMv8 as
|
||||
* not. */
|
||||
#if \
|
||||
defined(SIMDE_POWER_ALTIVEC_P6_NATIVE) || \
|
||||
defined(SIMDE_ARM_NEON_A32V8)
|
||||
if ((rounding & 7) == SIMDE_MM_FROUND_CUR_DIRECTION)
|
||||
rounding = HEDLEY_STATIC_CAST(int, SIMDE_MM_GET_ROUNDING_MODE()) << 13;
|
||||
#endif
|
||||
|
||||
switch (rounding & ~SIMDE_MM_FROUND_NO_EXC) {
|
||||
case SIMDE_MM_FROUND_CUR_DIRECTION:
|
||||
#if defined(SIMDE_POWER_ALTIVEC_P6_NATIVE) || defined(SIMDE_ZARCH_ZVECTOR_14_NATIVE)
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m128_private) / sizeof(r_.m128_private[0])) ; i++) {
|
||||
r_.m128_private[i].altivec_f32 = HEDLEY_REINTERPRET_CAST(SIMDE_POWER_ALTIVEC_VECTOR(float), vec_round(a_.m128_private[i].altivec_f32));
|
||||
}
|
||||
#elif defined(SIMDE_ARM_NEON_A32V8_NATIVE) && !defined(SIMDE_BUG_GCC_95399)
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m128_private) / sizeof(r_.m128_private[0])) ; i++) {
|
||||
r_.m128_private[i].neon_f32 = vrndiq_f32(a_.m128_private[i].neon_f32);
|
||||
}
|
||||
#elif defined(simde_math_nearbyintf)
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.f32) / sizeof(r_.f32[0])) ; i++) {
|
||||
r_.f32[i] = simde_math_nearbyintf(a_.f32[i]);
|
||||
}
|
||||
#else
|
||||
HEDLEY_UNREACHABLE_RETURN(simde_mm512_setzero_ps());
|
||||
#endif
|
||||
break;
|
||||
|
||||
case SIMDE_MM_FROUND_TO_NEAREST_INT:
|
||||
#if defined(SIMDE_POWER_ALTIVEC_P7_NATIVE) || defined(SIMDE_ZARCH_ZVECTOR_14_NATIVE)
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m128_private) / sizeof(r_.m128_private[0])) ; i++) {
|
||||
r_.m128_private[i].altivec_f32 = HEDLEY_REINTERPRET_CAST(SIMDE_POWER_ALTIVEC_VECTOR(float), vec_rint(a_.m128_private[i].altivec_f32));
|
||||
}
|
||||
#elif defined(SIMDE_ARM_NEON_A32V8_NATIVE)
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m128_private) / sizeof(r_.m128_private[0])) ; i++) {
|
||||
r_.m128_private[i].neon_f32 = vrndnq_f32(a_.m128_private[i].neon_f32);
|
||||
}
|
||||
#elif defined(simde_math_roundevenf)
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.f32) / sizeof(r_.f32[0])) ; i++) {
|
||||
r_.f32[i] = simde_math_roundevenf(a_.f32[i]);
|
||||
}
|
||||
#else
|
||||
HEDLEY_UNREACHABLE_RETURN(simde_mm512_setzero_ps());
|
||||
#endif
|
||||
break;
|
||||
|
||||
case SIMDE_MM_FROUND_TO_NEG_INF:
|
||||
#if defined(SIMDE_POWER_ALTIVEC_P6_NATIVE) || defined(SIMDE_ZARCH_ZVECTOR_14_NATIVE)
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m128_private) / sizeof(r_.m128_private[0])) ; i++) {
|
||||
r_.m128_private[i].altivec_f32 = HEDLEY_REINTERPRET_CAST(SIMDE_POWER_ALTIVEC_VECTOR(float), vec_floor(a_.m128_private[i].altivec_f32));
|
||||
}
|
||||
#elif defined(SIMDE_ARM_NEON_A32V8_NATIVE)
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m128_private) / sizeof(r_.m128_private[0])) ; i++) {
|
||||
r_.m128_private[i].neon_f32 = vrndmq_f32(a_.m128_private[i].neon_f32);
|
||||
}
|
||||
#elif defined(simde_math_floorf)
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.f32) / sizeof(r_.f32[0])) ; i++) {
|
||||
r_.f32[i] = simde_math_floorf(a_.f32[i]);
|
||||
}
|
||||
#else
|
||||
HEDLEY_UNREACHABLE_RETURN(simde_mm512_setzero_ps());
|
||||
#endif
|
||||
break;
|
||||
|
||||
case SIMDE_MM_FROUND_TO_POS_INF:
|
||||
#if defined(SIMDE_POWER_ALTIVEC_P6_NATIVE) || defined(SIMDE_ZARCH_ZVECTOR_14_NATIVE)
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m128_private) / sizeof(r_.m128_private[0])) ; i++) {
|
||||
r_.m128_private[i].altivec_f32 = HEDLEY_REINTERPRET_CAST(SIMDE_POWER_ALTIVEC_VECTOR(float), vec_ceil(a_.m128_private[i].altivec_f32));
|
||||
}
|
||||
#elif defined(SIMDE_ARM_NEON_A32V8_NATIVE)
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m128_private) / sizeof(r_.m128_private[0])) ; i++) {
|
||||
r_.m128_private[i].neon_f32 = vrndpq_f32(a_.m128_private[i].neon_f32);
|
||||
}
|
||||
#elif defined(simde_math_ceilf)
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.f32) / sizeof(r_.f32[0])) ; i++) {
|
||||
r_.f32[i] = simde_math_ceilf(a_.f32[i]);
|
||||
}
|
||||
#else
|
||||
HEDLEY_UNREACHABLE_RETURN(simde_mm512_setzero_ps());
|
||||
#endif
|
||||
break;
|
||||
|
||||
case SIMDE_MM_FROUND_TO_ZERO:
|
||||
#if defined(SIMDE_POWER_ALTIVEC_P6_NATIVE) || defined(SIMDE_ZARCH_ZVECTOR_14_NATIVE)
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m128_private) / sizeof(r_.m128_private[0])) ; i++) {
|
||||
r_.m128_private[i].altivec_f32 = HEDLEY_REINTERPRET_CAST(SIMDE_POWER_ALTIVEC_VECTOR(float), vec_trunc(a_.m128_private[i].altivec_f32));
|
||||
}
|
||||
#elif defined(SIMDE_ARM_NEON_A32V8_NATIVE)
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m128_private) / sizeof(r_.m128_private[0])) ; i++) {
|
||||
r_.m128_private[i].neon_f32 = vrndq_f32(a_.m128_private[i].neon_f32);
|
||||
}
|
||||
#elif defined(simde_math_truncf)
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.f32) / sizeof(r_.f32[0])) ; i++) {
|
||||
r_.f32[i] = simde_math_truncf(a_.f32[i]);
|
||||
}
|
||||
#else
|
||||
HEDLEY_UNREACHABLE_RETURN(simde_mm512_setzero_ps());
|
||||
#endif
|
||||
break;
|
||||
|
||||
default:
|
||||
HEDLEY_UNREACHABLE_RETURN(simde_mm512_setzero_ps());
|
||||
}
|
||||
|
||||
return simde__m512_from_private(r_);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if SIMDE_NATURAL_VECTOR_SIZE_LE(256) && defined(SIMDE_STATEMENT_EXPR_)
|
||||
#define simde_x_mm512_round_pd(a, rounding) SIMDE_STATEMENT_EXPR_(({ \
|
||||
simde__m512d_private \
|
||||
simde_x_mm512_round_pd_r_ = simde__m512d_to_private(simde_mm512_setzero_pd()), \
|
||||
simde_x_mm512_round_pd_a_ = simde__m512d_to_private(a); \
|
||||
\
|
||||
for (size_t simde_x_mm512_round_pd_i = 0 ; simde_x_mm512_round_pd_i < (sizeof(simde_x_mm512_round_pd_r_.m256d) / sizeof(simde_x_mm512_round_pd_r_.m256d[0])) ; simde_x_mm512_round_pd_i++) { \
|
||||
simde_x_mm512_round_pd_r_.m256d[simde_x_mm512_round_pd_i] = simde_mm256_round_pd(simde_x_mm512_round_pd_a_.m256d[simde_x_mm512_round_pd_i], rounding); \
|
||||
} \
|
||||
\
|
||||
simde__m512d_from_private(simde_x_mm512_round_pd_r_); \
|
||||
}))
|
||||
#else
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_x_mm512_round_pd (simde__m512d a, int rounding)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(rounding, 0, 15) {
|
||||
simde__m512d_private
|
||||
r_,
|
||||
a_ = simde__m512d_to_private(a);
|
||||
|
||||
/* For architectures which lack a current direction SIMD instruction. */
|
||||
#if defined(SIMDE_POWER_ALTIVEC_P6_NATIVE)
|
||||
if ((rounding & 7) == SIMDE_MM_FROUND_CUR_DIRECTION)
|
||||
rounding = HEDLEY_STATIC_CAST(int, SIMDE_MM_GET_ROUNDING_MODE()) << 13;
|
||||
#endif
|
||||
|
||||
switch (rounding & ~SIMDE_MM_FROUND_NO_EXC) {
|
||||
case SIMDE_MM_FROUND_CUR_DIRECTION:
|
||||
#if defined(SIMDE_POWER_ALTIVEC_P7_NATIVE) || defined(SIMDE_ZARCH_ZVECTOR_13_NATIVE)
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m128d_private) / sizeof(r_.m128d_private[0])) ; i++) {
|
||||
r_.m128d_private[i].altivec_f64 = HEDLEY_REINTERPRET_CAST(SIMDE_POWER_ALTIVEC_VECTOR(double), vec_round(a_.m128d_private[i].altivec_f64));
|
||||
}
|
||||
#elif defined(SIMDE_ARM_NEON_A64V8_NATIVE)
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m128d_private) / sizeof(r_.m128d_private[0])) ; i++) {
|
||||
r_.m128d_private[i].neon_f64 = vrndiq_f64(a_.m128d_private[i].neon_f64);
|
||||
}
|
||||
#elif defined(simde_math_nearbyint)
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.f64) / sizeof(r_.f64[0])) ; i++) {
|
||||
r_.f64[i] = simde_math_nearbyint(a_.f64[i]);
|
||||
}
|
||||
#else
|
||||
HEDLEY_UNREACHABLE_RETURN(simde_mm512_setzero_pd());
|
||||
#endif
|
||||
break;
|
||||
|
||||
case SIMDE_MM_FROUND_TO_NEAREST_INT:
|
||||
#if defined(SIMDE_POWER_ALTIVEC_P7_NATIVE) || defined(SIMDE_ZARCH_ZVECTOR_13_NATIVE)
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m128d_private) / sizeof(r_.m128d_private[0])) ; i++) {
|
||||
r_.m128d_private[i].altivec_f64 = HEDLEY_REINTERPRET_CAST(SIMDE_POWER_ALTIVEC_VECTOR(double), vec_round(a_.m128d_private[i].altivec_f64));
|
||||
}
|
||||
#elif defined(SIMDE_ARM_NEON_A64V8_NATIVE)
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m128d_private) / sizeof(r_.m128d_private[0])) ; i++) {
|
||||
r_.m128d_private[i].neon_f64 = vrndaq_f64(a_.m128d_private[i].neon_f64);
|
||||
}
|
||||
#elif defined(simde_math_roundeven)
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.f64) / sizeof(r_.f64[0])) ; i++) {
|
||||
r_.f64[i] = simde_math_roundeven(a_.f64[i]);
|
||||
}
|
||||
#else
|
||||
HEDLEY_UNREACHABLE_RETURN(simde_mm512_setzero_pd());
|
||||
#endif
|
||||
break;
|
||||
|
||||
case SIMDE_MM_FROUND_TO_NEG_INF:
|
||||
#if defined(SIMDE_POWER_ALTIVEC_P7_NATIVE) || defined(SIMDE_ZARCH_ZVECTOR_13_NATIVE)
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m128d_private) / sizeof(r_.m128d_private[0])) ; i++) {
|
||||
r_.m128d_private[i].altivec_f64 = HEDLEY_REINTERPRET_CAST(SIMDE_POWER_ALTIVEC_VECTOR(double), vec_floor(a_.m128d_private[i].altivec_f64));
|
||||
}
|
||||
#elif defined(SIMDE_ARM_NEON_A64V8_NATIVE)
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m128d_private) / sizeof(r_.m128d_private[0])) ; i++) {
|
||||
r_.m128d_private[i].neon_f64 = vrndmq_f64(a_.m128d_private[i].neon_f64);
|
||||
}
|
||||
#elif defined(simde_math_floor)
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.f64) / sizeof(r_.f64[0])) ; i++) {
|
||||
r_.f64[i] = simde_math_floor(a_.f64[i]);
|
||||
}
|
||||
#else
|
||||
HEDLEY_UNREACHABLE_RETURN(simde_mm512_setzero_pd());
|
||||
#endif
|
||||
break;
|
||||
|
||||
case SIMDE_MM_FROUND_TO_POS_INF:
|
||||
#if defined(SIMDE_POWER_ALTIVEC_P7_NATIVE) || defined(SIMDE_ZARCH_ZVECTOR_13_NATIVE)
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m128d_private) / sizeof(r_.m128d_private[0])) ; i++) {
|
||||
r_.m128d_private[i].altivec_f64 = HEDLEY_REINTERPRET_CAST(SIMDE_POWER_ALTIVEC_VECTOR(double), vec_ceil(a_.m128d_private[i].altivec_f64));
|
||||
}
|
||||
#elif defined(SIMDE_ARM_NEON_A64V8_NATIVE)
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m128d_private) / sizeof(r_.m128d_private[0])) ; i++) {
|
||||
r_.m128d_private[i].neon_f64 = vrndpq_f64(a_.m128d_private[i].neon_f64);
|
||||
}
|
||||
#elif defined(simde_math_ceil)
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.f64) / sizeof(r_.f64[0])) ; i++) {
|
||||
r_.f64[i] = simde_math_ceil(a_.f64[i]);
|
||||
}
|
||||
#else
|
||||
HEDLEY_UNREACHABLE_RETURN(simde_mm512_setzero_pd());
|
||||
#endif
|
||||
break;
|
||||
|
||||
case SIMDE_MM_FROUND_TO_ZERO:
|
||||
#if defined(SIMDE_POWER_ALTIVEC_P7_NATIVE) || defined(SIMDE_ZARCH_ZVECTOR_13_NATIVE)
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m128d_private) / sizeof(r_.m128d_private[0])) ; i++) {
|
||||
r_.m128d_private[i].altivec_f64 = HEDLEY_REINTERPRET_CAST(SIMDE_POWER_ALTIVEC_VECTOR(double), vec_trunc(a_.m128d_private[i].altivec_f64));
|
||||
}
|
||||
#elif defined(SIMDE_ARM_NEON_A64V8_NATIVE)
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m128d_private) / sizeof(r_.m128d_private[0])) ; i++) {
|
||||
r_.m128d_private[i].neon_f64 = vrndq_f64(a_.m128d_private[i].neon_f64);
|
||||
}
|
||||
#elif defined(simde_math_trunc)
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.f64) / sizeof(r_.f64[0])) ; i++) {
|
||||
r_.f64[i] = simde_math_trunc(a_.f64[i]);
|
||||
}
|
||||
#else
|
||||
HEDLEY_UNREACHABLE_RETURN(simde_mm512_setzero_pd());
|
||||
#endif
|
||||
break;
|
||||
|
||||
default:
|
||||
HEDLEY_UNREACHABLE_RETURN(simde_mm512_setzero_pd());
|
||||
}
|
||||
|
||||
return simde__m512d_from_private(r_);
|
||||
}
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_ROUND_H) */
|
||||
@@ -0,0 +1,616 @@
|
||||
#if !defined(SIMDE_X86_AVX512_ROUNDSCALE_H)
|
||||
#define SIMDE_X86_AVX512_ROUNDSCALE_H
|
||||
|
||||
#include "types.h"
|
||||
#include "andnot.h"
|
||||
#include "set1.h"
|
||||
#include "mul.h"
|
||||
#include "round.h"
|
||||
#include "cmpeq.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define simde_mm_roundscale_ps(a, imm8) _mm_roundscale_ps((a), (imm8))
|
||||
#else
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128
|
||||
simde_mm_roundscale_ps_internal_ (simde__m128 result, simde__m128 a, int imm8)
|
||||
SIMDE_REQUIRE_RANGE(imm8, 0, 255) {
|
||||
HEDLEY_STATIC_CAST(void, imm8);
|
||||
|
||||
simde__m128 r, clear_sign;
|
||||
|
||||
clear_sign = simde_mm_andnot_ps(simde_mm_set1_ps(SIMDE_FLOAT32_C(-0.0)), result);
|
||||
r = simde_x_mm_select_ps(result, a, simde_mm_cmpeq_ps(clear_sign, simde_mm_set1_ps(SIMDE_MATH_INFINITYF)));
|
||||
|
||||
return r;
|
||||
}
|
||||
#define simde_mm_roundscale_ps(a, imm8) \
|
||||
simde_mm_roundscale_ps_internal_( \
|
||||
simde_mm_mul_ps( \
|
||||
simde_mm_round_ps( \
|
||||
simde_mm_mul_ps( \
|
||||
a, \
|
||||
simde_mm_set1_ps(simde_math_exp2f(((imm8 >> 4) & 15)))), \
|
||||
((imm8) & 15) \
|
||||
), \
|
||||
simde_mm_set1_ps(simde_math_exp2f(-((imm8 >> 4) & 15))) \
|
||||
), \
|
||||
(a), \
|
||||
(imm8) \
|
||||
)
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_roundscale_ps
|
||||
#define _mm_roundscale_ps(a, imm8) simde_mm_roundscale_ps(a, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
#define simde_mm_mask_roundscale_ps(src, k, a, imm8) _mm_mask_roundscale_ps(src, k, a, imm8)
|
||||
#else
|
||||
#define simde_mm_mask_roundscale_ps(src, k, a, imm8) simde_mm_mask_mov_ps(src, k, simde_mm_roundscale_ps(a, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_roundscale_ps
|
||||
#define _mm_mask_roundscale_ps(src, k, a, imm8) simde_mm_mask_roundscale_ps(src, k, a, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
#define simde_mm_maskz_roundscale_ps(k, a, imm8) _mm_maskz_roundscale_ps(k, a, imm8)
|
||||
#else
|
||||
#define simde_mm_maskz_roundscale_ps(k, a, imm8) simde_mm_maskz_mov_ps(k, simde_mm_roundscale_ps(a, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_maskz_roundscale_ps
|
||||
#define _mm_maskz_roundscale_ps(k, a, imm8) simde_mm_maskz_roundscale_ps(k, a, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define simde_mm256_roundscale_ps(a, imm8) _mm256_roundscale_ps((a), (imm8))
|
||||
#elif SIMDE_NATURAL_VECTOR_SIZE_LE(128) && defined(SIMDE_STATEMENT_EXPR_)
|
||||
#define simde_mm256_roundscale_ps(a, imm8) SIMDE_STATEMENT_EXPR_(({ \
|
||||
simde__m256_private \
|
||||
simde_mm256_roundscale_ps_r_ = simde__m256_to_private(simde_mm256_setzero_ps()), \
|
||||
simde_mm256_roundscale_ps_a_ = simde__m256_to_private(a); \
|
||||
\
|
||||
for (size_t simde_mm256_roundscale_ps_i = 0 ; simde_mm256_roundscale_ps_i < (sizeof(simde_mm256_roundscale_ps_r_.m128) / sizeof(simde_mm256_roundscale_ps_r_.m128[0])) ; simde_mm256_roundscale_ps_i++) { \
|
||||
simde_mm256_roundscale_ps_r_.m128[simde_mm256_roundscale_ps_i] = simde_mm_roundscale_ps(simde_mm256_roundscale_ps_a_.m128[simde_mm256_roundscale_ps_i], imm8); \
|
||||
} \
|
||||
\
|
||||
simde__m256_from_private(simde_mm256_roundscale_ps_r_); \
|
||||
}))
|
||||
#else
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256
|
||||
simde_mm256_roundscale_ps_internal_ (simde__m256 result, simde__m256 a, const int imm8)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 255) {
|
||||
HEDLEY_STATIC_CAST(void, imm8);
|
||||
|
||||
simde__m256 r, clear_sign;
|
||||
|
||||
clear_sign = simde_mm256_andnot_ps(simde_mm256_set1_ps(SIMDE_FLOAT32_C(-0.0)), result);
|
||||
r = simde_x_mm256_select_ps(result, a, simde_mm256_castsi256_ps(simde_mm256_cmpeq_epi32(simde_mm256_castps_si256(clear_sign), simde_mm256_castps_si256(simde_mm256_set1_ps(SIMDE_MATH_INFINITYF)))));
|
||||
|
||||
return r;
|
||||
}
|
||||
#define simde_mm256_roundscale_ps(a, imm8) \
|
||||
simde_mm256_roundscale_ps_internal_( \
|
||||
simde_mm256_mul_ps( \
|
||||
simde_mm256_round_ps( \
|
||||
simde_mm256_mul_ps( \
|
||||
a, \
|
||||
simde_mm256_set1_ps(simde_math_exp2f(((imm8 >> 4) & 15)))), \
|
||||
((imm8) & 15) \
|
||||
), \
|
||||
simde_mm256_set1_ps(simde_math_exp2f(-((imm8 >> 4) & 15))) \
|
||||
), \
|
||||
(a), \
|
||||
(imm8) \
|
||||
)
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_roundscale_ps
|
||||
#define _mm256_roundscale_ps(a, imm8) simde_mm256_roundscale_ps(a, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
#define simde_mm256_mask_roundscale_ps(src, k, a, imm8) _mm256_mask_roundscale_ps(src, k, a, imm8)
|
||||
#else
|
||||
#define simde_mm256_mask_roundscale_ps(src, k, a, imm8) simde_mm256_mask_mov_ps(src, k, simde_mm256_roundscale_ps(a, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_mask_roundscale_ps
|
||||
#define _mm256_mask_roundscale_ps(src, k, a, imm8) simde_mm256_mask_roundscale_ps(src, k, a, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
#define simde_mm256_maskz_roundscale_ps(k, a, imm8) _mm256_maskz_roundscale_ps(k, a, imm8)
|
||||
#else
|
||||
#define simde_mm256_maskz_roundscale_ps(k, a, imm8) simde_mm256_maskz_mov_ps(k, simde_mm256_roundscale_ps(a, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_maskz_roundscale_ps
|
||||
#define _mm256_maskz_roundscale_ps(k, a, imm8) simde_mm256_maskz_roundscale_ps(k, a, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define simde_mm512_roundscale_ps(a, imm8) _mm512_roundscale_ps((a), (imm8))
|
||||
#elif SIMDE_NATURAL_VECTOR_SIZE_LE(256) && defined(SIMDE_STATEMENT_EXPR_)
|
||||
#define simde_mm512_roundscale_ps(a, imm8) SIMDE_STATEMENT_EXPR_(({ \
|
||||
simde__m512_private \
|
||||
simde_mm512_roundscale_ps_r_ = simde__m512_to_private(simde_mm512_setzero_ps()), \
|
||||
simde_mm512_roundscale_ps_a_ = simde__m512_to_private(a); \
|
||||
\
|
||||
for (size_t simde_mm512_roundscale_ps_i = 0 ; simde_mm512_roundscale_ps_i < (sizeof(simde_mm512_roundscale_ps_r_.m256) / sizeof(simde_mm512_roundscale_ps_r_.m256[0])) ; simde_mm512_roundscale_ps_i++) { \
|
||||
simde_mm512_roundscale_ps_r_.m256[simde_mm512_roundscale_ps_i] = simde_mm256_roundscale_ps(simde_mm512_roundscale_ps_a_.m256[simde_mm512_roundscale_ps_i], imm8); \
|
||||
} \
|
||||
\
|
||||
simde__m512_from_private(simde_mm512_roundscale_ps_r_); \
|
||||
}))
|
||||
#else
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_roundscale_ps_internal_ (simde__m512 result, simde__m512 a, int imm8)
|
||||
SIMDE_REQUIRE_RANGE(imm8, 0, 255) {
|
||||
HEDLEY_STATIC_CAST(void, imm8);
|
||||
|
||||
simde__m512 r, clear_sign;
|
||||
|
||||
clear_sign = simde_mm512_andnot_ps(simde_mm512_set1_ps(SIMDE_FLOAT32_C(-0.0)), result);
|
||||
r = simde_mm512_mask_mov_ps(result, simde_mm512_cmpeq_epi32_mask(simde_mm512_castps_si512(clear_sign), simde_mm512_castps_si512(simde_mm512_set1_ps(SIMDE_MATH_INFINITYF))), a);
|
||||
|
||||
return r;
|
||||
}
|
||||
#define simde_mm512_roundscale_ps(a, imm8) \
|
||||
simde_mm512_roundscale_ps_internal_( \
|
||||
simde_mm512_mul_ps( \
|
||||
simde_x_mm512_round_ps( \
|
||||
simde_mm512_mul_ps( \
|
||||
a, \
|
||||
simde_mm512_set1_ps(simde_math_exp2f(((imm8 >> 4) & 15)))), \
|
||||
((imm8) & 15) \
|
||||
), \
|
||||
simde_mm512_set1_ps(simde_math_exp2f(-((imm8 >> 4) & 15))) \
|
||||
), \
|
||||
(a), \
|
||||
(imm8) \
|
||||
)
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_roundscale_ps
|
||||
#define _mm512_roundscale_ps(a, imm8) simde_mm512_roundscale_ps(a, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define simde_mm512_mask_roundscale_ps(src, k, a, imm8) _mm512_mask_roundscale_ps(src, k, a, imm8)
|
||||
#else
|
||||
#define simde_mm512_mask_roundscale_ps(src, k, a, imm8) simde_mm512_mask_mov_ps(src, k, simde_mm512_roundscale_ps(a, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_roundscale_ps
|
||||
#define _mm512_mask_roundscale_ps(src, k, a, imm8) simde_mm512_mask_roundscale_ps(src, k, a, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define simde_mm512_maskz_roundscale_ps(k, a, imm8) _mm512_maskz_roundscale_ps(k, a, imm8)
|
||||
#else
|
||||
#define simde_mm512_maskz_roundscale_ps(k, a, imm8) simde_mm512_maskz_mov_ps(k, simde_mm512_roundscale_ps(a, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_roundscale_ps
|
||||
#define _mm512_maskz_roundscale_ps(k, a, imm8) simde_mm512_maskz_roundscale_ps(k, a, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define simde_mm_roundscale_pd(a, imm8) _mm_roundscale_pd((a), (imm8))
|
||||
#else
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128d
|
||||
simde_mm_roundscale_pd_internal_ (simde__m128d result, simde__m128d a, int imm8)
|
||||
SIMDE_REQUIRE_RANGE(imm8, 0, 255) {
|
||||
HEDLEY_STATIC_CAST(void, imm8);
|
||||
|
||||
simde__m128d r, clear_sign;
|
||||
|
||||
clear_sign = simde_mm_andnot_pd(simde_mm_set1_pd(SIMDE_FLOAT64_C(-0.0)), result);
|
||||
r = simde_x_mm_select_pd(result, a, simde_mm_cmpeq_pd(clear_sign, simde_mm_set1_pd(SIMDE_MATH_INFINITY)));
|
||||
|
||||
return r;
|
||||
}
|
||||
#define simde_mm_roundscale_pd(a, imm8) \
|
||||
simde_mm_roundscale_pd_internal_( \
|
||||
simde_mm_mul_pd( \
|
||||
simde_mm_round_pd( \
|
||||
simde_mm_mul_pd( \
|
||||
a, \
|
||||
simde_mm_set1_pd(simde_math_exp2(((imm8 >> 4) & 15)))), \
|
||||
((imm8) & 15) \
|
||||
), \
|
||||
simde_mm_set1_pd(simde_math_exp2(-((imm8 >> 4) & 15))) \
|
||||
), \
|
||||
(a), \
|
||||
(imm8) \
|
||||
)
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_roundscale_pd
|
||||
#define _mm_roundscale_pd(a, imm8) simde_mm_roundscale_pd(a, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
#define simde_mm_mask_roundscale_pd(src, k, a, imm8) _mm_mask_roundscale_pd(src, k, a, imm8)
|
||||
#else
|
||||
#define simde_mm_mask_roundscale_pd(src, k, a, imm8) simde_mm_mask_mov_pd(src, k, simde_mm_roundscale_pd(a, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_roundscale_pd
|
||||
#define _mm_mask_roundscale_pd(src, k, a, imm8) simde_mm_mask_roundscale_pd(src, k, a, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
#define simde_mm_maskz_roundscale_pd(k, a, imm8) _mm_maskz_roundscale_pd(k, a, imm8)
|
||||
#else
|
||||
#define simde_mm_maskz_roundscale_pd(k, a, imm8) simde_mm_maskz_mov_pd(k, simde_mm_roundscale_pd(a, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_maskz_roundscale_pd
|
||||
#define _mm_maskz_roundscale_pd(k, a, imm8) simde_mm_maskz_roundscale_pd(k, a, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define simde_mm256_roundscale_pd(a, imm8) _mm256_roundscale_pd((a), (imm8))
|
||||
#elif SIMDE_NATURAL_VECTOR_SIZE_LE(128) && defined(SIMDE_STATEMENT_EXPR_)
|
||||
#define simde_mm256_roundscale_pd(a, imm8) SIMDE_STATEMENT_EXPR_(({ \
|
||||
simde__m256d_private \
|
||||
simde_mm256_roundscale_pd_r_ = simde__m256d_to_private(simde_mm256_setzero_pd()), \
|
||||
simde_mm256_roundscale_pd_a_ = simde__m256d_to_private(a); \
|
||||
\
|
||||
for (size_t simde_mm256_roundscale_pd_i = 0 ; simde_mm256_roundscale_pd_i < (sizeof(simde_mm256_roundscale_pd_r_.m128d) / sizeof(simde_mm256_roundscale_pd_r_.m128d[0])) ; simde_mm256_roundscale_pd_i++) { \
|
||||
simde_mm256_roundscale_pd_r_.m128d[simde_mm256_roundscale_pd_i] = simde_mm_roundscale_pd(simde_mm256_roundscale_pd_a_.m128d[simde_mm256_roundscale_pd_i], imm8); \
|
||||
} \
|
||||
\
|
||||
simde__m256d_from_private(simde_mm256_roundscale_pd_r_); \
|
||||
}))
|
||||
#else
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256d
|
||||
simde_mm256_roundscale_pd_internal_ (simde__m256d result, simde__m256d a, int imm8)
|
||||
SIMDE_REQUIRE_RANGE(imm8, 0, 255) {
|
||||
HEDLEY_STATIC_CAST(void, imm8);
|
||||
|
||||
simde__m256d r, clear_sign;
|
||||
|
||||
clear_sign = simde_mm256_andnot_pd(simde_mm256_set1_pd(SIMDE_FLOAT64_C(-0.0)), result);
|
||||
r = simde_x_mm256_select_pd(result, a, simde_mm256_castsi256_pd(simde_mm256_cmpeq_epi64(simde_mm256_castpd_si256(clear_sign), simde_mm256_castpd_si256(simde_mm256_set1_pd(SIMDE_MATH_INFINITY)))));
|
||||
|
||||
return r;
|
||||
}
|
||||
#define simde_mm256_roundscale_pd(a, imm8) \
|
||||
simde_mm256_roundscale_pd_internal_( \
|
||||
simde_mm256_mul_pd( \
|
||||
simde_mm256_round_pd( \
|
||||
simde_mm256_mul_pd( \
|
||||
a, \
|
||||
simde_mm256_set1_pd(simde_math_exp2(((imm8 >> 4) & 15)))), \
|
||||
((imm8) & 15) \
|
||||
), \
|
||||
simde_mm256_set1_pd(simde_math_exp2(-((imm8 >> 4) & 15))) \
|
||||
), \
|
||||
(a), \
|
||||
(imm8) \
|
||||
)
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_roundscale_pd
|
||||
#define _mm256_roundscale_pd(a, imm8) simde_mm256_roundscale_pd(a, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
#define simde_mm256_mask_roundscale_pd(src, k, a, imm8) _mm256_mask_roundscale_pd(src, k, a, imm8)
|
||||
#else
|
||||
#define simde_mm256_mask_roundscale_pd(src, k, a, imm8) simde_mm256_mask_mov_pd(src, k, simde_mm256_roundscale_pd(a, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_mask_roundscale_pd
|
||||
#define _mm256_mask_roundscale_pd(src, k, a, imm8) simde_mm256_mask_roundscale_pd(src, k, a, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
#define simde_mm256_maskz_roundscale_pd(k, a, imm8) _mm256_maskz_roundscale_pd(k, a, imm8)
|
||||
#else
|
||||
#define simde_mm256_maskz_roundscale_pd(k, a, imm8) simde_mm256_maskz_mov_pd(k, simde_mm256_roundscale_pd(a, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_maskz_roundscale_pd
|
||||
#define _mm256_maskz_roundscale_pd(k, a, imm8) simde_mm256_maskz_roundscale_pd(k, a, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define simde_mm512_roundscale_pd(a, imm8) _mm512_roundscale_pd((a), (imm8))
|
||||
#elif SIMDE_NATURAL_VECTOR_SIZE_LE(256) && defined(SIMDE_STATEMENT_EXPR_)
|
||||
#define simde_mm512_roundscale_pd(a, imm8) SIMDE_STATEMENT_EXPR_(({ \
|
||||
simde__m512d_private \
|
||||
simde_mm512_roundscale_pd_r_ = simde__m512d_to_private(simde_mm512_setzero_pd()), \
|
||||
simde_mm512_roundscale_pd_a_ = simde__m512d_to_private(a); \
|
||||
\
|
||||
for (size_t simde_mm512_roundscale_pd_i = 0 ; simde_mm512_roundscale_pd_i < (sizeof(simde_mm512_roundscale_pd_r_.m256d) / sizeof(simde_mm512_roundscale_pd_r_.m256d[0])) ; simde_mm512_roundscale_pd_i++) { \
|
||||
simde_mm512_roundscale_pd_r_.m256d[simde_mm512_roundscale_pd_i] = simde_mm256_roundscale_pd(simde_mm512_roundscale_pd_a_.m256d[simde_mm512_roundscale_pd_i], imm8); \
|
||||
} \
|
||||
\
|
||||
simde__m512d_from_private(simde_mm512_roundscale_pd_r_); \
|
||||
}))
|
||||
#else
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_roundscale_pd_internal_ (simde__m512d result, simde__m512d a, int imm8)
|
||||
SIMDE_REQUIRE_RANGE(imm8, 0, 255) {
|
||||
HEDLEY_STATIC_CAST(void, imm8);
|
||||
|
||||
simde__m512d r, clear_sign;
|
||||
|
||||
clear_sign = simde_mm512_andnot_pd(simde_mm512_set1_pd(SIMDE_FLOAT64_C(-0.0)), result);
|
||||
r = simde_mm512_mask_mov_pd(result, simde_mm512_cmpeq_epi64_mask(simde_mm512_castpd_si512(clear_sign), simde_mm512_castpd_si512(simde_mm512_set1_pd(SIMDE_MATH_INFINITY))), a);
|
||||
|
||||
return r;
|
||||
}
|
||||
#define simde_mm512_roundscale_pd(a, imm8) \
|
||||
simde_mm512_roundscale_pd_internal_( \
|
||||
simde_mm512_mul_pd( \
|
||||
simde_x_mm512_round_pd( \
|
||||
simde_mm512_mul_pd( \
|
||||
a, \
|
||||
simde_mm512_set1_pd(simde_math_exp2(((imm8 >> 4) & 15)))), \
|
||||
((imm8) & 15) \
|
||||
), \
|
||||
simde_mm512_set1_pd(simde_math_exp2(-((imm8 >> 4) & 15))) \
|
||||
), \
|
||||
(a), \
|
||||
(imm8) \
|
||||
)
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_roundscale_pd
|
||||
#define _mm512_roundscale_pd(a, imm8) simde_mm512_roundscale_pd(a, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define simde_mm512_mask_roundscale_pd(src, k, a, imm8) _mm512_mask_roundscale_pd(src, k, a, imm8)
|
||||
#else
|
||||
#define simde_mm512_mask_roundscale_pd(src, k, a, imm8) simde_mm512_mask_mov_pd(src, k, simde_mm512_roundscale_pd(a, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_roundscale_pd
|
||||
#define _mm512_mask_roundscale_pd(src, k, a, imm8) simde_mm512_mask_roundscale_pd(src, k, a, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define simde_mm512_maskz_roundscale_pd(k, a, imm8) _mm512_maskz_roundscale_pd(k, a, imm8)
|
||||
#else
|
||||
#define simde_mm512_maskz_roundscale_pd(k, a, imm8) simde_mm512_maskz_mov_pd(k, simde_mm512_roundscale_pd(a, imm8))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_roundscale_pd
|
||||
#define _mm512_maskz_roundscale_pd(k, a, imm8) simde_mm512_maskz_roundscale_pd(k, a, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define simde_mm_roundscale_ss(a, b, imm8) _mm_roundscale_ss((a), (b), (imm8))
|
||||
#else
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128
|
||||
simde_mm_roundscale_ss_internal_ (simde__m128 result, simde__m128 b, const int imm8)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 255) {
|
||||
HEDLEY_STATIC_CAST(void, imm8);
|
||||
|
||||
simde__m128_private
|
||||
r_ = simde__m128_to_private(result),
|
||||
b_ = simde__m128_to_private(b);
|
||||
|
||||
if(simde_math_isinff(r_.f32[0]))
|
||||
r_.f32[0] = b_.f32[0];
|
||||
|
||||
return simde__m128_from_private(r_);
|
||||
}
|
||||
#define simde_mm_roundscale_ss(a, b, imm8) \
|
||||
simde_mm_roundscale_ss_internal_( \
|
||||
simde_mm_mul_ss( \
|
||||
simde_mm_round_ss( \
|
||||
a, \
|
||||
simde_mm_mul_ss( \
|
||||
b, \
|
||||
simde_mm_set1_ps(simde_math_exp2f(((imm8 >> 4) & 15)))), \
|
||||
((imm8) & 15) \
|
||||
), \
|
||||
simde_mm_set1_ps(simde_math_exp2f(-((imm8 >> 4) & 15))) \
|
||||
), \
|
||||
(b), \
|
||||
(imm8) \
|
||||
)
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_roundscale_ss
|
||||
#define _mm_roundscale_ss(a, b, imm8) simde_mm_roundscale_ss(a, b, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && !defined(SIMDE_BUG_GCC_92035)
|
||||
#define simde_mm_mask_roundscale_ss(src, k, a, b, imm8) _mm_mask_roundscale_ss((src), (k), (a), (b), (imm8))
|
||||
#else
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128
|
||||
simde_mm_mask_roundscale_ss_internal_ (simde__m128 a, simde__m128 b, simde__mmask8 k) {
|
||||
simde__m128 r;
|
||||
|
||||
if(k & 1)
|
||||
r = a;
|
||||
else
|
||||
r = b;
|
||||
|
||||
return r;
|
||||
}
|
||||
#define simde_mm_mask_roundscale_ss(src, k, a, b, imm8) \
|
||||
simde_mm_mask_roundscale_ss_internal_( \
|
||||
simde_mm_roundscale_ss( \
|
||||
a, \
|
||||
b, \
|
||||
imm8 \
|
||||
), \
|
||||
simde_mm_move_ss( \
|
||||
(a), \
|
||||
(src) \
|
||||
), \
|
||||
(k) \
|
||||
)
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_roundscale_ss
|
||||
#define _mm_mask_roundscale_ss(src, k, a, b, imm8) simde_mm_mask_roundscale_ss(src, k, a, b, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && !defined(SIMDE_BUG_GCC_92035)
|
||||
#define simde_mm_maskz_roundscale_ss(k, a, b, imm8) _mm_maskz_roundscale_ss((k), (a), (b), (imm8))
|
||||
#else
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128
|
||||
simde_mm_maskz_roundscale_ss_internal_ (simde__m128 a, simde__m128 b, simde__mmask8 k) {
|
||||
simde__m128 r;
|
||||
|
||||
if(k & 1)
|
||||
r = a;
|
||||
else
|
||||
r = b;
|
||||
|
||||
return r;
|
||||
}
|
||||
#define simde_mm_maskz_roundscale_ss(k, a, b, imm8) \
|
||||
simde_mm_maskz_roundscale_ss_internal_( \
|
||||
simde_mm_roundscale_ss( \
|
||||
a, \
|
||||
b, \
|
||||
imm8 \
|
||||
), \
|
||||
simde_mm_move_ss( \
|
||||
(a), \
|
||||
simde_mm_setzero_ps() \
|
||||
), \
|
||||
(k) \
|
||||
)
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_maskz_roundscale_ss
|
||||
#define _mm_maskz_roundscale_ss(k, a, b, imm8) simde_mm_maskz_roundscale_ss(k, a, b, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define simde_mm_roundscale_sd(a, b, imm8) _mm_roundscale_sd((a), (b), (imm8))
|
||||
#else
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128d
|
||||
simde_mm_roundscale_sd_internal_ (simde__m128d result, simde__m128d b, const int imm8)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 255) {
|
||||
HEDLEY_STATIC_CAST(void, imm8);
|
||||
|
||||
simde__m128d_private
|
||||
r_ = simde__m128d_to_private(result),
|
||||
b_ = simde__m128d_to_private(b);
|
||||
|
||||
if(simde_math_isinf(r_.f64[0]))
|
||||
r_.f64[0] = b_.f64[0];
|
||||
|
||||
return simde__m128d_from_private(r_);
|
||||
}
|
||||
#define simde_mm_roundscale_sd(a, b, imm8) \
|
||||
simde_mm_roundscale_sd_internal_( \
|
||||
simde_mm_mul_sd( \
|
||||
simde_mm_round_sd( \
|
||||
a, \
|
||||
simde_mm_mul_sd( \
|
||||
b, \
|
||||
simde_mm_set1_pd(simde_math_exp2(((imm8 >> 4) & 15)))), \
|
||||
((imm8) & 15) \
|
||||
), \
|
||||
simde_mm_set1_pd(simde_math_exp2(-((imm8 >> 4) & 15))) \
|
||||
), \
|
||||
(b), \
|
||||
(imm8) \
|
||||
)
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_roundscale_sd
|
||||
#define _mm_roundscale_sd(a, b, imm8) simde_mm_roundscale_sd(a, b, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && !defined(SIMDE_BUG_GCC_92035)
|
||||
#define simde_mm_mask_roundscale_sd(src, k, a, b, imm8) _mm_mask_roundscale_sd((src), (k), (a), (b), (imm8))
|
||||
#else
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128d
|
||||
simde_mm_mask_roundscale_sd_internal_ (simde__m128d a, simde__m128d b, simde__mmask8 k) {
|
||||
simde__m128d r;
|
||||
|
||||
if(k & 1)
|
||||
r = a;
|
||||
else
|
||||
r = b;
|
||||
|
||||
return r;
|
||||
}
|
||||
#define simde_mm_mask_roundscale_sd(src, k, a, b, imm8) \
|
||||
simde_mm_mask_roundscale_sd_internal_( \
|
||||
simde_mm_roundscale_sd( \
|
||||
a, \
|
||||
b, \
|
||||
imm8 \
|
||||
), \
|
||||
simde_mm_move_sd( \
|
||||
(a), \
|
||||
(src) \
|
||||
), \
|
||||
(k) \
|
||||
)
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_roundscale_sd
|
||||
#define _mm_mask_roundscale_sd(src, k, a, b, imm8) simde_mm_mask_roundscale_sd(src, k, a, b, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && !defined(SIMDE_BUG_GCC_92035)
|
||||
#define simde_mm_maskz_roundscale_sd(k, a, b, imm8) _mm_maskz_roundscale_sd((k), (a), (b), (imm8))
|
||||
#else
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128d
|
||||
simde_mm_maskz_roundscale_sd_internal_ (simde__m128d a, simde__m128d b, simde__mmask8 k) {
|
||||
simde__m128d r;
|
||||
|
||||
if(k & 1)
|
||||
r = a;
|
||||
else
|
||||
r = b;
|
||||
|
||||
return r;
|
||||
}
|
||||
#define simde_mm_maskz_roundscale_sd(k, a, b, imm8) \
|
||||
simde_mm_maskz_roundscale_sd_internal_( \
|
||||
simde_mm_roundscale_sd( \
|
||||
a, \
|
||||
b, \
|
||||
imm8 \
|
||||
), \
|
||||
simde_mm_move_sd( \
|
||||
(a), \
|
||||
simde_mm_setzero_pd() \
|
||||
), \
|
||||
(k) \
|
||||
)
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_maskz_roundscale_sd
|
||||
#define _mm_maskz_roundscale_sd(k, a, b, imm8) simde_mm_maskz_roundscale_sd(k, a, b, imm8)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_ROUNDSCALE_H) */
|
||||
@@ -0,0 +1,690 @@
|
||||
#if !defined(SIMDE_X86_AVX512_ROUNDSCALE_ROUND_H)
|
||||
#define SIMDE_X86_AVX512_ROUNDSCALE_ROUND_H
|
||||
|
||||
#include "types.h"
|
||||
#include "roundscale.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
#if defined(HEDLEY_MSVC_VERSION)
|
||||
#pragma warning( push )
|
||||
#pragma warning( disable : 4244 )
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define simde_mm512_roundscale_round_ps(a, imm8, sae) _mm512_roundscale_round_ps(a, imm8, sae)
|
||||
#elif defined(SIMDE_FAST_EXCEPTIONS)
|
||||
#define simde_mm512_roundscale_round_ps(a, imm8, sae) simde_mm512_roundscale_ps(a, imm8)
|
||||
#elif defined(SIMDE_STATEMENT_EXPR_)
|
||||
#if defined(SIMDE_HAVE_FENV_H)
|
||||
#define simde_mm512_roundscale_round_ps(a,imm8, sae) SIMDE_STATEMENT_EXPR_(({ \
|
||||
simde__m512 simde_mm512_roundscale_round_ps_r; \
|
||||
\
|
||||
if (sae & SIMDE_MM_FROUND_NO_EXC) { \
|
||||
fenv_t simde_mm512_roundscale_round_ps_envp; \
|
||||
int simde_mm512_roundscale_round_ps_x = feholdexcept(&simde_mm512_roundscale_round_ps_envp); \
|
||||
simde_mm512_roundscale_round_ps_r = simde_mm512_roundscale_ps(a, imm8); \
|
||||
if (HEDLEY_LIKELY(simde_mm512_roundscale_round_ps_x == 0)) \
|
||||
fesetenv(&simde_mm512_roundscale_round_ps_envp); \
|
||||
} \
|
||||
else { \
|
||||
simde_mm512_roundscale_round_ps_r = simde_mm512_roundscale_ps(a, imm8); \
|
||||
} \
|
||||
\
|
||||
simde_mm512_roundscale_round_ps_r; \
|
||||
}))
|
||||
#else
|
||||
#define simde_mm512_roundscale_round_ps(a, imm8, sae) simde_mm512_roundscale_ps(a, imm8)
|
||||
#endif
|
||||
#else
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_roundscale_round_ps (simde__m512 a, int imm8, int sae)
|
||||
SIMDE_REQUIRE_RANGE(imm8, 0, 15) {
|
||||
simde__m512 r;
|
||||
|
||||
if (sae & SIMDE_MM_FROUND_NO_EXC) {
|
||||
#if defined(SIMDE_HAVE_FENV_H)
|
||||
fenv_t envp;
|
||||
int x = feholdexcept(&envp);
|
||||
r = simde_mm512_roundscale_ps(a, imm8);
|
||||
if (HEDLEY_LIKELY(x == 0))
|
||||
fesetenv(&envp);
|
||||
#else
|
||||
r = simde_mm512_roundscale_ps(a, imm8);
|
||||
#endif
|
||||
}
|
||||
else {
|
||||
r = simde_mm512_roundscale_ps(a, imm8);
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_roundscale_round_ps
|
||||
#define _mm512_roundscale_round_ps(a, imm8, sae) simde_mm512_roundscale_round_ps(a, imm8, sae)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && !defined(SIMDE_BUG_GCC_92035)
|
||||
#define simde_mm512_mask_roundscale_round_ps(src, k, a, imm8, sae) _mm512_mask_roundscale_round_ps(src, k, a, imm8, sae)
|
||||
#elif defined(SIMDE_FAST_EXCEPTIONS)
|
||||
#define simde_mm512_mask_roundscale_round_ps(src, k, a, imm8, sae) simde_mm512_mask_roundscale_ps(src, k, a, imm8)
|
||||
#elif defined(SIMDE_STATEMENT_EXPR_)
|
||||
#if defined(SIMDE_HAVE_FENV_H)
|
||||
#define simde_mm512_mask_roundscale_round_ps(src, k, a, imm8, sae) SIMDE_STATEMENT_EXPR_(({ \
|
||||
simde__m512 simde_mm512_mask_roundscale_round_ps_r; \
|
||||
\
|
||||
if (sae & SIMDE_MM_FROUND_NO_EXC) { \
|
||||
fenv_t simde_mm512_mask_roundscale_round_ps_envp; \
|
||||
int simde_mm512_mask_roundscale_round_ps_x = feholdexcept(&simde_mm512_mask_roundscale_round_ps_envp); \
|
||||
simde_mm512_mask_roundscale_round_ps_r = simde_mm512_mask_roundscale_ps(src, k, a, imm8); \
|
||||
if (HEDLEY_LIKELY(simde_mm512_mask_roundscale_round_ps_x == 0)) \
|
||||
fesetenv(&simde_mm512_mask_roundscale_round_ps_envp); \
|
||||
} \
|
||||
else { \
|
||||
simde_mm512_mask_roundscale_round_ps_r = simde_mm512_mask_roundscale_ps(src, k, a, imm8); \
|
||||
} \
|
||||
\
|
||||
simde_mm512_mask_roundscale_round_ps_r; \
|
||||
}))
|
||||
#else
|
||||
#define simde_mm512_mask_roundscale_round_ps(src, k, a, imm8, sae) simde_mm512_mask_roundscale_ps(src, k, a, imm8)
|
||||
#endif
|
||||
#else
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_mask_roundscale_round_ps (simde__m512 src, simde__mmask8 k, simde__m512 a, int imm8, int sae)
|
||||
SIMDE_REQUIRE_RANGE(imm8, 0, 15) {
|
||||
simde__m512 r;
|
||||
|
||||
if (sae & SIMDE_MM_FROUND_NO_EXC) {
|
||||
#if defined(SIMDE_HAVE_FENV_H)
|
||||
fenv_t envp;
|
||||
int x = feholdexcept(&envp);
|
||||
r = simde_mm512_mask_roundscale_ps(src, k, a, imm8);
|
||||
if (HEDLEY_LIKELY(x == 0))
|
||||
fesetenv(&envp);
|
||||
#else
|
||||
r = simde_mm512_mask_roundscale_ps(src, k, a, imm8);
|
||||
#endif
|
||||
}
|
||||
else {
|
||||
r = simde_mm512_mask_roundscale_ps(src, k, a, imm8);
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_roundscale_round_ps
|
||||
#define _mm512_mask_roundscale_round_ps(src, k, a, imm8, sae) simde_mm512_mask_roundscale_round_ps(src, k, a, imm8, sae)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && !defined(SIMDE_BUG_GCC_92035)
|
||||
#define simde_mm512_maskz_roundscale_round_ps(k, a, imm8, sae) _mm512_maskz_roundscale_round_ps(k, a, imm8, sae)
|
||||
#elif defined(SIMDE_FAST_EXCEPTIONS)
|
||||
#define simde_mm512_maskz_roundscale_round_ps(k, a, imm8, sae) simde_mm512_maskz_roundscale_ps(k, a, imm8)
|
||||
#elif defined(SIMDE_STATEMENT_EXPR_)
|
||||
#if defined(SIMDE_HAVE_FENV_H)
|
||||
#define simde_mm512_maskz_roundscale_round_ps(k, a, imm8, sae) SIMDE_STATEMENT_EXPR_(({ \
|
||||
simde__m512 simde_mm512_maskz_roundscale_round_ps_r; \
|
||||
\
|
||||
if (sae & SIMDE_MM_FROUND_NO_EXC) { \
|
||||
fenv_t simde_mm512_maskz_roundscale_round_ps_envp; \
|
||||
int simde_mm512_maskz_roundscale_round_ps_x = feholdexcept(&simde_mm512_maskz_roundscale_round_ps_envp); \
|
||||
simde_mm512_maskz_roundscale_round_ps_r = simde_mm512_maskz_roundscale_ps(k, a, imm8); \
|
||||
if (HEDLEY_LIKELY(simde_mm512_maskz_roundscale_round_ps_x == 0)) \
|
||||
fesetenv(&simde_mm512_maskz_roundscale_round_ps_envp); \
|
||||
} \
|
||||
else { \
|
||||
simde_mm512_maskz_roundscale_round_ps_r = simde_mm512_maskz_roundscale_ps(k, a, imm8); \
|
||||
} \
|
||||
\
|
||||
simde_mm512_maskz_roundscale_round_ps_r; \
|
||||
}))
|
||||
#else
|
||||
#define simde_mm512_maskz_roundscale_round_ps(src, k, a, imm8, sae) simde_mm512_maskz_roundscale_ps(k, a, imm8)
|
||||
#endif
|
||||
#else
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_maskz_roundscale_round_ps (simde__mmask8 k, simde__m512 a, int imm8, int sae)
|
||||
SIMDE_REQUIRE_RANGE(imm8, 0, 15) {
|
||||
simde__m512 r;
|
||||
|
||||
if (sae & SIMDE_MM_FROUND_NO_EXC) {
|
||||
#if defined(SIMDE_HAVE_FENV_H)
|
||||
fenv_t envp;
|
||||
int x = feholdexcept(&envp);
|
||||
r = simde_mm512_maskz_roundscale_ps(k, a, imm8);
|
||||
if (HEDLEY_LIKELY(x == 0))
|
||||
fesetenv(&envp);
|
||||
#else
|
||||
r = simde_mm512_maskz_roundscale_ps(k, a, imm8);
|
||||
#endif
|
||||
}
|
||||
else {
|
||||
r = simde_mm512_maskz_roundscale_ps(k, a, imm8);
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_roundscale_round_ps
|
||||
#define _mm512_maskz_roundscale_round_ps(k, a, imm8, sae) simde_mm512_maskz_roundscale_round_ps(k, a, imm8, sae)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define simde_mm512_roundscale_round_pd(a, imm8, sae) _mm512_roundscale_round_pd(a, imm8, sae)
|
||||
#elif defined(SIMDE_FAST_EXCEPTIONS)
|
||||
#define simde_mm512_roundscale_round_pd(a, imm8, sae) simde_mm512_roundscale_pd(a, imm8)
|
||||
#elif defined(SIMDE_STATEMENT_EXPR_)
|
||||
#if defined(SIMDE_HAVE_FENV_H)
|
||||
#define simde_mm512_roundscale_round_pd(a, imm8, sae) SIMDE_STATEMENT_EXPR_(({ \
|
||||
simde__m512d simde_mm512_roundscale_round_pd_r; \
|
||||
\
|
||||
if (sae & SIMDE_MM_FROUND_NO_EXC) { \
|
||||
fenv_t simde_mm512_roundscale_round_pd_envp; \
|
||||
int simde_mm512_roundscale_round_pd_x = feholdexcept(&simde_mm512_roundscale_round_pd_envp); \
|
||||
simde_mm512_roundscale_round_pd_r = simde_mm512_roundscale_pd(a, imm8); \
|
||||
if (HEDLEY_LIKELY(simde_mm512_roundscale_round_pd_x == 0)) \
|
||||
fesetenv(&simde_mm512_roundscale_round_pd_envp); \
|
||||
} \
|
||||
else { \
|
||||
simde_mm512_roundscale_round_pd_r = simde_mm512_roundscale_pd(a, imm8); \
|
||||
} \
|
||||
\
|
||||
simde_mm512_roundscale_round_pd_r; \
|
||||
}))
|
||||
#else
|
||||
#define simde_mm512_roundscale_round_pd(a, imm8, sae) simde_mm512_roundscale_pd(a, imm8)
|
||||
#endif
|
||||
#else
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_roundscale_round_pd (simde__m512d a, int imm8, int sae)
|
||||
SIMDE_REQUIRE_RANGE(imm8, 0, 15) {
|
||||
simde__m512d r;
|
||||
|
||||
if (sae & SIMDE_MM_FROUND_NO_EXC) {
|
||||
#if defined(SIMDE_HAVE_FENV_H)
|
||||
fenv_t envp;
|
||||
int x = feholdexcept(&envp);
|
||||
r = simde_mm512_roundscale_pd(a, imm8);
|
||||
if (HEDLEY_LIKELY(x == 0))
|
||||
fesetenv(&envp);
|
||||
#else
|
||||
r = simde_mm512_roundscale_pd(a, imm8);
|
||||
#endif
|
||||
}
|
||||
else {
|
||||
r = simde_mm512_roundscale_pd(a, imm8);
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_roundscale_round_pd
|
||||
#define _mm512_roundscale_round_pd(a, imm8, sae) simde_mm512_roundscale_round_pd(a, imm8, sae)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && !defined(SIMDE_BUG_GCC_92035)
|
||||
#define simde_mm512_mask_roundscale_round_pd(src, k, a, imm8, sae) _mm512_mask_roundscale_round_pd(src, k, a, imm8, sae)
|
||||
#elif defined(SIMDE_FAST_EXCEPTIONS)
|
||||
#define simde_mm512_mask_roundscale_round_pd(src, k, a, imm8, sae) simde_mm512_mask_roundscale_pd(src, k, a, imm8)
|
||||
#elif defined(SIMDE_STATEMENT_EXPR_)
|
||||
#if defined(SIMDE_HAVE_FENV_H)
|
||||
#define simde_mm512_mask_roundscale_round_pd(src, k, a, imm8, sae) SIMDE_STATEMENT_EXPR_(({ \
|
||||
simde__m512d simde_mm512_mask_roundscale_round_pd_r; \
|
||||
\
|
||||
if (sae & SIMDE_MM_FROUND_NO_EXC) { \
|
||||
fenv_t simde_mm512_mask_roundscale_round_pd_envp; \
|
||||
int simde_mm512_mask_roundscale_round_pd_x = feholdexcept(&simde_mm512_mask_roundscale_round_pd_envp); \
|
||||
simde_mm512_mask_roundscale_round_pd_r = simde_mm512_mask_roundscale_pd(src, k, a, imm8); \
|
||||
if (HEDLEY_LIKELY(simde_mm512_mask_roundscale_round_pd_x == 0)) \
|
||||
fesetenv(&simde_mm512_mask_roundscale_round_pd_envp); \
|
||||
} \
|
||||
else { \
|
||||
simde_mm512_mask_roundscale_round_pd_r = simde_mm512_mask_roundscale_pd(src, k, a, imm8); \
|
||||
} \
|
||||
\
|
||||
simde_mm512_mask_roundscale_round_pd_r; \
|
||||
}))
|
||||
#else
|
||||
#define simde_mm512_mask_roundscale_round_pd(src, k, a, imm8, sae) simde_mm512_mask_roundscale_pd(src, k, a, imm8)
|
||||
#endif
|
||||
#else
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_mask_roundscale_round_pd (simde__m512d src, simde__mmask8 k, simde__m512d a, int imm8, int sae)
|
||||
SIMDE_REQUIRE_RANGE(imm8, 0, 15) {
|
||||
simde__m512d r;
|
||||
|
||||
if (sae & SIMDE_MM_FROUND_NO_EXC) {
|
||||
#if defined(SIMDE_HAVE_FENV_H)
|
||||
fenv_t envp;
|
||||
int x = feholdexcept(&envp);
|
||||
r = simde_mm512_mask_roundscale_pd(src, k, a, imm8);
|
||||
if (HEDLEY_LIKELY(x == 0))
|
||||
fesetenv(&envp);
|
||||
#else
|
||||
r = simde_mm512_mask_roundscale_pd(src, k, a, imm8);
|
||||
#endif
|
||||
}
|
||||
else {
|
||||
r = simde_mm512_mask_roundscale_pd(src, k, a, imm8);
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_roundscale_round_pd
|
||||
#define _mm512_mask_roundscale_round_pd(src, k, a, imm8, sae) simde_mm512_mask_roundscale_round_pd(src, k, a, imm8, sae)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && !defined(SIMDE_BUG_GCC_92035)
|
||||
#define simde_mm512_maskz_roundscale_round_pd(k, a, imm8, sae) _mm512_maskz_roundscale_round_pd(k, a, imm8, sae)
|
||||
#elif defined(SIMDE_FAST_EXCEPTIONS)
|
||||
#define simde_mm512_maskz_roundscale_round_pd(k, a, imm8, sae) simde_mm512_maskz_roundscale_pd(k, a, imm8)
|
||||
#elif defined(SIMDE_STATEMENT_EXPR_)
|
||||
#if defined(SIMDE_HAVE_FENV_H)
|
||||
#define simde_mm512_maskz_roundscale_round_pd(k, a, imm8, sae) SIMDE_STATEMENT_EXPR_(({ \
|
||||
simde__m512d simde_mm512_maskz_roundscale_round_pd_r; \
|
||||
\
|
||||
if (sae & SIMDE_MM_FROUND_NO_EXC) { \
|
||||
fenv_t simde_mm512_maskz_roundscale_round_pd_envp; \
|
||||
int simde_mm512_maskz_roundscale_round_pd_x = feholdexcept(&simde_mm512_maskz_roundscale_round_pd_envp); \
|
||||
simde_mm512_maskz_roundscale_round_pd_r = simde_mm512_maskz_roundscale_pd(k, a, imm8); \
|
||||
if (HEDLEY_LIKELY(simde_mm512_maskz_roundscale_round_pd_x == 0)) \
|
||||
fesetenv(&simde_mm512_maskz_roundscale_round_pd_envp); \
|
||||
} \
|
||||
else { \
|
||||
simde_mm512_maskz_roundscale_round_pd_r = simde_mm512_maskz_roundscale_pd(k, a, imm8); \
|
||||
} \
|
||||
\
|
||||
simde_mm512_maskz_roundscale_round_pd_r; \
|
||||
}))
|
||||
#else
|
||||
#define simde_mm512_maskz_roundscale_round_pd(src, k, a, imm8, sae) simde_mm512_maskz_roundscale_pd(k, a, imm8)
|
||||
#endif
|
||||
#else
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_maskz_roundscale_round_pd (simde__mmask8 k, simde__m512d a, int imm8, int sae)
|
||||
SIMDE_REQUIRE_RANGE(imm8, 0, 15) {
|
||||
simde__m512d r;
|
||||
|
||||
if (sae & SIMDE_MM_FROUND_NO_EXC) {
|
||||
#if defined(SIMDE_HAVE_FENV_H)
|
||||
fenv_t envp;
|
||||
int x = feholdexcept(&envp);
|
||||
r = simde_mm512_maskz_roundscale_pd(k, a, imm8);
|
||||
if (HEDLEY_LIKELY(x == 0))
|
||||
fesetenv(&envp);
|
||||
#else
|
||||
r = simde_mm512_maskz_roundscale_pd(k, a, imm8);
|
||||
#endif
|
||||
}
|
||||
else {
|
||||
r = simde_mm512_maskz_roundscale_pd(k, a, imm8);
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_roundscale_round_pd
|
||||
#define _mm512_maskz_roundscale_round_pd(k, a, imm8, sae) simde_mm512_maskz_roundscale_round_pd(k, a, imm8, sae)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define simde_mm_roundscale_round_ss(a, b, imm8, sae) _mm_roundscale_round_ss(a, b, imm8, sae)
|
||||
#elif defined(SIMDE_FAST_EXCEPTIONS)
|
||||
#define simde_mm_roundscale_round_ss(a, b, imm8, sae) simde_mm_roundscale_ss(a, b, imm8)
|
||||
#elif defined(SIMDE_STATEMENT_EXPR_)
|
||||
#if defined(SIMDE_HAVE_FENV_H)
|
||||
#define simde_mm_roundscale_round_ss(a, b, imm8, sae) SIMDE_STATEMENT_EXPR_(({ \
|
||||
simde__m128 simde_mm_roundscale_round_ss_r; \
|
||||
\
|
||||
if (sae & SIMDE_MM_FROUND_NO_EXC) { \
|
||||
fenv_t simde_mm_roundscale_round_ss_envp; \
|
||||
int simde_mm_roundscale_round_ss_x = feholdexcept(&simde_mm_roundscale_round_ss_envp); \
|
||||
simde_mm_roundscale_round_ss_r = simde_mm_roundscale_ss(a, b, imm8); \
|
||||
if (HEDLEY_LIKELY(simde_mm_roundscale_round_ss_x == 0)) \
|
||||
fesetenv(&simde_mm_roundscale_round_ss_envp); \
|
||||
} \
|
||||
else { \
|
||||
simde_mm_roundscale_round_ss_r = simde_mm_roundscale_ss(a, b, imm8); \
|
||||
} \
|
||||
\
|
||||
simde_mm_roundscale_round_ss_r; \
|
||||
}))
|
||||
#else
|
||||
#define simde_mm_roundscale_round_ss(a, b, imm8, sae) simde_mm_roundscale_ss(a, b, imm8)
|
||||
#endif
|
||||
#elif !(defined(HEDLEY_MSVC_VERSION) && defined(SIMDE_X86_AVX_NATIVE))
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128
|
||||
simde_mm_roundscale_round_ss (simde__m128 a, simde__m128 b, const int imm8, const int sae)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 255)
|
||||
SIMDE_REQUIRE_CONSTANT(sae) {
|
||||
simde__m128 r;
|
||||
|
||||
if (sae & SIMDE_MM_FROUND_NO_EXC) {
|
||||
#if defined(SIMDE_HAVE_FENV_H)
|
||||
fenv_t envp;
|
||||
int x = feholdexcept(&envp);
|
||||
r = simde_mm_roundscale_ss(a, b, imm8);
|
||||
if (HEDLEY_LIKELY(x == 0))
|
||||
fesetenv(&envp);
|
||||
#else
|
||||
r = simde_mm_roundscale_ss(a, b, imm8);
|
||||
#endif
|
||||
}
|
||||
else {
|
||||
r = simde_mm_roundscale_ss(a, b, imm8);
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_roundscale_round_ss
|
||||
#define _mm_roundscale_round_ss(a, b, imm8, sae) simde_mm_roundscale_round_ss(a, b, imm8, sae)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && !defined(SIMDE_BUG_GCC_92035)
|
||||
#define simde_mm_mask_roundscale_round_ss(src, k, a, b, imm8, sae) _mm_mask_roundscale_round_ss(src, k, a, b, imm8, sae)
|
||||
#elif defined(SIMDE_FAST_EXCEPTIONS)
|
||||
#define simde_mm_mask_roundscale_round_ss(src, k, a, b, imm8, sae) simde_mm_mask_roundscale_ss(src, k, a, b, imm8)
|
||||
#elif defined(SIMDE_STATEMENT_EXPR_)
|
||||
#if defined(SIMDE_HAVE_FENV_H)
|
||||
#define simde_mm_mask_roundscale_round_ss(src, k, a, b, imm8, sae) SIMDE_STATEMENT_EXPR_(({ \
|
||||
simde__m128 simde_mm_mask_roundscale_round_ss_r; \
|
||||
\
|
||||
if (sae & SIMDE_MM_FROUND_NO_EXC) { \
|
||||
fenv_t simde_mm_mask_roundscale_round_ss_envp; \
|
||||
int simde_mm_mask_roundscale_round_ss_x = feholdexcept(&simde_mm_mask_roundscale_round_ss_envp); \
|
||||
simde_mm_mask_roundscale_round_ss_r = simde_mm_mask_roundscale_ss(src, k, a, b, imm8); \
|
||||
if (HEDLEY_LIKELY(simde_mm_mask_roundscale_round_ss_x == 0)) \
|
||||
fesetenv(&simde_mm_mask_roundscale_round_ss_envp); \
|
||||
} \
|
||||
else { \
|
||||
simde_mm_mask_roundscale_round_ss_r = simde_mm_mask_roundscale_ss(src, k, a, b, imm8); \
|
||||
} \
|
||||
\
|
||||
simde_mm_mask_roundscale_round_ss_r; \
|
||||
}))
|
||||
#else
|
||||
#define simde_mm_mask_roundscale_round_ss(src, k, a, b, imm8, sae) simde_mm_mask_roundscale_ss(src, k, a, b, imm8)
|
||||
#endif
|
||||
#elif !(defined(HEDLEY_MSVC_VERSION) && defined(SIMDE_X86_AVX_NATIVE))
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128
|
||||
simde_mm_mask_roundscale_round_ss (simde__m128 src, simde__mmask8 k, simde__m128 a, simde__m128 b, const int imm8, const int sae)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 255)
|
||||
SIMDE_REQUIRE_CONSTANT(sae) {
|
||||
simde__m128 r;
|
||||
|
||||
if (sae & SIMDE_MM_FROUND_NO_EXC) {
|
||||
#if defined(SIMDE_HAVE_FENV_H)
|
||||
fenv_t envp;
|
||||
int x = feholdexcept(&envp);
|
||||
r = simde_mm_mask_roundscale_ss(src, k, a, b, imm8);
|
||||
if (HEDLEY_LIKELY(x == 0))
|
||||
fesetenv(&envp);
|
||||
#else
|
||||
r = simde_mm_mask_roundscale_ss(src, k, a, b, imm8);
|
||||
#endif
|
||||
}
|
||||
else {
|
||||
r = simde_mm_mask_roundscale_ss(src, k, a, b, imm8);
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_roundscale_round_ss
|
||||
#define _mm_mask_roundscale_round_ss(src, k, a, b, imm8, sae) simde_mm_mask_roundscale_round_ss(src, k, a, b, imm8, sae)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && !defined(SIMDE_BUG_GCC_92035)
|
||||
#define simde_mm_maskz_roundscale_round_ss(k, a, b, imm8, sae) _mm_maskz_roundscale_round_ss(k, a, b, imm8, sae)
|
||||
#elif defined(SIMDE_FAST_EXCEPTIONS)
|
||||
#define simde_mm_maskz_roundscale_round_ss(k, a, b, imm8, sae) simde_mm_maskz_roundscale_ss(k, a, b, imm8)
|
||||
#elif defined(SIMDE_STATEMENT_EXPR_)
|
||||
#if defined(SIMDE_HAVE_FENV_H)
|
||||
#define simde_mm_maskz_roundscale_round_ss(k, a, b, imm8, sae) SIMDE_STATEMENT_EXPR_(({ \
|
||||
simde__m128 simde_mm_maskz_roundscale_round_ss_r; \
|
||||
\
|
||||
if (sae & SIMDE_MM_FROUND_NO_EXC) { \
|
||||
fenv_t simde_mm_maskz_roundscale_round_ss_envp; \
|
||||
int simde_mm_maskz_roundscale_round_ss_x = feholdexcept(&simde_mm_maskz_roundscale_round_ss_envp); \
|
||||
simde_mm_maskz_roundscale_round_ss_r = simde_mm_maskz_roundscale_ss(k, a, b, imm8); \
|
||||
if (HEDLEY_LIKELY(simde_mm_maskz_roundscale_round_ss_x == 0)) \
|
||||
fesetenv(&simde_mm_maskz_roundscale_round_ss_envp); \
|
||||
} \
|
||||
else { \
|
||||
simde_mm_maskz_roundscale_round_ss_r = simde_mm_maskz_roundscale_ss(k, a, b, imm8); \
|
||||
} \
|
||||
\
|
||||
simde_mm_maskz_roundscale_round_ss_r; \
|
||||
}))
|
||||
#else
|
||||
#define simde_mm_maskz_roundscale_round_ss(k, a, b, imm8, sae) simde_mm_maskz_roundscale_ss(k, a, b, imm8)
|
||||
#endif
|
||||
#elif !(defined(HEDLEY_MSVC_VERSION) && defined(SIMDE_X86_AVX_NATIVE))
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128
|
||||
simde_mm_maskz_roundscale_round_ss (simde__mmask8 k, simde__m128 a, simde__m128 b, const int imm8, const int sae)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 255)
|
||||
SIMDE_REQUIRE_CONSTANT(sae) {
|
||||
simde__m128 r;
|
||||
|
||||
if (sae & SIMDE_MM_FROUND_NO_EXC) {
|
||||
#if defined(SIMDE_HAVE_FENV_H)
|
||||
fenv_t envp;
|
||||
int x = feholdexcept(&envp);
|
||||
r = simde_mm_maskz_roundscale_ss(k, a, b, imm8);
|
||||
if (HEDLEY_LIKELY(x == 0))
|
||||
fesetenv(&envp);
|
||||
#else
|
||||
r = simde_mm_maskz_roundscale_ss(k, a, b, imm8);
|
||||
#endif
|
||||
}
|
||||
else {
|
||||
r = simde_mm_maskz_roundscale_ss(k, a, b, imm8);
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_maskz_roundscale_round_ss
|
||||
#define _mm_maskz_roundscale_round_ss(k, a, b, imm8, sae) simde_mm_maskz_roundscale_round_ss(k, a, b, imm8, sae)
|
||||
#endif
|
||||
|
||||
#if defined(HEDLEY_MSVC_VERSION)
|
||||
#pragma warning( pop )
|
||||
#endif
|
||||
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define simde_mm_roundscale_round_sd(a, b, imm8, sae) _mm_roundscale_round_sd(a, b, imm8, sae)
|
||||
#elif defined(SIMDE_FAST_EXCEPTIONS)
|
||||
#define simde_mm_roundscale_round_sd(a, b, imm8, sae) simde_mm_roundscale_sd(a, b, imm8)
|
||||
#elif defined(SIMDE_STATEMENT_EXPR_)
|
||||
#if defined(SIMDE_HAVE_FENV_H)
|
||||
#define simde_mm_roundscale_round_sd(a, b, imm8, sae) SIMDE_STATEMENT_EXPR_(({ \
|
||||
simde__m128d simde_mm_roundscale_round_sd_r; \
|
||||
\
|
||||
if (sae & SIMDE_MM_FROUND_NO_EXC) { \
|
||||
fenv_t simde_mm_roundscale_round_sd_envp; \
|
||||
int simde_mm_roundscale_round_sd_x = feholdexcept(&simde_mm_roundscale_round_sd_envp); \
|
||||
simde_mm_roundscale_round_sd_r = simde_mm_roundscale_sd(a, b, imm8); \
|
||||
if (HEDLEY_LIKELY(simde_mm_roundscale_round_sd_x == 0)) \
|
||||
fesetenv(&simde_mm_roundscale_round_sd_envp); \
|
||||
} \
|
||||
else { \
|
||||
simde_mm_roundscale_round_sd_r = simde_mm_roundscale_sd(a, b, imm8); \
|
||||
} \
|
||||
\
|
||||
simde_mm_roundscale_round_sd_r; \
|
||||
}))
|
||||
#else
|
||||
#define simde_mm_roundscale_round_sd(a, b, imm8, sae) simde_mm_roundscale_sd(a, b, imm8)
|
||||
#endif
|
||||
#elif !(defined(HEDLEY_MSVC_VERSION) && defined(SIMDE_X86_AVX_NATIVE))
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128d
|
||||
simde_mm_roundscale_round_sd (simde__m128d a, simde__m128d b, const int imm8, const int sae)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 255)
|
||||
SIMDE_REQUIRE_CONSTANT(sae) {
|
||||
simde__m128d r;
|
||||
|
||||
if (sae & SIMDE_MM_FROUND_NO_EXC) {
|
||||
#if defined(SIMDE_HAVE_FENV_H)
|
||||
fenv_t envp;
|
||||
int x = feholdexcept(&envp);
|
||||
r = simde_mm_roundscale_sd(a, b, imm8);
|
||||
if (HEDLEY_LIKELY(x == 0))
|
||||
fesetenv(&envp);
|
||||
#else
|
||||
r = simde_mm_roundscale_sd(a, b, imm8);
|
||||
#endif
|
||||
}
|
||||
else {
|
||||
r = simde_mm_roundscale_sd(a, b, imm8);
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_roundscale_round_sd
|
||||
#define _mm_roundscale_round_sd(a, b, imm8, sae) simde_mm_roundscale_round_sd(a, b, imm8, sae)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && !defined(SIMDE_BUG_GCC_92035)
|
||||
#define simde_mm_mask_roundscale_round_sd(src, k, a, b, imm8, sae) _mm_mask_roundscale_round_sd(src, k, a, b, imm8, sae)
|
||||
#elif defined(SIMDE_FAST_EXCEPTIONS)
|
||||
#define simde_mm_mask_roundscale_round_sd(src, k, a, b, imm8, sae) simde_mm_mask_roundscale_sd(src, k, a, b, imm8)
|
||||
#elif defined(SIMDE_STATEMENT_EXPR_)
|
||||
#if defined(SIMDE_HAVE_FENV_H)
|
||||
#define simde_mm_mask_roundscale_round_sd(src, k, a, b, imm8, sae) SIMDE_STATEMENT_EXPR_(({ \
|
||||
simde__m128d simde_mm_mask_roundscale_round_sd_r; \
|
||||
\
|
||||
if (sae & SIMDE_MM_FROUND_NO_EXC) { \
|
||||
fenv_t simde_mm_mask_roundscale_round_sd_envp; \
|
||||
int simde_mm_mask_roundscale_round_sd_x = feholdexcept(&simde_mm_mask_roundscale_round_sd_envp); \
|
||||
simde_mm_mask_roundscale_round_sd_r = simde_mm_mask_roundscale_sd(src, k, a, b, imm8); \
|
||||
if (HEDLEY_LIKELY(simde_mm_mask_roundscale_round_sd_x == 0)) \
|
||||
fesetenv(&simde_mm_mask_roundscale_round_sd_envp); \
|
||||
} \
|
||||
else { \
|
||||
simde_mm_mask_roundscale_round_sd_r = simde_mm_mask_roundscale_sd(src, k, a, b, imm8); \
|
||||
} \
|
||||
\
|
||||
simde_mm_mask_roundscale_round_sd_r; \
|
||||
}))
|
||||
#else
|
||||
#define simde_mm_mask_roundscale_round_sd(src, k, a, b, imm8, sae) simde_mm_mask_roundscale_sd(src, k, a, b, imm8)
|
||||
#endif
|
||||
#elif !(defined(HEDLEY_MSVC_VERSION) && defined(SIMDE_X86_AVX_NATIVE))
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128d
|
||||
simde_mm_mask_roundscale_round_sd (simde__m128d src, simde__mmask8 k, simde__m128d a, simde__m128d b, const int imm8, const int sae)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 255)
|
||||
SIMDE_REQUIRE_CONSTANT(sae) {
|
||||
simde__m128d r;
|
||||
|
||||
if (sae & SIMDE_MM_FROUND_NO_EXC) {
|
||||
#if defined(SIMDE_HAVE_FENV_H)
|
||||
fenv_t envp;
|
||||
int x = feholdexcept(&envp);
|
||||
r = simde_mm_mask_roundscale_sd(src, k, a, b, imm8);
|
||||
if (HEDLEY_LIKELY(x == 0))
|
||||
fesetenv(&envp);
|
||||
#else
|
||||
r = simde_mm_mask_roundscale_sd(src, k, a, b, imm8);
|
||||
#endif
|
||||
}
|
||||
else {
|
||||
r = simde_mm_mask_roundscale_sd(src, k, a, b, imm8);
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_roundscale_round_sd
|
||||
#define _mm_mask_roundscale_round_sd(src, k, a, b, imm8, sae) simde_mm_mask_roundscale_round_sd(src, k, a, b, imm8, sae)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && !defined(SIMDE_BUG_GCC_92035)
|
||||
#define simde_mm_maskz_roundscale_round_sd(k, a, b, imm8, sae) _mm_maskz_roundscale_round_sd(k, a, b, imm8, sae)
|
||||
#elif defined(SIMDE_FAST_EXCEPTIONS)
|
||||
#define simde_mm_maskz_roundscale_round_sd(k, a, b, imm8, sae) simde_mm_maskz_roundscale_sd(k, a, b, imm8)
|
||||
#elif defined(SIMDE_STATEMENT_EXPR_)
|
||||
#if defined(SIMDE_HAVE_FENV_H)
|
||||
#define simde_mm_maskz_roundscale_round_sd(k, a, b, imm8, sae) SIMDE_STATEMENT_EXPR_(({ \
|
||||
simde__m128d simde_mm_maskz_roundscale_round_sd_r; \
|
||||
\
|
||||
if (sae & SIMDE_MM_FROUND_NO_EXC) { \
|
||||
fenv_t simde_mm_maskz_roundscale_round_sd_envp; \
|
||||
int simde_mm_maskz_roundscale_round_sd_x = feholdexcept(&simde_mm_maskz_roundscale_round_sd_envp); \
|
||||
simde_mm_maskz_roundscale_round_sd_r = simde_mm_maskz_roundscale_sd(k, a, b, imm8); \
|
||||
if (HEDLEY_LIKELY(simde_mm_maskz_roundscale_round_sd_x == 0)) \
|
||||
fesetenv(&simde_mm_maskz_roundscale_round_sd_envp); \
|
||||
} \
|
||||
else { \
|
||||
simde_mm_maskz_roundscale_round_sd_r = simde_mm_maskz_roundscale_sd(k, a, b, imm8); \
|
||||
} \
|
||||
\
|
||||
simde_mm_maskz_roundscale_round_sd_r; \
|
||||
}))
|
||||
#else
|
||||
#define simde_mm_maskz_roundscale_round_sd(k, a, b, imm8, sae) simde_mm_maskz_roundscale_sd(k, a, b, imm8)
|
||||
#endif
|
||||
#elif !(defined(HEDLEY_MSVC_VERSION) && defined(SIMDE_X86_AVX_NATIVE))
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128d
|
||||
simde_mm_maskz_roundscale_round_sd (simde__mmask8 k, simde__m128d a, simde__m128d b, const int imm8, const int sae)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 255)
|
||||
SIMDE_REQUIRE_CONSTANT(sae) {
|
||||
simde__m128d r;
|
||||
|
||||
if (sae & SIMDE_MM_FROUND_NO_EXC) {
|
||||
#if defined(SIMDE_HAVE_FENV_H)
|
||||
fenv_t envp;
|
||||
int x = feholdexcept(&envp);
|
||||
r = simde_mm_maskz_roundscale_sd(k, a, b, imm8);
|
||||
if (HEDLEY_LIKELY(x == 0))
|
||||
fesetenv(&envp);
|
||||
#else
|
||||
r = simde_mm_maskz_roundscale_sd(k, a, b, imm8);
|
||||
#endif
|
||||
}
|
||||
else {
|
||||
r = simde_mm_maskz_roundscale_sd(k, a, b, imm8);
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_maskz_roundscale_round_sd
|
||||
#define _mm_maskz_roundscale_round_sd(k, a, b, imm8, sae) simde_mm_maskz_roundscale_round_sd(k, a, b, imm8, sae)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_ROUNDSCALE_ROUND_H) */
|
||||
@@ -0,0 +1,77 @@
|
||||
/* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Copyright:
|
||||
* 2020 Evan Nemerson <evan@nemerson.com>
|
||||
* 2020 Hidayat Khan <huk2209@gmail.com>
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512_SAD_H)
|
||||
#define SIMDE_X86_AVX512_SAD_H
|
||||
|
||||
#include "types.h"
|
||||
#include "../avx2.h"
|
||||
#include "mov.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_sad_epu8 (simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_sad_epu8(a, b);
|
||||
#else
|
||||
simde__m512i_private
|
||||
r_,
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b);
|
||||
|
||||
#if SIMDE_NATURAL_VECTOR_SIZE_LE(256)
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m256i) / sizeof(r_.m256i[0])) ; i++) {
|
||||
r_.m256i[i] = simde_mm256_sad_epu8(a_.m256i[i], b_.m256i[i]);
|
||||
}
|
||||
#else
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i64) / sizeof(r_.i64[0])) ; i++) {
|
||||
uint16_t tmp = 0;
|
||||
SIMDE_VECTORIZE_REDUCTION(+:tmp)
|
||||
for (size_t j = 0 ; j < ((sizeof(r_.u8) / sizeof(r_.u8[0])) / 8) ; j++) {
|
||||
const size_t e = j + (i * 8);
|
||||
tmp += (a_.u8[e] > b_.u8[e]) ? (a_.u8[e] - b_.u8[e]) : (b_.u8[e] - a_.u8[e]);
|
||||
}
|
||||
r_.i64[i] = tmp;
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_sad_epu8
|
||||
#define _mm512_sad_epu8(a, b) simde_mm512_sad_epu8(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_SAD_H) */
|
||||
@@ -0,0 +1,389 @@
|
||||
#if !defined(SIMDE_X86_AVX512_SCALEF_H)
|
||||
#define SIMDE_X86_AVX512_SCALEF_H
|
||||
|
||||
#include "types.h"
|
||||
#include "flushsubnormal.h"
|
||||
#include "../svml.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128
|
||||
simde_mm_scalef_ps (simde__m128 a, simde__m128 b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_scalef_ps(a, b);
|
||||
#else
|
||||
return simde_mm_mul_ps(simde_x_mm_flushsubnormal_ps(a), simde_mm_exp2_ps(simde_mm_floor_ps(simde_x_mm_flushsubnormal_ps(b))));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_scalef_ps
|
||||
#define _mm_scalef_ps(a, b) simde_mm_scalef_ps(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128
|
||||
simde_mm_mask_scalef_ps (simde__m128 src, simde__mmask8 k, simde__m128 a, simde__m128 b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_mask_scalef_ps(src, k, a, b);
|
||||
#else
|
||||
return simde_mm_mask_mov_ps(src, k, simde_mm_scalef_ps(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_scalef_ps
|
||||
#define _mm_mask_scalef_ps(src, k, a, b) simde_mm_mask_scalef_ps(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128
|
||||
simde_mm_maskz_scalef_ps (simde__mmask8 k, simde__m128 a, simde__m128 b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_maskz_scalef_ps(k, a, b);
|
||||
#else
|
||||
return simde_mm_maskz_mov_ps(k, simde_mm_scalef_ps(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_maskz_scalef_ps
|
||||
#define _mm_maskz_scalef_ps(k, a, b) simde_mm_maskz_scalef_ps(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256
|
||||
simde_mm256_scalef_ps (simde__m256 a, simde__m256 b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_scalef_ps(a, b);
|
||||
#else
|
||||
return simde_mm256_mul_ps(simde_x_mm256_flushsubnormal_ps(a), simde_mm256_exp2_ps(simde_mm256_floor_ps(simde_x_mm256_flushsubnormal_ps(b))));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_scalef_ps
|
||||
#define _mm256_scalef_ps(a, b) simde_mm256_scalef_ps(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256
|
||||
simde_mm256_mask_scalef_ps (simde__m256 src, simde__mmask8 k, simde__m256 a, simde__m256 b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_mask_scalef_ps(src, k, a, b);
|
||||
#else
|
||||
return simde_mm256_mask_mov_ps(src, k, simde_mm256_scalef_ps(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_mask_scalef_ps
|
||||
#define _mm256_mask_scalef_ps(src, k, a, b) simde_mm256_mask_scalef_ps(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256
|
||||
simde_mm256_maskz_scalef_ps (simde__mmask8 k, simde__m256 a, simde__m256 b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_maskz_scalef_ps(k, a, b);
|
||||
#else
|
||||
return simde_mm256_maskz_mov_ps(k, simde_mm256_scalef_ps(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_maskz_scalef_ps
|
||||
#define _mm256_maskz_scalef_ps(k, a, b) simde_mm256_maskz_scalef_ps(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_scalef_ps (simde__m512 a, simde__m512 b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_scalef_ps(a, b);
|
||||
#else
|
||||
return simde_mm512_mul_ps(simde_x_mm512_flushsubnormal_ps(a), simde_mm512_exp2_ps(simde_mm512_floor_ps(simde_x_mm512_flushsubnormal_ps(b))));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_scalef_ps
|
||||
#define _mm512_scalef_ps(a, b) simde_mm512_scalef_ps(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_mask_scalef_ps (simde__m512 src, simde__mmask16 k, simde__m512 a, simde__m512 b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_scalef_ps(src, k, a, b);
|
||||
#else
|
||||
return simde_mm512_mask_mov_ps(src, k, simde_mm512_scalef_ps(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_scalef_ps
|
||||
#define _mm512_mask_scalef_ps(src, k, a, b) simde_mm512_mask_scalef_ps(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_maskz_scalef_ps (simde__mmask16 k, simde__m512 a, simde__m512 b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_maskz_scalef_ps(k, a, b);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_ps(k, simde_mm512_scalef_ps(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_scalef_ps
|
||||
#define _mm512_maskz_scalef_ps(k, a, b) simde_mm512_maskz_scalef_ps(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128d
|
||||
simde_mm_scalef_pd (simde__m128d a, simde__m128d b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_scalef_pd(a, b);
|
||||
#else
|
||||
return simde_mm_mul_pd(simde_x_mm_flushsubnormal_pd(a), simde_mm_exp2_pd(simde_mm_floor_pd(simde_x_mm_flushsubnormal_pd(b))));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_scalef_pd
|
||||
#define _mm_scalef_pd(a, b) simde_mm_scalef_pd(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128d
|
||||
simde_mm_mask_scalef_pd (simde__m128d src, simde__mmask8 k, simde__m128d a, simde__m128d b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_mask_scalef_pd(src, k, a, b);
|
||||
#else
|
||||
return simde_mm_mask_mov_pd(src, k, simde_mm_scalef_pd(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_scalef_pd
|
||||
#define _mm_mask_scalef_pd(src, k, a, b) simde_mm_mask_scalef_pd(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128d
|
||||
simde_mm_maskz_scalef_pd (simde__mmask8 k, simde__m128d a, simde__m128d b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_maskz_scalef_pd(k, a, b);
|
||||
#else
|
||||
return simde_mm_maskz_mov_pd(k, simde_mm_scalef_pd(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_maskz_scalef_pd
|
||||
#define _mm_maskz_scalef_pd(k, a, b) simde_mm_maskz_scalef_pd(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256d
|
||||
simde_mm256_scalef_pd (simde__m256d a, simde__m256d b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_scalef_pd(a, b);
|
||||
#else
|
||||
return simde_mm256_mul_pd(simde_x_mm256_flushsubnormal_pd(a), simde_mm256_exp2_pd(simde_mm256_floor_pd(simde_x_mm256_flushsubnormal_pd(b))));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_scalef_pd
|
||||
#define _mm256_scalef_pd(a, b) simde_mm256_scalef_pd(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256d
|
||||
simde_mm256_mask_scalef_pd (simde__m256d src, simde__mmask8 k, simde__m256d a, simde__m256d b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_mask_scalef_pd(src, k, a, b);
|
||||
#else
|
||||
return simde_mm256_mask_mov_pd(src, k, simde_mm256_scalef_pd(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_mask_scalef_pd
|
||||
#define _mm256_mask_scalef_pd(src, k, a, b) simde_mm256_mask_scalef_pd(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256d
|
||||
simde_mm256_maskz_scalef_pd (simde__mmask8 k, simde__m256d a, simde__m256d b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm256_maskz_scalef_pd(k, a, b);
|
||||
#else
|
||||
return simde_mm256_maskz_mov_pd(k, simde_mm256_scalef_pd(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_maskz_scalef_pd
|
||||
#define _mm256_maskz_scalef_pd(k, a, b) simde_mm256_maskz_scalef_pd(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_scalef_pd (simde__m512d a, simde__m512d b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_scalef_pd(a, b);
|
||||
#else
|
||||
return simde_mm512_mul_pd(simde_x_mm512_flushsubnormal_pd(a), simde_mm512_exp2_pd(simde_mm512_floor_pd(simde_x_mm512_flushsubnormal_pd(b))));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_scalef_pd
|
||||
#define _mm512_scalef_pd(a, b) simde_mm512_scalef_pd(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_mask_scalef_pd (simde__m512d src, simde__mmask8 k, simde__m512d a, simde__m512d b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_scalef_pd(src, k, a, b);
|
||||
#else
|
||||
return simde_mm512_mask_mov_pd(src, k, simde_mm512_scalef_pd(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_scalef_pd
|
||||
#define _mm512_mask_scalef_pd(src, k, a, b) simde_mm512_mask_scalef_pd(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_maskz_scalef_pd (simde__mmask8 k, simde__m512d a, simde__m512d b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_maskz_scalef_pd(k, a, b);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_pd(k, simde_mm512_scalef_pd(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_scalef_pd
|
||||
#define _mm512_maskz_scalef_pd(k, a, b) simde_mm512_maskz_scalef_pd(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128
|
||||
simde_mm_scalef_ss (simde__m128 a, simde__m128 b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm_scalef_ss(a, b);
|
||||
#else
|
||||
simde__m128_private
|
||||
a_ = simde__m128_to_private(a),
|
||||
b_ = simde__m128_to_private(b);
|
||||
|
||||
a_.f32[0] = (simde_math_issubnormalf(a_.f32[0]) ? 0 : a_.f32[0]) * simde_math_exp2f(simde_math_floorf((simde_math_issubnormalf(b_.f32[0]) ? 0 : b_.f32[0])));
|
||||
|
||||
return simde__m128_from_private(a_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_scalef_ss
|
||||
#define _mm_scalef_ss(a, b) simde_mm_scalef_ss(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128
|
||||
simde_mm_mask_scalef_ss (simde__m128 src, simde__mmask8 k, simde__m128 a, simde__m128 b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && !defined(HEDLEY_GCC_VERSION)
|
||||
return _mm_mask_scalef_round_ss(src, k, a, b, _MM_FROUND_CUR_DIRECTION);
|
||||
#else
|
||||
simde__m128_private
|
||||
src_ = simde__m128_to_private(src),
|
||||
a_ = simde__m128_to_private(a),
|
||||
b_ = simde__m128_to_private(b);
|
||||
|
||||
a_.f32[0] = ((k & 1) ? ((simde_math_issubnormalf(a_.f32[0]) ? 0 : a_.f32[0]) * simde_math_exp2f(simde_math_floorf((simde_math_issubnormalf(b_.f32[0]) ? 0 : b_.f32[0])))) : src_.f32[0]);
|
||||
|
||||
return simde__m128_from_private(a_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_scalef_ss
|
||||
#define _mm_mask_scalef_ss(src, k, a, b) simde_mm_mask_scalef_ss(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128
|
||||
simde_mm_maskz_scalef_ss (simde__mmask8 k, simde__m128 a, simde__m128 b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && !defined(SIMDE_BUG_GCC_95483) && !defined(SIMDE_BUG_GCC_105339)
|
||||
return _mm_maskz_scalef_ss(k, a, b);
|
||||
#else
|
||||
simde__m128_private
|
||||
a_ = simde__m128_to_private(a),
|
||||
b_ = simde__m128_to_private(b);
|
||||
|
||||
a_.f32[0] = ((k & 1) ? ((simde_math_issubnormalf(a_.f32[0]) ? 0 : a_.f32[0]) * simde_math_exp2f(simde_math_floorf((simde_math_issubnormalf(b_.f32[0]) ? 0 : b_.f32[0])))) : SIMDE_FLOAT32_C(0.0));
|
||||
|
||||
return simde__m128_from_private(a_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_maskz_scalef_ss
|
||||
#define _mm_maskz_scalef_ss(k, a, b) simde_mm_maskz_scalef_ss(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128d
|
||||
simde_mm_scalef_sd (simde__m128d a, simde__m128d b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm_scalef_sd(a, b);
|
||||
#else
|
||||
simde__m128d_private
|
||||
a_ = simde__m128d_to_private(a),
|
||||
b_ = simde__m128d_to_private(b);
|
||||
|
||||
a_.f64[0] = (simde_math_issubnormal(a_.f64[0]) ? 0 : a_.f64[0]) * simde_math_exp2(simde_math_floor((simde_math_issubnormal(b_.f64[0]) ? 0 : b_.f64[0])));
|
||||
|
||||
return simde__m128d_from_private(a_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_scalef_sd
|
||||
#define _mm_scalef_sd(a, b) simde_mm_scalef_sd(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128d
|
||||
simde_mm_mask_scalef_sd (simde__m128d src, simde__mmask8 k, simde__m128d a, simde__m128d b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && !defined(SIMDE_BUG_GCC_95483) && !defined(SIMDE_BUG_GCC_105339)
|
||||
return _mm_mask_scalef_sd(src, k, a, b);
|
||||
#else
|
||||
simde__m128d_private
|
||||
src_ = simde__m128d_to_private(src),
|
||||
a_ = simde__m128d_to_private(a),
|
||||
b_ = simde__m128d_to_private(b);
|
||||
|
||||
a_.f64[0] = ((k & 1) ? ((simde_math_issubnormal(a_.f64[0]) ? 0 : a_.f64[0]) * simde_math_exp2(simde_math_floor((simde_math_issubnormal(b_.f64[0]) ? 0 : b_.f64[0])))) : src_.f64[0]);
|
||||
|
||||
return simde__m128d_from_private(a_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_mask_scalef_sd
|
||||
#define _mm_mask_scalef_sd(src, k, a, b) simde_mm_mask_scalef_sd(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128d
|
||||
simde_mm_maskz_scalef_sd (simde__mmask8 k, simde__m128d a, simde__m128d b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && !defined(SIMDE_BUG_GCC_95483) && !defined(SIMDE_BUG_GCC_105339)
|
||||
return _mm_maskz_scalef_sd(k, a, b);
|
||||
#else
|
||||
simde__m128d_private
|
||||
a_ = simde__m128d_to_private(a),
|
||||
b_ = simde__m128d_to_private(b);
|
||||
|
||||
a_.f64[0] = ((k & 1) ? ((simde_math_issubnormal(a_.f64[0]) ? 0 : a_.f64[0]) * simde_math_exp2(simde_math_floor(simde_math_issubnormal(b_.f64[0]) ? 0 : b_.f64[0]))) : SIMDE_FLOAT64_C(0.0));
|
||||
|
||||
return simde__m128d_from_private(a_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_maskz_scalef_sd
|
||||
#define _mm_maskz_scalef_sd(k, a, b) simde_mm_maskz_scalef_sd(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_SCALEF_H) */
|
||||
@@ -0,0 +1,572 @@
|
||||
/* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Copyright:
|
||||
* 2020 Evan Nemerson <evan@nemerson.com>
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512_SET_H)
|
||||
#define SIMDE_X86_AVX512_SET_H
|
||||
|
||||
#include "types.h"
|
||||
#include "load.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_set_epi16 (int16_t e31, int16_t e30, int16_t e29, int16_t e28, int16_t e27, int16_t e26, int16_t e25, int16_t e24,
|
||||
int16_t e23, int16_t e22, int16_t e21, int16_t e20, int16_t e19, int16_t e18, int16_t e17, int16_t e16,
|
||||
int16_t e15, int16_t e14, int16_t e13, int16_t e12, int16_t e11, int16_t e10, int16_t e9, int16_t e8,
|
||||
int16_t e7, int16_t e6, int16_t e5, int16_t e4, int16_t e3, int16_t e2, int16_t e1, int16_t e0) {
|
||||
simde__m512i_private r_;
|
||||
|
||||
r_.i16[ 0] = e0;
|
||||
r_.i16[ 1] = e1;
|
||||
r_.i16[ 2] = e2;
|
||||
r_.i16[ 3] = e3;
|
||||
r_.i16[ 4] = e4;
|
||||
r_.i16[ 5] = e5;
|
||||
r_.i16[ 6] = e6;
|
||||
r_.i16[ 7] = e7;
|
||||
r_.i16[ 8] = e8;
|
||||
r_.i16[ 9] = e9;
|
||||
r_.i16[10] = e10;
|
||||
r_.i16[11] = e11;
|
||||
r_.i16[12] = e12;
|
||||
r_.i16[13] = e13;
|
||||
r_.i16[14] = e14;
|
||||
r_.i16[15] = e15;
|
||||
r_.i16[16] = e16;
|
||||
r_.i16[17] = e17;
|
||||
r_.i16[18] = e18;
|
||||
r_.i16[19] = e19;
|
||||
r_.i16[20] = e20;
|
||||
r_.i16[21] = e21;
|
||||
r_.i16[22] = e22;
|
||||
r_.i16[23] = e23;
|
||||
r_.i16[24] = e24;
|
||||
r_.i16[25] = e25;
|
||||
r_.i16[26] = e26;
|
||||
r_.i16[27] = e27;
|
||||
r_.i16[28] = e28;
|
||||
r_.i16[29] = e29;
|
||||
r_.i16[30] = e30;
|
||||
r_.i16[31] = e31;
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_set_epi16
|
||||
#define _mm512_set_epi16(e31, e30, e29, e28, e27, e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0) simde_mm512_set_epi16(e31, e30, e29, e28, e27, e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_set_epi32 (int32_t e15, int32_t e14, int32_t e13, int32_t e12, int32_t e11, int32_t e10, int32_t e9, int32_t e8,
|
||||
int32_t e7, int32_t e6, int32_t e5, int32_t e4, int32_t e3, int32_t e2, int32_t e1, int32_t e0) {
|
||||
simde__m512i_private r_;
|
||||
|
||||
r_.i32[ 0] = e0;
|
||||
r_.i32[ 1] = e1;
|
||||
r_.i32[ 2] = e2;
|
||||
r_.i32[ 3] = e3;
|
||||
r_.i32[ 4] = e4;
|
||||
r_.i32[ 5] = e5;
|
||||
r_.i32[ 6] = e6;
|
||||
r_.i32[ 7] = e7;
|
||||
r_.i32[ 8] = e8;
|
||||
r_.i32[ 9] = e9;
|
||||
r_.i32[10] = e10;
|
||||
r_.i32[11] = e11;
|
||||
r_.i32[12] = e12;
|
||||
r_.i32[13] = e13;
|
||||
r_.i32[14] = e14;
|
||||
r_.i32[15] = e15;
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_set_epi32
|
||||
#define _mm512_set_epi32(e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0) simde_mm512_set_epi32(e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_set_epi64 (int64_t e7, int64_t e6, int64_t e5, int64_t e4, int64_t e3, int64_t e2, int64_t e1, int64_t e0) {
|
||||
simde__m512i_private r_;
|
||||
|
||||
r_.i64[0] = e0;
|
||||
r_.i64[1] = e1;
|
||||
r_.i64[2] = e2;
|
||||
r_.i64[3] = e3;
|
||||
r_.i64[4] = e4;
|
||||
r_.i64[5] = e5;
|
||||
r_.i64[6] = e6;
|
||||
r_.i64[7] = e7;
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_set_epi64
|
||||
#define _mm512_set_epi64(e7, e6, e5, e4, e3, e2, e1, e0) simde_mm512_set_epi64(e7, e6, e5, e4, e3, e2, e1, e0)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_x_mm512_set_epu8 (uint8_t e63, uint8_t e62, uint8_t e61, uint8_t e60, uint8_t e59, uint8_t e58, uint8_t e57, uint8_t e56,
|
||||
uint8_t e55, uint8_t e54, uint8_t e53, uint8_t e52, uint8_t e51, uint8_t e50, uint8_t e49, uint8_t e48,
|
||||
uint8_t e47, uint8_t e46, uint8_t e45, uint8_t e44, uint8_t e43, uint8_t e42, uint8_t e41, uint8_t e40,
|
||||
uint8_t e39, uint8_t e38, uint8_t e37, uint8_t e36, uint8_t e35, uint8_t e34, uint8_t e33, uint8_t e32,
|
||||
uint8_t e31, uint8_t e30, uint8_t e29, uint8_t e28, uint8_t e27, uint8_t e26, uint8_t e25, uint8_t e24,
|
||||
uint8_t e23, uint8_t e22, uint8_t e21, uint8_t e20, uint8_t e19, uint8_t e18, uint8_t e17, uint8_t e16,
|
||||
uint8_t e15, uint8_t e14, uint8_t e13, uint8_t e12, uint8_t e11, uint8_t e10, uint8_t e9, uint8_t e8,
|
||||
uint8_t e7, uint8_t e6, uint8_t e5, uint8_t e4, uint8_t e3, uint8_t e2, uint8_t e1, uint8_t e0) {
|
||||
simde__m512i_private r_;
|
||||
|
||||
r_.u8[ 0] = e0;
|
||||
r_.u8[ 1] = e1;
|
||||
r_.u8[ 2] = e2;
|
||||
r_.u8[ 3] = e3;
|
||||
r_.u8[ 4] = e4;
|
||||
r_.u8[ 5] = e5;
|
||||
r_.u8[ 6] = e6;
|
||||
r_.u8[ 7] = e7;
|
||||
r_.u8[ 8] = e8;
|
||||
r_.u8[ 9] = e9;
|
||||
r_.u8[10] = e10;
|
||||
r_.u8[11] = e11;
|
||||
r_.u8[12] = e12;
|
||||
r_.u8[13] = e13;
|
||||
r_.u8[14] = e14;
|
||||
r_.u8[15] = e15;
|
||||
r_.u8[16] = e16;
|
||||
r_.u8[17] = e17;
|
||||
r_.u8[18] = e18;
|
||||
r_.u8[19] = e19;
|
||||
r_.u8[20] = e20;
|
||||
r_.u8[21] = e21;
|
||||
r_.u8[22] = e22;
|
||||
r_.u8[23] = e23;
|
||||
r_.u8[24] = e24;
|
||||
r_.u8[25] = e25;
|
||||
r_.u8[26] = e26;
|
||||
r_.u8[27] = e27;
|
||||
r_.u8[28] = e28;
|
||||
r_.u8[29] = e29;
|
||||
r_.u8[30] = e30;
|
||||
r_.u8[31] = e31;
|
||||
r_.u8[32] = e32;
|
||||
r_.u8[33] = e33;
|
||||
r_.u8[34] = e34;
|
||||
r_.u8[35] = e35;
|
||||
r_.u8[36] = e36;
|
||||
r_.u8[37] = e37;
|
||||
r_.u8[38] = e38;
|
||||
r_.u8[39] = e39;
|
||||
r_.u8[40] = e40;
|
||||
r_.u8[41] = e41;
|
||||
r_.u8[42] = e42;
|
||||
r_.u8[43] = e43;
|
||||
r_.u8[44] = e44;
|
||||
r_.u8[45] = e45;
|
||||
r_.u8[46] = e46;
|
||||
r_.u8[47] = e47;
|
||||
r_.u8[48] = e48;
|
||||
r_.u8[49] = e49;
|
||||
r_.u8[50] = e50;
|
||||
r_.u8[51] = e51;
|
||||
r_.u8[52] = e52;
|
||||
r_.u8[53] = e53;
|
||||
r_.u8[54] = e54;
|
||||
r_.u8[55] = e55;
|
||||
r_.u8[56] = e56;
|
||||
r_.u8[57] = e57;
|
||||
r_.u8[58] = e58;
|
||||
r_.u8[59] = e59;
|
||||
r_.u8[60] = e60;
|
||||
r_.u8[61] = e61;
|
||||
r_.u8[62] = e62;
|
||||
r_.u8[63] = e63;
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
}
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_x_mm512_set_epu16 (uint16_t e31, uint16_t e30, uint16_t e29, uint16_t e28, uint16_t e27, uint16_t e26, uint16_t e25, uint16_t e24,
|
||||
uint16_t e23, uint16_t e22, uint16_t e21, uint16_t e20, uint16_t e19, uint16_t e18, uint16_t e17, uint16_t e16,
|
||||
uint16_t e15, uint16_t e14, uint16_t e13, uint16_t e12, uint16_t e11, uint16_t e10, uint16_t e9, uint16_t e8,
|
||||
uint16_t e7, uint16_t e6, uint16_t e5, uint16_t e4, uint16_t e3, uint16_t e2, uint16_t e1, uint16_t e0) {
|
||||
simde__m512i_private r_;
|
||||
|
||||
r_.u16[ 0] = e0;
|
||||
r_.u16[ 1] = e1;
|
||||
r_.u16[ 2] = e2;
|
||||
r_.u16[ 3] = e3;
|
||||
r_.u16[ 4] = e4;
|
||||
r_.u16[ 5] = e5;
|
||||
r_.u16[ 6] = e6;
|
||||
r_.u16[ 7] = e7;
|
||||
r_.u16[ 8] = e8;
|
||||
r_.u16[ 9] = e9;
|
||||
r_.u16[10] = e10;
|
||||
r_.u16[11] = e11;
|
||||
r_.u16[12] = e12;
|
||||
r_.u16[13] = e13;
|
||||
r_.u16[14] = e14;
|
||||
r_.u16[15] = e15;
|
||||
r_.u16[16] = e16;
|
||||
r_.u16[17] = e17;
|
||||
r_.u16[18] = e18;
|
||||
r_.u16[19] = e19;
|
||||
r_.u16[20] = e20;
|
||||
r_.u16[21] = e21;
|
||||
r_.u16[22] = e22;
|
||||
r_.u16[23] = e23;
|
||||
r_.u16[24] = e24;
|
||||
r_.u16[25] = e25;
|
||||
r_.u16[26] = e26;
|
||||
r_.u16[27] = e27;
|
||||
r_.u16[28] = e28;
|
||||
r_.u16[29] = e29;
|
||||
r_.u16[30] = e30;
|
||||
r_.u16[31] = e31;
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
}
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_x_mm512_set_epu32 (uint32_t e15, uint32_t e14, uint32_t e13, uint32_t e12, uint32_t e11, uint32_t e10, uint32_t e9, uint32_t e8,
|
||||
uint32_t e7, uint32_t e6, uint32_t e5, uint32_t e4, uint32_t e3, uint32_t e2, uint32_t e1, uint32_t e0) {
|
||||
simde__m512i_private r_;
|
||||
|
||||
r_.u32[ 0] = e0;
|
||||
r_.u32[ 1] = e1;
|
||||
r_.u32[ 2] = e2;
|
||||
r_.u32[ 3] = e3;
|
||||
r_.u32[ 4] = e4;
|
||||
r_.u32[ 5] = e5;
|
||||
r_.u32[ 6] = e6;
|
||||
r_.u32[ 7] = e7;
|
||||
r_.u32[ 8] = e8;
|
||||
r_.u32[ 9] = e9;
|
||||
r_.u32[10] = e10;
|
||||
r_.u32[11] = e11;
|
||||
r_.u32[12] = e12;
|
||||
r_.u32[13] = e13;
|
||||
r_.u32[14] = e14;
|
||||
r_.u32[15] = e15;
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
}
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_x_mm512_set_epu64 (uint64_t e7, uint64_t e6, uint64_t e5, uint64_t e4, uint64_t e3, uint64_t e2, uint64_t e1, uint64_t e0) {
|
||||
simde__m512i_private r_;
|
||||
|
||||
r_.u64[ 0] = e0;
|
||||
r_.u64[ 1] = e1;
|
||||
r_.u64[ 2] = e2;
|
||||
r_.u64[ 3] = e3;
|
||||
r_.u64[ 4] = e4;
|
||||
r_.u64[ 5] = e5;
|
||||
r_.u64[ 6] = e6;
|
||||
r_.u64[ 7] = e7;
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
}
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_set_epi8 (int8_t e63, int8_t e62, int8_t e61, int8_t e60, int8_t e59, int8_t e58, int8_t e57, int8_t e56,
|
||||
int8_t e55, int8_t e54, int8_t e53, int8_t e52, int8_t e51, int8_t e50, int8_t e49, int8_t e48,
|
||||
int8_t e47, int8_t e46, int8_t e45, int8_t e44, int8_t e43, int8_t e42, int8_t e41, int8_t e40,
|
||||
int8_t e39, int8_t e38, int8_t e37, int8_t e36, int8_t e35, int8_t e34, int8_t e33, int8_t e32,
|
||||
int8_t e31, int8_t e30, int8_t e29, int8_t e28, int8_t e27, int8_t e26, int8_t e25, int8_t e24,
|
||||
int8_t e23, int8_t e22, int8_t e21, int8_t e20, int8_t e19, int8_t e18, int8_t e17, int8_t e16,
|
||||
int8_t e15, int8_t e14, int8_t e13, int8_t e12, int8_t e11, int8_t e10, int8_t e9, int8_t e8,
|
||||
int8_t e7, int8_t e6, int8_t e5, int8_t e4, int8_t e3, int8_t e2, int8_t e1, int8_t e0) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && (HEDLEY_GCC_VERSION_CHECK(10,0,0) || SIMDE_DETECT_CLANG_VERSION_CHECK(5,0,0))
|
||||
return _mm512_set_epi8(
|
||||
e63, e62, e61, e60, e59, e58, e57, e56,
|
||||
e55, e54, e53, e52, e51, e50, e49, e48,
|
||||
e47, e46, e45, e44, e43, e42, e41, e40,
|
||||
e39, e38, e37, e36, e35, e34, e33, e32,
|
||||
e31, e30, e29, e28, e27, e26, e25, e24,
|
||||
e23, e22, e21, e20, e19, e18, e17, e16,
|
||||
e15, e14, e13, e12, e11, e10, e9, e8,
|
||||
e7, e6, e5, e4, e3, e2, e1, e0
|
||||
);
|
||||
#else
|
||||
simde__m512i_private r_;
|
||||
|
||||
r_.i8[ 0] = e0;
|
||||
r_.i8[ 1] = e1;
|
||||
r_.i8[ 2] = e2;
|
||||
r_.i8[ 3] = e3;
|
||||
r_.i8[ 4] = e4;
|
||||
r_.i8[ 5] = e5;
|
||||
r_.i8[ 6] = e6;
|
||||
r_.i8[ 7] = e7;
|
||||
r_.i8[ 8] = e8;
|
||||
r_.i8[ 9] = e9;
|
||||
r_.i8[10] = e10;
|
||||
r_.i8[11] = e11;
|
||||
r_.i8[12] = e12;
|
||||
r_.i8[13] = e13;
|
||||
r_.i8[14] = e14;
|
||||
r_.i8[15] = e15;
|
||||
r_.i8[16] = e16;
|
||||
r_.i8[17] = e17;
|
||||
r_.i8[18] = e18;
|
||||
r_.i8[19] = e19;
|
||||
r_.i8[20] = e20;
|
||||
r_.i8[21] = e21;
|
||||
r_.i8[22] = e22;
|
||||
r_.i8[23] = e23;
|
||||
r_.i8[24] = e24;
|
||||
r_.i8[25] = e25;
|
||||
r_.i8[26] = e26;
|
||||
r_.i8[27] = e27;
|
||||
r_.i8[28] = e28;
|
||||
r_.i8[29] = e29;
|
||||
r_.i8[30] = e30;
|
||||
r_.i8[31] = e31;
|
||||
r_.i8[32] = e32;
|
||||
r_.i8[33] = e33;
|
||||
r_.i8[34] = e34;
|
||||
r_.i8[35] = e35;
|
||||
r_.i8[36] = e36;
|
||||
r_.i8[37] = e37;
|
||||
r_.i8[38] = e38;
|
||||
r_.i8[39] = e39;
|
||||
r_.i8[40] = e40;
|
||||
r_.i8[41] = e41;
|
||||
r_.i8[42] = e42;
|
||||
r_.i8[43] = e43;
|
||||
r_.i8[44] = e44;
|
||||
r_.i8[45] = e45;
|
||||
r_.i8[46] = e46;
|
||||
r_.i8[47] = e47;
|
||||
r_.i8[48] = e48;
|
||||
r_.i8[49] = e49;
|
||||
r_.i8[50] = e50;
|
||||
r_.i8[51] = e51;
|
||||
r_.i8[52] = e52;
|
||||
r_.i8[53] = e53;
|
||||
r_.i8[54] = e54;
|
||||
r_.i8[55] = e55;
|
||||
r_.i8[56] = e56;
|
||||
r_.i8[57] = e57;
|
||||
r_.i8[58] = e58;
|
||||
r_.i8[59] = e59;
|
||||
r_.i8[60] = e60;
|
||||
r_.i8[61] = e61;
|
||||
r_.i8[62] = e62;
|
||||
r_.i8[63] = e63;
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_set_epi8
|
||||
#define _mm512_set_epi8(e63, e62, e61, e60, e59, e58, e57, e56, e55, e54, e53, e52, e51, e50, e49, e48, e47, e46, e45, e44, e43, e42, e41, e40, e39, e38, e37, e36, e35, e34, e33, e32, e31, e30, e29, e28, e27, e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0) simde_mm512_set_epi8(e63, e62, e61, e60, e59, e58, e57, e56, e55, e54, e53, e52, e51, e50, e49, e48, e47, e46, e45, e44, e43, e42, e41, e40, e39, e38, e37, e36, e35, e34, e33, e32, e31, e30, e29, e28, e27, e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_x_mm512_set_m128i (simde__m128i a, simde__m128i b, simde__m128i c, simde__m128i d) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
SIMDE_ALIGN_TO_64 simde__m128i v[] = { d, c, b, a };
|
||||
return simde_mm512_load_si512(HEDLEY_STATIC_CAST(__m512i *, HEDLEY_STATIC_CAST(void *, v)));
|
||||
#else
|
||||
simde__m512i_private r_;
|
||||
|
||||
r_.m128i[0] = d;
|
||||
r_.m128i[1] = c;
|
||||
r_.m128i[2] = b;
|
||||
r_.m128i[3] = a;
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_x_mm512_set_m256 (simde__m256 a, simde__m256 b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
SIMDE_ALIGN_TO_64 simde__m256 v[] = { b, a };
|
||||
return simde_mm512_load_ps(HEDLEY_STATIC_CAST(__m512 *, HEDLEY_STATIC_CAST(void *, v)));
|
||||
#else
|
||||
simde__m512_private r_;
|
||||
|
||||
r_.m256[0] = b;
|
||||
r_.m256[1] = a;
|
||||
|
||||
return simde__m512_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_x_mm512_set_m256i (simde__m256i a, simde__m256i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
SIMDE_ALIGN_TO_64 simde__m256i v[] = { b, a };
|
||||
return simde_mm512_load_si512(HEDLEY_STATIC_CAST(__m512i *, HEDLEY_STATIC_CAST(void *, v)));
|
||||
#else
|
||||
simde__m512i_private r_;
|
||||
|
||||
r_.m256i[0] = b;
|
||||
r_.m256i[1] = a;
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_x_mm512_set_m256d (simde__m256d a, simde__m256d b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
SIMDE_ALIGN_TO_64 simde__m256d v[] = { b, a };
|
||||
return simde_mm512_load_pd(HEDLEY_STATIC_CAST(__m512d *, HEDLEY_STATIC_CAST(void *, v)));
|
||||
#else
|
||||
simde__m512d_private r_;
|
||||
|
||||
r_.m256d[0] = b;
|
||||
r_.m256d[1] = a;
|
||||
|
||||
return simde__m512d_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_set_ps (simde_float32 e15, simde_float32 e14, simde_float32 e13, simde_float32 e12,
|
||||
simde_float32 e11, simde_float32 e10, simde_float32 e9, simde_float32 e8,
|
||||
simde_float32 e7, simde_float32 e6, simde_float32 e5, simde_float32 e4,
|
||||
simde_float32 e3, simde_float32 e2, simde_float32 e1, simde_float32 e0) {
|
||||
simde__m512_private r_;
|
||||
|
||||
r_.f32[ 0] = e0;
|
||||
r_.f32[ 1] = e1;
|
||||
r_.f32[ 2] = e2;
|
||||
r_.f32[ 3] = e3;
|
||||
r_.f32[ 4] = e4;
|
||||
r_.f32[ 5] = e5;
|
||||
r_.f32[ 6] = e6;
|
||||
r_.f32[ 7] = e7;
|
||||
r_.f32[ 8] = e8;
|
||||
r_.f32[ 9] = e9;
|
||||
r_.f32[10] = e10;
|
||||
r_.f32[11] = e11;
|
||||
r_.f32[12] = e12;
|
||||
r_.f32[13] = e13;
|
||||
r_.f32[14] = e14;
|
||||
r_.f32[15] = e15;
|
||||
|
||||
return simde__m512_from_private(r_);
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_set_ps
|
||||
#define _mm512_set_ps(e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0) simde_mm512_set_ps(e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_set_pd (simde_float64 e7, simde_float64 e6, simde_float64 e5, simde_float64 e4, simde_float64 e3, simde_float64 e2, simde_float64 e1, simde_float64 e0) {
|
||||
simde__m512d_private r_;
|
||||
|
||||
r_.f64[0] = e0;
|
||||
r_.f64[1] = e1;
|
||||
r_.f64[2] = e2;
|
||||
r_.f64[3] = e3;
|
||||
r_.f64[4] = e4;
|
||||
r_.f64[5] = e5;
|
||||
r_.f64[6] = e6;
|
||||
r_.f64[7] = e7;
|
||||
|
||||
return simde__m512d_from_private(r_);
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_set_pd
|
||||
#define _mm512_set_pd(e7, e6, e5, e4, e3, e2, e1, e0) simde_mm512_set_pd(e7, e6, e5, e4, e3, e2, e1, e0)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512h
|
||||
simde_mm512_set_ph (simde_float16 e31, simde_float16 e30, simde_float16 e29, simde_float16 e28, simde_float16 e27, simde_float16 e26, simde_float16 e25, simde_float16 e24,
|
||||
simde_float16 e23, simde_float16 e22, simde_float16 e21, simde_float16 e20, simde_float16 e19, simde_float16 e18, simde_float16 e17, simde_float16 e16,
|
||||
simde_float16 e15, simde_float16 e14, simde_float16 e13, simde_float16 e12, simde_float16 e11, simde_float16 e10, simde_float16 e9, simde_float16 e8,
|
||||
simde_float16 e7, simde_float16 e6, simde_float16 e5, simde_float16 e4, simde_float16 e3, simde_float16 e2, simde_float16 e1, simde_float16 e0) {
|
||||
simde__m512h_private r_;
|
||||
|
||||
r_.f16[0] = e0;
|
||||
r_.f16[1] = e1;
|
||||
r_.f16[2] = e2;
|
||||
r_.f16[3] = e3;
|
||||
r_.f16[4] = e4;
|
||||
r_.f16[5] = e5;
|
||||
r_.f16[6] = e6;
|
||||
r_.f16[7] = e7;
|
||||
r_.f16[8] = e8;
|
||||
r_.f16[9] = e9;
|
||||
r_.f16[10] = e10;
|
||||
r_.f16[11] = e11;
|
||||
r_.f16[12] = e12;
|
||||
r_.f16[13] = e13;
|
||||
r_.f16[14] = e14;
|
||||
r_.f16[15] = e15;
|
||||
r_.f16[16] = e16;
|
||||
r_.f16[17] = e17;
|
||||
r_.f16[18] = e18;
|
||||
r_.f16[19] = e19;
|
||||
r_.f16[20] = e20;
|
||||
r_.f16[21] = e21;
|
||||
r_.f16[22] = e22;
|
||||
r_.f16[23] = e23;
|
||||
r_.f16[24] = e24;
|
||||
r_.f16[25] = e25;
|
||||
r_.f16[26] = e26;
|
||||
r_.f16[27] = e27;
|
||||
r_.f16[28] = e28;
|
||||
r_.f16[29] = e29;
|
||||
r_.f16[30] = e30;
|
||||
r_.f16[31] = e31;
|
||||
|
||||
return simde__m512h_from_private(r_);
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512FP16_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_set_ph
|
||||
#define _mm512_set_ph(e31, e30, e29, e28, e27, e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0) \
|
||||
simde_mm512_set_ph(e31, e30, e29, e28, e27, e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)
|
||||
#endif
|
||||
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_SET_H) */
|
||||
@@ -0,0 +1,352 @@
|
||||
/* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Copyright:
|
||||
* 2020 Evan Nemerson <evan@nemerson.com>
|
||||
* 2020 Himanshi Mathur <himanshi18037@iiitd.ac.in>
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512_SET1_H)
|
||||
#define SIMDE_X86_AVX512_SET1_H
|
||||
|
||||
#include "types.h"
|
||||
#include "mov.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_set1_epi8 (int8_t a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_set1_epi8(a);
|
||||
#else
|
||||
simde__m512i_private r_;
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i8) / sizeof(r_.i8[0])) ; i++) {
|
||||
r_.i8[i] = a;
|
||||
}
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_set1_epi8
|
||||
#define _mm512_set1_epi8(a) simde_mm512_set1_epi8(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_set1_epi8(simde__m512i src, simde__mmask64 k, int8_t a) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_mask_set1_epi8(src, k, a);
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi8(src, k, simde_mm512_set1_epi8(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_set1_epi8
|
||||
#define _mm512_mask_set1_epi8(src, k, a) simde_mm512_mask_set1_epi8(src, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_set1_epi8(simde__mmask64 k, int8_t a) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_maskz_set1_epi8(k, a);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_epi8(k, simde_mm512_set1_epi8(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_set1_epi8
|
||||
#define _mm512_maskz_set1_epi8(k, a) simde_mm512_maskz_set1_epi8(k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_set1_epi16 (int16_t a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_set1_epi16(a);
|
||||
#else
|
||||
simde__m512i_private r_;
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i16) / sizeof(r_.i16[0])) ; i++) {
|
||||
r_.i16[i] = a;
|
||||
}
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_set1_epi16
|
||||
#define _mm512_set1_epi16(a) simde_mm512_set1_epi16(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_set1_epi16(simde__m512i src, simde__mmask32 k, int16_t a) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_mask_set1_epi16(src, k, a);
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi16(src, k, simde_mm512_set1_epi16(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_set1_epi16
|
||||
#define _mm512_mask_set1_epi16(src, k, a) simde_mm512_mask_set1_epi16(src, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_set1_epi16(simde__mmask32 k, int16_t a) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_maskz_set1_epi16(k, a);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_epi16(k, simde_mm512_set1_epi16(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_set1_epi16
|
||||
#define _mm512_maskz_set1_epi16(k, a) simde_mm512_maskz_set1_epi16(k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_set1_epi32 (int32_t a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_set1_epi32(a);
|
||||
#else
|
||||
simde__m512i_private r_;
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i32) / sizeof(r_.i32[0])) ; i++) {
|
||||
r_.i32[i] = a;
|
||||
}
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_set1_epi32
|
||||
#define _mm512_set1_epi32(a) simde_mm512_set1_epi32(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_set1_epi32(simde__m512i src, simde__mmask16 k, int32_t a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_set1_epi32(src, k, a);
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi32(src, k, simde_mm512_set1_epi32(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_set1_epi32
|
||||
#define _mm512_mask_set1_epi32(src, k, a) simde_mm512_mask_set1_epi32(src, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_set1_epi32(simde__mmask16 k, int32_t a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_maskz_set1_epi32(k, a);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_epi32(k, simde_mm512_set1_epi32(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_set1_epi32
|
||||
#define _mm512_maskz_set1_epi32(k, a) simde_mm512_maskz_set1_epi32(k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_set1_epi64 (int64_t a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_set1_epi64(a);
|
||||
#else
|
||||
simde__m512i_private r_;
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i64) / sizeof(r_.i64[0])) ; i++) {
|
||||
r_.i64[i] = a;
|
||||
}
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_set1_epi64
|
||||
#define _mm512_set1_epi64(a) simde_mm512_set1_epi64(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_set1_epi64(simde__m512i src, simde__mmask8 k, int64_t a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_set1_epi64(src, k, a);
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi64(src, k, simde_mm512_set1_epi64(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_set1_epi64
|
||||
#define _mm512_mask_set1_epi64(src, k, a) simde_mm512_mask_set1_epi64(src, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_set1_epi64(simde__mmask8 k, int64_t a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_maskz_set1_epi64(k, a);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_epi64(k, simde_mm512_set1_epi64(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_set1_epi64
|
||||
#define _mm512_maskz_set1_epi64(k, a) simde_mm512_maskz_set1_epi64(k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_x_mm512_set1_epu8 (uint8_t a) {
|
||||
simde__m512i_private r_;
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.u8) / sizeof(r_.u8[0])) ; i++) {
|
||||
r_.u8[i] = a;
|
||||
}
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
}
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_x_mm512_set1_epu16 (uint16_t a) {
|
||||
simde__m512i_private r_;
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.u16) / sizeof(r_.u16[0])) ; i++) {
|
||||
r_.u16[i] = a;
|
||||
}
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
}
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_x_mm512_set1_epu32 (uint32_t a) {
|
||||
simde__m512i_private r_;
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.u32) / sizeof(r_.u32[0])) ; i++) {
|
||||
r_.u32[i] = a;
|
||||
}
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
}
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_x_mm512_set1_epu64 (uint64_t a) {
|
||||
simde__m512i_private r_;
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.u64) / sizeof(r_.u64[0])) ; i++) {
|
||||
r_.u64[i] = a;
|
||||
}
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
}
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_set1_ps (simde_float32 a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_set1_ps(a);
|
||||
#else
|
||||
simde__m512_private r_;
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.f32) / sizeof(r_.f32[0])) ; i++) {
|
||||
r_.f32[i] = a;
|
||||
}
|
||||
|
||||
return simde__m512_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_set1_ps
|
||||
#define _mm512_set1_ps(a) simde_mm512_set1_ps(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_set1_pd (simde_float64 a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_set1_pd(a);
|
||||
#else
|
||||
simde__m512d_private r_;
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.f64) / sizeof(r_.f64[0])) ; i++) {
|
||||
r_.f64[i] = a;
|
||||
}
|
||||
|
||||
return simde__m512d_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_set1_pd
|
||||
#define _mm512_set1_pd(a) simde_mm512_set1_pd(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512h
|
||||
simde_mm512_set1_ph (simde_float16 a) {
|
||||
#if defined(SIMDE_X86_AVX512FP16_NATIVE)
|
||||
return _mm512_set1_ph(a);
|
||||
#else
|
||||
simde__m512h_private r_;
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.f16) / sizeof(r_.f16[0])) ; i++) {
|
||||
r_.f16[i] = a;
|
||||
}
|
||||
|
||||
return simde__m512h_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512FP16_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_set1_ph
|
||||
#define _mm512_set1_ph(a) simde_mm512_set1_ph(a)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_SET1_H) */
|
||||
@@ -0,0 +1,140 @@
|
||||
/* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Copyright:
|
||||
* 2020 Evan Nemerson <evan@nemerson.com>
|
||||
* 2020 Hidayat Khan <huk2209@gmail.com>
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512_SET4_H)
|
||||
#define SIMDE_X86_AVX512_SET4_H
|
||||
|
||||
#include "types.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_set4_epi32 (int32_t d, int32_t c, int32_t b, int32_t a) {
|
||||
simde__m512i_private r_;
|
||||
|
||||
r_.i32[ 0] = a;
|
||||
r_.i32[ 1] = b;
|
||||
r_.i32[ 2] = c;
|
||||
r_.i32[ 3] = d;
|
||||
r_.i32[ 4] = a;
|
||||
r_.i32[ 5] = b;
|
||||
r_.i32[ 6] = c;
|
||||
r_.i32[ 7] = d;
|
||||
r_.i32[ 8] = a;
|
||||
r_.i32[ 9] = b;
|
||||
r_.i32[10] = c;
|
||||
r_.i32[11] = d;
|
||||
r_.i32[12] = a;
|
||||
r_.i32[13] = b;
|
||||
r_.i32[14] = c;
|
||||
r_.i32[15] = d;
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_set4_epi32
|
||||
#define _mm512_set4_epi32(d,c,b,a) simde_mm512_set4_epi32(d,c,b,a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_set4_epi64 (int64_t d, int64_t c, int64_t b, int64_t a) {
|
||||
simde__m512i_private r_;
|
||||
|
||||
r_.i64[0] = a;
|
||||
r_.i64[1] = b;
|
||||
r_.i64[2] = c;
|
||||
r_.i64[3] = d;
|
||||
r_.i64[4] = a;
|
||||
r_.i64[5] = b;
|
||||
r_.i64[6] = c;
|
||||
r_.i64[7] = d;
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_set4_epi64
|
||||
#define _mm512_set4_epi64(d,c,b,a) simde_mm512_set4_epi64(d,c,b,a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_set4_ps (simde_float32 d, simde_float32 c, simde_float32 b, simde_float32 a) {
|
||||
simde__m512_private r_;
|
||||
|
||||
r_.f32[ 0] = a;
|
||||
r_.f32[ 1] = b;
|
||||
r_.f32[ 2] = c;
|
||||
r_.f32[ 3] = d;
|
||||
r_.f32[ 4] = a;
|
||||
r_.f32[ 5] = b;
|
||||
r_.f32[ 6] = c;
|
||||
r_.f32[ 7] = d;
|
||||
r_.f32[ 8] = a;
|
||||
r_.f32[ 9] = b;
|
||||
r_.f32[10] = c;
|
||||
r_.f32[11] = d;
|
||||
r_.f32[12] = a;
|
||||
r_.f32[13] = b;
|
||||
r_.f32[14] = c;
|
||||
r_.f32[15] = d;
|
||||
|
||||
return simde__m512_from_private(r_);
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_set4_ps
|
||||
#define _mm512_set4_ps(d,c,b,a) simde_mm512_set4_ps(d,c,b,a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_set4_pd (simde_float64 d, simde_float64 c, simde_float64 b, simde_float64 a) {
|
||||
simde__m512d_private r_;
|
||||
|
||||
r_.f64[0] = a;
|
||||
r_.f64[1] = b;
|
||||
r_.f64[2] = c;
|
||||
r_.f64[3] = d;
|
||||
r_.f64[4] = a;
|
||||
r_.f64[5] = b;
|
||||
r_.f64[6] = c;
|
||||
r_.f64[7] = d;
|
||||
|
||||
return simde__m512d_from_private(r_);
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_set4_pd
|
||||
#define _mm512_set4_pd(d,c,b,a) simde_mm512_set4_pd(d,c,b,a)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_SET4_H) */
|
||||
@@ -0,0 +1,72 @@
|
||||
/* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Copyright:
|
||||
* 2020 Evan Nemerson <evan@nemerson.com>
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512_SETONE_H)
|
||||
#define SIMDE_X86_AVX512_SETONE_H
|
||||
|
||||
#include "types.h"
|
||||
#include "cast.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_x_mm512_setone_si512(void) {
|
||||
simde__m512i_private r_;
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i32f) / sizeof(r_.i32f[0])) ; i++) {
|
||||
r_.i32f[i] = ~HEDLEY_STATIC_CAST(int_fast32_t, 0);
|
||||
}
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
}
|
||||
#define simde_x_mm512_setone_epi32() simde_x_mm512_setone_si512()
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_x_mm512_setone_ps(void) {
|
||||
return simde_mm512_castsi512_ps(simde_x_mm512_setone_si512());
|
||||
}
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_x_mm512_setone_pd(void) {
|
||||
return simde_mm512_castsi512_pd(simde_x_mm512_setone_si512());
|
||||
}
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512h
|
||||
simde_x_mm512_setone_ph(void) {
|
||||
return simde_mm512_castsi512_ph(simde_x_mm512_setone_si512());
|
||||
}
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_SETONE_H) */
|
||||
@@ -0,0 +1,144 @@
|
||||
/* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Copyright:
|
||||
* 2020 Evan Nemerson <evan@nemerson.com>
|
||||
* 2020 Himanshi Mathur <himanshi18037@iiitd.ac.in>
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512_SETR_H)
|
||||
#define SIMDE_X86_AVX512_SETR_H
|
||||
|
||||
#include "types.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_setr_epi32 (int32_t e15, int32_t e14, int32_t e13, int32_t e12, int32_t e11, int32_t e10, int32_t e9, int32_t e8,
|
||||
int32_t e7, int32_t e6, int32_t e5, int32_t e4, int32_t e3, int32_t e2, int32_t e1, int32_t e0) {
|
||||
simde__m512i_private r_;
|
||||
|
||||
r_.i32[ 0] = e15;
|
||||
r_.i32[ 1] = e14;
|
||||
r_.i32[ 2] = e13;
|
||||
r_.i32[ 3] = e12;
|
||||
r_.i32[ 4] = e11;
|
||||
r_.i32[ 5] = e10;
|
||||
r_.i32[ 6] = e9;
|
||||
r_.i32[ 7] = e8;
|
||||
r_.i32[ 8] = e7;
|
||||
r_.i32[ 9] = e6;
|
||||
r_.i32[10] = e5;
|
||||
r_.i32[11] = e4;
|
||||
r_.i32[12] = e3;
|
||||
r_.i32[13] = e2;
|
||||
r_.i32[14] = e1;
|
||||
r_.i32[15] = e0;
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_setr_epi32
|
||||
#define _mm512_setr_epi32(e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0) simde_mm512_setr_epi32(e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_setr_epi64 (int64_t e7, int64_t e6, int64_t e5, int64_t e4, int64_t e3, int64_t e2, int64_t e1, int64_t e0) {
|
||||
simde__m512i_private r_;
|
||||
|
||||
r_.i64[0] = e7;
|
||||
r_.i64[1] = e6;
|
||||
r_.i64[2] = e5;
|
||||
r_.i64[3] = e4;
|
||||
r_.i64[4] = e3;
|
||||
r_.i64[5] = e2;
|
||||
r_.i64[6] = e1;
|
||||
r_.i64[7] = e0;
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_setr_epi64
|
||||
#define _mm512_setr_epi64(e7, e6, e5, e4, e3, e2, e1, e0) simde_mm512_setr_epi64(e7, e6, e5, e4, e3, e2, e1, e0)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_setr_ps (simde_float32 e15, simde_float32 e14, simde_float32 e13, simde_float32 e12,
|
||||
simde_float32 e11, simde_float32 e10, simde_float32 e9, simde_float32 e8,
|
||||
simde_float32 e7, simde_float32 e6, simde_float32 e5, simde_float32 e4,
|
||||
simde_float32 e3, simde_float32 e2, simde_float32 e1, simde_float32 e0) {
|
||||
simde__m512_private r_;
|
||||
|
||||
r_.f32[ 0] = e15;
|
||||
r_.f32[ 1] = e14;
|
||||
r_.f32[ 2] = e13;
|
||||
r_.f32[ 3] = e12;
|
||||
r_.f32[ 4] = e11;
|
||||
r_.f32[ 5] = e10;
|
||||
r_.f32[ 6] = e9;
|
||||
r_.f32[ 7] = e8;
|
||||
r_.f32[ 8] = e7;
|
||||
r_.f32[ 9] = e6;
|
||||
r_.f32[10] = e5;
|
||||
r_.f32[11] = e4;
|
||||
r_.f32[12] = e3;
|
||||
r_.f32[13] = e2;
|
||||
r_.f32[14] = e1;
|
||||
r_.f32[15] = e0;
|
||||
|
||||
return simde__m512_from_private(r_);
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_setr_ps
|
||||
#define _mm512_setr_ps(e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0) simde_mm512_setr_ps(e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_setr_pd (simde_float64 e7, simde_float64 e6, simde_float64 e5, simde_float64 e4, simde_float64 e3, simde_float64 e2, simde_float64 e1, simde_float64 e0) {
|
||||
simde__m512d_private r_;
|
||||
|
||||
r_.f64[0] = e7;
|
||||
r_.f64[1] = e6;
|
||||
r_.f64[2] = e5;
|
||||
r_.f64[3] = e4;
|
||||
r_.f64[4] = e3;
|
||||
r_.f64[5] = e2;
|
||||
r_.f64[6] = e1;
|
||||
r_.f64[7] = e0;
|
||||
|
||||
return simde__m512d_from_private(r_);
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_setr_pd
|
||||
#define _mm512_setr_pd(e7, e6, e5, e4, e3, e2, e1, e0) simde_mm512_setr_pd(e7, e6, e5, e4, e3, e2, e1, e0)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_SETR_H) */
|
||||
@@ -0,0 +1,140 @@
|
||||
/* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Copyright:
|
||||
* 2020 Evan Nemerson <evan@nemerson.com>
|
||||
* 2020 Himanshi Mathur <himanshi18037@iiitd.ac.in>
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512_SETR4_H)
|
||||
#define SIMDE_X86_AVX512_SETR4_H
|
||||
|
||||
#include "types.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_setr4_epi32 (int32_t d, int32_t c, int32_t b, int32_t a) {
|
||||
simde__m512i_private r_;
|
||||
|
||||
r_.i32[ 0] = d;
|
||||
r_.i32[ 1] = c;
|
||||
r_.i32[ 2] = b;
|
||||
r_.i32[ 3] = a;
|
||||
r_.i32[ 4] = d;
|
||||
r_.i32[ 5] = c;
|
||||
r_.i32[ 6] = b;
|
||||
r_.i32[ 7] = a;
|
||||
r_.i32[ 8] = d;
|
||||
r_.i32[ 9] = c;
|
||||
r_.i32[10] = b;
|
||||
r_.i32[11] = a;
|
||||
r_.i32[12] = d;
|
||||
r_.i32[13] = c;
|
||||
r_.i32[14] = b;
|
||||
r_.i32[15] = a;
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_setr4_epi32
|
||||
#define _mm512_setr4_epi32(d,c,b,a) simde_mm512_setr4_epi32(d,c,b,a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_setr4_epi64 (int64_t d, int64_t c, int64_t b, int64_t a) {
|
||||
simde__m512i_private r_;
|
||||
|
||||
r_.i64[0] = d;
|
||||
r_.i64[1] = c;
|
||||
r_.i64[2] = b;
|
||||
r_.i64[3] = a;
|
||||
r_.i64[4] = d;
|
||||
r_.i64[5] = c;
|
||||
r_.i64[6] = b;
|
||||
r_.i64[7] = a;
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_setr4_epi64
|
||||
#define _mm512_setr4_epi64(d,c,b,a) simde_mm512_setr4_epi64(d,c,b,a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_setr4_ps (simde_float32 d, simde_float32 c, simde_float32 b, simde_float32 a) {
|
||||
simde__m512_private r_;
|
||||
|
||||
r_.f32[ 0] = d;
|
||||
r_.f32[ 1] = c;
|
||||
r_.f32[ 2] = b;
|
||||
r_.f32[ 3] = a;
|
||||
r_.f32[ 4] = d;
|
||||
r_.f32[ 5] = c;
|
||||
r_.f32[ 6] = b;
|
||||
r_.f32[ 7] = a;
|
||||
r_.f32[ 8] = d;
|
||||
r_.f32[ 9] = c;
|
||||
r_.f32[10] = b;
|
||||
r_.f32[11] = a;
|
||||
r_.f32[12] = d;
|
||||
r_.f32[13] = c;
|
||||
r_.f32[14] = b;
|
||||
r_.f32[15] = a;
|
||||
|
||||
return simde__m512_from_private(r_);
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_setr4_ps
|
||||
#define _mm512_setr4_ps(d,c,b,a) simde_mm512_setr4_ps(d,c,b,a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_setr4_pd (simde_float64 d, simde_float64 c, simde_float64 b, simde_float64 a) {
|
||||
simde__m512d_private r_;
|
||||
|
||||
r_.f64[0] = d;
|
||||
r_.f64[1] = c;
|
||||
r_.f64[2] = b;
|
||||
r_.f64[3] = a;
|
||||
r_.f64[4] = d;
|
||||
r_.f64[5] = c;
|
||||
r_.f64[6] = b;
|
||||
r_.f64[7] = a;
|
||||
|
||||
return simde__m512d_from_private(r_);
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_setr4_pd
|
||||
#define _mm512_setr4_pd(d,c,b,a) simde_mm512_setr4_pd(d,c,b,a)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_SETR4_H) */
|
||||
@@ -0,0 +1,105 @@
|
||||
/* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Copyright:
|
||||
* 2020 Evan Nemerson <evan@nemerson.com>
|
||||
* 2020 Himanshi Mathur <himanshi18037@iiitd.ac.in>
|
||||
* 2020 Hidayat Khan <huk2209@gmail.com>
|
||||
* 2020 Christopher Moore <moore@free.fr>
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512_SETZERO_H)
|
||||
#define SIMDE_X86_AVX512_SETZERO_H
|
||||
|
||||
#include "types.h"
|
||||
#include "cast.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_setzero_si512(void) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_setzero_si512();
|
||||
#else
|
||||
simde__m512i r;
|
||||
simde_memset(&r, 0, sizeof(r));
|
||||
return r;
|
||||
#endif
|
||||
}
|
||||
#define simde_mm512_setzero_epi32() simde_mm512_setzero_si512()
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_setzero_si512
|
||||
#define _mm512_setzero_si512() simde_mm512_setzero_si512()
|
||||
#undef _mm512_setzero_epi32
|
||||
#define _mm512_setzero_epi32() simde_mm512_setzero_si512()
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_setzero_ps(void) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_setzero_ps();
|
||||
#else
|
||||
return simde_mm512_castsi512_ps(simde_mm512_setzero_si512());
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_setzero_ps
|
||||
#define _mm512_setzero_ps() simde_mm512_setzero_ps()
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_setzero_pd(void) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_setzero_pd();
|
||||
#else
|
||||
return simde_mm512_castsi512_pd(simde_mm512_setzero_si512());
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_setzero_pd
|
||||
#define _mm512_setzero_pd() simde_mm512_setzero_pd()
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512h
|
||||
simde_mm512_setzero_ph(void) {
|
||||
#if defined(SIMDE_X86_AVX512FP16_NATIVE)
|
||||
return _mm512_setzero_ph();
|
||||
#else
|
||||
return simde_mm512_castsi512_ph(simde_mm512_setzero_si512());
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512FP16_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_setzero_ph
|
||||
#define _mm512_setzero_ph() simde_mm512_setzero_ph()
|
||||
#endif
|
||||
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_SETZERO_H) */
|
||||
@@ -0,0 +1,157 @@
|
||||
#if !defined(SIMDE_X86_AVX512_SHLDV_H)
|
||||
#define SIMDE_X86_AVX512_SHLDV_H
|
||||
|
||||
#include "types.h"
|
||||
#include "../avx2.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m128i
|
||||
simde_mm_shldv_epi32(simde__m128i a, simde__m128i b, simde__m128i c) {
|
||||
#if defined(SIMDE_X86_AVX512VBMI2_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
return _mm_shldv_epi32(a, b, c);
|
||||
#else
|
||||
simde__m128i_private r_;
|
||||
|
||||
#if defined(SIMDE_ARM_NEON_A64V8_NATIVE)
|
||||
simde__m128i_private
|
||||
a_ = simde__m128i_to_private(a),
|
||||
b_ = simde__m128i_to_private(b),
|
||||
c_ = simde__m128i_to_private(c);
|
||||
|
||||
uint64x2_t
|
||||
values_lo = vreinterpretq_u64_u32(vzip1q_u32(b_.neon_u32, a_.neon_u32)),
|
||||
values_hi = vreinterpretq_u64_u32(vzip2q_u32(b_.neon_u32, a_.neon_u32));
|
||||
|
||||
int32x4_t count = vandq_s32(c_.neon_i32, vdupq_n_s32(31));
|
||||
|
||||
values_lo = vshlq_u64(values_lo, vmovl_s32(vget_low_s32(count)));
|
||||
values_hi = vshlq_u64(values_hi, vmovl_high_s32(count));
|
||||
|
||||
r_.neon_u32 =
|
||||
vuzp2q_u32(
|
||||
vreinterpretq_u32_u64(values_lo),
|
||||
vreinterpretq_u32_u64(values_hi)
|
||||
);
|
||||
#elif defined(SIMDE_X86_AVX2_NATIVE)
|
||||
simde__m256i
|
||||
tmp1,
|
||||
lo =
|
||||
simde_mm256_castps_si256(
|
||||
simde_mm256_unpacklo_ps(
|
||||
simde_mm256_castsi256_ps(simde_mm256_castsi128_si256(b)),
|
||||
simde_mm256_castsi256_ps(simde_mm256_castsi128_si256(a))
|
||||
)
|
||||
),
|
||||
hi =
|
||||
simde_mm256_castps_si256(
|
||||
simde_mm256_unpackhi_ps(
|
||||
simde_mm256_castsi256_ps(simde_mm256_castsi128_si256(b)),
|
||||
simde_mm256_castsi256_ps(simde_mm256_castsi128_si256(a))
|
||||
)
|
||||
),
|
||||
tmp2 =
|
||||
simde_mm256_castpd_si256(
|
||||
simde_mm256_permute2f128_pd(
|
||||
simde_mm256_castsi256_pd(lo),
|
||||
simde_mm256_castsi256_pd(hi),
|
||||
32
|
||||
)
|
||||
);
|
||||
|
||||
tmp2 =
|
||||
simde_mm256_sllv_epi64(
|
||||
tmp2,
|
||||
simde_mm256_cvtepi32_epi64(
|
||||
simde_mm_and_si128(
|
||||
c,
|
||||
simde_mm_set1_epi32(31)
|
||||
)
|
||||
)
|
||||
);
|
||||
|
||||
tmp1 =
|
||||
simde_mm256_castpd_si256(
|
||||
simde_mm256_permute2f128_pd(
|
||||
simde_mm256_castsi256_pd(tmp2),
|
||||
simde_mm256_castsi256_pd(tmp2),
|
||||
1
|
||||
)
|
||||
);
|
||||
|
||||
r_ =
|
||||
simde__m128i_to_private(
|
||||
simde_mm256_castsi256_si128(
|
||||
simde_mm256_castps_si256(
|
||||
simde_mm256_shuffle_ps(
|
||||
simde_mm256_castsi256_ps(tmp2),
|
||||
simde_mm256_castsi256_ps(tmp1),
|
||||
221
|
||||
)
|
||||
)
|
||||
)
|
||||
);
|
||||
#elif defined(SIMDE_X86_SSE2_NATIVE)
|
||||
simde__m128i_private
|
||||
c_ = simde__m128i_to_private(c),
|
||||
lo = simde__m128i_to_private(simde_mm_unpacklo_epi32(b, a)),
|
||||
hi = simde__m128i_to_private(simde_mm_unpackhi_epi32(b, a));
|
||||
|
||||
size_t halfway = (sizeof(r_.u32) / sizeof(r_.u32[0]) / 2);
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < halfway ; i++) {
|
||||
lo.u64[i] <<= (c_.u32[i] & 31);
|
||||
hi.u64[i] <<= (c_.u32[halfway + i] & 31);
|
||||
}
|
||||
|
||||
r_ =
|
||||
simde__m128i_to_private(
|
||||
simde_mm_castps_si128(
|
||||
simde_mm_shuffle_ps(
|
||||
simde_mm_castsi128_ps(simde__m128i_from_private(lo)),
|
||||
simde_mm_castsi128_ps(simde__m128i_from_private(hi)),
|
||||
221)
|
||||
)
|
||||
);
|
||||
#elif defined(SIMDE_VECTOR_SUBSCRIPT_SCALAR) && defined(SIMDE_SHUFFLE_VECTOR_) && defined(SIMDE_CONVERT_VECTOR_) && (SIMDE_ENDIAN_ORDER == SIMDE_ENDIAN_LITTLE)
|
||||
simde__m128i_private
|
||||
c_ = simde__m128i_to_private(c);
|
||||
simde__m256i_private
|
||||
a_ = simde__m256i_to_private(simde_mm256_castsi128_si256(a)),
|
||||
b_ = simde__m256i_to_private(simde_mm256_castsi128_si256(b)),
|
||||
tmp1,
|
||||
tmp2;
|
||||
|
||||
tmp1.u64 = HEDLEY_REINTERPRET_CAST(__typeof__(tmp1.u64), SIMDE_SHUFFLE_VECTOR_(32, 32, b_.i32, a_.i32, 0, 8, 1, 9, 2, 10, 3, 11));
|
||||
SIMDE_CONVERT_VECTOR_(tmp2.u64, c_.u32);
|
||||
|
||||
tmp1.u64 <<= (tmp2.u64 & 31);
|
||||
|
||||
r_.i32 = SIMDE_SHUFFLE_VECTOR_(32, 16, tmp1.m128i_private[0].i32, tmp1.m128i_private[1].i32, 1, 3, 5, 7);
|
||||
#else
|
||||
simde__m128i_private
|
||||
a_ = simde__m128i_to_private(a),
|
||||
b_ = simde__m128i_to_private(b),
|
||||
c_ = simde__m128i_to_private(c);
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.u32) / sizeof(r_.u32[0])) ; i++) {
|
||||
r_.u32[i] = HEDLEY_STATIC_CAST(uint32_t, (((HEDLEY_STATIC_CAST(uint64_t, a_.u32[i]) << 32) | b_.u32[i]) << (c_.u32[i] & 31)) >> 32);
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m128i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512VBMI2_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm_shldv_epi32
|
||||
#define _mm_shldv_epi32(a, b, c) simde_mm_shldv_epi32(a, b, c)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_SHLDV_H) */
|
||||
@@ -0,0 +1,417 @@
|
||||
/* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Copyright:
|
||||
* 2020 Evan Nemerson <evan@nemerson.com>
|
||||
* 2020 Christopher Moore <moore@free.fr>
|
||||
* 2023 Michael R. Crusoe <crusoe@debian.org>
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512_SHUFFLE_H)
|
||||
#define SIMDE_X86_AVX512_SHUFFLE_H
|
||||
|
||||
#include "types.h"
|
||||
#include "../avx2.h"
|
||||
#include "mov.h"
|
||||
#include "extract.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_shuffle_epi8 (simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_shuffle_epi8(a, b);
|
||||
#else
|
||||
simde__m512i_private
|
||||
r_,
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b);
|
||||
|
||||
#if SIMDE_NATURAL_VECTOR_SIZE_LE(256)
|
||||
for (size_t i = 0 ; i < (sizeof(a_.m256i) / sizeof(a_.m256i[0])) ; i++) {
|
||||
r_.m256i[i] = simde_mm256_shuffle_epi8(a_.m256i[i], b_.m256i[i]);
|
||||
}
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i8) / sizeof(r_.i8[0])) ; i++) {
|
||||
r_.i8[i] = (b_.i8[i] & 0x80) ? 0 : a_.i8[(b_.i8[i] & 0x0f) + (i & 0x30)];
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_shuffle_epi8
|
||||
#define _mm512_shuffle_epi8(a, b) simde_mm512_shuffle_epi8(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_shuffle_epi8 (simde__m512i src, simde__mmask64 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_mask_shuffle_epi8(src, k, a, b);
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi8(src, k, simde_mm512_shuffle_epi8(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_shuffle_epi8
|
||||
#define _mm512_mask_shuffle_epi8(src, k, a, b) simde_mm512_mask_shuffle_epi8(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_shuffle_epi8 (simde__mmask64 k, simde__m512i a, simde__m512i b) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_maskz_shuffle_epi8(k, a, b);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_epi8(k, simde_mm512_shuffle_epi8(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_shuffle_epi8
|
||||
#define _mm512_maskz_shuffle_epi8(k, a, b) simde_mm512_maskz_shuffle_epi8(k, a, b)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
# define simde_mm512_shuffle_epi32(a, imm8) _mm512_shuffle_epi32((a), (imm8))
|
||||
#elif defined(SIMDE_STATEMENT_EXPR_)
|
||||
# define simde_mm512_shuffle_epi32(a, imm8) SIMDE_STATEMENT_EXPR_(({ \
|
||||
simde__m512i_private simde_mm512_shuffle_epi32_r_, \
|
||||
simde_mm512_shuffle_epi32_a_ = simde__m512i_to_private((a)); \
|
||||
simde_mm512_shuffle_epi32_r_.m128i[0] = simde_mm_shuffle_epi32( \
|
||||
simde_mm512_shuffle_epi32_a_.m128i[0], (imm8)); \
|
||||
simde_mm512_shuffle_epi32_r_.m128i[1] = simde_mm_shuffle_epi32( \
|
||||
simde_mm512_shuffle_epi32_a_.m128i[1], (imm8)); \
|
||||
simde_mm512_shuffle_epi32_r_.m128i[2] = simde_mm_shuffle_epi32( \
|
||||
simde_mm512_shuffle_epi32_a_.m128i[2], (imm8)); \
|
||||
simde_mm512_shuffle_epi32_r_.m128i[3] = simde_mm_shuffle_epi32( \
|
||||
simde_mm512_shuffle_epi32_a_.m128i[3], (imm8)); \
|
||||
simde__m512i_from_private(simde_mm512_shuffle_epi32_r_); \
|
||||
}))
|
||||
#else
|
||||
# define simde_mm512_shuffle_epi32(a, imm8) \
|
||||
simde_x_mm512_set_m128i( \
|
||||
simde_mm_shuffle_epi32(simde_mm512_extracti32x4_epi32(a, 3), (imm8)), \
|
||||
simde_mm_shuffle_epi32(simde_mm512_extracti32x4_epi32(a, 2), (imm8)), \
|
||||
simde_mm_shuffle_epi32(simde_mm512_extracti32x4_epi32(a, 1), (imm8)), \
|
||||
simde_mm_shuffle_epi32(simde_mm512_extracti32x4_epi32(a, 0), (imm8)))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_shuffle_epi32
|
||||
#define _mm512_shuffle_epi32(a, imm8) simde_mm512_shuffle_epi32((a), (imm8))
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m256i
|
||||
simde_mm256_shuffle_i32x4 (simde__m256i a, simde__m256i b, const int imm8)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 3) {
|
||||
simde__m256i_private
|
||||
r_,
|
||||
a_ = simde__m256i_to_private(a),
|
||||
b_ = simde__m256i_to_private(b);
|
||||
|
||||
r_.m128i[0] = a_.m128i[ imm8 & 1];
|
||||
r_.m128i[1] = b_.m128i[(imm8 >> 1) & 1];
|
||||
|
||||
return simde__m256i_from_private(r_);
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
#define simde_mm256_shuffle_i32x4(a, b, imm8) _mm256_shuffle_i32x4(a, b, imm8)
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_shuffle_i32x4
|
||||
#define _mm256_shuffle_i32x4(a, b, imm8) simde_mm256_shuffle_i32x4(a, b, imm8)
|
||||
#endif
|
||||
|
||||
#define simde_mm256_maskz_shuffle_i32x4(k, a, b, imm8) simde_mm256_maskz_mov_epi32(k, simde_mm256_shuffle_i32x4(a, b, imm8))
|
||||
#define simde_mm256_mask_shuffle_i32x4(src, k, a, b, imm8) simde_mm256_mask_mov_epi32(src, k, simde_mm256_shuffle_i32x4(a, b, imm8))
|
||||
|
||||
#define simde_mm256_shuffle_f32x4(a, b, imm8) simde_mm256_castsi256_ps(simde_mm256_shuffle_i32x4(simde_mm256_castps_si256(a), simde_mm256_castps_si256(b), imm8))
|
||||
#define simde_mm256_maskz_shuffle_f32x4(k, a, b, imm8) simde_mm256_maskz_mov_ps(k, simde_mm256_shuffle_f32x4(a, b, imm8))
|
||||
#define simde_mm256_mask_shuffle_f32x4(src, k, a, b, imm8) simde_mm256_mask_mov_ps(src, k, simde_mm256_shuffle_f32x4(a, b, imm8))
|
||||
|
||||
#define simde_mm256_shuffle_i64x2(a, b, imm8) simde_mm256_shuffle_i32x4(a, b, imm8)
|
||||
#define simde_mm256_maskz_shuffle_i64x2(k, a, b, imm8) simde_mm256_maskz_mov_epi64(k, simde_mm256_shuffle_i64x2(a, b, imm8))
|
||||
#define simde_mm256_mask_shuffle_i64x2(src, k, a, b, imm8) simde_mm256_mask_mov_epi64(src, k, simde_mm256_shuffle_i64x2(a, b, imm8))
|
||||
|
||||
#define simde_mm256_shuffle_f64x2(a, b, imm8) simde_mm256_castsi256_pd(simde_mm256_shuffle_i64x2(simde_mm256_castpd_si256(a), simde_mm256_castpd_si256(b), imm8))
|
||||
#define simde_mm256_maskz_shuffle_f64x2(k, a, b, imm8) simde_mm256_maskz_mov_pd(k, simde_mm256_shuffle_f64x2(a, b, imm8))
|
||||
#define simde_mm256_mask_shuffle_f64x2(src, k, a, b, imm8) simde_mm256_mask_mov_pd(src, k, simde_mm256_shuffle_f64x2(a, b, imm8))
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES) && defined(SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm256_maskz_shuffle_i32x4
|
||||
#undef _mm256_mask_shuffle_i32x4
|
||||
#define _mm256_maskz_shuffle_i32x4(k, a, b, imm8) simde_mm256_maskz_shuffle_i32x4(k, a, b, imm8)
|
||||
#define _mm256_mask_shuffle_i32x4(src, k, a, b, imm8) simde_mm256_mask_shuffle_i32x4(src, k, a, b, imm8)
|
||||
|
||||
#undef _mm256_shuffle_f32x4
|
||||
#undef _mm256_maskz_shuffle_f32x4
|
||||
#undef _mm256_mask_shuffle_f32x4
|
||||
#define _mm256_shuffle_f32x4(a, b, imm8) simde_mm256_shuffle_f32x4(a, b, imm8)
|
||||
#define _mm256_maskz_shuffle_f32x4(k, a, b, imm8) simde_mm256_maskz_shuffle_f32x4(k, a, b, imm8)
|
||||
#define _mm256_mask_shuffle_f32x4(src, k, a, b, imm8) simde_mm256_mask_shuffle_f32x4(src, k, a, b, imm8)
|
||||
|
||||
#undef _mm256_shuffle_i64x2
|
||||
#undef _mm256_maskz_shuffle_i64x2
|
||||
#undef _mm256_mask_shuffle_i64x2
|
||||
#define _mm256_shuffle_i64x2(a, b, imm8) simde_mm256_shuffle_i64x2(a, b, imm8)
|
||||
#define _mm256_maskz_shuffle_i64x2(k, a, b, imm8) simde_mm256_maskz_shuffle_i64x2(k, a, b, imm8)
|
||||
#define _mm256_mask_shuffle_i64x2(src, k, a, b, imm8) simde_mm256_mask_shuffle_i64x2(src, k, a, b, imm8)
|
||||
|
||||
#undef _mm256_shuffle_f64x2
|
||||
#undef _mm256_maskz_shuffle_f64x2
|
||||
#undef _mm256_mask_shuffle_f64x2
|
||||
#define _mm256_shuffle_f64x2(a, b, imm8) simde_mm256_shuffle_f64x2(a, b, imm8)
|
||||
#define _mm256_maskz_shuffle_f64x2(k, a, b, imm8) simde_mm256_maskz_shuffle_f64x2(k, a, b, imm8)
|
||||
#define _mm256_mask_shuffle_f64x2(src, k, a, b, imm8) simde_mm256_mask_shuffle_f64x2(src, k, a, b, imm8)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_shuffle_i32x4 (simde__m512i a, simde__m512i b, const int imm8)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 255) {
|
||||
simde__m512i_private
|
||||
r_,
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b);
|
||||
|
||||
r_.m128i[0] = a_.m128i[ imm8 & 3];
|
||||
r_.m128i[1] = a_.m128i[(imm8 >> 2) & 3];
|
||||
r_.m128i[2] = b_.m128i[(imm8 >> 4) & 3];
|
||||
r_.m128i[3] = b_.m128i[(imm8 >> 6) & 3];
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define simde_mm512_shuffle_i32x4(a, b, imm8) _mm512_shuffle_i32x4(a, b, imm8)
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_shuffle_i32x4
|
||||
#define _mm512_shuffle_i32x4(a, b, imm8) simde_mm512_shuffle_i32x4(a, b, imm8)
|
||||
#endif
|
||||
|
||||
#define simde_mm512_maskz_shuffle_i32x4(k, a, b, imm8) simde_mm512_maskz_mov_epi32(k, simde_mm512_shuffle_i32x4(a, b, imm8))
|
||||
#define simde_mm512_mask_shuffle_i32x4(src, k, a, b, imm8) simde_mm512_mask_mov_epi32(src, k, simde_mm512_shuffle_i32x4(a, b, imm8))
|
||||
|
||||
#define simde_mm512_shuffle_f32x4(a, b, imm8) simde_mm512_castsi512_ps(simde_mm512_shuffle_i32x4(simde_mm512_castps_si512(a), simde_mm512_castps_si512(b), imm8))
|
||||
#define simde_mm512_maskz_shuffle_f32x4(k, a, b, imm8) simde_mm512_maskz_mov_ps(k, simde_mm512_shuffle_f32x4(a, b, imm8))
|
||||
#define simde_mm512_mask_shuffle_f32x4(src, k, a, b, imm8) simde_mm512_mask_mov_ps(src, k, simde_mm512_shuffle_f32x4(a, b, imm8))
|
||||
|
||||
#define simde_mm512_shuffle_i64x2(a, b, imm8) simde_mm512_shuffle_i32x4(a, b, imm8)
|
||||
#define simde_mm512_maskz_shuffle_i64x2(k, a, b, imm8) simde_mm512_maskz_mov_epi64(k, simde_mm512_shuffle_i64x2(a, b, imm8))
|
||||
#define simde_mm512_mask_shuffle_i64x2(src, k, a, b, imm8) simde_mm512_mask_mov_epi64(src, k, simde_mm512_shuffle_i64x2(a, b, imm8))
|
||||
|
||||
#define simde_mm512_shuffle_f64x2(a, b, imm8) simde_mm512_castsi512_pd(simde_mm512_shuffle_i64x2(simde_mm512_castpd_si512(a), simde_mm512_castpd_si512(b), imm8))
|
||||
#define simde_mm512_maskz_shuffle_f64x2(k, a, b, imm8) simde_mm512_maskz_mov_pd(k, simde_mm512_shuffle_f64x2(a, b, imm8))
|
||||
#define simde_mm512_mask_shuffle_f64x2(src, k, a, b, imm8) simde_mm512_mask_mov_pd(src, k, simde_mm512_shuffle_f64x2(a, b, imm8))
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_shuffle_i32x4
|
||||
#undef _mm512_mask_shuffle_i32x4
|
||||
#define _mm512_maskz_shuffle_i32x4(k, a, b, imm8) simde_mm512_maskz_shuffle_i32x4(k, a, b, imm8)
|
||||
#define _mm512_mask_shuffle_i32x4(src, k, a, b, imm8) simde_mm512_mask_shuffle_i32x4(src, k, a, b, imm8)
|
||||
|
||||
#undef _mm512_shuffle_f32x4
|
||||
#undef _mm512_maskz_shuffle_f32x4
|
||||
#undef _mm512_mask_shuffle_f32x4
|
||||
#define _mm512_shuffle_f32x4(a, b, imm8) simde_mm512_shuffle_f32x4(a, b, imm8)
|
||||
#define _mm512_maskz_shuffle_f32x4(k, a, b, imm8) simde_mm512_maskz_shuffle_f32x4(k, a, b, imm8)
|
||||
#define _mm512_mask_shuffle_f32x4(src, k, a, b, imm8) simde_mm512_mask_shuffle_f32x4(src, k, a, b, imm8)
|
||||
|
||||
#undef _mm512_shuffle_i64x2
|
||||
#undef _mm512_maskz_shuffle_i64x2
|
||||
#undef _mm512_mask_shuffle_i64x2
|
||||
#define _mm512_shuffle_i64x2(a, b, imm8) simde_mm512_shuffle_i64x2(a, b, imm8)
|
||||
#define _mm512_maskz_shuffle_i64x2(k, a, b, imm8) simde_mm512_maskz_shuffle_i64x2(k, a, b, imm8)
|
||||
#define _mm512_mask_shuffle_i64x2(src, k, a, b, imm8) simde_mm512_mask_shuffle_i64x2(src, k, a, b, imm8)
|
||||
|
||||
#undef _mm512_shuffle_f64x2
|
||||
#undef _mm512_maskz_shuffle_f64x2
|
||||
#undef _mm512_mask_shuffle_f64x2
|
||||
#define _mm512_shuffle_f64x2(a, b, imm8) simde_mm512_shuffle_f64x2(a, b, imm8)
|
||||
#define _mm512_maskz_shuffle_f64x2(k, a, b, imm8) simde_mm512_maskz_shuffle_f64x2(k, a, b, imm8)
|
||||
#define _mm512_mask_shuffle_f64x2(src, k, a, b, imm8) simde_mm512_mask_shuffle_f64x2(src, k, a, b, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define simde_mm512_shuffle_ps(a, b, imm8) _mm512_shuffle_ps(a, b, imm8)
|
||||
#elif SIMDE_NATURAL_VECTOR_SIZE_LE(256) && defined(SIMDE_STATEMENT_EXPR_)
|
||||
#define simde_mm512_shuffle_ps(a, b, imm8) SIMDE_STATEMENT_EXPR_(({ \
|
||||
simde__m512_private \
|
||||
simde_mm512_shuffle_ps_a_ = simde__m512_to_private(a), \
|
||||
simde_mm512_shuffle_ps_b_ = simde__m512_to_private(b); \
|
||||
\
|
||||
simde_mm512_shuffle_ps_a_.m256[0] = simde_mm256_shuffle_ps(simde_mm512_shuffle_ps_a_.m256[0], simde_mm512_shuffle_ps_b_.m256[0], imm8); \
|
||||
simde_mm512_shuffle_ps_a_.m256[1] = simde_mm256_shuffle_ps(simde_mm512_shuffle_ps_a_.m256[1], simde_mm512_shuffle_ps_b_.m256[1], imm8); \
|
||||
\
|
||||
simde__m512_from_private(simde_mm512_shuffle_ps_a_); \
|
||||
}))
|
||||
#elif defined(SIMDE_SHUFFLE_VECTOR_) && defined(SIMDE_STATEMENT_EXPR_)
|
||||
#define simde_mm512_shuffle_ps(a, b, imm8) SIMDE_STATEMENT_EXPR_(({ \
|
||||
simde__m512_private \
|
||||
simde_mm512_shuffle_ps_a_ = simde__m512_to_private(a), \
|
||||
simde_mm512_shuffle_ps_b_ = simde__m512_to_private(b); \
|
||||
\
|
||||
simde_mm512_shuffle_ps_a_.f32 = \
|
||||
SIMDE_SHUFFLE_VECTOR_( \
|
||||
32, 64, \
|
||||
simde_mm512_shuffle_ps_a_.f32, \
|
||||
simde_mm512_shuffle_ps_b_.f32, \
|
||||
(((imm8) ) & 3), \
|
||||
(((imm8) >> 2) & 3), \
|
||||
(((imm8) >> 4) & 3) + 16, \
|
||||
(((imm8) >> 6) & 3) + 16, \
|
||||
(((imm8) ) & 3) + 4, \
|
||||
(((imm8) >> 2) & 3) + 4, \
|
||||
(((imm8) >> 4) & 3) + 20, \
|
||||
(((imm8) >> 6) & 3) + 20, \
|
||||
(((imm8) ) & 3) + 8, \
|
||||
(((imm8) >> 2) & 3) + 8, \
|
||||
(((imm8) >> 4) & 3) + 24, \
|
||||
(((imm8) >> 6) & 3) + 24, \
|
||||
(((imm8) ) & 3) + 12, \
|
||||
(((imm8) >> 2) & 3) + 12, \
|
||||
(((imm8) >> 4) & 3) + 28, \
|
||||
(((imm8) >> 6) & 3) + 28 \
|
||||
); \
|
||||
\
|
||||
simde__m512_from_private(simde_mm512_shuffle_ps_a_); \
|
||||
}))
|
||||
#else
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_shuffle_ps(simde__m512 a, simde__m512 b, int imm8)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE (imm8, 0, 255) {
|
||||
simde__m512_private
|
||||
r_,
|
||||
a_ = simde__m512_to_private(a),
|
||||
b_ = simde__m512_to_private(b);
|
||||
|
||||
const size_t halfway = (sizeof(r_.m128_private[0].f32) / sizeof(r_.m128_private[0].f32[0]) / 2);
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m128_private) / sizeof(r_.m128_private[0])) ; i++) {
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t j = 0 ; j < halfway ; j++) {
|
||||
r_.m128_private[i].f32[j] = a_.m128_private[i].f32[(imm8 >> (j * 2)) & 3];
|
||||
r_.m128_private[i].f32[halfway + j] = b_.m128_private[i].f32[(imm8 >> ((halfway + j) * 2)) & 3];
|
||||
}
|
||||
}
|
||||
|
||||
return simde__m512_from_private(r_);
|
||||
}
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_shuffle_ps
|
||||
#define _mm512_shuffle_ps(a, b, imm8) simde_mm512_shuffle_ps(a, b, imm8)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_shuffle_pd(simde__m512d a, simde__m512d b, int imm8)
|
||||
SIMDE_REQUIRE_CONSTANT_RANGE (imm8, 0, 255) {
|
||||
simde__m512d_private
|
||||
r_,
|
||||
a_ = simde__m512d_to_private(a),
|
||||
b_ = simde__m512d_to_private(b);
|
||||
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < ((sizeof(r_.f64) / sizeof(r_.f64[0])) / 2) ; i++) {
|
||||
r_.f64[i * 2] = (imm8 & ( 1 << (i*2) )) ? a_.f64[i * 2 + 1]: a_.f64[i * 2];
|
||||
r_.f64[i * 2 + 1] = (imm8 & ( 1 << (i*2+1) )) ? b_.f64[i * 2 + 1]: b_.f64[i * 2];
|
||||
}
|
||||
|
||||
return simde__m512d_from_private(r_);
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define simde_mm512_shuffle_pd(a, b, imm8) _mm512_shuffle_pd(a, b, imm8)
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_shuffle_pd
|
||||
#define _mm512_shuffle_pd(a, b, imm8) simde_mm512_shuffle_pd(a, b, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
# define simde_mm512_shufflehi_epi16(a, imm8) _mm512_shufflehi_epi16(a, imm8)
|
||||
#elif defined(SIMDE_STATEMENT_EXPR_)
|
||||
# define simde_mm512_shufflehi_epi16(a, imm8) SIMDE_STATEMENT_EXPR_(({ \
|
||||
simde__m512i_private simde_mm512_shufflehi_epi16_r_, \
|
||||
simde_mm512_shufflehi_epi16_a_ = simde__m512i_to_private((a)); \
|
||||
simde_mm512_shufflehi_epi16_r_.m128i[0] = simde_mm_shufflehi_epi16( \
|
||||
simde_mm512_shufflehi_epi16_a_.m128i[0], (imm8)); \
|
||||
simde_mm512_shufflehi_epi16_r_.m128i[1] = simde_mm_shufflehi_epi16( \
|
||||
simde_mm512_shufflehi_epi16_a_.m128i[1], (imm8)); \
|
||||
simde_mm512_shufflehi_epi16_r_.m128i[2] = simde_mm_shufflehi_epi16( \
|
||||
simde_mm512_shufflehi_epi16_a_.m128i[2], (imm8)); \
|
||||
simde_mm512_shufflehi_epi16_r_.m128i[3] = simde_mm_shufflehi_epi16( \
|
||||
simde_mm512_shufflehi_epi16_a_.m128i[3], (imm8)); \
|
||||
simde__m512i_from_private(simde_mm512_shufflehi_epi16_r_); \
|
||||
}))
|
||||
#else
|
||||
# define simde_mm512_shufflehi_epi16(a, imm8) \
|
||||
simde_x_mm512_set_m128i( \
|
||||
simde_mm_shufflehi_epi16(simde_mm512_extracti32x4_epi32((a), 3), (imm8)), \
|
||||
simde_mm_shufflehi_epi16(simde_mm512_extracti32x4_epi32((a), 2), (imm8)), \
|
||||
simde_mm_shufflehi_epi16(simde_mm512_extracti32x4_epi32((a), 1), (imm8)), \
|
||||
simde_mm_shufflehi_epi16(simde_mm512_extracti32x4_epi32((a), 0), (imm8)))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_shufflehi_epi16
|
||||
#define _mm512_shufflehi_epi16(a, imm8) simde_mm512_shufflehi_epi16(a, imm8)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
# define simde_mm512_shufflelo_epi16(a, imm8) _mm512_shufflelo_epi16(a, imm8)
|
||||
#elif defined(SIMDE_STATEMENT_EXPR_)
|
||||
# define simde_mm512_shufflelo_epi16(a, imm8) SIMDE_STATEMENT_EXPR_(({ \
|
||||
simde__m512i_private simde_mm512_shufflelo_epi16_r_, \
|
||||
simde_mm512_shufflelo_epi16_a_ = simde__m512i_to_private((a)); \
|
||||
simde_mm512_shufflelo_epi16_r_.m128i[0] = simde_mm_shufflelo_epi16( \
|
||||
simde_mm512_shufflelo_epi16_a_.m128i[0], (imm8)); \
|
||||
simde_mm512_shufflelo_epi16_r_.m128i[1] = simde_mm_shufflelo_epi16( \
|
||||
simde_mm512_shufflelo_epi16_a_.m128i[1], (imm8)); \
|
||||
simde_mm512_shufflelo_epi16_r_.m128i[2] = simde_mm_shufflelo_epi16( \
|
||||
simde_mm512_shufflelo_epi16_a_.m128i[2], (imm8)); \
|
||||
simde_mm512_shufflelo_epi16_r_.m128i[3] = simde_mm_shufflelo_epi16( \
|
||||
simde_mm512_shufflelo_epi16_a_.m128i[3], (imm8)); \
|
||||
simde__m512i_from_private(simde_mm512_shufflelo_epi16_r_); \
|
||||
}))
|
||||
#else
|
||||
# define simde_mm512_shufflelo_epi16(a, imm8) \
|
||||
simde_x_mm512_set_m128i( \
|
||||
simde_mm_shufflelo_epi16(simde_mm512_extracti32x4_epi32((a), 3), (imm8)), \
|
||||
simde_mm_shufflelo_epi16(simde_mm512_extracti32x4_epi32((a), 2), (imm8)), \
|
||||
simde_mm_shufflelo_epi16(simde_mm512_extracti32x4_epi32((a), 1), (imm8)), \
|
||||
simde_mm_shufflelo_epi16(simde_mm512_extracti32x4_epi32((a), 0), (imm8)))
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_shufflelo_epi16
|
||||
#define _mm512_shufflelo_epi16(a, imm8) simde_mm512_shufflelo_epi16(a, imm8)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_SHUFFLE_H) */
|
||||
@@ -0,0 +1,247 @@
|
||||
/* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Copyright:
|
||||
* 2020 Evan Nemerson <evan@nemerson.com>
|
||||
* 2020 Hidayat Khan <huk2209@gmail.com>
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512_SLL_H)
|
||||
#define SIMDE_X86_AVX512_SLL_H
|
||||
|
||||
#include "types.h"
|
||||
#include "../avx2.h"
|
||||
#include "mov.h"
|
||||
#include "setzero.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_sll_epi16 (simde__m512i a, simde__m128i count) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_sll_epi16(a, count);
|
||||
#else
|
||||
simde__m512i_private
|
||||
r_,
|
||||
a_ = simde__m512i_to_private(a);
|
||||
|
||||
#if SIMDE_NATURAL_VECTOR_SIZE_LE(256)
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m256i) / sizeof(r_.m256i[0])) ; i++) {
|
||||
r_.m256i[i] = simde_mm256_sll_epi16(a_.m256i[i], count);
|
||||
}
|
||||
#else
|
||||
simde__m128i_private
|
||||
count_ = simde__m128i_to_private(count);
|
||||
|
||||
uint64_t shift = HEDLEY_STATIC_CAST(uint64_t, count_.i64[0]);
|
||||
if (shift > 15)
|
||||
return simde_mm512_setzero_si512();
|
||||
|
||||
#if defined(SIMDE_VECTOR_SUBSCRIPT_SCALAR)
|
||||
r_.i16 = a_.i16 << HEDLEY_STATIC_CAST(int16_t, shift);
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i16) / sizeof(r_.i16[0])) ; i++) {
|
||||
r_.i16[i] = HEDLEY_STATIC_CAST(int16_t, a_.i16[i] << (shift));
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_sll_epi16
|
||||
#define _mm512_sll_epi16(a, count) simde_mm512_sll_epi16(a, count)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_sll_epi16 (simde__m512i src, simde__mmask32 k, simde__m512i a, simde__m128i count) {
|
||||
#if defined(SIMDE_X86_AVX51BW_NATIVE)
|
||||
return _mm512_mask_sll_epi16(src, k, a, count);
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi16(src, k, simde_mm512_sll_epi16(a, count));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_sll_epi16
|
||||
#define _mm512_mask_sll_epi16(src, k, a, count) simde_mm512_mask_sll_epi16(src, k, a, count)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_sll_epi16 (simde__mmask32 k, simde__m512i a, simde__m128i count) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_maskz_sll_epi16(k, a, count);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_epi16(k, simde_mm512_sll_epi16(a, count));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_sll_epi16
|
||||
#define _mm512_maskz_sll_epi16(k, a, count) simde_mm512_maskz_sll_epi16(k, a, count)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_sll_epi32 (simde__m512i a, simde__m128i count) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_sll_epi32(a, count);
|
||||
#else
|
||||
simde__m512i_private
|
||||
r_,
|
||||
a_ = simde__m512i_to_private(a);
|
||||
|
||||
#if SIMDE_NATURAL_VECTOR_SIZE_LE(256)
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m256i) / sizeof(r_.m256i[0])) ; i++) {
|
||||
r_.m256i[i] = simde_mm256_sll_epi32(a_.m256i[i], count);
|
||||
}
|
||||
#else
|
||||
simde__m128i_private
|
||||
count_ = simde__m128i_to_private(count);
|
||||
|
||||
uint64_t shift = HEDLEY_STATIC_CAST(uint64_t, count_.i64[0]);
|
||||
if (shift > 31)
|
||||
return simde_mm512_setzero_si512();
|
||||
|
||||
#if defined(SIMDE_VECTOR_SUBSCRIPT_SCALAR)
|
||||
r_.i32 = a_.i32 << HEDLEY_STATIC_CAST(int32_t, shift);
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i32) / sizeof(r_.i32[0])) ; i++) {
|
||||
r_.i32[i] = HEDLEY_STATIC_CAST(int32_t, a_.i32[i] << (shift));
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_sll_epi32
|
||||
#define _mm512_sll_epi32(a, count) simde_mm512_sll_epi32(a, count)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_sll_epi32(simde__m512i src, simde__mmask16 k, simde__m512i a, simde__m128i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_sll_epi32(src, k, a, b);
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi32(src, k, simde_mm512_sll_epi32(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_sll_epi32
|
||||
#define _mm512_mask_sll_epi32(src, k, a, b) simde_mm512_mask_sll_epi32(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_sll_epi32(simde__mmask16 k, simde__m512i a, simde__m128i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_maskz_sll_epi32(k, a, b);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_epi32(k, simde_mm512_sll_epi32(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_sll_epi32
|
||||
#define _mm512_maskz_sll_epi32(k, a, b) simde_mm512_maskz_sll_epi32(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_sll_epi64 (simde__m512i a, simde__m128i count) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_sll_epi64(a, count);
|
||||
#else
|
||||
simde__m512i_private
|
||||
r_,
|
||||
a_ = simde__m512i_to_private(a);
|
||||
|
||||
#if SIMDE_NATURAL_VECTOR_SIZE_LE(256)
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m256i) / sizeof(r_.m256i[0])) ; i++) {
|
||||
r_.m256i[i] = simde_mm256_sll_epi64(a_.m256i[i], count);
|
||||
}
|
||||
#else
|
||||
simde__m128i_private
|
||||
count_ = simde__m128i_to_private(count);
|
||||
|
||||
uint64_t shift = HEDLEY_STATIC_CAST(uint64_t, count_.i64[0]);
|
||||
if (shift > 63)
|
||||
return simde_mm512_setzero_si512();
|
||||
|
||||
#if defined(SIMDE_VECTOR_SUBSCRIPT_SCALAR)
|
||||
r_.i64 = a_.i64 << HEDLEY_STATIC_CAST(int64_t, shift);
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i64) / sizeof(r_.i64[0])) ; i++) {
|
||||
r_.i64[i] = HEDLEY_STATIC_CAST(int64_t, a_.i64[i] << (shift));
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_sll_epi64
|
||||
#define _mm512_sll_epi64(a, count) simde_mm512_sll_epi64(a, count)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_mask_sll_epi64(simde__m512i src, simde__mmask8 k, simde__m512i a, simde__m128i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_sll_epi64(src, k, a, b);
|
||||
#else
|
||||
return simde_mm512_mask_mov_epi64(src, k, simde_mm512_sll_epi64(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_sll_epi64
|
||||
#define _mm512_mask_sll_epi64(src, k, a, b) simde_mm512_mask_sll_epi64(src, k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_maskz_sll_epi64(simde__mmask8 k, simde__m512i a, simde__m128i b) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_maskz_sll_epi64(k, a, b);
|
||||
#else
|
||||
return simde_mm512_maskz_mov_epi64(k, simde_mm512_sll_epi64(a, b));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_maskz_sll_epi64
|
||||
#define _mm512_maskz_sll_epi64(k, a, b) simde_mm512_maskz_sll_epi64(k, a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_SLL_H) */
|
||||
@@ -0,0 +1,179 @@
|
||||
/* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Copyright:
|
||||
* 2020 Evan Nemerson <evan@nemerson.com>
|
||||
* 2020 Hidayat Khan <huk2209@gmail.com>
|
||||
* 2020 Christopher Moore <moore@free.fr>
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512_SLLI_H)
|
||||
#define SIMDE_X86_AVX512_SLLI_H
|
||||
|
||||
#include "types.h"
|
||||
#include "../avx2.h"
|
||||
#include "mov.h"
|
||||
#include "setzero.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_slli_epi16 (simde__m512i a, const unsigned int imm8)
|
||||
SIMDE_REQUIRE_RANGE(imm8, 0, 255) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE) && (defined(HEDLEY_GCC_VERSION) && ((__GNUC__ == 5 && __GNUC_MINOR__ == 5) || (__GNUC__ == 6 && __GNUC_MINOR__ >= 4)))
|
||||
simde__m512i r;
|
||||
|
||||
SIMDE_CONSTIFY_16_(_mm512_slli_epi16, r, simde_mm512_setzero_si512(), imm8, a);
|
||||
|
||||
return r;
|
||||
#elif defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return SIMDE_BUG_IGNORE_SIGN_CONVERSION(_mm512_slli_epi16(a, imm8));
|
||||
#else
|
||||
simde__m512i_private
|
||||
r_,
|
||||
a_ = simde__m512i_to_private(a);
|
||||
|
||||
#if defined(SIMDE_VECTOR_SUBSCRIPT_SCALAR)
|
||||
if(imm8 < 16)
|
||||
r_.i16 = HEDLEY_STATIC_CAST(__typeof__(r_.i16), (a_.i16 << HEDLEY_STATIC_CAST(int16_t, imm8)));
|
||||
else
|
||||
return simde_mm512_setzero_si512();
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i16) / sizeof(r_.i16[0])) ; i++) {
|
||||
r_.i16[i] = (imm8 < 16) ? HEDLEY_STATIC_CAST(int16_t, a_.i16[i] << (imm8 & 0xff)) : 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_slli_epi16
|
||||
#define _mm512_slli_epi16(a, imm8) simde_mm512_slli_epi16(a, imm8)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_slli_epi32 (simde__m512i a, unsigned int imm8) {
|
||||
/* I guess the restriction was added in 6.4, back-ported to 5.5, then
|
||||
* removed (fixed) in 7? */
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && (defined(HEDLEY_GCC_VERSION) && ((__GNUC__ == 5 && __GNUC_MINOR__ == 5) || (__GNUC__ == 6 && __GNUC_MINOR__ >= 4)))
|
||||
simde__m512i r;
|
||||
|
||||
SIMDE_CONSTIFY_32_(_mm512_slli_epi32, r, simde_mm512_setzero_si512(), imm8, a);
|
||||
|
||||
return r;
|
||||
#elif defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return SIMDE_BUG_IGNORE_SIGN_CONVERSION(_mm512_slli_epi32(a, imm8));
|
||||
#else
|
||||
simde__m512i_private
|
||||
r_,
|
||||
a_ = simde__m512i_to_private(a);
|
||||
|
||||
/* The Intel Intrinsics Guide says that only the 8 LSBits of imm8 are
|
||||
* used. In this case we should do "imm8 &= 0xff". However in
|
||||
* practice all bits are used. */
|
||||
if (imm8 > 31) {
|
||||
simde_memset(&r_, 0, sizeof(r_));
|
||||
} else {
|
||||
#if defined(SIMDE_X86_AVX2_NATIVE)
|
||||
r_.m256i[0] = simde_mm256_slli_epi32(a_.m256i[0], HEDLEY_STATIC_CAST(int, imm8));
|
||||
r_.m256i[1] = simde_mm256_slli_epi32(a_.m256i[1], HEDLEY_STATIC_CAST(int, imm8));
|
||||
#elif defined(SIMDE_X86_SSE2_NATIVE)
|
||||
r_.m128i[0] = simde_mm_slli_epi32(a_.m128i[0], HEDLEY_STATIC_CAST(int, imm8));
|
||||
r_.m128i[1] = simde_mm_slli_epi32(a_.m128i[1], HEDLEY_STATIC_CAST(int, imm8));
|
||||
r_.m128i[2] = simde_mm_slli_epi32(a_.m128i[2], HEDLEY_STATIC_CAST(int, imm8));
|
||||
r_.m128i[3] = simde_mm_slli_epi32(a_.m128i[3], HEDLEY_STATIC_CAST(int, imm8));
|
||||
#elif defined(SIMDE_VECTOR_SUBSCRIPT_SCALAR)
|
||||
r_.u32 = a_.u32 << imm8;
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.u32) / sizeof(r_.u32[0])) ; i++) {
|
||||
r_.u32[i] = a_.u32[i] << imm8;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_slli_epi32
|
||||
#define _mm512_slli_epi32(a, imm8) simde_mm512_slli_epi32(a, imm8)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_slli_epi64 (simde__m512i a, unsigned int imm8) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && (defined(HEDLEY_GCC_VERSION) && ((__GNUC__ == 5 && __GNUC_MINOR__ == 5) || (__GNUC__ == 6 && __GNUC_MINOR__ >= 4)))
|
||||
simde__m512i r;
|
||||
|
||||
SIMDE_CONSTIFY_64_(_mm512_slli_epi64, r, simde_mm512_setzero_si512(), imm8, a);
|
||||
|
||||
return r;
|
||||
#elif defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return SIMDE_BUG_IGNORE_SIGN_CONVERSION(_mm512_slli_epi64(a, imm8));
|
||||
#else
|
||||
simde__m512i_private
|
||||
r_,
|
||||
a_ = simde__m512i_to_private(a);
|
||||
|
||||
/* The Intel Intrinsics Guide says that only the 8 LSBits of imm8 are
|
||||
* used. In this case we should do "imm8 &= 0xff". However in
|
||||
* practice all bits are used. */
|
||||
if (imm8 > 63) {
|
||||
simde_memset(&r_, 0, sizeof(r_));
|
||||
} else {
|
||||
#if defined(SIMDE_X86_AVX2_NATIVE)
|
||||
r_.m256i[0] = simde_mm256_slli_epi64(a_.m256i[0], HEDLEY_STATIC_CAST(int, imm8));
|
||||
r_.m256i[1] = simde_mm256_slli_epi64(a_.m256i[1], HEDLEY_STATIC_CAST(int, imm8));
|
||||
#elif defined(SIMDE_X86_SSE2_NATIVE)
|
||||
r_.m128i[0] = simde_mm_slli_epi64(a_.m128i[0], HEDLEY_STATIC_CAST(int, imm8));
|
||||
r_.m128i[1] = simde_mm_slli_epi64(a_.m128i[1], HEDLEY_STATIC_CAST(int, imm8));
|
||||
r_.m128i[2] = simde_mm_slli_epi64(a_.m128i[2], HEDLEY_STATIC_CAST(int, imm8));
|
||||
r_.m128i[3] = simde_mm_slli_epi64(a_.m128i[3], HEDLEY_STATIC_CAST(int, imm8));
|
||||
#elif defined(SIMDE_VECTOR_SUBSCRIPT_SCALAR) && !defined(SIMDE_BUG_GCC_97248)
|
||||
r_.u64 = a_.u64 << imm8;
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.u64) / sizeof(r_.u64[0])) ; i++) {
|
||||
r_.u64[i] = a_.u64[i] << imm8;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_slli_epi64
|
||||
#define _mm512_slli_epi64(a, imm8) simde_mm512_slli_epi64(a, imm8)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_SLLI_H) */
|
||||
@@ -0,0 +1,122 @@
|
||||
/* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Copyright:
|
||||
* 2020 Evan Nemerson <evan@nemerson.com>
|
||||
* 2020 Hidayat Khan <huk2209@gmail.com>
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512_SLLV_H)
|
||||
#define SIMDE_X86_AVX512_SLLV_H
|
||||
|
||||
#include "types.h"
|
||||
#include "mov.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_sllv_epi16 (simde__m512i a, simde__m512i b) {
|
||||
simde__m512i_private
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b),
|
||||
r_;
|
||||
|
||||
#if defined(SIMDE_VECTOR_SUBSCRIPT_SCALAR)
|
||||
r_.u16 = HEDLEY_REINTERPRET_CAST(__typeof__(r_.u16), (b_.u16 < 16)) & (a_.u16 << b_.u16);
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.u16) / sizeof(r_.u16[0])) ; i++) {
|
||||
r_.u16[i] = (b_.u16[i] < 16) ? HEDLEY_STATIC_CAST(uint16_t, (a_.u16[i] << b_.u16[i])) : 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
#define simde_mm512_sllv_epi16(a, b) _mm512_sllv_epi16(a, b)
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_sllv_epi16
|
||||
#define _mm512_sllv_epi16(a, b) simde_mm512_sllv_epi16(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_sllv_epi32 (simde__m512i a, simde__m512i b) {
|
||||
simde__m512i_private
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b),
|
||||
r_;
|
||||
|
||||
#if defined(SIMDE_VECTOR_SUBSCRIPT_SCALAR)
|
||||
r_.u32 = HEDLEY_REINTERPRET_CAST(__typeof__(r_.u32), (b_.u32 < 32)) & (a_.u32 << b_.u32);
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.u32) / sizeof(r_.u32[0])) ; i++) {
|
||||
r_.u32[i] = (b_.u32[i] < 32) ? HEDLEY_STATIC_CAST(uint32_t, (a_.u32[i] << b_.u32[i])) : 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define simde_mm512_sllv_epi32(a, b) _mm512_sllv_epi32(a, b)
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_sllv_epi32
|
||||
#define _mm512_sllv_epi32(a, b) simde_mm512_sllv_epi32(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_sllv_epi64 (simde__m512i a, simde__m512i b) {
|
||||
simde__m512i_private
|
||||
a_ = simde__m512i_to_private(a),
|
||||
b_ = simde__m512i_to_private(b),
|
||||
r_;
|
||||
|
||||
#if defined(SIMDE_VECTOR_SUBSCRIPT_SCALAR)
|
||||
r_.u64 = HEDLEY_REINTERPRET_CAST(__typeof__(r_.u64), (b_.u64 < 64)) & (a_.u64 << b_.u64);
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.u64) / sizeof(r_.u64[0])) ; i++) {
|
||||
r_.u64[i] = (b_.u64[i] < 64) ? HEDLEY_STATIC_CAST(uint64_t, (a_.u64[i] << b_.u64[i])) : 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define simde_mm512_sllv_epi64(a, b) _mm512_sllv_epi64(a, b)
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_sllv_epi64
|
||||
#define _mm512_sllv_epi64(a, b) simde_mm512_sllv_epi64(a, b)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_SLLV_H) */
|
||||
@@ -0,0 +1,127 @@
|
||||
/* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Copyright:
|
||||
* 2020 Evan Nemerson <evan@nemerson.com>
|
||||
* 2020 Himanshi Mathur <himanshi18037@iiitd.ac.in>
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512_SQRT_H)
|
||||
#define SIMDE_X86_AVX512_SQRT_H
|
||||
|
||||
#include "types.h"
|
||||
#include "mov.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_sqrt_ps (simde__m512 a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_sqrt_ps(a);
|
||||
#else
|
||||
simde__m512_private
|
||||
r_,
|
||||
a_ = simde__m512_to_private(a);
|
||||
|
||||
#if defined(SIMDE_X86_AVX_NATIVE)
|
||||
r_.m256[0] = simde_mm256_sqrt_ps(a_.m256[0]);
|
||||
r_.m256[1] = simde_mm256_sqrt_ps(a_.m256[1]);
|
||||
#elif defined(simde_math_sqrtf)
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.f32) / sizeof(r_.f32[0])) ; i++) {
|
||||
r_.f32[i] = simde_math_sqrtf(a_.f32[i]);
|
||||
}
|
||||
#else
|
||||
HEDLEY_UNREACHABLE();
|
||||
#endif
|
||||
|
||||
return simde__m512_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
# define _mm512_sqrt_ps(a) simde_mm512_sqrt_ps(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512
|
||||
simde_mm512_mask_sqrt_ps(simde__m512 src, simde__mmask16 k, simde__m512 a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_sqrt_ps(src, k, a);
|
||||
#else
|
||||
return simde_mm512_mask_mov_ps(src, k, simde_mm512_sqrt_ps(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_sqrt_ps
|
||||
#define _mm512_mask_sqrt_ps(src, k, a) simde_mm512_mask_sqrt_ps(src, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_sqrt_pd (simde__m512d a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_sqrt_pd(a);
|
||||
#else
|
||||
simde__m512d_private
|
||||
r_,
|
||||
a_ = simde__m512d_to_private(a);
|
||||
|
||||
#if defined(SIMDE_X86_AVX_NATIVE)
|
||||
r_.m256d[0] = simde_mm256_sqrt_pd(a_.m256d[0]);
|
||||
r_.m256d[1] = simde_mm256_sqrt_pd(a_.m256d[1]);
|
||||
#elif defined(simde_math_sqrt)
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.f64) / sizeof(r_.f64[0])) ; i++) {
|
||||
r_.f64[i] = simde_math_sqrt(a_.f64[i]);
|
||||
}
|
||||
#else
|
||||
HEDLEY_UNREACHABLE();
|
||||
#endif
|
||||
|
||||
return simde__m512d_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
# define _mm512_sqrt_pd(a) simde_mm512_sqrt_pd(a)
|
||||
#endif
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512d
|
||||
simde_mm512_mask_sqrt_pd(simde__m512d src, simde__mmask8 k, simde__m512d a) {
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
return _mm512_mask_sqrt_pd(src, k, a);
|
||||
#else
|
||||
return simde_mm512_mask_mov_pd(src, k, simde_mm512_sqrt_pd(a));
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_mask_sqrt_pd
|
||||
#define _mm512_mask_sqrt_pd(src, k, a) simde_mm512_mask_sqrt_pd(src, k, a)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_SQRT_H) */
|
||||
@@ -0,0 +1,81 @@
|
||||
/* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Copyright:
|
||||
* 2020 Evan Nemerson <evan@nemerson.com>
|
||||
* 2020 Hidayat Khan <huk2209@gmail.com>
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512_SRA_H)
|
||||
#define SIMDE_X86_AVX512_SRA_H
|
||||
|
||||
#include "types.h"
|
||||
#include "../avx2.h"
|
||||
#include "mov.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
|
||||
SIMDE_BEGIN_DECLS_
|
||||
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
simde__m512i
|
||||
simde_mm512_sra_epi16 (simde__m512i a, simde__m128i count) {
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
return _mm512_sra_epi16(a, count);
|
||||
#else
|
||||
simde__m512i_private
|
||||
r_,
|
||||
a_ = simde__m512i_to_private(a);
|
||||
|
||||
#if SIMDE_NATURAL_VECTOR_SIZE_LE(256)
|
||||
for (size_t i = 0 ; i < (sizeof(r_.m256i) / sizeof(r_.m256i[0])) ; i++) {
|
||||
r_.m256i[i] = simde_mm256_sra_epi16(a_.m256i[i], count);
|
||||
}
|
||||
#else
|
||||
simde__m128i_private
|
||||
count_ = simde__m128i_to_private(count);
|
||||
uint64_t shift = HEDLEY_STATIC_CAST(uint64_t, count_.i64[0]);
|
||||
|
||||
if (shift > 15) shift = 15;
|
||||
|
||||
#if defined(SIMDE_VECTOR_SUBSCRIPT_SCALAR)
|
||||
r_.i16 = a_.i16 >> HEDLEY_STATIC_CAST(int16_t, shift);
|
||||
#else
|
||||
SIMDE_VECTORIZE
|
||||
for (size_t i = 0 ; i < (sizeof(r_.i16) / sizeof(r_.i16[0])) ; i++) {
|
||||
r_.i16[i] = a_.i16[i] >> shift;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
return simde__m512i_from_private(r_);
|
||||
#endif
|
||||
}
|
||||
#if defined(SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES)
|
||||
#undef _mm512_sra_epi16
|
||||
#define _mm512_sra_epi16(a, count) simde_mm512_sra_epi16(a, count)
|
||||
#endif
|
||||
|
||||
SIMDE_END_DECLS_
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif /* !defined(SIMDE_X86_AVX512_SRA_H) */
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user