/* 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 // --------------------- // // Description: // Let K = 64 (table size). // x x/log(2) n // e = 2 = 2 * T[j] * (1 + P(y)) // where // x = m*log(2)/K + y, y in [-log(2)/K..log(2)/K] // m = n*K + j, m,n,j - signed integer, j in [-K/2..K/2] // j/K // values of 2 are tabulated as T[j] = T_hi[j] ( 1 + T_lo[j]). // // P(y) is a minimax polynomial approximation of exp(x)-1 // on small interval [-log(2)/K..log(2)/K] (were calculated by Maple V). // // To avoid problems with arithmetic overflow and underflow, // n n1 n2 // value of 2 is safely computed as 2 * 2 where n1 in [-BIAS/2..BIAS/2] // where BIAS is a value of exponent bias. // // Special cases: // exp(NaN) = NaN // exp(+INF) = +INF // exp(-INF) = 0 // exp(x) = 1 for subnormals // for finite argument, only exp(0)=1 is exact // For IEEE double // if x > 709.782712893383973096 then exp(x) overflow // if x < -745.133219101941108420 then exp(x) underflow // /******************************************************************************/ #include <private/bionic_asm.h> # -- Begin static_func .text .align __bionic_asm_align .type static_func, @function static_func: ..B1.1: call ..L2 ..L2: popl %eax lea _GLOBAL_OFFSET_TABLE_+[. - ..L2](%eax), %eax lea static_const_table@GOTOFF(%eax), %eax ret .size static_func,.-static_func # -- End static_func # -- Begin exp ENTRY(exp) # parameter 1: 8 + %ebp ..B2.1: ..B2.2: pushl %ebp movl %esp, %ebp subl $120, %esp movl %ebx, 64(%esp) call static_func movl %eax, %ebx movsd 128(%esp), %xmm0 unpcklpd %xmm0, %xmm0 movapd 64(%ebx), %xmm1 movapd 48(%ebx), %xmm6 movapd 80(%ebx), %xmm2 movapd 96(%ebx), %xmm3 pextrw $3, %xmm0, %eax andl $32767, %eax movl $16527, %edx subl %eax, %edx subl $15504, %eax orl %eax, %edx cmpl $-2147483648, %edx jae .L_2TAG_PACKET_0.0.2 mulpd %xmm0, %xmm1 addpd %xmm6, %xmm1 movapd %xmm1, %xmm7 subpd %xmm6, %xmm1 mulpd %xmm1, %xmm2 movapd 128(%ebx), %xmm4 mulpd %xmm1, %xmm3 movapd 144(%ebx), %xmm5 subpd %xmm2, %xmm0 movd %xmm7, %eax movl %eax, %ecx andl $63, %ecx shll $4, %ecx sarl $6, %eax movl %eax, %edx movdqa 16(%ebx), %xmm6 pand %xmm6, %xmm7 movdqa 32(%ebx), %xmm6 paddq %xmm6, %xmm7 psllq $46, %xmm7 subpd %xmm3, %xmm0 movapd 160(%ebx,%ecx), %xmm2 mulpd %xmm0, %xmm4 movapd %xmm0, %xmm6 movapd %xmm0, %xmm1 mulpd %xmm6, %xmm6 mulpd %xmm6, %xmm0 addpd %xmm4, %xmm5 mulsd %xmm6, %xmm0 mulpd 112(%ebx), %xmm6 addsd %xmm2, %xmm1 unpckhpd %xmm2, %xmm2 mulpd %xmm5, %xmm0 addsd %xmm0, %xmm1 orpd %xmm7, %xmm2 unpckhpd %xmm0, %xmm0 addsd %xmm1, %xmm0 addsd %xmm6, %xmm0 addl $894, %edx cmpl $1916, %edx ja .L_2TAG_PACKET_1.0.2 mulsd %xmm2, %xmm0 addsd %xmm2, %xmm0 jmp .L_2TAG_PACKET_2.0.2 .L_2TAG_PACKET_1.0.2: fstcw 24(%esp) movzwl 24(%esp), %edx orl $768, %edx movw %dx, 28(%esp) fldcw 28(%esp) movl %eax, %edx sarl $1, %eax subl %eax, %edx movdqa (%ebx), %xmm6 pandn %xmm2, %xmm6 addl $1023, %eax movd %eax, %xmm3 psllq $52, %xmm3 orpd %xmm3, %xmm6 addl $1023, %edx movd %edx, %xmm4 psllq $52, %xmm4 movsd %xmm0, 8(%esp) fldl 8(%esp) movsd %xmm6, 16(%esp) fldl 16(%esp) fmul %st, %st(1) faddp %st, %st(1) movsd %xmm4, 8(%esp) fldl 8(%esp) fmulp %st, %st(1) fstpl 8(%esp) movsd 8(%esp), %xmm0 fldcw 24(%esp) pextrw $3, %xmm0, %ecx andl $32752, %ecx cmpl $32752, %ecx jae .L_2TAG_PACKET_3.0.2 cmpl $0, %ecx je .L_2TAG_PACKET_4.0.2 jmp .L_2TAG_PACKET_2.0.2 cmpl $-2147483648, %ecx jb .L_2TAG_PACKET_3.0.2 cmpl $-1064950997, %ecx jb .L_2TAG_PACKET_2.0.2 ja .L_2TAG_PACKET_4.0.2 movl 128(%esp), %edx cmpl $-17155601, %edx jb .L_2TAG_PACKET_2.0.2 jmp .L_2TAG_PACKET_4.0.2 .L_2TAG_PACKET_3.0.2: movl $14, %edx jmp .L_2TAG_PACKET_5.0.2 .L_2TAG_PACKET_4.0.2: movl $15, %edx .L_2TAG_PACKET_5.0.2: movsd %xmm0, (%esp) movsd 128(%esp), %xmm0 fldl (%esp) jmp .L_2TAG_PACKET_6.0.2 .L_2TAG_PACKET_7.0.2: cmpl $2146435072, %eax jae .L_2TAG_PACKET_8.0.2 movl 132(%esp), %eax cmpl $-2147483648, %eax jae .L_2TAG_PACKET_9.0.2 movsd 1208(%ebx), %xmm0 mulsd %xmm0, %xmm0 movl $14, %edx jmp .L_2TAG_PACKET_5.0.2 .L_2TAG_PACKET_9.0.2: movsd 1216(%ebx), %xmm0 mulsd %xmm0, %xmm0 movl $15, %edx jmp .L_2TAG_PACKET_5.0.2 .L_2TAG_PACKET_8.0.2: movl 128(%esp), %edx cmpl $2146435072, %eax ja .L_2TAG_PACKET_10.0.2 cmpl $0, %edx jne .L_2TAG_PACKET_10.0.2 movl 132(%esp), %eax cmpl $2146435072, %eax jne .L_2TAG_PACKET_11.0.2 movsd 1192(%ebx), %xmm0 jmp .L_2TAG_PACKET_2.0.2 .L_2TAG_PACKET_11.0.2: movsd 1200(%ebx), %xmm0 jmp .L_2TAG_PACKET_2.0.2 .L_2TAG_PACKET_10.0.2: movsd 128(%esp), %xmm0 addsd %xmm0, %xmm0 jmp .L_2TAG_PACKET_2.0.2 .L_2TAG_PACKET_0.0.2: movl 132(%esp), %eax andl $2147483647, %eax cmpl $1083179008, %eax jae .L_2TAG_PACKET_7.0.2 movsd 128(%esp), %xmm0 addsd 1184(%ebx), %xmm0 jmp .L_2TAG_PACKET_2.0.2 .L_2TAG_PACKET_2.0.2: movsd %xmm0, 48(%esp) fldl 48(%esp) .L_2TAG_PACKET_6.0.2: movl 64(%esp), %ebx movl %ebp, %esp popl %ebp ret ..B2.3: END(exp) # -- End exp # Start file scope ASM ALIAS_SYMBOL(expl, exp); # End file scope ASM .section .rodata, "a" .align 16 .align 16 static_const_table: .long 0 .long 4293918720 .long 0 .long 4293918720 .long 4294967232 .long 0 .long 4294967232 .long 0 .long 65472 .long 0 .long 65472 .long 0 .long 0 .long 1127743488 .long 0 .long 1127743488 .long 1697350398 .long 1079448903 .long 1697350398 .long 1079448903 .long 4277796864 .long 1065758274 .long 4277796864 .long 1065758274 .long 3164486458 .long 1025308570 .long 3164486458 .long 1025308570 .long 4294967294 .long 1071644671 .long 4294967294 .long 1071644671 .long 3811088480 .long 1062650204 .long 1432067621 .long 1067799893 .long 3230715663 .long 1065423125 .long 1431604129 .long 1069897045 .long 0 .long 0 .long 0 .long 0 .long 235107661 .long 1018002367 .long 1048019040 .long 11418 .long 896005651 .long 1015861842 .long 3541402996 .long 22960 .long 1642514529 .long 1012987726 .long 410360776 .long 34629 .long 1568897900 .long 1016568486 .long 1828292879 .long 46424 .long 1882168529 .long 1010744893 .long 852742562 .long 58348 .long 509852888 .long 1017336174 .long 3490863952 .long 70401 .long 653277307 .long 1017431380 .long 2930322911 .long 82586 .long 1649557430 .long 1017729363 .long 1014845818 .long 94904 .long 1058231231 .long 1015777676 .long 3949972341 .long 107355 .long 1044000607 .long 1016786167 .long 828946858 .long 119943 .long 1151779725 .long 1015705409 .long 2288159958 .long 132667 .long 3819481236 .long 1016499965 .long 1853186616 .long 145530 .long 2552227826 .long 1015039787 .long 1709341917 .long 158533 .long 1829350193 .long 1015216097 .long 4112506593 .long 171677 .long 1913391795 .long 1015756674 .long 2799960843 .long 184965 .long 1303423926 .long 1015238005 .long 171030293 .long 198398 .long 1574172746 .long 1016061241 .long 2992903935 .long 211976 .long 3424156969 .long 1017196428 .long 926591434 .long 225703 .long 1938513547 .long 1017631273 .long 887463926 .long 239579 .long 2804567149 .long 1015390024 .long 1276261410 .long 253606 .long 631083525 .long 1017690182 .long 569847337 .long 267786 .long 1623370770 .long 1011049453 .long 1617004845 .long 282120 .long 3667985273 .long 1013894369 .long 3049340112 .long 296610 .long 3145379760 .long 1014403278 .long 3577096743 .long 311258 .long 2603100681 .long 1017152460 .long 1990012070 .long 326066 .long 3249202951 .long 1017448880 .long 1453150081 .long 341035 .long 419288974 .long 1016280325 .long 917841882 .long 356167 .long 3793507337 .long 1016095713 .long 3712504873 .long 371463 .long 728023093 .long 1016345318 .long 363667784 .long 386927 .long 2582678538 .long 1017123460 .long 2956612996 .long 402558 .long 7592966 .long 1016721543 .long 2186617380 .long 418360 .long 228611441 .long 1016696141 .long 1719614412 .long 434334 .long 2261665670 .long 1017457593 .long 1013258798 .long 450482 .long 544148907 .long 1017323666 .long 3907805043 .long 466805 .long 2383914918 .long 1017143586 .long 1447192520 .long 483307 .long 1176412038 .long 1017267372 .long 1944781190 .long 499988 .long 2882956373 .long 1013312481 .long 919555682 .long 516851 .long 3154077648 .long 1016528543 .long 2571947538 .long 533897 .long 348651999 .long 1016405780 .long 2604962540 .long 551129 .long 3253791412 .long 1015920431 .long 1110089947 .long 568549 .long 1509121860 .long 1014756995 .long 2568320822 .long 586158 .long 2617649212 .long 1017340090 .long 2966275556 .long 603959 .long 553214634 .long 1016457425 .long 2682146383 .long 621954 .long 730975783 .long 1014083580 .long 2191782032 .long 640145 .long 1486499517 .long 1016818996 .long 2069751140 .long 658534 .long 2595788928 .long 1016407932 .long 2990417244 .long 677123 .long 1853053619 .long 1015310724 .long 1434058175 .long 695915 .long 2462790535 .long 1015814775 .long 2572866477 .long 714911 .long 3693944214 .long 1017259110 .long 3092190714 .long 734114 .long 2979333550 .long 1017188654 .long 4076559942 .long 753526 .long 174054861 .long 1014300631 .long 2420883922 .long 773150 .long 816778419 .long 1014197934 .long 3716502172 .long 792987 .long 3507050924 .long 1015341199 .long 777507147 .long 813041 .long 1821514088 .long 1013410604 .long 3706687593 .long 833312 .long 920623539 .long 1016295433 .long 1242007931 .long 853805 .long 2789017511 .long 1014276997 .long 3707479175 .long 874520 .long 3586233004 .long 1015962192 .long 64696965 .long 895462 .long 474650514 .long 1016642419 .long 863738718 .long 916631 .long 1614448851 .long 1014281732 .long 3884662774 .long 938030 .long 2450082086 .long 1016164135 .long 2728693977 .long 959663 .long 1101668360 .long 1015989180 .long 3999357479 .long 981531 .long 835814894 .long 1015702697 .long 1533953344 .long 1003638 .long 1301400989 .long 1014466875 .long 2174652632 .long 1025985 .long 0 .long 1072693248 .long 0 .long 2146435072 .long 0 .long 0 .long 4294967295 .long 2146435071 .long 0 .long 1048576 .type static_const_table,@object .size static_const_table,1224 .data .section .note.GNU-stack, "" # End