Following the license change, modify the boilerplates in crypto/bn/
[openssl.git] / crypto / bn / asm / s390x.S
1 .ident "s390x.S, version 1.1"
2 // ====================================================================
3 // Copyright 2007-2016 The OpenSSL Project Authors. All Rights Reserved.
4 //
5 // Licensed under the Apache License 2.0 (the "License").  You may not use
6 // this file except in compliance with the License.  You can obtain a copy
7 // in the file LICENSE in the source distribution or at
8 // https://www.openssl.org/source/license.html
9 // ====================================================================
10
11 .text
12
13 #define zero    %r0
14
15 // BN_ULONG bn_mul_add_words(BN_ULONG *r2,BN_ULONG *r3,int r4,BN_ULONG r5);
16 .globl  bn_mul_add_words
17 .type   bn_mul_add_words,@function
18 .align  4
19 bn_mul_add_words:
20         lghi    zero,0          // zero = 0
21         la      %r1,0(%r2)      // put rp aside [to give way to]
22         lghi    %r2,0           // return value
23         ltgfr   %r4,%r4
24         bler    %r14            // if (len<=0) return 0;
25
26         stmg    %r6,%r13,48(%r15)
27         lghi    %r2,3
28         lghi    %r12,0          // carry = 0
29         slgr    %r1,%r3         // rp-=ap
30         nr      %r2,%r4         // len%4
31         sra     %r4,2           // cnt=len/4
32         jz      .Loop1_madd     // carry is incidentally cleared if branch taken
33         algr    zero,zero       // clear carry
34
35         lg      %r7,0(%r3)      // ap[0]
36         lg      %r9,8(%r3)      // ap[1]
37         mlgr    %r6,%r5         // *=w
38         brct    %r4,.Loop4_madd
39         j       .Loop4_madd_tail
40
41 .Loop4_madd:
42         mlgr    %r8,%r5
43         lg      %r11,16(%r3)    // ap[i+2]
44         alcgr   %r7,%r12        // +=carry
45         alcgr   %r6,zero
46         alg     %r7,0(%r3,%r1)  // +=rp[i]
47         stg     %r7,0(%r3,%r1)  // rp[i]=
48
49         mlgr    %r10,%r5
50         lg      %r13,24(%r3)
51         alcgr   %r9,%r6
52         alcgr   %r8,zero
53         alg     %r9,8(%r3,%r1)
54         stg     %r9,8(%r3,%r1)
55
56         mlgr    %r12,%r5
57         lg      %r7,32(%r3)
58         alcgr   %r11,%r8
59         alcgr   %r10,zero
60         alg     %r11,16(%r3,%r1)
61         stg     %r11,16(%r3,%r1)
62
63         mlgr    %r6,%r5
64         lg      %r9,40(%r3)
65         alcgr   %r13,%r10
66         alcgr   %r12,zero
67         alg     %r13,24(%r3,%r1)
68         stg     %r13,24(%r3,%r1)
69
70         la      %r3,32(%r3)     // i+=4
71         brct    %r4,.Loop4_madd
72
73 .Loop4_madd_tail:
74         mlgr    %r8,%r5
75         lg      %r11,16(%r3)
76         alcgr   %r7,%r12        // +=carry
77         alcgr   %r6,zero
78         alg     %r7,0(%r3,%r1)  // +=rp[i]
79         stg     %r7,0(%r3,%r1)  // rp[i]=
80
81         mlgr    %r10,%r5
82         lg      %r13,24(%r3)
83         alcgr   %r9,%r6
84         alcgr   %r8,zero
85         alg     %r9,8(%r3,%r1)
86         stg     %r9,8(%r3,%r1)
87
88         mlgr    %r12,%r5
89         alcgr   %r11,%r8
90         alcgr   %r10,zero
91         alg     %r11,16(%r3,%r1)
92         stg     %r11,16(%r3,%r1)
93
94         alcgr   %r13,%r10
95         alcgr   %r12,zero
96         alg     %r13,24(%r3,%r1)
97         stg     %r13,24(%r3,%r1)
98
99         la      %r3,32(%r3)     // i+=4
100
101         la      %r2,1(%r2)      // see if len%4 is zero ...
102         brct    %r2,.Loop1_madd // without touching condition code:-)
103
104 .Lend_madd:
105         lgr     %r2,zero        // return value
106         alcgr   %r2,%r12        // collect even carry bit
107         lmg     %r6,%r13,48(%r15)
108         br      %r14
109
110 .Loop1_madd:
111         lg      %r7,0(%r3)      // ap[i]
112         mlgr    %r6,%r5         // *=w
113         alcgr   %r7,%r12        // +=carry
114         alcgr   %r6,zero
115         alg     %r7,0(%r3,%r1)  // +=rp[i]
116         stg     %r7,0(%r3,%r1)  // rp[i]=
117
118         lgr     %r12,%r6
119         la      %r3,8(%r3)      // i++
120         brct    %r2,.Loop1_madd
121
122         j       .Lend_madd
123 .size   bn_mul_add_words,.-bn_mul_add_words
124
125 // BN_ULONG bn_mul_words(BN_ULONG *r2,BN_ULONG *r3,int r4,BN_ULONG r5);
126 .globl  bn_mul_words
127 .type   bn_mul_words,@function
128 .align  4
129 bn_mul_words:
130         lghi    zero,0          // zero = 0
131         la      %r1,0(%r2)      // put rp aside
132         lghi    %r2,0           // i=0;
133         ltgfr   %r4,%r4
134         bler    %r14            // if (len<=0) return 0;
135
136         stmg    %r6,%r10,48(%r15)
137         lghi    %r10,3
138         lghi    %r8,0           // carry = 0
139         nr      %r10,%r4        // len%4
140         sra     %r4,2           // cnt=len/4
141         jz      .Loop1_mul      // carry is incidentally cleared if branch taken
142         algr    zero,zero       // clear carry
143
144 .Loop4_mul:
145         lg      %r7,0(%r2,%r3)  // ap[i]
146         mlgr    %r6,%r5         // *=w
147         alcgr   %r7,%r8         // +=carry
148         stg     %r7,0(%r2,%r1)  // rp[i]=
149
150         lg      %r9,8(%r2,%r3)
151         mlgr    %r8,%r5
152         alcgr   %r9,%r6
153         stg     %r9,8(%r2,%r1)
154
155         lg      %r7,16(%r2,%r3)
156         mlgr    %r6,%r5
157         alcgr   %r7,%r8
158         stg     %r7,16(%r2,%r1)
159
160         lg      %r9,24(%r2,%r3)
161         mlgr    %r8,%r5
162         alcgr   %r9,%r6
163         stg     %r9,24(%r2,%r1)
164
165         la      %r2,32(%r2)     // i+=4
166         brct    %r4,.Loop4_mul
167
168         la      %r10,1(%r10)            // see if len%4 is zero ...
169         brct    %r10,.Loop1_mul         // without touching condition code:-)
170
171 .Lend_mul:
172         alcgr   %r8,zero        // collect carry bit
173         lgr     %r2,%r8
174         lmg     %r6,%r10,48(%r15)
175         br      %r14
176
177 .Loop1_mul:
178         lg      %r7,0(%r2,%r3)  // ap[i]
179         mlgr    %r6,%r5         // *=w
180         alcgr   %r7,%r8         // +=carry
181         stg     %r7,0(%r2,%r1)  // rp[i]=
182
183         lgr     %r8,%r6
184         la      %r2,8(%r2)      // i++
185         brct    %r10,.Loop1_mul
186
187         j       .Lend_mul
188 .size   bn_mul_words,.-bn_mul_words
189
190 // void bn_sqr_words(BN_ULONG *r2,BN_ULONG *r2,int r4)
191 .globl  bn_sqr_words
192 .type   bn_sqr_words,@function
193 .align  4
194 bn_sqr_words:
195         ltgfr   %r4,%r4
196         bler    %r14
197
198         stmg    %r6,%r7,48(%r15)
199         srag    %r1,%r4,2       // cnt=len/4
200         jz      .Loop1_sqr
201
202 .Loop4_sqr:
203         lg      %r7,0(%r3)
204         mlgr    %r6,%r7
205         stg     %r7,0(%r2)
206         stg     %r6,8(%r2)
207
208         lg      %r7,8(%r3)
209         mlgr    %r6,%r7
210         stg     %r7,16(%r2)
211         stg     %r6,24(%r2)
212
213         lg      %r7,16(%r3)
214         mlgr    %r6,%r7
215         stg     %r7,32(%r2)
216         stg     %r6,40(%r2)
217
218         lg      %r7,24(%r3)
219         mlgr    %r6,%r7
220         stg     %r7,48(%r2)
221         stg     %r6,56(%r2)
222
223         la      %r3,32(%r3)
224         la      %r2,64(%r2)
225         brct    %r1,.Loop4_sqr
226
227         lghi    %r1,3
228         nr      %r4,%r1         // cnt=len%4
229         jz      .Lend_sqr
230
231 .Loop1_sqr:
232         lg      %r7,0(%r3)
233         mlgr    %r6,%r7
234         stg     %r7,0(%r2)
235         stg     %r6,8(%r2)
236
237         la      %r3,8(%r3)
238         la      %r2,16(%r2)
239         brct    %r4,.Loop1_sqr
240
241 .Lend_sqr:
242         lmg     %r6,%r7,48(%r15)
243         br      %r14
244 .size   bn_sqr_words,.-bn_sqr_words
245
246 // BN_ULONG bn_div_words(BN_ULONG h,BN_ULONG l,BN_ULONG d);
247 .globl  bn_div_words
248 .type   bn_div_words,@function
249 .align  4
250 bn_div_words:
251         dlgr    %r2,%r4
252         lgr     %r2,%r3
253         br      %r14
254 .size   bn_div_words,.-bn_div_words
255
256 // BN_ULONG bn_add_words(BN_ULONG *r2,BN_ULONG *r3,BN_ULONG *r4,int r5);
257 .globl  bn_add_words
258 .type   bn_add_words,@function
259 .align  4
260 bn_add_words:
261         la      %r1,0(%r2)      // put rp aside
262         lghi    %r2,0           // i=0
263         ltgfr   %r5,%r5
264         bler    %r14            // if (len<=0) return 0;
265
266         stg     %r6,48(%r15)
267         lghi    %r6,3
268         nr      %r6,%r5         // len%4
269         sra     %r5,2           // len/4, use sra because it sets condition code
270         jz      .Loop1_add      // carry is incidentally cleared if branch taken
271         algr    %r2,%r2         // clear carry
272
273 .Loop4_add:
274         lg      %r0,0(%r2,%r3)
275         alcg    %r0,0(%r2,%r4)
276         stg     %r0,0(%r2,%r1)
277         lg      %r0,8(%r2,%r3)
278         alcg    %r0,8(%r2,%r4)
279         stg     %r0,8(%r2,%r1)
280         lg      %r0,16(%r2,%r3)
281         alcg    %r0,16(%r2,%r4)
282         stg     %r0,16(%r2,%r1)
283         lg      %r0,24(%r2,%r3)
284         alcg    %r0,24(%r2,%r4)
285         stg     %r0,24(%r2,%r1)
286
287         la      %r2,32(%r2)     // i+=4
288         brct    %r5,.Loop4_add
289
290         la      %r6,1(%r6)      // see if len%4 is zero ...
291         brct    %r6,.Loop1_add  // without touching condition code:-)
292
293 .Lexit_add:
294         lghi    %r2,0
295         alcgr   %r2,%r2
296         lg      %r6,48(%r15)
297         br      %r14
298
299 .Loop1_add:
300         lg      %r0,0(%r2,%r3)
301         alcg    %r0,0(%r2,%r4)
302         stg     %r0,0(%r2,%r1)
303
304         la      %r2,8(%r2)      // i++
305         brct    %r6,.Loop1_add
306
307         j       .Lexit_add
308 .size   bn_add_words,.-bn_add_words
309
310 // BN_ULONG bn_sub_words(BN_ULONG *r2,BN_ULONG *r3,BN_ULONG *r4,int r5);
311 .globl  bn_sub_words
312 .type   bn_sub_words,@function
313 .align  4
314 bn_sub_words:
315         la      %r1,0(%r2)      // put rp aside
316         lghi    %r2,0           // i=0
317         ltgfr   %r5,%r5
318         bler    %r14            // if (len<=0) return 0;
319
320         stg     %r6,48(%r15)
321         lghi    %r6,3
322         nr      %r6,%r5         // len%4
323         sra     %r5,2           // len/4, use sra because it sets condition code
324         jnz     .Loop4_sub      // borrow is incidentally cleared if branch taken
325         slgr    %r2,%r2         // clear borrow
326
327 .Loop1_sub:
328         lg      %r0,0(%r2,%r3)
329         slbg    %r0,0(%r2,%r4)
330         stg     %r0,0(%r2,%r1)
331
332         la      %r2,8(%r2)      // i++
333         brct    %r6,.Loop1_sub
334         j       .Lexit_sub
335
336 .Loop4_sub:
337         lg      %r0,0(%r2,%r3)
338         slbg    %r0,0(%r2,%r4)
339         stg     %r0,0(%r2,%r1)
340         lg      %r0,8(%r2,%r3)
341         slbg    %r0,8(%r2,%r4)
342         stg     %r0,8(%r2,%r1)
343         lg      %r0,16(%r2,%r3)
344         slbg    %r0,16(%r2,%r4)
345         stg     %r0,16(%r2,%r1)
346         lg      %r0,24(%r2,%r3)
347         slbg    %r0,24(%r2,%r4)
348         stg     %r0,24(%r2,%r1)
349
350         la      %r2,32(%r2)     // i+=4
351         brct    %r5,.Loop4_sub
352
353         la      %r6,1(%r6)      // see if len%4 is zero ...
354         brct    %r6,.Loop1_sub  // without touching condition code:-)
355
356 .Lexit_sub:
357         lghi    %r2,0
358         slbgr   %r2,%r2
359         lcgr    %r2,%r2
360         lg      %r6,48(%r15)
361         br      %r14
362 .size   bn_sub_words,.-bn_sub_words
363
364 #define c1      %r1
365 #define c2      %r5
366 #define c3      %r8
367
368 #define mul_add_c(ai,bi,c1,c2,c3)       \
369         lg      %r7,ai*8(%r3);          \
370         mlg     %r6,bi*8(%r4);          \
371         algr    c1,%r7;                 \
372         alcgr   c2,%r6;                 \
373         alcgr   c3,zero
374
375 // void bn_mul_comba8(BN_ULONG *r2,BN_ULONG *r3,BN_ULONG *r4);
376 .globl  bn_mul_comba8
377 .type   bn_mul_comba8,@function
378 .align  4
379 bn_mul_comba8:
380         stmg    %r6,%r8,48(%r15)
381
382         lghi    c1,0
383         lghi    c2,0
384         lghi    c3,0
385         lghi    zero,0
386
387         mul_add_c(0,0,c1,c2,c3);
388         stg     c1,0*8(%r2)
389         lghi    c1,0
390
391         mul_add_c(0,1,c2,c3,c1);
392         mul_add_c(1,0,c2,c3,c1);
393         stg     c2,1*8(%r2)
394         lghi    c2,0
395
396         mul_add_c(2,0,c3,c1,c2);
397         mul_add_c(1,1,c3,c1,c2);
398         mul_add_c(0,2,c3,c1,c2);
399         stg     c3,2*8(%r2)
400         lghi    c3,0
401
402         mul_add_c(0,3,c1,c2,c3);
403         mul_add_c(1,2,c1,c2,c3);
404         mul_add_c(2,1,c1,c2,c3);
405         mul_add_c(3,0,c1,c2,c3);
406         stg     c1,3*8(%r2)
407         lghi    c1,0
408
409         mul_add_c(4,0,c2,c3,c1);
410         mul_add_c(3,1,c2,c3,c1);
411         mul_add_c(2,2,c2,c3,c1);
412         mul_add_c(1,3,c2,c3,c1);
413         mul_add_c(0,4,c2,c3,c1);
414         stg     c2,4*8(%r2)
415         lghi    c2,0
416
417         mul_add_c(0,5,c3,c1,c2);
418         mul_add_c(1,4,c3,c1,c2);
419         mul_add_c(2,3,c3,c1,c2);
420         mul_add_c(3,2,c3,c1,c2);
421         mul_add_c(4,1,c3,c1,c2);
422         mul_add_c(5,0,c3,c1,c2);
423         stg     c3,5*8(%r2)
424         lghi    c3,0
425
426         mul_add_c(6,0,c1,c2,c3);
427         mul_add_c(5,1,c1,c2,c3);
428         mul_add_c(4,2,c1,c2,c3);
429         mul_add_c(3,3,c1,c2,c3);
430         mul_add_c(2,4,c1,c2,c3);
431         mul_add_c(1,5,c1,c2,c3);
432         mul_add_c(0,6,c1,c2,c3);
433         stg     c1,6*8(%r2)
434         lghi    c1,0
435
436         mul_add_c(0,7,c2,c3,c1);
437         mul_add_c(1,6,c2,c3,c1);
438         mul_add_c(2,5,c2,c3,c1);
439         mul_add_c(3,4,c2,c3,c1);
440         mul_add_c(4,3,c2,c3,c1);
441         mul_add_c(5,2,c2,c3,c1);
442         mul_add_c(6,1,c2,c3,c1);
443         mul_add_c(7,0,c2,c3,c1);
444         stg     c2,7*8(%r2)
445         lghi    c2,0
446
447         mul_add_c(7,1,c3,c1,c2);
448         mul_add_c(6,2,c3,c1,c2);
449         mul_add_c(5,3,c3,c1,c2);
450         mul_add_c(4,4,c3,c1,c2);
451         mul_add_c(3,5,c3,c1,c2);
452         mul_add_c(2,6,c3,c1,c2);
453         mul_add_c(1,7,c3,c1,c2);
454         stg     c3,8*8(%r2)
455         lghi    c3,0
456
457         mul_add_c(2,7,c1,c2,c3);
458         mul_add_c(3,6,c1,c2,c3);
459         mul_add_c(4,5,c1,c2,c3);
460         mul_add_c(5,4,c1,c2,c3);
461         mul_add_c(6,3,c1,c2,c3);
462         mul_add_c(7,2,c1,c2,c3);
463         stg     c1,9*8(%r2)
464         lghi    c1,0
465
466         mul_add_c(7,3,c2,c3,c1);
467         mul_add_c(6,4,c2,c3,c1);
468         mul_add_c(5,5,c2,c3,c1);
469         mul_add_c(4,6,c2,c3,c1);
470         mul_add_c(3,7,c2,c3,c1);
471         stg     c2,10*8(%r2)
472         lghi    c2,0
473
474         mul_add_c(4,7,c3,c1,c2);
475         mul_add_c(5,6,c3,c1,c2);
476         mul_add_c(6,5,c3,c1,c2);
477         mul_add_c(7,4,c3,c1,c2);
478         stg     c3,11*8(%r2)
479         lghi    c3,0
480
481         mul_add_c(7,5,c1,c2,c3);
482         mul_add_c(6,6,c1,c2,c3);
483         mul_add_c(5,7,c1,c2,c3);
484         stg     c1,12*8(%r2)
485         lghi    c1,0
486
487
488         mul_add_c(6,7,c2,c3,c1);
489         mul_add_c(7,6,c2,c3,c1);
490         stg     c2,13*8(%r2)
491         lghi    c2,0
492
493         mul_add_c(7,7,c3,c1,c2);
494         stg     c3,14*8(%r2)
495         stg     c1,15*8(%r2)
496
497         lmg     %r6,%r8,48(%r15)
498         br      %r14
499 .size   bn_mul_comba8,.-bn_mul_comba8
500
501 // void bn_mul_comba4(BN_ULONG *r2,BN_ULONG *r3,BN_ULONG *r4);
502 .globl  bn_mul_comba4
503 .type   bn_mul_comba4,@function
504 .align  4
505 bn_mul_comba4:
506         stmg    %r6,%r8,48(%r15)
507
508         lghi    c1,0
509         lghi    c2,0
510         lghi    c3,0
511         lghi    zero,0
512
513         mul_add_c(0,0,c1,c2,c3);
514         stg     c1,0*8(%r3)
515         lghi    c1,0
516
517         mul_add_c(0,1,c2,c3,c1);
518         mul_add_c(1,0,c2,c3,c1);
519         stg     c2,1*8(%r2)
520         lghi    c2,0
521
522         mul_add_c(2,0,c3,c1,c2);
523         mul_add_c(1,1,c3,c1,c2);
524         mul_add_c(0,2,c3,c1,c2);
525         stg     c3,2*8(%r2)
526         lghi    c3,0
527
528         mul_add_c(0,3,c1,c2,c3);
529         mul_add_c(1,2,c1,c2,c3);
530         mul_add_c(2,1,c1,c2,c3);
531         mul_add_c(3,0,c1,c2,c3);
532         stg     c1,3*8(%r2)
533         lghi    c1,0
534
535         mul_add_c(3,1,c2,c3,c1);
536         mul_add_c(2,2,c2,c3,c1);
537         mul_add_c(1,3,c2,c3,c1);
538         stg     c2,4*8(%r2)
539         lghi    c2,0
540
541         mul_add_c(2,3,c3,c1,c2);
542         mul_add_c(3,2,c3,c1,c2);
543         stg     c3,5*8(%r2)
544         lghi    c3,0
545
546         mul_add_c(3,3,c1,c2,c3);
547         stg     c1,6*8(%r2)
548         stg     c2,7*8(%r2)
549
550         stmg    %r6,%r8,48(%r15)
551         br      %r14
552 .size   bn_mul_comba4,.-bn_mul_comba4
553
554 #define sqr_add_c(ai,c1,c2,c3)          \
555         lg      %r7,ai*8(%r3);          \
556         mlgr    %r6,%r7;                \
557         algr    c1,%r7;                 \
558         alcgr   c2,%r6;                 \
559         alcgr   c3,zero
560
561 #define sqr_add_c2(ai,aj,c1,c2,c3)      \
562         lg      %r7,ai*8(%r3);          \
563         mlg     %r6,aj*8(%r3);          \
564         algr    c1,%r7;                 \
565         alcgr   c2,%r6;                 \
566         alcgr   c3,zero;                \
567         algr    c1,%r7;                 \
568         alcgr   c2,%r6;                 \
569         alcgr   c3,zero
570
571 // void bn_sqr_comba8(BN_ULONG *r2,BN_ULONG *r3);
572 .globl  bn_sqr_comba8
573 .type   bn_sqr_comba8,@function
574 .align  4
575 bn_sqr_comba8:
576         stmg    %r6,%r8,48(%r15)
577
578         lghi    c1,0
579         lghi    c2,0
580         lghi    c3,0
581         lghi    zero,0
582
583         sqr_add_c(0,c1,c2,c3);
584         stg     c1,0*8(%r2)
585         lghi    c1,0
586
587         sqr_add_c2(1,0,c2,c3,c1);
588         stg     c2,1*8(%r2)
589         lghi    c2,0
590
591         sqr_add_c(1,c3,c1,c2);
592         sqr_add_c2(2,0,c3,c1,c2);
593         stg     c3,2*8(%r2)
594         lghi    c3,0
595
596         sqr_add_c2(3,0,c1,c2,c3);
597         sqr_add_c2(2,1,c1,c2,c3);
598         stg     c1,3*8(%r2)
599         lghi    c1,0
600
601         sqr_add_c(2,c2,c3,c1);
602         sqr_add_c2(3,1,c2,c3,c1);
603         sqr_add_c2(4,0,c2,c3,c1);
604         stg     c2,4*8(%r2)
605         lghi    c2,0
606
607         sqr_add_c2(5,0,c3,c1,c2);
608         sqr_add_c2(4,1,c3,c1,c2);
609         sqr_add_c2(3,2,c3,c1,c2);
610         stg     c3,5*8(%r2)
611         lghi    c3,0
612
613         sqr_add_c(3,c1,c2,c3);
614         sqr_add_c2(4,2,c1,c2,c3);
615         sqr_add_c2(5,1,c1,c2,c3);
616         sqr_add_c2(6,0,c1,c2,c3);
617         stg     c1,6*8(%r2)
618         lghi    c1,0
619
620         sqr_add_c2(7,0,c2,c3,c1);
621         sqr_add_c2(6,1,c2,c3,c1);
622         sqr_add_c2(5,2,c2,c3,c1);
623         sqr_add_c2(4,3,c2,c3,c1);
624         stg     c2,7*8(%r2)
625         lghi    c2,0
626
627         sqr_add_c(4,c3,c1,c2);
628         sqr_add_c2(5,3,c3,c1,c2);
629         sqr_add_c2(6,2,c3,c1,c2);
630         sqr_add_c2(7,1,c3,c1,c2);
631         stg     c3,8*8(%r2)
632         lghi    c3,0
633
634         sqr_add_c2(7,2,c1,c2,c3);
635         sqr_add_c2(6,3,c1,c2,c3);
636         sqr_add_c2(5,4,c1,c2,c3);
637         stg     c1,9*8(%r2)
638         lghi    c1,0
639
640         sqr_add_c(5,c2,c3,c1);
641         sqr_add_c2(6,4,c2,c3,c1);
642         sqr_add_c2(7,3,c2,c3,c1);
643         stg     c2,10*8(%r2)
644         lghi    c2,0
645
646         sqr_add_c2(7,4,c3,c1,c2);
647         sqr_add_c2(6,5,c3,c1,c2);
648         stg     c3,11*8(%r2)
649         lghi    c3,0
650
651         sqr_add_c(6,c1,c2,c3);
652         sqr_add_c2(7,5,c1,c2,c3);
653         stg     c1,12*8(%r2)
654         lghi    c1,0
655
656         sqr_add_c2(7,6,c2,c3,c1);
657         stg     c2,13*8(%r2)
658         lghi    c2,0
659
660         sqr_add_c(7,c3,c1,c2);
661         stg     c3,14*8(%r2)
662         stg     c1,15*8(%r2)
663
664         lmg     %r6,%r8,48(%r15)
665         br      %r14
666 .size   bn_sqr_comba8,.-bn_sqr_comba8
667
668 // void bn_sqr_comba4(BN_ULONG *r2,BN_ULONG *r3);
669 .globl bn_sqr_comba4
670 .type   bn_sqr_comba4,@function
671 .align  4
672 bn_sqr_comba4:
673         stmg    %r6,%r8,48(%r15)
674
675         lghi    c1,0
676         lghi    c2,0
677         lghi    c3,0
678         lghi    zero,0
679
680         sqr_add_c(0,c1,c2,c3);
681         stg     c1,0*8(%r2)
682         lghi    c1,0
683
684         sqr_add_c2(1,0,c2,c3,c1);
685         stg     c2,1*8(%r2)
686         lghi    c2,0
687
688         sqr_add_c(1,c3,c1,c2);
689         sqr_add_c2(2,0,c3,c1,c2);
690         stg     c3,2*8(%r2)
691         lghi    c3,0
692
693         sqr_add_c2(3,0,c1,c2,c3);
694         sqr_add_c2(2,1,c1,c2,c3);
695         stg     c1,3*8(%r2)
696         lghi    c1,0
697
698         sqr_add_c(2,c2,c3,c1);
699         sqr_add_c2(3,1,c2,c3,c1);
700         stg     c2,4*8(%r2)
701         lghi    c2,0
702
703         sqr_add_c2(3,2,c3,c1,c2);
704         stg     c3,5*8(%r2)
705         lghi    c3,0
706
707         sqr_add_c(3,c1,c2,c3);
708         stg     c1,6*8(%r2)
709         stg     c2,7*8(%r2)
710
711         lmg     %r6,%r8,48(%r15)
712         br      %r14
713 .size   bn_sqr_comba4,.-bn_sqr_comba4