> RA figured out that operation with general registers results in less > moves (you already have x1 in general reg). This is exaclty the reason > why I think unspecs are not needed. It is the job of the compiler to > choose most appropriate approach, and its behavior should be adjusted > with appropriate cost functions. > > I guess that if you load x from memory, RA will allocate mask > registers all the way to add insn.
I tried loading from memory and result is the same. Without unspec this intrinsic is just return __A and is completely useless. As for RA choosing best approach, big concern was generating k<logic> for normal instructions, so current implementation of masks is conservative and RA chooses gpr alternatives. So i think, that kmov intrinsic with unspec has it's uses as a hint to complier. If you are against this approach here is version without unspec. --- gcc/config/i386/avx512fintrin.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/gcc/config/i386/avx512fintrin.h b/gcc/config/i386/avx512fintrin.h index 0a43b1e..e0e74cf 100644 --- a/gcc/config/i386/avx512fintrin.h +++ b/gcc/config/i386/avx512fintrin.h @@ -14826,6 +14826,13 @@ _mm_maskz_fnmsub_ss (__mmask8 __U, __m128 __W, __m128 __A, __m128 __B) _MM_FROUND_CUR_DIRECTION); } +extern __inline __mmask16 +__attribute__ ((__gnu_inline__, __always_inline__, __artificial__)) +_mm512_kmov (__mmask16 __A) +{ + return __A; +} + #ifdef __DISABLE_AVX512F__ #undef __DISABLE_AVX512F__ #pragma GCC pop_options -- 1.8.3.1