/* Copyright (c) 2014, Intel Corporation All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * Neither the name of Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /******************************************************************************/ // ALGORITHM DESCRIPTION // --------------------- // // This implementation uses the main path for |x| in [2^{-5},2^65). // For |x| in [2^{-64},2^{-5}), a secondary path is used. // For the biased exponent of X within 3FFH-64 and 3FF+64, we use one branch. // We use the following definition of B and X` so that the formula // atan(X) = Tau + atan( (X`-B) / (One + BX) ) is correct // // X = (-1)^s * 2^k * 1. x1 x2 ... x52 // // Define X` = 0 if k >= 5; and X` = |X| otherwise // Define One = 0 if k >= 5; and One = 1 otherwise // Define B = 0 if k <= -6; B = 2^k * 1.x1 x2 x3 x4 1 if -5 <= k <= 4 // Define B = 2^5 * 1.0 0 ... 0 if k >= 5 // // Tau is 0 if k <= -6; // Tau is atan( B ) if -5 <= k <= 4 // Tau is pi/2 if k >= 5 // // Special cases: // atan(NaN) = quiet NaN // atan(+/-INF) = +/-Pi/2 // atan(+/-0) = +/-0 // /******************************************************************************/ #include <private/bionic_asm.h> # -- Begin atan ENTRY(atan) # parameter 1: %xmm0 ..B1.1: ..___tag_value_atan.1: pushq %rsi ..___tag_value_atan.3: movsd %xmm0, (%rsp) ..B1.2: movq $0xffff000000000000, %r8 movd %r8, %xmm3 movq ONEMASK(%rip), %xmm5 movq $0x800000000000, %r9 movd %r9, %xmm4 pextrw $3, %xmm0, %edx andpd %xmm0, %xmm3 pshufd $68, %xmm0, %xmm1 orpd %xmm4, %xmm3 movl %edx, %eax andl $32767, %edx subl $16288, %edx cmpl $159, %edx ja .L_2TAG_PACKET_0.0.1 mulsd %xmm3, %xmm1 subsd %xmm3, %xmm0 addsd %xmm5, %xmm1 divsd %xmm1, %xmm0 addl $1, %edx movq a2(%rip), %xmm2 movq b2(%rip), %xmm4 andl $32768, %eax xorpd %xmm7, %xmm7 pinsrw $3, %eax, %xmm7 addl %edx, %edx lea atan_tbl(%rip), %r8 movq (%r8,%rdx,8), %xmm6 movq 8(%r8,%rdx,8), %xmm5 xorpd %xmm7, %xmm5 xorpd %xmm7, %xmm6 movq 8+a2(%rip), %xmm7 movddup %xmm0, %xmm1 mulsd %xmm0, %xmm0 movddup %xmm1, %xmm3 addsd %xmm6, %xmm1 mulsd %xmm0, %xmm2 addsd %xmm0, %xmm4 subsd %xmm1, %xmm6 mulsd %xmm0, %xmm4 addsd %xmm7, %xmm2 mulsd %xmm3, %xmm0 addsd %xmm3, %xmm6 mulsd %xmm2, %xmm0 addsd 8+b2(%rip), %xmm4 addsd %xmm5, %xmm6 mulsd %xmm4, %xmm0 addsd %xmm6, %xmm0 addsd %xmm1, %xmm0 jmp .L_2TAG_PACKET_1.0.1 .L_2TAG_PACKET_0.0.1: addl $944, %edx cmpl $1103, %edx ja .L_2TAG_PACKET_2.0.1 movq a2(%rip), %xmm4 movq b2(%rip), %xmm7 movq (%rsp), %xmm0 mulsd %xmm1, %xmm1 movq 8+a2(%rip), %xmm2 movq 8+b2(%rip), %xmm5 mulsd %xmm1, %xmm4 addsd %xmm1, %xmm7 movq %xmm1, %xmm6 mulsd %xmm0, %xmm1 addsd %xmm4, %xmm2 mulsd %xmm6, %xmm7 mulsd %xmm1, %xmm2 addsd %xmm5, %xmm7 mulsd %xmm7, %xmm2 addsd %xmm2, %xmm0 jmp .L_2TAG_PACKET_1.0.1 .L_2TAG_PACKET_2.0.1: addl $15344, %edx cmpl $16368, %edx ja .L_2TAG_PACKET_3.0.1 movq (%rsp), %xmm0 movq (%rsp), %xmm1 cmpl $16, %edx jae .L_2TAG_PACKET_1.0.1 mulsd %xmm0, %xmm1 jmp .L_2TAG_PACKET_1.0.1 .L_2TAG_PACKET_3.0.1: cmpl $17392, %edx jae .L_2TAG_PACKET_4.0.1 movq $0xbff0000000000000, %r8 movd %r8, %xmm1 divsd %xmm0, %xmm1 movq a2(%rip), %xmm2 movq b2(%rip), %xmm4 andl $32768, %eax xorpd %xmm7, %xmm7 pinsrw $3, %eax, %xmm7 addl %edx, %edx movq pi_table(%rip), %xmm6 movq 8+pi_table(%rip), %xmm5 xorpd %xmm7, %xmm5 xorpd %xmm7, %xmm6 movq 8+a2(%rip), %xmm7 movddup %xmm1, %xmm0 mulsd %xmm1, %xmm1 movddup %xmm0, %xmm3 addsd %xmm6, %xmm0 mulsd %xmm1, %xmm2 addsd %xmm1, %xmm4 subsd %xmm0, %xmm6 mulsd %xmm1, %xmm4 addsd %xmm7, %xmm2 mulsd %xmm3, %xmm1 addsd %xmm3, %xmm6 mulsd %xmm2, %xmm1 addsd 8+b2(%rip), %xmm4 addsd %xmm5, %xmm6 mulsd %xmm4, %xmm1 addsd %xmm6, %xmm1 addsd %xmm1, %xmm0 jmp .L_2TAG_PACKET_1.0.1 .L_2TAG_PACKET_4.0.1: movq (%rsp), %xmm4 movq SGNMASK(%rip), %xmm0 movq pi_table(%rip), %xmm2 movq 8+pi_table(%rip), %xmm3 movd %xmm1, %eax psrlq $32, %xmm1 movd %xmm1, %edx andl $2147483647, %edx cmpl $2146435072, %edx jae .L_2TAG_PACKET_5.0.1 .L_2TAG_PACKET_6.0.1: andnpd %xmm4, %xmm0 orpd %xmm0, %xmm2 orpd %xmm3, %xmm0 addsd %xmm2, %xmm0 jmp .L_2TAG_PACKET_1.0.1 .L_2TAG_PACKET_5.0.1: subl $2146435072, %edx orl %edx, %eax cmpl $0, %eax je .L_2TAG_PACKET_6.0.1 movq %xmm4, %xmm0 addsd %xmm0, %xmm0 .L_2TAG_PACKET_1.0.1: ..B1.3: popq %rcx ..___tag_value_atan.4: ret ..___tag_value_atan.5: END(atan) # -- End atan .section .rodata, "a" .align 4 .align 4 ONEMASK: .long 0 .long 1072693248 .type ONEMASK,@object .size ONEMASK,8 .align 4 a2: .long 2006262985 .long 1069310863 .long 2358449471 .long 3217342131 .type a2,@object .size a2,16 .align 4 b2: .long 3845454352 .long 1069952297 .long 2829679149 .long 1073771565 .type b2,@object .size b2,16 .align 4 atan_tbl: .long 0 .long 0 .long 0 .long 0 .long 3819695742 .long 1067482761 .long 2398680355 .long 3155462074 .long 2998791009 .long 1067548225 .long 3868465248 .long 3157182472 .long 3339424991 .long 1067613680 .long 3296670360 .long 1010752543 .long 2710002256 .long 1067679126 .long 3403896007 .long 1010910768 .long 3275701428 .long 1067744562 .long 119959933 .long 1011482843 .long 2908636881 .long 1067809988 .long 2464489612 .long 1011545526 .long 3777889398 .long 1067875403 .long 3262682165 .long 1009703919 .long 3759667419 .long 1067940807 .long 1838130851 .long 3157373556 .long 732369940 .long 1068006200 .long 1203428313 .long 1010055371 .long 1166616461 .long 1068071580 .long 2901274051 .long 3158549977 .long 2945472892 .long 1068136947 .long 3726120658 .long 1009762715 .long 3954480976 .long 1068202301 .long 1289173457 .long 1009429861 .long 2081752829 .long 1068267642 .long 1836909874 .long 1006212095 .long 3807999788 .long 1068332968 .long 2172459940 .long 3156162078 .long 2731789884 .long 1068398280 .long 3450718392 .long 3159216547 .long 1044477961 .long 1068463577 .long 2230553229 .long 1011424339 .long 1486930287 .long 1068530218 .long 2861547474 .long 1012041376 .long 2293016881 .long 1068595466 .long 136843272 .long 1012684797 .long 201518157 .long 1068660680 .long 63231984 .long 1012427198 .long 4054234584 .long 1068725856 .long 3927006960 .long 1011878955 .long 1246477213 .long 1068790995 .long 1494265652 .long 3155219350 .long 678186699 .long 1068856093 .long 1264361424 .long 3159256693 .long 2690594995 .long 1068921148 .long 3906996379 .long 1009288267 .long 3362611517 .long 1068986159 .long 1650970041 .long 3158331771 .long 3102162111 .long 1069051124 .long 365917035 .long 3160264153 .long 2352611067 .long 1069116041 .long 4008970190 .long 3159478182 .long 1594134794 .long 1069180908 .long 466690178 .long 1012526501 .long 1345079306 .long 1069245723 .long 2268273568 .long 3160164092 .long 2163300970 .long 1069310484 .long 2750834800 .long 3158113482 .long 352522716 .long 1069375190 .long 1750411372 .long 1011790845 .long 848541647 .long 1069439838 .long 2164207573 .long 1011698350 .long 40647312 .long 1069504427 .long 2949165434 .long 3159107267 .long 2216766270 .long 1069574357 .long 2197920765 .long 3161055954 .long 1090914384 .long 1069638757 .long 2330454674 .long 1013365998 .long 387601244 .long 1069703022 .long 3185681168 .long 1013434071 .long 3991640484 .long 1069767144 .long 1313211590 .long 3161087959 .long 3322489502 .long 1069831118 .long 3013977995 .long 1013053011 .long 3121698570 .long 1069894936 .long 4069015667 .long 1013023362 .long 4289964660 .long 1069958591 .long 1736191156 .long 3158266731 .long 3903312386 .long 1070022077 .long 1833592413 .long 3159731471 .long 3818449864 .long 1070085387 .long 851036429 .long 3159730451 .long 2097480306 .long 1070148515 .long 3506390884 .long 3160462302 .long 1611694502 .long 1070211454 .long 2785735540 .long 3160465144 .long 1464694796 .long 1070274198 .long 4229277299 .long 3159907000 .long 1299612775 .long 1070336741 .long 4116653788 .long 3160427739 .long 1310544789 .long 1070399077 .long 1064430331 .long 1013218202 .long 2253168030 .long 1070461200 .long 1405044609 .long 3157623179 .long 1159567373 .long 1070523105 .long 2353445521 .long 3159992176 .long 1359373750 .long 1070605818 .long 1748171336 .long 3161879263 .long 908341706 .long 1070667034 .long 3372710815 .long 3161775245 .long 1743027350 .long 1070727765 .long 687089934 .long 3160507171 .long 2055355646 .long 1070787992 .long 2392855242 .long 1013682469 .long 690426164 .long 1070847697 .long 1103926666 .long 1014052810 .long 1483247847 .long 1070906862 .long 2082645847 .long 3161345479 .long 392040270 .long 1070965472 .long 2407720023 .long 1014053754 .long 2673846014 .long 1071023511 .long 1293605532 .long 3158464385 .long 1384215810 .long 1071080967 .long 2446095872 .long 3159216407 .long 3101660631 .long 1071137826 .long 698040758 .long 1014855328 .long 2094057058 .long 1071194078 .long 2282048339 .long 1014040385 .long 1712750594 .long 1071249712 .long 1204372378 .long 3162276464 .long 1411515787 .long 1071304719 .long 949080808 .long 1015006403 .long 931538085 .long 1071359091 .long 3027127039 .long 1014307233 .long 179139065 .long 1071412821 .long 4285547492 .long 3161934731 .long 3387721259 .long 1071465902 .long 373225773 .long 1013486625 .long 2132236852 .long 1071544299 .long 3250533429 .long 1014031677 .long 1942070284 .long 1071645596 .long 1237964179 .long 3163239113 .long 1532707802 .long 1071695380 .long 330645583 .long 1012495610 .long 2294184979 .long 1071743834 .long 3959472897 .long 1015833116 .long 3805060714 .long 1071790961 .long 2671256142 .long 1013727772 .long 2215037898 .long 1071836770 .long 2683359117 .long 1015831902 .long 483661594 .long 1071881273 .long 836288326 .long 3162648643 .long 1534679894 .long 1071924486 .long 373258696 .long 3162470096 .long 1538714628 .long 1071966430 .long 3199433068 .long 1015325501 .long 527642555 .long 1072007128 .long 3636832592 .long 3161843145 .long 291339150 .long 1072046605 .long 890169537 .long 3160586117 .long 2450210201 .long 1072084888 .long 1636353294 .long 3163193400 .long 2411367951 .long 1072122007 .long 374899873 .long 1011331750 .long 681549971 .long 1072157992 .long 506411689 .long 1015373954 .long 1466745541 .long 1072192873 .long 2143860931 .long 1013364334 .long 2845622366 .long 1072226682 .long 2869178209 .long 3162423682 .long 2838871438 .long 1072275456 .long 3742223599 .long 1014338577 .long 4200275274 .long 1072337034 .long 1566539915 .long 3161839550 .long 3034733530 .long 1072394897 .long 652621408 .long 3162261964 .long 3207412993 .long 1072449290 .long 3206124665 .long 1014408733 .long 624461478 .long 1072500450 .long 932437485 .long 1015204343 .long 767665908 .long 1072548600 .long 1037911952 .long 3163527627 .long 1110773639 .long 1072593952 .long 2371517912 .long 3160465741 .long 1940828530 .long 1072636704 .long 2731408428 .long 3162895795 .long 1911329388 .long 1072677041 .long 1773089615 .long 3159569267 .long 1764715788 .long 1072704191 .long 691346949 .long 3164069946 .long 3332979233 .long 1072722195 .long 3550733983 .long 1014770628 .long 1321870254 .long 1072739231 .long 1415315820 .long 1016224052 .long 3657429030 .long 1072755365 .long 3910539033 .long 1015966402 .long 4197624557 .long 1072770661 .long 2333399254 .long 3164546480 .long 1512059493 .long 1072785177 .long 2701510318 .long 1016178092 .long 453379037 .long 1072798965 .long 4046344253 .long 3162814364 .long 1942345162 .long 1072818388 .long 621134147 .long 1016335195 .long 4210176273 .long 1072842164 .long 2701013387 .long 3164326619 .long 4185644010 .long 1072863795 .long 4163699341 .long 1016203112 .long 679688788 .long 1072883543 .long 4147276762 .long 1014066750 .long 29432865 .long 1072901630 .long 970415797 .long 1016902063 .long 4070721092 .long 1072918247 .long 2539004411 .long 3163736096 .long 2252468843 .long 1072933561 .long 3424082887 .long 3163407177 .long 2929724825 .long 1072947712 .long 3661482235 .long 3163846989 .long 1377513368 .long 1072960824 .long 3987926680 .long 1013647908 .long 1031632908 .long 1072973003 .long 3672217151 .long 1016614619 .long 2516508130 .long 1072984342 .long 545855020 .long 3162728930 .long 3792452178 .long 1072994923 .long 3420119467 .long 1016471430 .long 3147791459 .long 1073004818 .long 1342204979 .long 1013937254 .long 999189752 .long 1073014090 .long 1006335472 .long 3162850919 .long 711011011 .long 1073022794 .long 4633488 .long 3162966895 .long 15640363 .long 1073030980 .long 1686389560 .long 3164376226 .long 1218463589 .long 1073042382 .long 1526837110 .long 3163533985 .long 2538470555 .long 1073056144 .long 2273304406 .long 3163784996 .long 1229720947 .long 1073068489 .long 2971628206 .long 3162356540 .long 3115427016 .long 1073079621 .long 4215132957 .long 3164282762 .long 4030612557 .long 1073089709 .long 1913251691 .long 3163671292 .long 2728521257 .long 1073098892 .long 2861089500 .long 1015454459 .long 1118696283 .long 1073107285 .long 1628948053 .long 1016179658 .long 2682711255 .long 1073114984 .long 2906306266 .long 1014142643 .long 2073898081 .long 1073122072 .long 1322740454 .long 3164497217 .long 1403700297 .long 1073128618 .long 416137895 .long 3162781466 .long 2502685617 .long 1073134681 .long 3242008732 .long 1014593495 .long 1531926851 .long 1073140313 .long 1362708094 .long 1016517604 .long 3572814411 .long 1073145557 .long 3709790527 .long 1012646874 .long 1695536111 .long 1073150453 .long 3980346340 .long 1016705136 .long 2363057203 .long 1073155033 .long 2551194792 .long 1012569695 .long 2873365682 .long 1073159327 .long 3181154748 .long 1017041450 .long 1053384691 .long 1073165288 .long 3074536879 .long 1016965660 .long 3270542712 .long 1073172451 .long 2535319415 .long 3163051778 .long 1353631484 .long 1073178850 .long 1173833755 .long 1015534537 .long 3511218460 .long 1073184599 .long 1243608109 .long 3161592122 .long 4121259284 .long 1073189793 .long 398584912 .long 3163829923 .long 1193862106 .long 1073194509 .long 1873745539 .long 3163802819 .long 3861949790 .long 1073198808 .long 3841261147 .long 1015587248 .long 1486904578 .long 1073202745 .long 1634726776 .long 3163847886 .long 2879153715 .long 1073206362 .long 200456242 .long 3164138657 .long 385353253 .long 1073209698 .long 1186355517 .long 1014887155 .long 1125865839 .long 1073212783 .long 203561262 .long 3161244927 .long 1221361475 .long 1073215645 .long 3382476563 .long 1014936138 .long 2077323573 .long 1073218307 .long 1005121005 .long 3164430752 .long 215611373 .long 1073220790 .long 353198764 .long 3164485137 .long 2347419265 .long 1073223110 .long 1103143360 .long 1016542137 .long 1379112765 .long 1073225284 .long 381583533 .long 3162870833 .long 3891198463 .long 1073228298 .long 1771275754 .long 1014654681 .long 3395914051 .long 1073231917 .long 2350900914 .long 3164013978 .long 2799919478 .long 1073235146 .long 2893950164 .long 3163260901 .long 1138673476 .long 1073238045 .long 2622204785 .long 3164174388 .long 3408855940 .long 1073240661 .long 2800881650 .long 1016008624 .long 2044858738 .long 1073243035 .long 604544785 .long 1017022901 .long 2578795176 .long 1073245198 .long 2557332925 .long 1016135165 .long 4196285314 .long 1073247177 .long 2032365307 .long 1016194735 .long 224877747 .long 1073248996 .long 497926916 .long 1016947111 .long 3271386490 .long 1073250671 .long 2689994846 .long 1016631513 .long 813635989 .long 1073252221 .long 747035277 .long 3164530136 .long 369829519 .long 1073253658 .long 2182033858 .long 3163190340 .long 1187679052 .long 1073254994 .long 673954443 .long 1016149821 .long 4232586098 .long 1073256239 .long 497775200 .long 3162179015 .long 426690558 .long 1073257404 .long 3063343247 .long 1016865578 .long 1624065902 .long 1073258494 .long 1354224996 .long 3163503778 .long 1413754136 .long 1073291771 .long 856972295 .long 1016178214 .type atan_tbl,@object .size atan_tbl,2592 .align 4 pi_table: .long 1413754136 .long 1073291771 .long 856972295 .long 1016178214 .type pi_table,@object .size pi_table,16 .align 4 SGNMASK: .long 4294967295 .long 2147483647 .type SGNMASK,@object .size SGNMASK,8 .data .section .note.GNU-stack, "" // -- Begin DWARF2 SEGMENT .eh_frame .section .eh_frame,"a",@progbits .eh_frame_seg: .align 1 .4byte 0x00000014 .8byte 0x00527a0100000000 .8byte 0x08070c1b01107801 .4byte 0x00000190 .4byte 0x0000001c .4byte 0x0000001c .4byte ..___tag_value_atan.1-. .4byte ..___tag_value_atan.5-..___tag_value_atan.1 .2byte 0x0400 .4byte ..___tag_value_atan.3-..___tag_value_atan.1 .2byte 0x100e .byte 0x04 .4byte ..___tag_value_atan.4-..___tag_value_atan.3 .2byte 0x080e .byte 0x00 # End