expm1_s390x.s raw

   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  	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  	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  	LCDBR   F0, F2
 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  	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  	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
 195