This is the mail archive of the
mailing list for the GCC project.
RE: [PING][Patch] Add support for IEEE-conformant versions of scalar fmin* and fmax*
- From: "David Sherwood" <david dot sherwood at arm dot com>
- To: "'Richard Biener'" <richard dot guenther at gmail dot com>
- Cc: "GCC Patches" <gcc-patches at gcc dot gnu dot org>
- Date: Mon, 17 Aug 2015 10:29:16 +0100
- Subject: RE: [PING][Patch] Add support for IEEE-conformant versions of scalar fmin* and fmax*
- Authentication-results: sourceware.org; auth=none
- References: <000001d0d5b0$5da4dbb0$18ee9310$ at arm dot com> <CAFiYyc1bgWwdV4PRLBuUv3yC0X-k5gJVuyyV9V7Vrz3Lte+wZw at mail dot gmail dot com>
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.
> -----Original Message-----
> From: Richard Biener [mailto:email@example.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 <firstname.lastname@example.org> 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?
> > 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 <email@example.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.