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