github.com/twelsh-aw/go/src@v0.0.0-20230516233729-a56fe86a7c81/math/log_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 approximations 8 DATA ·logrodataL21<> + 0(SB)/8, $-.499999999999999778E+00 9 DATA ·logrodataL21<> + 8(SB)/8, $0.333333333333343751E+00 10 DATA ·logrodataL21<> + 16(SB)/8, $-.250000000001606881E+00 11 DATA ·logrodataL21<> + 24(SB)/8, $0.199999999971603032E+00 12 DATA ·logrodataL21<> + 32(SB)/8, $-.166666663114122038E+00 13 DATA ·logrodataL21<> + 40(SB)/8, $-.125002923782692399E+00 14 DATA ·logrodataL21<> + 48(SB)/8, $0.111142014580396256E+00 15 DATA ·logrodataL21<> + 56(SB)/8, $0.759438932618934220E-01 16 DATA ·logrodataL21<> + 64(SB)/8, $0.142857144267212549E+00 17 DATA ·logrodataL21<> + 72(SB)/8, $-.993038938793590759E-01 18 DATA ·logrodataL21<> + 80(SB)/8, $-1.0 19 GLOBL ·logrodataL21<> + 0(SB), RODATA, $88 20 21 // Constants 22 DATA ·logxminf<> + 0(SB)/8, $0xfff0000000000000 23 GLOBL ·logxminf<> + 0(SB), RODATA, $8 24 DATA ·logxnan<> + 0(SB)/8, $0x7ff8000000000000 25 GLOBL ·logxnan<> + 0(SB), RODATA, $8 26 DATA ·logx43f<> + 0(SB)/8, $0x43f0000000000000 27 GLOBL ·logx43f<> + 0(SB), RODATA, $8 28 DATA ·logxl2<> + 0(SB)/8, $0x3fda7aecbeba4e46 29 GLOBL ·logxl2<> + 0(SB), RODATA, $8 30 DATA ·logxl1<> + 0(SB)/8, $0x3ffacde700000000 31 GLOBL ·logxl1<> + 0(SB), RODATA, $8 32 33 /* Input transform scale and add constants */ 34 DATA ·logxm<> + 0(SB)/8, $0x3fc77604e63c84b1 35 DATA ·logxm<> + 8(SB)/8, $0x40fb39456ab53250 36 DATA ·logxm<> + 16(SB)/8, $0x3fc9ee358b945f3f 37 DATA ·logxm<> + 24(SB)/8, $0x40fb39418bf3b137 38 DATA ·logxm<> + 32(SB)/8, $0x3fccfb2e1304f4b6 39 DATA ·logxm<> + 40(SB)/8, $0x40fb393d3eda3022 40 DATA ·logxm<> + 48(SB)/8, $0x3fd0000000000000 41 DATA ·logxm<> + 56(SB)/8, $0x40fb393969e70000 42 DATA ·logxm<> + 64(SB)/8, $0x3fd11117aafbfe04 43 DATA ·logxm<> + 72(SB)/8, $0x40fb3936eaefafcf 44 DATA ·logxm<> + 80(SB)/8, $0x3fd2492af5e658b2 45 DATA ·logxm<> + 88(SB)/8, $0x40fb39343ff01715 46 DATA ·logxm<> + 96(SB)/8, $0x3fd3b50c622a43dd 47 DATA ·logxm<> + 104(SB)/8, $0x40fb39315adae2f3 48 DATA ·logxm<> + 112(SB)/8, $0x3fd56bbeea918777 49 DATA ·logxm<> + 120(SB)/8, $0x40fb392e21698552 50 GLOBL ·logxm<> + 0(SB), RODATA, $128 51 52 // Log returns the natural logarithm of the argument. 53 // 54 // Special cases are: 55 // Log(+Inf) = +Inf 56 // Log(0) = -Inf 57 // Log(x < 0) = NaN 58 // Log(NaN) = NaN 59 // The algorithm used is minimax polynomial approximation using a table of 60 // polynomial coefficients determined with a Remez exchange algorithm. 61 62 TEXT ·logAsm(SB), NOSPLIT, $0-16 63 FMOVD x+0(FP), F0 64 MOVD $·logrodataL21<>+0(SB), R9 65 MOVH $0x8006, R4 66 LGDR F0, R1 67 MOVD $0x3FF0000000000000, R6 68 SRAD $48, R1, R1 69 MOVD $0x40F03E8000000000, R8 70 SUBW R1, R4 71 RISBGZ $32, $59, $0, R4, R2 72 RISBGN $0, $15, $48, R2, R6 73 RISBGN $16, $31, $32, R2, R8 74 MOVW R1, R7 75 CMPBGT R7, $22, L17 76 LTDBR F0, F0 77 MOVD $·logx43f<>+0(SB), R1 78 FMOVD 0(R1), F2 79 BLEU L3 80 MOVH $0x8005, R12 81 MOVH $0x8405, R0 82 BR L15 83 L7: 84 LTDBR F0, F0 85 BLEU L3 86 L15: 87 FMUL F2, F0 88 LGDR F0, R1 89 SRAD $48, R1, R1 90 SUBW R1, R0, R2 91 SUBW R1, R12, R3 92 BYTE $0x18 //lr %r4,%r2 93 BYTE $0x42 94 ANDW $0xFFFFFFF0, R3 95 ANDW $0xFFFFFFF0, R2 96 BYTE $0x18 //lr %r5,%r1 97 BYTE $0x51 98 MOVW R1, R7 99 CMPBLE R7, $22, L7 100 RISBGN $0, $15, $48, R3, R6 101 RISBGN $16, $31, $32, R2, R8 102 L2: 103 MOVH R5, R5 104 MOVH $0x7FEF, R1 105 CMPW R5, R1 106 BGT L1 107 LDGR R6, F2 108 FMUL F2, F0 109 RISBGZ $57, $59, $3, R4, R4 110 FMOVD 80(R9), F2 111 MOVD $·logxm<>+0(SB), R7 112 ADD R7, R4 113 FMOVD 72(R9), F4 114 WORD $0xED004000 //madb %f2,%f0,0(%r4) 115 BYTE $0x20 116 BYTE $0x1E 117 FMOVD 64(R9), F1 118 FMOVD F2, F0 119 FMOVD 56(R9), F2 120 WFMADB V0, V2, V4, V2 121 WFMDB V0, V0, V6 122 FMOVD 48(R9), F4 123 WFMADB V0, V2, V4, V2 124 FMOVD 40(R9), F4 125 WFMADB V2, V6, V1, V2 126 FMOVD 32(R9), F1 127 WFMADB V6, V4, V1, V4 128 FMOVD 24(R9), F1 129 WFMADB V6, V2, V1, V2 130 FMOVD 16(R9), F1 131 WFMADB V6, V4, V1, V4 132 MOVD $·logxl1<>+0(SB), R1 133 FMOVD 8(R9), F1 134 WFMADB V6, V2, V1, V2 135 FMOVD 0(R9), F1 136 WFMADB V6, V4, V1, V4 137 FMOVD 8(R4), F1 138 WFMADB V0, V2, V4, V2 139 LDGR R8, F4 140 WFMADB V6, V2, V0, V2 141 WORD $0xED401000 //msdb %f1,%f4,0(%r1) 142 BYTE $0x10 143 BYTE $0x1F 144 MOVD ·logxl2<>+0(SB), R1 145 WORD $0xB3130001 //lcdbr %f0,%f1 146 LDGR R1, F4 147 WFMADB V0, V4, V2, V0 148 L1: 149 FMOVD F0, ret+8(FP) 150 RET 151 L3: 152 LTDBR F0, F0 153 BEQ L20 154 BGE L1 155 BVS L1 156 157 MOVD $·logxnan<>+0(SB), R1 158 FMOVD 0(R1), F0 159 BR L1 160 L20: 161 MOVD $·logxminf<>+0(SB), R1 162 FMOVD 0(R1), F0 163 FMOVD F0, ret+8(FP) 164 RET 165 L17: 166 BYTE $0x18 //lr %r5,%r1 167 BYTE $0x51 168 BR L2