Hello,
On 23 Mar 19:02, Ilya Tocar wrote:
> Hi,
> 
> I've renamed EXT_SSE_REG_P into EXT_REX_SSE_REG_P for consistency.
> Ok for stage1?
Patch is OK for stage1.

--
Thanks, K


> On 19 Mar 12:24, Ilya Tocar wrote:
> > Hi,
> > 
> > There were some discussion about "x" constraints being too conservative
> > for some patterns in i386.md.
> > Patch below fixes it. This is probably stage1 material.
> > 
> > ChangeLog:
> > 
> > gcc/
> > 
> 2015-03-23  Ilya Tocar  <ilya.to...@intel.com>
> 
>       * config/i386/i386.h (EXT_REX_SSE_REG_P): New.
>       * config/i386/i386.md (*cmpi<FPCMP:unord><MODEF:mode>_mixed): Use "v"
>       constraint.
>       (*cmpi<FPCMP:unord><MODEF:mode>_sse): Ditto.
>       (*movxi_internal_avx512f): Ditto.
>       (define_split): Check for xmm16+, when splitting scalar float_extend.
>       (*extendsfdf2_mixed): Use "v" constraint.
>       (*extendsfdf2_sse): Ditto.
>       (define_split): Check for xmm16+, when splitting scalar float_truncate.
>       (*truncdfsf_fast_sse): Use "v" constraint.
>       (fix_trunc<MODEF:mode><SWI48:mode>_sse): Ditto.
>       (*float<SWI48:mode><MODEF:mode>2_sse): Ditto.
>       (define_peephole2): Check for xmm16+, when converting scalar
>       float_truncate.
>       (define_peephole2): Check for xmm16+, when converting scalar
>       float_extend.
>       (*fop_<mode>_comm_mixed): Use "v" constraint.
>       (*fop_<mode>_comm_sse): Ditto.
>       (*fop_<mode>_1_mixed): Ditto.
>       (*sqrt<mode>2_sse): Ditto.
>       (*ieee_s<ieee_maxmin><mode>3): Ditto.
> 
> 
> ---
>  gcc/config/i386/i386.h  |  2 ++
>  gcc/config/i386/i386.md | 82 
> +++++++++++++++++++++++++++----------------------
>  2 files changed, 47 insertions(+), 37 deletions(-)
> 
> diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h
> index 1e755d3..70a471b 100644
> --- a/gcc/config/i386/i386.h
> +++ b/gcc/config/i386/i386.h
> @@ -1477,6 +1477,8 @@ enum reg_class
>  #define REX_SSE_REGNO_P(N) \
>    IN_RANGE ((N), FIRST_REX_SSE_REG, LAST_REX_SSE_REG)
>  
> +#define EXT_REX_SSE_REG_P(X) (REG_P (X) && EXT_REX_SSE_REGNO_P (REGNO (X)))
> +
>  #define EXT_REX_SSE_REGNO_P(N) \
>    IN_RANGE ((N), FIRST_EXT_REX_SSE_REG, LAST_EXT_REX_SSE_REG)
>  
> diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
> index 1129b93..dc1cd20 100644
> --- a/gcc/config/i386/i386.md
> +++ b/gcc/config/i386/i386.md
> @@ -1639,8 +1639,8 @@
>  (define_insn "*cmpi<FPCMP:unord><MODEF:mode>_mixed"
>    [(set (reg:FPCMP FLAGS_REG)
>       (compare:FPCMP
> -       (match_operand:MODEF 0 "register_operand" "f,x")
> -       (match_operand:MODEF 1 "nonimmediate_operand" "f,xm")))]
> +       (match_operand:MODEF 0 "register_operand" "f,v")
> +       (match_operand:MODEF 1 "nonimmediate_operand" "f,vm")))]
>    "TARGET_MIX_SSE_I387
>     && SSE_FLOAT_MODE_P (<MODEF:MODE>mode)"
>    "* return output_fp_compare (insn, operands, true,
> @@ -1666,8 +1666,8 @@
>  (define_insn "*cmpi<FPCMP:unord><MODEF:mode>_sse"
>    [(set (reg:FPCMP FLAGS_REG)
>       (compare:FPCMP
> -       (match_operand:MODEF 0 "register_operand" "x")
> -       (match_operand:MODEF 1 "nonimmediate_operand" "xm")))]
> +       (match_operand:MODEF 0 "register_operand" "v")
> +       (match_operand:MODEF 1 "nonimmediate_operand" "vm")))]
>    "TARGET_SSE_MATH
>     && SSE_FLOAT_MODE_P (<MODEF:MODE>mode)"
>    "* return output_fp_compare (insn, operands, true,
> @@ -1959,8 +1959,8 @@
>     (set_attr "length_immediate" "1")])
>  
>  (define_insn "*movxi_internal_avx512f"
> -  [(set (match_operand:XI 0 "nonimmediate_operand" "=x,x ,m")
> -     (match_operand:XI 1 "vector_move_operand"  "C ,xm,x"))]
> +  [(set (match_operand:XI 0 "nonimmediate_operand" "=v,v ,m")
> +     (match_operand:XI 1 "vector_move_operand"  "C ,vm,v"))]
>    "TARGET_AVX512F && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
>  {
>    switch (which_alternative)
> @@ -4003,7 +4003,9 @@
>         (match_operand:SF 1 "nonimmediate_operand")))]
>    "TARGET_USE_VECTOR_FP_CONVERTS
>     && optimize_insn_for_speed_p ()
> -   && reload_completed && SSE_REG_P (operands[0])"
> +   && reload_completed && SSE_REG_P (operands[0])
> +   && (!EXT_REX_SSE_REG_P (operands[0])
> +       || TARGET_AVX512VL)"
>     [(set (match_dup 2)
>        (float_extend:V2DF
>          (vec_select:V2SF
> @@ -4048,9 +4050,9 @@
>    "operands[2] = gen_rtx_REG (SFmode, REGNO (operands[0]));")
>  
>  (define_insn "*extendsfdf2_mixed"
> -  [(set (match_operand:DF 0 "nonimmediate_operand" "=f,m,x")
> +  [(set (match_operand:DF 0 "nonimmediate_operand" "=f,m,v")
>          (float_extend:DF
> -       (match_operand:SF 1 "nonimmediate_operand" "fm,f,xm")))]
> +       (match_operand:SF 1 "nonimmediate_operand" "fm,f,vm")))]
>    "TARGET_SSE2 && TARGET_MIX_SSE_I387"
>  {
>    switch (which_alternative)
> @@ -4071,8 +4073,8 @@
>     (set_attr "mode" "SF,XF,DF")])
>  
>  (define_insn "*extendsfdf2_sse"
> -  [(set (match_operand:DF 0 "nonimmediate_operand" "=x")
> -        (float_extend:DF (match_operand:SF 1 "nonimmediate_operand" "xm")))]
> +  [(set (match_operand:DF 0 "nonimmediate_operand" "=v")
> +        (float_extend:DF (match_operand:SF 1 "nonimmediate_operand" "vm")))]
>    "TARGET_SSE2 && TARGET_SSE_MATH"
>    "%vcvtss2sd\t{%1, %d0|%d0, %1}"
>    [(set_attr "type" "ssecvt")
> @@ -4155,7 +4157,9 @@
>         (match_operand:DF 1 "nonimmediate_operand")))]
>    "TARGET_USE_VECTOR_FP_CONVERTS
>     && optimize_insn_for_speed_p ()
> -   && reload_completed && SSE_REG_P (operands[0])"
> +   && reload_completed && SSE_REG_P (operands[0])
> +   && (!EXT_REX_SSE_REG_P (operands[0])
> +       || TARGET_AVX512VL)"
>     [(set (match_dup 2)
>        (vec_concat:V4SF
>          (float_truncate:V2SF
> @@ -4228,9 +4232,9 @@
>  ;; Yes, this one doesn't depend on flag_unsafe_math_optimizations,
>  ;; because nothing we do here is unsafe.
>  (define_insn "*truncdfsf_fast_sse"
> -  [(set (match_operand:SF 0 "nonimmediate_operand"   "=x")
> +  [(set (match_operand:SF 0 "nonimmediate_operand"   "=v")
>          (float_truncate:SF
> -          (match_operand:DF 1 "nonimmediate_operand" "xm")))]
> +          (match_operand:DF 1 "nonimmediate_operand" "vm")))]
>    "TARGET_SSE2 && TARGET_SSE_MATH"
>    "%vcvtsd2ss\t{%1, %d0|%d0, %1}"
>    [(set_attr "type" "ssecvt")
> @@ -4544,7 +4548,7 @@
>  ;; When SSE is available, it is always faster to use it!
>  (define_insn "fix_trunc<MODEF:mode><SWI48:mode>_sse"
>    [(set (match_operand:SWI48 0 "register_operand" "=r,r")
> -     (fix:SWI48 (match_operand:MODEF 1 "nonimmediate_operand" "x,m")))]
> +     (fix:SWI48 (match_operand:MODEF 1 "nonimmediate_operand" "v,m")))]
>    "SSE_FLOAT_MODE_P (<MODEF:MODE>mode)
>     && (!TARGET_FISTTP || TARGET_SSE_MATH)"
>    "%vcvtt<MODEF:ssemodesuffix>2si<SWI48:rex64suffix>\t{%1, %0|%0, %1}"
> @@ -4864,7 +4868,7 @@
>  })
>  
>  (define_insn "*float<SWI48:mode><MODEF:mode>2_sse"
> -  [(set (match_operand:MODEF 0 "register_operand" "=f,x,x")
> +  [(set (match_operand:MODEF 0 "register_operand" "=f,v,v")
>       (float:MODEF
>         (match_operand:SWI48 1 "nonimmediate_operand" "m,r,m")))]
>    "SSE_FLOAT_MODE_P (<MODEF:MODE>mode) && TARGET_SSE_MATH"
> @@ -4967,7 +4971,9 @@
>     && optimize_function_for_speed_p (cfun)
>     && SSE_REG_P (operands[0])
>     && (!SSE_REG_P (operands[1])
> -       || REGNO (operands[0]) != REGNO (operands[1]))"
> +       || REGNO (operands[0]) != REGNO (operands[1]))
> +   && (!EXT_REX_SSE_REG_P (operands[0])
> +       || TARGET_AVX512VL)"
>    [(set (match_dup 0)
>       (vec_merge:V4SF
>         (vec_duplicate:V4SF
> @@ -4994,7 +5000,9 @@
>     && optimize_function_for_speed_p (cfun)
>     && SSE_REG_P (operands[0])
>     && (!SSE_REG_P (operands[1])
> -       || REGNO (operands[0]) != REGNO (operands[1]))"
> +       || REGNO (operands[0]) != REGNO (operands[1]))
> +   && (!EXT_REX_SSE_REG_P (operands[0])
> +       || TARGET_AVX512VL)"
>    [(set (match_dup 0)
>          (vec_merge:V2DF
>            (float_extend:V2DF
> @@ -13617,10 +13625,10 @@
>  ;; so use special patterns for add and mull.
>  
>  (define_insn "*fop_<mode>_comm_mixed"
> -  [(set (match_operand:MODEF 0 "register_operand" "=f,x,x")
> +  [(set (match_operand:MODEF 0 "register_operand" "=f,x,v")
>       (match_operator:MODEF 3 "binary_fp_operator"
> -       [(match_operand:MODEF 1 "nonimmediate_operand" "%0,0,x")
> -        (match_operand:MODEF 2 "nonimmediate_operand" "fm,xm,xm")]))]
> +       [(match_operand:MODEF 1 "nonimmediate_operand" "%0,0,v")
> +        (match_operand:MODEF 2 "nonimmediate_operand" "fm,xm,vm")]))]
>    "SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_MIX_SSE_I387
>     && COMMUTATIVE_ARITH_P (operands[3])
>     && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
> @@ -13634,7 +13642,7 @@
>             (const_string "fmul")
>             (const_string "fop"))))
>     (set_attr "isa" "*,noavx,avx")
> -   (set_attr "prefix" "orig,orig,vex")
> +   (set_attr "prefix" "orig,orig,maybe_evex")
>     (set_attr "mode" "<MODE>")])
>  
>  (define_insn "*fop_<mode>_comm_sse"
> @@ -13651,7 +13659,7 @@
>          (const_string "ssemul")
>          (const_string "sseadd")))
>     (set_attr "isa" "noavx,avx")
> -   (set_attr "prefix" "orig,vex")
> +   (set_attr "prefix" "orig,maybe_evex")
>     (set_attr "mode" "<MODE>")])
>  
>  (define_insn "*fop_<mode>_comm_i387"
> @@ -13670,10 +13678,10 @@
>     (set_attr "mode" "<MODE>")])
>  
>  (define_insn "*fop_<mode>_1_mixed"
> -  [(set (match_operand:MODEF 0 "register_operand" "=f,f,x,x")
> +  [(set (match_operand:MODEF 0 "register_operand" "=f,f,x,v")
>       (match_operator:MODEF 3 "binary_fp_operator"
> -       [(match_operand:MODEF 1 "nonimmediate_operand" "0,fm,0,x")
> -        (match_operand:MODEF 2 "nonimmediate_operand" "fm,0,xm,xm")]))]
> +       [(match_operand:MODEF 1 "nonimmediate_operand" "0,fm,0,v")
> +        (match_operand:MODEF 2 "nonimmediate_operand" "fm,0,xm,vm")]))]
>    "SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_MIX_SSE_I387
>     && !COMMUTATIVE_ARITH_P (operands[3])
>     && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
> @@ -13694,7 +13702,7 @@
>                ]
>                (const_string "fop")))
>     (set_attr "isa" "*,*,noavx,avx")
> -   (set_attr "prefix" "orig,orig,orig,vex")
> +   (set_attr "prefix" "orig,orig,orig,maybe_evex")
>     (set_attr "mode" "<MODE>")])
>  
>  (define_insn "*rcpsf2_sse"
> @@ -13710,10 +13718,10 @@
>     (set_attr "mode" "SF")])
>  
>  (define_insn "*fop_<mode>_1_sse"
> -  [(set (match_operand:MODEF 0 "register_operand" "=x,x")
> +  [(set (match_operand:MODEF 0 "register_operand" "=x,v")
>       (match_operator:MODEF 3 "binary_fp_operator"
> -       [(match_operand:MODEF 1 "register_operand" "0,x")
> -        (match_operand:MODEF 2 "nonimmediate_operand" "xm,xm")]))]
> +       [(match_operand:MODEF 1 "register_operand" "0,v")
> +        (match_operand:MODEF 2 "nonimmediate_operand" "xm,vm")]))]
>    "SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH
>     && !COMMUTATIVE_ARITH_P (operands[3])"
>    "* return output_387_binary_op (insn, operands);"
> @@ -13725,7 +13733,7 @@
>                ]
>                (const_string "sseadd")))
>     (set_attr "isa" "noavx,avx")
> -   (set_attr "prefix" "orig,vex")
> +   (set_attr "prefix" "orig,maybe_evex")
>     (set_attr "mode" "<MODE>")])
>  
>  ;; This pattern is not fully shadowed by the pattern above.
> @@ -14029,9 +14037,9 @@
>  })
>  
>  (define_insn "*sqrt<mode>2_sse"
> -  [(set (match_operand:MODEF 0 "register_operand" "=x")
> +  [(set (match_operand:MODEF 0 "register_operand" "=v")
>       (sqrt:MODEF
> -       (match_operand:MODEF 1 "nonimmediate_operand" "xm")))]
> +       (match_operand:MODEF 1 "nonimmediate_operand" "vm")))]
>    "SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH"
>    "%vsqrt<ssemodesuffix>\t{%1, %d0|%d0, %1}"
>    [(set_attr "type" "sse")
> @@ -16993,17 +17001,17 @@
>        (UNSPEC_IEEE_MIN "min")])
>  
>  (define_insn "*ieee_s<ieee_maxmin><mode>3"
> -  [(set (match_operand:MODEF 0 "register_operand" "=x,x")
> +  [(set (match_operand:MODEF 0 "register_operand" "=x,v")
>       (unspec:MODEF
> -       [(match_operand:MODEF 1 "register_operand" "0,x")
> -        (match_operand:MODEF 2 "nonimmediate_operand" "xm,xm")]
> +       [(match_operand:MODEF 1 "register_operand" "0,v")
> +        (match_operand:MODEF 2 "nonimmediate_operand" "xm,vm")]
>         IEEE_MAXMIN))]
>    "SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH"
>    "@
>     <ieee_maxmin><ssemodesuffix>\t{%2, %0|%0, %2}
>     v<ieee_maxmin><ssemodesuffix>\t{%2, %1, %0|%0, %1, %2}"
>    [(set_attr "isa" "noavx,avx")
> -   (set_attr "prefix" "orig,vex")
> +   (set_attr "prefix" "orig,maybe_evex")
>     (set_attr "type" "sseadd")
>     (set_attr "mode" "<MODE>")])
>  
> -- 
> 1.8.3.1

Reply via email to