...

Text file src/pkg/math/expm1_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 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		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		LGDR	F1, R1
    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		RISBGZ	$57, $60, $3, R1, R3
   103		WORD	$0xB3130022	//lcdbr	%f2,%f2
   104		MOVD	$·expm1tab<>+0(SB), R2
   105		WORD	$0x68432000	//ld	%f4,0(%r3,%r2)
   106		FMADD	F4, F0, F0
   107		SLD	$48, R1, R2
   108		WFMSDB	V2, V0, V4, V0
   109		LDGR	R2, F4
   110		WORD	$0xB3130000	//lcdbr	%f0,%f0
   111		FSUB	F4, F6
   112		WFMSDB	V0, V4, V6, V0
   113		FMOVD	F0, ret+8(FP)
   114		RET
   115	L16:
   116		WFCEDBS	V2, V2, V4
   117		BVS	LEXITTAGexpm1
   118		WORD	$0xED205008	//cdb	%f2,.L34-.L22(%r5)
   119		BYTE	$0x00
   120		BYTE	$0x19
   121		BLT	L6
   122		WFCEDBS	V2, V0, V0
   123		BVS	L7
   124		MOVD	$·expm1xinf<>+0(SB), R1
   125		FMOVD	0(R1), F0
   126		FMOVD	F0, ret+8(FP)
   127		RET
   128	L20:
   129		WORD	$0xB3130020	//lcdbr	%f2,%f0
   130		BR	L2
   131	L6:
   132		MOVD	$·expm1xaddexp<>+0(SB), R1
   133		FMOVD	88(R5), F5
   134		FMOVD	0(R1), F4
   135		WFMSDB	V0, V5, V4, V5
   136		FMOVD	80(R5), F3
   137		WFADB	V5, V4, V1
   138		VLEG	$0, 48(R5), V16
   139		WFMADB	V1, V3, V0, V3
   140		FMOVD	56(R5), F4
   141		FMOVD	64(R5), F7
   142		FMOVD	72(R5), F6
   143		WFMADB	V3, V16, V7, V16
   144		WFMADB	V3, V6, V4, V6
   145		WFMDB	V3, V3, V4
   146		MOVD	$·expm1tab<>+0(SB), R2
   147		WFMADB	V6, V4, V16, V6
   148		VLEG	$0, 32(R5), V16
   149		FMOVD	40(R5), F7
   150		WFMADB	V3, V7, V16, V7
   151		VLEG	$0, 24(R5), V16
   152		WFMADB	V4, V6, V7, V4
   153		WFMADB	V1, V16, V3, V1
   154		FMOVD	16(R5), F6
   155		FMADD	F4, F1, F6
   156		LGDR	F5, R1
   157		WORD	$0xB3130066	//lcdbr	%f6,%f6
   158		RISBGZ	$57, $60, $3, R1, R3
   159		WORD	$0x68432000	//ld	%f4,0(%r3,%r2)
   160		FMADD	F4, F1, F1
   161		MOVD	$0x4086000000000000, R2
   162		FMSUB	F1, F6, F4
   163		WORD	$0xB3130044	//lcdbr	%f4,%f4
   164		WFCHDBS	V2, V0, V0
   165		BEQ	L21
   166		ADDW	$0xF000, R1
   167		RISBGN	$0, $15, $48, R1, R2
   168		LDGR	R2, F0
   169		FMADD	F0, F4, F0
   170		MOVD	$·expm1x4ff<>+0(SB), R3
   171		FMOVD	0(R5), F4
   172		FMOVD	0(R3), F2
   173		WFMADB	V2, V0, V4, V0
   174		FMOVD	F0, ret+8(FP)
   175		RET
   176	L7:
   177		MOVD	$·expm1xmone<>+0(SB), R1
   178		FMOVD	0(R1), F0
   179		FMOVD	F0, ret+8(FP)
   180		RET
   181	L21:
   182		ADDW	$0x1000, R1
   183		RISBGN	$0, $15, $48, R1, R2
   184		LDGR	R2, F0
   185		FMADD	F0, F4, F0
   186		MOVD	$·expm1x2ff<>+0(SB), R3
   187		FMOVD	0(R5), F4
   188		FMOVD	0(R3), F2
   189		WFMADB	V2, V0, V4, V0
   190		FMOVD	F0, ret+8(FP)
   191		RET
   192	LEXITTAGexpm1:
   193		FMOVD	F0, ret+8(FP)
   194		RET

View as plain text