/* e_rem_pio2f.c -- float version of e_rem_pio2.c
 * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
 * Debugged and optimized by Bruce D. Evans.
 */

/*
 * ====================================================
 * 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 <sys/cdefs.h>
__FBSDID("$FreeBSD$");

/* __ieee754_rem_pio2f(x,y)
 *
 * return the remainder of x rem pi/2 in *y
 * use double precision for everything except passing x
 * use __kernel_rem_pio2() for large x
 */

#include <float.h>

#include "math.h"
#include "math_private.h"

/*
 * invpio2:  53 bits of 2/pi
 * pio2_1:   first 25 bits of pi/2
 * pio2_1t:  pi/2 - pio2_1
 */

static const double
invpio2 =  6.36619772367581382433e-01, /* 0x3FE45F30, 0x6DC9C883 */
pio2_1  =  1.57079631090164184570e+00, /* 0x3FF921FB, 0x50000000 */
pio2_1t =  1.58932547735281966916e-08; /* 0x3E5110b4, 0x611A6263 */

#ifdef INLINE_REM_PIO2F
static __inline __always_inline
#endif
int
__ieee754_rem_pio2f(float x, double *y)
{
	double w,r,fn;
	double tx[1],ty[1];
	float z;
	int32_t e0,n,ix,hx;

	GET_FLOAT_WORD(hx,x);
	ix = hx&0x7fffffff;
    /* 33+53 bit pi is good enough for medium size */
	if(ix<0x4dc90fdb) {		/* |x| ~< 2^28*(pi/2), medium size */
	    /* Use a specialized rint() to get fn.  Assume round-to-nearest. */
	    STRICT_ASSIGN(double,fn,x*invpio2+0x1.8p52);
	    fn = fn-0x1.8p52;
#ifdef HAVE_EFFICIENT_IRINT
	    n  = irint(fn);
#else
	    n  = (int32_t)fn;
#endif
	    r  = x-fn*pio2_1;
	    w  = fn*pio2_1t;
	    *y = r-w;
	    return n;
	}
    /*
     * all other (large) arguments
     */
	if(ix>=0x7f800000) {		/* x is inf or NaN */
	    *y=x-x; return 0;
	}
    /* set z = scalbn(|x|,ilogb(|x|)-23) */
	e0 = (ix>>23)-150;		/* e0 = ilogb(|x|)-23; */
	SET_FLOAT_WORD(z, ix - ((int32_t)(e0<<23)));
	tx[0] = z;
	n  =  __kernel_rem_pio2(tx,ty,e0,1,0);
	if(hx<0) {*y = -ty[0]; return -n;}
	*y = ty[0]; return n;
}
