Hi Richard, Thanks for the reply. I'd chosen to add new expressions as this seemed more consistent with the existing MAX_EXPR and MIN_EXPR tree codes. In addition it would seem to provide more opportunities for optimisation than a target-specific builtin implementation would. I accept that optimisation opportunities will be more limited for strict math compilation, but that it was still worth having them. Also, if we did map it to builtins then the scalar version would go through the optabs and the vector version would go through the target's builtin expansion, which doesn't seem very consistent.
Regards, David. > -----Original Message----- > From: Richard Biener [mailto:richard.guent...@gmail.com] > Sent: 13 August 2015 12:10 > To: David Sherwood > Cc: GCC Patches > Subject: Re: [PING][Patch] Add support for IEEE-conformant versions of scalar > fmin* and fmax* > > On Thu, Aug 13, 2015 at 12:11 PM, David Sherwood <david.sherw...@arm.com> > wrote: > > Hi, > > > > Sorry to bother people again. Is this OK to go now? > > Hmm, why don't you go the vectorized function call path for this, > implementing the builtin_vectorized_function target hook? > > Richard. > > > Thanks! > > David. > > > >> > > >> > > On Mon, 29 Jun 2015, David Sherwood wrote: > >> > > > >> > > > Hi, > >> > > > > >> > > > I have added new STRICT_MAX_EXPR and STRICT_MIN_EXPR expressions to > >> > > > support the > >> > > > IEEE versions of fmin and fmax. This is done by recognising the math > >> > > > library > >> > > > "fmax" and "fmin" builtin functions in a similar way to how this is > >> > > > done for > >> > > > -ffast-math. This also allows us to vectorise the IEEE max/min > >> > > > functions for > >> > > > targets that support it, for example aarch64/aarch32. > >> > > > >> > > This patch is missing documentation. You need to document the new insn > >> > > patterns in md.texi and the new tree codes in generic.texi. > >> > > >> > Hi, I've uploaded a new patch with the documentation. Hope this is ok. > >> > >> In various places where you refer to one operand being NaN, I think you > >> mean one operand being a *quiet* NaN (if one is a signaling NaN - only > >> supported by GCC if -fsignaling-nans - the IEEE minNum and maxNum > >> operations raise "invalid" and return a quiet NaN). > > > > Hi, I have a new patch that hopefully addresses the documentation issues. > > > > Thanks, > > David. > > > > ChangeLog: > > > > 2015-07-15 David Sherwood <david.sherw...@arm.com> > > > > gcc/ > > * builtins.c (integer_valued_real_p): Add STRICT_MIN_EXPR and > > STRICT_MAX_EXPR. > > (fold_builtin_fmin_fmax): For strict math, convert builting fmin and > > fmax to STRICT_MIN_EXPR and STRICT_MIN_EXPR, respectively. > > * expr.c (expand_expr_real_2): Add STRICT_MIN_EXPR and STRICT_MAX_EXPR. > > * fold-const.c (const_binop): Likewise. > > (fold_binary_loc, tree_binary_nonnegative_warnv_p): Likewise. > > (tree_binary_nonzero_warnv_p): Likewise. > > * optabs.h (strict_minmax_support): Declare. > > * optabs.def: Add new optabs strict_max_optab/strict_min_optab. > > * optabs.c (optab_for_tree_code): Return new optabs for STRICT_MIN_EXPR > > and STRICT_MAX_EXPR. > > (strict_minmax_support): New function. > > * real.c (real_arithmetic): Add STRICT_MIN_EXPR and STRICT_MAX_EXPR. > > * tree.def: Likewise. > > * tree.c (associative_tree_code, commutative_tree_code): Likewise. > > * tree-cfg.c (verify_expr): Likewise. > > (verify_gimple_assign_binary): Likewise. > > * tree-inline.c (estimate_operator_cost): Likewise. > > * tree-pretty-print.c (dump_generic_node, op_code_prio): Likewise. > > (op_symbol_code): Likewise. > > gcc/config: > > * aarch64/aarch64.md: New pattern. > > * aarch64/aarch64-simd.md: Likewise. > > * aarch64/iterators.md: New unspecs, iterators. > > * arm/iterators.md: New iterators. > > * arm/unspecs.md: New unspecs. > > * arm/neon.md: New pattern. > > * arm/vfp.md: Likewise. > > gcc/doc: > > * generic.texi: Add STRICT_MAX_EXPR and STRICT_MIN_EXPR. > > * md.texi: Add strict_min and strict_max patterns. > > gcc/testsuite > > * gcc.target/aarch64/maxmin_strict.c: New test. > > * gcc.target/arm/maxmin_strict.c: New test.