atan_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 coefficients and other constants
   8  DATA ·atanrodataL8<> + 0(SB)/8, $0.199999999999554423E+00
   9  DATA ·atanrodataL8<> + 8(SB)/8, $0.111111110136634272E+00
  10  DATA ·atanrodataL8<> + 16(SB)/8, $-.142857142828026806E+00
  11  DATA ·atanrodataL8<> + 24(SB)/8, $-.333333333333330928E+00
  12  DATA ·atanrodataL8<> + 32(SB)/8, $0.769228118888682505E-01
  13  DATA ·atanrodataL8<> + 40(SB)/8, $0.588059263575587687E-01
  14  DATA ·atanrodataL8<> + 48(SB)/8, $-.666641501287528609E-01
  15  DATA ·atanrodataL8<> + 56(SB)/8, $-.909090711945939878E-01
  16  DATA ·atanrodataL8<> + 64(SB)/8, $0.472329433805024762E-01
  17  DATA ·atanrodataL8<> + 72(SB)/8, $0.366935664549587481E-01
  18  DATA ·atanrodataL8<> + 80(SB)/8, $-.422172007412067035E-01
  19  DATA ·atanrodataL8<> + 88(SB)/8, $-.299856214685512712E-01
  20  DATA ·atanrodataL8<> + 96(SB)/8, $0.220852012160300086E-01
  21  DATA ·atanrodataL8<> + 104(SB)/8, $0.726338160757602439E-02
  22  DATA ·atanrodataL8<> + 112(SB)/8, $0.843488472994227321E-03
  23  DATA ·atanrodataL8<> + 120(SB)/8, $0.134893651284712515E-04
  24  DATA ·atanrodataL8<> + 128(SB)/8, $-.525380587584426406E-01
  25  DATA ·atanrodataL8<> + 136(SB)/8, $-.139950258898989925E-01
  26  DATA ·atanrodataL8<> + 144(SB)/8, $-.291935324869629616E-02
  27  DATA ·atanrodataL8<> + 152(SB)/8, $-.154797890856877418E-03
  28  GLOBL ·atanrodataL8<> + 0(SB), RODATA, $160
  29  
  30  DATA ·atanxpi2h<> + 0(SB)/8, $0x3ff330e4e4fa7b1b
  31  DATA ·atanxpi2h<> + 8(SB)/8, $0xbff330e4e4fa7b1b
  32  DATA ·atanxpi2h<> + 16(SB)/8, $0x400330e4e4fa7b1b
  33  DATA ·atanxpi2h<> + 24(SB)/4, $0xc00330e4e4fa7b1b
  34  GLOBL ·atanxpi2h<> + 0(SB), RODATA, $32
  35  DATA ·atanxpim<> + 0(SB)/8, $0x3ff4f42b00000000
  36  GLOBL ·atanxpim<> + 0(SB), RODATA, $8
  37  DATA ·atanxmone<> + 0(SB)/8, $-1.0
  38  GLOBL ·atanxmone<> + 0(SB), RODATA, $8
  39  
  40  // Atan returns the arctangent, in radians, of the argument.
  41  //
  42  // Special cases are:
  43  //      Atan(±0) = ±0
  44  //      Atan(±Inf) = ±Pi/2Pi
  45  // The algorithm used is minimax polynomial approximation
  46  // with coefficients determined with a Remez exchange algorithm.
  47  
  48  TEXT	·atanAsm(SB), NOSPLIT, $0-16
  49  	FMOVD	x+0(FP), F0
  50  	//special case Atan(±0) = ±0
  51  	FMOVD   $(0.0), F1
  52  	FCMPU   F0, F1
  53  	BEQ     atanIsZero
  54  
  55  	MOVD	$·atanrodataL8<>+0(SB), R5
  56  	MOVH	$0x3FE0, R3
  57  	LGDR	F0, R1
  58  	RISBGNZ	$32, $63, $32, R1, R1
  59  	RLL	$16, R1, R2
  60  	ANDW	$0x7FF0, R2
  61  	MOVW	R2, R6
  62  	MOVW	R3, R7
  63  	CMPUBLE	R6, R7, L6
  64  	MOVD	$·atanxmone<>+0(SB), R3
  65  	FMOVD	0(R3), F2
  66  	WFDDB	V0, V2, V0
  67  	RISBGZ	$63, $63, $33, R1, R1
  68  	MOVD	$·atanxpi2h<>+0(SB), R3
  69  	MOVWZ	R1, R1
  70  	SLD	$3, R1, R1
  71  	WORD	$0x68813000	//ld	%f8,0(%r1,%r3)
  72  L6:
  73  	WFMDB	V0, V0, V2
  74  	FMOVD	152(R5), F6
  75  	FMOVD	144(R5), F1
  76  	FMOVD	136(R5), F7
  77  	VLEG	$0, 128(R5), V16
  78  	FMOVD	120(R5), F4
  79  	FMOVD	112(R5), F5
  80  	WFMADB	V2, V4, V6, V4
  81  	WFMADB	V2, V5, V1, V5
  82  	WFMDB	V2, V2, V6
  83  	FMOVD	104(R5), F3
  84  	FMOVD	96(R5), F1
  85  	WFMADB	V2, V3, V7, V3
  86  	MOVH	$0x3FE0, R1
  87  	FMOVD	88(R5), F7
  88  	WFMADB	V2, V1, V7, V1
  89  	FMOVD	80(R5), F7
  90  	WFMADB	V6, V3, V1, V3
  91  	WFMADB	V6, V4, V5, V4
  92  	WFMDB	V6, V6, V1
  93  	FMOVD	72(R5), F5
  94  	WFMADB	V2, V5, V7, V5
  95  	FMOVD	64(R5), F7
  96  	WFMADB	V2, V7, V16, V7
  97  	VLEG	$0, 56(R5), V16
  98  	WFMADB	V6, V5, V7, V5
  99  	WFMADB	V1, V4, V3, V4
 100  	FMOVD	48(R5), F7
 101  	FMOVD	40(R5), F3
 102  	WFMADB	V2, V3, V7, V3
 103  	FMOVD	32(R5), F7
 104  	WFMADB	V2, V7, V16, V7
 105  	VLEG	$0, 24(R5), V16
 106  	WFMADB	V1, V4, V5, V4
 107  	FMOVD	16(R5), F5
 108  	WFMADB	V6, V3, V7, V3
 109  	FMOVD	8(R5), F7
 110  	WFMADB	V2, V7, V5, V7
 111  	FMOVD	0(R5), F5
 112  	WFMADB	V2, V5, V16, V5
 113  	WFMADB	V1, V4, V3, V4
 114  	WFMADB	V6, V7, V5, V6
 115  	FMUL	F0, F2
 116  	FMADD	F4, F1, F6
 117  	FMADD	F6, F2, F0
 118  	MOVW	R2, R6
 119  	MOVW	R1, R7
 120  	CMPUBLE	R6, R7, L1
 121  	MOVD	$·atanxpim<>+0(SB), R1
 122  	WORD	$0xED801000	//madb	%f0,%f8,0(%r1)
 123  	BYTE	$0x00
 124  	BYTE	$0x1E
 125  L1:
 126  atanIsZero:
 127  	FMOVD	F0, ret+8(FP)
 128  	RET
 129