| // Copyright 2017 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| #include "textflag.h" | |
| // Minimax polynomial approximations | |
| DATA ·logrodataL21<> + 0(SB)/8, $-.499999999999999778E+00 | |
| DATA ·logrodataL21<> + 8(SB)/8, $0.333333333333343751E+00 | |
| DATA ·logrodataL21<> + 16(SB)/8, $-.250000000001606881E+00 | |
| DATA ·logrodataL21<> + 24(SB)/8, $0.199999999971603032E+00 | |
| DATA ·logrodataL21<> + 32(SB)/8, $-.166666663114122038E+00 | |
| DATA ·logrodataL21<> + 40(SB)/8, $-.125002923782692399E+00 | |
| DATA ·logrodataL21<> + 48(SB)/8, $0.111142014580396256E+00 | |
| DATA ·logrodataL21<> + 56(SB)/8, $0.759438932618934220E-01 | |
| DATA ·logrodataL21<> + 64(SB)/8, $0.142857144267212549E+00 | |
| DATA ·logrodataL21<> + 72(SB)/8, $-.993038938793590759E-01 | |
| DATA ·logrodataL21<> + 80(SB)/8, $-1.0 | |
| GLOBL ·logrodataL21<> + 0(SB), RODATA, $88 | |
| // Constants | |
| DATA ·logxminf<> + 0(SB)/8, $0xfff0000000000000 | |
| GLOBL ·logxminf<> + 0(SB), RODATA, $8 | |
| DATA ·logxnan<> + 0(SB)/8, $0x7ff8000000000000 | |
| GLOBL ·logxnan<> + 0(SB), RODATA, $8 | |
| DATA ·logx43f<> + 0(SB)/8, $0x43f0000000000000 | |
| GLOBL ·logx43f<> + 0(SB), RODATA, $8 | |
| DATA ·logxl2<> + 0(SB)/8, $0x3fda7aecbeba4e46 | |
| GLOBL ·logxl2<> + 0(SB), RODATA, $8 | |
| DATA ·logxl1<> + 0(SB)/8, $0x3ffacde700000000 | |
| GLOBL ·logxl1<> + 0(SB), RODATA, $8 | |
| /* Input transform scale and add constants */ | |
| DATA ·logxm<> + 0(SB)/8, $0x3fc77604e63c84b1 | |
| DATA ·logxm<> + 8(SB)/8, $0x40fb39456ab53250 | |
| DATA ·logxm<> + 16(SB)/8, $0x3fc9ee358b945f3f | |
| DATA ·logxm<> + 24(SB)/8, $0x40fb39418bf3b137 | |
| DATA ·logxm<> + 32(SB)/8, $0x3fccfb2e1304f4b6 | |
| DATA ·logxm<> + 40(SB)/8, $0x40fb393d3eda3022 | |
| DATA ·logxm<> + 48(SB)/8, $0x3fd0000000000000 | |
| DATA ·logxm<> + 56(SB)/8, $0x40fb393969e70000 | |
| DATA ·logxm<> + 64(SB)/8, $0x3fd11117aafbfe04 | |
| DATA ·logxm<> + 72(SB)/8, $0x40fb3936eaefafcf | |
| DATA ·logxm<> + 80(SB)/8, $0x3fd2492af5e658b2 | |
| DATA ·logxm<> + 88(SB)/8, $0x40fb39343ff01715 | |
| DATA ·logxm<> + 96(SB)/8, $0x3fd3b50c622a43dd | |
| DATA ·logxm<> + 104(SB)/8, $0x40fb39315adae2f3 | |
| DATA ·logxm<> + 112(SB)/8, $0x3fd56bbeea918777 | |
| DATA ·logxm<> + 120(SB)/8, $0x40fb392e21698552 | |
| GLOBL ·logxm<> + 0(SB), RODATA, $128 | |
| // Log returns the natural logarithm of the argument. | |
| // | |
| // Special cases are: | |
| // Log(+Inf) = +Inf | |
| // Log(0) = -Inf | |
| // Log(x < 0) = NaN | |
| // Log(NaN) = NaN | |
| // The algorithm used is minimax polynomial approximation using a table of | |
| // polynomial coefficients determined with a Remez exchange algorithm. | |
| TEXT ·logAsm(SB), NOSPLIT, $0-16 | |
| FMOVD x+0(FP), F0 | |
| MOVD $·logrodataL21<>+0(SB), R9 | |
| MOVH $0x8006, R4 | |
| WORD $0xB3CD0010 //lgdr %r1,%f0 | |
| MOVD $0x3FF0000000000000, R6 | |
| SRAD $48, R1, R1 | |
| MOVD $0x40F03E8000000000, R8 | |
| SUBW R1, R4 | |
| WORD $0xEC2420BB //risbg %r2,%r4,32,128+59,0 | |
| BYTE $0x00 | |
| BYTE $0x55 | |
| WORD $0xEC62000F //risbgn %r6,%r2,64-64+0,64-64+0+16-1,64-0-16 | |
| BYTE $0x30 | |
| BYTE $0x59 | |
| WORD $0xEC82101F //risbgn %r8,%r2,64-64+16,64-64+16+16-1,64-16-16 | |
| BYTE $0x20 | |
| BYTE $0x59 | |
| MOVW R1, R7 | |
| CMPBGT R7, $22, L17 | |
| LTDBR F0, F0 | |
| MOVD $·logx43f<>+0(SB), R1 | |
| FMOVD 0(R1), F2 | |
| BLEU L3 | |
| MOVH $0x8005, R12 | |
| MOVH $0x8405, R0 | |
| BR L15 | |
| L7: | |
| LTDBR F0, F0 | |
| BLEU L3 | |
| L15: | |
| FMUL F2, F0 | |
| WORD $0xB3CD0010 //lgdr %r1,%f0 | |
| SRAD $48, R1, R1 | |
| SUBW R1, R0, R2 | |
| SUBW R1, R12, R3 | |
| BYTE $0x18 //lr %r4,%r2 | |
| BYTE $0x42 | |
| ANDW $0xFFFFFFF0, R3 | |
| ANDW $0xFFFFFFF0, R2 | |
| BYTE $0x18 //lr %r5,%r1 | |
| BYTE $0x51 | |
| MOVW R1, R7 | |
| CMPBLE R7, $22, L7 | |
| WORD $0xEC63000F //risbgn %r6,%r3,64-64+0,64-64+0+16-1,64-0-16 | |
| BYTE $0x30 | |
| BYTE $0x59 | |
| WORD $0xEC82101F //risbgn %r8,%r2,64-64+16,64-64+16+16-1,64-16-16 | |
| BYTE $0x20 | |
| BYTE $0x59 | |
| L2: | |
| MOVH R5, R5 | |
| MOVH $0x7FEF, R1 | |
| CMPW R5, R1 | |
| BGT L1 | |
| WORD $0xB3C10026 //ldgr %f2,%r6 | |
| FMUL F2, F0 | |
| WORD $0xEC4439BB //risbg %r4,%r4,57,128+59,3 | |
| BYTE $0x03 | |
| BYTE $0x55 | |
| FMOVD 80(R9), F2 | |
| MOVD $·logxm<>+0(SB), R7 | |
| ADD R7, R4 | |
| FMOVD 72(R9), F4 | |
| WORD $0xED004000 //madb %f2,%f0,0(%r4) | |
| BYTE $0x20 | |
| BYTE $0x1E | |
| FMOVD 64(R9), F1 | |
| FMOVD F2, F0 | |
| FMOVD 56(R9), F2 | |
| WFMADB V0, V2, V4, V2 | |
| WFMDB V0, V0, V6 | |
| FMOVD 48(R9), F4 | |
| WFMADB V0, V2, V4, V2 | |
| FMOVD 40(R9), F4 | |
| WFMADB V2, V6, V1, V2 | |
| FMOVD 32(R9), F1 | |
| WFMADB V6, V4, V1, V4 | |
| FMOVD 24(R9), F1 | |
| WFMADB V6, V2, V1, V2 | |
| FMOVD 16(R9), F1 | |
| WFMADB V6, V4, V1, V4 | |
| MOVD $·logxl1<>+0(SB), R1 | |
| FMOVD 8(R9), F1 | |
| WFMADB V6, V2, V1, V2 | |
| FMOVD 0(R9), F1 | |
| WFMADB V6, V4, V1, V4 | |
| FMOVD 8(R4), F1 | |
| WFMADB V0, V2, V4, V2 | |
| WORD $0xB3C10048 //ldgr %f4,%r8 | |
| WFMADB V6, V2, V0, V2 | |
| WORD $0xED401000 //msdb %f1,%f4,0(%r1) | |
| BYTE $0x10 | |
| BYTE $0x1F | |
| MOVD ·logxl2<>+0(SB), R1 | |
| WORD $0xB3130001 //lcdbr %f0,%f1 | |
| WORD $0xB3C10041 //ldgr %f4,%r1 | |
| WFMADB V0, V4, V2, V0 | |
| L1: | |
| FMOVD F0, ret+8(FP) | |
| RET | |
| L3: | |
| LTDBR F0, F0 | |
| BEQ L20 | |
| BGE L1 | |
| BVS L1 | |
| MOVD $·logxnan<>+0(SB), R1 | |
| FMOVD 0(R1), F0 | |
| BR L1 | |
| L20: | |
| MOVD $·logxminf<>+0(SB), R1 | |
| FMOVD 0(R1), F0 | |
| FMOVD F0, ret+8(FP) | |
| RET | |
| L17: | |
| BYTE $0x18 //lr %r5,%r1 | |
| BYTE $0x51 | |
| BR L2 |