xref: /titanic_52/usr/src/lib/libm/common/R/atan2f.c (revision ddc0e0b53c661f6e439e3b7072b3ef353eadb4af)
125c28e83SPiotr Jasiukajtis /*
225c28e83SPiotr Jasiukajtis  * CDDL HEADER START
325c28e83SPiotr Jasiukajtis  *
425c28e83SPiotr Jasiukajtis  * The contents of this file are subject to the terms of the
525c28e83SPiotr Jasiukajtis  * Common Development and Distribution License (the "License").
625c28e83SPiotr Jasiukajtis  * You may not use this file except in compliance with the License.
725c28e83SPiotr Jasiukajtis  *
825c28e83SPiotr Jasiukajtis  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
925c28e83SPiotr Jasiukajtis  * or http://www.opensolaris.org/os/licensing.
1025c28e83SPiotr Jasiukajtis  * See the License for the specific language governing permissions
1125c28e83SPiotr Jasiukajtis  * and limitations under the License.
1225c28e83SPiotr Jasiukajtis  *
1325c28e83SPiotr Jasiukajtis  * When distributing Covered Code, include this CDDL HEADER in each
1425c28e83SPiotr Jasiukajtis  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
1525c28e83SPiotr Jasiukajtis  * If applicable, add the following below this CDDL HEADER, with the
1625c28e83SPiotr Jasiukajtis  * fields enclosed by brackets "[]" replaced with your own identifying
1725c28e83SPiotr Jasiukajtis  * information: Portions Copyright [yyyy] [name of copyright owner]
1825c28e83SPiotr Jasiukajtis  *
1925c28e83SPiotr Jasiukajtis  * CDDL HEADER END
2025c28e83SPiotr Jasiukajtis  */
2125c28e83SPiotr Jasiukajtis /*
2225c28e83SPiotr Jasiukajtis  * Copyright 2011 Nexenta Systems, Inc.  All rights reserved.
2325c28e83SPiotr Jasiukajtis  */
2425c28e83SPiotr Jasiukajtis /*
2525c28e83SPiotr Jasiukajtis  * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
2625c28e83SPiotr Jasiukajtis  * Use is subject to license terms.
2725c28e83SPiotr Jasiukajtis  */
2825c28e83SPiotr Jasiukajtis 
29*ddc0e0b5SRichard Lowe #pragma weak __atan2f = atan2f
3025c28e83SPiotr Jasiukajtis 
3125c28e83SPiotr Jasiukajtis #include "libm.h"
3225c28e83SPiotr Jasiukajtis 
3325c28e83SPiotr Jasiukajtis #if defined(__i386) && !defined(__amd64)
3425c28e83SPiotr Jasiukajtis extern int __swapRP(int);
3525c28e83SPiotr Jasiukajtis #endif
3625c28e83SPiotr Jasiukajtis 
3725c28e83SPiotr Jasiukajtis /*
3825c28e83SPiotr Jasiukajtis  * For i = 0, ..., 192, let x[i] be the double precision number whose
3925c28e83SPiotr Jasiukajtis  * high order 32 bits are 0x3f900000 + (i << 16) and whose low order
4025c28e83SPiotr Jasiukajtis  * 32 bits are zero.  Then TBL[i] := atan(x[i]) to double precision.
4125c28e83SPiotr Jasiukajtis  */
4225c28e83SPiotr Jasiukajtis 
4325c28e83SPiotr Jasiukajtis static const double TBL[] = {
4425c28e83SPiotr Jasiukajtis 	1.56237286204768313e-02,
4525c28e83SPiotr Jasiukajtis 	1.66000375562312640e-02,
4625c28e83SPiotr Jasiukajtis 	1.75763148444955872e-02,
4725c28e83SPiotr Jasiukajtis 	1.85525586258889763e-02,
4825c28e83SPiotr Jasiukajtis 	1.95287670414137082e-02,
4925c28e83SPiotr Jasiukajtis 	2.05049382324763683e-02,
5025c28e83SPiotr Jasiukajtis 	2.14810703409090559e-02,
5125c28e83SPiotr Jasiukajtis 	2.24571615089905717e-02,
5225c28e83SPiotr Jasiukajtis 	2.34332098794675855e-02,
5325c28e83SPiotr Jasiukajtis 	2.44092135955758099e-02,
5425c28e83SPiotr Jasiukajtis 	2.53851708010611396e-02,
5525c28e83SPiotr Jasiukajtis 	2.63610796402007873e-02,
5625c28e83SPiotr Jasiukajtis 	2.73369382578244127e-02,
5725c28e83SPiotr Jasiukajtis 	2.83127447993351995e-02,
5825c28e83SPiotr Jasiukajtis 	2.92884974107309737e-02,
5925c28e83SPiotr Jasiukajtis 	3.02641942386252458e-02,
6025c28e83SPiotr Jasiukajtis 	3.12398334302682774e-02,
6125c28e83SPiotr Jasiukajtis 	3.31909314971115949e-02,
6225c28e83SPiotr Jasiukajtis 	3.51417768027967800e-02,
6325c28e83SPiotr Jasiukajtis 	3.70923545503918164e-02,
6425c28e83SPiotr Jasiukajtis 	3.90426499551669928e-02,
6525c28e83SPiotr Jasiukajtis 	4.09926482452637811e-02,
6625c28e83SPiotr Jasiukajtis 	4.29423346623621707e-02,
6725c28e83SPiotr Jasiukajtis 	4.48916944623464972e-02,
6825c28e83SPiotr Jasiukajtis 	4.68407129159696539e-02,
6925c28e83SPiotr Jasiukajtis 	4.87893753095156174e-02,
7025c28e83SPiotr Jasiukajtis 	5.07376669454602178e-02,
7125c28e83SPiotr Jasiukajtis 	5.26855731431300420e-02,
7225c28e83SPiotr Jasiukajtis 	5.46330792393594777e-02,
7325c28e83SPiotr Jasiukajtis 	5.65801705891457105e-02,
7425c28e83SPiotr Jasiukajtis 	5.85268325663017702e-02,
7525c28e83SPiotr Jasiukajtis 	6.04730505641073168e-02,
7625c28e83SPiotr Jasiukajtis 	6.24188099959573500e-02,
7725c28e83SPiotr Jasiukajtis 	6.63088949198234884e-02,
7825c28e83SPiotr Jasiukajtis 	7.01969710718705203e-02,
7925c28e83SPiotr Jasiukajtis 	7.40829225490337306e-02,
8025c28e83SPiotr Jasiukajtis 	7.79666338315423008e-02,
8125c28e83SPiotr Jasiukajtis 	8.18479898030765457e-02,
8225c28e83SPiotr Jasiukajtis 	8.57268757707448092e-02,
8325c28e83SPiotr Jasiukajtis 	8.96031774848717461e-02,
8425c28e83SPiotr Jasiukajtis 	9.34767811585894698e-02,
8525c28e83SPiotr Jasiukajtis 	9.73475734872236709e-02,
8625c28e83SPiotr Jasiukajtis 	1.01215441667466668e-01,
8725c28e83SPiotr Jasiukajtis 	1.05080273416329528e-01,
8825c28e83SPiotr Jasiukajtis 	1.08941956989865793e-01,
8925c28e83SPiotr Jasiukajtis 	1.12800381201659389e-01,
9025c28e83SPiotr Jasiukajtis 	1.16655435441069349e-01,
9125c28e83SPiotr Jasiukajtis 	1.20507009691224562e-01,
9225c28e83SPiotr Jasiukajtis 	1.24354994546761438e-01,
9325c28e83SPiotr Jasiukajtis 	1.32039761614638762e-01,
9425c28e83SPiotr Jasiukajtis 	1.39708874289163648e-01,
9525c28e83SPiotr Jasiukajtis 	1.47361481088651630e-01,
9625c28e83SPiotr Jasiukajtis 	1.54996741923940973e-01,
9725c28e83SPiotr Jasiukajtis 	1.62613828597948568e-01,
9825c28e83SPiotr Jasiukajtis 	1.70211925285474408e-01,
9925c28e83SPiotr Jasiukajtis 	1.77790228992676075e-01,
10025c28e83SPiotr Jasiukajtis 	1.85347949995694761e-01,
10125c28e83SPiotr Jasiukajtis 	1.92884312257974672e-01,
10225c28e83SPiotr Jasiukajtis 	2.00398553825878512e-01,
10325c28e83SPiotr Jasiukajtis 	2.07889927202262986e-01,
10425c28e83SPiotr Jasiukajtis 	2.15357699697738048e-01,
10525c28e83SPiotr Jasiukajtis 	2.22801153759394521e-01,
10625c28e83SPiotr Jasiukajtis 	2.30219587276843718e-01,
10725c28e83SPiotr Jasiukajtis 	2.37612313865471242e-01,
10825c28e83SPiotr Jasiukajtis 	2.44978663126864143e-01,
10925c28e83SPiotr Jasiukajtis 	2.59629629408257512e-01,
11025c28e83SPiotr Jasiukajtis 	2.74167451119658789e-01,
11125c28e83SPiotr Jasiukajtis 	2.88587361894077410e-01,
11225c28e83SPiotr Jasiukajtis 	3.02884868374971417e-01,
11325c28e83SPiotr Jasiukajtis 	3.17055753209147029e-01,
11425c28e83SPiotr Jasiukajtis 	3.31096076704132103e-01,
11525c28e83SPiotr Jasiukajtis 	3.45002177207105132e-01,
11625c28e83SPiotr Jasiukajtis 	3.58770670270572245e-01,
11725c28e83SPiotr Jasiukajtis 	3.72398446676754202e-01,
11825c28e83SPiotr Jasiukajtis 	3.85882669398073752e-01,
11925c28e83SPiotr Jasiukajtis 	3.99220769575252543e-01,
12025c28e83SPiotr Jasiukajtis 	4.12410441597387323e-01,
12125c28e83SPiotr Jasiukajtis 	4.25449637370042266e-01,
12225c28e83SPiotr Jasiukajtis 	4.38336559857957830e-01,
12325c28e83SPiotr Jasiukajtis 	4.51069655988523499e-01,
12425c28e83SPiotr Jasiukajtis 	4.63647609000806094e-01,
12525c28e83SPiotr Jasiukajtis 	4.88333951056405535e-01,
12625c28e83SPiotr Jasiukajtis 	5.12389460310737732e-01,
12725c28e83SPiotr Jasiukajtis 	5.35811237960463704e-01,
12825c28e83SPiotr Jasiukajtis 	5.58599315343562441e-01,
12925c28e83SPiotr Jasiukajtis 	5.80756353567670414e-01,
13025c28e83SPiotr Jasiukajtis 	6.02287346134964152e-01,
13125c28e83SPiotr Jasiukajtis 	6.23199329934065904e-01,
13225c28e83SPiotr Jasiukajtis 	6.43501108793284371e-01,
13325c28e83SPiotr Jasiukajtis 	6.63202992706093286e-01,
13425c28e83SPiotr Jasiukajtis 	6.82316554874748071e-01,
13525c28e83SPiotr Jasiukajtis 	7.00854407884450192e-01,
13625c28e83SPiotr Jasiukajtis 	7.18829999621624527e-01,
13725c28e83SPiotr Jasiukajtis 	7.36257428981428097e-01,
13825c28e83SPiotr Jasiukajtis 	7.53151280962194414e-01,
13925c28e83SPiotr Jasiukajtis 	7.69526480405658297e-01,
14025c28e83SPiotr Jasiukajtis 	7.85398163397448279e-01,
14125c28e83SPiotr Jasiukajtis 	8.15691923316223422e-01,
14225c28e83SPiotr Jasiukajtis 	8.44153986113171051e-01,
14325c28e83SPiotr Jasiukajtis 	8.70903457075652976e-01,
14425c28e83SPiotr Jasiukajtis 	8.96055384571343927e-01,
14525c28e83SPiotr Jasiukajtis 	9.19719605350416858e-01,
14625c28e83SPiotr Jasiukajtis 	9.42000040379463610e-01,
14725c28e83SPiotr Jasiukajtis 	9.62994330680936206e-01,
14825c28e83SPiotr Jasiukajtis 	9.82793723247329054e-01,
14925c28e83SPiotr Jasiukajtis 	1.00148313569423464e+00,
15025c28e83SPiotr Jasiukajtis 	1.01914134426634972e+00,
15125c28e83SPiotr Jasiukajtis 	1.03584125300880014e+00,
15225c28e83SPiotr Jasiukajtis 	1.05165021254837376e+00,
15325c28e83SPiotr Jasiukajtis 	1.06663036531574362e+00,
15425c28e83SPiotr Jasiukajtis 	1.08083900054116833e+00,
15525c28e83SPiotr Jasiukajtis 	1.09432890732118993e+00,
15625c28e83SPiotr Jasiukajtis 	1.10714871779409041e+00,
15725c28e83SPiotr Jasiukajtis 	1.13095374397916038e+00,
15825c28e83SPiotr Jasiukajtis 	1.15257199721566761e+00,
15925c28e83SPiotr Jasiukajtis 	1.17227388112847630e+00,
16025c28e83SPiotr Jasiukajtis 	1.19028994968253166e+00,
16125c28e83SPiotr Jasiukajtis 	1.20681737028525249e+00,
16225c28e83SPiotr Jasiukajtis 	1.22202532321098967e+00,
16325c28e83SPiotr Jasiukajtis 	1.23605948947808186e+00,
16425c28e83SPiotr Jasiukajtis 	1.24904577239825443e+00,
16525c28e83SPiotr Jasiukajtis 	1.26109338225244039e+00,
16625c28e83SPiotr Jasiukajtis 	1.27229739520871732e+00,
16725c28e83SPiotr Jasiukajtis 	1.28274087974427076e+00,
16825c28e83SPiotr Jasiukajtis 	1.29249666778978534e+00,
16925c28e83SPiotr Jasiukajtis 	1.30162883400919616e+00,
17025c28e83SPiotr Jasiukajtis 	1.31019393504755555e+00,
17125c28e83SPiotr Jasiukajtis 	1.31824205101683711e+00,
17225c28e83SPiotr Jasiukajtis 	1.32581766366803255e+00,
17325c28e83SPiotr Jasiukajtis 	1.33970565959899957e+00,
17425c28e83SPiotr Jasiukajtis 	1.35212738092095464e+00,
17525c28e83SPiotr Jasiukajtis 	1.36330010035969384e+00,
17625c28e83SPiotr Jasiukajtis 	1.37340076694501589e+00,
17725c28e83SPiotr Jasiukajtis 	1.38257482149012589e+00,
17825c28e83SPiotr Jasiukajtis 	1.39094282700241845e+00,
17925c28e83SPiotr Jasiukajtis 	1.39860551227195762e+00,
18025c28e83SPiotr Jasiukajtis 	1.40564764938026987e+00,
18125c28e83SPiotr Jasiukajtis 	1.41214106460849531e+00,
18225c28e83SPiotr Jasiukajtis 	1.41814699839963154e+00,
18325c28e83SPiotr Jasiukajtis 	1.42371797140649403e+00,
18425c28e83SPiotr Jasiukajtis 	1.42889927219073276e+00,
18525c28e83SPiotr Jasiukajtis 	1.43373015248470903e+00,
18625c28e83SPiotr Jasiukajtis 	1.43824479449822262e+00,
18725c28e83SPiotr Jasiukajtis 	1.44247309910910193e+00,
18825c28e83SPiotr Jasiukajtis 	1.44644133224813509e+00,
18925c28e83SPiotr Jasiukajtis 	1.45368758222803240e+00,
19025c28e83SPiotr Jasiukajtis 	1.46013910562100091e+00,
19125c28e83SPiotr Jasiukajtis 	1.46591938806466282e+00,
19225c28e83SPiotr Jasiukajtis 	1.47112767430373470e+00,
19325c28e83SPiotr Jasiukajtis 	1.47584462045214027e+00,
19425c28e83SPiotr Jasiukajtis 	1.48013643959415142e+00,
19525c28e83SPiotr Jasiukajtis 	1.48405798811891154e+00,
19625c28e83SPiotr Jasiukajtis 	1.48765509490645531e+00,
19725c28e83SPiotr Jasiukajtis 	1.49096634108265924e+00,
19825c28e83SPiotr Jasiukajtis 	1.49402443552511865e+00,
19925c28e83SPiotr Jasiukajtis 	1.49685728913695626e+00,
20025c28e83SPiotr Jasiukajtis 	1.49948886200960629e+00,
20125c28e83SPiotr Jasiukajtis 	1.50193983749385196e+00,
20225c28e83SPiotr Jasiukajtis 	1.50422816301907281e+00,
20325c28e83SPiotr Jasiukajtis 	1.50636948736934317e+00,
20425c28e83SPiotr Jasiukajtis 	1.50837751679893928e+00,
20525c28e83SPiotr Jasiukajtis 	1.51204050407917401e+00,
20625c28e83SPiotr Jasiukajtis 	1.51529782154917969e+00,
20725c28e83SPiotr Jasiukajtis 	1.51821326518395483e+00,
20825c28e83SPiotr Jasiukajtis 	1.52083793107295384e+00,
20925c28e83SPiotr Jasiukajtis 	1.52321322351791322e+00,
21025c28e83SPiotr Jasiukajtis 	1.52537304737331958e+00,
21125c28e83SPiotr Jasiukajtis 	1.52734543140336587e+00,
21225c28e83SPiotr Jasiukajtis 	1.52915374769630819e+00,
21325c28e83SPiotr Jasiukajtis 	1.53081763967160667e+00,
21425c28e83SPiotr Jasiukajtis 	1.53235373677370856e+00,
21525c28e83SPiotr Jasiukajtis 	1.53377621092096650e+00,
21625c28e83SPiotr Jasiukajtis 	1.53509721411557254e+00,
21725c28e83SPiotr Jasiukajtis 	1.53632722579538861e+00,
21825c28e83SPiotr Jasiukajtis 	1.53747533091664934e+00,
21925c28e83SPiotr Jasiukajtis 	1.53854944435964280e+00,
22025c28e83SPiotr Jasiukajtis 	1.53955649336462841e+00,
22125c28e83SPiotr Jasiukajtis 	1.54139303859089161e+00,
22225c28e83SPiotr Jasiukajtis 	1.54302569020147562e+00,
22325c28e83SPiotr Jasiukajtis 	1.54448660954197448e+00,
22425c28e83SPiotr Jasiukajtis 	1.54580153317597646e+00,
22525c28e83SPiotr Jasiukajtis 	1.54699130060982659e+00,
22625c28e83SPiotr Jasiukajtis 	1.54807296595325550e+00,
22725c28e83SPiotr Jasiukajtis 	1.54906061995310385e+00,
22825c28e83SPiotr Jasiukajtis 	1.54996600675867957e+00,
22925c28e83SPiotr Jasiukajtis 	1.55079899282174605e+00,
23025c28e83SPiotr Jasiukajtis 	1.55156792769518947e+00,
23125c28e83SPiotr Jasiukajtis 	1.55227992472688747e+00,
23225c28e83SPiotr Jasiukajtis 	1.55294108165534417e+00,
23325c28e83SPiotr Jasiukajtis 	1.55355665560036682e+00,
23425c28e83SPiotr Jasiukajtis 	1.55413120308095598e+00,
23525c28e83SPiotr Jasiukajtis 	1.55466869295126031e+00,
23625c28e83SPiotr Jasiukajtis 	1.55517259817441977e+00,
23725c28e83SPiotr Jasiukajtis };
23825c28e83SPiotr Jasiukajtis 
23925c28e83SPiotr Jasiukajtis static const double
24025c28e83SPiotr Jasiukajtis 	pio4	=  7.8539816339744827900e-01,
24125c28e83SPiotr Jasiukajtis 	pio2	=  1.5707963267948965580e+00,
24225c28e83SPiotr Jasiukajtis 	negpi	= -3.1415926535897931160e+00,
24325c28e83SPiotr Jasiukajtis 	q1	= -3.3333333333296428046e-01,
24425c28e83SPiotr Jasiukajtis 	q2	=  1.9999999186853752618e-01,
24525c28e83SPiotr Jasiukajtis 	zero	=  0.0;
24625c28e83SPiotr Jasiukajtis 
24725c28e83SPiotr Jasiukajtis static const float two24 = 16777216.0;
24825c28e83SPiotr Jasiukajtis 
24925c28e83SPiotr Jasiukajtis float
25025c28e83SPiotr Jasiukajtis atan2f(float fy, float fx)
25125c28e83SPiotr Jasiukajtis {
25225c28e83SPiotr Jasiukajtis 	double	a, t, s, dbase;
25325c28e83SPiotr Jasiukajtis 	float	x, y, base;
25425c28e83SPiotr Jasiukajtis 	int	i, k, hx, hy, ix, iy, sign;
25525c28e83SPiotr Jasiukajtis #if defined(__i386) && !defined(__amd64)
25625c28e83SPiotr Jasiukajtis 	int	rp;
25725c28e83SPiotr Jasiukajtis #endif
25825c28e83SPiotr Jasiukajtis 
25925c28e83SPiotr Jasiukajtis 	iy = *(int *)&fy;
26025c28e83SPiotr Jasiukajtis 	ix = *(int *)&fx;
26125c28e83SPiotr Jasiukajtis 	hy = iy & ~0x80000000;
26225c28e83SPiotr Jasiukajtis 	hx = ix & ~0x80000000;
26325c28e83SPiotr Jasiukajtis 
26425c28e83SPiotr Jasiukajtis 	sign = 0;
26525c28e83SPiotr Jasiukajtis 	if (hy > hx) {
26625c28e83SPiotr Jasiukajtis 		x = fy;
26725c28e83SPiotr Jasiukajtis 		y = fx;
26825c28e83SPiotr Jasiukajtis 		i = hx;
26925c28e83SPiotr Jasiukajtis 		hx = hy;
27025c28e83SPiotr Jasiukajtis 		hy = i;
27125c28e83SPiotr Jasiukajtis 		if (iy < 0) {
27225c28e83SPiotr Jasiukajtis 			x = -x;
27325c28e83SPiotr Jasiukajtis 			sign = 1;
27425c28e83SPiotr Jasiukajtis 		}
27525c28e83SPiotr Jasiukajtis 		if (ix < 0) {
27625c28e83SPiotr Jasiukajtis 			y = -y;
27725c28e83SPiotr Jasiukajtis 			a = pio2;
27825c28e83SPiotr Jasiukajtis 		} else {
27925c28e83SPiotr Jasiukajtis 			a = -pio2;
28025c28e83SPiotr Jasiukajtis 			sign = 1 - sign;
28125c28e83SPiotr Jasiukajtis 		}
28225c28e83SPiotr Jasiukajtis 	} else {
28325c28e83SPiotr Jasiukajtis 		y = fy;
28425c28e83SPiotr Jasiukajtis 		x = fx;
28525c28e83SPiotr Jasiukajtis 		if (iy < 0) {
28625c28e83SPiotr Jasiukajtis 			y = -y;
28725c28e83SPiotr Jasiukajtis 			sign = 1;
28825c28e83SPiotr Jasiukajtis 		}
28925c28e83SPiotr Jasiukajtis 		if (ix < 0) {
29025c28e83SPiotr Jasiukajtis 			x = -x;
29125c28e83SPiotr Jasiukajtis 			a = negpi;
29225c28e83SPiotr Jasiukajtis 			sign = 1 - sign;
29325c28e83SPiotr Jasiukajtis 		} else {
29425c28e83SPiotr Jasiukajtis 			a = zero;
29525c28e83SPiotr Jasiukajtis 		}
29625c28e83SPiotr Jasiukajtis 	}
29725c28e83SPiotr Jasiukajtis 
29825c28e83SPiotr Jasiukajtis 	if (hx >= 0x7f800000 || hx - hy >= 0x0c800000) {
29925c28e83SPiotr Jasiukajtis 		if (hx >= 0x7f800000) {
30025c28e83SPiotr Jasiukajtis 			if (hx > 0x7f800000) /* nan */
30125c28e83SPiotr Jasiukajtis 				return (x * y);
30225c28e83SPiotr Jasiukajtis 			else if (hy >= 0x7f800000)
30325c28e83SPiotr Jasiukajtis 				a += pio4;
30425c28e83SPiotr Jasiukajtis 		} else if ((int)a == 0) {
30525c28e83SPiotr Jasiukajtis 			a = (double)y / x;
30625c28e83SPiotr Jasiukajtis 		}
30725c28e83SPiotr Jasiukajtis 		return ((float)((sign)? -a : a));
30825c28e83SPiotr Jasiukajtis 	}
30925c28e83SPiotr Jasiukajtis 
31025c28e83SPiotr Jasiukajtis 	if (hy < 0x00800000) {
31125c28e83SPiotr Jasiukajtis 		if (hy == 0)
31225c28e83SPiotr Jasiukajtis 			return ((float)((sign)? -a : a));
31325c28e83SPiotr Jasiukajtis 		/* scale subnormal y */
31425c28e83SPiotr Jasiukajtis 		y *= two24;
31525c28e83SPiotr Jasiukajtis 		x *= two24;
31625c28e83SPiotr Jasiukajtis 		hy = *(int *)&y;
31725c28e83SPiotr Jasiukajtis 		hx = *(int *)&x;
31825c28e83SPiotr Jasiukajtis 	}
31925c28e83SPiotr Jasiukajtis 
32025c28e83SPiotr Jasiukajtis #if defined(__i386) && !defined(__amd64)
32125c28e83SPiotr Jasiukajtis 	rp = __swapRP(fp_extended);
32225c28e83SPiotr Jasiukajtis #endif
32325c28e83SPiotr Jasiukajtis 	k = (hy - hx + 0x3f800000) & 0xfff80000;
32425c28e83SPiotr Jasiukajtis 	if (k >= 0x3c800000) {	/* |y/x| >= 1/64 */
32525c28e83SPiotr Jasiukajtis 		*(int *)&base = k;
32625c28e83SPiotr Jasiukajtis 		k = (k - 0x3c800000) >> 19;
32725c28e83SPiotr Jasiukajtis 		a += TBL[k];
32825c28e83SPiotr Jasiukajtis 	} else {
32925c28e83SPiotr Jasiukajtis 		/*
33025c28e83SPiotr Jasiukajtis 		 * For some reason this is faster on USIII than just
33125c28e83SPiotr Jasiukajtis 		 * doing t = y/x in this case.
33225c28e83SPiotr Jasiukajtis 		 */
33325c28e83SPiotr Jasiukajtis 		*(int *)&base = 0;
33425c28e83SPiotr Jasiukajtis 	}
33525c28e83SPiotr Jasiukajtis 	dbase = (double)base;
33625c28e83SPiotr Jasiukajtis 	t = (y - x * dbase) / (x + y * dbase);
33725c28e83SPiotr Jasiukajtis 	s = t * t;
33825c28e83SPiotr Jasiukajtis 	a = (a + t) + t * s * (q1 + s * q2);
33925c28e83SPiotr Jasiukajtis #if defined(__i386) && !defined(__amd64)
34025c28e83SPiotr Jasiukajtis 	if (rp != fp_extended)
34125c28e83SPiotr Jasiukajtis 		(void) __swapRP(rp);
34225c28e83SPiotr Jasiukajtis #endif
34325c28e83SPiotr Jasiukajtis 	return ((float)((sign)? -a : a));
34425c28e83SPiotr Jasiukajtis }
345