995b813e91
Change-Id: Ibd42ebc387c2bf3eba9aa96091770915b4b34184
576 lines
14 KiB
ArmAsm
576 lines
14 KiB
ArmAsm
/*
|
|
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
|