...

Text file src/pkg/math/log1p_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	// 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		LGDR	F4, R3
   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		RISBGN	$0, $15, $48, R4, R2
   109		RISBGN	$16, $31, $32, R4, R5
   110		MOVW	R0, R6
   111		MOVW	R3, R7
   112		CMPBGT	R6, R7, L8
   113		WFCEDBS	V4, V4, V6
   114		MOVD	$·log1pxzero<>+0(SB), R1
   115		FMOVD	0(R1), F2
   116		BVS	LEXITTAGlog1p
   117		WORD	$0xB3130044	// lcdbr %f4,%f4
   118		WFCEDBS	V2, V4, V6
   119		BEQ	L9
   120		WFCHDBS	V4, V2, V2
   121		BEQ	LEXITTAGlog1p
   122		MOVD	$·log1pxnan<>+0(SB), R1
   123		FMOVD	0(R1), F0
   124		FMOVD	F0, ret+8(FP)
   125		RET
   126	
   127	L8:
   128		LDGR	R2, F2
   129		FSUB	F4, F3
   130		FMADD	F2, F4, F1
   131		MOVD	$·log1pc4<>+0(SB), R2
   132		WORD	$0xB3130041	// lcdbr %f4,%f1
   133		FMOVD	0(R2), F7
   134		FSUB	F3, F0
   135		MOVD	$·log1pc3<>+0(SB), R2
   136		FMOVD	0(R2), F3
   137		MOVD	$·log1pc2<>+0(SB), R2
   138		WFMDB	V1, V1, V6
   139		FMADD	F7, F4, F3
   140		WFMSDB	V0, V2, V1, V0
   141		FMOVD	0(R2), F7
   142		WFMADB	V4, V5, V20, V5
   143		MOVD	$·log1pc1<>+0(SB), R2
   144		FMOVD	0(R2), F2
   145		FMADD	F7, F4, F2
   146		WFMADB	V4, V18, V16, V4
   147		FMADD	F3, F6, F2
   148		WFMADB	V5, V6, V4, V5
   149		FMUL	F6, F6
   150		MOVD	$·log1pc0<>+0(SB), R2
   151		WFMADB	V6, V5, V2, V6
   152		FMOVD	0(R2), F4
   153		WFMADB	V0, V6, V4, V6
   154		RISBGZ	$57, $60, $3, R1, R1
   155		MOVD	$·log1ptab<>+0(SB), R2
   156		MOVD	$·log1pxl1<>+0(SB), R3
   157		WORD	$0x68112000	//ld	%f1,0(%r1,%r2)
   158		FMOVD	0(R3), F2
   159		WFMADB	V0, V6, V1, V0
   160		MOVD	$·log1pyout<>+0(SB), R1
   161		LDGR	R5, F6
   162		FMOVD	0(R1), F4
   163		WFMSDB	V2, V6, V4, V2
   164		MOVD	$·log1pxl2<>+0(SB), R1
   165		FMOVD	0(R1), F4
   166		FMADD	F4, F2, F0
   167		FMOVD	F0, ret+8(FP)
   168		RET
   169	
   170	L9:
   171		MOVD	$·log1pxminf<>+0(SB), R1
   172		FMOVD	0(R1), F0
   173		FMOVD	F0, ret+8(FP)
   174		RET
   175	
   176	
   177	LEXITTAGlog1p:
   178		FMOVD	F0, ret+8(FP)
   179		RET
   180	

View as plain text