3 // Compiler: GNU-C oder SUN-C
4 // Parameter-Übergabe: in Registern %o0-%o5.
5 // Einstellungen: intCsize=32, intDsize=32.
7 #ifdef ASM_UNDERSCORE /* SunOS 4 */
8 #if defined(__STDC__) || defined (__cplusplus)
9 #define C(entrypoint) _##entrypoint
11 #define C(entrypoint) _/**/entrypoint
13 #else /* SunOS 5 = Solaris 2 */
14 #define C(entrypoint) entrypoint
17 // When this file is compiled into a shared library, ELF linkers need to
18 // know which symbols are functions.
19 #if defined(__NetBSD__) || defined(__OpenBSD__)
20 #define DECLARE_FUNCTION(name) .type C(name),@function
21 #elif defined(__svr4__) || defined(__ELF__)
22 // Some preprocessors keep the backslash in place, some don't.
23 // Some complain about the # being not in front of an ANSI C macro.
24 // Therefore we use a dollar, which will be sed-converted to # later.
25 #define DECLARE_FUNCTION(name) .type C(name),$function
27 #define DECLARE_FUNCTION(name)
30 // Indikatoren für Anweisungen (Instruktionen) in Delay-Slots
31 // (diese werden VOR der vorigen Instruktion ausgeführt):
32 #define _ // Instruktion, die stets ausgeführt wird
33 #define __ // Instruktion, die nur im Sprung-Fall ausgeführt wird
34 // Abkürzungen für Anweisungen:
35 #define ret jmp %i7+8 // return from subroutine
36 #define retl jmp %o7+8 // return from leaf subroutine (no save/restore)
40 .global C(gf2_mul16),C(gf2_mul32)
42 // extern uint32 gf2_mul16 (uint16 x, uint16 y);
43 DECLARE_FUNCTION(gf2_mul16)
44 C(gf2_mul16:) // Input in %o0,%o1, Output in %o0
48 // 16-bit multiply of x and y
49 // input %o1 = factor1, %o0 = 2^16*factor2, output %o0
100 Lb06: xor %o0,%o1,%o0
103 Lb07: xor %o0,%o1,%o0
106 Lb08: xor %o0,%o1,%o0
109 Lb09: xor %o0,%o1,%o0
112 Lb10: xor %o0,%o1,%o0
115 Lb11: xor %o0,%o1,%o0
118 Lb12: xor %o0,%o1,%o0
121 Lb13: xor %o0,%o1,%o0
124 Lb14: xor %o0,%o1,%o0
127 Lb15: xor %o0,%o1,%o0
133 // extern uint32 gf2_mul32 (uint32 x, uint32 y, uint32* plo);
134 DECLARE_FUNCTION(gf2_mul32)
135 C(gf2_mul32:) // Input in %o0,%o1,%o2, Output in [%o2],%o0
138 srl %o4,16,%o4 // %o4 = low16(x)
139 sll %o1,16,%o5 // %o5 = 2^16*low16(y)
140 srl %o0,16,%o0 // %o0 = high16(x)
142 sll %o1,16,%o1 // %o1 = 2^16*high16(y)
143 xor %o1,%o5,%o3 // %o3 = 2^16*(high16(y)+low16(y))
144 // 16-bit multiply of low16(x) and low16(y)
145 // input %o4 = factor1, %o5 = 2^16*factor2, output %o5
181 Ld01: xor %o5,%o4,%o5
184 Ld02: xor %o5,%o4,%o5
187 Ld03: xor %o5,%o4,%o5
190 Ld04: xor %o5,%o4,%o5
193 Ld05: xor %o5,%o4,%o5
196 Ld06: xor %o5,%o4,%o5
199 Ld07: xor %o5,%o4,%o5
202 Ld08: xor %o5,%o4,%o5
205 Ld09: xor %o5,%o4,%o5
208 Ld10: xor %o5,%o4,%o5
211 Ld11: xor %o5,%o4,%o5
214 Ld12: xor %o5,%o4,%o5
217 Ld13: xor %o5,%o4,%o5
220 Ld14: xor %o5,%o4,%o5
223 Ld15: xor %o5,%o4,%o5
226 Ld16: xor %o5,%o4,%o5
227 Ld17: // %o5 = low16(x)*low16(y)
228 // 16-bit multiply of high16(x) and high16(y)
229 // input %o0 = factor1, %o1 = 2^16*factor2, output %o1
265 Lf01: xor %o1,%o0,%o1
268 Lf02: xor %o1,%o0,%o1
271 Lf03: xor %o1,%o0,%o1
274 Lf04: xor %o1,%o0,%o1
277 Lf05: xor %o1,%o0,%o1
280 Lf06: xor %o1,%o0,%o1
283 Lf07: xor %o1,%o0,%o1
286 Lf08: xor %o1,%o0,%o1
289 Lf09: xor %o1,%o0,%o1
292 Lf10: xor %o1,%o0,%o1
295 Lf11: xor %o1,%o0,%o1
298 Lf12: xor %o1,%o0,%o1
301 Lf13: xor %o1,%o0,%o1
304 Lf14: xor %o1,%o0,%o1
307 Lf15: xor %o1,%o0,%o1
310 Lf16: xor %o1,%o0,%o1
311 Lf17: // %o1 = high16(x)*high16(y)
312 xor %o0,%o4,%o4 // %o4 = high16(x)+low16(x)
313 // 16-bit multiply of high16(x)+low16(x) and high16(y)+low16(y)
314 // input %o4 = factor1, %o3 = 2^16*factor2, output %o3
350 Lh01: xor %o3,%o4,%o3
353 Lh02: xor %o3,%o4,%o3
356 Lh03: xor %o3,%o4,%o3
359 Lh04: xor %o3,%o4,%o3
362 Lh05: xor %o3,%o4,%o3
365 Lh06: xor %o3,%o4,%o3
368 Lh07: xor %o3,%o4,%o3
371 Lh08: xor %o3,%o4,%o3
374 Lh09: xor %o3,%o4,%o3
377 Lh10: xor %o3,%o4,%o3
380 Lh11: xor %o3,%o4,%o3
383 Lh12: xor %o3,%o4,%o3
386 Lh13: xor %o3,%o4,%o3
389 Lh14: xor %o3,%o4,%o3
392 Lh15: xor %o3,%o4,%o3
395 Lh16: xor %o3,%o4,%o3
396 Lh17: // %o3 = (high16(x)+low16(x))*(high16(y)+low16(y))
397 // Now %o5 = low16(x)*low16(y)
398 // %o1 = high16(x)*high16(y)
399 // %o3 = (high16(x)+low16(x))*(high16(y)+low16(y))
400 // The result is x*y = 2^32*%o1 + 2^16*(%o3+%o1+%o5) + %o5
403 // The result is x*y = 2^32*%o1 + 2^16*%o3 + %o5
405 xor %o0,%o1,%o0 // high 32 bits in %o0
407 xor %o1,%o5,%o1 // low 32 bits in %o1
412 // 32-bit multiply of x and y
413 // input %o1 = factor1, %o0|%o3 = 2^32*factor2, output %o0|%o3
417 Lc01: addxcc %o0,%o0,%o0
420 Lc02: addxcc %o0,%o0,%o0
423 Lc03: addxcc %o0,%o0,%o0
426 Lc04: addxcc %o0,%o0,%o0
429 Lc05: addxcc %o0,%o0,%o0
432 Lc06: addxcc %o0,%o0,%o0
435 Lc07: addxcc %o0,%o0,%o0
438 Lc08: addxcc %o0,%o0,%o0
441 Lc09: addxcc %o0,%o0,%o0
444 Lc10: addxcc %o0,%o0,%o0
447 Lc11: addxcc %o0,%o0,%o0
450 Lc12: addxcc %o0,%o0,%o0
453 Lc13: addxcc %o0,%o0,%o0
456 Lc14: addxcc %o0,%o0,%o0
459 Lc15: addxcc %o0,%o0,%o0
462 Lc16: addxcc %o0,%o0,%o0
465 Lc17: addxcc %o0,%o0,%o0
468 Lc18: addxcc %o0,%o0,%o0
471 Lc19: addxcc %o0,%o0,%o0
474 Lc20: addxcc %o0,%o0,%o0
477 Lc21: addxcc %o0,%o0,%o0
480 Lc22: addxcc %o0,%o0,%o0
483 Lc23: addxcc %o0,%o0,%o0
486 Lc24: addxcc %o0,%o0,%o0
489 Lc25: addxcc %o0,%o0,%o0
492 Lc26: addxcc %o0,%o0,%o0
495 Lc27: addxcc %o0,%o0,%o0
498 Lc28: addxcc %o0,%o0,%o0
501 Lc29: addxcc %o0,%o0,%o0
504 Lc30: addxcc %o0,%o0,%o0
507 Lc31: addxcc %o0,%o0,%o0
512 Ld01: addxcc %o0,%o0,%o0
516 Ld02: addxcc %o0,%o0,%o0
520 Ld03: addxcc %o0,%o0,%o0
524 Ld04: addxcc %o0,%o0,%o0
528 Ld05: addxcc %o0,%o0,%o0
532 Ld06: addxcc %o0,%o0,%o0
536 Ld07: addxcc %o0,%o0,%o0
540 Ld08: addxcc %o0,%o0,%o0
544 Ld09: addxcc %o0,%o0,%o0
548 Ld10: addxcc %o0,%o0,%o0
552 Ld11: addxcc %o0,%o0,%o0
556 Ld12: addxcc %o0,%o0,%o0
560 Ld13: addxcc %o0,%o0,%o0
564 Ld14: addxcc %o0,%o0,%o0
568 Ld15: addxcc %o0,%o0,%o0
572 Ld16: addxcc %o0,%o0,%o0
576 Ld17: addxcc %o0,%o0,%o0
580 Ld18: addxcc %o0,%o0,%o0
584 Ld19: addxcc %o0,%o0,%o0
588 Ld20: addxcc %o0,%o0,%o0
592 Ld21: addxcc %o0,%o0,%o0
596 Ld22: addxcc %o0,%o0,%o0
600 Ld23: addxcc %o0,%o0,%o0
604 Ld24: addxcc %o0,%o0,%o0
608 Ld25: addxcc %o0,%o0,%o0
612 Ld26: addxcc %o0,%o0,%o0
616 Ld27: addxcc %o0,%o0,%o0
620 Ld28: addxcc %o0,%o0,%o0
624 Ld29: addxcc %o0,%o0,%o0
628 Ld30: addxcc %o0,%o0,%o0
632 Ld31: addxcc %o0,%o0,%o0
636 Ld32: xor %o3,%o1,%o3
637 Ld33: addx %o0,%o0,%o0
638 Ld34: // Now x*y = 2^32*%o0+%o3