log_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 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  	LCDBR	F1, F0
 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
 169