You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

808 lines
18 KiB

/*
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
// ---------------------
//
// Let x=2^k * mx, mx in [1,2)
//
// Get B~1/mx based on the output of rcpss instruction (B0)
// B = int((B0*LH*2^7+0.5))/2^7
// LH is a short approximation for log10(e)
//
// Reduced argument: r=B*mx-LH (computed accurately in high and low parts)
//
// Result: k*log10(2) - log(B) + p(r)
// p(r) is a degree 7 polynomial
// -log(B) read from data table (high, low parts)
// Result is formed from high and low parts
//
// Special cases:
// log10(0) = -INF with divide-by-zero exception raised
// log10(1) = +0
// log10(x) = NaN with invalid exception raised if x < -0, including -INF
// log10(+INF) = +INF
//
/******************************************************************************/
#include <private/bionic_asm.h>
# -- Begin log10
ENTRY(log10)
# parameter 1: %xmm0
..B1.1:
..___tag_value_log10.1:
subq $24, %rsp
..___tag_value_log10.3:
movsd %xmm0, (%rsp)
..B1.2:
xorpd %xmm2, %xmm2
movl $16368, %eax
pinsrw $3, %eax, %xmm2
movl $1054736384, %ecx
movd %ecx, %xmm7
xorpd %xmm3, %xmm3
movl $30704, %edx
pinsrw $3, %edx, %xmm3
movq %xmm0, %xmm1
movl $32768, %edx
movd %edx, %xmm4
movapd HIGHSIGMASK(%rip), %xmm5
pextrw $3, %xmm0, %eax
orpd %xmm2, %xmm0
movl $16352, %ecx
psrlq $27, %xmm0
movq LOG10_E(%rip), %xmm2
psrld $2, %xmm0
rcpps %xmm0, %xmm0
psllq $12, %xmm1
pshufd $78, %xmm5, %xmm6
psrlq $12, %xmm1
subl $16, %eax
cmpl $32736, %eax
jae .L_2TAG_PACKET_0.0.2
.L_2TAG_PACKET_1.0.2:
mulss %xmm7, %xmm0
orpd %xmm3, %xmm1
lea L_tbl(%rip), %r11
andpd %xmm1, %xmm5
paddd %xmm4, %xmm0
subsd %xmm5, %xmm1
movd %xmm0, %edx
psllq $29, %xmm0
andpd %xmm6, %xmm0
andl $32752, %eax
subl %ecx, %eax
cvtsi2sd %eax, %xmm7
mulpd %xmm0, %xmm5
mulsd %xmm0, %xmm1
movq log2(%rip), %xmm6
movapd coeff(%rip), %xmm3
subsd %xmm2, %xmm5
andl $16711680, %edx
shrl $12, %edx
movapd -1504(%r11,%rdx), %xmm0
movapd 16+coeff(%rip), %xmm4
addsd %xmm5, %xmm1
movapd 32+coeff(%rip), %xmm2
mulsd %xmm7, %xmm6
pshufd $68, %xmm1, %xmm5
mulsd 8+log2(%rip), %xmm7
mulsd %xmm1, %xmm3
addsd %xmm6, %xmm0
mulpd %xmm5, %xmm4
movq 8+LOG10_E(%rip), %xmm6
mulpd %xmm5, %xmm5
addpd %xmm2, %xmm4
mulpd %xmm5, %xmm3
pshufd $228, %xmm0, %xmm2
addsd %xmm1, %xmm0
mulsd %xmm1, %xmm4
subsd %xmm0, %xmm2
mulsd %xmm1, %xmm6
addsd %xmm2, %xmm1
pshufd $238, %xmm0, %xmm2
mulsd %xmm5, %xmm5
addsd %xmm2, %xmm7
addsd %xmm6, %xmm1
addpd %xmm3, %xmm4
addsd %xmm7, %xmm1
mulpd %xmm5, %xmm4
addsd %xmm4, %xmm1
pshufd $238, %xmm4, %xmm5
addsd %xmm5, %xmm1
addsd %xmm1, %xmm0
jmp ..B1.5
.L_2TAG_PACKET_0.0.2:
movq (%rsp), %xmm0
movq (%rsp), %xmm1
addl $16, %eax
cmpl $32768, %eax
jae .L_2TAG_PACKET_2.0.2
cmpl $16, %eax
jb .L_2TAG_PACKET_3.0.2
.L_2TAG_PACKET_4.0.2:
addsd %xmm0, %xmm0
jmp ..B1.5
.L_2TAG_PACKET_5.0.2:
ja .L_2TAG_PACKET_4.0.2
cmpl $0, %edx
ja .L_2TAG_PACKET_4.0.2
jmp .L_2TAG_PACKET_6.0.2
.L_2TAG_PACKET_3.0.2:
xorpd %xmm1, %xmm1
addsd %xmm0, %xmm1
movd %xmm1, %edx
psrlq $32, %xmm1
movd %xmm1, %ecx
orl %ecx, %edx
cmpl $0, %edx
je .L_2TAG_PACKET_7.0.2
xorpd %xmm1, %xmm1
movl $18416, %eax
pinsrw $3, %eax, %xmm1
mulsd %xmm1, %xmm0
xorpd %xmm2, %xmm2
movl $16368, %eax
pinsrw $3, %eax, %xmm2
movq %xmm0, %xmm1
pextrw $3, %xmm0, %eax
orpd %xmm2, %xmm0
movl $18416, %ecx
psrlq $27, %xmm0
movq LOG10_E(%rip), %xmm2
psrld $2, %xmm0
rcpps %xmm0, %xmm0
psllq $12, %xmm1
pshufd $78, %xmm5, %xmm6
psrlq $12, %xmm1
jmp .L_2TAG_PACKET_1.0.2
.L_2TAG_PACKET_2.0.2:
movd %xmm1, %edx
psrlq $32, %xmm1
movd %xmm1, %ecx
addl %ecx, %ecx
cmpl $-2097152, %ecx
jae .L_2TAG_PACKET_5.0.2
orl %ecx, %edx
cmpl $0, %edx
je .L_2TAG_PACKET_7.0.2
.L_2TAG_PACKET_6.0.2:
xorpd %xmm1, %xmm1
xorpd %xmm0, %xmm0
movl $32752, %eax
pinsrw $3, %eax, %xmm1
mulsd %xmm1, %xmm0
movl $9, 16(%rsp)
jmp .L_2TAG_PACKET_8.0.2
.L_2TAG_PACKET_7.0.2:
xorpd %xmm1, %xmm1
xorpd %xmm0, %xmm0
movl $49136, %eax
pinsrw $3, %eax, %xmm0
divsd %xmm1, %xmm0
movl $8, 16(%rsp)
.L_2TAG_PACKET_8.0.2:
movq %xmm0, 8(%rsp)
..B1.3:
movq 8(%rsp), %xmm0
.L_2TAG_PACKET_9.0.2:
..B1.5:
addq $24, %rsp
..___tag_value_log10.4:
ret
..___tag_value_log10.5:
END(log10)
# -- End log10
.section .rodata, "a"
.align 16
.align 16
HIGHSIGMASK:
.long 4160749568
.long 4294967295
.long 0
.long 4294959104
.type HIGHSIGMASK,@object
.size HIGHSIGMASK,16
.align 16
LOG10_E:
.long 0
.long 1071366144
.long 3207479560
.long 1062894188
.type LOG10_E,@object
.size LOG10_E,16
.align 16
L_tbl:
.long 1352628224
.long 1070810131
.long 521319256
.long 1025503025
.long 2150839296
.long 1070801944
.long 3329350096
.long 3170190015
.long 1360613376
.long 1070793794
.long 2024059075
.long 1024991594
.long 1875350528
.long 1070785680
.long 2163882141
.long 3163564137
.long 2312126464
.long 1070777602
.long 1975711076
.long 1023674196
.long 1306336256
.long 1070769560
.long 3524899523
.long 3170508164
.long 1806334976
.long 1070761553
.long 4254777025
.long 1025238739
.long 2483193856
.long 1070753581
.long 3800671317
.long 3172916830
.long 2025350144
.long 1070745644
.long 1731514745
.long 1025501083
.long 3433285632
.long 1070737741
.long 2551857336
.long 3169662186
.long 1134317568
.long 1070729873
.long 3426297655
.long 3172637891
.long 2457152512
.long 1070722038
.long 63549415
.long 1025415416
.long 1861803008
.long 1070714237
.long 1910171636
.long 1023977580
.long 2414140416
.long 1070706469
.long 4002514337
.long 3170841618
.long 2900726784
.long 1070698734
.long 3268064083
.long 1022459609
.long 2123517952
.long 1070691032
.long 1767031218
.long 1022448156
.long 3194569728
.long 1070683362
.long 3402332618
.long 3171671160
.long 650882048
.long 1070675725
.long 4146023905
.long 3171023038
.long 1928988672
.long 1070668119
.long 1438617867
.long 1016360491
.long 1594908672
.long 1070660545
.long 971389377
.long 1024763979
.long 2818746368
.long 1070653002
.long 3555925341
.long 3172434821
.long 194584576
.long 1070645491
.long 943919215
.long 3172950063
.long 1215096832
.long 1070638010
.long 2283358588
.long 1022335098
.long 501519360
.long 1070630560
.long 480904295
.long 1024437959
.long 1278266368
.long 1070623140
.long 2755806066
.long 3172342012
.long 2487812096
.long 1070615750
.long 2489653202
.long 3172481099
.long 3085451264
.long 1070608390
.long 3759184951
.long 3172574892
.long 2039090176
.long 1070601060
.long 1361176676
.long 3172355319
.long 953057280
.long 1070591423
.long 1176587546
.long 3166422018
.long 3370524672
.long 1070576879
.long 3669570051
.long 1025376630
.long 749742080
.long 1070562394
.long 707700964
.long 3170814058
.long 4008353792
.long 1070547965
.long 3247327652
.long 1022431400
.long 2612455424
.long 1070533594
.long 2453457344
.long 3172322969
.long 3230920704
.long 1070519279
.long 1296781801
.long 1025115335
.long 3965253632
.long 1070505020
.long 373075289
.long 1017938528
.long 2593157120
.long 1070476669
.long 1068054086
.long 1021616576
.long 925962240
.long 1070448537
.long 850121213
.long 1023928989
.long 1732556800
.long 1070420620
.long 1305206740
.long 3172665570
.long 3815630848
.long 1070392915
.long 192642943
.long 3172699907
.long 2001758208
.long 1070365420
.long 2820786683
.long 1024704867
.long 16746496
.long 1070338131
.long 1399573110
.long 3171372773
.long 1886492672
.long 1070311044
.long 3621428075
.long 3172974358
.long 3338196992
.long 1070284157
.long 3793882035
.long 1025124701
.long 381769728
.long 1070257468
.long 3877933342
.long 3170195490
.long 2186491904
.long 1070230972
.long 1838687089
.long 1017927292
.long 1008330752
.long 1070204668
.long 2228321664
.long 1025352196
.long 2247065600
.long 1070178552
.long 1413900906
.long 3170902532
.long 2964070400
.long 1070152622
.long 3590454629
.long 1025016844
.long 465154048
.long 1070126876
.long 2079688550
.long 3172268183
.long 883615744
.long 1070101310
.long 989244452
.long 3171900485
.long 1993768960
.long 1070075922
.long 1124327841
.long 3172964992
.long 1794471936
.long 1070050710
.long 1140575046
.long 1022673726
.long 2797932544
.long 1070025671
.long 1894836933
.long 3172544059
.long 3433797632
.long 1070000803
.long 3221831166
.long 3171921685
.long 2338371584
.long 1069976104
.long 3732461053
.long 3164513518
.long 2644013056
.long 1069951571
.long 2519460462
.long 3172548740
.long 3383814144
.long 1069927202
.long 2290997657
.long 1025499649
.long 3781380096
.long 1069902995
.long 380479405
.long 1025184136
.long 3245785088
.long 1069878948
.long 1096398261
.long 3169885192
.long 1366712320
.long 1069855059
.long 2218343715
.long 3170281628
.long 2204717056
.long 1069831325
.long 2668334011
.long 1025264524
.long 1401772032
.long 1069807745
.long 4103993159
.long 1022925721
.long 3356721152
.long 1069784316
.long 3573790772
.long 3172186527
.long 4041148416
.long 1069761037
.long 4027691910
.long 3171276990
.long 3880151040
.long 1069737906
.long 4087118786
.long 3172710734
.long 3453364224
.long 1069714921
.long 99014299
.long 3172003077
.long 3491092480
.long 1069692080
.long 3801836701
.long 3172989287
.long 575580160
.long 1069669382
.long 1920406012
.long 3170874125
.long 22282240
.long 1069646824
.long 964193370
.long 1019363159
.long 2991429632
.long 1069624404
.long 3372589890
.long 1023425053
.long 2189645824
.long 1069602122
.long 2610503872
.long 1023652442
.long 3341467648
.long 1069579975
.long 1190292004
.long 1022425665
.long 3711293440
.long 1069557962
.long 1104795356
.long 1023625829
.long 1380401152
.long 1069524644
.long 1156998217
.long 1025100499
.long 765710336
.long 1069481144
.long 1736649113
.long 1024999439
.long 849412096
.long 1069437902
.long 2618178330
.long 3170853629
.long 1433104384
.long 1069394915
.long 43477267
.long 3170378811
.long 2548596736
.long 1069352180
.long 3967367063
.long 1025246584
.long 157577216
.long 1069309695
.long 100402533
.long 3172825502
.long 3326238720
.long 1069267455
.long 1176892909
.long 1025464099
.long 4155494400
.long 1069225459
.long 3713707617
.long 3172630046
.long 3545804800
.long 1069183704
.long 857007315
.long 1024965777
.long 2602520576
.long 1069142187
.long 2588758347
.long 1022463131
.long 2631196672
.long 1069100905
.long 2118424235
.long 1022490989
.long 838135808
.long 1069059856
.long 4117002727
.long 1024874520
.long 3210903552
.long 1069019036
.long 650070125
.long 3172012966
.long 3039211520
.long 1068978444
.long 438055812
.long 1017743757
.long 2385633280
.long 1068938077
.long 3011990369
.long 3171312044
.long 3491618816
.long 1068897932
.long 712813818
.long 3172720400
.long 183644160
.long 1068858008
.long 4287006742
.long 1022379728
.long 3639214080
.long 1068818300
.long 353762279
.long 3172980009
.long 3728416768
.long 1068778808
.long 1851367730
.long 1025486574
.long 3370094592
.long 1068739529
.long 4046594913
.long 3172567047
.long 1348407296
.long 1068700461
.long 143189675
.long 1025397632
.long 899403776
.long 1068661601
.long 3753687842
.long 3170772772
.long 1117708288
.long 1068622947
.long 1857340812
.long 3170782678
.long 1248276480
.long 1068584497
.long 1289858203
.long 1025222289
.long 683237376
.long 1068546249
.long 2356679608
.long 3171629170
.long 3253764096
.long 1068508200
.long 3267136556
.long 1018554987
.long 94478336
.long 1068441756
.long 1927868814
.long 3169378180
.long 3233144832
.long 1068366445
.long 2682188854
.long 1023964004
.long 2940297216
.long 1068291522
.long 275301289
.long 1023944679
.long 3677708288
.long 1068216982
.long 302658771
.long 1024465567
.long 1576968192
.long 1068142822
.long 3672035940
.long 3172254610
.long 1614069760
.long 1068069037
.long 480052905
.long 3172692062
.long 424435712
.long 1067995624
.long 2207869657
.long 3170965436
.long 3477782528
.long 1067922578
.long 2980661858
.long 3164990018
.long 3598401536
.long 1067849897
.long 1974393034
.long 3171357083
.long 2435235840
.long 1067777577
.long 1385289011
.long 1024615823
.long 1867333632
.long 1067705614
.long 3442236633
.long 1025334384
.long 3999301632
.long 1067634004
.long 3506472073
.long 1025132546
.long 2566971392
.long 1067562745
.long 1425757592
.long 3172358463
.long 112943104
.long 1067491833
.long 1693407156
.long 3172426603
.long 3079929856
.long 1067392159
.long 3999942455
.long 1018549369
.long 2443837440
.long 1067251701
.long 974534460
.long 1023963412
.long 359366656
.long 1067111917
.long 2204915018
.long 1013514416
.long 3564519424
.long 1066972799
.long 3977441659
.long 3170879860
.long 2011086848
.long 1066834343
.long 590145514
.long 1025390011
.long 3216982016
.long 1066696541
.long 3629120110
.long 1024330313
.long 2194128896
.long 1066559388
.long 2367098512
.long 3172260338
.long 2916220928
.long 1066422877
.long 2262431886
.long 1021229446
.long 2263941120
.long 1066172214
.long 3118507287
.long 1021484970
.long 3076292608
.long 1065901726
.long 1411737803
.long 3172957147
.long 1186136064
.long 1065632488
.long 3109349337
.long 1025397383
.long 3085303808
.long 1065364487
.long 584715031
.long 3172596519
.long 1821048832
.long 1064842211
.long 2182246895
.long 3172536214
.long 697368576
.long 1064311094
.long 3157561765
.long 3172716357
.long 894042112
.long 1063260131
.long 3237958154
.long 3172587292
.long 0
.long 0
.long 0
.long 0
.type L_tbl,@object
.size L_tbl,2064
.align 16
log2:
.long 1352628224
.long 1066615827
.long 521319256
.long 1021308721
.type log2,@object
.size log2,16
.align 16
coeff:
.long 3248877870
.long 1077250164
.long 1691676429
.long 3221787401
.long 945132465
.long 3223701783
.long 3700831335
.long 1073506818
.long 2141010593
.long 1075227551
.long 3698831637
.long 3220339442
.type coeff,@object
.size coeff,48
.data
.section .note.GNU-stack, "",@progbits
// -- 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_log10.1-.
.4byte ..___tag_value_log10.5-..___tag_value_log10.1
.2byte 0x0400
.4byte ..___tag_value_log10.3-..___tag_value_log10.1
.2byte 0x200e
.byte 0x04
.4byte ..___tag_value_log10.4-..___tag_value_log10.3
.2byte 0x080e
.byte 0x00
# End