4
0
mirror of git://sourceware.org/git/newlib-cygwin.git synced 2025-01-19 12:59:21 +08:00
Keith Packard via Newlib a44bc679a4 libm/machine/arm: Add optimized fmaf and fma when available
When HAVE_FAST_FMAF is set, use the vfma.f32 instruction, when
HAVE_FAST_FMA is set, use the vfma.f64 instruction.

Usually the compiler built-ins will already have inlined these
instructions, but provide these symbols for cases where that doesn't
work instead of falling back to the (inaccurate) common code versions.

Signed-off-by: Keith Packard <keithp@keithp.com>
2020-08-10 21:04:12 +02:00

47 lines
1.2 KiB
C

/* Copyright (C) 2002 by Red Hat, Incorporated. All rights reserved.
*
* Permission to use, copy, modify, and distribute this software
* is freely granted, provided that this notice is preserved.
*/
#include "fdlibm.h"
#if !HAVE_FAST_FMAF
#ifdef __STDC__
float fmaf(float x, float y, float z)
#else
float fmaf(x,y,z)
float x;
float y;
float z;
#endif
{
/* NOTE: The floating-point exception behavior of this is not as
* required. But since the basic function is not really done properly,
* it is not worth bothering to get the exceptions right, either. */
/* Let the implementation handle this. */ /* <= NONSENSE! */
/* In floating-point implementations in which double is larger than float,
* computing as double should provide the desired function. Otherwise,
* the behavior will not be as specified in the standards. */
return (float) (((double) x * (double) y) + (double) z);
}
#endif
#ifdef _DOUBLE_IS_32BITS
#ifdef __STDC__
double fma(double x, double y, double z)
#else
double fma(x,y,z)
double x;
double y;
double z;
#endif
{
return (double) fmaf((float) x, (float) y, (float) z);
}
#endif /* defined(_DOUBLE_IS_32BITS) */