n_tan.S revision 1.3
11.3Ssimonb/*	$NetBSD: n_tan.S,v 1.3 1999/07/02 15:37:35 simonb Exp $	*/
21.1Sragge/*
31.1Sragge * Copyright (c) 1985, 1993
41.1Sragge *	The Regents of the University of California.  All rights reserved.
51.1Sragge *
61.1Sragge * Redistribution and use in source and binary forms, with or without
71.1Sragge * modification, are permitted provided that the following conditions
81.1Sragge * are met:
91.1Sragge * 1. Redistributions of source code must retain the above copyright
101.1Sragge *    notice, this list of conditions and the following disclaimer.
111.1Sragge * 2. Redistributions in binary form must reproduce the above copyright
121.1Sragge *    notice, this list of conditions and the following disclaimer in the
131.1Sragge *    documentation and/or other materials provided with the distribution.
141.1Sragge * 3. All advertising materials mentioning features or use of this software
151.1Sragge *    must display the following acknowledgement:
161.1Sragge *	This product includes software developed by the University of
171.1Sragge *	California, Berkeley and its contributors.
181.1Sragge * 4. Neither the name of the University nor the names of its contributors
191.1Sragge *    may be used to endorse or promote products derived from this software
201.1Sragge *    without specific prior written permission.
211.1Sragge *
221.1Sragge * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
231.1Sragge * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
241.1Sragge * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
251.1Sragge * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
261.1Sragge * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
271.1Sragge * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
281.1Sragge * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
291.1Sragge * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
301.1Sragge * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
311.1Sragge * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
321.1Sragge * SUCH DAMAGE.
331.1Sragge *
341.1Sragge *	@(#)tan.s	8.1 (Berkeley) 6/4/93
351.1Sragge */
361.1Sragge
371.3Ssimonb/*  This is the implementation of Peter Tang's double precision
381.1Sragge *  tangent for the VAX using Bob Corbett's argument reduction.
391.3Ssimonb *
401.1Sragge *  Notes:
411.3Ssimonb *       under 1,024,000 random arguments testing on [0,2*pi]
421.1Sragge *       tan() observed maximum error = 2.15 ulps
431.1Sragge *
441.1Sragge * double tan(arg)
451.1Sragge * double arg;
461.1Sragge * method: true range reduction to [-pi/4,pi/4], P. Tang  &  B. Corbett
471.1Sragge * S. McDonald, April 4,  1985
481.1Sragge */
491.1Sragge	.text
501.1Sragge	.align	1
511.2Smatt	.globl	_tan
521.2Smatt	.type	_tan,@function
531.1Sragge
541.1Sragge_tan:	.word	0xffc		# save r2-r11
551.1Sragge	movq	4(ap),r0
561.1Sragge	bicw3	$0x807f,r0,r2
571.1Sragge	beql	1f		# if x is zero or reserved operand then return x
581.1Sragge/*
591.1Sragge * Save the PSL's IV & FU bits on the stack.
601.1Sragge */
611.1Sragge	movpsl	r2
621.1Sragge	bicw3	$0xff9f,r2,-(sp)
631.1Sragge/*
641.1Sragge *  Clear the IV & FU bits.
651.1Sragge */
661.1Sragge	bicpsw	$0x0060
671.1Sragge	jsb	libm$argred
681.1Sragge/*
691.1Sragge *  At this point,
701.1Sragge *	   r0  contains the quadrant number, 0, 1, 2, or 3;
711.1Sragge *	r2/r1  contains the reduced argument as a D-format number;
721.1Sragge *  	   r3  contains a F-format extension to the reduced argument;
731.1Sragge *
741.1Sragge *  Save  r3/r0  so that we can call cosine after calling sine.
751.1Sragge */
761.1Sragge	movq	r2,-(sp)
771.1Sragge	movq	r0,-(sp)
781.1Sragge/*
791.1Sragge *  Call sine.  r4 = 0  implies sine.
801.1Sragge */
811.1Sragge	movl	$0,r4
821.1Sragge	jsb	libm$sincos
831.1Sragge/*
841.1Sragge *  Save  sin(x)  in  r11/r10 .
851.1Sragge */
861.1Sragge	movd	r0,r10
871.1Sragge/*
881.1Sragge *  Call cosine.  r4 = 1  implies cosine.
891.1Sragge */
901.1Sragge	movq	(sp)+,r0
911.1Sragge	movq	(sp)+,r2
921.1Sragge	movl	$1,r4
931.1Sragge	jsb	libm$sincos
941.1Sragge	divd3	r0,r10,r0
951.1Sragge	bispsw	(sp)+
961.1Sragge1:	ret
97