// Externe Routinen
// Prozessor: SPARC
// Compiler: GNU-C oder SUN-C
// Parameter-Übergabe: in Registern %o0-%o5.
// Einstellungen: intCsize=32, intDsize=32.
#ifdef ASM_UNDERSCORE /* SunOS 4 */
#if defined(__STDC__) || defined (__cplusplus)
#define C(entrypoint) _##entrypoint
#else
#define C(entrypoint) _/**/entrypoint
#endif
#else /* SunOS 5 = Solaris 2 */
#define C(entrypoint) entrypoint
#endif
// When this file is compiled into a shared library, ELF linkers need to
// know which symbols are functions.
#if defined(__NetBSD__) || defined(__OpenBSD__)
#define DECLARE_FUNCTION(name) .type C(name),@function
#elif defined(__svr4__) || defined(__ELF__)
// Some preprocessors keep the backslash in place, some don't.
// Some complain about the # being not in front of an ANSI C macro.
// Therefore we use a dollar, which will be sed-converted to # later.
#define DECLARE_FUNCTION(name) .type C(name),$function
#else
#define DECLARE_FUNCTION(name)
#endif
// Indikatoren für Anweisungen (Instruktionen) in Delay-Slots
// (diese werden VOR der vorigen Instruktion ausgeführt):
#define _ // Instruktion, die stets ausgeführt wird
#define __ // Instruktion, die nur im Sprung-Fall ausgeführt wird
// Abkürzungen für Anweisungen:
#define ret jmp %i7+8 // return from subroutine
#define retl jmp %o7+8 // return from leaf subroutine (no save/restore)
.seg "text"
.global C(gf2_mul16),C(gf2_mul32)
// extern uint32 gf2_mul16 (uint16 x, uint16 y);
DECLARE_FUNCTION(gf2_mul16)
C(gf2_mul16:) // Input in %o0,%o1, Output in %o0
sll %o0,16,%o0
sll %o1,16,%o1
srl %o1,16,%o1
// 16-bit multiply of x and y
// input %o1 = factor1, %o0 = 2^16*factor2, output %o0
addcc %o0,%o0,%o0
bcs Lb01
_ addcc %o0,%o0,%o0
La01: bcs Lb02
_ addcc %o0,%o0,%o0
La02: bcs Lb03
_ addcc %o0,%o0,%o0
La03: bcs Lb04
_ addcc %o0,%o0,%o0
La04: bcs Lb05
_ addcc %o0,%o0,%o0
La05: bcs Lb06
_ addcc %o0,%o0,%o0
La06: bcs Lb07
_ addcc %o0,%o0,%o0
La07: bcs Lb08
_ addcc %o0,%o0,%o0
La08: bcs Lb09
_ addcc %o0,%o0,%o0
La09: bcs Lb10
_ addcc %o0,%o0,%o0
La10: bcs Lb11
_ addcc %o0,%o0,%o0
La11: bcs Lb12
_ addcc %o0,%o0,%o0
La12: bcs Lb13
_ addcc %o0,%o0,%o0
La13: bcs Lb14
_ addcc %o0,%o0,%o0
La14: bcs Lb15
_ addcc %o0,%o0,%o0
La15: bcs Lb16
_ add %o0,%o0,%o0
La16: retl
_ nop
Lb01: xor %o0,%o1,%o0
bcc La02
_ addcc %o0,%o0,%o0
Lb02: xor %o0,%o1,%o0
bcc La03
_ addcc %o0,%o0,%o0
Lb03: xor %o0,%o1,%o0
bcc La04
_ addcc %o0,%o0,%o0
Lb04: xor %o0,%o1,%o0
bcc La05
_ addcc %o0,%o0,%o0
Lb05: xor %o0,%o1,%o0
bcc La06
_ addcc %o0,%o0,%o0
Lb06: xor %o0,%o1,%o0
bcc La07
_ addcc %o0,%o0,%o0
Lb07: xor %o0,%o1,%o0
bcc La08
_ addcc %o0,%o0,%o0
Lb08: xor %o0,%o1,%o0
bcc La09
_ addcc %o0,%o0,%o0
Lb09: xor %o0,%o1,%o0
bcc La10
_ addcc %o0,%o0,%o0
Lb10: xor %o0,%o1,%o0
bcc La11
_ addcc %o0,%o0,%o0
Lb11: xor %o0,%o1,%o0
bcc La12
_ addcc %o0,%o0,%o0
Lb12: xor %o0,%o1,%o0
bcc La13
_ addcc %o0,%o0,%o0
Lb13: xor %o0,%o1,%o0
bcc La14
_ addcc %o0,%o0,%o0
Lb14: xor %o0,%o1,%o0
bcc La15
_ addcc %o0,%o0,%o0
Lb15: xor %o0,%o1,%o0
bcc La16
_ add %o0,%o0,%o0
Lb16: retl
_ xor %o0,%o1,%o0
// extern uint32 gf2_mul32 (uint32 x, uint32 y, uint32* plo);
DECLARE_FUNCTION(gf2_mul32)
C(gf2_mul32:) // Input in %o0,%o1,%o2, Output in [%o2],%o0
#if 0
sll %o0,16,%o4
srl %o4,16,%o4 // %o4 = low16(x)
sll %o1,16,%o5 // %o5 = 2^16*low16(y)
srl %o0,16,%o0 // %o0 = high16(x)
srl %o1,16,%o1
sll %o1,16,%o1 // %o1 = 2^16*high16(y)
xor %o1,%o5,%o3 // %o3 = 2^16*(high16(y)+low16(y))
// 16-bit multiply of low16(x) and low16(y)
// input %o4 = factor1, %o5 = 2^16*factor2, output %o5
addcc %o5,%o5,%o5
bcs Ld01
_ addcc %o5,%o5,%o5
Lc01: bcs Ld02
_ addcc %o5,%o5,%o5
Lc02: bcs Ld03
_ addcc %o5,%o5,%o5
Lc03: bcs Ld04
_ addcc %o5,%o5,%o5
Lc04: bcs Ld05
_ addcc %o5,%o5,%o5
Lc05: bcs Ld06
_ addcc %o5,%o5,%o5
Lc06: bcs Ld07
_ addcc %o5,%o5,%o5
Lc07: bcs Ld08
_ addcc %o5,%o5,%o5
Lc08: bcs Ld09
_ addcc %o5,%o5,%o5
Lc09: bcs Ld10
_ addcc %o5,%o5,%o5
Lc10: bcs Ld11
_ addcc %o5,%o5,%o5
Lc11: bcs Ld12
_ addcc %o5,%o5,%o5
Lc12: bcs Ld13
_ addcc %o5,%o5,%o5
Lc13: bcs Ld14
_ addcc %o5,%o5,%o5
Lc14: bcs Ld15
_ addcc %o5,%o5,%o5
Lc15: bcs Ld16
_ add %o5,%o5,%o5
Lc16: b Ld17
_ nop
Ld01: xor %o5,%o4,%o5
bcc Lc02
_ addcc %o5,%o5,%o5
Ld02: xor %o5,%o4,%o5
bcc Lc03
_ addcc %o5,%o5,%o5
Ld03: xor %o5,%o4,%o5
bcc Lc04
_ addcc %o5,%o5,%o5
Ld04: xor %o5,%o4,%o5
bcc Lc05
_ addcc %o5,%o5,%o5
Ld05: xor %o5,%o4,%o5
bcc Lc06
_ addcc %o5,%o5,%o5
Ld06: xor %o5,%o4,%o5
bcc Lc07
_ addcc %o5,%o5,%o5
Ld07: xor %o5,%o4,%o5
bcc Lc08
_ addcc %o5,%o5,%o5
Ld08: xor %o5,%o4,%o5
bcc Lc09
_ addcc %o5,%o5,%o5
Ld09: xor %o5,%o4,%o5
bcc Lc10
_ addcc %o5,%o5,%o5
Ld10: xor %o5,%o4,%o5
bcc Lc11
_ addcc %o5,%o5,%o5
Ld11: xor %o5,%o4,%o5
bcc Lc12
_ addcc %o5,%o5,%o5
Ld12: xor %o5,%o4,%o5
bcc Lc13
_ addcc %o5,%o5,%o5
Ld13: xor %o5,%o4,%o5
bcc Lc14
_ addcc %o5,%o5,%o5
Ld14: xor %o5,%o4,%o5
bcc Lc15
_ addcc %o5,%o5,%o5
Ld15: xor %o5,%o4,%o5
bcc Ld17
_ add %o5,%o5,%o5
Ld16: xor %o5,%o4,%o5
Ld17: // %o5 = low16(x)*low16(y)
// 16-bit multiply of high16(x) and high16(y)
// input %o0 = factor1, %o1 = 2^16*factor2, output %o1
addcc %o1,%o1,%o1
bcs Lf01
_ addcc %o1,%o1,%o1
Le01: bcs Lf02
_ addcc %o1,%o1,%o1
Le02: bcs Lf03
_ addcc %o1,%o1,%o1
Le03: bcs Lf04
_ addcc %o1,%o1,%o1
Le04: bcs Lf05
_ addcc %o1,%o1,%o1
Le05: bcs Lf06
_ addcc %o1,%o1,%o1
Le06: bcs Lf07
_ addcc %o1,%o1,%o1
Le07: bcs Lf08
_ addcc %o1,%o1,%o1
Le08: bcs Lf09
_ addcc %o1,%o1,%o1
Le09: bcs Lf10
_ addcc %o1,%o1,%o1
Le10: bcs Lf11
_ addcc %o1,%o1,%o1
Le11: bcs Lf12
_ addcc %o1,%o1,%o1
Le12: bcs Lf13
_ addcc %o1,%o1,%o1
Le13: bcs Lf14
_ addcc %o1,%o1,%o1
Le14: bcs Lf15
_ addcc %o1,%o1,%o1
Le15: bcs Lf16
_ add %o1,%o1,%o1
Le16: b Lf17
_ nop
Lf01: xor %o1,%o0,%o1
bcc Le02
_ addcc %o1,%o1,%o1
Lf02: xor %o1,%o0,%o1
bcc Le03
_ addcc %o1,%o1,%o1
Lf03: xor %o1,%o0,%o1
bcc Le04
_ addcc %o1,%o1,%o1
Lf04: xor %o1,%o0,%o1
bcc Le05
_ addcc %o1,%o1,%o1
Lf05: xor %o1,%o0,%o1
bcc Le06
_ addcc %o1,%o1,%o1
Lf06: xor %o1,%o0,%o1
bcc Le07
_ addcc %o1,%o1,%o1
Lf07: xor %o1,%o0,%o1
bcc Le08
_ addcc %o1,%o1,%o1
Lf08: xor %o1,%o0,%o1
bcc Le09
_ addcc %o1,%o1,%o1
Lf09: xor %o1,%o0,%o1
bcc Le10
_ addcc %o1,%o1,%o1
Lf10: xor %o1,%o0,%o1
bcc Le11
_ addcc %o1,%o1,%o1
Lf11: xor %o1,%o0,%o1
bcc Le12
_ addcc %o1,%o1,%o1
Lf12: xor %o1,%o0,%o1
bcc Le13
_ addcc %o1,%o1,%o1
Lf13: xor %o1,%o0,%o1
bcc Le14
_ addcc %o1,%o1,%o1
Lf14: xor %o1,%o0,%o1
bcc Le15
_ addcc %o1,%o1,%o1
Lf15: xor %o1,%o0,%o1
bcc Lf17
_ add %o1,%o1,%o1
Lf16: xor %o1,%o0,%o1
Lf17: // %o1 = high16(x)*high16(y)
xor %o0,%o4,%o4 // %o4 = high16(x)+low16(x)
// 16-bit multiply of high16(x)+low16(x) and high16(y)+low16(y)
// input %o4 = factor1, %o3 = 2^16*factor2, output %o3
addcc %o3,%o3,%o3
bcs Lh01
_ addcc %o3,%o3,%o3
Lg01: bcs Lh02
_ addcc %o3,%o3,%o3
Lg02: bcs Lh03
_ addcc %o3,%o3,%o3
Lg03: bcs Lh04
_ addcc %o3,%o3,%o3
Lg04: bcs Lh05
_ addcc %o3,%o3,%o3
Lg05: bcs Lh06
_ addcc %o3,%o3,%o3
Lg06: bcs Lh07
_ addcc %o3,%o3,%o3
Lg07: bcs Lh08
_ addcc %o3,%o3,%o3
Lg08: bcs Lh09
_ addcc %o3,%o3,%o3
Lg09: bcs Lh10
_ addcc %o3,%o3,%o3
Lg10: bcs Lh11
_ addcc %o3,%o3,%o3
Lg11: bcs Lh12
_ addcc %o3,%o3,%o3
Lg12: bcs Lh13
_ addcc %o3,%o3,%o3
Lg13: bcs Lh14
_ addcc %o3,%o3,%o3
Lg14: bcs Lh15
_ addcc %o3,%o3,%o3
Lg15: bcs Lh16
_ add %o3,%o3,%o3
Lg16: b Lh17
_ nop
Lh01: xor %o3,%o4,%o3
bcc Lg02
_ addcc %o3,%o3,%o3
Lh02: xor %o3,%o4,%o3
bcc Lg03
_ addcc %o3,%o3,%o3
Lh03: xor %o3,%o4,%o3
bcc Lg04
_ addcc %o3,%o3,%o3
Lh04: xor %o3,%o4,%o3
bcc Lg05
_ addcc %o3,%o3,%o3
Lh05: xor %o3,%o4,%o3
bcc Lg06
_ addcc %o3,%o3,%o3
Lh06: xor %o3,%o4,%o3
bcc Lg07
_ addcc %o3,%o3,%o3
Lh07: xor %o3,%o4,%o3
bcc Lg08
_ addcc %o3,%o3,%o3
Lh08: xor %o3,%o4,%o3
bcc Lg09
_ addcc %o3,%o3,%o3
Lh09: xor %o3,%o4,%o3
bcc Lg10
_ addcc %o3,%o3,%o3
Lh10: xor %o3,%o4,%o3
bcc Lg11
_ addcc %o3,%o3,%o3
Lh11: xor %o3,%o4,%o3
bcc Lg12
_ addcc %o3,%o3,%o3
Lh12: xor %o3,%o4,%o3
bcc Lg13
_ addcc %o3,%o3,%o3
Lh13: xor %o3,%o4,%o3
bcc Lg14
_ addcc %o3,%o3,%o3
Lh14: xor %o3,%o4,%o3
bcc Lg15
_ addcc %o3,%o3,%o3
Lh15: xor %o3,%o4,%o3
bcc Lh17
_ add %o3,%o3,%o3
Lh16: xor %o3,%o4,%o3
Lh17: // %o3 = (high16(x)+low16(x))*(high16(y)+low16(y))
// Now %o5 = low16(x)*low16(y)
// %o1 = high16(x)*high16(y)
// %o3 = (high16(x)+low16(x))*(high16(y)+low16(y))
// The result is x*y = 2^32*%o1 + 2^16*(%o3+%o1+%o5) + %o5
xor %o3,%o1,%o3
xor %o3,%o5,%o3
// The result is x*y = 2^32*%o1 + 2^16*%o3 + %o5
srl %o3,16,%o0
xor %o0,%o1,%o0 // high 32 bits in %o0
sll %o3,16,%o1
xor %o1,%o5,%o1 // low 32 bits in %o1
retl
_ st %o1,[%o2]
#else
mov 0,%o3
// 32-bit multiply of x and y
// input %o1 = factor1, %o0|%o3 = 2^32*factor2, output %o0|%o3
addcc %o0,%o0,%o0
bcs Ld01
_ addcc %o3,%o3,%o3
Lc01: addxcc %o0,%o0,%o0
bcs Ld02
_ addcc %o3,%o3,%o3
Lc02: addxcc %o0,%o0,%o0
bcs Ld03
_ addcc %o3,%o3,%o3
Lc03: addxcc %o0,%o0,%o0
bcs Ld04
_ addcc %o3,%o3,%o3
Lc04: addxcc %o0,%o0,%o0
bcs Ld05
_ addcc %o3,%o3,%o3
Lc05: addxcc %o0,%o0,%o0
bcs Ld06
_ addcc %o3,%o3,%o3
Lc06: addxcc %o0,%o0,%o0
bcs Ld07
_ addcc %o3,%o3,%o3
Lc07: addxcc %o0,%o0,%o0
bcs Ld08
_ addcc %o3,%o3,%o3
Lc08: addxcc %o0,%o0,%o0
bcs Ld09
_ addcc %o3,%o3,%o3
Lc09: addxcc %o0,%o0,%o0
bcs Ld10
_ addcc %o3,%o3,%o3
Lc10: addxcc %o0,%o0,%o0
bcs Ld11
_ addcc %o3,%o3,%o3
Lc11: addxcc %o0,%o0,%o0
bcs Ld12
_ addcc %o3,%o3,%o3
Lc12: addxcc %o0,%o0,%o0
bcs Ld13
_ addcc %o3,%o3,%o3
Lc13: addxcc %o0,%o0,%o0
bcs Ld14
_ addcc %o3,%o3,%o3
Lc14: addxcc %o0,%o0,%o0
bcs Ld15
_ addcc %o3,%o3,%o3
Lc15: addxcc %o0,%o0,%o0
bcs Ld16
_ addcc %o3,%o3,%o3
Lc16: addxcc %o0,%o0,%o0
bcs Ld17
_ addcc %o3,%o3,%o3
Lc17: addxcc %o0,%o0,%o0
bcs Ld18
_ addcc %o3,%o3,%o3
Lc18: addxcc %o0,%o0,%o0
bcs Ld19
_ addcc %o3,%o3,%o3
Lc19: addxcc %o0,%o0,%o0
bcs Ld20
_ addcc %o3,%o3,%o3
Lc20: addxcc %o0,%o0,%o0
bcs Ld21
_ addcc %o3,%o3,%o3
Lc21: addxcc %o0,%o0,%o0
bcs Ld22
_ addcc %o3,%o3,%o3
Lc22: addxcc %o0,%o0,%o0
bcs Ld23
_ addcc %o3,%o3,%o3
Lc23: addxcc %o0,%o0,%o0
bcs Ld24
_ addcc %o3,%o3,%o3
Lc24: addxcc %o0,%o0,%o0
bcs Ld25
_ addcc %o3,%o3,%o3
Lc25: addxcc %o0,%o0,%o0
bcs Ld26
_ addcc %o3,%o3,%o3
Lc26: addxcc %o0,%o0,%o0
bcs Ld27
_ addcc %o3,%o3,%o3
Lc27: addxcc %o0,%o0,%o0
bcs Ld28
_ addcc %o3,%o3,%o3
Lc28: addxcc %o0,%o0,%o0
bcs Ld29
_ addcc %o3,%o3,%o3
Lc29: addxcc %o0,%o0,%o0
bcs Ld30
_ addcc %o3,%o3,%o3
Lc30: addxcc %o0,%o0,%o0
bcs Ld31
_ addcc %o3,%o3,%o3
Lc31: addxcc %o0,%o0,%o0
bcs Ld32
_ addcc %o3,%o3,%o3
Lc32: b Ld34
_ addx %o0,%o0,%o0
Ld01: addxcc %o0,%o0,%o0
xor %o3,%o1,%o3
bcc Lc02
_ addcc %o3,%o3,%o3
Ld02: addxcc %o0,%o0,%o0
xor %o3,%o1,%o3
bcc Lc03
_ addcc %o3,%o3,%o3
Ld03: addxcc %o0,%o0,%o0
xor %o3,%o1,%o3
bcc Lc04
_ addcc %o3,%o3,%o3
Ld04: addxcc %o0,%o0,%o0
xor %o3,%o1,%o3
bcc Lc05
_ addcc %o3,%o3,%o3
Ld05: addxcc %o0,%o0,%o0
xor %o3,%o1,%o3
bcc Lc06
_ addcc %o3,%o3,%o3
Ld06: addxcc %o0,%o0,%o0
xor %o3,%o1,%o3
bcc Lc07
_ addcc %o3,%o3,%o3
Ld07: addxcc %o0,%o0,%o0
xor %o3,%o1,%o3
bcc Lc08
_ addcc %o3,%o3,%o3
Ld08: addxcc %o0,%o0,%o0
xor %o3,%o1,%o3
bcc Lc09
_ addcc %o3,%o3,%o3
Ld09: addxcc %o0,%o0,%o0
xor %o3,%o1,%o3
bcc Lc10
_ addcc %o3,%o3,%o3
Ld10: addxcc %o0,%o0,%o0
xor %o3,%o1,%o3
bcc Lc11
_ addcc %o3,%o3,%o3
Ld11: addxcc %o0,%o0,%o0
xor %o3,%o1,%o3
bcc Lc12
_ addcc %o3,%o3,%o3
Ld12: addxcc %o0,%o0,%o0
xor %o3,%o1,%o3
bcc Lc13
_ addcc %o3,%o3,%o3
Ld13: addxcc %o0,%o0,%o0
xor %o3,%o1,%o3
bcc Lc14
_ addcc %o3,%o3,%o3
Ld14: addxcc %o0,%o0,%o0
xor %o3,%o1,%o3
bcc Lc15
_ addcc %o3,%o3,%o3
Ld15: addxcc %o0,%o0,%o0
xor %o3,%o1,%o3
bcc Lc16
_ addcc %o3,%o3,%o3
Ld16: addxcc %o0,%o0,%o0
xor %o3,%o1,%o3
bcc Lc17
_ addcc %o3,%o3,%o3
Ld17: addxcc %o0,%o0,%o0
xor %o3,%o1,%o3
bcc Lc18
_ addcc %o3,%o3,%o3
Ld18: addxcc %o0,%o0,%o0
xor %o3,%o1,%o3
bcc Lc19
_ addcc %o3,%o3,%o3
Ld19: addxcc %o0,%o0,%o0
xor %o3,%o1,%o3
bcc Lc20
_ addcc %o3,%o3,%o3
Ld20: addxcc %o0,%o0,%o0
xor %o3,%o1,%o3
bcc Lc21
_ addcc %o3,%o3,%o3
Ld21: addxcc %o0,%o0,%o0
xor %o3,%o1,%o3
bcc Lc22
_ addcc %o3,%o3,%o3
Ld22: addxcc %o0,%o0,%o0
xor %o3,%o1,%o3
bcc Lc23
_ addcc %o3,%o3,%o3
Ld23: addxcc %o0,%o0,%o0
xor %o3,%o1,%o3
bcc Lc24
_ addcc %o3,%o3,%o3
Ld24: addxcc %o0,%o0,%o0
xor %o3,%o1,%o3
bcc Lc25
_ addcc %o3,%o3,%o3
Ld25: addxcc %o0,%o0,%o0
xor %o3,%o1,%o3
bcc Lc26
_ addcc %o3,%o3,%o3
Ld26: addxcc %o0,%o0,%o0
xor %o3,%o1,%o3
bcc Lc27
_ addcc %o3,%o3,%o3
Ld27: addxcc %o0,%o0,%o0
xor %o3,%o1,%o3
bcc Lc28
_ addcc %o3,%o3,%o3
Ld28: addxcc %o0,%o0,%o0
xor %o3,%o1,%o3
bcc Lc29
_ addcc %o3,%o3,%o3
Ld29: addxcc %o0,%o0,%o0
xor %o3,%o1,%o3
bcc Lc30
_ addcc %o3,%o3,%o3
Ld30: addxcc %o0,%o0,%o0
xor %o3,%o1,%o3
bcc Lc31
_ addcc %o3,%o3,%o3
Ld31: addxcc %o0,%o0,%o0
xor %o3,%o1,%o3
bcc Ld33
_ addcc %o3,%o3,%o3
Ld32: xor %o3,%o1,%o3
Ld33: addx %o0,%o0,%o0
Ld34: // Now x*y = 2^32*%o0+%o3
retl
_ st %o3,[%o2]
#endif
syntax highlighted by Code2HTML, v. 0.9.1