|  | // Copyright 2016 The Go Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style | 
|  | // license that can be found in the LICENSE file. | 
|  |  | 
|  |  | 
|  | #include "textflag.h" | 
|  |  | 
|  | // Constants | 
|  | DATA sinhrodataL21<>+0(SB)/8, $0.231904681384629956E-16 | 
|  | DATA sinhrodataL21<>+8(SB)/8, $0.693147180559945286E+00 | 
|  | DATA sinhrodataL21<>+16(SB)/8, $704.E0 | 
|  | GLOBL sinhrodataL21<>+0(SB), RODATA, $24 | 
|  | DATA sinhrlog2<>+0(SB)/8, $0x3ff7154760000000 | 
|  | GLOBL sinhrlog2<>+0(SB), RODATA, $8 | 
|  | DATA sinhxinf<>+0(SB)/8, $0x7ff0000000000000 | 
|  | GLOBL sinhxinf<>+0(SB), RODATA, $8 | 
|  | DATA sinhxinit<>+0(SB)/8, $0x3ffb504f333f9de6 | 
|  | GLOBL sinhxinit<>+0(SB), RODATA, $8 | 
|  | DATA sinhxlim1<>+0(SB)/8, $800.E0 | 
|  | GLOBL sinhxlim1<>+0(SB), RODATA, $8 | 
|  | DATA sinhxadd<>+0(SB)/8, $0xc3200001610007fb | 
|  | GLOBL sinhxadd<>+0(SB), RODATA, $8 | 
|  | DATA sinhx4ff<>+0(SB)/8, $0x4ff0000000000000 | 
|  | GLOBL sinhx4ff<>+0(SB), RODATA, $8 | 
|  |  | 
|  | // Minimax polynomial approximations | 
|  | DATA sinhe0<>+0(SB)/8, $0.11715728752538099300E+01 | 
|  | GLOBL sinhe0<>+0(SB), RODATA, $8 | 
|  | DATA sinhe1<>+0(SB)/8, $0.11715728752538099300E+01 | 
|  | GLOBL sinhe1<>+0(SB), RODATA, $8 | 
|  | DATA sinhe2<>+0(SB)/8, $0.58578643762688526692E+00 | 
|  | GLOBL sinhe2<>+0(SB), RODATA, $8 | 
|  | DATA sinhe3<>+0(SB)/8, $0.19526214587563004497E+00 | 
|  | GLOBL sinhe3<>+0(SB), RODATA, $8 | 
|  | DATA sinhe4<>+0(SB)/8, $0.48815536475176217404E-01 | 
|  | GLOBL sinhe4<>+0(SB), RODATA, $8 | 
|  | DATA sinhe5<>+0(SB)/8, $0.97631072948627397816E-02 | 
|  | GLOBL sinhe5<>+0(SB), RODATA, $8 | 
|  | DATA sinhe6<>+0(SB)/8, $0.16271839297756073153E-02 | 
|  | GLOBL sinhe6<>+0(SB), RODATA, $8 | 
|  | DATA sinhe7<>+0(SB)/8, $0.23245485387271142509E-03 | 
|  | GLOBL sinhe7<>+0(SB), RODATA, $8 | 
|  | DATA sinhe8<>+0(SB)/8, $0.29080955860869629131E-04 | 
|  | GLOBL sinhe8<>+0(SB), RODATA, $8 | 
|  | DATA sinhe9<>+0(SB)/8, $0.32311267157667725278E-05 | 
|  | GLOBL sinhe9<>+0(SB), RODATA, $8 | 
|  |  | 
|  | // Sinh returns the hyperbolic sine of the argument. | 
|  | // | 
|  | // Special cases are: | 
|  | //      Sinh(±0) = ±0 | 
|  | //      Sinh(±Inf) = ±Inf | 
|  | //      Sinh(NaN) = NaN | 
|  | // The algorithm used is minimax polynomial approximation | 
|  | // with coefficients determined with a Remez exchange algorithm. | 
|  |  | 
|  | TEXT ·sinhAsm(SB),NOSPLIT,$0-16 | 
|  | FMOVD   x+0(FP), F0 | 
|  | //special case Sinh(±0) = ±0 | 
|  | FMOVD   $(0.0), F1 | 
|  | FCMPU   F0, F1 | 
|  | BEQ     sinhIsZero | 
|  | //special case Sinh(±Inf) = ±Inf | 
|  | FMOVD   $1.797693134862315708145274237317043567981e+308, F1 | 
|  | FCMPU   F1, F0 | 
|  | BLEU    sinhIsInf | 
|  | FMOVD   $-1.797693134862315708145274237317043567981e+308, F1 | 
|  | FCMPU   F1, F0 | 
|  | BGT             sinhIsInf | 
|  |  | 
|  | MOVD    $sinhrodataL21<>+0(SB), R5 | 
|  | LTDBR	F0, F0 | 
|  | MOVD    sinhxinit<>+0(SB), R1 | 
|  | FMOVD   F0, F4 | 
|  | MOVD    R1, R3 | 
|  | BLTU    L19 | 
|  | FMOVD   F0, F2 | 
|  | L2: | 
|  | WORD    $0xED205010     //cdb %f2,.L22-.L21(%r5) | 
|  | BYTE    $0x00 | 
|  | BYTE    $0x19 | 
|  | BGE     L15     //jnl   .L15 | 
|  | BVS     L15 | 
|  | WFCEDBS V2, V2, V0 | 
|  | BEQ     L20 | 
|  | L12: | 
|  | FMOVD   F4, F0 | 
|  | FMOVD   F0, ret+8(FP) | 
|  | RET | 
|  |  | 
|  | L15: | 
|  | WFCEDBS V2, V2, V0 | 
|  | BVS     L12 | 
|  | MOVD    $sinhxlim1<>+0(SB), R2 | 
|  | FMOVD   0(R2), F0 | 
|  | WFCHDBS V0, V2, V0 | 
|  | BEQ     L6 | 
|  | WFCHEDBS        V4, V2, V6 | 
|  | MOVD    $sinhxinf<>+0(SB), R1 | 
|  | FMOVD   0(R1), F0 | 
|  | BNE     LEXITTAGsinh | 
|  | WFCHDBS V2, V4, V2 | 
|  | BNE     L16 | 
|  | FNEG    F0, F0 | 
|  | FMOVD   F0, ret+8(FP) | 
|  | RET | 
|  |  | 
|  | L19: | 
|  | FNEG    F0, F2 | 
|  | BR      L2 | 
|  | L6: | 
|  | MOVD    $sinhxadd<>+0(SB), R2 | 
|  | FMOVD   0(R2), F0 | 
|  | MOVD    sinhrlog2<>+0(SB), R2 | 
|  | LDGR    R2, F6 | 
|  | WFMSDB  V4, V6, V0, V16 | 
|  | FMOVD   sinhrodataL21<>+8(SB), F6 | 
|  | WFADB   V0, V16, V0 | 
|  | FMOVD   sinhrodataL21<>+0(SB), F3 | 
|  | WFMSDB  V0, V6, V4, V6 | 
|  | MOVD    $sinhe9<>+0(SB), R2 | 
|  | WFMADB  V0, V3, V6, V0 | 
|  | FMOVD   0(R2), F1 | 
|  | MOVD    $sinhe7<>+0(SB), R2 | 
|  | WFMDB   V0, V0, V6 | 
|  | FMOVD   0(R2), F5 | 
|  | MOVD    $sinhe8<>+0(SB), R2 | 
|  | FMOVD   0(R2), F3 | 
|  | MOVD    $sinhe6<>+0(SB), R2 | 
|  | WFMADB  V6, V1, V5, V1 | 
|  | FMOVD   0(R2), F5 | 
|  | MOVD    $sinhe5<>+0(SB), R2 | 
|  | FMOVD   0(R2), F7 | 
|  | MOVD    $sinhe3<>+0(SB), R2 | 
|  | WFMADB  V6, V3, V5, V3 | 
|  | FMOVD   0(R2), F5 | 
|  | MOVD    $sinhe4<>+0(SB), R2 | 
|  | WFMADB  V6, V7, V5, V7 | 
|  | FMOVD   0(R2), F5 | 
|  | MOVD    $sinhe2<>+0(SB), R2 | 
|  | VLEG    $0, 0(R2), V20 | 
|  | WFMDB   V6, V6, V18 | 
|  | WFMADB  V6, V5, V20, V5 | 
|  | WFMADB  V1, V18, V7, V1 | 
|  | FNEG    F0, F0 | 
|  | WFMADB  V3, V18, V5, V3 | 
|  | MOVD    $sinhe1<>+0(SB), R3 | 
|  | WFCEDBS V2, V4, V2 | 
|  | FMOVD   0(R3), F5 | 
|  | MOVD    $sinhe0<>+0(SB), R3 | 
|  | WFMADB  V6, V1, V5, V1 | 
|  | FMOVD   0(R3), F5 | 
|  | VLGVG   $0, V16, R2 | 
|  | WFMADB  V6, V3, V5, V6 | 
|  | RLL     $3, R2, R2 | 
|  | RISBGN	$0, $15, $48, R2, R1 | 
|  | BEQ     L9 | 
|  | WFMSDB  V0, V1, V6, V0 | 
|  | MOVD    $sinhx4ff<>+0(SB), R3 | 
|  | FNEG    F0, F0 | 
|  | FMOVD   0(R3), F2 | 
|  | FMUL    F2, F0 | 
|  | ANDW    $0xFFFF, R2 | 
|  | WORD    $0xA53FEFB6     //llill %r3,61366 | 
|  | SUBW    R2, R3, R2 | 
|  | RISBGN	$0, $15, $48, R2, R1 | 
|  | LDGR    R1, F2 | 
|  | FMUL    F2, F0 | 
|  | FMOVD   F0, ret+8(FP) | 
|  | RET | 
|  |  | 
|  | L20: | 
|  | MOVD    $sinhxadd<>+0(SB), R2 | 
|  | FMOVD   0(R2), F2 | 
|  | MOVD    sinhrlog2<>+0(SB), R2 | 
|  | LDGR    R2, F0 | 
|  | WFMSDB  V4, V0, V2, V6 | 
|  | FMOVD   sinhrodataL21<>+8(SB), F0 | 
|  | FADD    F6, F2 | 
|  | MOVD    $sinhe9<>+0(SB), R2 | 
|  | FMSUB   F0, F2, F4 | 
|  | FMOVD   0(R2), F1 | 
|  | FMOVD   sinhrodataL21<>+0(SB), F3 | 
|  | MOVD    $sinhe7<>+0(SB), R2 | 
|  | FMADD   F3, F2, F4 | 
|  | FMOVD   0(R2), F0 | 
|  | MOVD    $sinhe8<>+0(SB), R2 | 
|  | WFMDB   V4, V4, V2 | 
|  | FMOVD   0(R2), F3 | 
|  | MOVD    $sinhe6<>+0(SB), R2 | 
|  | FMOVD   0(R2), F5 | 
|  | LGDR    F6, R2 | 
|  | RLL     $3, R2, R2 | 
|  | RISBGN	$0, $15, $48, R2, R1 | 
|  | WFMADB  V2, V1, V0, V1 | 
|  | LDGR    R1, F0 | 
|  | MOVD    $sinhe5<>+0(SB), R1 | 
|  | WFMADB  V2, V3, V5, V3 | 
|  | FMOVD   0(R1), F5 | 
|  | MOVD    $sinhe3<>+0(SB), R1 | 
|  | FMOVD   0(R1), F6 | 
|  | WFMDB   V2, V2, V7 | 
|  | WFMADB  V2, V5, V6, V5 | 
|  | WORD    $0xA7487FB6     //lhi %r4,32694 | 
|  | FNEG    F4, F4 | 
|  | ANDW    $0xFFFF, R2 | 
|  | SUBW    R2, R4, R2 | 
|  | RISBGN	$0, $15, $48, R2, R3 | 
|  | LDGR    R3, F6 | 
|  | WFADB   V0, V6, V16 | 
|  | MOVD    $sinhe4<>+0(SB), R1 | 
|  | WFMADB  V1, V7, V5, V1 | 
|  | WFMDB   V4, V16, V4 | 
|  | FMOVD   0(R1), F5 | 
|  | MOVD    $sinhe2<>+0(SB), R1 | 
|  | VLEG    $0, 0(R1), V16 | 
|  | MOVD    $sinhe1<>+0(SB), R1 | 
|  | WFMADB  V2, V5, V16, V5 | 
|  | VLEG    $0, 0(R1), V16 | 
|  | WFMADB  V3, V7, V5, V3 | 
|  | WFMADB  V2, V1, V16, V1 | 
|  | FSUB    F6, F0 | 
|  | FMUL    F1, F4 | 
|  | MOVD    $sinhe0<>+0(SB), R1 | 
|  | FMOVD   0(R1), F6 | 
|  | WFMADB  V2, V3, V6, V2 | 
|  | WFMADB  V0, V2, V4, V0 | 
|  | FMOVD   F0, ret+8(FP) | 
|  | RET | 
|  |  | 
|  | L9: | 
|  | WFMADB  V0, V1, V6, V0 | 
|  | MOVD    $sinhx4ff<>+0(SB), R3 | 
|  | FMOVD   0(R3), F2 | 
|  | FMUL    F2, F0 | 
|  | WORD    $0xA72AF000     //ahi   %r2,-4096 | 
|  | RISBGN	$0, $15, $48, R2, R1 | 
|  | LDGR    R1, F2 | 
|  | FMUL    F2, F0 | 
|  | FMOVD   F0, ret+8(FP) | 
|  | RET | 
|  |  | 
|  | L16: | 
|  | FMOVD   F0, ret+8(FP) | 
|  | RET | 
|  |  | 
|  | LEXITTAGsinh: | 
|  | sinhIsInf: | 
|  | sinhIsZero: | 
|  | FMOVD   F0, ret+8(FP) | 
|  | RET |