sparcv9-mont.S revision 1.4
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	mov	%l4,%i1
183	sub	%g0,%i5,%o7		! k=-num
184	ba	.Lsub
185	subcc	%g0,%g0,%g0		! clear %icc.c
186.align	16
187.Lsub:
188	ld	[%l4+%o7],%o0
189	ld	[%i3+%o7],%o1
190	subccc	%o0,%o1,%o1		! tp[j]-np[j]
191	add	%i0,%o7,%l0
192	add	%o7,4,%o7
193	brnz	%o7,.Lsub
194	st	%o1,[%l0]
195	subc	%o2,0,%o2		! handle upmost overflow bit
196	and	%l4,%o2,%i1
197	andn	%i0,%o2,%i3
198	or	%i1,%i3,%i1
199	sub	%g0,%i5,%o7
200
201.Lcopy:
202	ld	[%i1+%o7],%o0		! copy or in-place refresh
203	st	%g0,[%l4+%o7]		! zap tp
204	st	%o0,[%i0+%o7]
205	add	%o7,4,%o7
206	brnz	%o7,.Lcopy
207	nop
208	mov	1,%i0
209	ret
210	restore
211.align	32
212.Lbn_sqr_mont:
213	mulx	%l2,%l2,%o0		! ap[0]*ap[0]
214	mulx	%l5,%l2,%g4		!prologue!
215	and	%o0,%g1,%o3
216	add	%sp,STACK_BIAS+STACK_FRAME,%l4
217	ld	[%i1+8],%l5			!prologue!
218
219	mulx	%i4,%o3,%l3			! "t[0]"*n0
220	srlx	%o0,32,%o0
221	and	%l3,%g1,%l3
222
223	mulx	%o1,%l3,%o1		! np[0]*"t[0]"*n0
224	mulx	%l6,%l3,%o4		!prologue!
225	and	%o0,1,%o5
226	ld	[%i3+8],%l6			!prologue!
227	srlx	%o0,1,%o0
228	add	%o3,%o1,%o1
229	srlx	%o1,32,%o1
230	mov	%g4,%o3			!prologue!
231
232.Lsqr_1st:
233	mulx	%l5,%l2,%g4
234	mulx	%l6,%l3,%g5
235	add	%o3,%o0,%o0		! ap[j]*a0+c0
236	add	%o4,%o1,%o1
237	ld	[%i1+%l1],%l5			! ap[j]
238	and	%o0,%g1,%o3
239	ld	[%i3+%l1],%l6			! np[j]
240	srlx	%o0,32,%o0
241	add	%o3,%o3,%o3
242	or	%o5,%o3,%o3
243	mov	%g5,%o4
244	srlx	%o3,32,%o5
245	add	%l1,4,%l1				! j++
246	and	%o3,%g1,%o3
247	cmp	%l1,%i5
248	add	%o3,%o1,%o1
249	st	%o1,[%l4]
250	mov	%g4,%o3
251	srlx	%o1,32,%o1
252	bl	%icc,.Lsqr_1st
253	add	%l4,4,%l4			! tp++
254!.Lsqr_1st
255
256	mulx	%l5,%l2,%g4		! epilogue
257	mulx	%l6,%l3,%g5
258	add	%o3,%o0,%o0		! ap[j]*a0+c0
259	add	%o4,%o1,%o1
260	and	%o0,%g1,%o3
261	srlx	%o0,32,%o0
262	add	%o3,%o3,%o3
263	or	%o5,%o3,%o3
264	srlx	%o3,32,%o5
265	and	%o3,%g1,%o3
266	add	%o3,%o1,%o1
267	st	%o1,[%l4]
268	srlx	%o1,32,%o1
269
270	add	%g4,%o0,%o0		! ap[j]*a0+c0
271	add	%g5,%o1,%o1
272	and	%o0,%g1,%o3
273	srlx	%o0,32,%o0
274	add	%o3,%o3,%o3
275	or	%o5,%o3,%o3
276	srlx	%o3,32,%o5
277	and	%o3,%g1,%o3
278	add	%o3,%o1,%o1
279	st	%o1,[%l4+4]
280	srlx	%o1,32,%o1
281
282	add	%o0,%o0,%o0
283	or	%o5,%o0,%o0
284	add	%o0,%o1,%o1
285	st	%o1,[%l4+8]
286	srlx	%o1,32,%o2
287
288	ld	[%sp+STACK_BIAS+STACK_FRAME],%g4	! tp[0]
289	ld	[%sp+STACK_BIAS+STACK_FRAME+4],%g5	! tp[1]
290	ld	[%sp+STACK_BIAS+STACK_FRAME+8],%l7	! tp[2]
291	ld	[%i1+4],%l2			! ap[1]
292	ld	[%i1+8],%l5			! ap[2]
293	ld	[%i3],%o1			! np[0]
294	ld	[%i3+4],%l6			! np[1]
295	mulx	%i4,%g4,%l3
296
297	mulx	%l2,%l2,%o0
298	and	%l3,%g1,%l3
299
300	mulx	%o1,%l3,%o1
301	mulx	%l6,%l3,%o4
302	add	%g4,%o1,%o1
303	and	%o0,%g1,%o3
304	ld	[%i3+8],%l6			! np[2]
305	srlx	%o1,32,%o1
306	add	%g5,%o1,%o1
307	srlx	%o0,32,%o0
308	add	%o3,%o1,%o1
309	and	%o0,1,%o5
310	add	%o4,%o1,%o1
311	srlx	%o0,1,%o0
312	mov	12,%l1
313	st	%o1,[%sp+STACK_BIAS+STACK_FRAME]	! tp[0]=
314	srlx	%o1,32,%o1
315	add	%sp,STACK_BIAS+STACK_FRAME+4,%l4
316
317.Lsqr_2nd:
318	mulx	%l5,%l2,%o3
319	mulx	%l6,%l3,%o4
320	add	%o3,%o0,%o0
321	add	%l7,%o5,%o5
322	ld	[%i1+%l1],%l5			! ap[j]
323	and	%o0,%g1,%o3
324	ld	[%i3+%l1],%l6			! np[j]
325	srlx	%o0,32,%o0
326	add	%o4,%o1,%o1
327	ld	[%l4+8],%l7			! tp[j]
328	add	%o3,%o3,%o3
329	add	%l1,4,%l1				! j++
330	add	%o5,%o3,%o3
331	srlx	%o3,32,%o5
332	and	%o3,%g1,%o3
333	cmp	%l1,%i5
334	add	%o3,%o1,%o1
335	st	%o1,[%l4]			! tp[j-1]
336	srlx	%o1,32,%o1
337	bl	%icc,.Lsqr_2nd
338	add	%l4,4,%l4			! tp++
339!.Lsqr_2nd
340
341	mulx	%l5,%l2,%o3
342	mulx	%l6,%l3,%o4
343	add	%o3,%o0,%o0
344	add	%l7,%o5,%o5
345	and	%o0,%g1,%o3
346	srlx	%o0,32,%o0
347	add	%o4,%o1,%o1
348	add	%o3,%o3,%o3
349	add	%o5,%o3,%o3
350	srlx	%o3,32,%o5
351	and	%o3,%g1,%o3
352	add	%o3,%o1,%o1
353	st	%o1,[%l4]			! tp[j-1]
354	srlx	%o1,32,%o1
355
356	add	%o0,%o0,%o0
357	add	%o5,%o0,%o0
358	add	%o0,%o1,%o1
359	add	%o2,%o1,%o1
360	st	%o1,[%l4+4]
361	srlx	%o1,32,%o2
362
363	ld	[%sp+STACK_BIAS+STACK_FRAME],%g5	! tp[0]
364	ld	[%sp+STACK_BIAS+STACK_FRAME+4],%l7	! tp[1]
365	ld	[%i1+8],%l2			! ap[2]
366	ld	[%i3],%o1			! np[0]
367	ld	[%i3+4],%l6			! np[1]
368	mulx	%i4,%g5,%l3
369	and	%l3,%g1,%l3
370	mov	8,%l0
371
372	mulx	%l2,%l2,%o0
373	mulx	%o1,%l3,%o1
374	and	%o0,%g1,%o3
375	add	%g5,%o1,%o1
376	srlx	%o0,32,%o0
377	add	%sp,STACK_BIAS+STACK_FRAME,%l4
378	srlx	%o1,32,%o1
379	and	%o0,1,%o5
380	srlx	%o0,1,%o0
381	mov	4,%l1
382
383.Lsqr_outer:
384.Lsqr_inner1:
385	mulx	%l6,%l3,%o4
386	add	%l7,%o1,%o1
387	add	%l1,4,%l1
388	ld	[%l4+8],%l7
389	cmp	%l1,%l0
390	add	%o4,%o1,%o1
391	ld	[%i3+%l1],%l6
392	st	%o1,[%l4]
393	srlx	%o1,32,%o1
394	bl	%icc,.Lsqr_inner1
395	add	%l4,4,%l4
396!.Lsqr_inner1
397
398	add	%l1,4,%l1
399	ld	[%i1+%l1],%l5			! ap[j]
400	mulx	%l6,%l3,%o4
401	add	%l7,%o1,%o1
402	ld	[%i3+%l1],%l6			! np[j]
403	add	%o3,%o1,%o1
404	ld	[%l4+8],%l7			! tp[j]
405	add	%o4,%o1,%o1
406	st	%o1,[%l4]
407	srlx	%o1,32,%o1
408
409	add	%l1,4,%l1
410	cmp	%l1,%i5
411	be,pn	%icc,.Lsqr_no_inner2
412	add	%l4,4,%l4
413
414.Lsqr_inner2:
415	mulx	%l5,%l2,%o3
416	mulx	%l6,%l3,%o4
417	add	%l7,%o5,%o5
418	add	%o3,%o0,%o0
419	ld	[%i1+%l1],%l5			! ap[j]
420	and	%o0,%g1,%o3
421	ld	[%i3+%l1],%l6			! np[j]
422	srlx	%o0,32,%o0
423	add	%o3,%o3,%o3
424	ld	[%l4+8],%l7			! tp[j]
425	add	%o5,%o3,%o3
426	add	%l1,4,%l1				! j++
427	srlx	%o3,32,%o5
428	and	%o3,%g1,%o3
429	cmp	%l1,%i5
430	add	%o3,%o1,%o1
431	add	%o4,%o1,%o1
432	st	%o1,[%l4]			! tp[j-1]
433	srlx	%o1,32,%o1
434	bl	%icc,.Lsqr_inner2
435	add	%l4,4,%l4			! tp++
436
437.Lsqr_no_inner2:
438	mulx	%l5,%l2,%o3
439	mulx	%l6,%l3,%o4
440	add	%l7,%o5,%o5
441	add	%o3,%o0,%o0
442	and	%o0,%g1,%o3
443	srlx	%o0,32,%o0
444	add	%o3,%o3,%o3
445	add	%o5,%o3,%o3
446	srlx	%o3,32,%o5
447	and	%o3,%g1,%o3
448	add	%o3,%o1,%o1
449	add	%o4,%o1,%o1
450	st	%o1,[%l4]			! tp[j-1]
451	srlx	%o1,32,%o1
452
453	add	%o0,%o0,%o0
454	add	%o5,%o0,%o0
455	add	%o0,%o1,%o1
456	add	%o2,%o1,%o1
457	st	%o1,[%l4+4]
458	srlx	%o1,32,%o2
459
460	add	%l0,4,%l0				! i++
461	ld	[%sp+STACK_BIAS+STACK_FRAME],%g5	! tp[0]
462	ld	[%sp+STACK_BIAS+STACK_FRAME+4],%l7	! tp[1]
463	ld	[%i1+%l0],%l2			! ap[j]
464	ld	[%i3],%o1			! np[0]
465	ld	[%i3+4],%l6			! np[1]
466	mulx	%i4,%g5,%l3
467	and	%l3,%g1,%l3
468	add	%l0,4,%g4
469
470	mulx	%l2,%l2,%o0
471	mulx	%o1,%l3,%o1
472	and	%o0,%g1,%o3
473	add	%g5,%o1,%o1
474	srlx	%o0,32,%o0
475	add	%sp,STACK_BIAS+STACK_FRAME,%l4
476	srlx	%o1,32,%o1
477	and	%o0,1,%o5
478	srlx	%o0,1,%o0
479
480	cmp	%g4,%i5			! i<num-1
481	bl	%icc,.Lsqr_outer
482	mov	4,%l1
483
484.Lsqr_last:
485	mulx	%l6,%l3,%o4
486	add	%l7,%o1,%o1
487	add	%l1,4,%l1
488	ld	[%l4+8],%l7
489	cmp	%l1,%l0
490	add	%o4,%o1,%o1
491	ld	[%i3+%l1],%l6
492	st	%o1,[%l4]
493	srlx	%o1,32,%o1
494	bl	%icc,.Lsqr_last
495	add	%l4,4,%l4
496!.Lsqr_last
497
498	mulx	%l6,%l3,%o4
499	add	%l7,%o3,%o3
500	srlx	%o3,32,%g4
501	and	%o3,%g1,%o3
502	add	%g4,%o5,%o5
503	add	%o3,%o1,%o1
504	add	%o4,%o1,%o1
505	st	%o1,[%l4]
506	srlx	%o1,32,%o1
507
508	add	%o0,%o0,%o0		! recover %o0
509	add	%o5,%o0,%o0
510	add	%o0,%o1,%o1
511	add	%o2,%o1,%o1
512	st	%o1,[%l4+4]
513	srlx	%o1,32,%o2
514
515	ba	.Ltail
516	add	%l4,8,%l4
517.type	bn_mul_mont_int,#function
518.size	bn_mul_mont_int,(.-bn_mul_mont_int)
519.asciz	"Montgomery Multipltication for SPARCv9, CRYPTOGAMS by <appro@openssl.org>"
520.align	32
521