Text file src/math/atanh_s390x.s

     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      LGDR    F0, R1
    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      LGDR    F4, R4
   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      RISBGZ  $32, $47, $0, R2, R1
   140      SLD $32, R1, R1
   141      LDGR    R1, F2
   142      WFMADB  V4, V2, V16, V4
   143      SRAW    $8, R2, R1
   144      WFMADB  V4, V5, V6, V5
   145      WFMDB   V4, V4, V6
   146      WFMADB  V4, V1, V7, V1
   147      WFMADB  V2, V3, V4, V2
   148      WFMADB  V1, V6, V5, V1
   149      FMOVD   56(R5), F3
   150      FMOVD   48(R5), F5
   151      WFMADB  V4, V5, V3, V4
   152      FMOVD   40(R5), F3
   153      FMADD   F1, F6, F4
   154      FMOVD   32(R5), F1
   155      FMADD   F3, F2, F1
   156      ANDW    $0xFFFFFF00, R1
   157      WFMADB  V6, V4, V1, V6
   158      FMOVD   24(R5), F3
   159      ORW $0x45000000, R1
   160      WFMADB  V2, V6, V3, V6
   161      VLVGF   $0, R1, V4
   162      LDEBR   F4, F4
   163      RISBGZ  $57, $60, $51, R2, R2
   164      MOVD    $·atanhtab2076<>+0(SB), R1
   165      FMOVD   16(R5), F3
   166      WORD    $0x68521000 //ld    %f5,0(%r2,%r1)
   167      FMOVD   8(R5), F1
   168      WFMADB  V2, V6, V5, V2
   169      WFMADB  V4, V3, V1, V4
   170      FMOVD   0(R5), F6
   171      FMADD   F6, F4, F2
   172      FMUL    F2, F0
   173      FMOVD   F0, ret+8(FP)
   174      RET
   175  

View as plain text