Re: Add IFN_COND_FMA functions
Richard Biener writes: > On Thu, May 24, 2018 at 2:08 PM Richard Sandiford < > richard.sandif...@linaro.org> wrote: > >> This patch adds conditional equivalents of the IFN_FMA built-in functions. >> Most of it is just a mechanical extension of the binary stuff. > >> Tested on aarch64-linux-gnu (with and without SVE), aarch64_be-elf >> and x86_64-linux-gnu. OK for the non-AArch64 bits? > > OK. Thanks. For the record, here's what I installed after updating the SVE patterns in line with rth's recent MOVPRFX changes. Richard 2018-07-12 Richard Sandiford gcc/ * doc/md.texi (cond_fma, cond_fms, cond_fnma, cond_fnms): Document. * optabs.def (cond_fma_optab, cond_fms_optab, cond_fnma_optab) (cond_fnms_optab): New optabs. * internal-fn.def (COND_FMA, COND_FMS, COND_FNMA, COND_FNMS): New internal functions. (FMA): Use DEF_INTERNAL_FLT_FN rather than DEF_INTERNAL_FLT_FLOATN_FN. * internal-fn.h (get_conditional_internal_fn): Declare. (get_unconditional_internal_fn): Likewise. * internal-fn.c (cond_ternary_direct): New macro. (expand_cond_ternary_optab_fn): Likewise. (direct_cond_ternary_optab_supported_p): Likewise. (FOR_EACH_COND_FN_PAIR): Likewise. (get_conditional_internal_fn): New function. (get_unconditional_internal_fn): Likewise. * gimple-match.h (gimple_match_op::MAX_NUM_OPS): Bump to 5. (gimple_match_op::gimple_match_op): Add a new overload for 5 operands. (gimple_match_op::set_op): Likewise. (gimple_resimplify5): Declare. * genmatch.c (decision_tree::gen): Generate simplifications for 5 operands. * gimple-match-head.c (gimple_simplify): Define an overload for 5 operands. Handle calls with 5 arguments in the top-level overload. (convert_conditional_op): Handle conversions from unconditional internal functions to conditional ones. (gimple_resimplify5): New function. (build_call_internal): Pass a fifth operand. (maybe_push_res_to_seq): Likewise. (try_conditional_simplification): Try converting conditional internal functions to unconditional internal functions. Handle 3-operand unconditional forms. * match.pd (UNCOND_TERNARY, COND_TERNARY): Operator lists. Define ternary equivalents of the current rules for binary conditional internal functions. * config/aarch64/aarch64.c (aarch64_preferred_else_value): Handle ternary operations. * config/aarch64/iterators.md (UNSPEC_COND_FMLA, UNSPEC_COND_FMLS) (UNSPEC_COND_FNMLA, UNSPEC_COND_FNMLS): New unspecs. (optab): Handle them. (SVE_COND_FP_TERNARY): New int iterator. (sve_fmla_op, sve_fmad_op): New int attributes. * config/aarch64/aarch64-sve.md (cond_) (*cond__2, *cond__any): New SVE_COND_FP_TERNARY patterns. gcc/testsuite/ * gcc.dg/vect/vect-cond-arith-3.c: New test. * gcc.target/aarch64/sve/vcond_13.c: Likewise. * gcc.target/aarch64/sve/vcond_13_run.c: Likewise. * gcc.target/aarch64/sve/vcond_14.c: Likewise. * gcc.target/aarch64/sve/vcond_14_run.c: Likewise. * gcc.target/aarch64/sve/vcond_15.c: Likewise. * gcc.target/aarch64/sve/vcond_15_run.c: Likewise. * gcc.target/aarch64/sve/vcond_16.c: Likewise. * gcc.target/aarch64/sve/vcond_16_run.c: Likewise. Index: gcc/doc/md.texi === --- gcc/doc/md.texi 2018-07-12 12:39:27.789323671 +0100 +++ gcc/doc/md.texi 2018-07-12 12:42:44.366933190 +0100 @@ -6438,6 +6438,23 @@ Operands 0, 2, 3 and 4 all have mode @va integer if @var{m} is scalar, otherwise it has the mode returned by @code{TARGET_VECTORIZE_GET_MASK_MODE}. +@cindex @code{cond_fma@var{mode}} instruction pattern +@cindex @code{cond_fms@var{mode}} instruction pattern +@cindex @code{cond_fnma@var{mode}} instruction pattern +@cindex @code{cond_fnms@var{mode}} instruction pattern +@item @samp{cond_fma@var{mode}} +@itemx @samp{cond_fms@var{mode}} +@itemx @samp{cond_fnma@var{mode}} +@itemx @samp{cond_fnms@var{mode}} +Like @samp{cond_add@var{m}}, except that the conditional operation +takes 3 operands rather than two. For example, the vector form of +@samp{cond_fma@var{mode}} is equivalent to: + +@smallexample +for (i = 0; i < GET_MODE_NUNITS (@var{m}); i++) + op0[i] = op1[i] ? fma (op2[i], op3[i], op4[i]) : op5[i]; +@end smallexample + @cindex @code{neg@var{mode}cc} instruction pattern @item @samp{neg@var{mode}cc} Similar to @samp{mov@var{mode}cc} but for conditional negation. Conditionally Index: gcc/optabs.def === --- gcc/optabs.def 2018-07-12 12:39:27.976869878 +0100 +++ gcc/optabs.def 2018-07-12 12:42:44.368856626 +0100 @@ -234,6 +234,10 @@ OPTAB_D (cond_smin_optab, "cond_smin$a") OPTAB_D
Re: Add IFN_COND_FMA functions
On Thu, May 24, 2018 at 2:08 PM Richard Sandiford < richard.sandif...@linaro.org> wrote: > This patch adds conditional equivalents of the IFN_FMA built-in functions. > Most of it is just a mechanical extension of the binary stuff. > Tested on aarch64-linux-gnu (with and without SVE), aarch64_be-elf > and x86_64-linux-gnu. OK for the non-AArch64 bits? OK. Richard. > Richard > 2018-05-24 Richard Sandiford> gcc/ > * doc/md.texi (cond_fma, cond_fms, cond_fnma, cond_fnms): Document. > * optabs.def (cond_fma_optab, cond_fms_optab, cond_fnma_optab) > (cond_fnms_optab): New optabs. > * internal-fn.def (COND_FMA, COND_FMS, COND_FNMA, COND_FNMS): New > internal functions. > (FMA): Use DEF_INTERNAL_FLT_FN rather than DEF_INTERNAL_FLT_FLOATN_FN. > * internal-fn.h (get_conditional_internal_fn): Declare. > (get_unconditional_internal_fn): Likewise. > * internal-fn.c (cond_ternary_direct): New macro. > (expand_cond_ternary_optab_fn): Likewise. > (direct_cond_ternary_optab_supported_p): Likewise. > (FOR_EACH_COND_FN_PAIR): Likewise. > (get_conditional_internal_fn): New function. > (get_unconditional_internal_fn): Likewise. > * gimple-match.h (gimple_match_op::MAX_NUM_OPS): Bump to 5. > (gimple_match_op::gimple_match_op): Add a new overload for 5 > operands. > (gimple_match_op::set_op): Likewise. > (gimple_resimplify5): Declare. > * genmatch.c (decision_tree::gen): Generate simplifications for > 5 operands. > * gimple-match-head.c (gimple_simplify): Define an overload for > 5 operands. Handle calls with 5 arguments in the top-level overload. > (convert_conditional_op): Handle conversions from unconditional > internal functions to conditional ones. > (gimple_resimplify5): New function. > (build_call_internal): Pass a fifth operand. > (maybe_push_res_to_seq): Likewise. > (try_conditional_simplification): Try converting conditional > internal functions to unconditional internal functions. > Handle 3-operand unconditional forms. > * match.pd (UNCOND_TERNARY, COND_TERNARY): Operator lists. > Define ternary equivalents of the current rules for binary conditional > internal functions. > * config/aarch64/aarch64.c (aarch64_preferred_else_value): Handle > ternary operations. > * config/aarch64/aarch64-sve.md (cond_) > (*cond_, *cond__acc): New > SVE_COND_FP_TERNARY patterns. > * config/aarch64/iterators.md (UNSPEC_COND_FMLA, UNSPEC_COND_FMLS) > (UNSPEC_COND_FNMLA, UNSPEC_COND_FNMLS): New unspecs. > (optab): Handle them. > (SVE_COND_FP_TERNARY): New int iterator. > (sve_fmla_op, sve_fmad_op): New int attributes. > gcc/testsuite/ > * gcc.dg/vect/vect-cond-arith-3.c: New test. > * gcc.target/aarch64/sve/vcond_13.c: Likewise. > * gcc.target/aarch64/sve/vcond_13_run.c: Likewise. > * gcc.target/aarch64/sve/vcond_14.c: Likewise. > * gcc.target/aarch64/sve/vcond_14_run.c: Likewise. > * gcc.target/aarch64/sve/vcond_15.c: Likewise. > * gcc.target/aarch64/sve/vcond_15_run.c: Likewise. > * gcc.target/aarch64/sve/vcond_16.c: Likewise. > * gcc.target/aarch64/sve/vcond_16_run.c: Likewise. > Index: gcc/doc/md.texi > === > --- gcc/doc/md.texi 2018-05-24 10:12:10.142352315 +0100 > +++ gcc/doc/md.texi 2018-05-24 13:05:46.047607587 +0100 > @@ -6386,6 +6386,23 @@ Operands 0, 2, 3 and 4 all have mode @va > integer if @var{m} is scalar, otherwise it has the mode returned by > @code{TARGET_VECTORIZE_GET_MASK_MODE}. > +@cindex @code{cond_fma@var{mode}} instruction pattern > +@cindex @code{cond_fms@var{mode}} instruction pattern > +@cindex @code{cond_fnma@var{mode}} instruction pattern > +@cindex @code{cond_fnms@var{mode}} instruction pattern > +@item @samp{cond_fma@var{mode}} > +@itemx @samp{cond_fms@var{mode}} > +@itemx @samp{cond_fnma@var{mode}} > +@itemx @samp{cond_fnms@var{mode}} > +Like @samp{cond_add@var{m}}, except that the conditional operation > +takes 3 operands rather than two. For example, the vector form of > +@samp{cond_fma@var{mode}} is equivalent to: > + > +@smallexample > +for (i = 0; i < GET_MODE_NUNITS (@var{m}); i++) > + op0[i] = op1[i] ? fma (op2[i], op3[i], op4[i]) : op5[i]; > +@end smallexample > + > @cindex @code{neg@var{mode}cc} instruction pattern > @item @samp{neg@var{mode}cc} > Similar to @samp{mov@var{mode}cc} but for conditional negation. Conditionally > Index: gcc/optabs.def > === > --- gcc/optabs.def 2018-05-24 10:12:10.146352152 +0100 > +++ gcc/optabs.def
Add IFN_COND_FMA functions
This patch adds conditional equivalents of the IFN_FMA built-in functions. Most of it is just a mechanical extension of the binary stuff. Tested on aarch64-linux-gnu (with and without SVE), aarch64_be-elf and x86_64-linux-gnu. OK for the non-AArch64 bits? Richard 2018-05-24 Richard Sandifordgcc/ * doc/md.texi (cond_fma, cond_fms, cond_fnma, cond_fnms): Document. * optabs.def (cond_fma_optab, cond_fms_optab, cond_fnma_optab) (cond_fnms_optab): New optabs. * internal-fn.def (COND_FMA, COND_FMS, COND_FNMA, COND_FNMS): New internal functions. (FMA): Use DEF_INTERNAL_FLT_FN rather than DEF_INTERNAL_FLT_FLOATN_FN. * internal-fn.h (get_conditional_internal_fn): Declare. (get_unconditional_internal_fn): Likewise. * internal-fn.c (cond_ternary_direct): New macro. (expand_cond_ternary_optab_fn): Likewise. (direct_cond_ternary_optab_supported_p): Likewise. (FOR_EACH_COND_FN_PAIR): Likewise. (get_conditional_internal_fn): New function. (get_unconditional_internal_fn): Likewise. * gimple-match.h (gimple_match_op::MAX_NUM_OPS): Bump to 5. (gimple_match_op::gimple_match_op): Add a new overload for 5 operands. (gimple_match_op::set_op): Likewise. (gimple_resimplify5): Declare. * genmatch.c (decision_tree::gen): Generate simplifications for 5 operands. * gimple-match-head.c (gimple_simplify): Define an overload for 5 operands. Handle calls with 5 arguments in the top-level overload. (convert_conditional_op): Handle conversions from unconditional internal functions to conditional ones. (gimple_resimplify5): New function. (build_call_internal): Pass a fifth operand. (maybe_push_res_to_seq): Likewise. (try_conditional_simplification): Try converting conditional internal functions to unconditional internal functions. Handle 3-operand unconditional forms. * match.pd (UNCOND_TERNARY, COND_TERNARY): Operator lists. Define ternary equivalents of the current rules for binary conditional internal functions. * config/aarch64/aarch64.c (aarch64_preferred_else_value): Handle ternary operations. * config/aarch64/aarch64-sve.md (cond_) (*cond_, *cond__acc): New SVE_COND_FP_TERNARY patterns. * config/aarch64/iterators.md (UNSPEC_COND_FMLA, UNSPEC_COND_FMLS) (UNSPEC_COND_FNMLA, UNSPEC_COND_FNMLS): New unspecs. (optab): Handle them. (SVE_COND_FP_TERNARY): New int iterator. (sve_fmla_op, sve_fmad_op): New int attributes. gcc/testsuite/ * gcc.dg/vect/vect-cond-arith-3.c: New test. * gcc.target/aarch64/sve/vcond_13.c: Likewise. * gcc.target/aarch64/sve/vcond_13_run.c: Likewise. * gcc.target/aarch64/sve/vcond_14.c: Likewise. * gcc.target/aarch64/sve/vcond_14_run.c: Likewise. * gcc.target/aarch64/sve/vcond_15.c: Likewise. * gcc.target/aarch64/sve/vcond_15_run.c: Likewise. * gcc.target/aarch64/sve/vcond_16.c: Likewise. * gcc.target/aarch64/sve/vcond_16_run.c: Likewise. Index: gcc/doc/md.texi === --- gcc/doc/md.texi 2018-05-24 10:12:10.142352315 +0100 +++ gcc/doc/md.texi 2018-05-24 13:05:46.047607587 +0100 @@ -6386,6 +6386,23 @@ Operands 0, 2, 3 and 4 all have mode @va integer if @var{m} is scalar, otherwise it has the mode returned by @code{TARGET_VECTORIZE_GET_MASK_MODE}. +@cindex @code{cond_fma@var{mode}} instruction pattern +@cindex @code{cond_fms@var{mode}} instruction pattern +@cindex @code{cond_fnma@var{mode}} instruction pattern +@cindex @code{cond_fnms@var{mode}} instruction pattern +@item @samp{cond_fma@var{mode}} +@itemx @samp{cond_fms@var{mode}} +@itemx @samp{cond_fnma@var{mode}} +@itemx @samp{cond_fnms@var{mode}} +Like @samp{cond_add@var{m}}, except that the conditional operation +takes 3 operands rather than two. For example, the vector form of +@samp{cond_fma@var{mode}} is equivalent to: + +@smallexample +for (i = 0; i < GET_MODE_NUNITS (@var{m}); i++) + op0[i] = op1[i] ? fma (op2[i], op3[i], op4[i]) : op5[i]; +@end smallexample + @cindex @code{neg@var{mode}cc} instruction pattern @item @samp{neg@var{mode}cc} Similar to @samp{mov@var{mode}cc} but for conditional negation. Conditionally Index: gcc/optabs.def === --- gcc/optabs.def 2018-05-24 10:12:10.146352152 +0100 +++ gcc/optabs.def 2018-05-24 13:05:46.049605128 +0100 @@ -234,6 +234,10 @@ OPTAB_D (cond_smin_optab, "cond_smin$a") OPTAB_D (cond_smax_optab, "cond_smax$a") OPTAB_D (cond_umin_optab, "cond_umin$a") OPTAB_D (cond_umax_optab, "cond_umax$a") +OPTAB_D (cond_fma_optab, "cond_fma$a") +OPTAB_D (cond_fms_optab, "cond_fms$a") +OPTAB_D (cond_fnma_optab,