On Fri, Mar 22, 2019 at 9:56 AM Jakub Jelinek <ja...@redhat.com> wrote:
>
> Hi!
>
> While working on the PR89784 patch, I've noticed various inconsistencies
> in the fma patterns between constraints and predicates.  Most of them time
> it was correct though.
> This is what I found:
>
> 1) if the constraint is like <round_constraint> or <round_constraint>,v
> or v,<round_constraint>, then it will be just v or v,v with rounding,
> while without rounding vm or vm,v or v,vm, so IMHO we don't want
> unconditional nonimmediate_operand predicate, but <round_nimm_predicate>
> which is vector_operand when not rounding and register_operand otherwise.
>
> 2) if the constraint is 0 or 0,0 (and the output is always =v or =v,v
> in those cases), then using <round_nimm_predicate> makes no sense,
> even without rounding we will not really allow memory in there, so this
> patch uses register_operand in those cases.
>
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
>
> 2019-03-22  Jakub Jelinek  <ja...@redhat.com>
>
>         * config/i386/sse.md (<avx512>_fmadd_<mode>_mask<round_name>,
>         <avx512>_fmadd_<mode>_mask3<round_name>,
>         <avx512>_fmsub_<mode>_mask<round_name>,
>         <avx512>_fmsub_<mode>_mask3<round_name>,
>         <avx512>_fnmadd_<mode>_mask<round_name>,
>         <avx512>_fnmadd_<mode>_mask3<round_name>,
>         <avx512>_fnmsub_<mode>_mask<round_name>,
>         <avx512>_fnmsub_<mode>_mask3<round_name>,
>         <avx512>_fmaddsub_<mode>_mask<round_name>,
>         <avx512>_fmaddsub_<mode>_mask3<round_name>,
>         <avx512>_fmsubadd_<mode>_mask<round_name>,
>         <avx512>_fmsubadd_<mode>_mask3<round_name>): Use
>         <round_nimm_predicate> instead of nonimmediate_operand.
>         (fmai_vmfmadd_<mode><round_name>, fmai_vmfmsub_<mode><round_name>,
>         fmai_vmfnmadd_<mode><round_name>, fmai_vmfnmsub_<mode><round_name>):
>         Use register_operand instead of <round_nimm_predicate> for the
>         operand that needs to match output.
>         (*fmai_fmadd_<mode>, *fmai_fmsub_<mode>,
>         *fmai_fnmadd_<mode><round_name>, *fmai_fnmsub_<mode><round_name>):
>         Likewise.  Formatting fixes.

OK for mainline and backports.

Thanks,
Uros.

> --- gcc/config/i386/sse.md.jj   2019-03-14 09:55:49.291867091 +0100
> +++ gcc/config/i386/sse.md      2019-03-21 19:15:21.292495008 +0100
> @@ -3958,8 +3958,8 @@ (define_insn "<avx512>_fmadd_<mode>_mask
>         (vec_merge:VF_AVX512VL
>           (fma:VF_AVX512VL
>             (match_operand:VF_AVX512VL 1 "register_operand" "0,0")
> -           (match_operand:VF_AVX512VL 2 "nonimmediate_operand" 
> "<round_constraint>,v")
> -           (match_operand:VF_AVX512VL 3 "nonimmediate_operand" 
> "v,<round_constraint>"))
> +           (match_operand:VF_AVX512VL 2 "<round_nimm_predicate>" 
> "<round_constraint>,v")
> +           (match_operand:VF_AVX512VL 3 "<round_nimm_predicate>" 
> "v,<round_constraint>"))
>           (match_dup 1)
>           (match_operand:<avx512fmaskmode> 4 "register_operand" "Yk,Yk")))]
>    "TARGET_AVX512F && <round_mode512bit_condition>"
> @@ -3974,7 +3974,7 @@ (define_insn "<avx512>_fmadd_<mode>_mask
>         (vec_merge:VF_AVX512VL
>           (fma:VF_AVX512VL
>             (match_operand:VF_AVX512VL 1 "register_operand" "v")
> -           (match_operand:VF_AVX512VL 2 "nonimmediate_operand" 
> "<round_constraint>")
> +           (match_operand:VF_AVX512VL 2 "<round_nimm_predicate>" 
> "<round_constraint>")
>             (match_operand:VF_AVX512VL 3 "register_operand" "0"))
>           (match_dup 3)
>           (match_operand:<avx512fmaskmode> 4 "register_operand" "Yk")))]
> @@ -4078,9 +4078,9 @@ (define_insn "<avx512>_fmsub_<mode>_mask
>         (vec_merge:VF_AVX512VL
>           (fma:VF_AVX512VL
>             (match_operand:VF_AVX512VL 1 "register_operand" "0,0")
> -           (match_operand:VF_AVX512VL 2 "nonimmediate_operand" 
> "<round_constraint>,v")
> +           (match_operand:VF_AVX512VL 2 "<round_nimm_predicate>" 
> "<round_constraint>,v")
>             (neg:VF_AVX512VL
> -             (match_operand:VF_AVX512VL 3 "nonimmediate_operand" 
> "v,<round_constraint>")))
> +             (match_operand:VF_AVX512VL 3 "<round_nimm_predicate>" 
> "v,<round_constraint>")))
>           (match_dup 1)
>           (match_operand:<avx512fmaskmode> 4 "register_operand" "Yk,Yk")))]
>    "TARGET_AVX512F"
> @@ -4095,7 +4095,7 @@ (define_insn "<avx512>_fmsub_<mode>_mask
>         (vec_merge:VF_AVX512VL
>           (fma:VF_AVX512VL
>             (match_operand:VF_AVX512VL 1 "register_operand" "v")
> -           (match_operand:VF_AVX512VL 2 "nonimmediate_operand" 
> "<round_constraint>")
> +           (match_operand:VF_AVX512VL 2 "<round_nimm_predicate>" 
> "<round_constraint>")
>             (neg:VF_AVX512VL
>               (match_operand:VF_AVX512VL 3 "register_operand" "0")))
>           (match_dup 3)
> @@ -4201,8 +4201,8 @@ (define_insn "<avx512>_fnmadd_<mode>_mas
>           (fma:VF_AVX512VL
>             (neg:VF_AVX512VL
>               (match_operand:VF_AVX512VL 1 "register_operand" "0,0"))
> -           (match_operand:VF_AVX512VL 2 "nonimmediate_operand" 
> "<round_constraint>,v")
> -           (match_operand:VF_AVX512VL 3 "nonimmediate_operand" 
> "v,<round_constraint>"))
> +           (match_operand:VF_AVX512VL 2 "<round_nimm_predicate>" 
> "<round_constraint>,v")
> +           (match_operand:VF_AVX512VL 3 "<round_nimm_predicate>" 
> "v,<round_constraint>"))
>           (match_dup 1)
>           (match_operand:<avx512fmaskmode> 4 "register_operand" "Yk,Yk")))]
>    "TARGET_AVX512F && <round_mode512bit_condition>"
> @@ -4218,7 +4218,7 @@ (define_insn "<avx512>_fnmadd_<mode>_mas
>           (fma:VF_AVX512VL
>             (neg:VF_AVX512VL
>               (match_operand:VF_AVX512VL 1 "register_operand" "v"))
> -           (match_operand:VF_AVX512VL 2 "nonimmediate_operand" 
> "<round_constraint>")
> +           (match_operand:VF_AVX512VL 2 "<round_nimm_predicate>" 
> "<round_constraint>")
>             (match_operand:VF_AVX512VL 3 "register_operand" "0"))
>           (match_dup 3)
>           (match_operand:<avx512fmaskmode> 4 "register_operand" "Yk")))]
> @@ -4328,9 +4328,9 @@ (define_insn "<avx512>_fnmsub_<mode>_mas
>           (fma:VF_AVX512VL
>             (neg:VF_AVX512VL
>               (match_operand:VF_AVX512VL 1 "register_operand" "0,0"))
> -           (match_operand:VF_AVX512VL 2 "nonimmediate_operand" 
> "<round_constraint>,v")
> +           (match_operand:VF_AVX512VL 2 "<round_nimm_predicate>" 
> "<round_constraint>,v")
>             (neg:VF_AVX512VL
> -             (match_operand:VF_AVX512VL 3 "nonimmediate_operand" 
> "v,<round_constraint>")))
> +             (match_operand:VF_AVX512VL 3 "<round_nimm_predicate>" 
> "v,<round_constraint>")))
>           (match_dup 1)
>           (match_operand:<avx512fmaskmode> 4 "register_operand" "Yk,Yk")))]
>    "TARGET_AVX512F && <round_mode512bit_condition>"
> @@ -4346,7 +4346,7 @@ (define_insn "<avx512>_fnmsub_<mode>_mas
>           (fma:VF_AVX512VL
>             (neg:VF_AVX512VL
>               (match_operand:VF_AVX512VL 1 "register_operand" "v"))
> -           (match_operand:VF_AVX512VL 2 "nonimmediate_operand" 
> "<round_constraint>")
> +           (match_operand:VF_AVX512VL 2 "<round_nimm_predicate>" 
> "<round_constraint>")
>             (neg:VF_AVX512VL
>               (match_operand:VF_AVX512VL 3 "register_operand" "0")))
>           (match_dup 3)
> @@ -4428,8 +4428,8 @@ (define_insn "<avx512>_fmaddsub_<mode>_m
>         (vec_merge:VF_AVX512VL
>           (unspec:VF_AVX512VL
>             [(match_operand:VF_AVX512VL 1 "register_operand" "0,0")
> -            (match_operand:VF_AVX512VL 2 "nonimmediate_operand" 
> "<round_constraint>,v")
> -            (match_operand:VF_AVX512VL 3 "nonimmediate_operand" 
> "v,<round_constraint>")]
> +            (match_operand:VF_AVX512VL 2 "<round_nimm_predicate>" 
> "<round_constraint>,v")
> +            (match_operand:VF_AVX512VL 3 "<round_nimm_predicate>" 
> "v,<round_constraint>")]
>             UNSPEC_FMADDSUB)
>           (match_dup 1)
>           (match_operand:<avx512fmaskmode> 4 "register_operand" "Yk,Yk")))]
> @@ -4445,7 +4445,7 @@ (define_insn "<avx512>_fmaddsub_<mode>_m
>         (vec_merge:VF_AVX512VL
>           (unspec:VF_AVX512VL
>             [(match_operand:VF_AVX512VL 1 "register_operand" "v")
> -            (match_operand:VF_AVX512VL 2 "nonimmediate_operand" 
> "<round_constraint>")
> +            (match_operand:VF_AVX512VL 2 "<round_nimm_predicate>" 
> "<round_constraint>")
>              (match_operand:VF_AVX512VL 3 "register_operand" "0")]
>             UNSPEC_FMADDSUB)
>           (match_dup 3)
> @@ -4495,9 +4495,9 @@ (define_insn "<avx512>_fmsubadd_<mode>_m
>         (vec_merge:VF_AVX512VL
>           (unspec:VF_AVX512VL
>             [(match_operand:VF_AVX512VL 1 "register_operand" "0,0")
> -            (match_operand:VF_AVX512VL 2 "nonimmediate_operand" 
> "<round_constraint>,v")
> +            (match_operand:VF_AVX512VL 2 "<round_nimm_predicate>" 
> "<round_constraint>,v")
>              (neg:VF_AVX512VL
> -              (match_operand:VF_AVX512VL 3 "nonimmediate_operand" 
> "v,<round_constraint>"))]
> +              (match_operand:VF_AVX512VL 3 "<round_nimm_predicate>" 
> "v,<round_constraint>"))]
>             UNSPEC_FMADDSUB)
>           (match_dup 1)
>           (match_operand:<avx512fmaskmode> 4 "register_operand" "Yk,Yk")))]
> @@ -4513,7 +4513,7 @@ (define_insn "<avx512>_fmsubadd_<mode>_m
>         (vec_merge:VF_AVX512VL
>           (unspec:VF_AVX512VL
>             [(match_operand:VF_AVX512VL 1 "register_operand" "v")
> -            (match_operand:VF_AVX512VL 2 "nonimmediate_operand" 
> "<round_constraint>")
> +            (match_operand:VF_AVX512VL 2 "<round_nimm_predicate>" 
> "<round_constraint>")
>              (neg:VF_AVX512VL
>                (match_operand:VF_AVX512VL 3 "register_operand" "0"))]
>             UNSPEC_FMADDSUB)
> @@ -4531,7 +4531,7 @@ (define_expand "fmai_vmfmadd_<mode><roun
>    [(set (match_operand:VF_128 0 "register_operand")
>         (vec_merge:VF_128
>           (fma:VF_128
> -           (match_operand:VF_128 1 "<round_nimm_predicate>")
> +           (match_operand:VF_128 1 "register_operand")
>             (match_operand:VF_128 2 "<round_nimm_predicate>")
>             (match_operand:VF_128 3 "<round_nimm_predicate>"))
>           (match_dup 1)
> @@ -4542,7 +4542,7 @@ (define_expand "fmai_vmfmsub_<mode><roun
>    [(set (match_operand:VF_128 0 "register_operand")
>         (vec_merge:VF_128
>           (fma:VF_128
> -           (match_operand:VF_128 1 "<round_nimm_predicate>")
> +           (match_operand:VF_128 1 "register_operand")
>             (match_operand:VF_128 2 "<round_nimm_predicate>")
>             (neg:VF_128
>               (match_operand:VF_128 3 "<round_nimm_predicate>")))
> @@ -4556,7 +4556,7 @@ (define_expand "fmai_vmfnmadd_<mode><rou
>           (fma:VF_128
>             (neg:VF_128
>               (match_operand:VF_128 2 "<round_nimm_predicate>"))
> -           (match_operand:VF_128 1 "<round_nimm_predicate>")
> +           (match_operand:VF_128 1 "register_operand")
>             (match_operand:VF_128 3 "<round_nimm_predicate>"))
>           (match_dup 1)
>           (const_int 1)))]
> @@ -4568,7 +4568,7 @@ (define_expand "fmai_vmfnmsub_<mode><rou
>           (fma:VF_128
>             (neg:VF_128
>               (match_operand:VF_128 2 "<round_nimm_predicate>"))
> -           (match_operand:VF_128 1 "<round_nimm_predicate>")
> +           (match_operand:VF_128 1 "register_operand")
>             (neg:VF_128
>               (match_operand:VF_128 3 "<round_nimm_predicate>")))
>           (match_dup 1)
> @@ -4579,9 +4579,9 @@ (define_insn "*fmai_fmadd_<mode>"
>    [(set (match_operand:VF_128 0 "register_operand" "=v,v")
>          (vec_merge:VF_128
>           (fma:VF_128
> -           (match_operand:VF_128 1 "<round_nimm_predicate>" " 0, 0")
> +           (match_operand:VF_128 1 "register_operand" "0,0")
>             (match_operand:VF_128 2 "<round_nimm_predicate>" 
> "<round_constraint>, v")
> -           (match_operand:VF_128 3 "<round_nimm_predicate>" " 
> v,<round_constraint>"))
> +           (match_operand:VF_128 3 "<round_nimm_predicate>" 
> "v,<round_constraint>"))
>           (match_dup 1)
>           (const_int 1)))]
>    "TARGET_FMA || TARGET_AVX512F"
> @@ -4595,10 +4595,10 @@ (define_insn "*fmai_fmsub_<mode>"
>    [(set (match_operand:VF_128 0 "register_operand" "=v,v")
>          (vec_merge:VF_128
>           (fma:VF_128
> -           (match_operand:VF_128   1 "<round_nimm_predicate>" "0,0")
> +           (match_operand:VF_128   1 "register_operand" "0,0")
>             (match_operand:VF_128   2 "<round_nimm_predicate>" 
> "<round_constraint>,v")
>             (neg:VF_128
> -             (match_operand:VF_128 3 "<round_nimm_predicate>" " 
> v,<round_constraint>")))
> +             (match_operand:VF_128 3 "<round_nimm_predicate>" 
> "v,<round_constraint>")))
>           (match_dup 1)
>           (const_int 1)))]
>    "TARGET_FMA || TARGET_AVX512F"
> @@ -4614,7 +4614,7 @@ (define_insn "*fmai_fnmadd_<mode><round_
>           (fma:VF_128
>             (neg:VF_128
>               (match_operand:VF_128 2 "<round_nimm_predicate>" 
> "<round_constraint>,v"))
> -           (match_operand:VF_128   1 "<round_nimm_predicate>" "0,0")
> +           (match_operand:VF_128   1 "register_operand" "0,0")
>             (match_operand:VF_128   3 "<round_nimm_predicate>" 
> "v,<round_constraint>"))
>           (match_dup 1)
>           (const_int 1)))]
> @@ -4630,10 +4630,10 @@ (define_insn "*fmai_fnmsub_<mode><round_
>          (vec_merge:VF_128
>           (fma:VF_128
>             (neg:VF_128
> -             (match_operand:VF_128 2 "<round_nimm_predicate>" 
> "<round_constraint>, v"))
> -           (match_operand:VF_128   1 "<round_nimm_predicate>" " 0, 0")
> +             (match_operand:VF_128 2 "<round_nimm_predicate>" 
> "<round_constraint>,v"))
> +           (match_operand:VF_128   1 "register_operand" "0,0")
>             (neg:VF_128
> -             (match_operand:VF_128 3 "<round_nimm_predicate>" " 
> v,<round_constraint>")))
> +             (match_operand:VF_128 3 "<round_nimm_predicate>" 
> "v,<round_constraint>")))
>           (match_dup 1)
>           (const_int 1)))]
>    "TARGET_FMA || TARGET_AVX512F"
>
>         Jakub

Reply via email to