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