|
|
1.1 root 1: / Unsigned long quotient
2:
3: .globl uldiv
4: .globl csv, cret
5: uldiv:
6: jsr r5,csv
7: tst 8.(r5)
8: bne hardldiv
9: mov 10.(r5),r3
10: bmi hardldiv
11: mov 6.(r5),r2
12: mov 4.(r5),r1
13: bmi hardest
14: clr r0
15: div r3,r0
16: mov r0,r4 /high quotient
17: mov r1,r0
18: mov r2,r1
19: div r3,r0
20: bvc 1f
21: sub r3,r0 / this is the clever part
22: div r3,r0
23: tst r1
24: sxt r1
25: add r1,r0 / cannot overflow!
26: 1:
27: mov r0,r1
28: mov r4,r0
29: jmp cret
30:
31: / The divisor is known to be >= 2^15 so only 16 cycles are needed.
32: hardldiv:
33: mov 6.(r5),r2
34: mov 4.(r5),r1
35: clr r0
36: mov 8.(r5),r3
37: mov $16.,r4
38: 1:
39: clc
40: rol r2
41: rol r1
42: rol r0
43: cmp r3,r0
44: bhi 3f
45: blo 2f
46: cmp 10.(r5),r1
47: blos 2f
48: 3:
49: sob r4,1b
50: br 1f
51: 2:
52: sub 10.(r5),r1
53: sbc r0
54: sub r3,r0
55: inc r2
56: sob r4,1b
57: 1:
58: clr r0
59: mov r2,r1
60: jmp cret
61:
62: / The dividend is known to be >= 2^31 so 32 cycles are needed.
63: hardest:
64: mov 6.(r5),r3
65: mov 4.(r5),r2
66: clr r1
67: clr r0
68: mov $32.,r4
69: 1:
70: clc
71: rol r3
72: rol r2
73: rol r1
74: rol r0
75: cmp 8.(r5),r0
76: bhi 3f
77: blo 2f
78: cmp 10.(r5),r1
79: blos 2f
80: 3:
81: sob r4,1b
82: br 1f
83: 2:
84: sub 10.(r5),r1
85: sbc r0
86: sub 8.(r5),r0
87: inc r3
88: sob r4,1b
89: 1:
90: mov r2,r0
91: mov r3,r1
92: jmp cret
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.