Adding gcc-patches.
On Mon, Dec 30, 2013 at 5:06 PM, Kirill Yukhin <kirill.yuk...@gmail.com> wrote: > Hello, > It seems that we forgot about kmovw instruction in AVX512 patch series. > > Patch in the bottom, is it ok for trunk? > > gcc/ > > * config/i386/avx512fintrin.h (_mm512_kmov): New. > * config/i386/i386.c (IX86_BUILTIN_KMOV16): Ditto. > (__builtin_ia32_kmov16): Ditto. > * config/i386/i386.md (UNSPEC_KMOV): New. > (kmovw): Ditto. > > testsuite/ > * gcc.target/i386/avx512f-kmovw-1.c: New. > > -- > Thanks, K > > --- > gcc/config/i386/avx512fintrin.h | 7 +++++++ > gcc/config/i386/i386.c | 2 ++ > gcc/config/i386/i386.md | 17 +++++++++++++++++ > gcc/testsuite/gcc.target/i386/avx512f-kmovw-1.c | 12 ++++++++++++ > 4 files changed, 38 insertions(+) > > diff --git a/gcc/config/i386/avx512fintrin.h b/gcc/config/i386/avx512fintrin.h > index 0a43b1e..a20745b 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 __builtin_ia32_kmov16 (__A); > +} > + > #ifdef __DISABLE_AVX512F__ > #undef __DISABLE_AVX512F__ > #pragma GCC pop_options > diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c > index d5d731c..afbee28 100644 > --- a/gcc/config/i386/i386.c > +++ b/gcc/config/i386/i386.c > @@ -28269,6 +28269,7 @@ enum ix86_builtins > IX86_BUILTIN_KUNPCKBW, > IX86_BUILTIN_KXNOR16, > IX86_BUILTIN_KXOR16, > + IX86_BUILTIN_KMOV16, > > /* Alternate 4 and 8 element gather/scatter for the vectorizer > where all operands are 32-byte or 64-byte wide respectively. */ > @@ -29975,6 +29976,7 @@ static const struct builtin_description bdesc_args[] = > { OPTION_MASK_ISA_AVX512F, CODE_FOR_kunpckhi, "__builtin_ia32_kunpckhi", > IX86_BUILTIN_KUNPCKBW, UNKNOWN, (int) HI_FTYPE_HI_HI }, > { OPTION_MASK_ISA_AVX512F, CODE_FOR_kxnorhi, "__builtin_ia32_kxnorhi", > IX86_BUILTIN_KXNOR16, UNKNOWN, (int) HI_FTYPE_HI_HI }, > { OPTION_MASK_ISA_AVX512F, CODE_FOR_xorhi3, "__builtin_ia32_kxorhi", > IX86_BUILTIN_KXOR16, UNKNOWN, (int) HI_FTYPE_HI_HI }, > + { OPTION_MASK_ISA_AVX512F, CODE_FOR_kmovw, "__builtin_ia32_kmov16", > IX86_BUILTIN_KMOV16, UNKNOWN, (int) HI_FTYPE_HI }, > > /* SHA */ > { OPTION_MASK_ISA_SSE2, CODE_FOR_sha1msg1, 0, IX86_BUILTIN_SHA1MSG1, > UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI }, > diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md > index c7ed099..8895975 100644 > --- a/gcc/config/i386/i386.md > +++ b/gcc/config/i386/i386.md > @@ -178,6 +178,9 @@ > ;; For BMI2 support > UNSPEC_PDEP > UNSPEC_PEXT > + > + ;; For AVX512F support > + UNSPEC_KMOV > ]) > > (define_c_enum "unspecv" [ > @@ -2274,6 +2277,20 @@ > ] > (const_string "SI")))]) > > +(define_insn "kmovw" > + [(set (match_operand:HI 0 "nonimmediate_operand" "=k,k") > + (unspec:HI > + [(match_operand:HI 1 "nonimmediate_operand" "rm,k")] > + UNSPEC_KMOV))] > + "!(MEM_P (operands[0]) && MEM_P (operands[1])) && TARGET_AVX512F" > + "@ > + kmovw\t{%k1, %0|%0, %k1} > + kmovw\t{%1, %0|%0, %1}"; > + [(set_attr "mode" "HI") > + (set_attr "type" "mskmov") > + (set_attr "prefix" "vex")]) > + > + > (define_insn "*movhi_internal" > [(set (match_operand:HI 0 "nonimmediate_operand" "=r,r ,r ,m ,Yk,Yk,rm") > (match_operand:HI 1 "general_operand" "r ,rn,rm,rn,rm,Yk,Yk"))] > diff --git a/gcc/testsuite/gcc.target/i386/avx512f-kmovw-1.c > b/gcc/testsuite/gcc.target/i386/avx512f-kmovw-1.c > new file mode 100644 > index 0000000..c092726 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/i386/avx512f-kmovw-1.c > @@ -0,0 +1,12 @@ > +/* { dg-do compile } */ > +/* { dg-options "-mavx512f -O2" } */ > +/* { dg-final { scan-assembler "kmovw\[ \\t\]+\[^\n\]*%k\[1-7\]" } } */ > + > +#include <immintrin.h> > +volatile __mmask16 k1; > + > +void > +avx512f_test () > +{ > + k1 = _mm512_kmov (11); > +}