// 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

