Skip to content

Commit 3d69ce4

Browse files
calc84maniacmateoconlechuga
authored andcommitted
Optimize 48-bit multiplication
1 parent c6ba15c commit 3d69ce4

File tree

1 file changed

+90
-152
lines changed

1 file changed

+90
-152
lines changed

src/crt/i48mulu.src

Lines changed: 90 additions & 152 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,6 @@
1414
__i48mulu:
1515
;backup af
1616
push af
17-
18-
;backup interrupt
19-
ld a, i ; P = IEF2
20-
di
21-
push af
22-
2317
push ix
2418
ld ix, 0
2519
add ix, sp
@@ -30,20 +24,13 @@ __i48mulu:
3024
push iy
3125
push bc
3226

33-
; load ude:uhl into ude':ubc, load uiy:ubc into uhl':ubc'
34-
35-
ld bc, (ix-6) ; bc = hl, b[0], b[1], b[2]
36-
exx
37-
ld hl, (ix-3) ; hl' = iy, b[3], b[4], b[5]
38-
ld de, (ix-9) ; de' = de, a[3], a[4], a[5]
39-
ld bc, (ix-12) ; bc' = bc, a[0], a[1], a[2]
40-
exx
41-
27+
; bc = a[0], a[1]
28+
ld a, l ; a = b[0]
29+
ld iy, (ix-5) ; iy = b[1], b[2]
4230

43-
ld de, 0
44-
push de ; sum overflow
45-
push de ; upper bytes of sum at -15
46-
push de ; lower bytes of sum at -18
31+
or a, a
32+
sbc hl, hl
33+
push hl ; upper bytes of sum at -15
4734
;Stack Use:
4835
; ix-1 : deu b[5]
4936
; ix-2 : d b[4]
@@ -57,221 +44,172 @@ __i48mulu:
5744
; ix-10: bcu a[2]
5845
; ix-11: b a[1]
5946
; ix-12: c a[0]
60-
; ix-13: overflow
61-
; ix-14: overflow
62-
; ix-15: overflow
63-
; ix-16: sum[5]
64-
; ix-17: sum[4]
65-
; ix-18: sum[3]
66-
; ix-19: sum[2]
67-
; ix-20: sum[1]
68-
; ix-21: sum[0]
47+
; ix-13: sum[5]
48+
; ix-14: sum[4]
49+
; ix-15: sum[3]
50+
; ix-16: sum[2]
51+
; ix-17: sum[1]
52+
; ix-18: sum[0]
6953

7054
; sum[0-1] =============================================================================================================================
7155

72-
exx
73-
ld iyl, c ; iyl = a[0]
74-
ld iyh, b ; iyh = a[1]
75-
exx
76-
7756
; a[0]*b[0]
78-
ld d, iyl ; d = a[0]
79-
ld e, c ; e = b[0]
57+
ld d, c ; d = a[0]
58+
ld e, a ; e = b[0]
8059
mlt de
81-
ld (ix-21), de ; multiplaction result in sum[0-1]
60+
push de ; lower bytes of sum at -18
8261

8362
; sum[1-2] =============================================================================================================================
84-
85-
; a[0]*b[1]
86-
ld hl, (ix-20) ; hl will store current partial sum
87-
ld d, iyl ; d = a[0]
88-
ld e, b ; e = b[1]
63+
ld l, d ; hl will store current partial sum
64+
65+
; a[1]*b[0]
66+
ld d, b ; d = a[1]
67+
ld e, a ; e = b[0]
8968
mlt de
9069
add hl, de
9170

92-
; a[1]*b[0]
93-
ld d, iyh; d = a[1]
94-
ld e, c ; e = b[0]
71+
; a[0]*b[1]
72+
ld d, c ; d = a[0]
73+
ld e, iyl ; e = b[1]
9574
mlt de
9675
add hl, de
9776

98-
ld (ix-20), hl
77+
ld (ix-17), hl
9978

10079
; sum[2-3] =============================================================================================================================
101-
ld a, (ix-10) ; a = a[2]
102-
ld hl, (ix-19) ; hl will store current partial sum
80+
ld hl, (ix-16) ; hl will store current partial sum
10381

104-
; a[1]*b[1]
105-
ld d, iyh ; d = a[1]
106-
ld e, b ; e = b[1]
82+
; a[0]*b[2]
83+
ld d, c ; d = a[0]
84+
ld e, iyh ; e = b[2]
10785
mlt de
10886
add hl, de
10987

110-
; a[2]*b[0]
111-
ld d, a ; d = a[2]
112-
ld e, c ; e = b[0]
88+
; a[1]*b[1]
89+
ld d, b ; d = a[1]
90+
ld e, iyl ; e = b[1]
11391
mlt de
11492
add hl, de
11593

116-
; a[0]*b[2]
117-
ld d, iyl ; d = a[0]
118-
ld e, (ix-4) ; e = b[2]
94+
; a[2]*b[0]
95+
ld d, (ix-10) ; d = a[2]
96+
ld e, a ; e = b[0]
11997
mlt de
12098
add hl, de
12199

122-
ld (ix-19), hl
100+
ld (ix-16), hl
123101

124102
; sum[3-4] =============================================================================================================================
125-
ld hl, (ix-18) ; hl will store current partial sum
103+
ld hl, (ix-15) ; hl will store current partial sum
126104

127-
; a[2]*b[1]
128-
ld d, a ; d = a[2]
129-
ld e, b ; e = b[1]
105+
; a[0]*b[3]
106+
ld d, c ; d = a[0]
107+
ld e, (ix-3) ; e = b[3]
130108
mlt de
131109
add hl, de
132110

133111
; a[1]*b[2]
134-
ld d, iyh ; d = a[1]
135-
ld e, (ix-4) ; e = b[2]
112+
ld d, b ; d = a[1]
113+
ld e, iyh ; e = b[2]
136114
mlt de
137115
add hl, de
138116

139-
ld a, iyl ; a = a[0]
140-
141-
exx
142-
ld iyl, e ; iyl = a[3]
143-
ex de, hl
144-
; hl' = a[3], a[4], a[5]
145-
; de' = b[3], b[4], b[5]
146-
ld iyh, e ; iyh = b[3]
147-
exx
148-
149-
; a[3]*b[0]
150-
ld d, iyl ; d = a[3]
151-
ld e, c ; e = b[0]
117+
; a[2]*b[1]
118+
ld d, (ix-10) ; d = a[2]
119+
ld e, iyl ; e = b[1]
152120
mlt de
153121
add hl, de
154122

155-
; a[0]*b[3]
156-
ld d, a ; d = a[0]
157-
ld e, iyh ; e = b[3]
123+
; a[3]*b[0]
124+
ld d, (ix-9) ; d = a[3]
125+
ld e, a ; e = b[0]
158126
mlt de
159127
add hl, de
160128

161-
ld (ix-18), hl
129+
ld (ix-15), hl
162130

163131
; sum [4-5] =============================================================================================================================
164-
ld hl, (ix-17)
132+
ld hl, (ix-14) ; hl will store current partial sum
165133

166-
; a[3]*b[1]
167-
ld d, iyl ; d = a[3]
168-
ld e, b ; e = b[1]
134+
; a[0]*b[4]
135+
ld d, c ; d = a[0]
136+
ld e, (ix-2) ; e = b[4]
169137
mlt de
170138
add hl, de
171139

172-
; a[2]*b[2]
173-
ld d, (ix-10) ; d = a[2]
174-
ld e, (ix-4) ; e = b[2]
140+
; a[1]*b[3]
141+
ld d, b ; d = a[1]
142+
ld e, (ix-3) ; e = b[3]
175143
mlt de
176144
add hl, de
177145

178-
; a[1]*b[3]
179-
exx
180-
ld iyl, b ; iyl = a[1]
181-
ld iyh, e ; iyh = b[3]
182-
exx
183-
ld d, iyl ; d = a[1]
184-
ld e, iyh ; e = b[3]
146+
; a[2]*b[2]
147+
ld d, (ix-10) ; d = a[2]
148+
ld e, iyh ; e = b[2]
185149
mlt de
186150
add hl, de
187151

188-
; a[0]*b[4]
189-
exx
190-
ld iyh, d ; iyh = b[4]
191-
exx
192-
ld d, a ; d = a[0]
193-
ld e, iyh ; e = b[4]
152+
; a[3]*b[1]
153+
ld d, (ix-9) ; d = a[3]
154+
ld e, iyl ; e = b[1]
194155
mlt de
195156
add hl, de
196157

197158
; a[4]*b[0]
198-
exx
199-
ex de, hl
200-
; hl' = b[3], b[4], b[5]
201-
; de' = a[3], a[4], a[5]
202-
ld iyl, d ; iyl = a[4]
203-
ld iyh, e ; iyh = a[3], used later
204-
exx
205-
ld d, iyl ; d = a[4]
206-
ld e, c ; e = b[0]
159+
ld d, (ix-8) ; d = a[4]
160+
ld e, a ; e = b[0]
207161
mlt de
208162
add hl, de
209163

210-
ld (ix-17), hl
164+
ld (ix-14), l
211165

212166
; sum [5] (and overflow) ====================================================================================================================
213-
ld hl, (ix-16)
214-
215-
; a[4]*b[1]
216-
ld d, iyl ; d = a[4]
217-
ld e, b ; e = b[1]
218-
mlt de
219-
add hl, de
220-
221-
; a[3]*b[2]
222-
ld d, iyh ; d = a[3]
223-
ld e, (ix-4) ; e = b[2]
224-
mlt de
225-
add hl, de
226-
227-
; a[5]*b[0]
228-
ld d, (ix-7) ; d = a[5]
229-
ld e, c ; e = b[0]
230-
mlt de
231-
add hl, de
167+
ld l, h ; hl will store current partial sum
232168

233169
; a[0]*b[5]
234-
ld d, a ; d = a[0]
170+
ld d, c ; d = a[0]
235171
ld e, (ix-1) ; e = b[5]
236172
mlt de
237173
add hl, de
238174

175+
; a[1]*b[4]
176+
ld c, (ix-2) ; c = b[4]
177+
mlt bc
178+
add hl, bc
179+
239180
; a[2]*b[3]
240-
exx
241-
ex de, hl
242-
; hl' = a[3], a[4], a[5]
243-
; de' = b[3], b[4], b[5]
244-
ld iyl, e ; iyl = b[3]
245-
ld iyh, d ; iyh = b[4], used later
246-
exx
247-
ld d, (ix-10) ; d = a[2]
248-
ld e, iyl ; e = b[3]
181+
ld bc, (ix-10) ; bc = a[2], a[3]
182+
ld d, c ; d = a[2]
183+
ld e, (ix-3) ; e = b[3]
249184
mlt de
250185
add hl, de
251186

252-
; a[1]*b[4]
253-
exx
254-
ld iyl, b ; iyl = a[1]
255-
exx
256-
ld d, iyl ; d = a[1]
257-
ld e, iyh ; e = b[4]
187+
; a[3]*b[2]
188+
ld c, iyh ; c = b[2]
189+
mlt bc
190+
add hl, bc
191+
192+
; a[4]*b[1]
193+
ld bc, (ix-8) ; bc = a[4], a[5]
194+
ld d, c ; d = a[4]
195+
ld e, iyl ; e = b[1]
258196
mlt de
259197
add hl, de
260198

261-
ld (ix-16), hl
199+
; a[5]*b[0]
200+
ld c, a ; c = b[0]
201+
mlt bc
202+
add hl, bc
203+
204+
ld (ix-13), l
262205

263206
;clean up stack and restore registers
264207
pop hl
265208
pop de
266209
pop bc
267-
pop bc
268210
pop iy
211+
269212
ld sp, ix
270213
pop ix
271-
272-
pop af ; interrupt stuff back, P/V = IEF2
273-
jp po, .skipEI
274-
ei
275-
.skipEI:
276214
pop af
277215
ret

0 commit comments

Comments
 (0)