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