xref: /original-bsd/sys/vax/vax/urem.s (revision 0fc6f013)
1/*
2 *	@(#)urem.s	6.3 (Berkeley) 06/08/85
3 *
4 *	urem - unsigned remainder for vax-11
5 *
6 *	arguments: dividend, divisor
7 *	result: remainder
8 *	uses r0-r2
9 *
10 *	if 1 < divisor <= 2147483647, zero-extend the dividend
11 *	to 64 bits and let ediv do the work.  If the divisor is 1,
12 *	ediv will overflow if bit 31 of the dividend is on, so
13 *	just return 0.  If the divisor is 0, do the ediv also,
14 *	so it will generate the proper exception.  All other values
15 *	of the divisor have bit 31 on: in this case the remainder
16 *	must be the dividend if divisor > dividend, and the dividend
17 *	minus the divisor otherwise.  The comparison must be unsigned.
18 */
19	.text
20	.align	1
21	.globl	urem
22urem:	.word	0x0000
23#ifdef GPROF
24	jsb	mcount
25#endif GPROF
26	movl	4(ap),r0	# Dividend
27	movl	8(ap),r2	# Divisor
28	jeql	div		# If divisor=0, force exception
29	cmpl	r2,$1		# If divisor <= 1 (signed),
30	jleq	nodiv		#  no division is necessary
31div:	clrl	r1		# Zero-extend the dividend
32	ediv	r2,r0,r2,r0	# Divide.  q->r2 (discarded), r->r0
33	ret
34nodiv:	jneq	nzero		# If divisor=1, return 0
35	clrl	r0		#  (because doing the divide will overflow
36	ret			#  if the dividend has its high bit on)
37nzero:	cmpl	r0,r2		# If dividend < divisor (unsigned)
38	jlssu	retn		#  remainder is dividend
39	subl2	r2,r0		#  else remainder is dividend - divisor
40retn:	ret
41