I forgot to CC the  maintainers, so I'm pinging with them CC'ed now.

Michael

On Wed, Dec 30, 2015 at 2:55 PM, Michael Zimmermann <
sigmaepsilo...@gmail.com> wrote:

> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Michael Zimmermann <sigmaepsilo...@gmail.com>
> ---
>  StdLib/Include/math.h       |  8 ++++++
>  StdLib/LibC/Math/Math.inf   |  1 +
>  StdLib/LibC/Math/s_floorf.c | 64
> +++++++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 73 insertions(+)
>  create mode 100644 StdLib/LibC/Math/s_floorf.c
>
> diff --git a/StdLib/Include/math.h b/StdLib/Include/math.h
> index 3041120..2b5746b 100644
> --- a/StdLib/Include/math.h
> +++ b/StdLib/Include/math.h
> @@ -304,6 +304,14 @@ double  fabs(double Arg);
>  **/
>  double  floor(double);
>
> +/** Compute the largest integer value not greater than Arg.
> +
> +    @param[in]    Arg   The value to compute the floor of.
> +
> +    @return   The largest integer value not greater than Arg, expressed
> as a floating-point number.
> +**/
> +float  floorf(float);
> +
>  /** Compute the floating-point remainder of A1 / A2.
>
>      @param[in]    A1    The dividend.
> diff --git a/StdLib/LibC/Math/Math.inf b/StdLib/LibC/Math/Math.inf
> index ec5c71a..9d6c66d 100644
> --- a/StdLib/LibC/Math/Math.inf
> +++ b/StdLib/LibC/Math/Math.inf
> @@ -64,6 +64,7 @@
>    s_fabs.c
>    s_ceil.c
>    s_floor.c
> +  s_floorf.c
>    s_trunc.c
>
>    # wrapper functions
> diff --git a/StdLib/LibC/Math/s_floorf.c b/StdLib/LibC/Math/s_floorf.c
> new file mode 100644
> index 0000000..d6e201f
> --- /dev/null
> +++ b/StdLib/LibC/Math/s_floorf.c
> @@ -0,0 +1,64 @@
> +/* s_floorf.c -- float version of s_floor.c.
> + * Conversion to float by Ian Lance Taylor, Cygnus Support,
> i...@cygnus.com.
> + */
> +
> +/*
> + * ====================================================
> + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> + *
> + * Developed at SunPro, a Sun Microsystems, Inc. business.
> + * Permission to use, copy, modify, and distribute this
> + * software is freely granted, provided that this notice
> + * is preserved.
> + * ====================================================
> + */
> +
> +#include  <LibConfig.h>
> +#include  <sys/EfiCdefs.h>
> +#if defined(LIBM_SCCS) && !defined(lint)
> +__RCSID("$NetBSD: s_floor.c,v 1.11 2002/05/26 22:01:56 wiz Exp $");
> +#endif
> +
> +/*
> + * floorf(x)
> + * Return x rounded toward -inf to integral value
> + * Method:
> + *  Bit twiddling.
> + * Exception:
> + *  Inexact flag raised if x not equal to floorf(x).
> + */
> +
> +#include "math.h"
> +#include "math_private.h"
> +
> +static const float huge = 1.0e30;
> +
> +float
> +floorf(float x)
> +{
> +  int32_t i0,j0;
> +  u_int32_t i;
> +  GET_FLOAT_WORD(i0,x);
> +  j0 = ((i0>>23)&0xff)-0x7f;
> +  if(j0<23) {
> +      if(j0<0) {   /* raise inexact if x != 0 */
> +    if(huge+x>(float)0.0) {/* return 0*sign(x) if |x|<1 */
> +        if(i0>=0) {i0=0;}
> +        else if((i0&0x7fffffff)!=0)
> +      { i0=0xbf800000;}
> +    }
> +      } else {
> +    i = (0x007fffff)>>j0;
> +    if((i0&i)==0) return x; /* x is integral */
> +    if(huge+x>(float)0.0) {  /* raise inexact flag */
> +        if(i0<0) i0 += (0x00800000)>>j0;
> +        i0 &= (~i);
> +    }
> +      }
> +  } else {
> +      if(j0==0x80) return x+x;  /* inf or NaN */
> +      else return x;    /* x is integral */
> +  }
> +  SET_FLOAT_WORD(x,i0);
> +  return x;
> +}
> --
> 2.6.4
>
>
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to