github.com/ltltlt/go-source-code@v0.0.0-20190830023027-95be009773aa/math/atanh_s390x.s (about) 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 8 DATA ·atanhrodataL10<> + 0(SB)/8, $.41375273347623353626 9 DATA ·atanhrodataL10<> + 8(SB)/8, $.51487302528619766235E+04 10 DATA ·atanhrodataL10<> + 16(SB)/8, $-1.67526912689208984375 11 DATA ·atanhrodataL10<> + 24(SB)/8, $0.181818181818181826E+00 12 DATA ·atanhrodataL10<> + 32(SB)/8, $-.165289256198351540E-01 13 DATA ·atanhrodataL10<> + 40(SB)/8, $0.200350613573012186E-02 14 DATA ·atanhrodataL10<> + 48(SB)/8, $0.397389654305194527E-04 15 DATA ·atanhrodataL10<> + 56(SB)/8, $-.273205381970859341E-03 16 DATA ·atanhrodataL10<> + 64(SB)/8, $0.938370938292558173E-06 17 DATA ·atanhrodataL10<> + 72(SB)/8, $-.148682720127920854E-06 18 DATA ·atanhrodataL10<> + 80(SB)/8, $ 0.212881813645679599E-07 19 DATA ·atanhrodataL10<> + 88(SB)/8, $-.602107458843052029E-05 20 DATA ·atanhrodataL10<> + 96(SB)/8, $-5.5 21 DATA ·atanhrodataL10<> + 104(SB)/8, $-0.5 22 DATA ·atanhrodataL10<> + 112(SB)/8, $0.0 23 DATA ·atanhrodataL10<> + 120(SB)/8, $0x7ff8000000000000 //Nan 24 DATA ·atanhrodataL10<> + 128(SB)/8, $-1.0 25 DATA ·atanhrodataL10<> + 136(SB)/8, $1.0 26 DATA ·atanhrodataL10<> + 144(SB)/8, $1.0E-20 27 GLOBL ·atanhrodataL10<> + 0(SB), RODATA, $152 28 29 // Table of log correction terms 30 DATA ·atanhtab2076<> + 0(SB)/8, $0.585235384085551248E-01 31 DATA ·atanhtab2076<> + 8(SB)/8, $0.412206153771168640E-01 32 DATA ·atanhtab2076<> + 16(SB)/8, $0.273839003221648339E-01 33 DATA ·atanhtab2076<> + 24(SB)/8, $0.166383778368856480E-01 34 DATA ·atanhtab2076<> + 32(SB)/8, $0.866678223433169637E-02 35 DATA ·atanhtab2076<> + 40(SB)/8, $0.319831684989627514E-02 36 DATA ·atanhtab2076<> + 48(SB)/8, $0.000000000000000000E+00 37 DATA ·atanhtab2076<> + 56(SB)/8, $-.113006378583725549E-02 38 DATA ·atanhtab2076<> + 64(SB)/8, $-.367979419636602491E-03 39 DATA ·atanhtab2076<> + 72(SB)/8, $0.213172484510484979E-02 40 DATA ·atanhtab2076<> + 80(SB)/8, $0.623271047682013536E-02 41 DATA ·atanhtab2076<> + 88(SB)/8, $0.118140812789696885E-01 42 DATA ·atanhtab2076<> + 96(SB)/8, $0.187681358930914206E-01 43 DATA ·atanhtab2076<> + 104(SB)/8, $0.269985148668178992E-01 44 DATA ·atanhtab2076<> + 112(SB)/8, $0.364186619761331328E-01 45 DATA ·atanhtab2076<> + 120(SB)/8, $0.469505379381388441E-01 46 GLOBL ·atanhtab2076<> + 0(SB), RODATA, $128 47 48 // Table of +/- .5 49 DATA ·atanhtabh2075<> + 0(SB)/8, $0.5 50 DATA ·atanhtabh2075<> + 8(SB)/8, $-.5 51 GLOBL ·atanhtabh2075<> + 0(SB), RODATA, $16 52 53 // Atanh returns the inverse hyperbolic tangent of the argument. 54 // 55 // Special cases are: 56 // Atanh(1) = +Inf 57 // Atanh(±0) = ±0 58 // Atanh(-1) = -Inf 59 // Atanh(x) = NaN if x < -1 or x > 1 60 // Atanh(NaN) = NaN 61 // The algorithm used is minimax polynomial approximation 62 // with coefficients determined with a Remez exchange algorithm. 63 64 TEXT ·atanhAsm(SB), NOSPLIT, $0-16 65 FMOVD x+0(FP), F0 66 MOVD $·atanhrodataL10<>+0(SB), R5 67 WORD $0xB3CD0010 //lgdr %r1, %f0 68 WORD $0xC0393FEF //iilf %r3,1072693247 69 BYTE $0xFF 70 BYTE $0xFF 71 SRAD $32, R1 72 WORD $0xB9170021 //llgtr %r2,%r1 73 MOVW R2, R6 74 MOVW R3, R7 75 CMPBGT R6, R7, L2 76 WORD $0xC0392FFF //iilf %r3,805306367 77 BYTE $0xFF 78 BYTE $0xFF 79 MOVW R2, R6 80 MOVW R3, R7 81 CMPBGT R6, R7, L9 82 L3: 83 FMOVD 144(R5), F2 84 FMADD F2, F0, F0 85 L1: 86 FMOVD F0, ret+8(FP) 87 RET 88 89 L2: 90 WORD $0xED005088 //cdb %f0,.L12-.L10(%r5) 91 BYTE $0x00 92 BYTE $0x19 93 BEQ L5 94 WORD $0xED005080 //cdb %f0,.L13-.L10(%r5) 95 BYTE $0x00 96 BYTE $0x19 97 BEQ L5 98 WFCEDBS V0, V0, V2 99 BVS L1 100 FMOVD 120(R5), F0 101 BR L1 102 L5: 103 WORD $0xED005070 //ddb %f0,.L15-.L10(%r5) 104 BYTE $0x00 105 BYTE $0x1D 106 FMOVD F0, ret+8(FP) 107 RET 108 109 L9: 110 FMOVD F0, F2 111 MOVD $·atanhtabh2075<>+0(SB), R2 112 SRW $31, R1, R1 113 FMOVD 104(R5), F4 114 MOVW R1, R1 115 SLD $3, R1, R1 116 WORD $0x68012000 //ld %f0,0(%r1,%r2) 117 WFMADB V2, V4, V0, V4 118 VLEG $0, 96(R5), V16 119 FDIV F4, F2 120 WORD $0xC0298006 //iilf %r2,2147909631 121 BYTE $0x7F 122 BYTE $0xFF 123 FMOVD 88(R5), F6 124 FMOVD 80(R5), F1 125 FMOVD 72(R5), F7 126 FMOVD 64(R5), F5 127 FMOVD F2, F4 128 WORD $0xED405088 //adb %f4,.L12-.L10(%r5) 129 BYTE $0x00 130 BYTE $0x1A 131 WORD $0xB3CD0044 //lgdr %r4, %f4 132 SRAD $32, R4 133 FMOVD F4, F3 134 WORD $0xED305088 //sdb %f3,.L12-.L10(%r5) 135 BYTE $0x00 136 BYTE $0x1B 137 SUBW R4, R2 138 WFSDB V3, V2, V3 139 WORD $0xEC1220AF //risbg %r1,%r2,32,128+47,0 140 BYTE $0x00 141 BYTE $0x55 142 SLD $32, R1, R1 143 WORD $0xB3C10021 //ldgr %f2,%r1 144 WFMADB V4, V2, V16, V4 145 SRAW $8, R2, R1 146 WFMADB V4, V5, V6, V5 147 WFMDB V4, V4, V6 148 WFMADB V4, V1, V7, V1 149 WFMADB V2, V3, V4, V2 150 WFMADB V1, V6, V5, V1 151 FMOVD 56(R5), F3 152 FMOVD 48(R5), F5 153 WFMADB V4, V5, V3, V4 154 FMOVD 40(R5), F3 155 FMADD F1, F6, F4 156 FMOVD 32(R5), F1 157 FMADD F3, F2, F1 158 ANDW $0xFFFFFF00, R1 159 WFMADB V6, V4, V1, V6 160 FMOVD 24(R5), F3 161 ORW $0x45000000, R1 162 WFMADB V2, V6, V3, V6 163 VLVGF $0, R1, V4 164 LDEBR F4, F4 165 WORD $0xEC2239BC //risbg %r2,%r2,57,128+60,64-13 166 BYTE $0x33 167 BYTE $0x55 168 MOVD $·atanhtab2076<>+0(SB), R1 169 FMOVD 16(R5), F3 170 WORD $0x68521000 //ld %f5,0(%r2,%r1) 171 FMOVD 8(R5), F1 172 WFMADB V2, V6, V5, V2 173 WFMADB V4, V3, V1, V4 174 FMOVD 0(R5), F6 175 FMADD F6, F4, F2 176 FMUL F2, F0 177 FMOVD F0, ret+8(FP) 178 RET