xref: /csrg-svn/old/libm/liboldnm/atan.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#	@(#)atan.s	5.1 (Berkeley) 05/08/85
7*20008Sdist#
8*20008Sdist#
919994Sdist# double atan(arg1); -pi/2 < atan < pi/2
1019994Sdist#double atan2(arg1,arg2); -pi< atan2<pi
1119994Sdist#double arg1,arg2
1219994Sdist#method: range reduction to [sqrt(2)-1,sqrt(2)+1]
1319994Sdist# followed by Hart&Cheney ARCTN 5076 D=17.55
1419994Sdist# J. F. Jarvis August 8, 1978
1519994Sdist.globl	_atan
1619994Sdist.globl	_atan2
1719994Sdist.text
1819994Sdist.align	1
1919994Sdist_atan:
2019994Sdist	.word	0x03c0
2119994Sdist	bispsw	$0xe0
2219994Sdist	movd	4(ap),r0
2319994Sdist	jgtr	a1
2419994Sdist	mnegd	r0,r0	# atan(arg1), arg1<0
2519994Sdist	bsbb	satan
2619994Sdist	mnegd	r0,r0
2719994Sdist	ret
2819994Sdista1:	bsbb	satan	# atan(arg1), arg1>=0
2919994Sdist	ret
3019994Sdist#
3119994Sdist.align	1
3219994Sdist_atan2:
3319994Sdist	.word	0x03c0
3419994Sdist	bispsw	$0xe0
3519994Sdist	movd	4(ap),r0	# atan(arg1/arg2)
3619994Sdist	movd	12(ap),r2
3719994Sdist	addd3	r0,r2,r4
3819994Sdist	cmpd	r0,r4
3919994Sdist	jneq	b1
4019994Sdist	tstd	r0
4119994Sdist	jgeq	b2
4219994Sdist	mnegd	pio2,r0
4319994Sdist	ret
4419994Sdistb2:	movd	pio2,r0
4519994Sdist	ret
4619994Sdist#
4719994Sdistb1:	tstd	r2
4819994Sdist	jgeq	b3
4919994Sdist	divd2	r2,r0
5019994Sdist	jleq	b4
5119994Sdist	bsbb	satan	# arg1<0, arg2<0
5219994Sdist	subd2	pi,r0
5319994Sdist	ret
5419994Sdistb4:	mnegd	r0,r0	# arg1>0, arg2<0
5519994Sdist	bsbb	satan
5619994Sdist	subd3	r0,pi,r0
5719994Sdist	ret
5819994Sdist#
5919994Sdistb3:	divd2	r2,r0
6019994Sdist	jleq	b5
6119994Sdist	bsbb	satan	# arg1>0, arg2>0
6219994Sdist	ret
6319994Sdistb5:	mnegd	r0,r0	# arg1<0, arg2>0
6419994Sdist	bsbb	satan
6519994Sdist	mnegd	r0,r0
6619994Sdist	ret
6719994Sdist#
6819994Sdist.globl	satan
6919994Sdistsatan:	# range reduction on positive arg(r0)
7019994Sdist	cmpd	r0,sq2m1
7119994Sdist	jgeq	c1
7219994Sdist	bsbb	xatan
7319994Sdist	rsb
7419994Sdistc1:	cmpd	r0,sq2p1
7519994Sdist	jleq	c2
7619994Sdist	divd3	r0,$0d1.0e+0,r0
7719994Sdist	bsbb	xatan
7819994Sdist	subd3	r0,pio2,r0
7919994Sdist	rsb
8019994Sdistc2:	addd3	$0d1.0e+0,r0,r2
8119994Sdist	subd2	$0d1.0e+0,r0
8219994Sdist	divd2	r2,r0
8319994Sdist	bsbb	xatan
8419994Sdist	addd2	pio4,r0
8519994Sdist	rsb
8619994Sdist#
8719994Sdistxatan:	# compute arctan(r0) for:sqrt(2)-1<r0<sqrt(2)+1
8819994Sdist# Hart&Cheney ARCTN 5076 is evaluated
8919994Sdist	movd	r0,r8
9019994Sdist	muld3	r0,r0,r6
9119994Sdist	polyd	r6,$4,pcoef
9219994Sdist	muld2	r0,r8
9319994Sdist	polyd	r6,$4,qcoef
9419994Sdist	divd3	r0,r8,r0
9519994Sdist	rsb
9619994Sdist.data
9719994Sdist.align	2
9819994Sdistpcoef:
9919994Sdist	.double 0d0.1589740288482307048e+0
10019994Sdist	.double 0d0.66605790170092626575e+1
10119994Sdist	.double 0d0.40969264832102256374e+2
10219994Sdist	.double 0d0.77477687719204208616e+2
10319994Sdist	.double 0d0.44541340059290680319e+2
10419994Sdistqcoef:
10519994Sdist	.double 0d1.0e+0
10619994Sdist	.double 0d0.15503977551421987525e+2
10719994Sdist	.double 0d0.62835930511032376833e+2
10819994Sdist	.double 0d0.92324801072300974840e+2
10919994Sdist	.double 0d0.44541340059290680444e+2
11019994Sdistpio4: .double  0d0.78539816339744830961e+0
11119994Sdistpio2: .double  0d1.57079632679489661923e+0
11219994Sdistsq2p1: .double 0d2.41421356237309504880e+0
11319994Sdistsq2m1: .double 0d0.41421356237309504880e+0
11419994Sdistpi: .double 0d3.14159265358979323846e+0
115