Add audiv() routine similar to vax's.
authorDonn Seeley <donn@ucbvax.Berkeley.EDU>
Sat, 12 Dec 1987 11:05:24 +0000 (03:05 -0800)
committerDonn Seeley <donn@ucbvax.Berkeley.EDU>
Sat, 12 Dec 1987 11:05:24 +0000 (03:05 -0800)
SCCS-vsn: lib/libc/tahoe/gen/udiv.s 1.2

usr/src/lib/libc/tahoe/gen/udiv.s

index d911bde..62b6f7f 100644 (file)
@@ -1,5 +1,5 @@
 #ifdef LIBC_SCCS
 #ifdef LIBC_SCCS
-       .asciz  "@(#)udiv.s     1.1 (Berkeley/CCI) %G%"
+       .asciz  "@(#)udiv.s     1.2 (Berkeley/CCI) %G%"
 #endif LIBC_SCCS
 
 /*
 #endif LIBC_SCCS
 
 /*
@@ -20,8 +20,29 @@ ASENTRY(udiv, 0)
        movl    $1,r0                   #      return(1);}
        ret
 1:
        movl    $1,r0                   #      return(1);}
        ret
 1:
-       clrl    r0                      #  return(dividend/divisor);
-       movl    4(fp),r1
-       ediv    8(fp),r0,r2,r3
-       movl    r2,r0
+       clrl    r2                      #  return(dividend/divisor);
+       movl    4(fp),r3
+       ediv    8(fp),r2,r0,r1
+       ret
+
+/*
+ * audiv(dividendp, divisor) -- like udiv but uses address of dividend.
+ *     Implements /= avoiding side effects in the dividend expression.
+ */
+ASENTRY(audiv, 0)
+       bitl    $0x80000000,8(fp)       #  if (divisor & 0x80000000){
+       jeql    1f                        
+       cmpl    8(fp),*4(fp)            #  if (divisor > dividend )
+       jlequ   2f
+       clrl    r0                      #      return(0);
+       jbr     3f
+2:                                     #  else
+       movl    $1,r0                   #      return(1);}
+       jbr     3f
+1:
+       clrl    r2                      #  return(dividend/divisor);
+       movl    *4(fp),r3
+       ediv    8(fp),r2,r0,r1
+3:
+       movl    r0,*4(fp)
        ret
        ret