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 #define DECLARE_FUNCTION(name) .type C(name),#function
24 #define DECLARE_FUNCTION(name)
27 // Indikatoren für Anweisungen (Instruktionen) in Delay-Slots
28 // (diese werden VOR der vorigen Instruktion ausgeführt):
29 #define _ // Instruktion, die stets ausgeführt wird
30 #define __ // Instruktion, die nur im Sprung-Fall ausgeführt wird
31 // Abkürzungen für Anweisungen:
32 #define ret jmp %i7+8 // return from subroutine
33 #define retl jmp %o7+8 // return from leaf subroutine (no save/restore)
37 .global C(gf2_mul16),C(gf2_mul32)
39 // extern uint32 gf2_mul16 (uint16 x, uint16 y);
40 DECLARE_FUNCTION(gf2_mul16)
41 C(gf2_mul16:) // Input in %o0,%o1, Output in %o0
45 // 16-bit multiply of x and y
46 // input %o1 = factor1, %o0 = 2^16*factor2, output %o0
100 Lb07: xor %o0,%o1,%o0
103 Lb08: xor %o0,%o1,%o0
106 Lb09: xor %o0,%o1,%o0
109 Lb10: xor %o0,%o1,%o0
112 Lb11: xor %o0,%o1,%o0
115 Lb12: xor %o0,%o1,%o0
118 Lb13: xor %o0,%o1,%o0
121 Lb14: xor %o0,%o1,%o0
124 Lb15: xor %o0,%o1,%o0
130 // extern uint32 gf2_mul32 (uint32 x, uint32 y, uint32* plo);
131 DECLARE_FUNCTION(gf2_mul32)
132 C(gf2_mul32:) // Input in %o0,%o1,%o2, Output in [%o2],%o0
135 srl %o4,16,%o4 // %o4 = low16(x)
136 sll %o1,16,%o5 // %o5 = 2^16*low16(y)
137 srl %o0,16,%o0 // %o0 = high16(x)
139 sll %o1,16,%o1 // %o1 = 2^16*high16(y)
140 xor %o1,%o5,%o3 // %o3 = 2^16*(high16(y)+low16(y))
141 // 16-bit multiply of low16(x) and low16(y)
142 // input %o4 = factor1, %o5 = 2^16*factor2, output %o5
178 Ld01: xor %o5,%o4,%o5
181 Ld02: xor %o5,%o4,%o5
184 Ld03: xor %o5,%o4,%o5
187 Ld04: xor %o5,%o4,%o5
190 Ld05: xor %o5,%o4,%o5
193 Ld06: xor %o5,%o4,%o5
196 Ld07: xor %o5,%o4,%o5
199 Ld08: xor %o5,%o4,%o5
202 Ld09: xor %o5,%o4,%o5
205 Ld10: xor %o5,%o4,%o5
208 Ld11: xor %o5,%o4,%o5
211 Ld12: xor %o5,%o4,%o5
214 Ld13: xor %o5,%o4,%o5
217 Ld14: xor %o5,%o4,%o5
220 Ld15: xor %o5,%o4,%o5
223 Ld16: xor %o5,%o4,%o5
224 Ld17: // %o5 = low16(x)*low16(y)
225 // 16-bit multiply of high16(x) and high16(y)
226 // input %o0 = factor1, %o1 = 2^16*factor2, output %o1
262 Lf01: xor %o1,%o0,%o1
265 Lf02: xor %o1,%o0,%o1
268 Lf03: xor %o1,%o0,%o1
271 Lf04: xor %o1,%o0,%o1
274 Lf05: xor %o1,%o0,%o1
277 Lf06: xor %o1,%o0,%o1
280 Lf07: xor %o1,%o0,%o1
283 Lf08: xor %o1,%o0,%o1
286 Lf09: xor %o1,%o0,%o1
289 Lf10: xor %o1,%o0,%o1
292 Lf11: xor %o1,%o0,%o1
295 Lf12: xor %o1,%o0,%o1
298 Lf13: xor %o1,%o0,%o1
301 Lf14: xor %o1,%o0,%o1
304 Lf15: xor %o1,%o0,%o1
307 Lf16: xor %o1,%o0,%o1
308 Lf17: // %o1 = high16(x)*high16(y)
309 xor %o0,%o4,%o4 // %o4 = high16(x)+low16(x)
310 // 16-bit multiply of high16(x)+low16(x) and high16(y)+low16(y)
311 // input %o4 = factor1, %o3 = 2^16*factor2, output %o3
347 Lh01: xor %o3,%o4,%o3
350 Lh02: xor %o3,%o4,%o3
353 Lh03: xor %o3,%o4,%o3
356 Lh04: xor %o3,%o4,%o3
359 Lh05: xor %o3,%o4,%o3
362 Lh06: xor %o3,%o4,%o3
365 Lh07: xor %o3,%o4,%o3
368 Lh08: xor %o3,%o4,%o3
371 Lh09: xor %o3,%o4,%o3
374 Lh10: xor %o3,%o4,%o3
377 Lh11: xor %o3,%o4,%o3
380 Lh12: xor %o3,%o4,%o3
383 Lh13: xor %o3,%o4,%o3
386 Lh14: xor %o3,%o4,%o3
389 Lh15: xor %o3,%o4,%o3
392 Lh16: xor %o3,%o4,%o3
393 Lh17: // %o3 = (high16(x)+low16(x))*(high16(y)+low16(y))
394 // Now %o5 = low16(x)*low16(y)
395 // %o1 = high16(x)*high16(y)
396 // %o3 = (high16(x)+low16(x))*(high16(y)+low16(y))
397 // The result is x*y = 2^32*%o1 + 2^16*(%o3+%o1+%o5) + %o5
400 // The result is x*y = 2^32*%o1 + 2^16*%o3 + %o5
402 xor %o0,%o1,%o0 // high 32 bits in %o0
404 xor %o1,%o5,%o1 // low 32 bits in %o1
409 // 32-bit multiply of x and y
410 // input %o1 = factor1, %o0|%o3 = 2^32*factor2, output %o0|%o3
414 Lc01: addxcc %o0,%o0,%o0
417 Lc02: addxcc %o0,%o0,%o0
420 Lc03: addxcc %o0,%o0,%o0
423 Lc04: addxcc %o0,%o0,%o0
426 Lc05: addxcc %o0,%o0,%o0
429 Lc06: addxcc %o0,%o0,%o0
432 Lc07: addxcc %o0,%o0,%o0
435 Lc08: addxcc %o0,%o0,%o0
438 Lc09: addxcc %o0,%o0,%o0
441 Lc10: addxcc %o0,%o0,%o0
444 Lc11: addxcc %o0,%o0,%o0
447 Lc12: addxcc %o0,%o0,%o0
450 Lc13: addxcc %o0,%o0,%o0
453 Lc14: addxcc %o0,%o0,%o0
456 Lc15: addxcc %o0,%o0,%o0
459 Lc16: addxcc %o0,%o0,%o0
462 Lc17: addxcc %o0,%o0,%o0
465 Lc18: addxcc %o0,%o0,%o0
468 Lc19: addxcc %o0,%o0,%o0
471 Lc20: addxcc %o0,%o0,%o0
474 Lc21: addxcc %o0,%o0,%o0
477 Lc22: addxcc %o0,%o0,%o0
480 Lc23: addxcc %o0,%o0,%o0
483 Lc24: addxcc %o0,%o0,%o0
486 Lc25: addxcc %o0,%o0,%o0
489 Lc26: addxcc %o0,%o0,%o0
492 Lc27: addxcc %o0,%o0,%o0
495 Lc28: addxcc %o0,%o0,%o0
498 Lc29: addxcc %o0,%o0,%o0
501 Lc30: addxcc %o0,%o0,%o0
504 Lc31: addxcc %o0,%o0,%o0
509 Ld01: addxcc %o0,%o0,%o0
513 Ld02: addxcc %o0,%o0,%o0
517 Ld03: addxcc %o0,%o0,%o0
521 Ld04: addxcc %o0,%o0,%o0
525 Ld05: addxcc %o0,%o0,%o0
529 Ld06: addxcc %o0,%o0,%o0
533 Ld07: addxcc %o0,%o0,%o0
537 Ld08: addxcc %o0,%o0,%o0
541 Ld09: addxcc %o0,%o0,%o0
545 Ld10: addxcc %o0,%o0,%o0
549 Ld11: addxcc %o0,%o0,%o0
553 Ld12: addxcc %o0,%o0,%o0
557 Ld13: addxcc %o0,%o0,%o0
561 Ld14: addxcc %o0,%o0,%o0
565 Ld15: addxcc %o0,%o0,%o0
569 Ld16: addxcc %o0,%o0,%o0
573 Ld17: addxcc %o0,%o0,%o0
577 Ld18: addxcc %o0,%o0,%o0
581 Ld19: addxcc %o0,%o0,%o0
585 Ld20: addxcc %o0,%o0,%o0
589 Ld21: addxcc %o0,%o0,%o0
593 Ld22: addxcc %o0,%o0,%o0
597 Ld23: addxcc %o0,%o0,%o0
601 Ld24: addxcc %o0,%o0,%o0
605 Ld25: addxcc %o0,%o0,%o0
609 Ld26: addxcc %o0,%o0,%o0
613 Ld27: addxcc %o0,%o0,%o0
617 Ld28: addxcc %o0,%o0,%o0
621 Ld29: addxcc %o0,%o0,%o0
625 Ld30: addxcc %o0,%o0,%o0
629 Ld31: addxcc %o0,%o0,%o0
633 Ld32: xor %o3,%o1,%o3
634 Ld33: addx %o0,%o0,%o0
635 Ld34: // Now x*y = 2^32*%o0+%o3