xref: /original-bsd/lib/libc/tahoe/gen/urem.s (revision 79cf7955)
1/*
2 * Copyright (c) 1988 Regents of the University of California.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms are permitted
6 * provided that the above copyright notice and this paragraph are
7 * duplicated in all such forms and that any documentation,
8 * advertising materials, and other materials related to such
9 * distribution and use acknowledge that the software was developed
10 * by the University of California, Berkeley.  The name of the
11 * University may not be used to endorse or promote products derived
12 * from this software without specific prior written permission.
13 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
14 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
15 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
16 *
17 * This code is derived from software contributed to Berkeley by
18 * Computer Consoles Inc.
19 */
20
21#if defined(LIBC_SCCS) && !defined(lint)
22	.asciz "@(#)urem.s	1.3 (Berkeley) 06/27/88"
23#endif /* LIBC_SCCS and not lint */
24
25/*
26 * Unsigned remainder.
27 *
28 * urem(dividend, divisor)
29 */
30#include "DEFS.h"
31
32ASENTRY(urem, 0)
33	bitl	$0x80000000,8(fp)	#  if (divisor & 0x80000000){
34	jeql	1f
35	movl	4(fp),r0
36	cmpl	8(fp),r0		#  if (divisor <= dividend )
37	jgtru	2f
38	subl2	8(fp),r0		#       return(dividend-divisor);
392:					#  else return(dividend);}
40	ret
411:
42	clrl	r2			#  return(dividend%divisor);
43	movl	4(fp),r3
44	ediv	8(fp),r2,r1,r0
45	ret
46
47/*
48 * aurem(dividendp, divisor) -- like urem but uses address of dividend.
49 *	Implements %= avoiding side effects in the dividend expression.
50 */
51ASENTRY(aurem, 0)
52	bitl	$0x80000000,8(fp)	#  if (divisor & 0x80000000){
53	jeql	1f
54	movl	*4(fp),r0
55	cmpl	8(fp),r0		#  if (divisor <= dividend )
56	jgtru	2f
57	subl2	8(fp),r0		#       return(dividend-divisor);
58					#  else return(dividend);}
59	jbr	2f
601:
61	clrl	r2			#  return(dividend%divisor);
62	movl	*4(fp),r3
63	ediv	8(fp),r2,r1,r0
642:
65	movl	r0,*4(fp)
66	ret
67