github.com/twelsh-aw/go/src@v0.0.0-20230516233729-a56fe86a7c81/math/sinh_s390x.s (about) 1 // Copyright 2016 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 6 #include "textflag.h" 7 8 // Constants 9 DATA sinhrodataL21<>+0(SB)/8, $0.231904681384629956E-16 10 DATA sinhrodataL21<>+8(SB)/8, $0.693147180559945286E+00 11 DATA sinhrodataL21<>+16(SB)/8, $704.E0 12 GLOBL sinhrodataL21<>+0(SB), RODATA, $24 13 DATA sinhrlog2<>+0(SB)/8, $0x3ff7154760000000 14 GLOBL sinhrlog2<>+0(SB), RODATA, $8 15 DATA sinhxinf<>+0(SB)/8, $0x7ff0000000000000 16 GLOBL sinhxinf<>+0(SB), RODATA, $8 17 DATA sinhxinit<>+0(SB)/8, $0x3ffb504f333f9de6 18 GLOBL sinhxinit<>+0(SB), RODATA, $8 19 DATA sinhxlim1<>+0(SB)/8, $800.E0 20 GLOBL sinhxlim1<>+0(SB), RODATA, $8 21 DATA sinhxadd<>+0(SB)/8, $0xc3200001610007fb 22 GLOBL sinhxadd<>+0(SB), RODATA, $8 23 DATA sinhx4ff<>+0(SB)/8, $0x4ff0000000000000 24 GLOBL sinhx4ff<>+0(SB), RODATA, $8 25 26 // Minimax polynomial approximations 27 DATA sinhe0<>+0(SB)/8, $0.11715728752538099300E+01 28 GLOBL sinhe0<>+0(SB), RODATA, $8 29 DATA sinhe1<>+0(SB)/8, $0.11715728752538099300E+01 30 GLOBL sinhe1<>+0(SB), RODATA, $8 31 DATA sinhe2<>+0(SB)/8, $0.58578643762688526692E+00 32 GLOBL sinhe2<>+0(SB), RODATA, $8 33 DATA sinhe3<>+0(SB)/8, $0.19526214587563004497E+00 34 GLOBL sinhe3<>+0(SB), RODATA, $8 35 DATA sinhe4<>+0(SB)/8, $0.48815536475176217404E-01 36 GLOBL sinhe4<>+0(SB), RODATA, $8 37 DATA sinhe5<>+0(SB)/8, $0.97631072948627397816E-02 38 GLOBL sinhe5<>+0(SB), RODATA, $8 39 DATA sinhe6<>+0(SB)/8, $0.16271839297756073153E-02 40 GLOBL sinhe6<>+0(SB), RODATA, $8 41 DATA sinhe7<>+0(SB)/8, $0.23245485387271142509E-03 42 GLOBL sinhe7<>+0(SB), RODATA, $8 43 DATA sinhe8<>+0(SB)/8, $0.29080955860869629131E-04 44 GLOBL sinhe8<>+0(SB), RODATA, $8 45 DATA sinhe9<>+0(SB)/8, $0.32311267157667725278E-05 46 GLOBL sinhe9<>+0(SB), RODATA, $8 47 48 // Sinh returns the hyperbolic sine of the argument. 49 // 50 // Special cases are: 51 // Sinh(±0) = ±0 52 // Sinh(±Inf) = ±Inf 53 // Sinh(NaN) = NaN 54 // The algorithm used is minimax polynomial approximation 55 // with coefficients determined with a Remez exchange algorithm. 56 57 TEXT ·sinhAsm(SB),NOSPLIT,$0-16 58 FMOVD x+0(FP), F0 59 //special case Sinh(±0) = ±0 60 FMOVD $(0.0), F1 61 FCMPU F0, F1 62 BEQ sinhIsZero 63 //special case Sinh(±Inf) = ±Inf 64 FMOVD $1.797693134862315708145274237317043567981e+308, F1 65 FCMPU F1, F0 66 BLEU sinhIsInf 67 FMOVD $-1.797693134862315708145274237317043567981e+308, F1 68 FCMPU F1, F0 69 BGT sinhIsInf 70 71 MOVD $sinhrodataL21<>+0(SB), R5 72 LTDBR F0, F0 73 MOVD sinhxinit<>+0(SB), R1 74 FMOVD F0, F4 75 MOVD R1, R3 76 BLTU L19 77 FMOVD F0, F2 78 L2: 79 WORD $0xED205010 //cdb %f2,.L22-.L21(%r5) 80 BYTE $0x00 81 BYTE $0x19 82 BGE L15 //jnl .L15 83 BVS L15 84 WFCEDBS V2, V2, V0 85 BEQ L20 86 L12: 87 FMOVD F4, F0 88 FMOVD F0, ret+8(FP) 89 RET 90 91 L15: 92 WFCEDBS V2, V2, V0 93 BVS L12 94 MOVD $sinhxlim1<>+0(SB), R2 95 FMOVD 0(R2), F0 96 WFCHDBS V0, V2, V0 97 BEQ L6 98 WFCHEDBS V4, V2, V6 99 MOVD $sinhxinf<>+0(SB), R1 100 FMOVD 0(R1), F0 101 BNE LEXITTAGsinh 102 WFCHDBS V2, V4, V2 103 BNE L16 104 FNEG F0, F0 105 FMOVD F0, ret+8(FP) 106 RET 107 108 L19: 109 FNEG F0, F2 110 BR L2 111 L6: 112 MOVD $sinhxadd<>+0(SB), R2 113 FMOVD 0(R2), F0 114 MOVD sinhrlog2<>+0(SB), R2 115 LDGR R2, F6 116 WFMSDB V4, V6, V0, V16 117 FMOVD sinhrodataL21<>+8(SB), F6 118 WFADB V0, V16, V0 119 FMOVD sinhrodataL21<>+0(SB), F3 120 WFMSDB V0, V6, V4, V6 121 MOVD $sinhe9<>+0(SB), R2 122 WFMADB V0, V3, V6, V0 123 FMOVD 0(R2), F1 124 MOVD $sinhe7<>+0(SB), R2 125 WFMDB V0, V0, V6 126 FMOVD 0(R2), F5 127 MOVD $sinhe8<>+0(SB), R2 128 FMOVD 0(R2), F3 129 MOVD $sinhe6<>+0(SB), R2 130 WFMADB V6, V1, V5, V1 131 FMOVD 0(R2), F5 132 MOVD $sinhe5<>+0(SB), R2 133 FMOVD 0(R2), F7 134 MOVD $sinhe3<>+0(SB), R2 135 WFMADB V6, V3, V5, V3 136 FMOVD 0(R2), F5 137 MOVD $sinhe4<>+0(SB), R2 138 WFMADB V6, V7, V5, V7 139 FMOVD 0(R2), F5 140 MOVD $sinhe2<>+0(SB), R2 141 VLEG $0, 0(R2), V20 142 WFMDB V6, V6, V18 143 WFMADB V6, V5, V20, V5 144 WFMADB V1, V18, V7, V1 145 FNEG F0, F0 146 WFMADB V3, V18, V5, V3 147 MOVD $sinhe1<>+0(SB), R3 148 WFCEDBS V2, V4, V2 149 FMOVD 0(R3), F5 150 MOVD $sinhe0<>+0(SB), R3 151 WFMADB V6, V1, V5, V1 152 FMOVD 0(R3), F5 153 VLGVG $0, V16, R2 154 WFMADB V6, V3, V5, V6 155 RLL $3, R2, R2 156 RISBGN $0, $15, $48, R2, R1 157 BEQ L9 158 WFMSDB V0, V1, V6, V0 159 MOVD $sinhx4ff<>+0(SB), R3 160 FNEG F0, F0 161 FMOVD 0(R3), F2 162 FMUL F2, F0 163 ANDW $0xFFFF, R2 164 WORD $0xA53FEFB6 //llill %r3,61366 165 SUBW R2, R3, R2 166 RISBGN $0, $15, $48, R2, R1 167 LDGR R1, F2 168 FMUL F2, F0 169 FMOVD F0, ret+8(FP) 170 RET 171 172 L20: 173 MOVD $sinhxadd<>+0(SB), R2 174 FMOVD 0(R2), F2 175 MOVD sinhrlog2<>+0(SB), R2 176 LDGR R2, F0 177 WFMSDB V4, V0, V2, V6 178 FMOVD sinhrodataL21<>+8(SB), F0 179 FADD F6, F2 180 MOVD $sinhe9<>+0(SB), R2 181 FMSUB F0, F2, F4 182 FMOVD 0(R2), F1 183 FMOVD sinhrodataL21<>+0(SB), F3 184 MOVD $sinhe7<>+0(SB), R2 185 FMADD F3, F2, F4 186 FMOVD 0(R2), F0 187 MOVD $sinhe8<>+0(SB), R2 188 WFMDB V4, V4, V2 189 FMOVD 0(R2), F3 190 MOVD $sinhe6<>+0(SB), R2 191 FMOVD 0(R2), F5 192 LGDR F6, R2 193 RLL $3, R2, R2 194 RISBGN $0, $15, $48, R2, R1 195 WFMADB V2, V1, V0, V1 196 LDGR R1, F0 197 MOVD $sinhe5<>+0(SB), R1 198 WFMADB V2, V3, V5, V3 199 FMOVD 0(R1), F5 200 MOVD $sinhe3<>+0(SB), R1 201 FMOVD 0(R1), F6 202 WFMDB V2, V2, V7 203 WFMADB V2, V5, V6, V5 204 WORD $0xA7487FB6 //lhi %r4,32694 205 FNEG F4, F4 206 ANDW $0xFFFF, R2 207 SUBW R2, R4, R2 208 RISBGN $0, $15, $48, R2, R3 209 LDGR R3, F6 210 WFADB V0, V6, V16 211 MOVD $sinhe4<>+0(SB), R1 212 WFMADB V1, V7, V5, V1 213 WFMDB V4, V16, V4 214 FMOVD 0(R1), F5 215 MOVD $sinhe2<>+0(SB), R1 216 VLEG $0, 0(R1), V16 217 MOVD $sinhe1<>+0(SB), R1 218 WFMADB V2, V5, V16, V5 219 VLEG $0, 0(R1), V16 220 WFMADB V3, V7, V5, V3 221 WFMADB V2, V1, V16, V1 222 FSUB F6, F0 223 FMUL F1, F4 224 MOVD $sinhe0<>+0(SB), R1 225 FMOVD 0(R1), F6 226 WFMADB V2, V3, V6, V2 227 WFMADB V0, V2, V4, V0 228 FMOVD F0, ret+8(FP) 229 RET 230 231 L9: 232 WFMADB V0, V1, V6, V0 233 MOVD $sinhx4ff<>+0(SB), R3 234 FMOVD 0(R3), F2 235 FMUL F2, F0 236 WORD $0xA72AF000 //ahi %r2,-4096 237 RISBGN $0, $15, $48, R2, R1 238 LDGR R1, F2 239 FMUL F2, F0 240 FMOVD F0, ret+8(FP) 241 RET 242 243 L16: 244 FMOVD F0, ret+8(FP) 245 RET 246 247 LEXITTAGsinh: 248 sinhIsInf: 249 sinhIsZero: 250 FMOVD F0, ret+8(FP) 251 RET