From cd53e6abed10f9cde0d16031d183ad2875d76754 Mon Sep 17 00:00:00 2001 From: Anton Mitrokhin Date: Wed, 24 Dec 2014 17:51:39 +0300 Subject: [PATCH] add gather_base_offsets32_i16 --- examples/intrinsics/knc.h | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/examples/intrinsics/knc.h b/examples/intrinsics/knc.h index 0ae0b134..365a87c5 100644 --- a/examples/intrinsics/knc.h +++ b/examples/intrinsics/knc.h @@ -3140,6 +3140,19 @@ __gather_base_offsets32_i8(uint8_t *base, uint32_t scale, __vec16_i32 offsets, return ret; } +static FORCEINLINE __vec16_i16 +__gather_base_offsets32_i16(uint8_t *base, uint32_t scale, __vec16_i32 offsets, + __vec16_i1 mask) { + // (iw): need to temporarily store as int because gathers can only return ints. + __vec16_i32 tmp = _mm512_mask_i32extgather_epi32(_mm512_undefined_epi32(), mask, offsets, base, + _MM_UPCONV_EPI32_SINT16, scale, + _MM_HINT_NONE); + // now, downconverting to chars into temporary char vector + __vec16_i16 ret; + _mm512_extstore_epi32(ret.v,tmp,_MM_DOWNCONV_EPI32_SINT16,_MM_HINT_NONE); + return ret; +} + static FORCEINLINE __vec16_i32 __gather_base_offsets32_i32(uint8_t *base, uint32_t scale, __vec16_i32 offsets, __vec16_i1 mask) {