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