From 2438932b7e66c5cd496bdd19e6d96d168b3dd2c8 Mon Sep 17 00:00:00 2001 From: Tim Rowley Date: Tue, 16 May 2017 10:25:21 -0500 Subject: [PATCH] swr/rast: make simd16 logicops avx512f safe Express the simd16 logicops in terms of avx512f instructions. Reviewed-by: Bruce Cherniak --- .../drivers/swr/rasterizer/common/simd16intrin.h | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/gallium/drivers/swr/rasterizer/common/simd16intrin.h b/src/gallium/drivers/swr/rasterizer/common/simd16intrin.h index 2fe18f28282..84585ffc8fc 100644 --- a/src/gallium/drivers/swr/rasterizer/common/simd16intrin.h +++ b/src/gallium/drivers/swr/rasterizer/common/simd16intrin.h @@ -941,10 +941,16 @@ INLINE simd16scalar SIMDAPI _simd16_cmp_ps_temp(simd16scalar a, simd16scalar b) #define _simd16_castpd_ps _mm512_castpd_ps #define _simd16_castps_pd _mm512_castps_pd -#define _simd16_and_ps _mm512_and_ps -#define _simd16_andnot_ps _mm512_andnot_ps -#define _simd16_or_ps _mm512_or_ps -#define _simd16_xor_ps _mm512_xor_ps +// _mm512_and_ps (and other bitwise operations) exist in AVX512DQ, +// while the functionally equivalent _mm512_and_epi32 is in AVX512F. +// Define the _simd16_*_ps versions in terms of AVX512F for broader +// support. +#define _simd16_logicop_ps(a, b, op) _simd16_castsi_ps(op##_epi32(_simd16_castps_si(a), _simd16_castps_si(b))) + +#define _simd16_and_ps(a, b) _simd16_logicop_ps(a, b, _mm512_and) +#define _simd16_andnot_ps(a, b) _simd16_logicop_ps(a, b, _mm512_andnot) +#define _simd16_or_ps(a, b) _simd16_logicop_ps(a, b, _mm512_or) +#define _simd16_xor_ps(a, b) _simd16_logicop_ps(a, b, _mm512_xor) template INLINE simd16scalar SIMDAPI _simd16_round_ps_temp(simd16scalar a) -- 2.30.2