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 MOVD $·logrodataL21<>+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 MOVD $·logx43f<>+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 MOVD $·logxm<>+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 MOVD $·logxl1<>+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 MOVD $·logxnan<>+0(SB), R1 158 FMOVD 0(R1), F0 159 BR L1 160L20: 161 MOVD $·logxminf<>+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