On Tue, Sep 16, 2014 at 12:10 PM, Kirill Yukhin <kirill.yuk...@gmail.com> wrote:
> Updated ChangeLog entry: > gcc/ > * config/i386/i386.c > (ix86_expand_vector_extract): Handle V32HI and V64QI modes. > * config/i386/sse.md > (define_mode_iterator VI48F_256): New. > (define_mode_attr extract_type): Ditto. > (define_mode_attr extract_suf): Ditto. > (define_mode_iterator AVX512_VEC): Ditto. > (define_expand > "<extract_type>_vextract<shuffletype><extract_suf>_mask"): Use > AVX512_VEC. > (define_insn "avx512dq_vextract<shuffletype>64x2_1_maskm"): New. > (define_insn > "<mask_codefor>avx512dq_vextract<shuffletype>64x2_1<mask_name>"): > Ditto. > (define_mode_attr extract_type_2): Ditto. > (define_mode_attr extract_suf_2): Ditto. > (define_mode_iterator AVX512_VEC_2): Ditto. > (define_expand > "<extract_type_2>_vextract<shuffletype><extract_suf_2>_mask"): Use > AVX512_VEC_2 mode iterator. > (define_insn "vec_extract_hi_<mode>_maskm"): Ditto. > (define_expand "avx512vl_vextractf128<mode>"): Ditto. > (define_insn_and_split "vec_extract_lo_<mode>"): Delete. > (define_insn "vec_extract_lo_<mode><mask_name>"): New. > (define_split for V16FI mode): Ditto. > (define_insn_and_split "vec_extract_lo_<mode>"): Delete. > (define_insn "vec_extract_lo_<mode><mask_name>"): New. > (define_split for VI8F_256 mode): Ditto. > (define_insn "vec_extract_hi_<mode><mask_name>"): Add masking. > (define_insn_and_split "vec_extract_lo_<mode>"): Delete. > (define_insn "vec_extract_lo_<mode><mask_name>"): New. > (define_split for VI4F_256 mode): Ditto. > (define_insn "vec_extract_lo_<mode>_maskm"): Ditto. > (define_insn "vec_extract_hi_<mode>_maskm"): Ditto. > (define_insn "vec_extract_hi_<mode><mask_name>"): Add masking. > (define_mode_iterator VEC_EXTRACT_MODE): Add V64QI and V32HI modes. > (define_insn "vcvtph2ps<mask_name>"): Fix pattern condition. > (define_insn "avx512f_vextract<shuffletype>32x4_1_maskm"): Ditto. > (define_insn > "<mask_codefor>avx512f_vextract<shuffletype>32x4_1<mask_name>"): > Update `type' attribute, remove explicit `memory' attribute > calculation. > > Is it ok for trunk? OK with a small change below. > +(define_insn "vec_extract_lo_<mode>_maskm" > + [(set (match_operand:<ssehalfvecmode> 0 "memory_operand" "=m") > + (vec_merge:<ssehalfvecmode> > + (vec_select:<ssehalfvecmode> > + (match_operand:VI4F_256 1 "register_operand" "v") > + (parallel [(const_int 0) (const_int 1) > + (const_int 2) (const_int 3)])) > + (match_operand:<ssehalfvecmode> 2 "memory_operand" "0") > + (match_operand:QI 3 "register_operand" "k")))] > + "TARGET_AVX512VL && TARGET_AVX512F" > + "vextract<shuffletype>32x4\t{$0x0, %1, %0%{3%}|%0%{%3%}, %1, 0x0}" > + [(set_attr "type" "sselog") > + (set_attr "length_immediate" "1") > + (set_attr "prefix" "evex") > + (set_attr "mode" "<sseinsnmode>")]) This pattern should probably match attributes (especially memory attr) of vec_extract_hi_<mode>_maskm below. > +(define_insn "vec_extract_hi_<mode>_maskm" > + [(set (match_operand:<ssehalfvecmode> 0 "memory_operand" "=m") > + (vec_merge:<ssehalfvecmode> > + (vec_select:<ssehalfvecmode> > + (match_operand:VI4F_256 1 "register_operand" "v") > + (parallel [(const_int 4) (const_int 5) > + (const_int 6) (const_int 7)])) > + (match_operand:<ssehalfvecmode> 2 "memory_operand" "0") > + (match_operand:<ssehalfvecmode> 3 "register_operand" "k")))] > + "TARGET_AVX512F && TARGET_AVX512VL" > +{ > + return "vextract<shuffletype>32x4\t{$0x1, %1, %0%{%3%}|%0%{%3%}, %1, 0x1}"; > +} > + [(set_attr "type" "sselog") > + (set_attr "prefix_extra" "1") > + (set_attr "length_immediate" "1") > + (set_attr "memory" "store") > + (set_attr "prefix" "evex") > + (set_attr "mode" "<sseinsnmode>")])