11dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* s_sinf.c -- float version of s_sin.c.
21dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
31dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Optimized by Bruce D. Evans.
41dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
51dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
61dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
71dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ====================================================
81dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
91dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Developed at SunPro, a Sun Microsystems, Inc. business.
111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Permission to use, copy, modify, and distribute this
121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * software is freely granted, provided that this notice
131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * is preserved.
141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ====================================================
151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef lint
181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic char rcsid[] = "$FreeBSD: src/lib/msun/src/s_sinf.c,v 1.14 2005/11/28 06:15:10 bde Exp $";
191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif
201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include "math.h"
221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	INLINE_KERNEL_COSDF
231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	INLINE_KERNEL_SINDF
241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include "math_private.h"
251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include "k_cosf.c"
261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include "k_sinf.c"
271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* Small multiples of pi/2 rounded to double precision. */
291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic const double
301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projects1pio2 = 1*M_PI_2,			/* 0x3FF921FB, 0x54442D18 */
311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projects2pio2 = 2*M_PI_2,			/* 0x400921FB, 0x54442D18 */
321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projects3pio2 = 3*M_PI_2,			/* 0x4012D97C, 0x7F3321D2 */
331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projects4pio2 = 4*M_PI_2;			/* 0x401921FB, 0x54442D18 */
341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectfloat
361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectsinf(float x)
371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{
381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	float y[2];
391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	int32_t n, hx, ix;
401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	GET_FLOAT_WORD(hx,x);
421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	ix = hx & 0x7fffffff;
431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if(ix <= 0x3f490fda) {		/* |x| ~<= pi/4 */
451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	    if(ix<0x39800000)		/* |x| < 2**-12 */
461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if(((int)x)==0) return x;	/* x with inexact if x != 0 */
471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	    return __kernel_sindf(x);
481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	}
491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if(ix<=0x407b53d1) {		/* |x| ~<= 5*pi/4 */
501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	    if(ix<=0x4016cbe3) {	/* |x| ~<= 3pi/4 */
511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if(hx>0)
521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		    return __kernel_cosdf(x - s1pio2);
531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		else
541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		    return -__kernel_cosdf(x + s1pio2);
551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	    } else
561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		return __kernel_sindf((hx > 0 ? s2pio2 : -s2pio2) - x);
571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	}
581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if(ix<=0x40e231d5) {		/* |x| ~<= 9*pi/4 */
591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	    if(ix<=0x40afeddf) {	/* |x| ~<= 7*pi/4 */
601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if(hx>0)
611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		    return -__kernel_cosdf(x - s3pio2);
621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		else
631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		    return __kernel_cosdf(x + s3pio2);
641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	    } else
651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		return __kernel_sindf(x + (hx > 0 ? -s4pio2 : s4pio2));
661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	}
671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project    /* sin(Inf or NaN) is NaN */
691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	else if (ix>=0x7f800000) return x-x;
701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project    /* general argument reduction needed */
721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	else {
731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	    n = __ieee754_rem_pio2f(x,y);
741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	    switch(n&3) {
751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		case 0: return  __kernel_sindf((double)y[0]+y[1]);
761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		case 1: return  __kernel_cosdf((double)y[0]+y[1]);
771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		case 2: return  __kernel_sindf(-(double)y[0]-y[1]);
781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		default:
791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			return -__kernel_cosdf((double)y[0]+y[1]);
801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	    }
811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	}
821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
83