11dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* s_floorf.c -- float version of s_floor.c.
21dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
31dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
41dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
51dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
61dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ====================================================
71dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
81dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
91dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Developed at SunPro, a Sun Microsystems, Inc. business.
101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Permission to use, copy, modify, and distribute this
111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * software is freely granted, provided that this notice
121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * is preserved.
131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ====================================================
141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef lint
171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic char rcsid[] = "$FreeBSD: src/lib/msun/src/s_floorf.c,v 1.7 2002/05/28 18:15:04 alfred Exp $";
181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif
191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * floorf(x)
221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Return x rounded toward -inf to integral value
231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Method:
241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *	Bit twiddling.
251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Exception:
261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *	Inexact flag raised if x not equal to floorf(x).
271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include "math.h"
301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include "math_private.h"
311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic const float huge = 1.0e30;
331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectfloat
351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectfloorf(float x)
361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{
371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	int32_t i0,j0;
381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	u_int32_t i;
391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	GET_FLOAT_WORD(i0,x);
401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	j0 = ((i0>>23)&0xff)-0x7f;
411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if(j0<23) {
421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	    if(j0<0) { 	/* raise inexact if x != 0 */
431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if(huge+x>(float)0.0) {/* return 0*sign(x) if |x|<1 */
441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		    if(i0>=0) {i0=0;}
451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		    else if((i0&0x7fffffff)!=0)
461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			{ i0=0xbf800000;}
471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		}
481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	    } else {
491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		i = (0x007fffff)>>j0;
501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if((i0&i)==0) return x; /* x is integral */
511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if(huge+x>(float)0.0) {	/* raise inexact flag */
521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		    if(i0<0) i0 += (0x00800000)>>j0;
531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		    i0 &= (~i);
541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		}
551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	    }
561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	} else {
571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	    if(j0==0x80) return x+x;	/* inf or NaN */
581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	    else return x;		/* x is integral */
591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	}
601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	SET_FLOAT_WORD(x,i0);
611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	return x;
621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
63