1d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol/* ef_rem_pio2.c -- float version of e_rem_pio2.c
2d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
3d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol */
4d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol
5d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol/*
6d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol * ====================================================
7d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
8d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol *
9d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol * Developed at SunPro, a Sun Microsystems, Inc. business.
10d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol * Permission to use, copy, modify, and distribute this
11d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol * software is freely granted, provided that this notice
12d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol * is preserved.
13d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol * ====================================================
14d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol *
15d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol */
16d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol
17d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol/* __ieee754_rem_pio2f(x,y)
18d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol *
19d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol * return the remainder of x rem pi/2 in y[0]+y[1]
20d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol * use __kernel_rem_pio2f()
21d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol */
22d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol
23d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol#include "fdlibm.h"
24d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol
25d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol/*
26d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol * Table of constants for 2/pi, 396 Hex digits (476 decimal) of 2/pi
27d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol */
28d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol#ifdef __STDC__
29d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignolstatic const __int32_t two_over_pi[] = {
30d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol#else
31d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignolstatic __int32_t two_over_pi[] = {
32d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol#endif
33d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol0xA2, 0xF9, 0x83, 0x6E, 0x4E, 0x44, 0x15, 0x29, 0xFC,
34d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol0x27, 0x57, 0xD1, 0xF5, 0x34, 0xDD, 0xC0, 0xDB, 0x62,
35d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol0x95, 0x99, 0x3C, 0x43, 0x90, 0x41, 0xFE, 0x51, 0x63,
36d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol0xAB, 0xDE, 0xBB, 0xC5, 0x61, 0xB7, 0x24, 0x6E, 0x3A,
37d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol0x42, 0x4D, 0xD2, 0xE0, 0x06, 0x49, 0x2E, 0xEA, 0x09,
38d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol0xD1, 0x92, 0x1C, 0xFE, 0x1D, 0xEB, 0x1C, 0xB1, 0x29,
39d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol0xA7, 0x3E, 0xE8, 0x82, 0x35, 0xF5, 0x2E, 0xBB, 0x44,
40d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol0x84, 0xE9, 0x9C, 0x70, 0x26, 0xB4, 0x5F, 0x7E, 0x41,
41d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol0x39, 0x91, 0xD6, 0x39, 0x83, 0x53, 0x39, 0xF4, 0x9C,
42d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol0x84, 0x5F, 0x8B, 0xBD, 0xF9, 0x28, 0x3B, 0x1F, 0xF8,
43d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol0x97, 0xFF, 0xDE, 0x05, 0x98, 0x0F, 0xEF, 0x2F, 0x11,
44d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol0x8B, 0x5A, 0x0A, 0x6D, 0x1F, 0x6D, 0x36, 0x7E, 0xCF,
45d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol0x27, 0xCB, 0x09, 0xB7, 0x4F, 0x46, 0x3F, 0x66, 0x9E,
46d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol0x5F, 0xEA, 0x2D, 0x75, 0x27, 0xBA, 0xC7, 0xEB, 0xE5,
47d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol0xF1, 0x7B, 0x3D, 0x07, 0x39, 0xF7, 0x8A, 0x52, 0x92,
48d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol0xEA, 0x6B, 0xFB, 0x5F, 0xB1, 0x1F, 0x8D, 0x5D, 0x08,
49d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol0x56, 0x03, 0x30, 0x46, 0xFC, 0x7B, 0x6B, 0xAB, 0xF0,
50d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol0xCF, 0xBC, 0x20, 0x9A, 0xF4, 0x36, 0x1D, 0xA9, 0xE3,
51d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol0x91, 0x61, 0x5E, 0xE6, 0x1B, 0x08, 0x65, 0x99, 0x85,
52d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol0x5F, 0x14, 0xA0, 0x68, 0x40, 0x8D, 0xFF, 0xD8, 0x80,
53d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol0x4D, 0x73, 0x27, 0x31, 0x06, 0x06, 0x15, 0x56, 0xCA,
54d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol0x73, 0xA8, 0xC9, 0x60, 0xE2, 0x7B, 0xC0, 0x8C, 0x6B,
55d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol};
56d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol
57d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol/* This array is like the one in e_rem_pio2.c, but the numbers are
58d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol   single precision and the last 8 bits are forced to 0.  */
59d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol#ifdef __STDC__
60d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignolstatic const __int32_t npio2_hw[] = {
61d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol#else
62d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignolstatic __int32_t npio2_hw[] = {
63d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol#endif
64d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol0x3fc90f00, 0x40490f00, 0x4096cb00, 0x40c90f00, 0x40fb5300, 0x4116cb00,
65d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol0x412fed00, 0x41490f00, 0x41623100, 0x417b5300, 0x418a3a00, 0x4196cb00,
66d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol0x41a35c00, 0x41afed00, 0x41bc7e00, 0x41c90f00, 0x41d5a000, 0x41e23100,
67d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol0x41eec200, 0x41fb5300, 0x4203f200, 0x420a3a00, 0x42108300, 0x4216cb00,
68d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol0x421d1400, 0x42235c00, 0x4229a500, 0x422fed00, 0x42363600, 0x423c7e00,
69d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol0x4242c700, 0x42490f00
70d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol};
71d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol
72d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol/*
73d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol * invpio2:  24 bits of 2/pi
74d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol * pio2_1:   first  17 bit of pi/2
75d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol * pio2_1t:  pi/2 - pio2_1
76d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol * pio2_2:   second 17 bit of pi/2
77d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol * pio2_2t:  pi/2 - (pio2_1+pio2_2)
78d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol * pio2_3:   third  17 bit of pi/2
79d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol * pio2_3t:  pi/2 - (pio2_1+pio2_2+pio2_3)
80d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol */
81d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol
82d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol#ifdef __STDC__
83d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignolstatic const float
84d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol#else
85d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignolstatic float
86d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol#endif
87d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignolzero =  0.0000000000e+00, /* 0x00000000 */
88d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignolhalf =  5.0000000000e-01, /* 0x3f000000 */
89d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignoltwo8 =  2.5600000000e+02, /* 0x43800000 */
90d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignolinvpio2 =  6.3661980629e-01, /* 0x3f22f984 */
91d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignolpio2_1  =  1.5707855225e+00, /* 0x3fc90f80 */
92d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignolpio2_1t =  1.0804334124e-05, /* 0x37354443 */
93d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignolpio2_2  =  1.0804273188e-05, /* 0x37354400 */
94d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignolpio2_2t =  6.0770999344e-11, /* 0x2e85a308 */
95d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignolpio2_3  =  6.0770943833e-11, /* 0x2e85a300 */
96d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignolpio2_3t =  6.1232342629e-17; /* 0x248d3132 */
97d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol
98d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol#ifdef __STDC__
99d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol	__int32_t __ieee754_rem_pio2f(float x, float *y)
100d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol#else
101d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol	__int32_t __ieee754_rem_pio2f(x,y)
102d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol	float x,y[];
103d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol#endif
104d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol{
105d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol	float z,w,t,r,fn;
106d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol	float tx[3];
107d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol	__int32_t i,j,n,ix,hx;
108d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol	int e0,nx;
109d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol
110d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol	GET_FLOAT_WORD(hx,x);
111d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol	ix = hx&0x7fffffff;
112d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol	if(ix<=0x3f490fd8)   /* |x| ~<= pi/4 , no need for reduction */
113d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol	    {y[0] = x; y[1] = 0; return 0;}
114d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol	if(ix<0x4016cbe4) {  /* |x| < 3pi/4, special case with n=+-1 */
115d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol	    if(hx>0) {
116d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol		z = x - pio2_1;
117d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol		if((ix&0xfffffff0)!=0x3fc90fd0) { /* 24+24 bit pi OK */
118d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol		    y[0] = z - pio2_1t;
119d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol		    y[1] = (z-y[0])-pio2_1t;
120d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol		} else {		/* near pi/2, use 24+24+24 bit pi */
121d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol		    z -= pio2_2;
122d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol		    y[0] = z - pio2_2t;
123d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol		    y[1] = (z-y[0])-pio2_2t;
124d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol		}
125d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol		return 1;
126d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol	    } else {	/* negative x */
127d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol		z = x + pio2_1;
128d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol		if((ix&0xfffffff0)!=0x3fc90fd0) { /* 24+24 bit pi OK */
129d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol		    y[0] = z + pio2_1t;
130d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol		    y[1] = (z-y[0])+pio2_1t;
131d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol		} else {		/* near pi/2, use 24+24+24 bit pi */
132d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol		    z += pio2_2;
133d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol		    y[0] = z + pio2_2t;
134d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol		    y[1] = (z-y[0])+pio2_2t;
135d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol		}
136d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol		return -1;
137d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol	    }
138d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol	}
139d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol	if(ix<=0x43490f80) { /* |x| ~<= 2^7*(pi/2), medium size */
140d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol	    t  = fabsf(x);
141d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol	    n  = (__int32_t) (t*invpio2+half);
142d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol	    fn = (float)n;
143d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol	    r  = t-fn*pio2_1;
144d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol	    w  = fn*pio2_1t;	/* 1st round good to 40 bit */
145d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol	    if(n<32&&(ix&0xffffff00)!=npio2_hw[n-1]) {
146d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol		y[0] = r-w;	/* quick check no cancellation */
147d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol	    } else {
148d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol	        __uint32_t high;
149d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol	        j  = ix>>23;
150d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol	        y[0] = r-w;
151d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol		GET_FLOAT_WORD(high,y[0]);
152d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol	        i = j-((high>>23)&0xff);
153d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol	        if(i>8) {  /* 2nd iteration needed, good to 57 */
154d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol		    t  = r;
155d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol		    w  = fn*pio2_2;
156d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol		    r  = t-w;
157d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol		    w  = fn*pio2_2t-((t-r)-w);
158d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol		    y[0] = r-w;
159d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol		    GET_FLOAT_WORD(high,y[0]);
160d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol		    i = j-((high>>23)&0xff);
161d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol		    if(i>25)  {	/* 3rd iteration need, 74 bits acc */
162d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol		    	t  = r;	/* will cover all possible cases */
163d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol		    	w  = fn*pio2_3;
164d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol		    	r  = t-w;
165d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol		    	w  = fn*pio2_3t-((t-r)-w);
166d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol		    	y[0] = r-w;
167d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol		    }
168d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol		}
169d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol	    }
170d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol	    y[1] = (r-y[0])-w;
171d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol	    if(hx<0) 	{y[0] = -y[0]; y[1] = -y[1]; return -n;}
172d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol	    else	 return n;
173d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol	}
174d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol    /*
175d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol     * all other (large) arguments
176d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol     */
177d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol	if(!FLT_UWORD_IS_FINITE(ix)) {
178d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol	    y[0]=y[1]=x-x; return 0;
179d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol	}
180d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol    /* set z = scalbn(|x|,ilogb(x)-7) */
181d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol	e0 	= (int)((ix>>23)-134);	/* e0 = ilogb(z)-7; */
182d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol	SET_FLOAT_WORD(z, ix - ((__int32_t)e0<<23));
183d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol	for(i=0;i<2;i++) {
184d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol		tx[i] = (float)((__int32_t)(z));
185d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol		z     = (z-tx[i])*two8;
186d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol	}
187d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol	tx[2] = z;
188d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol	nx = 3;
189d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol	while(tx[nx-1]==zero) nx--;	/* skip zero term */
190d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol	n  =  __kernel_rem_pio2f(tx,y,e0,nx,2,two_over_pi);
191d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol	if(hx<0) {y[0] = -y[0]; y[1] = -y[1]; return -n;}
192d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol	return n;
193d61f9ebd0671c1066118199537cd6057ecbf8697Andrew Rossignol}
194