On Thu, Jan 22, 2015 at 7:37 PM, Uros Bizjak <ubiz...@gmail.com> wrote:
>> Attached patch fixes PR 64688. Operand constraints were wrong for >> reg-to-vec targets. >> >> The patch also fixes PR 64477. > > Whoops, I have regtested wrong compiler. The patch introduced some > AVX2 regressions. Following patch is also needed, otherwise vec_dup > post-reload splitter creates invalid pattern that involves general reg > for reg-to-vec targets. Now fixed, attached is the complete patch. 2015-22-01 Uros Bizjak <ubiz...@gmail.com> PR target/64688 PR target/64477 * config/i386/sse.md (vec_set<mode>_0): Use (Yi/r/C) constraints for alternative 3. (*vec_dup<mode>): Use (Yi/$r) constraints for alternative 1. Bootstrapped and regression tested on x86_64-linux-gnu {,-m32}. Committed to mainline SVN. Uros.
Index: config/i386/sse.md =================================================================== --- config/i386/sse.md (revision 219987) +++ config/i386/sse.md (working copy) @@ -6391,11 +6391,11 @@ ;; see comment above inline_secondary_memory_needed function in i386.c (define_insn "vec_set<mode>_0" [(set (match_operand:VI4F_128 0 "nonimmediate_operand" - "=Yr,*v,v,v ,x,x,v,Yr ,*x ,x ,m ,m ,m") + "=Yr,*v,v,Yi,x,x,v,Yr ,*x ,x ,m ,m ,m") (vec_merge:VI4F_128 (vec_duplicate:VI4F_128 (match_operand:<ssescalarmode> 2 "general_operand" - " Yr,*v,m,*r,m,x,v,*rm,*rm,*rm,!x,!*re,!*fF")) + " Yr,*v,m,r ,m,x,v,*rm,*rm,*rm,!x,!*re,!*fF")) (match_operand:VI4F_128 1 "vector_move_operand" " C , C,C,C ,C,0,v,0 ,0 ,x ,0 ,0 ,0") (const_int 1)))] @@ -16711,7 +16711,7 @@ [V32QI V16QI V16HI V8HI V8SI V4SI]) (define_insn "*vec_dup<mode>" - [(set (match_operand:AVX2_VEC_DUP_MODE 0 "register_operand" "=x,x,x") + [(set (match_operand:AVX2_VEC_DUP_MODE 0 "register_operand" "=x,x,Yi") (vec_duplicate:AVX2_VEC_DUP_MODE (match_operand:<ssescalarmode> 1 "nonimmediate_operand" "m,x,$r")))] "TARGET_AVX2"