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 coefficients and other constants 8DATA ·asinhrodataL18<> + 0(SB)/8, $0.749999999977387502E-01 9DATA ·asinhrodataL18<> + 8(SB)/8, $-.166666666666657082E+00 10DATA ·asinhrodataL18<> + 16(SB)/8, $0.303819368237360639E-01 11DATA ·asinhrodataL18<> + 24(SB)/8, $-.446428569571752982E-01 12DATA ·asinhrodataL18<> + 32(SB)/8, $0.173500047922695924E-01 13DATA ·asinhrodataL18<> + 40(SB)/8, $-.223719767210027185E-01 14DATA ·asinhrodataL18<> + 48(SB)/8, $0.113655037946822130E-01 15DATA ·asinhrodataL18<> + 56(SB)/8, $0.579747490622448943E-02 16DATA ·asinhrodataL18<> + 64(SB)/8, $-.139372433914359122E-01 17DATA ·asinhrodataL18<> + 72(SB)/8, $-.218674325255800840E-02 18DATA ·asinhrodataL18<> + 80(SB)/8, $-.891074277756961157E-02 19DATA ·asinhrodataL18<> + 88(SB)/8, $.41375273347623353626 20DATA ·asinhrodataL18<> + 96(SB)/8, $.51487302528619766235E+04 21DATA ·asinhrodataL18<> + 104(SB)/8, $-1.67526912689208984375 22DATA ·asinhrodataL18<> + 112(SB)/8, $0.181818181818181826E+00 23DATA ·asinhrodataL18<> + 120(SB)/8, $-.165289256198351540E-01 24DATA ·asinhrodataL18<> + 128(SB)/8, $0.200350613573012186E-02 25DATA ·asinhrodataL18<> + 136(SB)/8, $-.273205381970859341E-03 26DATA ·asinhrodataL18<> + 144(SB)/8, $0.397389654305194527E-04 27DATA ·asinhrodataL18<> + 152(SB)/8, $0.938370938292558173E-06 28DATA ·asinhrodataL18<> + 160(SB)/8, $0.212881813645679599E-07 29DATA ·asinhrodataL18<> + 168(SB)/8, $-.602107458843052029E-05 30DATA ·asinhrodataL18<> + 176(SB)/8, $-.148682720127920854E-06 31DATA ·asinhrodataL18<> + 184(SB)/8, $-5.5 32DATA ·asinhrodataL18<> + 192(SB)/8, $1.0 33DATA ·asinhrodataL18<> + 200(SB)/8, $1.0E-20 34GLOBL ·asinhrodataL18<> + 0(SB), RODATA, $208 35 36// Table of log correction terms 37DATA ·asinhtab2080<> + 0(SB)/8, $0.585235384085551248E-01 38DATA ·asinhtab2080<> + 8(SB)/8, $0.412206153771168640E-01 39DATA ·asinhtab2080<> + 16(SB)/8, $0.273839003221648339E-01 40DATA ·asinhtab2080<> + 24(SB)/8, $0.166383778368856480E-01 41DATA ·asinhtab2080<> + 32(SB)/8, $0.866678223433169637E-02 42DATA ·asinhtab2080<> + 40(SB)/8, $0.319831684989627514E-02 43DATA ·asinhtab2080<> + 48(SB)/8, $0.0 44DATA ·asinhtab2080<> + 56(SB)/8, $-.113006378583725549E-02 45DATA ·asinhtab2080<> + 64(SB)/8, $-.367979419636602491E-03 46DATA ·asinhtab2080<> + 72(SB)/8, $0.213172484510484979E-02 47DATA ·asinhtab2080<> + 80(SB)/8, $0.623271047682013536E-02 48DATA ·asinhtab2080<> + 88(SB)/8, $0.118140812789696885E-01 49DATA ·asinhtab2080<> + 96(SB)/8, $0.187681358930914206E-01 50DATA ·asinhtab2080<> + 104(SB)/8, $0.269985148668178992E-01 51DATA ·asinhtab2080<> + 112(SB)/8, $0.364186619761331328E-01 52DATA ·asinhtab2080<> + 120(SB)/8, $0.469505379381388441E-01 53GLOBL ·asinhtab2080<> + 0(SB), RODATA, $128 54 55// Asinh returns the inverse hyperbolic sine of the argument. 56// 57// Special cases are: 58// Asinh(±0) = ±0 59// Asinh(±Inf) = ±Inf 60// Asinh(NaN) = NaN 61// The algorithm used is minimax polynomial approximation 62// with coefficients determined with a Remez exchange algorithm. 63 64TEXT ·asinhAsm(SB), NOSPLIT, $0-16 65 FMOVD x+0(FP), F0 66 MOVD $·asinhrodataL18<>+0(SB), R9 67 LGDR F0, R12 68 WORD $0xC0293FDF //iilf %r2,1071644671 69 BYTE $0xFF 70 BYTE $0xFF 71 SRAD $32, R12 72 WORD $0xB917001C //llgtr %r1,%r12 73 MOVW R1, R6 74 MOVW R2, R7 75 CMPBLE R6, R7, L2 76 WORD $0xC0295FEF //iilf %r2,1609564159 77 BYTE $0xFF 78 BYTE $0xFF 79 MOVW R2, R7 80 CMPBLE R6, R7, L14 81L3: 82 WORD $0xC0297FEF //iilf %r2,2146435071 83 BYTE $0xFF 84 BYTE $0xFF 85 CMPW R1, R2 86 BGT L1 87 LTDBR F0, F0 88 FMOVD F0, F10 89 BLTU L15 90L9: 91 FMOVD $0, F0 92 WFADB V0, V10, V0 93 WORD $0xC0398006 //iilf %r3,2147909631 94 BYTE $0x7F 95 BYTE $0xFF 96 LGDR F0, R5 97 SRAD $32, R5 98 MOVH $0x0, R2 99 SUBW R5, R3 100 FMOVD $0, F8 101 RISBGZ $32, $47, $0, R3, R4 102 BYTE $0x18 //lr %r1,%r4 103 BYTE $0x14 104 RISBGN $0, $31, $32, R4, R2 105 SUBW $0x100000, R1 106 SRAW $8, R1, R1 107 ORW $0x45000000, R1 108 BR L6 109L2: 110 MOVD $0x30000000, R2 111 CMPW R1, R2 112 BGT L16 113 FMOVD 200(R9), F2 114 FMADD F2, F0, F0 115L1: 116 FMOVD F0, ret+8(FP) 117 RET 118L14: 119 LTDBR F0, F0 120 BLTU L17 121 FMOVD F0, F10 122L4: 123 FMOVD 192(R9), F2 124 WFMADB V0, V0, V2, V0 125 LTDBR F0, F0 126 FSQRT F0, F8 127L5: 128 WFADB V8, V10, V0 129 WORD $0xC0398006 //iilf %r3,2147909631 130 BYTE $0x7F 131 BYTE $0xFF 132 LGDR F0, R5 133 SRAD $32, R5 134 MOVH $0x0, R2 135 SUBW R5, R3 136 RISBGZ $32, $47, $0, R3, R4 137 SRAW $8, R4, R1 138 RISBGN $0, $31, $32, R4, R2 139 ORW $0x45000000, R1 140L6: 141 LDGR R2, F2 142 FMOVD 184(R9), F0 143 WFMADB V8, V2, V0, V8 144 FMOVD 176(R9), F4 145 WFMADB V10, V2, V8, V2 146 FMOVD 168(R9), F0 147 FMOVD 160(R9), F6 148 FMOVD 152(R9), F1 149 WFMADB V2, V6, V4, V6 150 WFMADB V2, V1, V0, V1 151 WFMDB V2, V2, V4 152 FMOVD 144(R9), F0 153 WFMADB V6, V4, V1, V6 154 FMOVD 136(R9), F1 155 RISBGZ $57, $60, $51, R3, R3 156 WFMADB V2, V0, V1, V0 157 FMOVD 128(R9), F1 158 WFMADB V4, V6, V0, V6 159 FMOVD 120(R9), F0 160 WFMADB V2, V1, V0, V1 161 VLVGF $0, R1, V0 162 WFMADB V4, V6, V1, V4 163 LDEBR F0, F0 164 FMOVD 112(R9), F6 165 WFMADB V2, V4, V6, V4 166 MOVD $·asinhtab2080<>+0(SB), R1 167 FMOVD 104(R9), F1 168 WORD $0x68331000 //ld %f3,0(%r3,%r1) 169 FMOVD 96(R9), F6 170 WFMADB V2, V4, V3, V2 171 WFMADB V0, V1, V6, V0 172 FMOVD 88(R9), F4 173 WFMADB V0, V4, V2, V0 174 MOVD R12, R6 175 CMPBGT R6, $0, L1 176 177 WORD $0xB3130000 //lcdbr %f0,%f0 178 FMOVD F0, ret+8(FP) 179 RET 180L16: 181 WFMDB V0, V0, V1 182 FMOVD 80(R9), F6 183 WFMDB V1, V1, V4 184 FMOVD 72(R9), F2 185 WFMADB V4, V2, V6, V2 186 FMOVD 64(R9), F3 187 FMOVD 56(R9), F6 188 WFMADB V4, V2, V3, V2 189 FMOVD 48(R9), F3 190 WFMADB V4, V6, V3, V6 191 FMOVD 40(R9), F5 192 FMOVD 32(R9), F3 193 WFMADB V4, V2, V5, V2 194 WFMADB V4, V6, V3, V6 195 FMOVD 24(R9), F5 196 FMOVD 16(R9), F3 197 WFMADB V4, V2, V5, V2 198 WFMADB V4, V6, V3, V6 199 FMOVD 8(R9), F5 200 FMOVD 0(R9), F3 201 WFMADB V4, V2, V5, V2 202 WFMADB V4, V6, V3, V4 203 WFMDB V0, V1, V6 204 WFMADB V1, V4, V2, V4 205 FMADD F4, F6, F0 206 FMOVD F0, ret+8(FP) 207 RET 208L17: 209 WORD $0xB31300A0 //lcdbr %f10,%f0 210 BR L4 211L15: 212 WORD $0xB31300A0 //lcdbr %f10,%f0 213 BR L9 214