Home | History | Annotate | Download | only in math
      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 tanrodataL13<> + 0(SB)/8, $0.181017336383229927e-07
      9 DATA tanrodataL13<> + 8(SB)/8, $-.256590857271311164e-03
     10 DATA tanrodataL13<> + 16(SB)/8, $-.464359274328689195e+00
     11 DATA tanrodataL13<> + 24(SB)/8, $1.0
     12 DATA tanrodataL13<> + 32(SB)/8, $-.333333333333333464e+00
     13 DATA tanrodataL13<> + 40(SB)/8, $0.245751217306830032e-01
     14 DATA tanrodataL13<> + 48(SB)/8, $-.245391301343844510e-03
     15 DATA tanrodataL13<> + 56(SB)/8, $0.214530914428992319e-01
     16 DATA tanrodataL13<> + 64(SB)/8, $0.108285667160535624e-31
     17 DATA tanrodataL13<> + 72(SB)/8, $0.612323399573676480e-16
     18 DATA tanrodataL13<> + 80(SB)/8, $0.157079632679489656e+01
     19 DATA tanrodataL13<> + 88(SB)/8, $0.636619772367581341e+00
     20 GLOBL tanrodataL13<> + 0(SB), RODATA, $96
     21 
     22 // Constants
     23 DATA tanxnan<> + 0(SB)/8, $0x7ff8000000000000
     24 GLOBL tanxnan<> + 0(SB), RODATA, $8
     25 DATA tanxlim<> + 0(SB)/8, $0x432921fb54442d19
     26 GLOBL tanxlim<> + 0(SB), RODATA, $8
     27 DATA tanxadd<> + 0(SB)/8, $0xc338000000000000
     28 GLOBL tanxadd<> + 0(SB), RODATA, $8
     29 
     30 // Tan returns the tangent of the radian argument.
     31 //
     32 // Special cases are:
     33 //      Tan(0) = 0
     34 //      Tan(Inf) = NaN
     35 //      Tan(NaN) = NaN
     36 // The algorithm used is minimax polynomial approximation using a table of
     37 // polynomial coefficients determined with a Remez exchange algorithm.
     38 
     39 TEXT	tanAsm(SB), NOSPLIT, $0-16
     40 	FMOVD	x+0(FP), F0
     41 	//specail case Tan(0) = 0
     42 	FMOVD   $(0.0), F1
     43 	FCMPU   F0, F1
     44 	BEQ     atanIsZero
     45 
     46 	MOVD	$tanrodataL13<>+0(SB), R5
     47 	WORD	$0xB3120000	//ltdbr	%f0,%f0
     48 	BLTU	L10
     49 	FMOVD	F0, F2
     50 L2:
     51 	MOVD	$tanxlim<>+0(SB), R1
     52 	WORD	$0xED201000	//cdb	%f2,0(%r1)
     53 	BYTE	$0x00
     54 	BYTE	$0x19
     55 	BGE	L11
     56 	BVS	L11
     57 	MOVD	$tanxadd<>+0(SB), R1
     58 	FMOVD	88(R5), F6
     59 	FMOVD	0(R1), F4
     60 	WFMSDB	V0, V6, V4, V6
     61 	FMOVD	80(R5), F1
     62 	FADD	F6, F4
     63 	FMOVD	72(R5), F2
     64 	FMSUB	F1, F4, F0
     65 	FMOVD	64(R5), F3
     66 	WFMADB	V4, V2, V0, V2
     67 	FMOVD	56(R5), F1
     68 	WFMADB	V4, V3, V2, V4
     69 	FMUL	F2, F2
     70 	VLEG	$0, 48(R5), V18
     71 	WORD	$0xB3CD0016	//lgdr	%r1,%f6
     72 	FMOVD	40(R5), F5
     73 	FMOVD	32(R5), F3
     74 	FMADD	F1, F2, F3
     75 	FMOVD	24(R5), F1
     76 	FMOVD	16(R5), F7
     77 	FMOVD	8(R5), F0
     78 	WFMADB	V2, V7, V1, V7
     79 	WFMADB	V2, V0, V5, V0
     80 	WFMDB	V2, V2, V1
     81 	FMOVD	0(R5), F5
     82 	WFLCDB	V4, V16
     83 	WFMADB	V2, V5, V18, V5
     84 	WFMADB	V1, V0, V7, V0
     85 	WORD	$0xA7110001	//tmll	%r1,1
     86 	WFMADB	V1, V5, V3, V1
     87 	BNE	L12
     88 	WFDDB	V0, V1, V0
     89 	WFMDB	V2, V16, V2
     90 	WFMADB	V2, V0, V4, V0
     91 	WORD	$0xB3130000	//lcdbr	%f0,%f0
     92 	FMOVD	F0, ret+8(FP)
     93 	RET
     94 L12:
     95 	WFMSDB	V2, V1, V0, V2
     96 	WFMDB	V16, V2, V2
     97 	FDIV	F2, F0
     98 	FMOVD	F0, ret+8(FP)
     99 	RET
    100 L11:
    101 	MOVD	$tanxnan<>+0(SB), R1
    102 	FMOVD	0(R1), F0
    103 	FMOVD	F0, ret+8(FP)
    104 	RET
    105 L10:
    106 	WORD	$0xB3130020	//lcdbr	%f2,%f0
    107 	BR	L2
    108 atanIsZero:
    109 	FMOVD	F0, ret+8(FP)
    110 	RET
    111