sparcv9-mont.S revision 1.1.10.2 1 .section ".text",#alloc,#execinstr
2
3 .global bn_mul_mont_int
4 .align 32
5 bn_mul_mont_int:
6 cmp %o5,4 ! 128 bits minimum
7 bge,pt %icc,.Lenter
8 sethi %hi(0xffffffff),%g1
9 retl
10 clr %o0
11 .align 32
12 .Lenter:
13 save %sp,-128,%sp
14 sll %i5,2,%i5 ! num*=4
15 or %g1,%lo(0xffffffff),%g1
16 ld [%i4],%i4
17 cmp %i1,%i2
18 and %i5,%g1,%i5
19 ld [%i2],%l2 ! bp[0]
20 nop
21
22 add %sp,0,%o7 ! real top of stack
23 ld [%i1],%o0 ! ap[0] ! redundant in squaring context
24 sub %o7,%i5,%o7
25 ld [%i1+4],%l5 ! ap[1]
26 and %o7,-1024,%o7
27 ld [%i3],%o1 ! np[0]
28 sub %o7,0,%sp ! alloca
29 ld [%i3+4],%l6 ! np[1]
30 be,pt %icc,.Lbn_sqr_mont
31 mov 12,%l1
32
33 mulx %o0,%l2,%o0 ! ap[0]*bp[0]
34 mulx %l5,%l2,%g4 !prologue! ap[1]*bp[0]
35 and %o0,%g1,%o3
36 add %sp,0+128,%l4
37 ld [%i1+8],%l5 !prologue!
38
39 mulx %i4,%o3,%l3 ! "t[0]"*n0
40 and %l3,%g1,%l3
41
42 mulx %o1,%l3,%o1 ! np[0]*"t[0]"*n0
43 mulx %l6,%l3,%o4 !prologue! np[1]*"t[0]"*n0
44 srlx %o0,32,%o0
45 add %o3,%o1,%o1
46 ld [%i3+8],%l6 !prologue!
47 srlx %o1,32,%o1
48 mov %g4,%o3 !prologue!
49
50 .L1st:
51 mulx %l5,%l2,%g4
52 mulx %l6,%l3,%g5
53 add %o3,%o0,%o0
54 ld [%i1+%l1],%l5 ! ap[j]
55 and %o0,%g1,%o3
56 add %o4,%o1,%o1
57 ld [%i3+%l1],%l6 ! np[j]
58 srlx %o0,32,%o0
59 add %o3,%o1,%o1
60 add %l1,4,%l1 ! j++
61 mov %g4,%o3
62 st %o1,[%l4]
63 cmp %l1,%i5
64 mov %g5,%o4
65 srlx %o1,32,%o1
66 bl %icc,.L1st
67 add %l4,4,%l4 ! tp++
68 !.L1st
69
70 mulx %l5,%l2,%g4 !epilogue!
71 mulx %l6,%l3,%g5
72 add %o3,%o0,%o0
73 and %o0,%g1,%o3
74 add %o4,%o1,%o1
75 srlx %o0,32,%o0
76 add %o3,%o1,%o1
77 st %o1,[%l4]
78 srlx %o1,32,%o1
79
80 add %g4,%o0,%o0
81 and %o0,%g1,%o3
82 add %g5,%o1,%o1
83 srlx %o0,32,%o0
84 add %o3,%o1,%o1
85 st %o1,[%l4+4]
86 srlx %o1,32,%o1
87
88 add %o0,%o1,%o1
89 st %o1,[%l4+8]
90 srlx %o1,32,%o2
91
92 mov 4,%l0 ! i++
94 ld [%i2+4],%l2 ! bp[1]
95 .Louter:
96 add %sp,0+128,%l4
97 ld [%i1],%o0 ! ap[0]
98 ld [%i1+4],%l5 ! ap[1]
99 ld [%i3],%o1 ! np[0]
100 ld [%i3+4],%l6 ! np[1]
101 ld [%l4],%g5 ! tp[0]
102 ld [%l4+4],%l7 ! tp[1]
103 mov 12,%l1
104
105 mulx %o0,%l2,%o0
106 mulx %l5,%l2,%g4 !prologue!
107 add %g5,%o0,%o0
108 ld [%i1+8],%l5 !prologue!
109 and %o0,%g1,%o3
110
111 mulx %i4,%o3,%l3
112 and %l3,%g1,%l3
113
114 mulx %o1,%l3,%o1
115 mulx %l6,%l3,%o4 !prologue!
116 srlx %o0,32,%o0
117 add %o3,%o1,%o1
118 ld [%i3+8],%l6 !prologue!
119 srlx %o1,32,%o1
120 mov %g4,%o3 !prologue!
121
122 .Linner:
123 mulx %l5,%l2,%g4
124 mulx %l6,%l3,%g5
125 add %l7,%o0,%o0
126 ld [%i1+%l1],%l5 ! ap[j]
127 add %o3,%o0,%o0
128 add %o4,%o1,%o1
129 ld [%i3+%l1],%l6 ! np[j]
130 and %o0,%g1,%o3
131 ld [%l4+8],%l7 ! tp[j]
132 srlx %o0,32,%o0
133 add %o3,%o1,%o1
134 add %l1,4,%l1 ! j++
135 mov %g4,%o3
136 st %o1,[%l4] ! tp[j-1]
137 srlx %o1,32,%o1
138 mov %g5,%o4
139 cmp %l1,%i5
140 bl %icc,.Linner
141 add %l4,4,%l4 ! tp++
142 !.Linner
143
144 mulx %l5,%l2,%g4 !epilogue!
145 mulx %l6,%l3,%g5
146 add %l7,%o0,%o0
147 add %o3,%o0,%o0
148 ld [%l4+8],%l7 ! tp[j]
149 and %o0,%g1,%o3
150 add %o4,%o1,%o1
151 srlx %o0,32,%o0
152 add %o3,%o1,%o1
153 st %o1,[%l4] ! tp[j-1]
154 srlx %o1,32,%o1
155
156 add %l7,%o0,%o0
157 add %g4,%o0,%o0
158 and %o0,%g1,%o3
159 add %g5,%o1,%o1
160 add %o3,%o1,%o1
161 st %o1,[%l4+4] ! tp[j-1]
162 srlx %o0,32,%o0
163 add %l0,4,%l0 ! i++
164 srlx %o1,32,%o1
165
166 add %o0,%o1,%o1
167 cmp %l0,%i5
168 add %o2,%o1,%o1
169 st %o1,[%l4+8]
170
171 srlx %o1,32,%o2
172 bl,a %icc,.Louter
173 ld [%i2+%l0],%l2 ! bp[i]
174 !.Louter
175
176 add %l4,12,%l4
177
178 .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,0+128,%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,%i2
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 %i2,%o3,%o3
243 mov %g5,%o4
244 srlx %o3,32,%i2
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 %i2,%o3,%o3
264 srlx %o3,32,%i2
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 %i2,%o3,%o3
276 srlx %o3,32,%i2
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 %i2,%o0,%o0
284 add %o0,%o1,%o1
285 st %o1,[%l4+8]
286 srlx %o1,32,%o2
287
288 ld [%sp+0+128],%g4 ! tp[0]
290 ld [%sp+0+128+4],%g5 ! tp[1]
291 ld [%sp+0+128+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,%i2
311 add %o4,%o1,%o1
312 srlx %o0,1,%o0
313 mov 12,%l1
314 st %o1,[%sp+0+128] ! tp[0]=
315 srlx %o1,32,%o1
316 add %sp,0+128+4,%l4
317
318 .Lsqr_2nd:
319 mulx %l5,%l2,%o3
320 mulx %l6,%l3,%o4
321 add %o3,%o0,%o0
322 add %l7,%o1,%o1
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 or %i2,%o3,%o3
332 srlx %o3,32,%i2
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,%o1,%o1
346 and %o0,%g1,%o3
347 srlx %o0,32,%o0
348 add %o4,%o1,%o1
349 add %o3,%o3,%o3
350 or %i2,%o3,%o3
351 srlx %o3,32,%i2
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 or %i2,%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+0+128],%g5 ! tp[0]
366 ld [%sp+0+128+4],%l7 ! tp[1]
367 ld [%i1+8],%l2 ! ap[2]
368 ld [%i3],%o1 ! np[0]
369 ld [%i3+4],%l6 ! np[1]
370 mulx %i4,%g5,%l3
371 and %l3,%g1,%l3
372 mov 8,%l0
373
374 mulx %l2,%l2,%o0
375 mulx %o1,%l3,%o1
376 and %o0,%g1,%o3
377 add %g5,%o1,%o1
378 srlx %o0,32,%o0
379 add %sp,0+128,%l4
380 srlx %o1,32,%o1
381 and %o0,1,%i2
382 srlx %o0,1,%o0
383 mov 4,%l1
384
385 .Lsqr_outer:
386 .Lsqr_inner1:
387 mulx %l6,%l3,%o4
388 add %l7,%o1,%o1
389 add %l1,4,%l1
390 ld [%l4+8],%l7
391 cmp %l1,%l0
392 add %o4,%o1,%o1
393 ld [%i3+%l1],%l6
394 st %o1,[%l4]
395 srlx %o1,32,%o1
396 bl %icc,.Lsqr_inner1
397 add %l4,4,%l4
398 !.Lsqr_inner1
399
400 add %l1,4,%l1
401 ld [%i1+%l1],%l5 ! ap[j]
402 mulx %l6,%l3,%o4
403 add %l7,%o1,%o1
404 ld [%i3+%l1],%l6 ! np[j]
405 add %o3,%o1,%o1
406 ld [%l4+8],%l7 ! tp[j]
407 add %o4,%o1,%o1
408 st %o1,[%l4]
409 srlx %o1,32,%o1
410
411 add %l1,4,%l1
412 cmp %l1,%i5
413 be,pn %icc,.Lsqr_no_inner2
414 add %l4,4,%l4
415
416 .Lsqr_inner2:
417 mulx %l5,%l2,%o3
418 mulx %l6,%l3,%o4
419 add %l7,%o1,%o1
420 add %o3,%o0,%o0
421 ld [%i1+%l1],%l5 ! ap[j]
422 and %o0,%g1,%o3
423 ld [%i3+%l1],%l6 ! np[j]
424 srlx %o0,32,%o0
425 add %o3,%o3,%o3
426 ld [%l4+8],%l7 ! tp[j]
427 or %i2,%o3,%o3
428 add %l1,4,%l1 ! j++
429 srlx %o3,32,%i2
430 and %o3,%g1,%o3
431 cmp %l1,%i5
432 add %o3,%o1,%o1
433 add %o4,%o1,%o1
434 st %o1,[%l4] ! tp[j-1]
435 srlx %o1,32,%o1
436 bl %icc,.Lsqr_inner2
437 add %l4,4,%l4 ! tp++
438
439 .Lsqr_no_inner2:
440 mulx %l5,%l2,%o3
441 mulx %l6,%l3,%o4
442 add %l7,%o1,%o1
443 add %o3,%o0,%o0
444 and %o0,%g1,%o3
445 srlx %o0,32,%o0
446 add %o3,%o3,%o3
447 or %i2,%o3,%o3
448 srlx %o3,32,%i2
449 and %o3,%g1,%o3
450 add %o3,%o1,%o1
451 add %o4,%o1,%o1
452 st %o1,[%l4] ! tp[j-1]
453 srlx %o1,32,%o1
454
455 add %o0,%o0,%o0
456 or %i2,%o0,%o0
457 add %o0,%o1,%o1
458 add %o2,%o1,%o1
459 st %o1,[%l4+4]
460 srlx %o1,32,%o2
461
462 add %l0,4,%l0 ! i++
464 ld [%sp+0+128],%g5 ! tp[0]
465 ld [%sp+0+128+4],%l7 ! tp[1]
466 ld [%i1+%l0],%l2 ! ap[j]
467 ld [%i3],%o1 ! np[0]
468 ld [%i3+4],%l6 ! np[1]
469 mulx %i4,%g5,%l3
470 and %l3,%g1,%l3
471 add %l0,4,%g4
472
473 mulx %l2,%l2,%o0
474 mulx %o1,%l3,%o1
475 and %o0,%g1,%o3
476 add %g5,%o1,%o1
477 srlx %o0,32,%o0
478 add %sp,0+128,%l4
479 srlx %o1,32,%o1
480 and %o0,1,%i2
481 srlx %o0,1,%o0
482
483 cmp %g4,%i5 ! i<num-1
484 bl %icc,.Lsqr_outer
485 mov 4,%l1
486
487 .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,%o1,%o1
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 or %i2,%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 Multipltication for SPARCv9, CRYPTOGAMS by <appro (at) openssl.org>"
521 .align 32
522