1 --- src.orig/arisparc.d Thu Dec 6 00:06:32 2007
2 +++ src/arisparc.d Mon Feb 2 15:35:22 2009
5 # extern struct { uint32 lo; uint32 hi; } mulu32_ (uint32 arg1, uint32 arg2);
6 # 2^32*hi+lo := arg1*arg2.
7 -C(mulu32_:) # Input in %o0,%o1, Output in %o0,%g1
8 +C(mulu32_:) # Input in %o0,%o1, Output in %o0,%g3
16 sra %o0,31,%o3 # Wartetakt, nötig z.B. für SUN SPARCstation IPC
20 and %o3,%o1,%o3 # %o3 = (0 falls %o0>=0, %o1 falls %o0<0)
21 - add %o2,%o3,%g1 # hi
22 + add %o2,%o3,%g3 # hi
28 # extern struct { uint32 q; uint32 r; } divu_6432_3232_ (uint32 xhi, uint32 xlo, uint32 y);
29 # x = 2^32*xhi+xlo = q*y+r schreiben. Sei bekannt, dass 0 <= x < 2^32*y .
30 -C(divu_6432_3232_:) # Input in %o0,%o1,%o2, Output in %o0,%g1
31 +C(divu_6432_3232_:) # Input in %o0,%o1,%o2, Output in %o0,%g3
33 # Problem: Is udiv worth using (gmp-2.0.2 doesn't use it) ??
36 nop # wait 2 | processors such as Ross Hypersparc,
37 nop # wait 3 | but not for most of the others.
38 udiv %o1,%o2,%o0 # x durch y dividieren, %o0 := q
39 - umul %o0,%o2,%g1 # %g1 := (q*y) mod 2^32
40 + umul %o0,%o2,%g3 # %g3 := (q*y) mod 2^32
42 - _ sub %o1,%g1,%g1 # %g1 := (xlo-q*y) mod 2^32 = r
43 + _ sub %o1,%g3,%g3 # %g3 := (xlo-q*y) mod 2^32 = r
45 # %o0 = xhi, %o1 = xlo, %o2 = y
46 # Divisions-Einzelschritte:
49 subcc %o3,%o2,%o0 # muss der Quotient nochmals erhöht werden?
53 # Quotient 2 mal erhöhen, Rest %o0
58 Ll02: # kein Additions-Überlauf.
59 # Wegen y>=2^31 muss der Quotient noch höchstens 1 mal erhöht werden:
60 bcs Ll04 # %o0 < %o2 -> Rest %o0 und Quotient %o1 OK
63 Ll03: # Quotient %o1 erhöhen, Rest = %o0-%o2 = %o3
66 Ll04: # Quotient %o1 und Rest %o0 OK
71 # Parallelschiene zu La01..La32:
74 subcc %o0,%o2,%o3 # muss der Quotient nochmals erhöht werden?
78 # Quotient 2 mal erhöhen, Rest %o3
83 Ll05: # kein Additions-Überlauf.
84 # Wegen y>=2^31 muss der Quotient noch höchstens 1 mal erhöht werden:
85 bcs Ll07 # %o3 < %o2 -> Rest %o3 und Quotient %o1 OK
88 Ll06: # Quotient %o1 erhöhen, Rest = %o3-%o2 = %o0
91 Ll07: # Quotient %o1 und Rest %o3 OK
96 Lsmalldiv: # Division durch y < 2^31
98 Lc29: SB0(); SA0(Ld30) # Bit 2 des Quotienten bestimmen
99 Lc30: SB0(); SA0(Ld31) # Bit 1 des Quotienten bestimmen
100 Lc31: SB0(); SA0(Ld32) # Bit 0 des Quotienten bestimmen
101 -Lc32: mov %o0,%g1 # Rest aus %o0 in %g1 abspeichern
102 +Lc32: mov %o0,%g3 # Rest aus %o0 in %g3 abspeichern
104 _ xor %o1,-1,%o0 # Quotient nach %o0
105 # Parallelschiene zu Lc01..Lc32:
107 Ld29: SB1(); SA1(Lc30)
108 Ld30: SB1(); SA1(Lc31)
109 Ld31: SB1(); SA1(Lc32)
110 -Ld32: mov %o3,%g1 # Rest aus %o3 in %g1 abspeichern
111 +Ld32: mov %o3,%g3 # Rest aus %o3 in %g3 abspeichern
113 _ xor %o1,-1,%o0 # Quotient nach %o0
114 Levendiv: # Division durch gerades y.
116 Le30: SB0(); SA0(Lf31) # Bit 1 des Quotienten bestimmen
117 Le31: SB0(); SA0(Lf32) # Bit 0 des Quotienten bestimmen
118 Le32: SB0() # Bit 0 des Restes bestimmen
119 - mov %o0,%g1 # Rest aus %o0 in %g1 abspeichern
120 + mov %o0,%g3 # Rest aus %o0 in %g3 abspeichern
122 _ xor %o1,-1,%o0 # Quotient nach %o0
123 # Parallelschiene zu Le01..Le32:
125 Lf30: SB1(); SA1(Le31)
126 Lf31: SB1(); SA1(Le32)
128 - mov %o3,%g1 # Rest aus %o0 in %g1 abspeichern
129 + mov %o3,%g3 # Rest aus %o0 in %g3 abspeichern
131 _ xor %o1,-1,%o0 # Quotient nach %o0
133 @@ -1205,18 +1205,18 @@
136 # extern uintD add_loop_down (uintD* sourceptr1, uintD* sourceptr2, uintD* destptr, uintC count);
137 -C(add_loop_down:) # Input in %o0,%o1,%o2,%o3, verändert %g1, Output in %o0
138 +C(add_loop_down:) # Input in %o0,%o1,%o2,%o3, verändert %g3, Output in %o0
142 - _ mov %g0,%g1 # Carry := 0
143 + _ mov %g0,%g3 # Carry := 0
145 Ll48: ld [%o0],%o4 # source1-digit
147 ld [%o1],%o5 # source2-digit
148 - subcc %g0,%g1,%g0 # carry
149 + subcc %g0,%g3,%g0 # carry
150 addxcc %o4,%o5,%o4 # addieren
151 - addx %g0,%g0,%g1 # neuer Carry
152 + addx %g0,%g0,%g3 # neuer Carry
154 st %o4,[%o2] # Digit ablegen
156 @@ -1223,12 +1223,12 @@
166 - _ mov %g0,%g1 # Carry := 0
167 + _ mov %g0,%g3 # Carry := 0
170 sll %o3,2,%o3 # %o3 = 4*count
171 @@ -1237,14 +1237,14 @@
172 sub %o2,%o3,%o2 # %o2 = &destptr[-count]
173 Ll48: ld [%o0+%o3],%o4 # source1-digit
174 ld [%o1+%o3],%o5 # source2-digit
175 - subcc %g0,%g1,%g0 # carry
176 + subcc %g0,%g3,%g0 # carry
177 addxcc %o4,%o5,%o4 # addieren
178 - addx %g0,%g0,%g1 # neuer Carry
179 + addx %g0,%g0,%g3 # neuer Carry
182 _ st %o4,[%o2+%o3] # Digit ablegen
188 and %o3,7,%o4 # count mod 8
189 @@ -1257,7 +1257,7 @@
191 jmp %o5 # Sprung nach _add_loop_down+4*(12+4*8-4*(count mod 8))
192 _ subcc %g0,%g0,%g0 # carry löschen
193 -Ll48: subcc %g0,%g1,%g0 # carry
194 +Ll48: subcc %g0,%g3,%g0 # carry
195 ld [%o0+28],%o4 # source1-digit
196 ld [%o1+28],%o5 # source2-digit
197 addxcc %o5,%o4,%o5 # addieren
198 @@ -1290,7 +1290,7 @@
199 ld [%o1],%o5 # source2-digit
200 addxcc %o5,%o4,%o5 # addieren
201 st %o5,[%o2] # Digit ablegen
202 - addx %g0,%g0,%g1 # neuer Carry
203 + addx %g0,%g0,%g3 # neuer Carry
206 subcc %o3,8,%o3 # noch mindestens 8 Digits abzuarbeiten?
207 @@ -1297,7 +1297,7 @@
215 # extern uintD addto_loop_down (uintD* sourceptr, uintD* destptr, uintC count);
216 @@ -1431,18 +1431,18 @@
219 # extern uintD sub_loop_down (uintD* sourceptr1, uintD* sourceptr2, uintD* destptr, uintC count);
220 -C(sub_loop_down:) # Input in %o0,%o1,%o2,%o3, verändert %g1, Output in %o0
221 +C(sub_loop_down:) # Input in %o0,%o1,%o2,%o3, verändert %g3, Output in %o0
225 - _ mov %g0,%g1 # Carry := 0
226 + _ mov %g0,%g3 # Carry := 0
228 Ll55: ld [%o0],%o4 # source1-digit
230 ld [%o1],%o5 # source2-digit
231 - subcc %g0,%g1,%g0 # carry
232 + subcc %g0,%g3,%g0 # carry
233 subxcc %o4,%o5,%o4 # subtrahieren
234 - addx %g0,%g0,%g1 # neuer Carry
235 + addx %g0,%g0,%g3 # neuer Carry
237 st %o4,[%o2] # Digit ablegen
239 @@ -1449,12 +1449,12 @@
249 - _ mov %g0,%g1 # Carry := 0
250 + _ mov %g0,%g3 # Carry := 0
253 sll %o3,2,%o3 # %o3 = 4*count
254 @@ -1463,14 +1463,14 @@
255 sub %o2,%o3,%o2 # %o2 = &destptr[-count]
256 Ll55: ld [%o0+%o3],%o4 # source1-digit
257 ld [%o1+%o3],%o5 # source2-digit
258 - subcc %g0,%g1,%g0 # carry
259 + subcc %g0,%g3,%g0 # carry
260 subxcc %o4,%o5,%o4 # subtrahieren
261 - addx %g0,%g0,%g1 # neuer Carry
262 + addx %g0,%g0,%g3 # neuer Carry
265 _ st %o4,[%o2+%o3] # Digit ablegen
271 and %o3,7,%o4 # count mod 8
272 @@ -1483,7 +1483,7 @@
274 jmp %o5 # Sprung nach _sub_loop_down+4*(12+4*8-4*(count mod 8))
275 _ subcc %g0,%g0,%g0 # carry löschen
276 -Ll55: subcc %g0,%g1,%g0 # carry
277 +Ll55: subcc %g0,%g3,%g0 # carry
278 ld [%o0+28],%o4 # source1-digit
279 ld [%o1+28],%o5 # source2-digit
280 subxcc %o4,%o5,%o4 # subtrahieren
281 @@ -1516,7 +1516,7 @@
282 ld [%o1],%o5 # source2-digit
283 subxcc %o4,%o5,%o4 # subtrahieren
284 st %o4,[%o2] # Digit ablegen
285 - addx %g0,%g0,%g1 # neuer Carry
286 + addx %g0,%g0,%g3 # neuer Carry
289 subcc %o3,8,%o3 # noch mindestens 8 Digits abzuarbeiten?
290 @@ -1523,22 +1523,22 @@
298 # extern uintD subx_loop_down (uintD* sourceptr1, uintD* sourceptr2, uintD* destptr, uintC count, uintD carry);
299 -C(subx_loop_down:) # Input in %o0,%o1,%o2,%o3,%o4, verändert %g1, Output in %o0
300 +C(subx_loop_down:) # Input in %o0,%o1,%o2,%o3,%o4, verändert %g3, Output in %o0
304 - _ mov %o4,%g1 # Carry
305 + _ mov %o4,%g3 # Carry
307 Ll57: ld [%o0],%o4 # source1-digit
309 ld [%o1],%o5 # source2-digit
310 - subcc %g0,%g1,%g0 # carry
311 + subcc %g0,%g3,%g0 # carry
312 subxcc %o4,%o5,%o4 # subtrahieren
313 - addx %g0,%g0,%g1 # neuer Carry
314 + addx %g0,%g0,%g3 # neuer Carry
316 st %o4,[%o2] # Digit ablegen
318 @@ -1545,12 +1545,12 @@
328 - _ mov %o4,%g1 # Carry
329 + _ mov %o4,%g3 # Carry
332 sll %o3,2,%o3 # %o3 = 4*count
333 @@ -1559,27 +1559,27 @@
334 sub %o2,%o3,%o2 # %o2 = &destptr[-count]
335 Ll57: ld [%o0+%o3],%o4 # source1-digit
336 ld [%o1+%o3],%o5 # source2-digit
337 - subcc %g0,%g1,%g0 # carry
338 + subcc %g0,%g3,%g0 # carry
339 subxcc %o4,%o5,%o4 # subtrahieren
340 - addx %g0,%g0,%g1 # neuer Carry
341 + addx %g0,%g0,%g3 # neuer Carry
344 _ st %o4,[%o2+%o3] # Digit ablegen
350 and %o3,7,%o5 # count mod 8
352 - sub %o0,%g1,%o0 # %o0 = &sourceptr1[-(count mod 8)]
353 - sub %o1,%g1,%o1 # %o1 = &sourceptr2[-(count mod 8)]
354 - sub %o2,%g1,%o2 # %o2 = &destptr[-(count mod 8)]
356 + sub %o0,%g3,%o0 # %o0 = &sourceptr1[-(count mod 8)]
357 + sub %o1,%g3,%o1 # %o1 = &sourceptr2[-(count mod 8)]
358 + sub %o2,%g3,%o2 # %o2 = &destptr[-(count mod 8)]
360 - set _subx_loop_down+176,%g1
362 - jmp %g1 # Sprung nach _subx_loop_down+4*(12+4*8-4*(count mod 8))
363 + set _subx_loop_down+176,%g3
365 + jmp %g3 # Sprung nach _subx_loop_down+4*(12+4*8-4*(count mod 8))
366 _ subcc %g0,%o4,%g0 # carry initialisieren
367 -Ll57: subcc %g0,%g1,%g0 # carry
368 +Ll57: subcc %g0,%g3,%g0 # carry
369 ld [%o0+28],%o4 # source1-digit
370 ld [%o1+28],%o5 # source2-digit
371 subxcc %o4,%o5,%o4 # subtrahieren
372 @@ -1612,7 +1612,7 @@
373 ld [%o1],%o5 # source2-digit
374 subxcc %o4,%o5,%o4 # subtrahieren
375 st %o4,[%o2] # Digit ablegen
376 - addx %g0,%g0,%g1 # neuer Carry
377 + addx %g0,%g0,%g3 # neuer Carry
380 subcc %o3,8,%o3 # noch mindestens 8 Digits abzuarbeiten?
381 @@ -1619,7 +1619,7 @@
389 # extern uintD subfrom_loop_down (uintD* sourceptr, uintD* destptr, uintC count);
390 @@ -1831,10 +1831,10 @@
393 # extern uintD shiftleft_loop_down (uintD* ptr, uintC count, uintC i, uintD carry);
394 -C(shiftleft_loop_down:) # Input in %o0,%o1,%o2,%o3, verändert %g1, Output in %o0
395 +C(shiftleft_loop_down:) # Input in %o0,%o1,%o2,%o3, verändert %g3, Output in %o0
398 - _ sub %g0,%o2,%g1 # 32-i (mod 32)
399 + _ sub %g0,%o2,%g3 # 32-i (mod 32)
401 Ll71: ld [%o0],%o4 # Digit
403 @@ -1841,7 +1841,7 @@
404 sll %o4,%o2,%o5 # dessen niedere (32-i) Bits
405 or %o3,%o5,%o5 # mit dem alten Carry kombinieren
406 st %o5,[%o0] # Digit ablegen
407 - srl %o4,%g1,%o3 # dessen höchste i Bits liefern den neuen Carry
408 + srl %o4,%g3,%o3 # dessen höchste i Bits liefern den neuen Carry
412 @@ -1848,11 +1848,11 @@
415 # extern uintD shiftleftcopy_loop_down (uintD* sourceptr, uintD* destptr, uintC count, uintC i);
416 -C(shiftleftcopy_loop_down:) # Input in %o0,%o1,%o2,%o3, verändert %g1,%g2, Output in %o0
417 +C(shiftleftcopy_loop_down:) # Input in %o0,%o1,%o2,%o3, verändert %g3,%g2, Output in %o0
420 _ mov 0,%o4 # Carry := 0
421 - sub %g0,%o3,%g1 # 32-i (mod 32)
422 + sub %g0,%o3,%g3 # 32-i (mod 32)
424 Ll73: ld [%o0],%o5 # Digit
426 @@ -1860,7 +1860,7 @@
427 or %o4,%g2,%g2 # mit dem alten Carry kombinieren
429 st %g2,[%o1] # Digit ablegen
430 - srl %o5,%g1,%o4 # dessen höchste i Bits liefern den neuen Carry
431 + srl %o5,%g3,%o4 # dessen höchste i Bits liefern den neuen Carry
435 @@ -1883,17 +1883,17 @@
438 # extern uintD shiftright_loop_up (uintD* ptr, uintC count, uintC i);
439 -C(shiftright_loop_up:) # Input in %o0,%o1,%o2, verändert %g1, Output in %o0
440 +C(shiftright_loop_up:) # Input in %o0,%o1,%o2, verändert %g3, Output in %o0
443 _ or %g0,%g0,%o3 # Carry := 0
444 - sub %g0,%o2,%g1 # 32-i (mod 32)
445 + sub %g0,%o2,%g3 # 32-i (mod 32)
446 Ll77: ld [%o0],%o4 # Digit
448 srl %o4,%o2,%o5 # shiften
449 or %o3,%o5,%o5 # und mit altem Carry kombinieren
450 st %o5,[%o0] # und ablegen
451 - sll %o4,%g1,%o3 # neuer Carry
452 + sll %o4,%g3,%o3 # neuer Carry
456 @@ -1900,12 +1900,12 @@
459 # extern uintD shiftrightsigned_loop_up (uintD* ptr, uintC count, uintC i);
460 -C(shiftrightsigned_loop_up:) # Input in %o0,%o1,%o2, verändert %g1, Output in %o0
461 +C(shiftrightsigned_loop_up:) # Input in %o0,%o1,%o2, verändert %g3, Output in %o0
462 ld [%o0],%o4 # erstes Digit
463 - sub %g0,%o2,%g1 # 32-i (mod 32)
464 + sub %g0,%o2,%g3 # 32-i (mod 32)
465 sra %o4,%o2,%o5 # shiften
466 st %o5,[%o0] # und ablegen
467 - sll %o4,%g1,%o3 # neuer Carry
468 + sll %o4,%g3,%o3 # neuer Carry
472 @@ -1914,7 +1914,7 @@
473 srl %o4,%o2,%o5 # shiften
474 or %o3,%o5,%o5 # und mit altem Carry kombinieren
475 st %o5,[%o0] # und ablegen
476 - sll %o4,%g1,%o3 # neuer Carry
477 + sll %o4,%g3,%o3 # neuer Carry
481 @@ -1921,17 +1921,17 @@
484 # extern uintD shiftrightcopy_loop_up (uintD* sourceptr, uintD* destptr, uintC count, uintC i, uintD carry);
485 -C(shiftrightcopy_loop_up:) # Input in %o0,%o1,%o2,%o3,%o4, verändert %g1,%g2, Output in %o0
486 - sub %g0,%o3,%g1 # 32-i (mod 32)
487 +C(shiftrightcopy_loop_up:) # Input in %o0,%o1,%o2,%o3,%o4, verändert %g3,%g2, Output in %o0
488 + sub %g0,%o3,%g3 # 32-i (mod 32)
491 - _ sll %o4,%g1,%g2 # erster Carry
492 + _ sll %o4,%g3,%g2 # erster Carry
493 Ll81: ld [%o0],%o4 # Digit
495 srl %o4,%o3,%o5 # shiften
496 or %g2,%o5,%o5 # und mit altem Carry kombinieren
497 st %o5,[%o1] # und ablegen
498 - sll %o4,%g1,%g2 # neuer Carry
499 + sll %o4,%g3,%g2 # neuer Carry
503 @@ -1982,7 +1982,7 @@
504 call _mulu32_ # mit digit multiplizieren
506 addcc %l0,%o0,%o0 # und bisherigen Carry addieren
507 - addx %g0,%g1,%l0 # High-Digit gibt neuen Carry
508 + addx %g0,%g3,%l0 # High-Digit gibt neuen Carry
512 @@ -1991,16 +1991,16 @@
516 -C(mulu_loop_down:) # Input in %o0,%o1,%o2,%o3, verändert %g1
517 +C(mulu_loop_down:) # Input in %o0,%o1,%o2,%o3, verändert %g3
519 -Ll87: ld [%o1-4],%g1 # nächstes Digit
520 - # mit digit multiplizieren: %o0 * %g1 -> %o5|%g1
521 +Ll87: ld [%o1-4],%g3 # nächstes Digit
522 + # mit digit multiplizieren: %o0 * %g3 -> %o5|%g3
531 sub %o1,4,%o1 # Wartetakt!
534 @@ -2038,15 +2038,15 @@
543 - addcc %o4,%g1,%g1 # und bisherigen Carry addieren
544 + addcc %o4,%g3,%g3 # und bisherigen Carry addieren
545 addx %g0,%o5,%o4 # High-Digit gibt neuen Carry
549 - _ st %g1,[%o2] # Low-Digit ablegen
550 + _ st %g3,[%o2] # Low-Digit ablegen
552 _ st %o4,[%o2-4] # letzten Carry ablegen
554 @@ -2063,7 +2063,7 @@
556 ld [%i2],%o1 # nächstes dest-digit
557 addcc %l0,%o0,%o0 # und bisherigen Carry addieren
558 - addx %g0,%g1,%l0 # High-Digit gibt neuen Carry
559 + addx %g0,%g3,%l0 # High-Digit gibt neuen Carry
560 addcc %o1,%o0,%o0 # addieren
563 @@ -2150,7 +2150,7 @@
565 ld [%i2],%o1 # nächstes dest-digit
566 addcc %l0,%o0,%o0 # und bisherigen Carry addieren
567 - addx %g0,%g1,%l0 # High-Digit gibt neuen Carry
568 + addx %g0,%g3,%l0 # High-Digit gibt neuen Carry
569 subcc %o1,%o0,%o1 # davon das Low-Digit subtrahieren
572 @@ -2230,16 +2230,16 @@
577 -Ll91: mov %g1,%o0 # Rest als High-Digit
579 +Ll91: mov %g3,%o0 # Rest als High-Digit
580 ld [%i1],%o1 # nächstes Digit als Low-Digit
581 call C(divu_6432_3232_) # zusammen durch digit dividieren
583 - st %o0,[%i1] # Quotient ablegen, Rest in %g1
584 + st %o0,[%i1] # Quotient ablegen, Rest in %g3
588 -Ll92: mov %g1,%i0 # Rest als Ergebnis
589 +Ll92: mov %g3,%i0 # Rest als Ergebnis
593 @@ -2248,17 +2248,17 @@
598 -Ll93: mov %g1,%o0 # Rest als High-Digit
600 +Ll93: mov %g3,%o0 # Rest als High-Digit
601 ld [%i1],%o1 # nächstes Digit als Low-Digit
602 call C(divu_6432_3232_) # zusammen durch digit dividieren
604 - st %o0,[%i2] # Quotient ablegen, Rest in %g1
605 + st %o0,[%i2] # Quotient ablegen, Rest in %g3
610 -Ll94: mov %g1,%i0 # Rest als Ergebnis
611 +Ll94: mov %g3,%i0 # Rest als Ergebnis