1#ifndef __ASSEMBLER__
2# define __ASSEMBLER__ 1
3#endif
4#include "crypto/sparc_arch.h"
5
6.section	".text",#alloc,#execinstr
7
8.global	bn_mul_mont_int
9.align	32
10bn_mul_mont_int:
11	cmp	%o5,4			! 128 bits minimum
12	bge,pt	%icc,.Lenter
13	sethi	%hi(0xffffffff),%g1
14	retl
15	clr	%o0
16.align	32
17.Lenter:
18	save	%sp,-STACK_FRAME,%sp
19	sll	%i5,2,%i5		! num*=4
20	or	%g1,%lo(0xffffffff),%g1
21	ld	[%i4],%i4
22	cmp	%i1,%i2
23	and	%i5,%g1,%i5
24	ld	[%i2],%l2		! bp[0]
25	nop
26
27	add	%sp,STACK_BIAS,%o7		! real top of stack
28	ld	[%i1],%o0		! ap[0] ! redundant in squaring context
29	sub	%o7,%i5,%o7
30	ld	[%i1+4],%l5		! ap[1]
31	and	%o7,-1024,%o7
32	ld	[%i3],%o1		! np[0]
33	sub	%o7,STACK_BIAS,%sp		! alloca
34	ld	[%i3+4],%l6		! np[1]
35	be,pt	SIZE_T_CC,.Lbn_sqr_mont
36	mov	12,%l1
37
38	mulx	%o0,%l2,%o0	! ap[0]*bp[0]
39	mulx	%l5,%l2,%g4	!prologue! ap[1]*bp[0]
40	and	%o0,%g1,%o3
41	add	%sp,STACK_BIAS+STACK_FRAME,%l4
42	ld	[%i1+8],%l5		!prologue!
43
44	mulx	%i4,%o3,%l3		! "t[0]"*n0
45	and	%l3,%g1,%l3
46
47	mulx	%o1,%l3,%o1	! np[0]*"t[0]"*n0
48	mulx	%l6,%l3,%o4	!prologue! np[1]*"t[0]"*n0
49	srlx	%o0,32,%o0
50	add	%o3,%o1,%o1
51	ld	[%i3+8],%l6		!prologue!
52	srlx	%o1,32,%o1
53	mov	%g4,%o3		!prologue!
54
55.L1st:
56	mulx	%l5,%l2,%g4
57	mulx	%l6,%l3,%g5
58	add	%o3,%o0,%o0
59	ld	[%i1+%l1],%l5		! ap[j]
60	and	%o0,%g1,%o3
61	add	%o4,%o1,%o1
62	ld	[%i3+%l1],%l6		! np[j]
63	srlx	%o0,32,%o0
64	add	%o3,%o1,%o1
65	add	%l1,4,%l1			! j++
66	mov	%g4,%o3
67	st	%o1,[%l4]
68	cmp	%l1,%i5
69	mov	%g5,%o4
70	srlx	%o1,32,%o1
71	bl	%icc,.L1st
72	add	%l4,4,%l4		! tp++
73!.L1st
74
75	mulx	%l5,%l2,%g4	!epilogue!
76	mulx	%l6,%l3,%g5
77	add	%o3,%o0,%o0
78	and	%o0,%g1,%o3
79	add	%o4,%o1,%o1
80	srlx	%o0,32,%o0
81	add	%o3,%o1,%o1
82	st	%o1,[%l4]
83	srlx	%o1,32,%o1
84
85	add	%g4,%o0,%o0
86	and	%o0,%g1,%o3
87	add	%g5,%o1,%o1
88	srlx	%o0,32,%o0
89	add	%o3,%o1,%o1
90	st	%o1,[%l4+4]
91	srlx	%o1,32,%o1
92
93	add	%o0,%o1,%o1
94	st	%o1,[%l4+8]
95	srlx	%o1,32,%o2
96
97	mov	4,%l0			! i++
98	ld	[%i2+4],%l2		! bp[1]
99.Louter:
100	add	%sp,STACK_BIAS+STACK_FRAME,%l4
101	ld	[%i1],%o0		! ap[0]
102	ld	[%i1+4],%l5		! ap[1]
103	ld	[%i3],%o1		! np[0]
104	ld	[%i3+4],%l6		! np[1]
105	ld	[%l4],%g5		! tp[0]
106	ld	[%l4+4],%l7		! tp[1]
107	mov	12,%l1
108
109	mulx	%o0,%l2,%o0
110	mulx	%l5,%l2,%g4	!prologue!
111	add	%g5,%o0,%o0
112	ld	[%i1+8],%l5		!prologue!
113	and	%o0,%g1,%o3
114
115	mulx	%i4,%o3,%l3
116	and	%l3,%g1,%l3
117
118	mulx	%o1,%l3,%o1
119	mulx	%l6,%l3,%o4	!prologue!
120	srlx	%o0,32,%o0
121	add	%o3,%o1,%o1
122	ld	[%i3+8],%l6		!prologue!
123	srlx	%o1,32,%o1
124	mov	%g4,%o3		!prologue!
125
126.Linner:
127	mulx	%l5,%l2,%g4
128	mulx	%l6,%l3,%g5
129	add	%l7,%o0,%o0
130	ld	[%i1+%l1],%l5		! ap[j]
131	add	%o3,%o0,%o0
132	add	%o4,%o1,%o1
133	ld	[%i3+%l1],%l6		! np[j]
134	and	%o0,%g1,%o3
135	ld	[%l4+8],%l7		! tp[j]
136	srlx	%o0,32,%o0
137	add	%o3,%o1,%o1
138	add	%l1,4,%l1			! j++
139	mov	%g4,%o3
140	st	%o1,[%l4]		! tp[j-1]
141	srlx	%o1,32,%o1
142	mov	%g5,%o4
143	cmp	%l1,%i5
144	bl	%icc,.Linner
145	add	%l4,4,%l4		! tp++
146!.Linner
147
148	mulx	%l5,%l2,%g4	!epilogue!
149	mulx	%l6,%l3,%g5
150	add	%l7,%o0,%o0
151	add	%o3,%o0,%o0
152	ld	[%l4+8],%l7		! tp[j]
153	and	%o0,%g1,%o3
154	add	%o4,%o1,%o1
155	srlx	%o0,32,%o0
156	add	%o3,%o1,%o1
157	st	%o1,[%l4]		! tp[j-1]
158	srlx	%o1,32,%o1
159
160	add	%l7,%o0,%o0
161	add	%g4,%o0,%o0
162	and	%o0,%g1,%o3
163	add	%g5,%o1,%o1
164	add	%o3,%o1,%o1
165	st	%o1,[%l4+4]		! tp[j-1]
166	srlx	%o0,32,%o0
167	add	%l0,4,%l0			! i++
168	srlx	%o1,32,%o1
169
170	add	%o0,%o1,%o1
171	cmp	%l0,%i5
172	add	%o2,%o1,%o1
173	st	%o1,[%l4+8]
174
175	srlx	%o1,32,%o2
176	bl,a	%icc,.Louter
177	ld	[%i2+%l0],%l2		! bp[i]
178!.Louter
179
180	add	%l4,12,%l4
181
182.Ltail:
183	add	%i3,%i5,%i3
184	add	%i0,%i5,%i0
185	sub	%g0,%i5,%o7		! k=-num
186	ba	.Lsub
187	subcc	%g0,%g0,%g0		! clear %icc.c
188.align	16
189.Lsub:
190	ld	[%l4+%o7],%o0
191	ld	[%i3+%o7],%o1
192	subccc	%o0,%o1,%o1		! tp[j]-np[j]
193	add	%i0,%o7,%l0
194	add	%o7,4,%o7
195	brnz	%o7,.Lsub
196	st	%o1,[%l0]
197	subccc	%o2,0,%o2		! handle upmost overflow bit
198	sub	%g0,%i5,%o7
199
200.Lcopy:
201	ld	[%l4+%o7],%o1		! conditional copy
202	ld	[%i0+%o7],%o0
203	st	%g0,[%l4+%o7]		! zap tp
204	movcs	%icc,%o1,%o0
205	st	%o0,[%i0+%o7]
206	add	%o7,4,%o7
207	brnz	%o7,.Lcopy
208	nop
209	mov	1,%i0
210	ret
211	restore
212.align	32
213.Lbn_sqr_mont:
214	mulx	%l2,%l2,%o0		! ap[0]*ap[0]
215	mulx	%l5,%l2,%g4		!prologue!
216	and	%o0,%g1,%o3
217	add	%sp,STACK_BIAS+STACK_FRAME,%l4
218	ld	[%i1+8],%l5			!prologue!
219
220	mulx	%i4,%o3,%l3			! "t[0]"*n0
221	srlx	%o0,32,%o0
222	and	%l3,%g1,%l3
223
224	mulx	%o1,%l3,%o1		! np[0]*"t[0]"*n0
225	mulx	%l6,%l3,%o4		!prologue!
226	and	%o0,1,%o5
227	ld	[%i3+8],%l6			!prologue!
228	srlx	%o0,1,%o0
229	add	%o3,%o1,%o1
230	srlx	%o1,32,%o1
231	mov	%g4,%o3			!prologue!
232
233.Lsqr_1st:
234	mulx	%l5,%l2,%g4
235	mulx	%l6,%l3,%g5
236	add	%o3,%o0,%o0		! ap[j]*a0+c0
237	add	%o4,%o1,%o1
238	ld	[%i1+%l1],%l5			! ap[j]
239	and	%o0,%g1,%o3
240	ld	[%i3+%l1],%l6			! np[j]
241	srlx	%o0,32,%o0
242	add	%o3,%o3,%o3
243	or	%o5,%o3,%o3
244	mov	%g5,%o4
245	srlx	%o3,32,%o5
246	add	%l1,4,%l1				! j++
247	and	%o3,%g1,%o3
248	cmp	%l1,%i5
249	add	%o3,%o1,%o1
250	st	%o1,[%l4]
251	mov	%g4,%o3
252	srlx	%o1,32,%o1
253	bl	%icc,.Lsqr_1st
254	add	%l4,4,%l4			! tp++
255!.Lsqr_1st
256
257	mulx	%l5,%l2,%g4		! epilogue
258	mulx	%l6,%l3,%g5
259	add	%o3,%o0,%o0		! ap[j]*a0+c0
260	add	%o4,%o1,%o1
261	and	%o0,%g1,%o3
262	srlx	%o0,32,%o0
263	add	%o3,%o3,%o3
264	or	%o5,%o3,%o3
265	srlx	%o3,32,%o5
266	and	%o3,%g1,%o3
267	add	%o3,%o1,%o1
268	st	%o1,[%l4]
269	srlx	%o1,32,%o1
270
271	add	%g4,%o0,%o0		! ap[j]*a0+c0
272	add	%g5,%o1,%o1
273	and	%o0,%g1,%o3
274	srlx	%o0,32,%o0
275	add	%o3,%o3,%o3
276	or	%o5,%o3,%o3
277	srlx	%o3,32,%o5
278	and	%o3,%g1,%o3
279	add	%o3,%o1,%o1
280	st	%o1,[%l4+4]
281	srlx	%o1,32,%o1
282
283	add	%o0,%o0,%o0
284	or	%o5,%o0,%o0
285	add	%o0,%o1,%o1
286	st	%o1,[%l4+8]
287	srlx	%o1,32,%o2
288
289	ld	[%sp+STACK_BIAS+STACK_FRAME],%g4	! tp[0]
290	ld	[%sp+STACK_BIAS+STACK_FRAME+4],%g5	! tp[1]
291	ld	[%sp+STACK_BIAS+STACK_FRAME+8],%l7	! tp[2]
292	ld	[%i1+4],%l2			! ap[1]
293	ld	[%i1+8],%l5			! ap[2]
294	ld	[%i3],%o1			! np[0]
295	ld	[%i3+4],%l6			! np[1]
296	mulx	%i4,%g4,%l3
297
298	mulx	%l2,%l2,%o0
299	and	%l3,%g1,%l3
300
301	mulx	%o1,%l3,%o1
302	mulx	%l6,%l3,%o4
303	add	%g4,%o1,%o1
304	and	%o0,%g1,%o3
305	ld	[%i3+8],%l6			! np[2]
306	srlx	%o1,32,%o1
307	add	%g5,%o1,%o1
308	srlx	%o0,32,%o0
309	add	%o3,%o1,%o1
310	and	%o0,1,%o5
311	add	%o4,%o1,%o1
312	srlx	%o0,1,%o0
313	mov	12,%l1
314	st	%o1,[%sp+STACK_BIAS+STACK_FRAME]	! tp[0]=
315	srlx	%o1,32,%o1
316	add	%sp,STACK_BIAS+STACK_FRAME+4,%l4
317
318.Lsqr_2nd:
319	mulx	%l5,%l2,%o3
320	mulx	%l6,%l3,%o4
321	add	%o3,%o0,%o0
322	add	%l7,%o5,%o5
323	ld	[%i1+%l1],%l5			! ap[j]
324	and	%o0,%g1,%o3
325	ld	[%i3+%l1],%l6			! np[j]
326	srlx	%o0,32,%o0
327	add	%o4,%o1,%o1
328	ld	[%l4+8],%l7			! tp[j]
329	add	%o3,%o3,%o3
330	add	%l1,4,%l1				! j++
331	add	%o5,%o3,%o3
332	srlx	%o3,32,%o5
333	and	%o3,%g1,%o3
334	cmp	%l1,%i5
335	add	%o3,%o1,%o1
336	st	%o1,[%l4]			! tp[j-1]
337	srlx	%o1,32,%o1
338	bl	%icc,.Lsqr_2nd
339	add	%l4,4,%l4			! tp++
340!.Lsqr_2nd
341
342	mulx	%l5,%l2,%o3
343	mulx	%l6,%l3,%o4
344	add	%o3,%o0,%o0
345	add	%l7,%o5,%o5
346	and	%o0,%g1,%o3
347	srlx	%o0,32,%o0
348	add	%o4,%o1,%o1
349	add	%o3,%o3,%o3
350	add	%o5,%o3,%o3
351	srlx	%o3,32,%o5
352	and	%o3,%g1,%o3
353	add	%o3,%o1,%o1
354	st	%o1,[%l4]			! tp[j-1]
355	srlx	%o1,32,%o1
356
357	add	%o0,%o0,%o0
358	add	%o5,%o0,%o0
359	add	%o0,%o1,%o1
360	add	%o2,%o1,%o1
361	st	%o1,[%l4+4]
362	srlx	%o1,32,%o2
363
364	ld	[%sp+STACK_BIAS+STACK_FRAME],%g5	! tp[0]
365	ld	[%sp+STACK_BIAS+STACK_FRAME+4],%l7	! tp[1]
366	ld	[%i1+8],%l2			! ap[2]
367	ld	[%i3],%o1			! np[0]
368	ld	[%i3+4],%l6			! np[1]
369	mulx	%i4,%g5,%l3
370	and	%l3,%g1,%l3
371	mov	8,%l0
372
373	mulx	%l2,%l2,%o0
374	mulx	%o1,%l3,%o1
375	and	%o0,%g1,%o3
376	add	%g5,%o1,%o1
377	srlx	%o0,32,%o0
378	add	%sp,STACK_BIAS+STACK_FRAME,%l4
379	srlx	%o1,32,%o1
380	and	%o0,1,%o5
381	srlx	%o0,1,%o0
382	mov	4,%l1
383
384.Lsqr_outer:
385.Lsqr_inner1:
386	mulx	%l6,%l3,%o4
387	add	%l7,%o1,%o1
388	add	%l1,4,%l1
389	ld	[%l4+8],%l7
390	cmp	%l1,%l0
391	add	%o4,%o1,%o1
392	ld	[%i3+%l1],%l6
393	st	%o1,[%l4]
394	srlx	%o1,32,%o1
395	bl	%icc,.Lsqr_inner1
396	add	%l4,4,%l4
397!.Lsqr_inner1
398
399	add	%l1,4,%l1
400	ld	[%i1+%l1],%l5			! ap[j]
401	mulx	%l6,%l3,%o4
402	add	%l7,%o1,%o1
403	ld	[%i3+%l1],%l6			! np[j]
404	srlx	%o1,32,%g4
405	and	%o1,%g1,%o1
406	add	%g4,%o5,%o5
407	add	%o3,%o1,%o1
408	ld	[%l4+8],%l7			! tp[j]
409	add	%o4,%o1,%o1
410	st	%o1,[%l4]
411	srlx	%o1,32,%o1
412
413	add	%l1,4,%l1
414	cmp	%l1,%i5
415	be,pn	%icc,.Lsqr_no_inner2
416	add	%l4,4,%l4
417
418.Lsqr_inner2:
419	mulx	%l5,%l2,%o3
420	mulx	%l6,%l3,%o4
421	add	%l7,%o5,%o5
422	add	%o3,%o0,%o0
423	ld	[%i1+%l1],%l5			! ap[j]
424	and	%o0,%g1,%o3
425	ld	[%i3+%l1],%l6			! np[j]
426	srlx	%o0,32,%o0
427	add	%o3,%o3,%o3
428	ld	[%l4+8],%l7			! tp[j]
429	add	%o5,%o3,%o3
430	add	%l1,4,%l1				! j++
431	srlx	%o3,32,%o5
432	and	%o3,%g1,%o3
433	cmp	%l1,%i5
434	add	%o3,%o1,%o1
435	add	%o4,%o1,%o1
436	st	%o1,[%l4]			! tp[j-1]
437	srlx	%o1,32,%o1
438	bl	%icc,.Lsqr_inner2
439	add	%l4,4,%l4			! tp++
440
441.Lsqr_no_inner2:
442	mulx	%l5,%l2,%o3
443	mulx	%l6,%l3,%o4
444	add	%l7,%o5,%o5
445	add	%o3,%o0,%o0
446	and	%o0,%g1,%o3
447	srlx	%o0,32,%o0
448	add	%o3,%o3,%o3
449	add	%o5,%o3,%o3
450	srlx	%o3,32,%o5
451	and	%o3,%g1,%o3
452	add	%o3,%o1,%o1
453	add	%o4,%o1,%o1
454	st	%o1,[%l4]			! tp[j-1]
455	srlx	%o1,32,%o1
456
457	add	%o0,%o0,%o0
458	add	%o5,%o0,%o0
459	add	%o0,%o1,%o1
460	add	%o2,%o1,%o1
461	st	%o1,[%l4+4]
462	srlx	%o1,32,%o2
463
464	add	%l0,4,%l0				! i++
465	ld	[%sp+STACK_BIAS+STACK_FRAME],%g5	! tp[0]
466	ld	[%sp+STACK_BIAS+STACK_FRAME+4],%l7	! tp[1]
467	ld	[%i1+%l0],%l2			! ap[j]
468	ld	[%i3],%o1			! np[0]
469	ld	[%i3+4],%l6			! np[1]
470	mulx	%i4,%g5,%l3
471	and	%l3,%g1,%l3
472	add	%l0,4,%g4
473
474	mulx	%l2,%l2,%o0
475	mulx	%o1,%l3,%o1
476	and	%o0,%g1,%o3
477	add	%g5,%o1,%o1
478	srlx	%o0,32,%o0
479	add	%sp,STACK_BIAS+STACK_FRAME,%l4
480	srlx	%o1,32,%o1
481	and	%o0,1,%o5
482	srlx	%o0,1,%o0
483
484	cmp	%g4,%i5			! i<num-1
485	bl	%icc,.Lsqr_outer
486	mov	4,%l1
487
488.Lsqr_last:
489	mulx	%l6,%l3,%o4
490	add	%l7,%o1,%o1
491	add	%l1,4,%l1
492	ld	[%l4+8],%l7
493	cmp	%l1,%l0
494	add	%o4,%o1,%o1
495	ld	[%i3+%l1],%l6
496	st	%o1,[%l4]
497	srlx	%o1,32,%o1
498	bl	%icc,.Lsqr_last
499	add	%l4,4,%l4
500!.Lsqr_last
501
502	mulx	%l6,%l3,%o4
503	add	%l7,%o3,%o3
504	srlx	%o3,32,%g4
505	and	%o3,%g1,%o3
506	add	%g4,%o5,%o5
507	add	%o3,%o1,%o1
508	add	%o4,%o1,%o1
509	st	%o1,[%l4]
510	srlx	%o1,32,%o1
511
512	add	%o0,%o0,%o0		! recover %o0
513	add	%o5,%o0,%o0
514	add	%o0,%o1,%o1
515	add	%o2,%o1,%o1
516	st	%o1,[%l4+4]
517	srlx	%o1,32,%o2
518
519	ba	.Ltail
520	add	%l4,8,%l4
521.type	bn_mul_mont_int,#function
522.size	bn_mul_mont_int,(.-bn_mul_mont_int)
523.asciz	"Montgomery Multiplication for SPARCv9, CRYPTOGAMS by <appro@openssl.org>"
524.align	32
525