xref: /original-bsd/lib/libm/vax/sincos.s (revision 2301fdfb)
1# Copyright (c) 1985 Regents of the University of California.
2# All rights reserved.
3#
4# Redistribution and use in source and binary forms are permitted
5# provided that the above copyright notice and this paragraph are
6# duplicated in all such forms and that any documentation,
7# advertising materials, and other materials related to such
8# distribution and use acknowledge that the software was developed
9# by the University of California, Berkeley.  The name of the
10# University may not be used to endorse or promote products derived
11# from this software without specific prior written permission.
12# THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
13# IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
14# WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
15#
16# All recipients should regard themselves as participants in an ongoing
17# research project and hence should feel obligated to report their
18# experiences (good or bad) with these elementary function codes, using
19# the sendbug(8) program, to the authors.
20#
21#	@(#)sincos.s	5.3 (Berkeley) 06/30/88
22#
23	.data
24	.align	2
25_sccsid:
26.asciz	"@(#)sincos.s	1.1 (Berkeley) 8/21/85; 5.3 (ucb.elefunt) 06/30/88"
27
28#  This is the implementation of Peter Tang's double precision
29#  sine and cosine for the VAX using Bob Corbett's argument reduction.
30#
31#  Notes:
32#       under 1,024,000 random arguments testing on [0,2*pi]
33#       sin() observed maximum error = 0.814 ulps
34#       cos() observed maximum error = 0.792 ulps
35#
36# double sin(arg)
37# double arg;
38# method: true range reduction to [-pi/4,pi/4], P. Tang  &  B. Corbett
39# S. McDonald, April 4,  1985
40#
41	.globl	_sin
42	.text
43	.align	1
44
45_sin:	.word	0xffc		# save r2-r11
46	movq	4(ap),r0
47	bicw3	$0x807f,r0,r2
48	beql	1f		# if x is zero or reserved operand then return x
49#
50# Save the PSL's IV & FU bits on the stack.
51#
52	movpsl	r2
53	bicw3	$0xff9f,r2,-(sp)
54#
55# Clear the IV & FU bits.
56#
57	bicpsw	$0x0060
58#
59#  Entered by  sine    ; save  0  in  r4 .
60#
61	jsb	libm$argred
62	movl	$0,r4
63	jsb	libm$sincos
64	bispsw	(sp)+
651:	ret
66
67#
68# double cos(arg)
69# double arg;
70# method: true range reduction to [-pi/4,pi/4], P. Tang  &  B. Corbett
71# S. McDonald, April 4,  1985
72#
73	.globl	_cos
74	.text
75	.align	1
76
77_cos:	.word	0xffc		# save r2-r11
78	movq	4(ap),r0
79	bicw3	$0x7f,r0,r2
80	cmpw	$0x8000,r2
81	beql	1f		# if x is reserved operand then return x
82#
83# Save the PSL's IV & FU bits on the stack.
84#
85	movpsl	r2
86	bicw3	$0xff9f,r2,-(sp)
87#
88# Clear the IV & FU bits.
89#
90	bicpsw	$0x0060
91#
92#  Entered by  cosine  ; save  1  in  r4 .
93#
94	jsb	libm$argred
95	movl	$1,r4
96	jsb	libm$sincos
97	bispsw	(sp)+
981:	ret
99