Home | History | Annotate | Line # | Download | only in sparc64
sparcv9-gf2m.S revision 1.1
      1 #ifndef __ASSEMBLER__
      2 # define __ASSEMBLER__ 1
      3 #endif
      4 #include "crypto/sparc_arch.h"
      5 
      6 #ifdef __arch64__
      7 .register	%g2,#scratch
      8 .register	%g3,#scratch
      9 #endif
     10 
     11 #ifdef __PIC__
     12 SPARC_PIC_THUNK(%g1)
     13 #endif
     14 
     15 .globl	bn_GF2m_mul_2x2
     16 .align	16
     17 bn_GF2m_mul_2x2:
     18         SPARC_LOAD_ADDRESS_LEAF(OPENSSL_sparcv9cap_P,%g1,%g5)
     19         ld	[%g1+0],%g1             	! OPENSSL_sparcv9cap_P[0]
     20 
     21         andcc	%g1, SPARCV9_VIS3, %g0
     22         bz,pn	%icc,.Lsoftware
     23         nop
     24 
     25 	sllx	%o1, 32, %o1
     26 	sllx	%o3, 32, %o3
     27 	or	%o2, %o1, %o1
     28 	or	%o4, %o3, %o3
     29 	.word	0x95b262ab			! xmulx   %o1, %o3, %o2
     30 	.word	0x99b262cb			! xmulxhi %o1, %o3, %o4
     31 	srlx	%o2, 32, %o1			! 13 cycles later
     32 	st	%o2, [%o0+0]
     33 	st	%o1, [%o0+4]
     34 	srlx	%o4, 32, %o3
     35 	st	%o4, [%o0+8]
     36 	retl
     37 	st	%o3, [%o0+12]
     38 
     39 .align	16
     40 .Lsoftware:
     41 	save	%sp,-STACK_FRAME-128,%sp
     42 
     43 	sllx	%i1,32,%g1
     44 	mov	-1,%o4
     45 	sllx	%i3,32,%o7
     46 	or	%i2,%g1,%g1
     47 	srlx	%o4,1,%o5			! 0x7fff...
     48 	or	%i4,%o7,%o7
     49 	srlx	%o4,2,%o4			! 0x3fff...
     50 	add	%sp,STACK_BIAS+STACK_FRAME,%l0
     51 
     52 	sllx	%g1,2,%o2
     53 	mov	%g1,%o0
     54 	sllx	%g1,1,%o1
     55 
     56 	srax	%o2,63,%g5			! broadcast 61st bit
     57 	and	%o5,%o2,%o2			! (a<<2)&0x7fff...
     58 	srlx	%o5,2,%o5
     59 	srax	%o1,63,%g4			! broadcast 62nd bit
     60 	and	%o4,%o1,%o1			! (a<<1)&0x3fff...
     61 	srax	%o0,63,%g1			! broadcast 63rd bit
     62 	and	%o5,%o0,%o0			! (a<<0)&0x1fff...
     63 
     64 	sllx	%o0,3,%o3
     65 	and	%o7,%g1,%g1
     66 	and	%o7,%g4,%g4
     67 	and	%o7,%g5,%g5
     68 
     69 	stx	%g0,[%l0+0*8]			! tab[0]=0
     70 	xor	%o0,%o1,%o4
     71 	stx	%o0,[%l0+1*8]			! tab[1]=a1
     72 	stx	%o1,[%l0+2*8]			! tab[2]=a2
     73 	 xor	%o2,%o3,%o5
     74 	stx	%o4,[%l0+3*8]			! tab[3]=a1^a2
     75 	 xor	%o2,%o0,%o0
     76 
     77 	stx	%o2,[%l0+4*8]			! tab[4]=a4
     78 	xor	%o2,%o1,%o1
     79 	stx	%o0,[%l0+5*8]			! tab[5]=a1^a4
     80 	xor	%o2,%o4,%o4
     81 	stx	%o1,[%l0+6*8]			! tab[6]=a2^a4
     82 	 xor	%o5,%o0,%o0
     83 	stx	%o4,[%l0+7*8]			! tab[7]=a1^a2^a4
     84 	 xor	%o5,%o1,%o1
     85 
     86 	stx	%o3,[%l0+8*8]			! tab[8]=a8
     87 	xor	%o5,%o4,%o4
     88 	stx	%o0,[%l0+9*8]			! tab[9]=a1^a8
     89 	 xor	%o2,%o0,%o0
     90 	stx	%o1,[%l0+10*8]			! tab[10]=a2^a8
     91 	 xor	%o2,%o1,%o1
     92 	stx	%o4,[%l0+11*8]		! tab[11]=a1^a2^a8
     93 
     94 	xor	%o2,%o4,%o4
     95 	stx	%o5,[%l0+12*8]		! tab[12]=a4^a8
     96 	 srlx	%g1,1,%o3
     97 	stx	%o0,[%l0+13*8]			! tab[13]=a1^a4^a8
     98 	 sllx	%g1,63,%g1
     99 	stx	%o1,[%l0+14*8]			! tab[14]=a2^a4^a8
    100 	 srlx	%g4,2,%g2
    101 	stx	%o4,[%l0+15*8]		! tab[15]=a1^a2^a4^a8
    102 
    103 	sllx	%g4,62,%o0
    104 	 sllx	%o7,3,%g4
    105 	srlx	%g5,3,%g3
    106 	 and	%g4,120,%g4
    107 	sllx	%g5,61,%o1
    108 	 ldx	[%l0+%g4],%g4
    109 	 srlx	%o7,4-3,%g5
    110 	xor	%g2,%o3,%o3
    111 	 and	%g5,120,%g5
    112 	xor	%o0,%g1,%g1
    113 	 ldx	[%l0+%g5],%g5
    114 	xor	%g3,%o3,%o3
    115 
    116 	xor	%g4,%g1,%g1
    117 	srlx	%o7,8-3,%g4
    118 	 xor	%o1,%g1,%g1
    119 	and	%g4,120,%g4
    120 	sllx	%g5,4,%g2
    121 	ldx	[%l0+%g4],%g4
    122 	srlx	%g5,60,%g3
    123 	xor	%g2,%g1,%g1
    124 	srlx	%o7,12-3,%g5
    125 	xor	%g3,%o3,%o3
    126 	and	%g5,120,%g5
    127 	sllx	%g4,8,%g3
    128 	ldx	[%l0+%g5],%g5
    129 	srlx	%g4,56,%g2
    130 	xor	%g3,%g1,%g1
    131 	srlx	%o7,16-3,%g4
    132 	xor	%g2,%o3,%o3
    133 	and	%g4,120,%g4
    134 	sllx	%g5,12,%g2
    135 	ldx	[%l0+%g4],%g4
    136 	srlx	%g5,52,%g3
    137 	xor	%g2,%g1,%g1
    138 	srlx	%o7,20-3,%g5
    139 	xor	%g3,%o3,%o3
    140 	and	%g5,120,%g5
    141 	sllx	%g4,16,%g3
    142 	ldx	[%l0+%g5],%g5
    143 	srlx	%g4,48,%g2
    144 	xor	%g3,%g1,%g1
    145 	srlx	%o7,24-3,%g4
    146 	xor	%g2,%o3,%o3
    147 	and	%g4,120,%g4
    148 	sllx	%g5,20,%g2
    149 	ldx	[%l0+%g4],%g4
    150 	srlx	%g5,44,%g3
    151 	xor	%g2,%g1,%g1
    152 	srlx	%o7,28-3,%g5
    153 	xor	%g3,%o3,%o3
    154 	and	%g5,120,%g5
    155 	sllx	%g4,24,%g3
    156 	ldx	[%l0+%g5],%g5
    157 	srlx	%g4,40,%g2
    158 	xor	%g3,%g1,%g1
    159 	srlx	%o7,32-3,%g4
    160 	xor	%g2,%o3,%o3
    161 	and	%g4,120,%g4
    162 	sllx	%g5,28,%g2
    163 	ldx	[%l0+%g4],%g4
    164 	srlx	%g5,36,%g3
    165 	xor	%g2,%g1,%g1
    166 	srlx	%o7,36-3,%g5
    167 	xor	%g3,%o3,%o3
    168 	and	%g5,120,%g5
    169 	sllx	%g4,32,%g3
    170 	ldx	[%l0+%g5],%g5
    171 	srlx	%g4,32,%g2
    172 	xor	%g3,%g1,%g1
    173 	srlx	%o7,40-3,%g4
    174 	xor	%g2,%o3,%o3
    175 	and	%g4,120,%g4
    176 	sllx	%g5,36,%g2
    177 	ldx	[%l0+%g4],%g4
    178 	srlx	%g5,28,%g3
    179 	xor	%g2,%g1,%g1
    180 	srlx	%o7,44-3,%g5
    181 	xor	%g3,%o3,%o3
    182 	and	%g5,120,%g5
    183 	sllx	%g4,40,%g3
    184 	ldx	[%l0+%g5],%g5
    185 	srlx	%g4,24,%g2
    186 	xor	%g3,%g1,%g1
    187 	srlx	%o7,48-3,%g4
    188 	xor	%g2,%o3,%o3
    189 	and	%g4,120,%g4
    190 	sllx	%g5,44,%g2
    191 	ldx	[%l0+%g4],%g4
    192 	srlx	%g5,20,%g3
    193 	xor	%g2,%g1,%g1
    194 	srlx	%o7,52-3,%g5
    195 	xor	%g3,%o3,%o3
    196 	and	%g5,120,%g5
    197 	sllx	%g4,48,%g3
    198 	ldx	[%l0+%g5],%g5
    199 	srlx	%g4,16,%g2
    200 	xor	%g3,%g1,%g1
    201 	srlx	%o7,56-3,%g4
    202 	xor	%g2,%o3,%o3
    203 	and	%g4,120,%g4
    204 	sllx	%g5,52,%g2
    205 	ldx	[%l0+%g4],%g4
    206 	srlx	%g5,12,%g3
    207 	xor	%g2,%g1,%g1
    208 	srlx	%o7,60-3,%g5
    209 	xor	%g3,%o3,%o3
    210 	and	%g5,120,%g5
    211 	sllx	%g4,56,%g3
    212 	ldx	[%l0+%g5],%g5
    213 	srlx	%g4,8,%g2
    214 	xor	%g3,%g1,%g1
    215 
    216 	sllx	%g5,60,%g3
    217 	 xor	%g2,%o3,%o3
    218 	srlx	%g5,4,%g2
    219 	xor	%g3,%g1,%g1
    220 	xor	%g2,%o3,%o3
    221 
    222 	srlx	%g1,32,%i1
    223 	st	%g1,[%i0+0]
    224 	st	%i1,[%i0+4]
    225 	srlx	%o3,32,%i2
    226 	st	%o3,[%i0+8]
    227 	st	%i2,[%i0+12]
    228 
    229 	ret
    230 	restore
    231 .type	bn_GF2m_mul_2x2,#function
    232 .size	bn_GF2m_mul_2x2,.-bn_GF2m_mul_2x2
    233 .asciz	"GF(2^m) Multiplication for SPARCv9, CRYPTOGAMS by <appro (at) openssl.org>"
    234 .align	4
    235