|  | // 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 | 
|  | LGDR	F0, R1 | 
|  | MOVD	$0x3FF0000000000000, R6 | 
|  | SRAD	$48, R1, R1 | 
|  | MOVD	$0x40F03E8000000000, R8 | 
|  | SUBW	R1, R4 | 
|  | RISBGZ	$32, $59, $0, R4, R2 | 
|  | RISBGN	$0, $15, $48, R2, R6 | 
|  | RISBGN	$16, $31, $32, R2, R8 | 
|  | 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 | 
|  | LGDR	F0, R1 | 
|  | 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 | 
|  | RISBGN	$0, $15, $48, R3, R6 | 
|  | RISBGN	$16, $31, $32, R2, R8 | 
|  | L2: | 
|  | MOVH	R5, R5 | 
|  | MOVH	$0x7FEF, R1 | 
|  | CMPW	R5, R1 | 
|  | BGT	L1 | 
|  | LDGR	R6, F2 | 
|  | FMUL	F2, F0 | 
|  | RISBGZ	$57, $59, $3, R4, R4 | 
|  | 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 | 
|  | LDGR	R8, F4 | 
|  | 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 | 
|  | LDGR	R1, F4 | 
|  | 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 |