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