github.com/flyinox/gosm@v0.0.0-20171117061539-16768cb62077/src/math/expm1_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 ·expm1rodataL22<> + 0(SB)/8, $-1.0
     9  DATA ·expm1rodataL22<> + 8(SB)/8, $800.0E+00
    10  DATA ·expm1rodataL22<> + 16(SB)/8, $1.0
    11  DATA ·expm1rodataL22<> + 24(SB)/8, $-.231904681384629956E-16
    12  DATA ·expm1rodataL22<> + 32(SB)/8, $0.50000000000000029671E+00
    13  DATA ·expm1rodataL22<> + 40(SB)/8, $0.16666666666666676570E+00
    14  DATA ·expm1rodataL22<> + 48(SB)/8, $0.83333333323590973444E-02
    15  DATA ·expm1rodataL22<> + 56(SB)/8, $0.13889096526400683566E-02
    16  DATA ·expm1rodataL22<> + 64(SB)/8, $0.41666666661701152924E-01
    17  DATA ·expm1rodataL22<> + 72(SB)/8, $0.19841562053987360264E-03
    18  DATA ·expm1rodataL22<> + 80(SB)/8, $-.693147180559945286E+00
    19  DATA ·expm1rodataL22<> + 88(SB)/8, $0.144269504088896339E+01
    20  DATA ·expm1rodataL22<> + 96(SB)/8, $704.0E+00
    21  GLOBL ·expm1rodataL22<> + 0(SB), RODATA, $104
    22  
    23  DATA ·expm1xmone<> + 0(SB)/8, $0xbff0000000000000
    24  GLOBL ·expm1xmone<> + 0(SB), RODATA, $8
    25  DATA ·expm1xinf<> + 0(SB)/8, $0x7ff0000000000000
    26  GLOBL ·expm1xinf<> + 0(SB), RODATA, $8
    27  DATA ·expm1x4ff<> + 0(SB)/8, $0x4ff0000000000000
    28  GLOBL ·expm1x4ff<> + 0(SB), RODATA, $8
    29  DATA ·expm1x2ff<> + 0(SB)/8, $0x2ff0000000000000
    30  GLOBL ·expm1x2ff<> + 0(SB), RODATA, $8
    31  DATA ·expm1xaddexp<> + 0(SB)/8, $0xc2f0000100003ff0
    32  GLOBL ·expm1xaddexp<> + 0(SB), RODATA, $8
    33  
    34  // Log multipliers table
    35  DATA ·expm1tab<> + 0(SB)/8, $0.0
    36  DATA ·expm1tab<> + 8(SB)/8, $-.171540871271399150E-01
    37  DATA ·expm1tab<> + 16(SB)/8, $-.306597931864376363E-01
    38  DATA ·expm1tab<> + 24(SB)/8, $-.410200970469965021E-01
    39  DATA ·expm1tab<> + 32(SB)/8, $-.486343079978231466E-01
    40  DATA ·expm1tab<> + 40(SB)/8, $-.538226193725835820E-01
    41  DATA ·expm1tab<> + 48(SB)/8, $-.568439602538111520E-01
    42  DATA ·expm1tab<> + 56(SB)/8, $-.579091847395528847E-01
    43  DATA ·expm1tab<> + 64(SB)/8, $-.571909584179366341E-01
    44  DATA ·expm1tab<> + 72(SB)/8, $-.548312665987204407E-01
    45  DATA ·expm1tab<> + 80(SB)/8, $-.509471843643441085E-01
    46  DATA ·expm1tab<> + 88(SB)/8, $-.456353588448863359E-01
    47  DATA ·expm1tab<> + 96(SB)/8, $-.389755254243262365E-01
    48  DATA ·expm1tab<> + 104(SB)/8, $-.310332908285244231E-01
    49  DATA ·expm1tab<> + 112(SB)/8, $-.218623539150173528E-01
    50  DATA ·expm1tab<> + 120(SB)/8, $-.115062908917949451E-01
    51  GLOBL ·expm1tab<> + 0(SB), RODATA, $128
    52  
    53  // Expm1 returns e**x - 1, the base-e exponential of x minus 1.
    54  // It is more accurate than Exp(x) - 1 when x is near zero.
    55  //
    56  // Special cases are:
    57  //      Expm1(+Inf) = +Inf
    58  //      Expm1(-Inf) = -1
    59  //      Expm1(NaN) = NaN
    60  // Very large values overflow to -1 or +Inf.
    61  // The algorithm used is minimax polynomial approximation using a table of
    62  // polynomial coefficients determined with a Remez exchange algorithm.
    63  
    64  TEXT	·expm1Asm(SB), NOSPLIT, $0-16
    65  	FMOVD	x+0(FP), F0
    66  	MOVD	$·expm1rodataL22<>+0(SB), R5
    67  	WORD	$0xB3120000	//ltdbr	%f0,%f0
    68  	BLTU	L20
    69  	FMOVD	F0, F2
    70  L2:
    71  	WORD	$0xED205060	//cdb	%f2,.L23-.L22(%r5)
    72  	BYTE	$0x00
    73  	BYTE	$0x19
    74  	BGE	L16
    75  	BVS	L16
    76  	WFCEDBS	V2, V2, V2
    77  	BVS	LEXITTAGexpm1
    78  	MOVD	$·expm1xaddexp<>+0(SB), R1
    79  	FMOVD	88(R5), F1
    80  	FMOVD	0(R1), F2
    81  	WFMSDB	V0, V1, V2, V1
    82  	FMOVD	80(R5), F6
    83  	WFADB	V1, V2, V4
    84  	FMOVD	72(R5), F2
    85  	FMADD	F6, F4, F0
    86  	FMOVD	64(R5), F3
    87  	FMOVD	56(R5), F6
    88  	FMOVD	48(R5), F5
    89  	FMADD	F2, F0, F6
    90  	WFMADB	V0, V5, V3, V5
    91  	WFMDB	V0, V0, V2
    92  	WORD	$0xB3CD0011	//lgdr	%r1,%f1
    93  	WFMADB	V6, V2, V5, V6
    94  	FMOVD	40(R5), F3
    95  	FMOVD	32(R5), F5
    96  	WFMADB	V0, V3, V5, V3
    97  	FMOVD	24(R5), F5
    98  	WFMADB	V2, V6, V3, V2
    99  	FMADD	F5, F4, F0
   100  	FMOVD	16(R5), F6
   101  	WFMADB	V0, V2, V6, V2
   102  	WORD	$0xEC3139BC	//risbg	%r3,%r1,57,128+60,3
   103  	BYTE	$0x03
   104  	BYTE	$0x55
   105  	WORD	$0xB3130022	//lcdbr	%f2,%f2
   106  	MOVD	$·expm1tab<>+0(SB), R2
   107  	WORD	$0x68432000	//ld	%f4,0(%r3,%r2)
   108  	FMADD	F4, F0, F0
   109  	SLD	$48, R1, R2
   110  	WFMSDB	V2, V0, V4, V0
   111  	WORD	$0xB3C10042	//ldgr	%f4,%r2
   112  	WORD	$0xB3130000	//lcdbr	%f0,%f0
   113  	FSUB	F4, F6
   114  	WFMSDB	V0, V4, V6, V0
   115  	FMOVD	F0, ret+8(FP)
   116  	RET
   117  L16:
   118  	WFCEDBS	V2, V2, V4
   119  	BVS	LEXITTAGexpm1
   120  	WORD	$0xED205008	//cdb	%f2,.L34-.L22(%r5)
   121  	BYTE	$0x00
   122  	BYTE	$0x19
   123  	BLT	L6
   124  	WFCEDBS	V2, V0, V0
   125  	BVS	L7
   126  	MOVD	$·expm1xinf<>+0(SB), R1
   127  	FMOVD	0(R1), F0
   128  	FMOVD	F0, ret+8(FP)
   129  	RET
   130  L20:
   131  	WORD	$0xB3130020	//lcdbr	%f2,%f0
   132  	BR	L2
   133  L6:
   134  	MOVD	$·expm1xaddexp<>+0(SB), R1
   135  	FMOVD	88(R5), F5
   136  	FMOVD	0(R1), F4
   137  	WFMSDB	V0, V5, V4, V5
   138  	FMOVD	80(R5), F3
   139  	WFADB	V5, V4, V1
   140  	VLEG	$0, 48(R5), V16
   141  	WFMADB	V1, V3, V0, V3
   142  	FMOVD	56(R5), F4
   143  	FMOVD	64(R5), F7
   144  	FMOVD	72(R5), F6
   145  	WFMADB	V3, V16, V7, V16
   146  	WFMADB	V3, V6, V4, V6
   147  	WFMDB	V3, V3, V4
   148  	MOVD	$·expm1tab<>+0(SB), R2
   149  	WFMADB	V6, V4, V16, V6
   150  	VLEG	$0, 32(R5), V16
   151  	FMOVD	40(R5), F7
   152  	WFMADB	V3, V7, V16, V7
   153  	VLEG	$0, 24(R5), V16
   154  	WFMADB	V4, V6, V7, V4
   155  	WFMADB	V1, V16, V3, V1
   156  	FMOVD	16(R5), F6
   157  	FMADD	F4, F1, F6
   158  	WORD	$0xB3CD0015	//lgdr	%r1,%f5
   159  	WORD	$0xB3130066	//lcdbr	%f6,%f6
   160  	WORD	$0xEC3139BC	//risbg	%r3,%r1,57,128+60,3
   161  	BYTE	$0x03
   162  	BYTE	$0x55
   163  	WORD	$0x68432000	//ld	%f4,0(%r3,%r2)
   164  	FMADD	F4, F1, F1
   165  	MOVD	$0x4086000000000000, R2
   166  	FMSUB	F1, F6, F4
   167  	WORD	$0xB3130044	//lcdbr	%f4,%f4
   168  	WFCHDBS	V2, V0, V0
   169  	BEQ	L21
   170  	ADDW	$0xF000, R1
   171  	WORD	$0xEC21000F	//risbgn	%r2,%r1,64-64+0,64-64+0+16-1,64-0-16
   172  	BYTE	$0x30
   173  	BYTE	$0x59
   174  	WORD	$0xB3C10002	//ldgr	%f0,%r2
   175  	FMADD	F0, F4, F0
   176  	MOVD	$·expm1x4ff<>+0(SB), R3
   177  	FMOVD	0(R5), F4
   178  	FMOVD	0(R3), F2
   179  	WFMADB	V2, V0, V4, V0
   180  	FMOVD	F0, ret+8(FP)
   181  	RET
   182  L7:
   183  	MOVD	$·expm1xmone<>+0(SB), R1
   184  	FMOVD	0(R1), F0
   185  	FMOVD	F0, ret+8(FP)
   186  	RET
   187  L21:
   188  	ADDW	$0x1000, R1
   189  	WORD	$0xEC21000F	//risbgn	%r2,%r1,64-64+0,64-64+0+16-1,64-0-16
   190  	BYTE	$0x30
   191  	BYTE	$0x59
   192  	WORD	$0xB3C10002	//ldgr	%f0,%r2
   193  	FMADD	F0, F4, F0
   194  	MOVD	$·expm1x2ff<>+0(SB), R3
   195  	FMOVD	0(R5), F4
   196  	FMOVD	0(R3), F2
   197  	WFMADB	V2, V0, V4, V0
   198  	FMOVD	F0, ret+8(FP)
   199  	RET
   200  LEXITTAGexpm1:
   201  	FMOVD	F0, ret+8(FP)
   202  	RET