github.com/twelsh-aw/go/src@v0.0.0-20230516233729-a56fe86a7c81/math/exp_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 ·exprodataL22<> + 0(SB)/8, $800.0E+00 9 DATA ·exprodataL22<> + 8(SB)/8, $1.0000000000000022e+00 10 DATA ·exprodataL22<> + 16(SB)/8, $0.500000000000004237e+00 11 DATA ·exprodataL22<> + 24(SB)/8, $0.166666666630345592e+00 12 DATA ·exprodataL22<> + 32(SB)/8, $0.138926439368309441e-02 13 DATA ·exprodataL22<> + 40(SB)/8, $0.833349307718286047e-02 14 DATA ·exprodataL22<> + 48(SB)/8, $0.416666664838056960e-01 15 DATA ·exprodataL22<> + 56(SB)/8, $-.231904681384629956E-16 16 DATA ·exprodataL22<> + 64(SB)/8, $-.693147180559945286E+00 17 DATA ·exprodataL22<> + 72(SB)/8, $0.144269504088896339E+01 18 DATA ·exprodataL22<> + 80(SB)/8, $704.0E+00 19 GLOBL ·exprodataL22<> + 0(SB), RODATA, $88 20 21 DATA ·expxinf<> + 0(SB)/8, $0x7ff0000000000000 22 GLOBL ·expxinf<> + 0(SB), RODATA, $8 23 DATA ·expx4ff<> + 0(SB)/8, $0x4ff0000000000000 24 GLOBL ·expx4ff<> + 0(SB), RODATA, $8 25 DATA ·expx2ff<> + 0(SB)/8, $0x2ff0000000000000 26 GLOBL ·expx2ff<> + 0(SB), RODATA, $8 27 DATA ·expxaddexp<> + 0(SB)/8, $0xc2f0000100003fef 28 GLOBL ·expxaddexp<> + 0(SB), RODATA, $8 29 30 // Log multipliers table 31 DATA ·exptexp<> + 0(SB)/8, $0.442737824274138381E-01 32 DATA ·exptexp<> + 8(SB)/8, $0.263602189790660309E-01 33 DATA ·exptexp<> + 16(SB)/8, $0.122565642281703586E-01 34 DATA ·exptexp<> + 24(SB)/8, $0.143757052860721398E-02 35 DATA ·exptexp<> + 32(SB)/8, $-.651375034121276075E-02 36 DATA ·exptexp<> + 40(SB)/8, $-.119317678849450159E-01 37 DATA ·exptexp<> + 48(SB)/8, $-.150868749549871069E-01 38 DATA ·exptexp<> + 56(SB)/8, $-.161992609578469234E-01 39 DATA ·exptexp<> + 64(SB)/8, $-.154492360403337917E-01 40 DATA ·exptexp<> + 72(SB)/8, $-.129850717389178721E-01 41 DATA ·exptexp<> + 80(SB)/8, $-.892902649276657891E-02 42 DATA ·exptexp<> + 88(SB)/8, $-.338202636596794887E-02 43 DATA ·exptexp<> + 96(SB)/8, $0.357266307045684762E-02 44 DATA ·exptexp<> + 104(SB)/8, $0.118665304327406698E-01 45 DATA ·exptexp<> + 112(SB)/8, $0.214434994118118914E-01 46 DATA ·exptexp<> + 120(SB)/8, $0.322580645161290314E-01 47 GLOBL ·exptexp<> + 0(SB), RODATA, $128 48 49 // Exp returns e**x, the base-e exponential of x. 50 // 51 // Special cases are: 52 // Exp(+Inf) = +Inf 53 // Exp(NaN) = NaN 54 // Very large values overflow to 0 or +Inf. 55 // Very small values underflow to 1. 56 // The algorithm used is minimax polynomial approximation using a table of 57 // polynomial coefficients determined with a Remez exchange algorithm. 58 59 TEXT ·expAsm(SB), NOSPLIT, $0-16 60 FMOVD x+0(FP), F0 61 MOVD $·exprodataL22<>+0(SB), R5 62 LTDBR F0, F0 63 BLTU L20 64 FMOVD F0, F2 65 L2: 66 WORD $0xED205050 //cdb %f2,.L23-.L22(%r5) 67 BYTE $0x00 68 BYTE $0x19 69 BGE L16 70 BVS L16 71 WFCEDBS V2, V2, V2 72 BVS LEXITTAGexp 73 MOVD $·expxaddexp<>+0(SB), R1 74 FMOVD 72(R5), F6 75 FMOVD 0(R1), F2 76 WFMSDB V0, V6, V2, V6 77 FMOVD 64(R5), F4 78 FADD F6, F2 79 FMOVD 56(R5), F1 80 FMADD F4, F2, F0 81 FMOVD 48(R5), F3 82 WFMADB V2, V1, V0, V2 83 FMOVD 40(R5), F1 84 FMOVD 32(R5), F4 85 FMUL F0, F0 86 WFMADB V2, V4, V1, V4 87 LGDR F6, R1 88 FMOVD 24(R5), F1 89 WFMADB V2, V3, V1, V3 90 FMOVD 16(R5), F1 91 WFMADB V0, V4, V3, V4 92 FMOVD 8(R5), F3 93 WFMADB V2, V1, V3, V1 94 RISBGZ $57, $60, $3, R1, R3 95 WFMADB V0, V4, V1, V0 96 MOVD $·exptexp<>+0(SB), R2 97 WORD $0x68432000 //ld %f4,0(%r3,%r2) 98 FMADD F4, F2, F2 99 SLD $48, R1, R2 100 WFMADB V2, V0, V4, V2 101 LDGR R2, F0 102 FMADD F0, F2, F0 103 FMOVD F0, ret+8(FP) 104 RET 105 L16: 106 WFCEDBS V2, V2, V4 107 BVS LEXITTAGexp 108 WORD $0xED205000 //cdb %f2,.L33-.L22(%r5) 109 BYTE $0x00 110 BYTE $0x19 111 BLT L6 112 WFCEDBS V2, V0, V0 113 BVS L13 114 MOVD $·expxinf<>+0(SB), R1 115 FMOVD 0(R1), F0 116 FMOVD F0, ret+8(FP) 117 RET 118 L20: 119 WORD $0xB3130020 //lcdbr %f2,%f0 120 BR L2 121 L6: 122 MOVD $·expxaddexp<>+0(SB), R1 123 FMOVD 72(R5), F3 124 FMOVD 0(R1), F4 125 WFMSDB V0, V3, V4, V3 126 FMOVD 64(R5), F6 127 FADD F3, F4 128 FMOVD 56(R5), F5 129 WFMADB V4, V6, V0, V6 130 FMOVD 32(R5), F1 131 WFMADB V4, V5, V6, V4 132 FMOVD 40(R5), F5 133 FMUL F6, F6 134 WFMADB V4, V1, V5, V1 135 FMOVD 48(R5), F7 136 LGDR F3, R1 137 FMOVD 24(R5), F5 138 WFMADB V4, V7, V5, V7 139 FMOVD 16(R5), F5 140 WFMADB V6, V1, V7, V1 141 FMOVD 8(R5), F7 142 WFMADB V4, V5, V7, V5 143 RISBGZ $57, $60, $3, R1, R3 144 WFMADB V6, V1, V5, V6 145 MOVD $·exptexp<>+0(SB), R2 146 WFCHDBS V2, V0, V0 147 WORD $0x68132000 //ld %f1,0(%r3,%r2) 148 FMADD F1, F4, F4 149 MOVD $0x4086000000000000, R2 150 WFMADB V4, V6, V1, V4 151 BEQ L21 152 ADDW $0xF000, R1 153 RISBGN $0, $15, $48, R1, R2 154 LDGR R2, F0 155 FMADD F0, F4, F0 156 MOVD $·expx4ff<>+0(SB), R3 157 FMOVD 0(R3), F2 158 FMUL F2, F0 159 FMOVD F0, ret+8(FP) 160 RET 161 L13: 162 FMOVD $0, F0 163 FMOVD F0, ret+8(FP) 164 RET 165 L21: 166 ADDW $0x1000, R1 167 RISBGN $0, $15, $48, R1, R2 168 LDGR R2, F0 169 FMADD F0, F4, F0 170 MOVD $·expx2ff<>+0(SB), R3 171 FMOVD 0(R3), F2 172 FMUL F2, F0 173 FMOVD F0, ret+8(FP) 174 RET 175 LEXITTAGexp: 176 FMOVD F0, ret+8(FP) 177 RET