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