1#ifdef LIBC_SCCS 2 .asciz "@(#)divd.s 1.1 (Berkeley/CCI) 07/02/86" 3#endif LIBC_SCCS 4 5#include <tahoemath/fp.h> 6#include "DEFS.h" 7 8#define HIDDEN 23 /* here we count from 0 not from 1 as in fp.h */ 9 10XENTRY(divd, R2|R3|R4|R5|R6|R7|R8|R9) 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 is_res1 23 shrl $EXPSHIFT,r0,r0 24 subl2 $BIAS,r0 25 andl2 $EXPMASK,r2 # compute seconed 'pure'exponent. 26 jeql is_res2 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 callf $4,fnorm 73sign: 741: bbc $0,r3,done 75 orl2 $SIGNBIT,r0 76done: ret 77 78is_res1: 79 bbc $31,4(fp),retz 80 callf $4,fpresop 81 ret 82is_res2: 83 bbc $31,12(fp),z_div 84 callf $4,fpresop 85 ret 86retz: 87 clrl r0 88 clrl r1 89 ret 90underf: 91 callf $4,fpunder 92 ret 93z_div: 94 callf $4,fpzdiv 95 ret 96