Commit a39f2c3b authored by Michael R. Crusoe's avatar Michael R. Crusoe Committed by Michael R. Crusoe

avx512/shuffle: mm512_{shuffle_epi32,shuffle{hi,lo}_epi16}

parent a202d011
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
* Copyright: * Copyright:
* 2020 Evan Nemerson <evan@nemerson.com> * 2020 Evan Nemerson <evan@nemerson.com>
* 2020 Christopher Moore <moore@free.fr> * 2020 Christopher Moore <moore@free.fr>
* 2023 Michael R. Crusoe <crusoe@debian.org>
*/ */
#if !defined(SIMDE_X86_AVX512_SHUFFLE_H) #if !defined(SIMDE_X86_AVX512_SHUFFLE_H)
...@@ -31,6 +32,7 @@ ...@@ -31,6 +32,7 @@
#include "types.h" #include "types.h"
#include "../avx2.h" #include "../avx2.h"
#include "mov.h" #include "mov.h"
#include "extract.h"
HEDLEY_DIAGNOSTIC_PUSH HEDLEY_DIAGNOSTIC_PUSH
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
...@@ -94,6 +96,35 @@ simde_mm512_maskz_shuffle_epi8 (simde__mmask64 k, simde__m512i a, simde__m512i b ...@@ -94,6 +96,35 @@ simde_mm512_maskz_shuffle_epi8 (simde__mmask64 k, simde__m512i a, simde__m512i b
#define _mm512_maskz_shuffle_epi8(k, a, b) simde_mm512_maskz_shuffle_epi8(k, a, b) #define _mm512_maskz_shuffle_epi8(k, a, b) simde_mm512_maskz_shuffle_epi8(k, a, b)
#endif #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_FUNCTION_ATTRIBUTES
simde__m256i simde__m256i
simde_mm256_shuffle_i32x4 (simde__m256i a, simde__m256i b, const int imm8) simde_mm256_shuffle_i32x4 (simde__m256i a, simde__m256i b, const int imm8)
...@@ -266,6 +297,64 @@ simde_mm512_shuffle_pd(simde__m512d a, simde__m512d b, int imm8) ...@@ -266,6 +297,64 @@ simde_mm512_shuffle_pd(simde__m512d a, simde__m512d b, int imm8)
#define _mm512_shuffle_pd(a, b, imm8) simde_mm512_shuffle_pd(a, b, imm8) #define _mm512_shuffle_pd(a, b, imm8) simde_mm512_shuffle_pd(a, b, imm8)
#endif #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_ SIMDE_END_DECLS_
HEDLEY_DIAGNOSTIC_POP HEDLEY_DIAGNOSTIC_POP
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment