Remove building with NOCRYPTO option
[minix.git] / crypto / external / bsd / openssl / lib / libcrypto / arch / sparc / sparcv9-mont.S
blobf818774ca90eb44f6c7d4dcc4ff7905b8efd5c1e
1 .section        ".text",#alloc,#execinstr
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
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
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!
39         mulx    %i4,%o3,%l3             ! "t[0]"*n0
40         and     %l3,%g1,%l3
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!
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
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
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
88         add     %o0,%o1,%o1
89         st      %o1,[%l4+8]
90         srlx    %o1,32,%o2
92         mov     4,%l0                   ! i++
93         ld      [%i2+4],%l2             ! bp[1]
94 .Louter:
95         add     %sp,0+128,%l4
96         ld      [%i1],%o0               ! ap[0]
97         ld      [%i1+4],%l5             ! ap[1]
98         ld      [%i3],%o1               ! np[0]
99         ld      [%i3+4],%l6             ! np[1]
100         ld      [%l4],%g5               ! tp[0]
101         ld      [%l4+4],%l7             ! tp[1]
102         mov     12,%l1
104         mulx    %o0,%l2,%o0
105         mulx    %l5,%l2,%g4     !prologue!
106         add     %g5,%o0,%o0
107         ld      [%i1+8],%l5             !prologue!
108         and     %o0,%g1,%o3
110         mulx    %i4,%o3,%l3
111         and     %l3,%g1,%l3
113         mulx    %o1,%l3,%o1
114         mulx    %l6,%l3,%o4     !prologue!
115         srlx    %o0,32,%o0
116         add     %o3,%o1,%o1
117         ld      [%i3+8],%l6             !prologue!
118         srlx    %o1,32,%o1
119         mov     %g4,%o3         !prologue!
121 .Linner:
122         mulx    %l5,%l2,%g4
123         mulx    %l6,%l3,%g5
124         add     %l7,%o0,%o0
125         ld      [%i1+%l1],%l5           ! ap[j]
126         add     %o3,%o0,%o0
127         add     %o4,%o1,%o1
128         ld      [%i3+%l1],%l6           ! np[j]
129         and     %o0,%g1,%o3
130         ld      [%l4+8],%l7             ! tp[j]
131         srlx    %o0,32,%o0
132         add     %o3,%o1,%o1
133         add     %l1,4,%l1                       ! j++
134         mov     %g4,%o3
135         st      %o1,[%l4]               ! tp[j-1]
136         srlx    %o1,32,%o1
137         mov     %g5,%o4
138         cmp     %l1,%i5
139         bl      %icc,.Linner
140         add     %l4,4,%l4               ! tp++
141 !.Linner
143         mulx    %l5,%l2,%g4     !epilogue!
144         mulx    %l6,%l3,%g5
145         add     %l7,%o0,%o0
146         add     %o3,%o0,%o0
147         ld      [%l4+8],%l7             ! tp[j]
148         and     %o0,%g1,%o3
149         add     %o4,%o1,%o1
150         srlx    %o0,32,%o0
151         add     %o3,%o1,%o1
152         st      %o1,[%l4]               ! tp[j-1]
153         srlx    %o1,32,%o1
155         add     %l7,%o0,%o0
156         add     %g4,%o0,%o0
157         and     %o0,%g1,%o3
158         add     %g5,%o1,%o1
159         add     %o3,%o1,%o1
160         st      %o1,[%l4+4]             ! tp[j-1]
161         srlx    %o0,32,%o0
162         add     %l0,4,%l0                       ! i++
163         srlx    %o1,32,%o1
165         add     %o0,%o1,%o1
166         cmp     %l0,%i5
167         add     %o2,%o1,%o1
168         st      %o1,[%l4+8]
170         srlx    %o1,32,%o2
171         bl,a    %icc,.Louter
172         ld      [%i2+%l0],%l2           ! bp[i]
173 !.Louter
175         add     %l4,12,%l4
177 .Ltail:
178         add     %i3,%i5,%i3
179         add     %i0,%i5,%i0
180         mov     %l4,%i1
181         sub     %g0,%i5,%o7             ! k=-num
182         ba      .Lsub
183         subcc   %g0,%g0,%g0             ! clear %icc.c
184 .align  16
185 .Lsub:
186         ld      [%l4+%o7],%o0
187         ld      [%i3+%o7],%o1
188         subccc  %o0,%o1,%o1             ! tp[j]-np[j]
189         add     %i0,%o7,%l0
190         add     %o7,4,%o7
191         brnz    %o7,.Lsub
192         st      %o1,[%l0]
193         subc    %o2,0,%o2               ! handle upmost overflow bit
194         and     %l4,%o2,%i1
195         andn    %i0,%o2,%i3
196         or      %i1,%i3,%i1
197         sub     %g0,%i5,%o7
199 .Lcopy:
200         ld      [%i1+%o7],%o0           ! copy or in-place refresh
201         st      %g0,[%l4+%o7]           ! zap tp
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,0+128,%l4
215         ld      [%i1+8],%l5                     !prologue!
217         mulx    %i4,%o3,%l3                     ! "t[0]"*n0
218         srlx    %o0,32,%o0
219         and     %l3,%g1,%l3
221         mulx    %o1,%l3,%o1             ! np[0]*"t[0]"*n0
222         mulx    %l6,%l3,%o4             !prologue!
223         and     %o0,1,%i2
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!
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      %i2,%o3,%o3
241         mov     %g5,%o4
242         srlx    %o3,32,%i2
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
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      %i2,%o3,%o3
262         srlx    %o3,32,%i2
263         and     %o3,%g1,%o3
264         add     %o3,%o1,%o1
265         st      %o1,[%l4]
266         srlx    %o1,32,%o1
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      %i2,%o3,%o3
274         srlx    %o3,32,%i2
275         and     %o3,%g1,%o3
276         add     %o3,%o1,%o1
277         st      %o1,[%l4+4]
278         srlx    %o1,32,%o1
280         add     %o0,%o0,%o0
281         or      %i2,%o0,%o0
282         add     %o0,%o1,%o1
283         st      %o1,[%l4+8]
284         srlx    %o1,32,%o2
286         ld      [%sp+0+128],%g4 ! tp[0]
287         ld      [%sp+0+128+4],%g5       ! tp[1]
288         ld      [%sp+0+128+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
295         mulx    %l2,%l2,%o0
296         and     %l3,%g1,%l3
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,%i2
308         add     %o4,%o1,%o1
309         srlx    %o0,1,%o0
310         mov     12,%l1
311         st      %o1,[%sp+0+128] ! tp[0]=
312         srlx    %o1,32,%o1
313         add     %sp,0+128+4,%l4
315 .Lsqr_2nd:
316         mulx    %l5,%l2,%o3
317         mulx    %l6,%l3,%o4
318         add     %o3,%o0,%o0
319         add     %l7,%o1,%o1
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         or      %i2,%o3,%o3
329         srlx    %o3,32,%i2
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
339         mulx    %l5,%l2,%o3
340         mulx    %l6,%l3,%o4
341         add     %o3,%o0,%o0
342         add     %l7,%o1,%o1
343         and     %o0,%g1,%o3
344         srlx    %o0,32,%o0
345         add     %o4,%o1,%o1
346         add     %o3,%o3,%o3
347         or      %i2,%o3,%o3
348         srlx    %o3,32,%i2
349         and     %o3,%g1,%o3
350         add     %o3,%o1,%o1
351         st      %o1,[%l4]                       ! tp[j-1]
352         srlx    %o1,32,%o1
354         add     %o0,%o0,%o0
355         or      %i2,%o0,%o0
356         add     %o0,%o1,%o1
357         add     %o2,%o1,%o1
358         st      %o1,[%l4+4]
359         srlx    %o1,32,%o2
361         ld      [%sp+0+128],%g5 ! tp[0]
362         ld      [%sp+0+128+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
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,0+128,%l4
376         srlx    %o1,32,%o1
377         and     %o0,1,%i2
378         srlx    %o0,1,%o0
379         mov     4,%l1
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
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         add     %o3,%o1,%o1
402         ld      [%l4+8],%l7                     ! tp[j]
403         add     %o4,%o1,%o1
404         st      %o1,[%l4]
405         srlx    %o1,32,%o1
407         add     %l1,4,%l1
408         cmp     %l1,%i5
409         be,pn   %icc,.Lsqr_no_inner2
410         add     %l4,4,%l4
412 .Lsqr_inner2:
413         mulx    %l5,%l2,%o3
414         mulx    %l6,%l3,%o4
415         add     %l7,%o1,%o1
416         add     %o3,%o0,%o0
417         ld      [%i1+%l1],%l5                   ! ap[j]
418         and     %o0,%g1,%o3
419         ld      [%i3+%l1],%l6                   ! np[j]
420         srlx    %o0,32,%o0
421         add     %o3,%o3,%o3
422         ld      [%l4+8],%l7                     ! tp[j]
423         or      %i2,%o3,%o3
424         add     %l1,4,%l1                               ! j++
425         srlx    %o3,32,%i2
426         and     %o3,%g1,%o3
427         cmp     %l1,%i5
428         add     %o3,%o1,%o1
429         add     %o4,%o1,%o1
430         st      %o1,[%l4]                       ! tp[j-1]
431         srlx    %o1,32,%o1
432         bl      %icc,.Lsqr_inner2
433         add     %l4,4,%l4                       ! tp++
435 .Lsqr_no_inner2:
436         mulx    %l5,%l2,%o3
437         mulx    %l6,%l3,%o4
438         add     %l7,%o1,%o1
439         add     %o3,%o0,%o0
440         and     %o0,%g1,%o3
441         srlx    %o0,32,%o0
442         add     %o3,%o3,%o3
443         or      %i2,%o3,%o3
444         srlx    %o3,32,%i2
445         and     %o3,%g1,%o3
446         add     %o3,%o1,%o1
447         add     %o4,%o1,%o1
448         st      %o1,[%l4]                       ! tp[j-1]
449         srlx    %o1,32,%o1
451         add     %o0,%o0,%o0
452         or      %i2,%o0,%o0
453         add     %o0,%o1,%o1
454         add     %o2,%o1,%o1
455         st      %o1,[%l4+4]
456         srlx    %o1,32,%o2
458         add     %l0,4,%l0                               ! i++
459         ld      [%sp+0+128],%g5 ! tp[0]
460         ld      [%sp+0+128+4],%l7       ! tp[1]
461         ld      [%i1+%l0],%l2                   ! ap[j]
462         ld      [%i3],%o1                       ! np[0]
463         ld      [%i3+4],%l6                     ! np[1]
464         mulx    %i4,%g5,%l3
465         and     %l3,%g1,%l3
466         add     %l0,4,%g4
468         mulx    %l2,%l2,%o0
469         mulx    %o1,%l3,%o1
470         and     %o0,%g1,%o3
471         add     %g5,%o1,%o1
472         srlx    %o0,32,%o0
473         add     %sp,0+128,%l4
474         srlx    %o1,32,%o1
475         and     %o0,1,%i2
476         srlx    %o0,1,%o0
478         cmp     %g4,%i5                 ! i<num-1
479         bl      %icc,.Lsqr_outer
480         mov     4,%l1
482 .Lsqr_last:
483         mulx    %l6,%l3,%o4
484         add     %l7,%o1,%o1
485         add     %l1,4,%l1
486         ld      [%l4+8],%l7
487         cmp     %l1,%l0
488         add     %o4,%o1,%o1
489         ld      [%i3+%l1],%l6
490         st      %o1,[%l4]
491         srlx    %o1,32,%o1
492         bl      %icc,.Lsqr_last
493         add     %l4,4,%l4
494 !.Lsqr_last
496         mulx    %l6,%l3,%o4
497         add     %l7,%o1,%o1
498         add     %o3,%o1,%o1
499         add     %o4,%o1,%o1
500         st      %o1,[%l4]
501         srlx    %o1,32,%o1
503         add     %o0,%o0,%o0             ! recover %o0
504         or      %i2,%o0,%o0
505         add     %o0,%o1,%o1
506         add     %o2,%o1,%o1
507         st      %o1,[%l4+4]
508         srlx    %o1,32,%o2
510         ba      .Ltail
511         add     %l4,8,%l4
512 .type   bn_mul_mont_int,#function
513 .size   bn_mul_mont_int,(.-bn_mul_mont_int)
514 .asciz  "Montgomery Multipltication for SPARCv9, CRYPTOGAMS by <appro@openssl.org>"
515 .align  32