1/* 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// Let 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*LH*2^7+0.5))/2^7 39// LH is a short approximation for log10(e) 40// 41// Reduced argument: r=B*mx-LH (computed accurately in high and low parts) 42// 43// Result: k*log10(2) - log(B) + p(r) 44// p(r) is a degree 7 polynomial 45// -log(B) read from data table (high, low parts) 46// Result is formed from high and low parts 47// 48// Special cases: 49// log10(0) = -INF with divide-by-zero exception raised 50// log10(1) = +0 51// log10(x) = NaN with invalid exception raised if x < -0, including -INF 52// log10(+INF) = +INF 53// 54/******************************************************************************/ 55 56#include <private/bionic_asm.h> 57# -- Begin log10 58ENTRY(log10) 59# parameter 1: %xmm0 60..B1.1: 61..___tag_value_log10.1: 62 subq $24, %rsp 63..___tag_value_log10.3: 64 movsd %xmm0, (%rsp) 65..B1.2: 66 xorpd %xmm2, %xmm2 67 movl $16368, %eax 68 pinsrw $3, %eax, %xmm2 69 movl $1054736384, %ecx 70 movd %ecx, %xmm7 71 xorpd %xmm3, %xmm3 72 movl $30704, %edx 73 pinsrw $3, %edx, %xmm3 74 movq %xmm0, %xmm1 75 movl $32768, %edx 76 movd %edx, %xmm4 77 movapd HIGHSIGMASK(%rip), %xmm5 78 pextrw $3, %xmm0, %eax 79 orpd %xmm2, %xmm0 80 movl $16352, %ecx 81 psrlq $27, %xmm0 82 movq LOG10_E(%rip), %xmm2 83 psrld $2, %xmm0 84 rcpps %xmm0, %xmm0 85 psllq $12, %xmm1 86 pshufd $78, %xmm5, %xmm6 87 psrlq $12, %xmm1 88 subl $16, %eax 89 cmpl $32736, %eax 90 jae .L_2TAG_PACKET_0.0.2 91.L_2TAG_PACKET_1.0.2: 92 mulss %xmm7, %xmm0 93 orpd %xmm3, %xmm1 94 lea L_tbl(%rip), %r11 95 andpd %xmm1, %xmm5 96 paddd %xmm4, %xmm0 97 subsd %xmm5, %xmm1 98 movd %xmm0, %edx 99 psllq $29, %xmm0 100 andpd %xmm6, %xmm0 101 andl $32752, %eax 102 subl %ecx, %eax 103 cvtsi2sd %eax, %xmm7 104 mulpd %xmm0, %xmm5 105 mulsd %xmm0, %xmm1 106 movq log2(%rip), %xmm6 107 movapd coeff(%rip), %xmm3 108 subsd %xmm2, %xmm5 109 andl $16711680, %edx 110 shrl $12, %edx 111 movapd -1504(%r11,%rdx), %xmm0 112 movapd 16+coeff(%rip), %xmm4 113 addsd %xmm5, %xmm1 114 movapd 32+coeff(%rip), %xmm2 115 mulsd %xmm7, %xmm6 116 pshufd $68, %xmm1, %xmm5 117 mulsd 8+log2(%rip), %xmm7 118 mulsd %xmm1, %xmm3 119 addsd %xmm6, %xmm0 120 mulpd %xmm5, %xmm4 121 movq 8+LOG10_E(%rip), %xmm6 122 mulpd %xmm5, %xmm5 123 addpd %xmm2, %xmm4 124 mulpd %xmm5, %xmm3 125 pshufd $228, %xmm0, %xmm2 126 addsd %xmm1, %xmm0 127 mulsd %xmm1, %xmm4 128 subsd %xmm0, %xmm2 129 mulsd %xmm1, %xmm6 130 addsd %xmm2, %xmm1 131 pshufd $238, %xmm0, %xmm2 132 mulsd %xmm5, %xmm5 133 addsd %xmm2, %xmm7 134 addsd %xmm6, %xmm1 135 addpd %xmm3, %xmm4 136 addsd %xmm7, %xmm1 137 mulpd %xmm5, %xmm4 138 addsd %xmm4, %xmm1 139 pshufd $238, %xmm4, %xmm5 140 addsd %xmm5, %xmm1 141 addsd %xmm1, %xmm0 142 jmp ..B1.5 143.L_2TAG_PACKET_0.0.2: 144 movq (%rsp), %xmm0 145 movq (%rsp), %xmm1 146 addl $16, %eax 147 cmpl $32768, %eax 148 jae .L_2TAG_PACKET_2.0.2 149 cmpl $16, %eax 150 jb .L_2TAG_PACKET_3.0.2 151.L_2TAG_PACKET_4.0.2: 152 addsd %xmm0, %xmm0 153 jmp ..B1.5 154.L_2TAG_PACKET_5.0.2: 155 ja .L_2TAG_PACKET_4.0.2 156 cmpl $0, %edx 157 ja .L_2TAG_PACKET_4.0.2 158 jmp .L_2TAG_PACKET_6.0.2 159.L_2TAG_PACKET_3.0.2: 160 xorpd %xmm1, %xmm1 161 addsd %xmm0, %xmm1 162 movd %xmm1, %edx 163 psrlq $32, %xmm1 164 movd %xmm1, %ecx 165 orl %ecx, %edx 166 cmpl $0, %edx 167 je .L_2TAG_PACKET_7.0.2 168 xorpd %xmm1, %xmm1 169 movl $18416, %eax 170 pinsrw $3, %eax, %xmm1 171 mulsd %xmm1, %xmm0 172 xorpd %xmm2, %xmm2 173 movl $16368, %eax 174 pinsrw $3, %eax, %xmm2 175 movq %xmm0, %xmm1 176 pextrw $3, %xmm0, %eax 177 orpd %xmm2, %xmm0 178 movl $18416, %ecx 179 psrlq $27, %xmm0 180 movq LOG10_E(%rip), %xmm2 181 psrld $2, %xmm0 182 rcpps %xmm0, %xmm0 183 psllq $12, %xmm1 184 pshufd $78, %xmm5, %xmm6 185 psrlq $12, %xmm1 186 jmp .L_2TAG_PACKET_1.0.2 187.L_2TAG_PACKET_2.0.2: 188 movd %xmm1, %edx 189 psrlq $32, %xmm1 190 movd %xmm1, %ecx 191 addl %ecx, %ecx 192 cmpl $-2097152, %ecx 193 jae .L_2TAG_PACKET_5.0.2 194 orl %ecx, %edx 195 cmpl $0, %edx 196 je .L_2TAG_PACKET_7.0.2 197.L_2TAG_PACKET_6.0.2: 198 xorpd %xmm1, %xmm1 199 xorpd %xmm0, %xmm0 200 movl $32752, %eax 201 pinsrw $3, %eax, %xmm1 202 mulsd %xmm1, %xmm0 203 movl $9, 16(%rsp) 204 jmp .L_2TAG_PACKET_8.0.2 205.L_2TAG_PACKET_7.0.2: 206 xorpd %xmm1, %xmm1 207 xorpd %xmm0, %xmm0 208 movl $49136, %eax 209 pinsrw $3, %eax, %xmm0 210 divsd %xmm1, %xmm0 211 movl $8, 16(%rsp) 212.L_2TAG_PACKET_8.0.2: 213 movq %xmm0, 8(%rsp) 214..B1.3: 215 movq 8(%rsp), %xmm0 216.L_2TAG_PACKET_9.0.2: 217..B1.5: 218 addq $24, %rsp 219..___tag_value_log10.4: 220 ret 221..___tag_value_log10.5: 222END(log10) 223# -- End log10 224 .section .rodata, "a" 225 .align 16 226 .align 16 227HIGHSIGMASK: 228 .long 4160749568 229 .long 4294967295 230 .long 0 231 .long 4294959104 232 .type HIGHSIGMASK,@object 233 .size HIGHSIGMASK,16 234 .align 16 235LOG10_E: 236 .long 0 237 .long 1071366144 238 .long 3207479560 239 .long 1062894188 240 .type LOG10_E,@object 241 .size LOG10_E,16 242 .align 16 243L_tbl: 244 .long 1352628224 245 .long 1070810131 246 .long 521319256 247 .long 1025503025 248 .long 2150839296 249 .long 1070801944 250 .long 3329350096 251 .long 3170190015 252 .long 1360613376 253 .long 1070793794 254 .long 2024059075 255 .long 1024991594 256 .long 1875350528 257 .long 1070785680 258 .long 2163882141 259 .long 3163564137 260 .long 2312126464 261 .long 1070777602 262 .long 1975711076 263 .long 1023674196 264 .long 1306336256 265 .long 1070769560 266 .long 3524899523 267 .long 3170508164 268 .long 1806334976 269 .long 1070761553 270 .long 4254777025 271 .long 1025238739 272 .long 2483193856 273 .long 1070753581 274 .long 3800671317 275 .long 3172916830 276 .long 2025350144 277 .long 1070745644 278 .long 1731514745 279 .long 1025501083 280 .long 3433285632 281 .long 1070737741 282 .long 2551857336 283 .long 3169662186 284 .long 1134317568 285 .long 1070729873 286 .long 3426297655 287 .long 3172637891 288 .long 2457152512 289 .long 1070722038 290 .long 63549415 291 .long 1025415416 292 .long 1861803008 293 .long 1070714237 294 .long 1910171636 295 .long 1023977580 296 .long 2414140416 297 .long 1070706469 298 .long 4002514337 299 .long 3170841618 300 .long 2900726784 301 .long 1070698734 302 .long 3268064083 303 .long 1022459609 304 .long 2123517952 305 .long 1070691032 306 .long 1767031218 307 .long 1022448156 308 .long 3194569728 309 .long 1070683362 310 .long 3402332618 311 .long 3171671160 312 .long 650882048 313 .long 1070675725 314 .long 4146023905 315 .long 3171023038 316 .long 1928988672 317 .long 1070668119 318 .long 1438617867 319 .long 1016360491 320 .long 1594908672 321 .long 1070660545 322 .long 971389377 323 .long 1024763979 324 .long 2818746368 325 .long 1070653002 326 .long 3555925341 327 .long 3172434821 328 .long 194584576 329 .long 1070645491 330 .long 943919215 331 .long 3172950063 332 .long 1215096832 333 .long 1070638010 334 .long 2283358588 335 .long 1022335098 336 .long 501519360 337 .long 1070630560 338 .long 480904295 339 .long 1024437959 340 .long 1278266368 341 .long 1070623140 342 .long 2755806066 343 .long 3172342012 344 .long 2487812096 345 .long 1070615750 346 .long 2489653202 347 .long 3172481099 348 .long 3085451264 349 .long 1070608390 350 .long 3759184951 351 .long 3172574892 352 .long 2039090176 353 .long 1070601060 354 .long 1361176676 355 .long 3172355319 356 .long 953057280 357 .long 1070591423 358 .long 1176587546 359 .long 3166422018 360 .long 3370524672 361 .long 1070576879 362 .long 3669570051 363 .long 1025376630 364 .long 749742080 365 .long 1070562394 366 .long 707700964 367 .long 3170814058 368 .long 4008353792 369 .long 1070547965 370 .long 3247327652 371 .long 1022431400 372 .long 2612455424 373 .long 1070533594 374 .long 2453457344 375 .long 3172322969 376 .long 3230920704 377 .long 1070519279 378 .long 1296781801 379 .long 1025115335 380 .long 3965253632 381 .long 1070505020 382 .long 373075289 383 .long 1017938528 384 .long 2593157120 385 .long 1070476669 386 .long 1068054086 387 .long 1021616576 388 .long 925962240 389 .long 1070448537 390 .long 850121213 391 .long 1023928989 392 .long 1732556800 393 .long 1070420620 394 .long 1305206740 395 .long 3172665570 396 .long 3815630848 397 .long 1070392915 398 .long 192642943 399 .long 3172699907 400 .long 2001758208 401 .long 1070365420 402 .long 2820786683 403 .long 1024704867 404 .long 16746496 405 .long 1070338131 406 .long 1399573110 407 .long 3171372773 408 .long 1886492672 409 .long 1070311044 410 .long 3621428075 411 .long 3172974358 412 .long 3338196992 413 .long 1070284157 414 .long 3793882035 415 .long 1025124701 416 .long 381769728 417 .long 1070257468 418 .long 3877933342 419 .long 3170195490 420 .long 2186491904 421 .long 1070230972 422 .long 1838687089 423 .long 1017927292 424 .long 1008330752 425 .long 1070204668 426 .long 2228321664 427 .long 1025352196 428 .long 2247065600 429 .long 1070178552 430 .long 1413900906 431 .long 3170902532 432 .long 2964070400 433 .long 1070152622 434 .long 3590454629 435 .long 1025016844 436 .long 465154048 437 .long 1070126876 438 .long 2079688550 439 .long 3172268183 440 .long 883615744 441 .long 1070101310 442 .long 989244452 443 .long 3171900485 444 .long 1993768960 445 .long 1070075922 446 .long 1124327841 447 .long 3172964992 448 .long 1794471936 449 .long 1070050710 450 .long 1140575046 451 .long 1022673726 452 .long 2797932544 453 .long 1070025671 454 .long 1894836933 455 .long 3172544059 456 .long 3433797632 457 .long 1070000803 458 .long 3221831166 459 .long 3171921685 460 .long 2338371584 461 .long 1069976104 462 .long 3732461053 463 .long 3164513518 464 .long 2644013056 465 .long 1069951571 466 .long 2519460462 467 .long 3172548740 468 .long 3383814144 469 .long 1069927202 470 .long 2290997657 471 .long 1025499649 472 .long 3781380096 473 .long 1069902995 474 .long 380479405 475 .long 1025184136 476 .long 3245785088 477 .long 1069878948 478 .long 1096398261 479 .long 3169885192 480 .long 1366712320 481 .long 1069855059 482 .long 2218343715 483 .long 3170281628 484 .long 2204717056 485 .long 1069831325 486 .long 2668334011 487 .long 1025264524 488 .long 1401772032 489 .long 1069807745 490 .long 4103993159 491 .long 1022925721 492 .long 3356721152 493 .long 1069784316 494 .long 3573790772 495 .long 3172186527 496 .long 4041148416 497 .long 1069761037 498 .long 4027691910 499 .long 3171276990 500 .long 3880151040 501 .long 1069737906 502 .long 4087118786 503 .long 3172710734 504 .long 3453364224 505 .long 1069714921 506 .long 99014299 507 .long 3172003077 508 .long 3491092480 509 .long 1069692080 510 .long 3801836701 511 .long 3172989287 512 .long 575580160 513 .long 1069669382 514 .long 1920406012 515 .long 3170874125 516 .long 22282240 517 .long 1069646824 518 .long 964193370 519 .long 1019363159 520 .long 2991429632 521 .long 1069624404 522 .long 3372589890 523 .long 1023425053 524 .long 2189645824 525 .long 1069602122 526 .long 2610503872 527 .long 1023652442 528 .long 3341467648 529 .long 1069579975 530 .long 1190292004 531 .long 1022425665 532 .long 3711293440 533 .long 1069557962 534 .long 1104795356 535 .long 1023625829 536 .long 1380401152 537 .long 1069524644 538 .long 1156998217 539 .long 1025100499 540 .long 765710336 541 .long 1069481144 542 .long 1736649113 543 .long 1024999439 544 .long 849412096 545 .long 1069437902 546 .long 2618178330 547 .long 3170853629 548 .long 1433104384 549 .long 1069394915 550 .long 43477267 551 .long 3170378811 552 .long 2548596736 553 .long 1069352180 554 .long 3967367063 555 .long 1025246584 556 .long 157577216 557 .long 1069309695 558 .long 100402533 559 .long 3172825502 560 .long 3326238720 561 .long 1069267455 562 .long 1176892909 563 .long 1025464099 564 .long 4155494400 565 .long 1069225459 566 .long 3713707617 567 .long 3172630046 568 .long 3545804800 569 .long 1069183704 570 .long 857007315 571 .long 1024965777 572 .long 2602520576 573 .long 1069142187 574 .long 2588758347 575 .long 1022463131 576 .long 2631196672 577 .long 1069100905 578 .long 2118424235 579 .long 1022490989 580 .long 838135808 581 .long 1069059856 582 .long 4117002727 583 .long 1024874520 584 .long 3210903552 585 .long 1069019036 586 .long 650070125 587 .long 3172012966 588 .long 3039211520 589 .long 1068978444 590 .long 438055812 591 .long 1017743757 592 .long 2385633280 593 .long 1068938077 594 .long 3011990369 595 .long 3171312044 596 .long 3491618816 597 .long 1068897932 598 .long 712813818 599 .long 3172720400 600 .long 183644160 601 .long 1068858008 602 .long 4287006742 603 .long 1022379728 604 .long 3639214080 605 .long 1068818300 606 .long 353762279 607 .long 3172980009 608 .long 3728416768 609 .long 1068778808 610 .long 1851367730 611 .long 1025486574 612 .long 3370094592 613 .long 1068739529 614 .long 4046594913 615 .long 3172567047 616 .long 1348407296 617 .long 1068700461 618 .long 143189675 619 .long 1025397632 620 .long 899403776 621 .long 1068661601 622 .long 3753687842 623 .long 3170772772 624 .long 1117708288 625 .long 1068622947 626 .long 1857340812 627 .long 3170782678 628 .long 1248276480 629 .long 1068584497 630 .long 1289858203 631 .long 1025222289 632 .long 683237376 633 .long 1068546249 634 .long 2356679608 635 .long 3171629170 636 .long 3253764096 637 .long 1068508200 638 .long 3267136556 639 .long 1018554987 640 .long 94478336 641 .long 1068441756 642 .long 1927868814 643 .long 3169378180 644 .long 3233144832 645 .long 1068366445 646 .long 2682188854 647 .long 1023964004 648 .long 2940297216 649 .long 1068291522 650 .long 275301289 651 .long 1023944679 652 .long 3677708288 653 .long 1068216982 654 .long 302658771 655 .long 1024465567 656 .long 1576968192 657 .long 1068142822 658 .long 3672035940 659 .long 3172254610 660 .long 1614069760 661 .long 1068069037 662 .long 480052905 663 .long 3172692062 664 .long 424435712 665 .long 1067995624 666 .long 2207869657 667 .long 3170965436 668 .long 3477782528 669 .long 1067922578 670 .long 2980661858 671 .long 3164990018 672 .long 3598401536 673 .long 1067849897 674 .long 1974393034 675 .long 3171357083 676 .long 2435235840 677 .long 1067777577 678 .long 1385289011 679 .long 1024615823 680 .long 1867333632 681 .long 1067705614 682 .long 3442236633 683 .long 1025334384 684 .long 3999301632 685 .long 1067634004 686 .long 3506472073 687 .long 1025132546 688 .long 2566971392 689 .long 1067562745 690 .long 1425757592 691 .long 3172358463 692 .long 112943104 693 .long 1067491833 694 .long 1693407156 695 .long 3172426603 696 .long 3079929856 697 .long 1067392159 698 .long 3999942455 699 .long 1018549369 700 .long 2443837440 701 .long 1067251701 702 .long 974534460 703 .long 1023963412 704 .long 359366656 705 .long 1067111917 706 .long 2204915018 707 .long 1013514416 708 .long 3564519424 709 .long 1066972799 710 .long 3977441659 711 .long 3170879860 712 .long 2011086848 713 .long 1066834343 714 .long 590145514 715 .long 1025390011 716 .long 3216982016 717 .long 1066696541 718 .long 3629120110 719 .long 1024330313 720 .long 2194128896 721 .long 1066559388 722 .long 2367098512 723 .long 3172260338 724 .long 2916220928 725 .long 1066422877 726 .long 2262431886 727 .long 1021229446 728 .long 2263941120 729 .long 1066172214 730 .long 3118507287 731 .long 1021484970 732 .long 3076292608 733 .long 1065901726 734 .long 1411737803 735 .long 3172957147 736 .long 1186136064 737 .long 1065632488 738 .long 3109349337 739 .long 1025397383 740 .long 3085303808 741 .long 1065364487 742 .long 584715031 743 .long 3172596519 744 .long 1821048832 745 .long 1064842211 746 .long 2182246895 747 .long 3172536214 748 .long 697368576 749 .long 1064311094 750 .long 3157561765 751 .long 3172716357 752 .long 894042112 753 .long 1063260131 754 .long 3237958154 755 .long 3172587292 756 .long 0 757 .long 0 758 .long 0 759 .long 0 760 .type L_tbl,@object 761 .size L_tbl,2064 762 .align 16 763log2: 764 .long 1352628224 765 .long 1066615827 766 .long 521319256 767 .long 1021308721 768 .type log2,@object 769 .size log2,16 770 .align 16 771coeff: 772 .long 3248877870 773 .long 1077250164 774 .long 1691676429 775 .long 3221787401 776 .long 945132465 777 .long 3223701783 778 .long 3700831335 779 .long 1073506818 780 .long 2141010593 781 .long 1075227551 782 .long 3698831637 783 .long 3220339442 784 .type coeff,@object 785 .size coeff,48 786 .data 787 .section .note.GNU-stack, "" 788// -- Begin DWARF2 SEGMENT .eh_frame 789 .section .eh_frame,"a",@progbits 790.eh_frame_seg: 791 .align 1 792 .4byte 0x00000014 793 .8byte 0x00527a0100000000 794 .8byte 0x08070c1b01107801 795 .4byte 0x00000190 796 .4byte 0x0000001c 797 .4byte 0x0000001c 798 .4byte ..___tag_value_log10.1-. 799 .4byte ..___tag_value_log10.5-..___tag_value_log10.1 800 .2byte 0x0400 801 .4byte ..___tag_value_log10.3-..___tag_value_log10.1 802 .2byte 0x200e 803 .byte 0x04 804 .4byte ..___tag_value_log10.4-..___tag_value_log10.3 805 .2byte 0x080e 806 .byte 0x00 807# End 808