1// Copyright 2017 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5#include "textflag.h"
6
7// Minimax polynomial approximations
8DATA ·logrodataL21<> + 0(SB)/8, $-.499999999999999778E+00
9DATA ·logrodataL21<> + 8(SB)/8, $0.333333333333343751E+00
10DATA ·logrodataL21<> + 16(SB)/8, $-.250000000001606881E+00
11DATA ·logrodataL21<> + 24(SB)/8, $0.199999999971603032E+00
12DATA ·logrodataL21<> + 32(SB)/8, $-.166666663114122038E+00
13DATA ·logrodataL21<> + 40(SB)/8, $-.125002923782692399E+00
14DATA ·logrodataL21<> + 48(SB)/8, $0.111142014580396256E+00
15DATA ·logrodataL21<> + 56(SB)/8, $0.759438932618934220E-01
16DATA ·logrodataL21<> + 64(SB)/8, $0.142857144267212549E+00
17DATA ·logrodataL21<> + 72(SB)/8, $-.993038938793590759E-01
18DATA ·logrodataL21<> + 80(SB)/8, $-1.0
19GLOBL ·logrodataL21<> + 0(SB), RODATA, $88
20
21// Constants
22DATA ·logxminf<> + 0(SB)/8, $0xfff0000000000000
23GLOBL ·logxminf<> + 0(SB), RODATA, $8
24DATA ·logxnan<> + 0(SB)/8, $0x7ff8000000000000
25GLOBL ·logxnan<> + 0(SB), RODATA, $8
26DATA ·logx43f<> + 0(SB)/8, $0x43f0000000000000
27GLOBL ·logx43f<> + 0(SB), RODATA, $8
28DATA ·logxl2<> + 0(SB)/8, $0x3fda7aecbeba4e46
29GLOBL ·logxl2<> + 0(SB), RODATA, $8
30DATA ·logxl1<> + 0(SB)/8, $0x3ffacde700000000
31GLOBL ·logxl1<> + 0(SB), RODATA, $8
32
33/* Input transform scale and add constants */
34DATA ·logxm<> + 0(SB)/8, $0x3fc77604e63c84b1
35DATA ·logxm<> + 8(SB)/8, $0x40fb39456ab53250
36DATA ·logxm<> + 16(SB)/8, $0x3fc9ee358b945f3f
37DATA ·logxm<> + 24(SB)/8, $0x40fb39418bf3b137
38DATA ·logxm<> + 32(SB)/8, $0x3fccfb2e1304f4b6
39DATA ·logxm<> + 40(SB)/8, $0x40fb393d3eda3022
40DATA ·logxm<> + 48(SB)/8, $0x3fd0000000000000
41DATA ·logxm<> + 56(SB)/8, $0x40fb393969e70000
42DATA ·logxm<> + 64(SB)/8, $0x3fd11117aafbfe04
43DATA ·logxm<> + 72(SB)/8, $0x40fb3936eaefafcf
44DATA ·logxm<> + 80(SB)/8, $0x3fd2492af5e658b2
45DATA ·logxm<> + 88(SB)/8, $0x40fb39343ff01715
46DATA ·logxm<> + 96(SB)/8, $0x3fd3b50c622a43dd
47DATA ·logxm<> + 104(SB)/8, $0x40fb39315adae2f3
48DATA ·logxm<> + 112(SB)/8, $0x3fd56bbeea918777
49DATA ·logxm<> + 120(SB)/8, $0x40fb392e21698552
50GLOBL ·logxm<> + 0(SB), RODATA, $128
51
52// Log returns the natural logarithm of the argument.
53//
54// Special cases are:
55//      Log(+Inf) = +Inf
56//      Log(0) = -Inf
57//      Log(x < 0) = NaN
58//      Log(NaN) = NaN
59// The algorithm used is minimax polynomial approximation using a table of
60// polynomial coefficients determined with a Remez exchange algorithm.
61
62TEXT	·logAsm(SB), NOSPLIT, $0-16
63	FMOVD	x+0(FP), F0
64	MOVDlogrodataL21<>+0(SB), R9
65	MOVH	$0x8006, R4
66	LGDR	F0, R1
67	MOVD	$0x3FF0000000000000, R6
68	SRAD	$48, R1, R1
69	MOVD	$0x40F03E8000000000, R8
70	SUBW	R1, R4
71	RISBGZ	$32, $59, $0, R4, R2
72	RISBGN	$0, $15, $48, R2, R6
73	RISBGN	$16, $31, $32, R2, R8
74	MOVW	R1, R7
75	CMPBGT	R7, $22, L17
76	LTDBR	F0, F0
77	MOVDlogx43f<>+0(SB), R1
78	FMOVD	0(R1), F2
79	BLEU	L3
80	MOVH	$0x8005, R12
81	MOVH	$0x8405, R0
82	BR	L15
83L7:
84	LTDBR	F0, F0
85	BLEU	L3
86L15:
87	FMUL	F2, F0
88	LGDR	F0, R1
89	SRAD	$48, R1, R1
90	SUBW	R1, R0, R2
91	SUBW	R1, R12, R3
92	BYTE	$0x18	//lr	%r4,%r2
93	BYTE	$0x42
94	ANDW	$0xFFFFFFF0, R3
95	ANDW	$0xFFFFFFF0, R2
96	BYTE	$0x18	//lr	%r5,%r1
97	BYTE	$0x51
98	MOVW	R1, R7
99	CMPBLE	R7, $22, L7
100	RISBGN	$0, $15, $48, R3, R6
101	RISBGN	$16, $31, $32, R2, R8
102L2:
103	MOVH	R5, R5
104	MOVH	$0x7FEF, R1
105	CMPW	R5, R1
106	BGT	L1
107	LDGR	R6, F2
108	FMUL	F2, F0
109	RISBGZ	$57, $59, $3, R4, R4
110	FMOVD	80(R9), F2
111	MOVDlogxm<>+0(SB), R7
112	ADD	R7, R4
113	FMOVD	72(R9), F4
114	WORD	$0xED004000	//madb	%f2,%f0,0(%r4)
115	BYTE	$0x20
116	BYTE	$0x1E
117	FMOVD	64(R9), F1
118	FMOVD	F2, F0
119	FMOVD	56(R9), F2
120	WFMADB	V0, V2, V4, V2
121	WFMDB	V0, V0, V6
122	FMOVD	48(R9), F4
123	WFMADB	V0, V2, V4, V2
124	FMOVD	40(R9), F4
125	WFMADB	V2, V6, V1, V2
126	FMOVD	32(R9), F1
127	WFMADB	V6, V4, V1, V4
128	FMOVD	24(R9), F1
129	WFMADB	V6, V2, V1, V2
130	FMOVD	16(R9), F1
131	WFMADB	V6, V4, V1, V4
132	MOVDlogxl1<>+0(SB), R1
133	FMOVD	8(R9), F1
134	WFMADB	V6, V2, V1, V2
135	FMOVD	0(R9), F1
136	WFMADB	V6, V4, V1, V4
137	FMOVD	8(R4), F1
138	WFMADB	V0, V2, V4, V2
139	LDGR	R8, F4
140	WFMADB	V6, V2, V0, V2
141	WORD	$0xED401000	//msdb	%f1,%f4,0(%r1)
142	BYTE	$0x10
143	BYTE	$0x1F
144	MOVD	·logxl2<>+0(SB), R1
145	WORD	$0xB3130001	//lcdbr	%f0,%f1
146	LDGR	R1, F4
147	WFMADB	V0, V4, V2, V0
148L1:
149	FMOVD	F0, ret+8(FP)
150	RET
151L3:
152	LTDBR	F0, F0
153	BEQ	L20
154	BGE	L1
155	BVS	L1
156
157	MOVDlogxnan<>+0(SB), R1
158	FMOVD	0(R1), F0
159	BR	L1
160L20:
161	MOVDlogxminf<>+0(SB), R1
162	FMOVD	0(R1), F0
163	FMOVD	F0, ret+8(FP)
164	RET
165L17:
166	BYTE	$0x18	//lr	%r5,%r1
167	BYTE	$0x51
168	BR	L2
169