xref: /original-bsd/sys/tahoe/math/Ksqrtf.s (revision f052b07a)
1/*	Ksqrtf.s	1.3	86/01/05	*/
2
3#include "../tahoe/SYS.h"
4
5	.text
6ENTRY(Ksqrtf, 0)
7	subl3	$76,fp,sp
8	tstl	4(fp)			# if (arg <= 0.) {
9	jgtr	L18
10	jgeq	L19			# if (arg < 0.)
11L19:	clrl	r1
12	clrl	r0
13	ret				# return(0.);}
14L18:
15	pushl	20(fp)			# hfs
16	subl3	$72,fp,-(sp)
17	pushl	8(fp)
18	pushl	4(fp)
19	callf	$20,_Kfrexpf
20	clrl	-60+4(fp)
21	movl	r0,-60(fp)		# x = frexp(arg,&exp);
22	jbr	L20
23L2000001:
24	pushl	20(fp)			# hfs
25	ldd	two
26	pushd
27	ldd	-60(fp)
28	pushd
29	callf	$24,_Kmuld		# x * 2
30	ldd	r0
31	std	-60(fp)			# x *= 2;
32	decl	-72(fp)			# exp--;}
33L20:	cmpd2	-60(fp),half		# while(x < 0.5){
34	jlss	L2000001
35	bitl	$1,-72(fp)		# if(exp & 1) {
36	jeql	L24
37	pushl	20(fp)			# hfs
38	ldd	two
39	pushd
40	ldd	-60(fp)
41	pushd
42	callf	$24,_Kmuld		# x * 2
43	ldd	r0
44	std	-60(fp)			# x *= 2;
45	decl	-72(fp)			# exp--;}
46L24:	pushl	20(fp)			# hfs
47	ldd	-60(fp)
48	pushd
49	ldd	one
50	pushd
51	callf	$24,_Kaddd		# (1.0+x)
52	pushl	20(fp)			# hfs
53	ldd	r0
54	pushd
55	ldd	half
56	pushd
57	callf	$24,_Kmuld
58	ldd	r0
59	std	-68(fp)			 # temp=0.5*(1.0+x);
60	jbr	L28
61L2000003:
62	pushl	20(fp)			# hfs
63	ldd	big
64	pushd
65	ldd	-68(fp)
66	pushd
67	callf	$24,_Kmuld		# temp*(1L<<30)
68	ldd	r0
69	std	-68(fp)			# temp *=(1L<<30);
70	subl2	$60,-72(fp)		# exp -= 60;}
71L28:	cmpl	-72(fp),$60		# while(exp > 60){
72	jleq	L31
73	jbr	L2000003
74L2000005:
75	pushl	20(fp)			# hfs
76	ldd	big
77	pushd
78	ldd	-68(fp)
79	pushd
80	callf	$24,_Kdivd
81	ldd	r0
82	std	-68(fp)			# temp /= (1L<<30);
83	addl2	$60,-72(fp)		# exp +=60;}
84L31:	cmpl	-72(fp),$-60		# while(exp < -60) {
85	jlss	L2000005
86	tstl	-72(fp)			# if(exp >=0)
87	jlss	L34
88	divl3	$2,-72(fp),r0
89	shll	r0,$1,r0
90	pushl	20(fp)			# hfs
91	pushl	$0
92	pushl	r0
93	pushl	$0
94	pushl	$0
95	callf	$24,_Kcvtld
96	pushl	20(fp)			# hfs
97	ldd	r0
98	pushd
99	ldd	-68(fp)
100	pushd
101	callf	$24,_Kmuld		# temp * (1L <<(exp/2))
102	jbr	L2000006		# temp *= 1L << (exp/2));
103L34:	mnegl	-72(fp),r0		# -exp
104	divl2	$2,r0			# -exp/2
105	shll	r0,$1,r0
106	pushl	20(fp)			# hfs
107	pushl	$0
108	pushl	r0
109	pushl	$0
110	pushl	$0
111	callf	$24,_Kcvtld
112	pushl	20(fp)			# hfs
113	ldd	r0
114	pushd
115	ldd	-68(fp)
116	pushd
117	callf	$24,_Kdivd		# temp / (1L <<(-exp/2))
118L2000006:
119	ldd	r0
120	std	-68(fp)			# temp (*/)= 1L << (exp/2));
121	clrl	-76(fp)
122L2000008:
123	pushl	20(fp)			# hfs
124	ldd	-68(fp)
125	pushd
126	ldd	4(fp)
127	pushd
128	callf	$24,_Kdivd
129	pushl	20(fp)			# hfs
130	ldd	r0
131	pushd
132	ldd	-68(fp)
133	pushd
134	callf	$24,_Kaddd
135	pushl	20(fp)			# hfs
136	ldd	r0
137	pushd
138	ldd	half
139	pushd
140	callf	$24,_Kmuld
141	ldd	r0
142	std	-68(fp)			# temp=0.5*(temp+arg/temp);
143	aobleq	$3,-76(fp),L2000008
144	ldd	-68(fp)
145	cvdf
146	stf	r0
147	ret
148
149	.data
150	.align	2
151half:	.long	0x40000000, 0x00000000 # .double .5
152two:	.long	0x41000000, 0x00000000 # .double 2
153one:	.long	0x40800000, 0x00000000 # .double 1
154big:	.long	0x4F800000, 0x00000000 # .double (1<<30)
155