xref: /csrg-svn/lib/libc/vax/gen/urem.s (revision 47866)
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