xref: /csrg-svn/sys/tahoe/math/Kmodf.s (revision 24141)
1*24141Ssam
2*24141Ssam
3*24141Ssam/* 	Kmodf.x	4.2	84/02/27	*/
4*24141Ssam
5*24141Ssam/*
6*24141Ssam*  float Kmodf (value, iptr, hfs)
7*24141Ssam*  float value, *iptr;
8*24141Ssam*  int hfs;
9*24141Ssam*
10*24141Ssam*  Modf returns the fractional part of "value",
11*24141Ssam*  and stores the integer part indirectly through "iptr".
12*24141Ssam*/
13*24141Ssam#include	"fp.h"
14*24141Ssam
15*24141Ssam	.text
16*24141Ssam	.globl	_Kmodf
17*24141Ssam_Kmodf:	.word	0x1ffc		/* we use many registers */
18*24141Ssam
19*24141Ssam /*
20*24141Ssam * Some initializations:
21*24141Ssam */
22*24141Ssam	clrl	r3
23*24141Ssam	movl	4(fp),r0	/* fetch operand to r0. */
24*24141Ssam	movl	8(fp),r1
25*24141Ssam	movl	12(fp),r6	/* fetch addr of int to r6. */
26*24141Ssam /*
27*24141Ssam * get exponent
28*24141Ssam */
29*24141Ssam	andl3	$EXPMASK,r0,r2	/* r2 will hold the exponent. */
30*24141Ssam	shrl	$EXPSHIFT,r2,r2
31*24141Ssam	subl2	$BIAS,r2	/* unbias it.  */
32*24141Ssam	jleq	allfrac		/* it's int part is  zero. */
33*24141Ssam	cmpl	r2,$56
34*24141Ssam	jgeq	allint		/* it's fraction part is zero. */
35*24141Ssam /*
36*24141Ssam * get fraction
37*24141Ssam */
38*24141Ssam	movl	r0,r4		/* remember the original number. */
39*24141Ssam	movl	r1,r5
40*24141Ssam	bbc	$31,r0,positive	/* if negative remember it. */
41*24141Ssam	incl	r3
42*24141Ssampositive:
43*24141Ssam				/* clear the non fraction parts. */
44*24141Ssam	andl2	$(0!(EXPMASK | SIGNBIT)),r0
45*24141Ssam				/* add the hidden bit. */
46*24141Ssam	orl2	$(0!CLEARHID),r0
47*24141Ssam
48*24141Ssam	cmpl	r2,$HID_POS	/* see if there are bits to clear only in r0 */
49*24141Ssam	jgtr	in_r1		/* some bytes in r1	*/
50*24141Ssam	jeql	onlyallr0	/* all r0 must be cleared. */
51*24141Ssam	mnegl	r2,r7		/* r7 - loop counter. */
52*24141Ssam	movl	$CLEARHID,r8	/* first bit to clear. */
53*24141Ssam1:
54*24141Ssam	andl2	r8,r0		/* clear int. bits from fraction part. */
55*24141Ssam	shar	$1,r8,r8
56*24141Ssam	aoblss	$0,r7,1b
57*24141Ssam1:
58*24141Ssam	andl2	r8,r4		/* clear frac bits for int calculation: */
59*24141Ssam	shar	$1,r8,r8
60*24141Ssam	cmpl	$0xffffffff,r8
61*24141Ssam	jneq	1b
62*24141Ssam	clrl	r5
63*24141Ssam	jmp	norm
64*24141Ssam
65*24141Ssamonlyallr0:
66*24141Ssam	clrl	r0
67*24141Ssam	clrl	r5
68*24141Ssam	jmp 	norm
69*24141Ssam
70*24141Ssamin_r1:
71*24141Ssam	clrl	r0
72*24141Ssam	subl3	r2,$HID_POS,r7
73*24141Ssam	movl	$0x7fffffff,r8
74*24141Ssam1:
75*24141Ssam	andl2	r8,r1
76*24141Ssam	shar	$1,r8,r8
77*24141Ssam	orl2	$0x80000000,r8
78*24141Ssam	aoblss	$0,r7,1b
79*24141Ssam1:
80*24141Ssam	andl2	r8,r5
81*24141Ssam	shar	$1,r8,r8
82*24141Ssam	cmpl	$0xffffffff,r8
83*24141Ssam	jneq	1b
84*24141Ssamnorm:
85*24141Ssam	addl2	$BIAS,r2	/* fnorm expects it biased. */
86*24141Ssam	pushl	16(fp)		/* hfs */
87*24141Ssam	callf	$8,Kfnorm	/* normelize fraction part. */
88*24141Ssam	cmpl	$0,r0
89*24141Ssam	jeql	1f
90*24141Ssam	bbc	$0,r3,1f
91*24141Ssam	orl2	$0x80000000,r0
92*24141Ssam1:
93*24141Ssam	movl	r4,(r6)		/* put int part in place. */
94*24141Ssam	movl	r5,4(r6)
95*24141Ssam	ret
96*24141Ssam
97*24141Ssamallint:
98*24141Ssam	movl	r0,(r6)		/* copy the argument to the int addr. */
99*24141Ssam	movl	r1,4(r6)
100*24141Ssam	clrl	r0		/* clear the fraction part. */
101*24141Ssam	clrl	r1
102*24141Ssam	ret
103*24141Ssam
104*24141Ssamallfrac:
105*24141Ssam				/* the fraction is ready in r0. */
106*24141Ssam	clrl	(r6)		/* zero the int part. */
107*24141Ssam	clrl	4(r6)
108*24141Ssam	ret
109*24141Ssam
110*24141Ssamret_zero:
111*24141Ssam	clrl	(r6)
112*24141Ssam 	clrl	4(r6)
113*24141Ssam	clrl	r0
114*24141Ssam	clrl	r1
115*24141Ssam	ret
116