1 .ident "s390x.S, version 1.1"
2 // ====================================================================
3 // Copyright 2007-2016 The OpenSSL Project Authors. All Rights Reserved.
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 // ====================================================================
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
20 lghi zero,0 // zero = 0
21 la %r1,0(%r2) // put rp aside [to give way to]
22 lghi %r2,0 // return value
24 bler %r14 // if (len<=0) return 0;
26 stmg %r6,%r13,48(%r15)
28 lghi %r12,0 // carry = 0
29 slgr %r1,%r3 // rp-=ap
31 sra %r4,2 // cnt=len/4
32 jz .Loop1_madd // carry is incidentally cleared if branch taken
33 algr zero,zero // clear carry
35 lg %r7,0(%r3) // ap[0]
36 lg %r9,8(%r3) // ap[1]
43 lg %r11,16(%r3) // ap[i+2]
44 alcgr %r7,%r12 // +=carry
46 alg %r7,0(%r3,%r1) // +=rp[i]
47 stg %r7,0(%r3,%r1) // rp[i]=
70 la %r3,32(%r3) // i+=4
76 alcgr %r7,%r12 // +=carry
78 alg %r7,0(%r3,%r1) // +=rp[i]
79 stg %r7,0(%r3,%r1) // rp[i]=
99 la %r3,32(%r3) // i+=4
101 la %r2,1(%r2) // see if len%4 is zero ...
102 brct %r2,.Loop1_madd // without touching condition code:-)
105 lgr %r2,zero // return value
106 alcgr %r2,%r12 // collect even carry bit
107 lmg %r6,%r13,48(%r15)
111 lg %r7,0(%r3) // ap[i]
113 alcgr %r7,%r12 // +=carry
115 alg %r7,0(%r3,%r1) // +=rp[i]
116 stg %r7,0(%r3,%r1) // rp[i]=
123 .size bn_mul_add_words,.-bn_mul_add_words
125 // BN_ULONG bn_mul_words(BN_ULONG *r2,BN_ULONG *r3,int r4,BN_ULONG r5);
127 .type bn_mul_words,@function
130 lghi zero,0 // zero = 0
131 la %r1,0(%r2) // put rp aside
134 bler %r14 // if (len<=0) return 0;
136 stmg %r6,%r10,48(%r15)
138 lghi %r8,0 // carry = 0
140 sra %r4,2 // cnt=len/4
141 jz .Loop1_mul // carry is incidentally cleared if branch taken
142 algr zero,zero // clear carry
145 lg %r7,0(%r2,%r3) // ap[i]
147 alcgr %r7,%r8 // +=carry
148 stg %r7,0(%r2,%r1) // rp[i]=
165 la %r2,32(%r2) // i+=4
168 la %r10,1(%r10) // see if len%4 is zero ...
169 brct %r10,.Loop1_mul // without touching condition code:-)
172 alcgr %r8,zero // collect carry bit
174 lmg %r6,%r10,48(%r15)
178 lg %r7,0(%r2,%r3) // ap[i]
180 alcgr %r7,%r8 // +=carry
181 stg %r7,0(%r2,%r1) // rp[i]=
188 .size bn_mul_words,.-bn_mul_words
190 // void bn_sqr_words(BN_ULONG *r2,BN_ULONG *r2,int r4)
192 .type bn_sqr_words,@function
198 stmg %r6,%r7,48(%r15)
199 srag %r1,%r4,2 // cnt=len/4
228 nr %r4,%r1 // cnt=len%4
244 .size bn_sqr_words,.-bn_sqr_words
246 // BN_ULONG bn_div_words(BN_ULONG h,BN_ULONG l,BN_ULONG d);
248 .type bn_div_words,@function
254 .size bn_div_words,.-bn_div_words
256 // BN_ULONG bn_add_words(BN_ULONG *r2,BN_ULONG *r3,BN_ULONG *r4,int r5);
258 .type bn_add_words,@function
261 la %r1,0(%r2) // put rp aside
264 bler %r14 // if (len<=0) return 0;
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
287 la %r2,32(%r2) // i+=4
290 la %r6,1(%r6) // see if len%4 is zero ...
291 brct %r6,.Loop1_add // without touching condition code:-)
308 .size bn_add_words,.-bn_add_words
310 // BN_ULONG bn_sub_words(BN_ULONG *r2,BN_ULONG *r3,BN_ULONG *r4,int r5);
312 .type bn_sub_words,@function
315 la %r1,0(%r2) // put rp aside
318 bler %r14 // if (len<=0) return 0;
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
350 la %r2,32(%r2) // i+=4
353 la %r6,1(%r6) // see if len%4 is zero ...
354 brct %r6,.Loop1_sub // without touching condition code:-)
362 .size bn_sub_words,.-bn_sub_words
368 #define mul_add_c(ai,bi,c1,c2,c3) \
375 // void bn_mul_comba8(BN_ULONG *r2,BN_ULONG *r3,BN_ULONG *r4);
377 .type bn_mul_comba8,@function
380 stmg %r6,%r8,48(%r15)
387 mul_add_c(0,0,c1,c2,c3);
391 mul_add_c(0,1,c2,c3,c1);
392 mul_add_c(1,0,c2,c3,c1);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
488 mul_add_c(6,7,c2,c3,c1);
489 mul_add_c(7,6,c2,c3,c1);
493 mul_add_c(7,7,c3,c1,c2);
499 .size bn_mul_comba8,.-bn_mul_comba8
501 // void bn_mul_comba4(BN_ULONG *r2,BN_ULONG *r3,BN_ULONG *r4);
503 .type bn_mul_comba4,@function
506 stmg %r6,%r8,48(%r15)
513 mul_add_c(0,0,c1,c2,c3);
517 mul_add_c(0,1,c2,c3,c1);
518 mul_add_c(1,0,c2,c3,c1);
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);
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);
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);
541 mul_add_c(2,3,c3,c1,c2);
542 mul_add_c(3,2,c3,c1,c2);
546 mul_add_c(3,3,c1,c2,c3);
550 stmg %r6,%r8,48(%r15)
552 .size bn_mul_comba4,.-bn_mul_comba4
554 #define sqr_add_c(ai,c1,c2,c3) \
561 #define sqr_add_c2(ai,aj,c1,c2,c3) \
571 // void bn_sqr_comba8(BN_ULONG *r2,BN_ULONG *r3);
573 .type bn_sqr_comba8,@function
576 stmg %r6,%r8,48(%r15)
583 sqr_add_c(0,c1,c2,c3);
587 sqr_add_c2(1,0,c2,c3,c1);
591 sqr_add_c(1,c3,c1,c2);
592 sqr_add_c2(2,0,c3,c1,c2);
596 sqr_add_c2(3,0,c1,c2,c3);
597 sqr_add_c2(2,1,c1,c2,c3);
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);
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);
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);
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);
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);
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);
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);
646 sqr_add_c2(7,4,c3,c1,c2);
647 sqr_add_c2(6,5,c3,c1,c2);
651 sqr_add_c(6,c1,c2,c3);
652 sqr_add_c2(7,5,c1,c2,c3);
656 sqr_add_c2(7,6,c2,c3,c1);
660 sqr_add_c(7,c3,c1,c2);
666 .size bn_sqr_comba8,.-bn_sqr_comba8
668 // void bn_sqr_comba4(BN_ULONG *r2,BN_ULONG *r3);
670 .type bn_sqr_comba4,@function
673 stmg %r6,%r8,48(%r15)
680 sqr_add_c(0,c1,c2,c3);
684 sqr_add_c2(1,0,c2,c3,c1);
688 sqr_add_c(1,c3,c1,c2);
689 sqr_add_c2(2,0,c3,c1,c2);
693 sqr_add_c2(3,0,c1,c2,c3);
694 sqr_add_c2(2,1,c1,c2,c3);
698 sqr_add_c(2,c2,c3,c1);
699 sqr_add_c2(3,1,c2,c3,c1);
703 sqr_add_c2(3,2,c3,c1,c2);
707 sqr_add_c(3,c1,c2,c3);
713 .size bn_sqr_comba4,.-bn_sqr_comba4