xref: /csrg-svn/lib/libc/vax/gen/urem.s (revision 26689)
1#ifdef LIBC_SCCS
2	.asciz	"@(#)urem.s	5.2 (Berkeley) 03/09/86"
3#endif LIBC_SCCS
4
5/*
6 * urem - unsigned remainder for vax-11
7 *
8 * arguments: dividend, divisor
9 * result: remainder
10 * uses r0-r2
11 *
12 * if 1 < divisor <= 2147483647, zero-extend the dividend
13 * to 64 bits and let ediv do the work.  If the divisor is 1,
14 * ediv will overflow if bit 31 of the dividend is on, so
15 * just return 0.  If the divisor is 0, do the ediv also,
16 * so it will generate the proper exception.  All other values
17 * of the divisor have bit 31 on: in this case the remainder
18 * must be the dividend if divisor > dividend, and the dividend
19 * minus the divisor otherwise.  The comparison must be unsigned.
20 */
21#include "DEFS.h"
22
23ASENTRY(urem, 0)
24	movl	4(ap),r0	/* dividend */
25	movl	8(ap),r2	/* divisor */
26	jeql	1f		/* if divisor=0, force exception */
27	cmpl	r2,$1		/* if divisor <= 1 (signed), */
28	jleq	2f		/*  no division is necessary */
291:
30	clrl	r1		/* zero-extend the dividend */
31	ediv	r2,r0,r2,r0	/* divide.  q->r2 (discarded), r->r0 */
32	ret
332:
34	jneq	1f		/* if divisor=1, return 0 */
35	clrl	r0		/*  (because doing the divide will overflow */
36	ret			/*  if the dividend has its high bit on) */
371:
38	cmpl	r0,r2		/* if dividend < divisor (unsigned) */
39	jlssu	1f		/*  remainder is dividend */
40	subl2	r2,r0		/*  else remainder is dividend - divisor */
411:
42	ret
43
44/*
45 * aurem - unsigned remainder for vax-11
46 *
47 * arguments: *dividend, divisor
48 * result: remainder in r0 and *dividend
49 * uses r0-r2
50 */
51#include "DEFS.h"
52
53ASENTRY(aurem, 0)
54	movl	*4(ap),r0	/* dividend */
55	movl	8(ap),r2	/* divisor */
56	jeql	1f		/* if divisor=0, force exception */
57	cmpl	r2,$1		/* if divisor <= 1 (signed), */
58	jleq	2f		/*  no division is necessary */
591:
60	clrl	r1		/* zero-extend the dividend */
61	ediv	r2,r0,r2,r0	/* divide.  q->r2 (discarded), r->r0 */
62	movl	r0,*4(ap)	/* save result */
63	ret
642:
65	jneq	1f		/* if divisor=1, return 0 */
66	clrl	r0		/*  (because doing the divide will overflow */
67	clrl	*4(ap)		/*  if the dividend has its high bit on) */
68	ret
691:
70	cmpl	r0,r2		/* if dividend < divisor (unsigned) */
71	jlssu	1f		/*  remainder is dividend */
72	subl2	r2,r0		/*  else remainder is dividend - divisor */
731:
74	movl	r0,*4(ap)	/* save result */
75	ret
76