1#ifdef LIBC_SCCS 2 .asciz "@(#)fnorm.s 1.1 (Berkeley/CCI) 07/02/86" 3#endif LIBC_SCCS 4 5#include <tahoemath/fp.h> 6#include "DEFS.h" 7 8ENTRY(fnorm, R2|R3|R4|R5|R6) 9 movl r0,r4 # copy to temporary. 10 jneq inr0 11 movl r1,r5 12 clrl r3 # r3 - pos of m.s.b 13inr1: ffs r5,r6 14 incl r6 15 addl2 r6,r3 16 shrl r6,r5,r5 17 jneq inr1 18 cmpl $0,r3 19 jeql retzero 20 jmp cmpshift 21inr0: movl $32,r3 22inr00: ffs r4,r6 23 incl r6 24 addl2 r6,r3 25 shrl r6,r4,r4 26 jneq inr00 27 28cmpshift: 29 # compute the shift (r4). 30 subl3 r3,$HID_R0R1,r4 31 jlss shiftr # if less then zero we shift right. 32 shlq r4,r0,r0 # else we shift left. 33 subl2 r4,r2 # uodate exponent. 34 jleq underflow # if less then 0 (biased) it is underflow. 35 jmp combine # go to combine exponent and fraction. 36shiftr: 37 mnegl r4,r4 38 shrq r4,r0,r0 # shift right. 39 addl2 r4,r2 # update exponent 40 cmpl r2,$256 41 jgeq overflow # check for overflow. 42combine: 43 andl2 $CLEARHID,r0 # clear the hidden bit. 44 shal $EXPSHIFT,r2,r2 # shift the exponent to its proper place. 45 orl2 r2,r0 46 ret 47 48underflow: 49 callf $4,fpunder 50 ret 51 52overflow: 53 callf $4,fpover 54 ret 55retzero: 56 clrl r0 57 clrl r1 58 ret 59