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