xref: /original-bsd/sys/tahoe/math/Ksinfcosf.s (revision abb30312)
1/*-
2 * Copyright (c) 1985 The Regents of the University of California.
3 * All rights reserved.
4 *
5 * This code is derived from software contributed to Berkeley by
6 * Computer Consoles Inc.
7 *
8 * %sccs.include.redist.c%
9 *
10 *	@(#)Ksinfcosf.s	7.1 (Berkeley) 12/06/90
11 */
12
13#include "../tahoe/SYS.h"
14
15	.text
16ENTRY(Kcosf, 0)
17	tstl	4(fp)		# if (arg < 0)
18	jgeq	L23
19	lnd	4(fp)
20	std	4(fp)		# arg = -arg;
21L23:	pushl	20(fp)		# 	hfs
22	pushl	$1
23	pushl	8(fp)
24	pushl	4(fp)
25	callf	$20,_sinus
26	ret			# return(sinus(arg,1));
27
28ENTRY(Ksinf, 0)
29	pushl	20(fp)		# hfs
30	pushl	$0
31	pushl	8(fp)
32	pushl	4(fp)
33	callf	$20,_sinus
34	ret			# return(sinus(arg, 0));
35
36ENTRY(sinus, 0)
37	subl3	$112,fp,sp
38	movl	8(fp),-80(fp)
39	movl	4(fp),-84(fp)	# x = arg;
40	jgeq	L34		# if (x < 0) {
41	lnd	-84(fp)
42	std	-84(fp)		# x = -x;
43	addl2	$2,12(fp)	# quad = quad + 2;}
44L34:	pushl	16(fp)
45	ldd	_twoopi
46	pushd
47	ldd	-84(fp)
48	pushd
49	callf	$24,_Kmuld
50	movl	r1,-88(fp)
51	movl	r0,-84(fp)	# std	-84(fp)	 x = x * twoopi;
52	cmpd2	-84(fp),L36	# if (x > 32764) {
53	jleq	L35
54	pushl	16(fp)		# hfs
55	subl3	$60,fp,-(sp)	# &e
56	pushl	-80(fp)
57	pushl	-84(fp)		# x
58	callf	$20,_Kmodf
59	clrl	-92+4(fp)
60	movl	r0,-92(fp)	# y = modf(x, &e);
61	pushl	16(fp)		# hfs
62	pushl	$0
63	pushl	12(fp)		# quad
64	pushl	$0
65	pushl	$0		# dummy acc
66	callf	$24,_Kcvtld
67	pushl	16(fp)		# hfs
68	pushl	r1
69	pushl	r0 		# pushd	 (double)quad
70	ldd	-60(fp)
71	pushd			# &e
72	callf	$24,_Kaddd
73	movl	r1,-56(fp)
74	movl	r0,-60(fp) 	# std	-60(fp) e = e + quad;
75	pushl	16(fp)		# hfs
76	subl3	$68,fp,-(sp)	# &f
77
78	pushl	16(fp)		# hfs
79	ldd	-60(fp)
80	pushd			# &e
81	ldd	L37
82	pushd			# 0.25
83	callf	$24,_Kmuld
84
85	pushl	r1
86	pushl	r0		# pushd	 0.25 * e
87	callf	$20,_Kmodf	# modf(0.25 * e, &f);
88
89	pushl	16(fp)		# hfs
90	movl	r1,-64(fp)
91	movl	r0,-68(fp)	# ldd	-68(fp)	 &f
92	pushl	r1
93	pushl	r0		# pushd
94	ldd	L38
95	pushd
96	callf	$24,_Kmuld	# 4*f
97				# std	r0
98	pushl	16(fp)		# hfs
99	pushl	r1
100	pushl	r0		# pushd
101	ldd	-60(fp)
102	pushd
103	callf	$24,_Ksubd	# e - 4 * f
104	ldd	r0		# load acc with result of Ksubd
105	cvdl	12(fp)		# quad = (e - 4 * f); }
106	jbr	L39
107L35:	ldd	-84(fp)		# else {
108	cvdl	-96(fp)		# k = x;
109	pushl	16(fp)		# hfs
110	pushl	$0
111	pushl	-96(fp)
112	pushl	$0
113	pushl	$0		# acc
114	callf	$24,_Kcvtld
115				# std	r0
116	pushl	16(fp)		# hfs
117	pushl	r1
118	pushl	r0		# pushd	 (double)k
119	ldd	-84(fp)
120	pushd			# x
121	callf	$24,_Ksubd
122	movl	r1,-88(fp)
123	movl	r0,-92(fp)	# std	-92(fp) y = x - k;
124	addl3	-96(fp),12(fp),r0
125	andl3	$3,r0,12(fp)	# quad = (quad + k) & 03; }
126L39:	bitl	$1,12(fp)	# if (quad & 01)
127	jeql	L40
128	pushl	16(fp)		# hfs
129	ldd	-92(fp)
130	pushd			# y
131	ldd	L41
132	pushd			# 1.0
133	callf	$24,_Ksubd
134	movl	r1,-88(fp)
135	movl	r0,-92(fp)	# std	-92(fp) y = 1 - y;
136L40:	cmpl	12(fp),$1	# if (quad > 1)
137	jleq	L42
138	lnd	-92(fp)
139	std	-92(fp)		# y = -y;
140L42:	pushl	16(fp)		# hfs
141	ldd	-92(fp)
142	pushd
143	pushd
144	callf	$24,_Kmuld	# y*y
145	movl	r1,-72(fp)
146	movl	r0,-76(fp)	# std	-76(fp)	 ysq=y*y;
147
148	pushl	16(fp)		# hfs
149	ldd	-76(fp)
150	pushd
151	ldd	_p4
152	pushd
153	callf	$24,_Kmuld	# p4*ysq
154
155	pushl	16(fp)		# hfs
156	pushl	_p3+4
157	pushl	_p3
158	pushl	r1
159	pushl	r0		# pushd
160	callf	$24,_Kaddd	# p4*ysq+p3
161
162	pushl	16(fp)		# hfs
163	pushl	-72(fp)
164	pushl	-76(fp)
165	pushl	r1
166	pushl	r0		# pushd
167	callf	$24,_Kmuld	# (p4*ysq+p3)*ysq
168
169	pushl	16(fp)		# hfs
170	pushl	_p2+4
171	pushl	_p2
172	pushl	r1
173	pushl	r0		# pushd
174	callf	$24,_Kaddd	# (p4*ysq+p3)*ysq+p2
175
176	pushl	16(fp)		# hfs
177	pushl	-72(fp)
178	pushl	-76(fp)
179	pushl	r1
180	pushl	r0		# pushd
181	callf	$24,_Kmuld	# ((p4*ysq+p3)*ysq+p2)*ysq
182
183	pushl	16(fp)		# hfs
184	pushl	_p1+4
185	pushl	_p1
186	pushl	r1
187	pushl	r0		# pushd
188	callf	$24,_Kaddd	# ((p4*ysq+p3)*ysq+p2)*ysq+p1
189
190	pushl	16(fp)		# hfs
191	pushl	-72(fp)
192	pushl	-76(fp)
193	pushl	r1
194	pushl	r0		# pushd
195	callf	$24,_Kmuld	# (((p4*ysq+p3)*ysq+p2)*ysq+p1)*ysq
196
197	pushl	16(fp)		# hfs
198	pushl	_p0+4
199	pushl	_p0
200	pushl	r1
201	pushl	r0		# pushd
202	callf	$24,_Kaddd	# (((p4*ysq+p3)*ysq+p2)*ysq+p1)*ysq+p0
203
204	pushl	16(fp)		# hfs
205	pushl	-88(fp)
206	pushl	-92(fp)
207	pushl	r1
208	pushl	r0		# pushd
209	callf	$24,_Kmuld	# ((((p4*ysq+p3)*ysq+p2)*ysq+p1)*ysq+p0)*y;
210
211	movl	r1,-100(fp)
212	movl	r0,-104(fp)	# std	-104(fp) temp1
213	ldd	r0
214	cvdf
215	stf	r0
216	ret#1
217
218	.data
219	.align	2
220_twoopi:.long	0x4022F983, 0x6E4E4415 # .double .63661977236758134
221_p0:	.long	0x40C90FDA, 0x90304197 # .double 1.57079631844
222_p1:	.long	0xC0255DE0, 0xB36CEE75 # .double -.645963710599
223_p2:	.long	0x3EA33457, 0xA736E807 # .double .079689678945999999
224_p3:	.long	0xBC992665, 0x5E9A6554 # .double -.0046737666099999999
225_p4:	.long	0x3A1ED7FA, 0xCC54924E # .double .000151485129
226L36:	.long	0x47FFF800, 0x00000000 # .double 32764
227L37:	.long	0x3F800000, 0x00000000 # .double .25
228L38:	.long	0x41800000, 0x00000000 # .double 4
229L41:	.long	0x40800000, 0x00000000 # .double 1
230