xref: /csrg-svn/old/libm/liboldnm/tan.s (revision 20008)
1*20008Sdist#
2*20008Sdist# Copyright (c) 1980 Regents of the University of California.
3*20008Sdist# All rights reserved.  The Berkeley software License Agreement
4*20008Sdist# specifies the terms and conditions for redistribution.
5*20008Sdist#
6*20008Sdist#	@(#)tan.s	5.1 (Berkeley) 05/08/85
7*20008Sdist#
8*20008Sdist#
920001Sdist# double tan(arg)
1020001Sdist# double arg;
1120001Sdist#method: range reduction to [0,pi/4] followed by polynomial
1220001Sdist# approximation:  Hart&Cheney TAN 4285 D=19.74
1320001Sdist.globl	_tan
1420001Sdist.text
1520001Sdist.align	1
1620001Sdist_tan:
1720001Sdist	.word	0x07c0
1820001Sdist	bispsw	$0xe0
1920001Sdist	clrl	r10	# sign flag, !=0 negate result
2020001Sdist	movd	4(ap),r0
2120001Sdist	jgeq	c1
2220001Sdist	xorw2	$0x8000,r10
2320001Sdist	mnegd	r0,r0
2420001Sdistc1:
2520001Sdist	emodd	fopi,fopix,r0,r2,r6
2620001Sdist	bicl2	$~3,r2
2720001Sdist	caseb	r2,$0,$3
2820001Sdista0:	.word	a1-a0,a2-a0,a3-a0,a4-a0
2920001Sdista2:	subd3	r6,$0d1.0e+0,r6
3020001Sdist	jbr	b1
3120001Sdista3: xorw2	$0x8000,r10
3220001Sdistb1:	bsbb	rtan
3320001Sdist	jneq	b2	# tests final result cmptd in rtan
3420001Sdist	movd	funy,r0
3520001Sdist	jbr	b3
3620001Sdistb2:	divd3	r0,$0d1.0e+0,r0
3720001Sdistb3:	xorw2	r10,r0	# negate result if flag != 0
3820001Sdist	ret
3920001Sdista4:	subd3	r6,$0d1.0e+0,r6
4020001Sdist	xorw2	$0x8000,r10
4120001Sdista1:	bsbb	rtan
4220001Sdist	xorw2	r10,r0
4320001Sdist	ret
4420001Sdistrtan:
4520001Sdist	muld3	r6,r6,r8
4620001Sdist	polyd	r8,$4,pcoef
4720001Sdist	muld2	r0,r6
4820001Sdist	polyd	r8,$3,qcoef
4920001Sdist	divd3	r0,r6,r0
5020001Sdist	rsb
5120001Sdist.data
5220001Sdist.align	2
5320001Sdistfuny:	.double	0d1.7e+38
5420001Sdistpcoef:
5520001Sdist	.double 0d0.33866386426771720960e-4
5620001Sdist	.double 0d0.34225543872410034353e-1
5720001Sdist	.double 0d-0.15506856534832663769e+2
5820001Sdist	.double 0d0.10559709017149531936e+4
5920001Sdist	.double 0d-0.13068202647548256682e+5
6020001Sdistqcoef:
6120001Sdist	.double 0d1.0e+0
6220001Sdist	.double 0d-0.15550331640317099669e+3
6320001Sdist	.double 0d0.47657513629164836989e+4
6420001Sdist	.double 0d-0.16638952389471190018e+5
6520001Sdistfopi:
6620001Sdist	.double 0d1.27323954473516268e+0
6720001Sdistfopix: .byte 0x29
68