one too many levels of indirection (from ks@purdue)
[unix-history] / usr / src / lib / libc / vax / gen / udiv.s
CommitLineData
d5a80657
KM
1#ifndef lint
2 .asciz "@(#)udiv.s 5.1 (Berkeley) %G%"
3#endif not lint
43e1c702
BJ
4
5/*
6 * udiv - unsigned division for vax-11
7 *
8 * arguments: dividend, divisor.
9 * result: quotient.
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 the dividend unchanged. If the divisor is 0,
16 * do the ediv also, so it will generate the proper exception.
17 * All other values of the divisor have bit 31 on: in this case
18 * the quotient must be 0 if divisor > dividend, and 1 otherwise,
19 * provided that the comparison is made as unsigned.
20 */
21
22#include "DEFS.h"
23
dadab5a2 24ASENTRY(udiv, 0)
43e1c702
BJ
25 movl 4(ap),r0 /* dividend */
26 movl 8(ap),r2 /* divisor */
27 jeql 1f /* if divisor=0, force exception */
28 cmpl r2,$1 /* if divisor <= 1 (signed), */
29 jleq 2f /* no division is necessary */
301:
31 clrl r1 /* zero-extend the dividend */
32 ediv r2,r0,r0,r2 /* divide. q->r0, r->r2 (discarded) */
33 ret
342:
35 jeql 1f /* if divisor=1, return dividend */
36 cmpl r0,r2 /* unsigned comparison between */
37 jgequ 2f /* dividend and divisor */
38 clrl r0 /* dividend < divisor, return 0 */
39 ret
402:
41 movl $1,r0 /* dividend >= divisor, return 1 */
421:
43 ret
294ae850
RC
44
45/*
46 * audiv - unsigned division for vax-11
47 *
48 * arguments: *dividend, divisor.
49 * result: quotient in r0 and *dividend.
50 * uses r0-r2
51 */
52
53#include "DEFS.h"
54
55ASENTRY(audiv, 0)
56 movl *4(ap),r0 /* dividend */
57 movl 8(ap),r2 /* divisor */
58 jeql 1f /* if divisor=0, force exception */
59 cmpl r2,$1 /* if divisor <= 1 (signed), */
60 jleq 2f /* no division is necessary */
611:
62 clrl r1 /* zero-extend the dividend */
63 ediv r2,r0,r0,r2 /* divide. q->r0, r->r2 (discarded) */
64 movl r0,*4(ap) /* save result */
65 ret
662:
67 jeql 1f /* if divisor=1, return dividend */
68 cmpl r0,r2 /* unsigned comparison between */
69 jgequ 2f /* dividend and divisor */
70 clrl r0 /* dividend < divisor, return 0 */
71 clrl *4(ap) /* save result */
72 ret
732:
74 movl $1,r0 /* dividend >= divisor, return 1 */
751:
76 movl r0,*4(ap) /* save result */
77 ret