xref: /original-bsd/sys/tahoe/math/Kdivf.s (revision 5839a6df)
1
2#include 	"fp.h"
3#include 	"fp_in_krnl.h"
4
5
6 			# here we count from 0 not from 1 as in fp.h
7#define	HIDDEN	23
8
9	.text
10	.globl	_Kdivf	    # _Kdivf(acc_most,acc_least,op_most,op_least,hfs)
11_Kdivf:	.word	0xffc
12	clrl	r1
13	clrl	r3		# r3 - sign: 0 for positive,1 for negative.
14	movl	4(fp),r0
15	jgeq	1f
16	movl	$1,r3
171:	movl	12(fp),r2
18	jgeq	2f
19	bbc	$0,r3,1f	# seconed operand is negative.
20	clrl	r3		# if first was negative, make result positive.
21	jmp	2f
221:	movl	$1,r3		# if first was positive, make result negative.
232:	andl2	$EXPMASK,r0	# compute first 'pure'exponent.
24	jeql	retz
25	shrl	$EXPSHIFT,r0,r0
26	subl2	$BIAS,r0
27	andl2	$EXPMASK,r2	# compute seconed 'pure'exponent.
28	jeql	retz2
29	shrl	$EXPSHIFT,r2,r2
30	subl2	$BIAS,r2
31	subl3	r2,r0,r2	# subtruct the exponents.
32	addl2	$BIAS,r2
33	jleq	underf
34				# normalization can make the exp. smaller.
35 #
36 #	We have the sign in r3,the exponent in r2,now is the time to
37 # 	perform the division...
38 #
39	# fetch dividend. (r0)
40	andl3	$(0!(EXPMASK | SIGNBIT)),4(fp),r0
41	orl2	$(0!CLEARHID),r0
42	clrl	r1
43
44	# fetch divisor : (r6)
45	andl3	$(0!(EXPMASK | SIGNBIT)),12(fp),r6
46	orl2	$(0!CLEARHID),r6
47
48	shll	$2,r6,r6	# make the divisor bigger so we will not
49				# get overflow at the divission.
50	ediv	r6,r0,r0,r7	# quo to r0, rem to r7
51	subl2	$6,r2		# to compensate for: normalization (-24),
52				# ediv (+32), shifting r6 (-2).
53
54over:
55	pushl	20(fp)
56	callf	$8,Kfnorm	# we can use fnorm because we have data
57				# at r1 as well.(sfnorm takes care only
58				# of r0).
59sign:
601:	bbc	$0,r3,done
61	orl2	$SIGNBIT,r0
62done:	ret
63
64retz:
65	clrl	r0
66	ret
67
68retz2:	bbc	$31,12(fp),z_div
69	clrl	r0
70	ret
71
72underf:
73	orl2	$HFS_UNDF,*20(fp)
74	ret
75z_div:
76	orl2	$HFS_DIVZ,*20(fp)
77	ret
78