blob: 40cb5e2437648d149267a8ca7f4ea9de22f6afec [file] [log] [blame]
Jingwei Zhang5d4f0e62014-10-31 18:29:18 +08001/*
2Copyright (c) 2014, Intel Corporation
3All rights reserved.
4
5Redistribution and use in source and binary forms, with or without
6modification, are permitted provided that the following conditions are met:
7
8 * Redistributions of source code must retain the above copyright notice,
9 * this list of conditions and the following disclaimer.
10
11 * Redistributions in binary form must reproduce the above copyright notice,
12 * this list of conditions and the following disclaimer in the documentation
13 * and/or other materials provided with the distribution.
14
15 * Neither the name of Intel Corporation nor the names of its contributors
16 * may be used to endorse or promote products derived from this software
17 * without specific prior written permission.
18
19THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
20ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
23ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
26ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29*/
30
31/******************************************************************************/
32// ALGORITHM DESCRIPTION
33// ---------------------
34//
35// x=2^k * mx, mx in [1,2)
36//
37// Get B~1/mx based on the output of rcpss instruction (B0)
38// B = int((B0*2^7+0.5))/2^7
39//
40// Reduced argument: r=B*mx-1.0 (computed accurately in high and low parts)
41//
42// Result: k*log(2) - log(B) + p(r) if |x-1| >= small value (2^-6) and
43// p(r) is a degree 7 polynomial
44// -log(B) read from data table (high, low parts)
45// Result is formed from high and low parts
46//
47// Special cases:
48// log(NaN) = quiet NaN, and raise invalid exception
49// log(+INF) = that INF
50// log(0) = -INF with divide-by-zero exception raised
51// log(1) = +0
52// log(x) = NaN with invalid exception raised if x < -0, including -INF
53//
54/******************************************************************************/
55
56#include <private/bionic_asm.h>
57# -- Begin log
58ENTRY(log)
59# parameter 1: %xmm0
60..B1.1:
61..___tag_value_log.1:
62 subq $24, %rsp
63..___tag_value_log.3:
64 movsd %xmm0, (%rsp)
65..B1.2:
66 movq $0x3ff0000000000000, %rax
67 movd %rax, %xmm2
68 movq $0x77f0000000000000, %rdx
69 movd %rdx, %xmm3
70 movl $32768, %ecx
71 movd %rcx, %xmm4
72 movq $0xffffe00000000000, %r8
73 movd %r8, %xmm5
74 movq %xmm0, %xmm1
75 pextrw $3, %xmm0, %eax
76 orpd %xmm2, %xmm0
77 movl $16352, %ecx
78 psrlq $27, %xmm0
79 lea L_tbl(%rip), %r11
80 psrld $2, %xmm0
81 rcpps %xmm0, %xmm0
82 psllq $12, %xmm1
83 pshufd $228, %xmm5, %xmm6
84 psrlq $12, %xmm1
85 subl $16, %eax
86 cmpl $32736, %eax
87 jae .L_2TAG_PACKET_0.0.2
88.L_2TAG_PACKET_1.0.2:
89 paddd %xmm4, %xmm0
90 orpd %xmm3, %xmm1
91 movd %xmm0, %edx
92 psllq $29, %xmm0
93 andpd %xmm1, %xmm5
94 andpd %xmm6, %xmm0
95 subsd %xmm5, %xmm1
96 mulpd %xmm0, %xmm5
97 andl $32752, %eax
98 subl %ecx, %eax
99 cvtsi2sd %eax, %xmm7
100 mulsd %xmm0, %xmm1
101 movq log2(%rip), %xmm6
102 movapd coeff(%rip), %xmm3
103 subsd %xmm2, %xmm5
104 andl $16711680, %edx
105 shrl $12, %edx
106 movapd (%r11,%rdx), %xmm0
107 movapd 16+coeff(%rip), %xmm4
108 addsd %xmm5, %xmm1
109 movapd 32+coeff(%rip), %xmm2
110 mulsd %xmm7, %xmm6
111 movddup %xmm1, %xmm5
112 mulsd 8+log2(%rip), %xmm7
113 mulsd %xmm1, %xmm3
114 addsd %xmm6, %xmm0
115 mulpd %xmm5, %xmm4
116 mulpd %xmm5, %xmm5
117 movddup %xmm0, %xmm6
118 addsd %xmm1, %xmm0
119 addpd %xmm2, %xmm4
120 mulpd %xmm5, %xmm3
121 subsd %xmm0, %xmm6
122 mulsd %xmm1, %xmm4
123 pshufd $238, %xmm0, %xmm2
124 addsd %xmm6, %xmm1
125 mulsd %xmm5, %xmm5
126 addsd %xmm2, %xmm7
127 addpd %xmm3, %xmm4
128 addsd %xmm7, %xmm1
129 mulpd %xmm5, %xmm4
130 addsd %xmm4, %xmm1
131 pshufd $238, %xmm4, %xmm5
132 addsd %xmm5, %xmm1
133 addsd %xmm1, %xmm0
134 jmp ..B1.5
135.L_2TAG_PACKET_0.0.2:
136 movq (%rsp), %xmm0
137 movq (%rsp), %xmm1
138 addl $16, %eax
139 cmpl $32768, %eax
140 jae .L_2TAG_PACKET_2.0.2
141 cmpl $16, %eax
142 jb .L_2TAG_PACKET_3.0.2
143.L_2TAG_PACKET_4.0.2:
144 addsd %xmm0, %xmm0
145 jmp ..B1.5
146.L_2TAG_PACKET_5.0.2:
147 ja .L_2TAG_PACKET_4.0.2
148 cmpl $0, %edx
149 ja .L_2TAG_PACKET_4.0.2
150 jmp .L_2TAG_PACKET_6.0.2
151.L_2TAG_PACKET_3.0.2:
152 xorpd %xmm1, %xmm1
153 addsd %xmm0, %xmm1
154 movd %xmm1, %edx
155 psrlq $32, %xmm1
156 movd %xmm1, %ecx
157 orl %ecx, %edx
158 cmpl $0, %edx
159 je .L_2TAG_PACKET_7.0.2
160 xorpd %xmm1, %xmm1
161 movl $18416, %eax
162 pinsrw $3, %eax, %xmm1
163 mulsd %xmm1, %xmm0
164 movq %xmm0, %xmm1
165 pextrw $3, %xmm0, %eax
166 orpd %xmm2, %xmm0
167 psrlq $27, %xmm0
168 movl $18416, %ecx
169 psrld $2, %xmm0
170 rcpps %xmm0, %xmm0
171 psllq $12, %xmm1
172 pshufd $228, %xmm5, %xmm6
173 psrlq $12, %xmm1
174 jmp .L_2TAG_PACKET_1.0.2
175.L_2TAG_PACKET_2.0.2:
176 movd %xmm1, %edx
177 psrlq $32, %xmm1
178 movd %xmm1, %ecx
179 addl %ecx, %ecx
180 cmpl $-2097152, %ecx
181 jae .L_2TAG_PACKET_5.0.2
182 orl %ecx, %edx
183 cmpl $0, %edx
184 je .L_2TAG_PACKET_7.0.2
185.L_2TAG_PACKET_6.0.2:
186 xorpd %xmm1, %xmm1
187 xorpd %xmm0, %xmm0
188 movl $32752, %eax
189 pinsrw $3, %eax, %xmm1
190 mulsd %xmm1, %xmm0
191 movl $3, 16(%rsp)
192 jmp .L_2TAG_PACKET_8.0.2
193.L_2TAG_PACKET_7.0.2:
194 xorpd %xmm1, %xmm1
195 xorpd %xmm0, %xmm0
196 movl $49136, %eax
197 pinsrw $3, %eax, %xmm0
198 divsd %xmm1, %xmm0
199 movl $2, 16(%rsp)
200.L_2TAG_PACKET_8.0.2:
201 movq %xmm0, 8(%rsp)
202..B1.3:
203 movq 8(%rsp), %xmm0
204.L_2TAG_PACKET_9.0.2:
205..B1.5:
206 addq $24, %rsp
207..___tag_value_log.4:
208 ret
209..___tag_value_log.5:
210END(log)
211# -- End log
212 .section .rodata, "a"
213 .align 16
214 .align 16
215L_tbl:
216 .long 4277811200
217 .long 1072049730
218 .long 2479318832
219 .long 1026487127
220 .long 2854492160
221 .long 1072033410
222 .long 215631550
223 .long 1025638968
224 .long 1547061248
225 .long 1072017216
226 .long 2886781435
227 .long 1026423395
228 .long 649825280
229 .long 1072001146
230 .long 4281533405
231 .long 1024038923
232 .long 646346752
233 .long 1071985198
234 .long 1562735921
235 .long 1023790276
236 .long 2203734016
237 .long 1071969370
238 .long 1838397691
239 .long 3173936209
240 .long 1872169984
241 .long 1071953661
242 .long 3981202460
243 .long 1022325013
244 .long 669557760
245 .long 1071938069
246 .long 4182597802
247 .long 3173174122
248 .long 4076413952
249 .long 1071922591
250 .long 1209029111
251 .long 3170736207
252 .long 556125184
253 .long 1071907228
254 .long 821086028
255 .long 3173437049
256 .long 204914688
257 .long 1071891976
258 .long 2097025986
259 .long 3171071798
260 .long 387545088
261 .long 1071876834
262 .long 3142936996
263 .long 3173092218
264 .long 2912783360
265 .long 1071861800
266 .long 2502420140
267 .long 1024505919
268 .long 1144260608
269 .long 1071846874
270 .long 3315658140
271 .long 3173469843
272 .long 1471209472
273 .long 1071832053
274 .long 129621009
275 .long 3172443877
276 .long 1829683200
277 .long 1071817336
278 .long 3885467693
279 .long 1025535275
280 .long 288676864
281 .long 1071802722
282 .long 86139472
283 .long 3171639793
284 .long 3636378624
285 .long 1071788208
286 .long 1850238587
287 .long 1024654342
288 .long 1606817792
289 .long 1071773795
290 .long 3388899795
291 .long 3173675586
292 .long 1236164608
293 .long 1071759480
294 .long 3983599207
295 .long 1020046558
296 .long 1089616896
297 .long 1071745262
298 .long 4171974224
299 .long 1024773198
300 .long 4143093760
301 .long 1071731139
302 .long 2727587401
303 .long 3173965207
304 .long 600267776
305 .long 1071717112
306 .long 3147685042
307 .long 3173353031
308 .long 2249313280
309 .long 1071703177
310 .long 125835074
311 .long 1025255832
312 .long 3805303808
313 .long 1071689334
314 .long 2289991207
315 .long 1025460331
316 .long 87278592
317 .long 1071675583
318 .long 1106114045
319 .long 1025933602
320 .long 3195405312
321 .long 1071661920
322 .long 3885316576
323 .long 3171206239
324 .long 3853649920
325 .long 1071648346
326 .long 2977069852
327 .long 3171236771
328 .long 2944026624
329 .long 1071625048
330 .long 1008093493
331 .long 1023444474
332 .long 3993180160
333 .long 1071598247
334 .long 1862355595
335 .long 1024642533
336 .long 1454641152
337 .long 1071571617
338 .long 1514603089
339 .long 1026500596
340 .long 3286085632
341 .long 1071545154
342 .long 1400028424
343 .long 3173279056
344 .long 438773760
345 .long 1071518858
346 .long 120727864
347 .long 3172148914
348 .long 1212979200
349 .long 1071492725
350 .long 1625055594
351 .long 3172901933
352 .long 1189017600
353 .long 1071466754
354 .long 3920062376
355 .long 1025727407
356 .long 403064832
357 .long 1071440943
358 .long 1053271728
359 .long 3171391427
360 .long 3343210496
361 .long 1071415289
362 .long 3243395502
363 .long 3173627613
364 .long 1765777408
365 .long 1071389792
366 .long 2145968512
367 .long 1026354304
368 .long 461430784
369 .long 1071364449
370 .long 4094322285
371 .long 1026021467
372 .long 71706624
373 .long 1071339258
374 .long 763632021
375 .long 1024496933
376 .long 1380503552
377 .long 1071314217
378 .long 1383547992
379 .long 3173088453
380 .long 1015732224
381 .long 1071289325
382 .long 3198646877
383 .long 1025390322
384 .long 35977216
385 .long 1071264580
386 .long 2141026805
387 .long 1025754693
388 .long 3927306240
389 .long 1071239979
390 .long 282116272
391 .long 3173394334
392 .long 1125341184
393 .long 1071215523
394 .long 2768427504
395 .long 3172279059
396 .long 1666971648
397 .long 1071191208
398 .long 786837629
399 .long 3172427445
400 .long 2827694080
401 .long 1071167033
402 .long 3857122416
403 .long 3173014241
404 .long 2003683328
405 .long 1071142997
406 .long 859010954
407 .long 1026545007
408 .long 1004017664
409 .long 1071119098
410 .long 3356644970
411 .long 3173458064
412 .long 1753020416
413 .long 1071095334
414 .long 788338552
415 .long 1026157693
416 .long 1992718336
417 .long 1071071704
418 .long 1239179443
419 .long 1026394889
420 .long 3870234624
421 .long 1071048206
422 .long 2082614663
423 .long 1024926053
424 .long 1050437632
425 .long 1071024840
426 .long 660007840
427 .long 1025548499
428 .long 188395520
429 .long 1071001603
430 .long 3878792704
431 .long 3173889571
432 .long 3747176448
433 .long 1070978493
434 .long 144991708
435 .long 3171552042
436 .long 1405669376
437 .long 1070955511
438 .long 3999088879
439 .long 1025486317
440 .long 121151488
441 .long 1070932654
442 .long 2170865497
443 .long 1026473584
444 .long 2652319744
445 .long 1070909920
446 .long 453695652
447 .long 3173916809
448 .long 3262236672
449 .long 1070887309
450 .long 157800053
451 .long 3173984206
452 .long 601221120
453 .long 1070864820
454 .long 3968917661
455 .long 1023992886
456 .long 1999843328
457 .long 1070842450
458 .long 3053895004
459 .long 1024998228
460 .long 1992167424
461 .long 1070820199
462 .long 2968614856
463 .long 1024552653
464 .long 3788726272
465 .long 1070798065
466 .long 3542170808
467 .long 3173573242
468 .long 2094829568
469 .long 1070776048
470 .long 1246758132
471 .long 1026202874
472 .long 288675840
473 .long 1070754146
474 .long 3747328950
475 .long 1026331585
476 .long 1829681152
477 .long 1070732357
478 .long 3125197546
479 .long 1024100318
480 .long 1666869248
481 .long 1070710681
482 .long 1363656119
483 .long 1026336493
484 .long 3417110528
485 .long 1070689116
486 .long 4154791553
487 .long 1026267853
488 .long 2183653376
489 .long 1070667662
490 .long 1671819292
491 .long 3173785870
492 .long 1734434816
493 .long 1070646317
494 .long 373091049
495 .long 1025972363
496 .long 1615681536
497 .long 1070625080
498 .long 384650897
499 .long 1022926043
500 .long 1445382144
501 .long 1070603950
502 .long 344320330
503 .long 3172397196
504 .long 1823715328
505 .long 1070569756
506 .long 3389841200
507 .long 1025231852
508 .long 3839688704
509 .long 1070527917
510 .long 1706790417
511 .long 3167363349
512 .long 4293332992
513 .long 1070486286
514 .long 1614935088
515 .long 1019351591
516 .long 2966720512
517 .long 1070444861
518 .long 4145393717
519 .long 3173711658
520 .long 4066729984
521 .long 1070403639
522 .long 1974925028
523 .long 3171437182
524 .long 3337621504
525 .long 1070362619
526 .long 3314953170
527 .long 3169971314
528 .long 943448064
529 .long 1070321799
530 .long 1498682038
531 .long 3173862340
532 .long 1465634816
533 .long 1070281176
534 .long 1319952810
535 .long 3171693965
536 .long 1015734272
537 .long 1070240749
538 .long 1347821929
539 .long 3173544515
540 .long 118001664
541 .long 1070200516
542 .long 1751482746
543 .long 1026134093
544 .long 3707174912
545 .long 1070160474
546 .long 1486946159
547 .long 1023930920
548 .long 3946381312
549 .long 1070120623
550 .long 2867408081
551 .long 3171368276
552 .long 1699848192
553 .long 1070080961
554 .long 2590187139
555 .long 1025379803
556 .long 2235846656
557 .long 1070041485
558 .long 1888568069
559 .long 3172754960
560 .long 2339729408
561 .long 1070002194
562 .long 3852214753
563 .long 3173323149
564 .long 3196850176
565 .long 1069963086
566 .long 742141560
567 .long 1025101707
568 .long 1800683520
569 .long 1069924160
570 .long 3949500444
571 .long 3172102179
572 .long 3835801600
573 .long 1069885413
574 .long 3848895943
575 .long 1025913832
576 .long 2201202688
577 .long 1069846845
578 .long 1425913464
579 .long 1025868665
580 .long 2778279936
581 .long 1069808453
582 .long 2120889677
583 .long 3173831128
584 .long 2954203136
585 .long 1069770236
586 .long 592147081
587 .long 1019621288
588 .long 210141184
589 .long 1069732193
590 .long 3414275233
591 .long 1023647084
592 .long 709476352
593 .long 1069694321
594 .long 2413027164
595 .long 1024462115
596 .long 2116284416
597 .long 1069656619
598 .long 1144559924
599 .long 1026336654
600 .long 2183651328
601 .long 1069619086
602 .long 3459057650
603 .long 1025634168
604 .long 3047047168
605 .long 1069581720
606 .long 1879674924
607 .long 3173508573
608 .long 970711040
609 .long 1069541521
610 .long 1335954173
611 .long 3173332182
612 .long 2198478848
613 .long 1069467449
614 .long 2951103968
615 .long 3173892200
616 .long 1669611520
617 .long 1069393703
618 .long 531044147
619 .long 1025149248
620 .long 29114368
621 .long 1069320280
622 .long 3327831251
623 .long 1025918673
624 .long 2376949760
625 .long 1069247176
626 .long 737634533
627 .long 3172176000
628 .long 1085390848
629 .long 1069174390
630 .long 3108243400
631 .long 3171828406
632 .long 1566130176
633 .long 1069101918
634 .long 985483226
635 .long 1025708380
636 .long 792780800
637 .long 1069029758
638 .long 4184866295
639 .long 1024426204
640 .long 183156736
641 .long 1068957907
642 .long 2845699378
643 .long 1022107277
644 .long 1301782528
645 .long 1068886362
646 .long 1012735262
647 .long 3173804294
648 .long 1562411008
649 .long 1068815121
650 .long 2197086703
651 .long 3170187813
652 .long 2815549440
653 .long 1068744181
654 .long 2782613207
655 .long 1026345054
656 .long 2756124672
657 .long 1068673540
658 .long 2929486205
659 .long 3173037800
660 .long 3511050240
661 .long 1068603195
662 .long 1443733147
663 .long 3173331549
664 .long 3047047168
665 .long 1068533144
666 .long 1879674924
667 .long 3172459997
668 .long 3221667840
669 .long 1068427825
670 .long 1338588027
671 .long 3171815742
672 .long 3453861888
673 .long 1068288883
674 .long 1205348359
675 .long 3172624626
676 .long 3506110464
677 .long 1068150514
678 .long 893105198
679 .long 1025571866
680 .long 346013696
681 .long 1068012714
682 .long 3495569021
683 .long 3172563349
684 .long 4074029056
685 .long 1067875476
686 .long 3961106338
687 .long 3171065595
688 .long 3559784448
689 .long 1067738798
690 .long 1975385384
691 .long 3173783155
692 .long 797769728
693 .long 1067602675
694 .long 3760305787
695 .long 1026047642
696 .long 2313633792
697 .long 1067467101
698 .long 1559353171
699 .long 1023480256
700 .long 3960766464
701 .long 1067213778
702 .long 1067365107
703 .long 1025865926
704 .long 684261376
705 .long 1066944805
706 .long 844762164
707 .long 3173687482
708 .long 630718464
709 .long 1066676905
710 .long 2458269694
711 .long 1024033081
712 .long 1486061568
713 .long 1066410070
714 .long 115537874
715 .long 3173243995
716 .long 2743664640
717 .long 1065886792
718 .long 3665098304
719 .long 3173471607
720 .long 1971912704
721 .long 1065357333
722 .long 2577214440
723 .long 3171993451
724 .long 1498939392
725 .long 1064306693
726 .long 3409036923
727 .long 1025599151
728 .long 0
729 .long 0
730 .long 0
731 .long 2147483648
732 .type L_tbl,@object
733 .size L_tbl,2064
734 .align 16
735log2:
736 .long 4277811200
737 .long 1067855426
738 .long 2479318832
739 .long 1022292823
740 .type log2,@object
741 .size log2,16
742 .align 16
743coeff:
744 .long 2454267026
745 .long 1069697316
746 .long 0
747 .long 3218079744
748 .long 1030730101
749 .long 3217380702
750 .long 1431655765
751 .long 1070945621
752 .long 2576980378
753 .long 1070176665
754 .long 0
755 .long 3219128320
756 .type coeff,@object
757 .size coeff,48
758 .data
759 .section .note.GNU-stack, ""
760// -- Begin DWARF2 SEGMENT .eh_frame
761 .section .eh_frame,"a",@progbits
762.eh_frame_seg:
763 .align 1
764 .4byte 0x00000014
765 .8byte 0x00527a0100000000
766 .8byte 0x08070c1b01107801
767 .4byte 0x00000190
768 .4byte 0x0000001c
769 .4byte 0x0000001c
770 .4byte ..___tag_value_log.1-.
771 .4byte ..___tag_value_log.5-..___tag_value_log.1
772 .2byte 0x0400
773 .4byte ..___tag_value_log.3-..___tag_value_log.1
774 .2byte 0x200e
775 .byte 0x04
776 .4byte ..___tag_value_log.4-..___tag_value_log.3
777 .2byte 0x080e
778 .byte 0x00
779# End