Blame sysdeps/ieee754/flt-32/s_modff.c

Packit Service 82fcde
/* s_modff.c -- float version of s_modf.c.
Packit Service 82fcde
 * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
Packit Service 82fcde
 */
Packit Service 82fcde
Packit Service 82fcde
/*
Packit Service 82fcde
 * ====================================================
Packit Service 82fcde
 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
Packit Service 82fcde
 *
Packit Service 82fcde
 * Developed at SunPro, a Sun Microsystems, Inc. business.
Packit Service 82fcde
 * Permission to use, copy, modify, and distribute this
Packit Service 82fcde
 * software is freely granted, provided that this notice
Packit Service 82fcde
 * is preserved.
Packit Service 82fcde
 * ====================================================
Packit Service 82fcde
 */
Packit Service 82fcde
Packit Service 82fcde
#include <math.h>
Packit Service 82fcde
#include <math_private.h>
Packit Service 82fcde
#include <libm-alias-float.h>
Packit Service 82fcde
Packit Service 82fcde
static const float one = 1.0;
Packit Service 82fcde
Packit Service 82fcde
float
Packit Service 82fcde
__modff(float x, float *iptr)
Packit Service 82fcde
{
Packit Service 82fcde
	int32_t i0,j0;
Packit Service 82fcde
	uint32_t i;
Packit Service 82fcde
	GET_FLOAT_WORD(i0,x);
Packit Service 82fcde
	j0 = ((i0>>23)&0xff)-0x7f;	/* exponent of x */
Packit Service 82fcde
	if(__builtin_expect(j0<23, 1)) {		/* integer part in x */
Packit Service 82fcde
	    if(j0<0) {			/* |x|<1 */
Packit Service 82fcde
		SET_FLOAT_WORD(*iptr,i0&0x80000000);	/* *iptr = +-0 */
Packit Service 82fcde
		return x;
Packit Service 82fcde
	    } else {
Packit Service 82fcde
		i = (0x007fffff)>>j0;
Packit Service 82fcde
		if((i0&i)==0) {			/* x is integral */
Packit Service 82fcde
		    uint32_t ix;
Packit Service 82fcde
		    *iptr = x;
Packit Service 82fcde
		    GET_FLOAT_WORD(ix,x);
Packit Service 82fcde
		    SET_FLOAT_WORD(x,ix&0x80000000);	/* return +-0 */
Packit Service 82fcde
		    return x;
Packit Service 82fcde
		} else {
Packit Service 82fcde
		    SET_FLOAT_WORD(*iptr,i0&(~i));
Packit Service 82fcde
		    return x - *iptr;
Packit Service 82fcde
		}
Packit Service 82fcde
	    }
Packit Service 82fcde
	} else {			/* no fraction part */
Packit Service 82fcde
	    *iptr = x*one;
Packit Service 82fcde
	    /* We must handle NaNs separately.  */
Packit Service 82fcde
	    if (j0 == 0x80 && (i0 & 0x7fffff))
Packit Service 82fcde
	      return x*one;
Packit Service 82fcde
	    SET_FLOAT_WORD(x,i0&0x80000000);	/* return +-0 */
Packit Service 82fcde
	    return x;
Packit Service 82fcde
	}
Packit Service 82fcde
}
Packit Service 82fcde
libm_alias_float (__modf, modf)