1/*- 2 * Copyright (c) 1991 The Regents of the University of California. 3 * All rights reserved. 4 * 5 * %sccs.include.redist.c% 6 */ 7 8#if defined(LIBC_SCCS) && !defined(lint) 9 .asciz "@(#)urem.s 5.5 (Berkeley) 04/08/91" 10#endif /* LIBC_SCCS and not lint */ 11 12#include "DEFS.h" 13 14/* 15 * Unsigned modulus, PCC flavor. 16 * urem() takes an ordinary dividend/divisor pair; 17 * aurem() takes a pointer to a dividend and an ordinary divisor. 18 */ 19 20#define DIVIDEND 4(ap) 21#define DIVISOR 8(ap) 22 23ASENTRY(urem,0) 24 movl DIVISOR,r2 25 jlss Leasy # big divisor: settle by comparison 26 movl DIVIDEND,r0 27 jlss Lhard # big dividend: need extended division 28 divl3 r2,r0,r1 # small divisor and dividend: signed modulus 29 mull2 r2,r1 30 subl2 r1,r0 31 ret 32Lhard: 33 clrl r1 34 ediv r2,r0,r1,r0 35 ret 36Leasy: 37 subl3 r2,DIVIDEND,r0 38 jcc Ldifference # if divisor goes in once, return difference 39 movl DIVIDEND,r0 # if divisor is bigger, return dividend 40Ldifference: 41 ret 42 43ASENTRY(aurem,0) 44 movl DIVIDEND,r3 45 movl DIVISOR,r2 46 jlss La_easy # big divisor: settle by comparison 47 movl (r3),r0 48 jlss La_hard # big dividend: need extended division 49 divl3 r2,r0,r1 # small divisor and dividend: signed modulus 50 mull2 r2,r1 51 subl2 r1,r0 52 movl r0,(r3) # leave the value of the assignment in r0 53 ret 54La_hard: 55 clrl r1 56 ediv r2,r0,r1,r0 57 movl r0,(r3) 58 ret 59La_easy: 60 subl3 r2,(r3),r0 61 jcs La_dividend # if divisor is bigger, leave dividend alone 62 movl r0,(r3) # if divisor goes in once, store difference 63 ret 64La_dividend: 65 movl (r3),r0 66 ret 67