xref: /original-bsd/sys/tahoe/math/Kdivd.s (revision 262b24ac)
1/*	Kdivd.s	1.3	86/01/05	*/
2
3#include "../tahoemath/fp.h"
4#include "../tahoemath/Kfp.h"
5#include "../tahoe/SYS.h"
6
7#define	HIDDEN	23		# here we count from 0 not from 1 as in fp.h
8
9	.text
10ENTRY(Kdivd, R9|R8|R7|R6|R5|R4|R3|R2)
11	clrl	r3		# r3 - sign: 0 for positive,1 for negative.
12	movl	4(fp),r0
13	jgeq	1f
14	movl	$1,r3
151:	movl	12(fp),r2
16	jgeq	2f
17	bbc	$0,r3,1f	# seconed operand is negative.
18	clrl	r3		# if first was negative, make result positive.
19	jmp	2f
201:	movl	$1,r3		# if first was positive, make result negative.
212:	andl2	$EXPMASK,r0	# compute first 'pure'exponent.
22	jeql	retz
23	shrl	$EXPSHIFT,r0,r0
24	subl2	$BIAS,r0
25	andl2	$EXPMASK,r2	# compute seconed 'pure'exponent.
26	jeql	retz2
27	shrl	$EXPSHIFT,r2,r2
28	subl2	$BIAS,r2
29	subl3	r2,r0,r2	# subtruct the exponents.
30	addl2	$BIAS,r2
31	jleq	underf
32				# normalization can make the exp. smaller.
33 #
34 #	We have the sign in r3,the exponent in r2,now is the time to
35 # 	perform the division...
36 #
37	# fetch dividend. (r4,r5)
38	andl3	$(0!(EXPMASK | SIGNBIT)),4(fp),r4
39	orl2	$(0!CLEARHID),r4
40	movl	8(fp),r5
41
42	# fetch divisor : (r6,r7)
43	andl3	$(0!(EXPMASK | SIGNBIT)),12(fp),r6
44	orl2	$(0!CLEARHID),r6
45	movl	16(fp),r7
46
47	movl	$0,r0		# init r0,r1 to be zeros
48	movl	$0,r1
49	movl	$(0!CLEARHID),r8# r8 first bit to set (if).
50	shll	$1,r8,r8	# to have one more bit,because we might
51				# have to shift left to normelize.
52	movl	$0,r9
53
542:
55	subl2	r7,r5
56	sbwc	r6,r4
57	jgeq	1f
58	addl2	r7,r5
59	adwc	r6,r4
60	shlq	$1,r4,r4
61	shrq	$1,r8,r8
62	jeql	over
63	jmp	2b
641:
65	orl2	r8,r0
66	orl2	r9,r1
67	shlq	$1,r4,r4
68	shrq	$1,r8,r8
69	jneq	2b
70
71over:
72	pushl 	20(fp)
73	callf	$8,_Kfnorm
74sign:
751:	bbc	$0,r3,done
76	orl2	$SIGNBIT,r0
77done:	ret
78
79retz:
80	  clrl	r0
81	  clrl	r1
82	  ret
83
84retz2:	bbc	$31,12(fp),z_div
85	  clrl	r0
86	  clrl	r1
87	  ret
88underf:
89	orl2	$HFS_UNDF,*20(fp)
90	ret
91z_div:
92	orl2	$HFS_DIVZ,*20(fp)
93	ret
94