github.com/twelsh-aw/go/src@v0.0.0-20230516233729-a56fe86a7c81/math/exp_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 approximation and other constants
     8  DATA ·exprodataL22<> + 0(SB)/8, $800.0E+00
     9  DATA ·exprodataL22<> + 8(SB)/8, $1.0000000000000022e+00
    10  DATA ·exprodataL22<> + 16(SB)/8, $0.500000000000004237e+00
    11  DATA ·exprodataL22<> + 24(SB)/8, $0.166666666630345592e+00
    12  DATA ·exprodataL22<> + 32(SB)/8, $0.138926439368309441e-02
    13  DATA ·exprodataL22<> + 40(SB)/8, $0.833349307718286047e-02
    14  DATA ·exprodataL22<> + 48(SB)/8, $0.416666664838056960e-01
    15  DATA ·exprodataL22<> + 56(SB)/8, $-.231904681384629956E-16
    16  DATA ·exprodataL22<> + 64(SB)/8, $-.693147180559945286E+00
    17  DATA ·exprodataL22<> + 72(SB)/8, $0.144269504088896339E+01
    18  DATA ·exprodataL22<> + 80(SB)/8, $704.0E+00
    19  GLOBL ·exprodataL22<> + 0(SB), RODATA, $88
    20  
    21  DATA ·expxinf<> + 0(SB)/8, $0x7ff0000000000000
    22  GLOBL ·expxinf<> + 0(SB), RODATA, $8
    23  DATA ·expx4ff<> + 0(SB)/8, $0x4ff0000000000000
    24  GLOBL ·expx4ff<> + 0(SB), RODATA, $8
    25  DATA ·expx2ff<> + 0(SB)/8, $0x2ff0000000000000
    26  GLOBL ·expx2ff<> + 0(SB), RODATA, $8
    27  DATA ·expxaddexp<> + 0(SB)/8, $0xc2f0000100003fef
    28  GLOBL ·expxaddexp<> + 0(SB), RODATA, $8
    29  
    30  // Log multipliers table
    31  DATA ·exptexp<> + 0(SB)/8, $0.442737824274138381E-01
    32  DATA ·exptexp<> + 8(SB)/8, $0.263602189790660309E-01
    33  DATA ·exptexp<> + 16(SB)/8, $0.122565642281703586E-01
    34  DATA ·exptexp<> + 24(SB)/8, $0.143757052860721398E-02
    35  DATA ·exptexp<> + 32(SB)/8, $-.651375034121276075E-02
    36  DATA ·exptexp<> + 40(SB)/8, $-.119317678849450159E-01
    37  DATA ·exptexp<> + 48(SB)/8, $-.150868749549871069E-01
    38  DATA ·exptexp<> + 56(SB)/8, $-.161992609578469234E-01
    39  DATA ·exptexp<> + 64(SB)/8, $-.154492360403337917E-01
    40  DATA ·exptexp<> + 72(SB)/8, $-.129850717389178721E-01
    41  DATA ·exptexp<> + 80(SB)/8, $-.892902649276657891E-02
    42  DATA ·exptexp<> + 88(SB)/8, $-.338202636596794887E-02
    43  DATA ·exptexp<> + 96(SB)/8, $0.357266307045684762E-02
    44  DATA ·exptexp<> + 104(SB)/8, $0.118665304327406698E-01
    45  DATA ·exptexp<> + 112(SB)/8, $0.214434994118118914E-01
    46  DATA ·exptexp<> + 120(SB)/8, $0.322580645161290314E-01
    47  GLOBL ·exptexp<> + 0(SB), RODATA, $128
    48  
    49  // Exp returns e**x, the base-e exponential of x.
    50  //
    51  // Special cases are:
    52  //      Exp(+Inf) = +Inf
    53  //      Exp(NaN) = NaN
    54  // Very large values overflow to 0 or +Inf.
    55  // Very small values underflow to 1.
    56  // The algorithm used is minimax polynomial approximation using a table of
    57  // polynomial coefficients determined with a Remez exchange algorithm.
    58  
    59  TEXT	·expAsm(SB), NOSPLIT, $0-16
    60  	FMOVD	x+0(FP), F0
    61  	MOVD	$·exprodataL22<>+0(SB), R5
    62  	LTDBR	F0, F0
    63  	BLTU	L20
    64  	FMOVD	F0, F2
    65  L2:
    66  	WORD	$0xED205050	//cdb	%f2,.L23-.L22(%r5)
    67  	BYTE	$0x00
    68  	BYTE	$0x19
    69  	BGE	L16
    70  	BVS	L16
    71  	WFCEDBS	V2, V2, V2
    72  	BVS	LEXITTAGexp
    73  	MOVD	$·expxaddexp<>+0(SB), R1
    74  	FMOVD	72(R5), F6
    75  	FMOVD	0(R1), F2
    76  	WFMSDB	V0, V6, V2, V6
    77  	FMOVD	64(R5), F4
    78  	FADD	F6, F2
    79  	FMOVD	56(R5), F1
    80  	FMADD	F4, F2, F0
    81  	FMOVD	48(R5), F3
    82  	WFMADB	V2, V1, V0, V2
    83  	FMOVD	40(R5), F1
    84  	FMOVD	32(R5), F4
    85  	FMUL	F0, F0
    86  	WFMADB	V2, V4, V1, V4
    87  	LGDR	F6, R1
    88  	FMOVD	24(R5), F1
    89  	WFMADB	V2, V3, V1, V3
    90  	FMOVD	16(R5), F1
    91  	WFMADB	V0, V4, V3, V4
    92  	FMOVD	8(R5), F3
    93  	WFMADB	V2, V1, V3, V1
    94  	RISBGZ	$57, $60, $3, R1, R3
    95  	WFMADB	V0, V4, V1, V0
    96  	MOVD	$·exptexp<>+0(SB), R2
    97  	WORD	$0x68432000	//ld	%f4,0(%r3,%r2)
    98  	FMADD	F4, F2, F2
    99  	SLD	$48, R1, R2
   100  	WFMADB	V2, V0, V4, V2
   101  	LDGR	R2, F0
   102  	FMADD	F0, F2, F0
   103  	FMOVD	F0, ret+8(FP)
   104  	RET
   105  L16:
   106  	WFCEDBS	V2, V2, V4
   107  	BVS	LEXITTAGexp
   108  	WORD	$0xED205000	//cdb	%f2,.L33-.L22(%r5)
   109  	BYTE	$0x00
   110  	BYTE	$0x19
   111  	BLT	L6
   112  	WFCEDBS	V2, V0, V0
   113  	BVS	L13
   114  	MOVD	$·expxinf<>+0(SB), R1
   115  	FMOVD	0(R1), F0
   116  	FMOVD	F0, ret+8(FP)
   117  	RET
   118  L20:
   119  	WORD	$0xB3130020	//lcdbr	%f2,%f0
   120  	BR	L2
   121  L6:
   122  	MOVD	$·expxaddexp<>+0(SB), R1
   123  	FMOVD	72(R5), F3
   124  	FMOVD	0(R1), F4
   125  	WFMSDB	V0, V3, V4, V3
   126  	FMOVD	64(R5), F6
   127  	FADD	F3, F4
   128  	FMOVD	56(R5), F5
   129  	WFMADB	V4, V6, V0, V6
   130  	FMOVD	32(R5), F1
   131  	WFMADB	V4, V5, V6, V4
   132  	FMOVD	40(R5), F5
   133  	FMUL	F6, F6
   134  	WFMADB	V4, V1, V5, V1
   135  	FMOVD	48(R5), F7
   136  	LGDR	F3, R1
   137  	FMOVD	24(R5), F5
   138  	WFMADB	V4, V7, V5, V7
   139  	FMOVD	16(R5), F5
   140  	WFMADB	V6, V1, V7, V1
   141  	FMOVD	8(R5), F7
   142  	WFMADB	V4, V5, V7, V5
   143  	RISBGZ	$57, $60, $3, R1, R3
   144  	WFMADB	V6, V1, V5, V6
   145  	MOVD	$·exptexp<>+0(SB), R2
   146  	WFCHDBS	V2, V0, V0
   147  	WORD	$0x68132000	//ld	%f1,0(%r3,%r2)
   148  	FMADD	F1, F4, F4
   149  	MOVD	$0x4086000000000000, R2
   150  	WFMADB	V4, V6, V1, V4
   151  	BEQ	L21
   152  	ADDW	$0xF000, R1
   153  	RISBGN	$0, $15, $48, R1, R2
   154  	LDGR	R2, F0
   155  	FMADD	F0, F4, F0
   156  	MOVD	$·expx4ff<>+0(SB), R3
   157  	FMOVD	0(R3), F2
   158  	FMUL	F2, F0
   159  	FMOVD	F0, ret+8(FP)
   160  	RET
   161  L13:
   162  	FMOVD	$0, F0
   163  	FMOVD	F0, ret+8(FP)
   164  	RET
   165  L21:
   166  	ADDW	$0x1000, R1
   167  	RISBGN	$0, $15, $48, R1, R2
   168  	LDGR	R2, F0
   169  	FMADD	F0, F4, F0
   170  	MOVD	$·expx2ff<>+0(SB), R3
   171  	FMOVD	0(R3), F2
   172  	FMUL	F2, F0
   173  	FMOVD	F0, ret+8(FP)
   174  	RET
   175  LEXITTAGexp:
   176  	FMOVD	F0, ret+8(FP)
   177  	RET