github.com/flyinox/gosm@v0.0.0-20171117061539-16768cb62077/src/math/log1p_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  // Constants
     8  DATA ·log1pxlim<> + 0(SB)/4, $0xfff00000
     9  GLOBL ·log1pxlim<> + 0(SB), RODATA, $4
    10  DATA ·log1pxzero<> + 0(SB)/8, $0.0
    11  GLOBL ·log1pxzero<> + 0(SB), RODATA, $8
    12  DATA ·log1pxminf<> + 0(SB)/8, $0xfff0000000000000
    13  GLOBL ·log1pxminf<> + 0(SB), RODATA, $8
    14  DATA ·log1pxnan<> + 0(SB)/8, $0x7ff8000000000000
    15  GLOBL ·log1pxnan<> + 0(SB), RODATA, $8
    16  DATA ·log1pyout<> + 0(SB)/8, $0x40fce621e71da000
    17  GLOBL ·log1pyout<> + 0(SB), RODATA, $8
    18  DATA ·log1pxout<> + 0(SB)/8, $0x40f1000000000000
    19  GLOBL ·log1pxout<> + 0(SB), RODATA, $8
    20  DATA ·log1pxl2<> + 0(SB)/8, $0xbfda7aecbeba4e46
    21  GLOBL ·log1pxl2<> + 0(SB), RODATA, $8
    22  DATA ·log1pxl1<> + 0(SB)/8, $0x3ffacde700000000
    23  GLOBL ·log1pxl1<> + 0(SB), RODATA, $8
    24  DATA ·log1pxa<> + 0(SB)/8, $5.5
    25  GLOBL ·log1pxa<> + 0(SB), RODATA, $8
    26  DATA ·log1pxmone<> + 0(SB)/8, $-1.0
    27  GLOBL ·log1pxmone<> + 0(SB), RODATA, $8
    28  
    29  // Minimax polynomial approximations
    30  DATA ·log1pc8<> + 0(SB)/8, $0.212881813645679599E-07
    31  GLOBL ·log1pc8<> + 0(SB), RODATA, $8
    32  DATA ·log1pc7<> + 0(SB)/8, $-.148682720127920854E-06
    33  GLOBL ·log1pc7<> + 0(SB), RODATA, $8
    34  DATA ·log1pc6<> + 0(SB)/8, $0.938370938292558173E-06
    35  GLOBL ·log1pc6<> + 0(SB), RODATA, $8
    36  DATA ·log1pc5<> + 0(SB)/8, $-.602107458843052029E-05
    37  GLOBL ·log1pc5<> + 0(SB), RODATA, $8
    38  DATA ·log1pc4<> + 0(SB)/8, $0.397389654305194527E-04
    39  GLOBL ·log1pc4<> + 0(SB), RODATA, $8
    40  DATA ·log1pc3<> + 0(SB)/8, $-.273205381970859341E-03
    41  GLOBL ·log1pc3<> + 0(SB), RODATA, $8
    42  DATA ·log1pc2<> + 0(SB)/8, $0.200350613573012186E-02
    43  GLOBL ·log1pc2<> + 0(SB), RODATA, $8
    44  DATA ·log1pc1<> + 0(SB)/8, $-.165289256198351540E-01
    45  GLOBL ·log1pc1<> + 0(SB), RODATA, $8
    46  DATA ·log1pc0<> + 0(SB)/8, $0.181818181818181826E+00
    47  GLOBL ·log1pc0<> + 0(SB), RODATA, $8
    48  
    49  
    50  // Table of log10 correction terms
    51  DATA ·log1ptab<> + 0(SB)/8, $0.585235384085551248E-01
    52  DATA ·log1ptab<> + 8(SB)/8, $0.412206153771168640E-01
    53  DATA ·log1ptab<> + 16(SB)/8, $0.273839003221648339E-01
    54  DATA ·log1ptab<> + 24(SB)/8, $0.166383778368856480E-01
    55  DATA ·log1ptab<> + 32(SB)/8, $0.866678223433169637E-02
    56  DATA ·log1ptab<> + 40(SB)/8, $0.319831684989627514E-02
    57  DATA ·log1ptab<> + 48(SB)/8, $-.000000000000000000E+00
    58  DATA ·log1ptab<> + 56(SB)/8, $-.113006378583725549E-02
    59  DATA ·log1ptab<> + 64(SB)/8, $-.367979419636602491E-03
    60  DATA ·log1ptab<> + 72(SB)/8, $0.213172484510484979E-02
    61  DATA ·log1ptab<> + 80(SB)/8, $0.623271047682013536E-02
    62  DATA ·log1ptab<> + 88(SB)/8, $0.118140812789696885E-01
    63  DATA ·log1ptab<> + 96(SB)/8, $0.187681358930914206E-01
    64  DATA ·log1ptab<> + 104(SB)/8, $0.269985148668178992E-01
    65  DATA ·log1ptab<> + 112(SB)/8, $0.364186619761331328E-01
    66  DATA ·log1ptab<> + 120(SB)/8, $0.469505379381388441E-01
    67  GLOBL ·log1ptab<> + 0(SB), RODATA, $128
    68  
    69  // Log1p returns the natural logarithm of 1 plus its argument x.
    70  // It is more accurate than Log(1 + x) when x is near zero.
    71  //
    72  // Special cases are:
    73  //      Log1p(+Inf) = +Inf
    74  //      Log1p(±0) = ±0
    75  //      Log1p(-1) = -Inf
    76  //      Log1p(x < -1) = NaN
    77  //      Log1p(NaN) = NaN
    78  // The algorithm used is minimax polynomial approximation
    79  // with coefficients determined with a Remez exchange algorithm.
    80  
    81  TEXT	·log1pAsm(SB), NOSPLIT, $0-16
    82  	FMOVD	x+0(FP), F0
    83  	MOVD	$·log1pxmone<>+0(SB), R1
    84  	MOVD	·log1pxout<>+0(SB), R2
    85  	FMOVD	0(R1), F3
    86  	MOVD	$·log1pxa<>+0(SB), R1
    87  	MOVWZ	·log1pxlim<>+0(SB), R0
    88  	FMOVD	0(R1), F1
    89  	MOVD	$·log1pc8<>+0(SB), R1
    90  	FMOVD	0(R1), F5
    91  	MOVD	$·log1pc7<>+0(SB), R1
    92  	VLEG	$0, 0(R1), V20
    93  	MOVD	$·log1pc6<>+0(SB), R1
    94  	WFSDB	V0, V3, V4
    95  	VLEG	$0, 0(R1), V18
    96  	MOVD	$·log1pc5<>+0(SB), R1
    97  	VLEG	$0, 0(R1), V16
    98  	MOVD	R2, R5
    99  	WORD	$0xB3CD0034	//lgdr	%r3,%f4
   100  	WORD	$0xC0190006	//iilf	%r1,425983
   101  	BYTE	$0x7F
   102  	BYTE	$0xFF
   103  	SRAD	$32, R3, R3
   104  	SUBW	R3, R1
   105  	SRW	$16, R1, R1
   106  	BYTE	$0x18	//lr	%r4,%r1
   107  	BYTE	$0x41
   108  	WORD	$0xEC24000F	//risbgn	%r2,%r4,64-64+0,64-64+0+16-1,64-0-16
   109  	BYTE	$0x30
   110  	BYTE	$0x59
   111  	WORD	$0xEC54101F	//risbgn	%r5,%r4,64-64+16,64-64+16+16-1,64-16-16
   112  	BYTE	$0x20
   113  	BYTE	$0x59
   114  	MOVW	R0, R6
   115  	MOVW	R3, R7
   116  	CMPBGT	R6, R7, L8
   117  	WFCEDBS	V4, V4, V6
   118  	MOVD	$·log1pxzero<>+0(SB), R1
   119  	FMOVD	0(R1), F2
   120  	BVS	LEXITTAGlog1p
   121  	WORD	$0xB3130044
   122  	WFCEDBS	V2, V4, V6
   123  	BEQ	L9
   124  	WFCHDBS	V4, V2, V2
   125  	BEQ	LEXITTAGlog1p
   126  	MOVD	$·log1pxnan<>+0(SB), R1
   127  	FMOVD	0(R1), F0
   128  	FMOVD	F0, ret+8(FP)
   129  	RET
   130  
   131  L8:
   132  	WORD	$0xB3C10022	//ldgr	%f2,%r2
   133  	FSUB	F4, F3
   134  	FMADD	F2, F4, F1
   135  	MOVD	$·log1pc4<>+0(SB), R2
   136  	WORD	$0xB3130041
   137  	FMOVD	0(R2), F7
   138  	FSUB	F3, F0
   139  	MOVD	$·log1pc3<>+0(SB), R2
   140  	FMOVD	0(R2), F3
   141  	MOVD	$·log1pc2<>+0(SB), R2
   142  	WFMDB	V1, V1, V6
   143  	FMADD	F7, F4, F3
   144  	WFMSDB	V0, V2, V1, V0
   145  	FMOVD	0(R2), F7
   146  	WFMADB	V4, V5, V20, V5
   147  	MOVD	$·log1pc1<>+0(SB), R2
   148  	FMOVD	0(R2), F2
   149  	FMADD	F7, F4, F2
   150  	WFMADB	V4, V18, V16, V4
   151  	FMADD	F3, F6, F2
   152  	WFMADB	V5, V6, V4, V5
   153  	FMUL	F6, F6
   154  	MOVD	$·log1pc0<>+0(SB), R2
   155  	WFMADB	V6, V5, V2, V6
   156  	FMOVD	0(R2), F4
   157  	WFMADB	V0, V6, V4, V6
   158  	WORD	$0xEC1139BC	//risbg	%r1,%r1,57,128+60,3
   159  	BYTE	$0x03
   160  	BYTE	$0x55
   161  	MOVD	$·log1ptab<>+0(SB), R2
   162  	MOVD	$·log1pxl1<>+0(SB), R3
   163  	WORD	$0x68112000	//ld	%f1,0(%r1,%r2)
   164  	FMOVD	0(R3), F2
   165  	WFMADB	V0, V6, V1, V0
   166  	MOVD	$·log1pyout<>+0(SB), R1
   167  	WORD	$0xB3C10065	//ldgr	%f6,%r5
   168  	FMOVD	0(R1), F4
   169  	WFMSDB	V2, V6, V4, V2
   170  	MOVD	$·log1pxl2<>+0(SB), R1
   171  	FMOVD	0(R1), F4
   172  	FMADD	F4, F2, F0
   173  	FMOVD	F0, ret+8(FP)
   174  	RET
   175  
   176  L9:
   177  	MOVD	$·log1pxminf<>+0(SB), R1
   178  	FMOVD	0(R1), F0
   179  	FMOVD	F0, ret+8(FP)
   180  	RET
   181  
   182  
   183  LEXITTAGlog1p:
   184  	FMOVD	F0, ret+8(FP)
   185  	RET
   186