.ugen .verstamp 3 11 .data .align 3 .align 0 $$4: .ascii "@(#)KerN.c: copyright Digital Equipment Corporation & INRIA 1988, 1989\X0A\X00" .text .align 4 .file 2 "c/KerN.c" .globl BnnSetToZero .loc 2 63 # 63 { .ent BnnSetToZero 2 BnnSetToZero: .option O2 ldgp $gp, 0($27) .frame $sp, 0, $26, 0 .prologue 1 .loc 2 63 .loc 2 65 # 64 BigNum nnlim; # 65 if (nl <= 0) beq $17, $33 .loc 2 66 # 66 return; .loc 2 67 # 67 nnlim = nn+nl-1; s8addq $17, $16, $0 addq $0, -8, $0 .loc 2 68 # 68 do *nn = 0; while(nn++ < nnlim); $32: .loc 2 68 stq $31, 0($16) cmpult $16, $0, $17 addq $16, 8, $16 bne $17, $32 .loc 2 69 # 69 } $33: .livereg 0x007F0002,0x3FC00000 ret $31, ($26), 1 .end BnnSetToZero .text .align 4 .file 2 "c/KerN.c" .globl BnnAssign .loc 2 80 # 80 { .ent BnnAssign 2 BnnAssign: .option O2 ldgp $gp, 0($27) .frame $sp, 0, $26, 0 .prologue 1 bis $16, $16, $1 .loc 2 80 .loc 2 82 # 81 BigNum nnlim; # 82 if (nl <= 0) beq $18, $37 .loc 2 83 # 83 return; .loc 2 84 # 84 nnlim = nn+nl; sll $18, 3, $16 addq $16, $17, $19 bis $19, $19, $0 .loc 2 88 # 85 #ifdef MSDOS # 86 if (realaddr(mm) < realaddr(nn) || realaddr(mm) > realaddr(nnlim)) # 87 #else # 88 if ((mm < nn) || ( mm > nnlim)) cmpult $1, $17, $2 bne $2, $34 cmpult $19, $1, $3 beq $3, $35 .loc 2 90 # 89 #endif # 90 do *mm++ = *nn++; while(nn < nnlim); $34: .loc 2 90 ldq $4, 0($17) stq $4, 0($1) addq $1, 8, $1 addq $17, 8, $17 cmpult $17, $0, $5 bne $5, $34 .livereg 0x007F0002,0x3FC00000 ret $31, ($26), 1 $35: .loc 2 95 # 91 else # 92 #ifdef MSDOS # 93 if (realaddr(mm) > realaddr(nn)) # 94 #else # 95 if (mm > nn) cmpult $17, $1, $6 beq $6, $37 .loc 2 97 # 96 #endif # 97 { .loc 2 98 # 98 mm += nl; addq $1, $16, $1 .loc 2 99 # 99 do *--mm = *--nnlim; while(nn < nnlim); $36: .loc 2 99 addq $1, -8, $18 bis $18, $18, $16 bis $18, $18, $1 addq $0, -8, $0 ldq $7, 0($0) stq $7, 0($16) cmpult $17, $0, $8 bne $8, $36 .loc 2 101 # 100 } # 101 } $37: .livereg 0x007F0002,0x3FC00000 ret $31, ($26), 1 .end BnnAssign .text .align 4 .file 2 "c/KerN.c" .globl BnnSetDigit .loc 2 113 # 113 { .ent BnnSetDigit 2 BnnSetDigit: .option O2 ldgp $gp, 0($27) .frame $sp, 0, $26, 0 .prologue 1 .loc 2 113 .loc 2 114 # 114 *nn = d; stq $17, 0($16) .loc 2 115 # 115 } .livereg 0x007F0002,0x3FC00000 ret $31, ($26), 1 .end BnnSetDigit .text .align 4 .file 2 "c/KerN.c" .globl BnnGetDigit .loc 2 126 # 126 { .ent BnnGetDigit 2 BnnGetDigit: .option O2 ldgp $gp, 0($27) .frame $sp, 0, $26, 0 .prologue 1 .loc 2 126 .loc 2 127 # 127 return (*nn); ldq $0, 0($16) .livereg 0xFC7F0002,0x3FC00000 ret $31, ($26), 1 .end BnnGetDigit .text .align 4 .file 2 "c/KerN.c" .globl BnnNumDigits .loc 2 140 # 140 { .ent BnnNumDigits 2 BnnNumDigits: .option O2 ldgp $gp, 0($27) .frame $sp, 0, $26, 0 .prologue 1 .loc 2 140 .loc 2 141 # 141 nn += nl; s8addq $17, $16, $16 .loc 2 143 # 142 # 143 while (nl != 0 && *--nn == 0) beq $17, $39 addq $16, -8, $16 ldq $1, 0($16) bne $1, $39 $38: .loc 2 144 # 144 nl--; addq $17, -1, $17 beq $17, $39 addq $16, -8, $16 ldq $2, 0($16) beq $2, $38 $39: .loc 2 146 # 145 # 146 return (nl == 0 ? 1 : nl); bis $17, $17, $16 cmoveq $17, 1, $16 bis $16, $16, $0 .livereg 0xFC7F0002,0x3FC00000 ret $31, ($26), 1 .end BnnNumDigits .text .align 4 .file 2 "c/KerN.c" .globl BnnNumLeadingZeroBitsInDigit .loc 2 158 # 158 { .ent BnnNumLeadingZeroBitsInDigit 2 BnnNumLeadingZeroBitsInDigit: .option O2 ldgp $gp, 0($27) .frame $sp, 0, $26, 0 .prologue 1 bis $16, $16, $1 .loc 2 158 .loc 2 159 # 159 register int p = 0; bis $31, $31, $17 .loc 2 160 # 160 if (BN_DIGIT_SIZE == 16 || BN_DIGIT_SIZE == 32 || BN_DIGIT_SIZE == 64) .loc 2 161 # 161 { .loc 2 162 # 162 register BigNumDigit mask = (~(BigNumDigit)0) << (BN_DIGIT_SIZE/2); ldiq $0, -4294967296 .loc 2 163 # 163 register BigNumLength maskl = BN_DIGIT_SIZE/2; ldiq $16, 32 .loc 2 165 # 164 # 165 if (d == 0) bne $1, $40 .loc 2 166 # 166 return (BN_DIGIT_SIZE); ldiq $0, 64 .livereg 0x807F0002,0x3FC00000 ret $31, ($26), 1 $40: .loc 2 168 # 167 while (maskl) # 168 { .loc 2 169 # 169 if ((d & mask) == 0) and $1, $0, $2 bne $2, $41 .loc 2 170 # 170 { .loc 2 171 # 171 p += maskl; addq $17, $16, $17 addl $17, 0, $17 .loc 2 172 # 172 d <<= maskl; sll $1, $16, $1 $41: .loc 2 174 # 173 } # 174 maskl >>= 1; srl $16, 1, $16 .loc 2 175 # 175 mask <<= maskl; sll $0, $16, $0 bne $16, $40 .loc 2 189 # 189 return (p); bis $17, $17, $0 $42: .livereg 0xFC7F0002,0x3FC00000 ret $31, ($26), 1 .end BnnNumLeadingZeroBitsInDigit .text .align 4 .file 2 "c/KerN.c" .globl BnnDoesDigitFitInWord .loc 2 203 # 203 { .ent BnnDoesDigitFitInWord 2 BnnDoesDigitFitInWord: .option O2 ldgp $gp, 0($27) .frame $sp, 0, $26, 0 .prologue 1 .loc 2 203 .loc 2 205 # 204 /* The C compiler must evaluate the predicate at compile time */ # 205 if (BN_DIGIT_SIZE > BN_WORD_SIZE) .loc 2 206 # 206 return (d >= ((BigNumDigit)1) << BN_WORD_SIZE ? FALSE : TRUE); cmpult $16, 4294967296, $17 bis $17, $17, $0 .livereg 0xFC7F0002,0x3FC00000 ret $31, ($26), 1 .end BnnDoesDigitFitInWord .text .align 4 .file 2 "c/KerN.c" .globl BnnIsDigitZero .loc 2 218 # 218 { .ent BnnIsDigitZero 2 BnnIsDigitZero: .option O2 ldgp $gp, 0($27) .frame $sp, 0, $26, 0 .prologue 1 .loc 2 218 .loc 2 219 # 219 return (d == 0); cmpeq $16, 0, $0 .livereg 0xFC7F0002,0x3FC00000 ret $31, ($26), 1 .end BnnIsDigitZero .text .align 4 .file 2 "c/KerN.c" .globl BnnIsDigitNormalized .loc 2 232 # 232 { .ent BnnIsDigitNormalized 2 BnnIsDigitNormalized: .option O2 ldgp $gp, 0($27) .frame $sp, 0, $26, 0 .prologue 1 .loc 2 232 .loc 2 233 # 233 return (d & (((BigNumDigit)1) << (BN_DIGIT_SIZE - 1)) ? TRUE : FALSE); ldil $17, 1 cmovge $16, 0, $17 bis $17, $17, $0 .livereg 0xFC7F0002,0x3FC00000 ret $31, ($26), 1 .end BnnIsDigitNormalized .text .align 4 .file 2 "c/KerN.c" .globl BnnIsDigitOdd .loc 2 245 # 245 { .ent BnnIsDigitOdd 2 BnnIsDigitOdd: .option O2 ldgp $gp, 0($27) .frame $sp, 0, $26, 0 .prologue 1 .loc 2 245 .loc 2 246 # 246 return (d & 1 ? TRUE : FALSE); ldil $17, 1 cmovlbc $16, 0, $17 bis $17, $17, $0 .livereg 0xFC7F0002,0x3FC00000 ret $31, ($26), 1 .end BnnIsDigitOdd .text .align 4 .file 2 "c/KerN.c" .globl BnnCompareDigits .loc 2 260 # 260 { .ent BnnCompareDigits 2 BnnCompareDigits: .option O2 ldgp $gp, 0($27) .frame $sp, 0, $26, 0 .prologue 1 .loc 2 260 .loc 2 261 # 261 return (d1 > d2 ? BN_GT : (d1 == d2 ? BN_EQ : BN_LT)); cmpult $17, $16, $1 beq $1, $43 ldil $16, 1 br $31, $44 $43: subq $16, $17, $2 ldil $0, -1 cmoveq $2, 0, $0 bis $0, $0, $16 $44: bis $16, $16, $0 .livereg 0xFC7F0002,0x3FC00000 ret $31, ($26), 1 .end BnnCompareDigits .text .align 4 .file 2 "c/KerN.c" .globl BnnComplement .loc 2 273 # 273 { .ent BnnComplement 2 BnnComplement: .option O2 ldgp $gp, 0($27) .frame $sp, 0, $26, 0 .prologue 1 .loc 2 273 .loc 2 276 # 274 BigNum nnlim; # 275 # 276 if (nl <= 0) beq $17, $46 .loc 2 277 # 277 return; .loc 2 278 # 278 nnlim = nn+nl; s8addq $17, $16, $0 .loc 2 279 # 279 do $45: .loc 2 280 # 280 { .loc 2 281 # 281 nn++; addq $16, 8, $16 .loc 2 282 # 282 nn[-1] = ~nn[-1]; ldq $1, -8($16) ornot $31, $1, $2 stq $2, -8($16) cmpult $16, $0, $3 bne $3, $45 .loc 2 285 # 283 } # 284 while (nn < nnlim); # 285 } $46: .livereg 0x007F0002,0x3FC00000 ret $31, ($26), 1 .end BnnComplement .text .align 4 .file 2 "c/KerN.c" .globl BnnAndDigits .loc 2 297 # 297 { .ent BnnAndDigits 2 BnnAndDigits: .option O2 ldgp $gp, 0($27) .frame $sp, 0, $26, 0 .prologue 1 .loc 2 297 .loc 2 298 # 298 *n &= d; ldq $1, 0($16) and $1, $17, $2 stq $2, 0($16) .loc 2 299 # 299 } .livereg 0x007F0002,0x3FC00000 ret $31, ($26), 1 .end BnnAndDigits .text .align 4 .file 2 "c/KerN.c" .globl BnnOrDigits .loc 2 310 # 310 { .ent BnnOrDigits 2 BnnOrDigits: .option O2 ldgp $gp, 0($27) .frame $sp, 0, $26, 0 .prologue 1 .loc 2 310 .loc 2 311 # 311 *n |= d; ldq $1, 0($16) or $1, $17, $2 stq $2, 0($16) .loc 2 312 # 312 } .livereg 0x007F0002,0x3FC00000 ret $31, ($26), 1 .end BnnOrDigits .text .align 4 .file 2 "c/KerN.c" .globl BnnXorDigits .loc 2 323 # 323 { .ent BnnXorDigits 2 BnnXorDigits: .option O2 ldgp $gp, 0($27) .frame $sp, 0, $26, 0 .prologue 1 .loc 2 323 .loc 2 324 # 324 *n ^= d; ldq $1, 0($16) xor $1, $17, $2 stq $2, 0($16) .loc 2 325 # 325 } .livereg 0x007F0002,0x3FC00000 ret $31, ($26), 1 .end BnnXorDigits .text .align 4 .file 2 "c/KerN.c" .globl BnnShiftLeft .loc 2 341 # 341 { .ent BnnShiftLeft 2 BnnShiftLeft: .option O2 ldgp $gp, 0($27) .frame $sp, 0, $26, 0 .prologue 1 bis $16, $16, $1 addl $18, 0, $18 .loc 2 341 .loc 2 342 # 342 register BigNumDigit res = 0, save; bis $31, $31, $19 .loc 2 346 # 343 int rnbits; # 344 # 345 # 346 if (nbits != 0) beq $18, $48 ldiq $21, 1 .loc 2 347 # 347 { .loc 2 348 # 348 rnbits = BN_DIGIT_SIZE - nbits; .loc 2 350 # 349 # 350 while (ml-- > 0) cmpule $21, $17, $16 addq $17, -1, $17 beq $16, $48 bis $18, $18, $0 ldiq $2, 64 subq $2, $0, $20 addl $20, 0, $20 $47: .loc 2 351 # 351 { .loc 2 352 # 352 save = *mm; ldq $18, 0($1) .loc 2 353 # 353 *mm++ = (save << nbits) | res; sll $18, $0, $3 or $3, $19, $4 stq $4, 0($1) addq $1, 8, $1 .loc 2 354 # 354 res = save >> rnbits; srl $18, $20, $19 cmpule $21, $17, $16 addq $17, -1, $17 bne $16, $47 $48: .loc 2 358 # 355 } # 356 } # 357 # 358 return (res); bis $19, $19, $0 .livereg 0xFC7F0002,0x3FC00000 ret $31, ($26), 1 .end BnnShiftLeft .text .align 4 .file 2 "c/KerN.c" .globl BnnShiftRight .loc 2 373 # 373 { .ent BnnShiftRight 2 BnnShiftRight: .option O2 ldgp $gp, 0($27) .frame $sp, 0, $26, 0 .prologue 1 addl $18, 0, $18 .loc 2 373 .loc 2 374 # 374 register BigNumDigit res = 0, save; bis $31, $31, $19 .loc 2 378 # 375 int lnbits; # 376 # 377 # 378 if (nbits != 0) beq $18, $50 ldiq $1, 1 .loc 2 379 # 379 { .loc 2 380 # 380 mm += ml; s8addq $17, $16, $16 .loc 2 381 # 381 lnbits = BN_DIGIT_SIZE - nbits; .loc 2 383 # 382 # 383 while (ml-- > 0) cmpule $1, $17, $20 addq $17, -1, $17 beq $20, $50 bis $18, $18, $0 ldiq $2, 64 subq $2, $0, $21 addl $21, 0, $21 $49: .loc 2 384 # 384 { .loc 2 385 # 385 save = *(--mm); addq $16, -8, $16 ldq $18, 0($16) .loc 2 386 # 386 *mm = (save >> nbits) | res; srl $18, $0, $3 or $3, $19, $4 stq $4, 0($16) .loc 2 387 # 387 res = save << lnbits; sll $18, $21, $19 cmpule $1, $17, $20 addq $17, -1, $17 bne $20, $49 $50: .loc 2 391 # 388 } # 389 } # 390 # 391 return (res); bis $19, $19, $0 .livereg 0xFC7F0002,0x3FC00000 ret $31, ($26), 1 .end BnnShiftRight .text .align 4 .file 2 "c/KerN.c" .globl BnnAddCarry .loc 2 408 # 408 { .ent BnnAddCarry 2 BnnAddCarry: .option O2 ldgp $gp, 0($27) .frame $sp, 0, $26, 0 .prologue 1 .loc 2 408 .loc 2 409 # 409 if (carryin == 0) bne $18, $51 .loc 2 410 # 410 return (0); bis $31, $31, $0 .livereg 0x807F0002,0x3FC00000 ret $31, ($26), 1 $51: .loc 2 412 # 411 # 412 if (nl == 0) bne $17, $52 .loc 2 413 # 413 return (1); ldiq $0, 1 .livereg 0x807F0002,0x3FC00000 ret $31, ($26), 1 $52: ldiq $19, 1 .loc 2 415 # 414 # 415 while (nl > 0 && !(++(*nn++))) cmpule $19, $17, $0 beq $0, $54 ldq $1, 0($16) addq $1, 1, $2 stq $2, 0($16) ldq $18, 0($16) cmpeq $18, 0, $18 addq $16, 8, $16 beq $18, $54 $53: .loc 2 416 # 416 nl--; addq $17, -1, $17 cmpule $19, $17, $0 beq $0, $54 ldq $3, 0($16) addq $3, 1, $4 stq $4, 0($16) ldq $18, 0($16) cmpeq $18, 0, $18 addq $16, 8, $16 bne $18, $53 $54: .loc 2 418 # 417 # 418 return (nl > 0 ? 0 : 1); bis $31, $31, $18 cmoveq $0, 1, $18 bis $18, $18, $0 $55: .livereg 0xFC7F0002,0x3FC00000 ret $31, ($26), 1 .end BnnAddCarry .text .align 4 .file 2 "c/KerN.c" .globl BnnAdd .loc 2 433 # 433 { .ent BnnAdd 2 BnnAdd: .option O2 ldgp $gp, 0($27) lda $sp, -16($sp) stq $26, 0($sp) .mask 0x04000000, -16 .frame $sp, 16, $26, 0 .prologue 1 bis $16, $16, $1 bis $17, $17, $2 .loc 2 433 .loc 2 434 # 434 register BigNumProduct c = carryin; bis $20, $20, $21 .loc 2 437 # 435 # 436 # 437 ml -= nl; subq $2, $19, $2 .loc 2 439 # 438 /* test computed at compile time */ # 439 if (sizeof (BigNumProduct) > sizeof (BigNumDigit)) ldiq $17, 1 .loc 2 450 # 450 { .loc 2 453 # 451 register BigNumProduct save; # 452 # 453 while (nl > 0) cmpult $19, $17, $3 bne $3, $59 $56: .loc 2 454 # 454 { .loc 2 455 # 455 save = *mm; ldq $0, 0($1) .loc 2 456 # 456 c += save; addq $21, $0, $21 .loc 2 457 # 457 if (c < save) cmpult $21, $0, $4 beq $4, $57 .loc 2 458 # 458 { .loc 2 459 # 459 *(mm++) = *(nn++); ldq $5, 0($18) stq $5, 0($1) addq $1, 8, $1 addq $18, 8, $18 .loc 2 460 # 460 c = 1; bis $17, $17, $21 br $31, $58 $57: .loc 2 463 # 461 } # 462 else # 463 { .loc 2 464 # 464 save = *(nn++); ldq $0, 0($18) addq $18, 8, $18 .loc 2 465 # 465 c += save; addq $21, $0, $21 .loc 2 466 # 466 *(mm++) = c; stq $21, 0($1) addq $1, 8, $1 .loc 2 467 # 467 c = (c < save) ? 1 : 0; cmpult $21, $0, $16 ldiq $21, 1 cmoveq $16, 0, $21 $58: .loc 2 469 # 468 } # 469 nl--; addq $19, -1, $19 cmpult $19, $17, $6 beq $6, $56 $59: .loc 2 473 # 470 } # 471 } # 472 # 473 return (BnnAddCarry (mm, ml, (BigNumCarry) c)); bis $1, $1, $16 bis $2, $2, $17 bis $21, $21, $18 .livereg 0x0001F002,0x00000000 jsr $26, BnnAddCarry ldgp $gp, 0($26) .livereg 0xFC7F0002,0x3FC00000 ldq $26, 0($sp) lda $sp, 16($sp) ret $31, ($26), 1 .end BnnAdd .text .align 4 .file 2 "c/KerN.c" .globl BnnSubtractBorrow .loc 2 490 # 490 { .ent BnnSubtractBorrow 2 BnnSubtractBorrow: .option O2 ldgp $gp, 0($27) .frame $sp, 0, $26, 0 .prologue 1 bis $16, $16, $1 .loc 2 490 .loc 2 491 # 491 if (carryin == 1) subq $18, 1, $2 bne $2, $60 .loc 2 492 # 492 return (1); ldiq $0, 1 .livereg 0x807F0002,0x3FC00000 ret $31, ($26), 1 $60: .loc 2 493 # 493 if (nl == 0) bne $17, $61 .loc 2 494 # 494 return (0); bis $31, $31, $0 .livereg 0x807F0002,0x3FC00000 ret $31, ($26), 1 $61: ldiq $19, 1 .loc 2 496 # 495 # 496 while (nl > 0 && !((*nn++)--)) cmpule $19, $17, $0 beq $0, $63 ldq $18, 0($1) cmpeq $18, 0, $16 addq $18, -1, $3 stq $3, 0($1) addq $1, 8, $1 beq $16, $63 $62: .loc 2 497 # 497 nl--; addq $17, -1, $17 cmpule $19, $17, $0 beq $0, $63 ldq $18, 0($1) cmpeq $18, 0, $16 addq $18, -1, $4 stq $4, 0($1) addq $1, 8, $1 bne $16, $62 $63: .loc 2 499 # 498 # 499 return (nl > 0 ? 1 : 0); ldil $16, 1 cmoveq $0, 0, $16 bis $16, $16, $0 $64: .livereg 0xFC7F0002,0x3FC00000 ret $31, ($26), 1 .end BnnSubtractBorrow .text .align 4 .file 2 "c/KerN.c" .globl BnnSubtract .loc 2 514 # 514 { .ent BnnSubtract 2 BnnSubtract: .option O2 ldgp $gp, 0($27) lda $sp, -16($sp) stq $26, 0($sp) .mask 0x04000000, -16 .frame $sp, 16, $26, 0 .prologue 1 bis $16, $16, $1 bis $17, $17, $2 .loc 2 514 .loc 2 515 # 515 register BigNumProduct c = carryin; bis $20, $20, $21 .loc 2 519 # 516 register BigNumDigit invn; # 517 # 518 # 519 ml -= nl; subq $2, $19, $2 .loc 2 521 # 520 /* test computed at compile time */ # 521 if (sizeof (BigNumProduct) > sizeof (BigNumDigit)) ldiq $17, 1 .loc 2 533 # 533 { .loc 2 536 # 534 register BigNumProduct save; # 535 # 536 while (nl > 0) cmpult $19, $17, $3 bne $3, $68 $65: .loc 2 537 # 537 { .loc 2 538 # 538 save = *mm; ldq $0, 0($1) .loc 2 539 # 539 invn = *(nn++) ^ -1; ldq $16, 0($18) xor $16, -1, $16 addq $18, 8, $18 .loc 2 540 # 540 c += save; addq $21, $0, $21 .loc 2 542 # 541 # 542 if (c < save) cmpult $21, $0, $4 beq $4, $66 .loc 2 543 # 543 { .loc 2 544 # 544 *(mm++) = invn; stq $16, 0($1) addq $1, 8, $1 .loc 2 545 # 545 c = 1; bis $17, $17, $21 br $31, $67 $66: .loc 2 548 # 546 } # 547 else # 548 { .loc 2 549 # 549 c += invn; addq $21, $16, $21 .loc 2 550 # 550 *(mm++) = c; stq $21, 0($1) addq $1, 8, $1 .loc 2 551 # 551 c = (c < invn) ? 1 : 0; cmpult $21, $16, $0 ldiq $21, 1 cmoveq $0, 0, $21 $67: .loc 2 553 # 552 } # 553 nl--; addq $19, -1, $19 cmpult $19, $17, $5 beq $5, $65 $68: .loc 2 557 # 554 } # 555 } # 556 # 557 return (BnnSubtractBorrow (mm, ml, (BigNumCarry) c)); } bis $1, $1, $16 bis $2, $2, $17 bis $21, $21, $18 .livereg 0x0001F002,0x00000000 jsr $26, BnnSubtractBorrow ldgp $gp, 0($26) .livereg 0xFC7F0002,0x3FC00000 ldq $26, 0($sp) lda $sp, 16($sp) ret $31, ($26), 1 .end BnnSubtract .text .align 4 .file 2 "c/KerN.c" .globl BnnMultiplyDigit .loc 2 577 # 577 { .ent BnnMultiplyDigit 2 BnnMultiplyDigit: .option O2 ldgp $gp, 0($27) lda $sp, -16($sp) stq $26, 0($sp) .mask 0x04000000, -16 .frame $sp, 16, $26, 0 .prologue 1 bis $16, $16, $1 bis $17, $17, $3 .loc 2 577 .loc 2 578 # 578 register BigNumProduct c = 0; bis $31, $31, $21 .loc 2 581 # 579 # 580 # 581 if (d == 0) bne $20, $69 .loc 2 582 # 582 return (0); bis $31, $31, $0 br $31, $77 $69: .loc 2 584 # 583 # 584 if (d == 1) subq $20, 1, $4 bne $4, $70 .loc 2 585 # 585 return (BnnAdd (pp, pl, mm, ml, (BigNumCarry) 0)); bis $1, $1, $16 bis $3, $3, $17 bis $31, $31, $20 .livereg 0x0001FC02,0x00000000 jsr $26, BnnAdd ldgp $gp, 0($26) br $31, $77 $70: .loc 2 587 # 586 # 587 pl -= ml; subq $3, $19, $3 .loc 2 589 # 588 /* test computed at compile time */ # 589 if (sizeof (BigNumProduct) > sizeof (BigNumDigit)) .loc 2 610 # 610 { .loc 2 613 # 611 #ifdef __alpha /* _hack_to_produce_east_to_modify_assembler */ # 612 register BigNumDigit X0, m_digit,Lo,Hi; # 613 while (ml != 0) beq $19, $73 and $19, 3, $0 negq $0, $0 bis $0, $0, $2 beq $2, $72 addq $0, $19, $2 $71: addq $19, -1, $19 ldq $0, 0($1) ldq $16, 0($18) addq $18, 8, $18 addq $0, $21, $0 cmpult $0, $21, $21 mulq $20, $16, $5 addq $5, $0, $17 cmpult $17, $0, $6 addq $21, $6, $21 stq $17, 0($1) addq $1, 8, $1 umulh $20, $16, $7 addq $21, $7, $21 subq $2, $19, $8 bne $8, $71 beq $19, $73 $72: .loc 2 614 # 614 { .loc 2 615 # 615 ml--; .loc 2 616 # 616 X0 = *pp; ldq $0, 0($1) .loc 2 617 # 617 m_digit = *(mm++); ldq $16, 0($18) addq $18, 8, $18 .loc 2 618 # 618 X0 += c; addq $0, $21, $0 .loc 2 619 # 619 c = X0 < c; cmpult $0, $21, $21 .loc 2 620 # 620 Lo = X0 + (d * m_digit); .loc 2 621 # 621 c += Lo < X0; mulq $20, $16, $22 addq $22, $0, $17 cmpult $17, $0, $23 addq $21, $23, $21 .loc 2 622 # 622 *(pp++) = Lo; stq $17, 0($1) addq $1, 8, $1 .loc 2 623 # 623 c += asm("umulh %a0, %a1, %v0",d,m_digit); umulh $20, $16, $24 addq $21, $24, $21 ldq $0, 0($1) ldq $16, 0($18) addq $18, 8, $18 addq $0, $21, $0 cmpult $0, $21, $21 mulq $20, $16, $25 addq $25, $0, $17 cmpult $17, $0, $27 addq $21, $27, $21 stq $17, 0($1) addq $1, 8, $1 umulh $20, $16, $4 addq $21, $4, $21 ldq $0, 0($1) ldq $16, 0($18) addq $18, 8, $18 addq $0, $21, $0 cmpult $0, $21, $21 mulq $20, $16, $5 addq $5, $0, $17 cmpult $17, $0, $6 addq $21, $6, $21 stq $17, 0($1) addq $1, 8, $1 umulh $20, $16, $7 addq $21, $7, $21 addq $19, -4, $19 ldq $0, 0($1) ldq $16, 0($18) addq $18, 8, $18 addq $0, $21, $0 cmpult $0, $21, $21 mulq $20, $16, $8 addq $8, $0, $17 cmpult $17, $0, $22 addq $21, $22, $21 stq $17, 0($1) addq $1, 8, $1 umulh $20, $16, $23 addq $21, $23, $21 bne $19, $72 $73: .loc 2 661 # 661 X0 = *pp; ldq $0, 0($1) .loc 2 662 # 662 c += X0; addq $21, $0, $21 .loc 2 663 # 663 *(pp++) = c; stq $21, 0($1) addq $1, 8, $1 .loc 2 665 # 664 # 665 if (c >= X0) cmpult $21, $0, $24 bne $24, $74 .loc 2 666 # 666 return (0); bis $31, $31, $0 br $31, $77 $74: .loc 2 668 # 667 # 668 pl--; addq $3, -1, $3 .loc 2 669 # 669 while (pl != 0 && !(++(*pp++))) cmpeq $3, 0, $0 xor $0, 1, $0 beq $0, $76 ldq $25, 0($1) addq $25, 1, $27 stq $27, 0($1) ldq $16, 0($1) cmpeq $16, 0, $16 addq $1, 8, $1 beq $16, $76 $75: .loc 2 670 # 670 pl--; addq $3, -1, $3 cmpeq $3, 0, $0 xor $0, 1, $0 beq $0, $76 ldq $4, 0($1) addq $4, 1, $5 stq $5, 0($1) ldq $16, 0($1) cmpeq $16, 0, $16 addq $1, 8, $1 bne $16, $75 $76: .loc 2 672 # 671 # 672 return (pl != 0 ? 0 : 1); bis $31, $31, $16 cmoveq $0, 1, $16 bis $16, $16, $0 $77: .livereg 0xFC7F0002,0x3FC00000 ldq $26, 0($sp) lda $sp, 16($sp) ret $31, ($26), 1 .end BnnMultiplyDigit .text .align 4 .file 2 "c/KerN.c" .globl BnnMultiply2Digit .loc 2 704 # 704 { .ent BnnMultiply2Digit 2 BnnMultiply2Digit: .option O2 ldgp $gp, 0($27) lda $sp, -416($sp) stq $26, 0($sp) stq $9, 8($sp) stq $10, 16($sp) stq $11, 24($sp) stq $12, 32($sp) stq $13, 40($sp) stq $14, 48($sp) stq $15, 56($sp) .mask 0x0400FE00, -416 .frame $sp, 416, $26, 48 .prologue 1 bis $16, $16, $11 stq $17, 376($sp) bis $18, $18, $9 bis $20, $20, $14 bis $21, $21, $15 .loc 2 704 .loc 2 706 # 705 BigNumDigit c0, c1, p0, p1; # 706 if ((ml & 1)) blbc $19, $78 .loc 2 707 # 707 { .loc 2 708 # 708 return bis $11, $11, $16 ldq $17, 376($sp) bis $9, $9, $18 bis $14, $14, $20 stq $19, 392($sp) .livereg 0x0001FC02,0x00000000 jsr $26, BnnMultiplyDigit ldgp $gp, 0($26) ldq $19, 392($sp) bis $0, $0, $10 addq $11, 8, $16 ldq $17, 376($sp) addq $17, -1, $17 bis $9, $9, $18 bis $15, $15, $20 .livereg 0x0001FC02,0x00000000 jsr $26, BnnMultiplyDigit ldgp $gp, 0($26) addq $0, $10, $0 br $31, $90 $78: .loc 2 712 # 709 BnnMultiplyDigit (pp, pl, mm, ml, d0) # 710 + BnnMultiplyDigit (pp+1, pl-1, mm, ml, d1); # 711 } # 712 c0 = c1 = 0; bis $31, $31, $12 bis $31, $31, $0 .loc 2 725 # 725 if (d0 >= d1) cmpult $14, $15, $22 bne $22, $82 .loc 2 726 # 726 { .loc 2 728 # 727 BigNumDigit d0_1, c2, c3, ctmp1; # 728 d0_1 = d0-d1; subq $14, $15, $13 stq $13, 328($sp) .loc 2 730 # 729 # 730 while (ml != 0) beq $19, $86 stq $19, 392($sp) stq $9, 384($sp) $79: ldq $19, 392($sp) ldq $9, 384($sp) .loc 2 731 # 731 { .loc 2 733 # 732 BigNumDigit m0,m1; # 733 m0 = mm[0]; ldq $7, 0($9) .loc 2 734 # 734 m1 = mm[1]; ldq $8, 8($9) .loc 2 735 # 735 if (m0 >= m1) cmpult $7, $8, $23 bne $23, $80 .loc 2 736 # 736 { .loc 2 740 # 737 BigNumDigit m0_1; # 738 BigNumDigit d0m0l, d0m0h, d1m1l, d1m1h, dfl, dfh; # 739 BigNumDigit t0, t1, t2; # 740 d0m0l = d0*m0; .loc 2 741 # 741 d0m0h = asm("umulh %a0, %a1, %v0", d0,m0); umulh $14, $7, $5 bis $5, $5, $20 .loc 2 742 # 742 m0_1 = m0-m1; .loc 2 743 # 743 d1m1l = d1*m1; .loc 2 744 # 744 d1m1h = asm("umulh %a0, %a1, %v0", d1,m1); .loc 2 745 # 745 dfl = d0_1*m0_1; .loc 2 746 # 746 dfh = asm("umulh %a0, %a1, %v0", d0_1,m0_1); .loc 2 747 # 747 p0 = pp[0]; ldq $6, 0($11) .loc 2 748 # 748 p1 = pp[1]; ldq $21, 8($11) .loc 2 749 # 749 p0 += c0; addq $6, $0, $6 .loc 2 750 # 750 ctmp1 = p0 < c0; cmpult $6, $0, $26 .loc 2 751 # 751 p1 += c1; addq $21, $12, $21 .loc 2 752 # 752 c2 = p1 < c1; cmpult $21, $12, $18 .loc 2 753 # 753 p1 += ctmp1; addq $21, $26, $21 .loc 2 754 # 754 c2 += p1 < ctmp1; cmpult $21, $26, $24 addq $18, $24, $18 .loc 2 755 # 755 p0 += d0m0l; mulq $14, $7, $2 addq $6, $2, $6 .loc 2 756 # 756 c1 = p0 < d0m0l; .loc 2 758 # 757 /* compute: t2:t1:t0 = d0*m0 + d1*m1 */ # 758 t0 = d0m0l+d1m1l; .loc 2 759 # 759 ctmp1 = t0 < d0m0l; .loc 2 760 # 760 t1 = d0m0h+d1m1h; .loc 2 761 # 761 t2 = t1 < d0m0h; .loc 2 762 # 762 t1 += ctmp1; umulh $15, $8, $10 addq $5, $10, $19 mulq $15, $8, $9 addq $2, $9, $4 cmpult $4, $2, $20 addq $19, $20, $16 bis $16, $16, $0 .loc 2 763 # 763 t2 += t1 < ctmp1; .loc 2 767 # 764 /* t2:t1:t0 = d0*m0 + d1*m1 */ # 765 /* dfh:dfl = d0*m0 + d1*m1 - d0*m1 - d1*m0 */ # 766 /* compute: t2:t1:t0 = t2:t1:t0 - dfh:dfl */ # 767 ctmp1 = t0 < dfl; .loc 2 768 # 768 t0 -= dfl; .loc 2 769 # 769 t2 -= t1 < dfh; subq $7, $8, $1 cmpult $19, $5, $25 cmpult $16, $20, $27 addq $25, $27, $22 ldq $23, 328($sp) xor $23, $1, $24 cmpult $16, $24, $25 subq $22, $25, $3 .loc 2 770 # 770 t1 -= dfh; umulh $13, $1, $27 subq $0, $27, $0 .loc 2 771 # 771 t2 -= t1 < ctmp1; mulq $13, $1, $16 cmpult $4, $16, $17 cmpult $0, $17, $23 subq $3, $23, $3 .loc 2 772 # 772 t1 -= ctmp1; subq $0, $17, $0 .loc 2 774 # 773 /* t2:t1:t0 = d0*m1 + d1*m0 */ # 774 ultra_parnoid(t0, t1, t2, d0, d1, m0, m1); .loc 2 775 # 775 d0m0h += c1; cmpult $6, $2, $24 addq $5, $24, $20 .loc 2 776 # 776 p1 += d0m0h; addq $21, $20, $21 .loc 2 777 # 777 c2 += p1 < d0m0h; cmpult $21, $20, $22 addq $18, $22, $18 .loc 2 778 # 778 p1 += t0; subq $4, $16, $19 addq $21, $19, $21 .loc 2 779 # 779 c2 += p1 < t0; cmpult $21, $19, $25 addq $18, $25, $18 .loc 2 780 # 780 t1 += c2; addq $0, $18, $0 .loc 2 781 # 781 t2 += t1 < c2; cmpult $0, $18, $27 addq $3, $27, $3 .loc 2 782 # 782 c2 = t1 + d1m1l; addq $0, $9, $16 bis $16, $16, $18 .loc 2 783 # 783 c3 = t2 + d1m1h + (c2 < t1); addq $3, $10, $23 cmpult $16, $0, $24 addq $23, $24, $19 br $31, $81 $80: .loc 2 786 # 784 } # 785 else # 786 { .loc 2 790 # 787 BigNumDigit m0_1; # 788 BigNumDigit d0m0l, d0m0h, d1m1l, d1m1h, dfl, dfh; # 789 BigNumDigit t0, t1, t2; # 790 d0m0l = d0*m0; .loc 2 791 # 791 d0m0h = asm("umulh %a0, %a1, %v0", d0,m0); umulh $14, $7, $5 bis $5, $5, $20 .loc 2 792 # 792 m0_1 = -m0+m1; .loc 2 793 # 793 d1m1l = d1*m1; .loc 2 794 # 794 d1m1h = asm("umulh %a0, %a1, %v0", d1,m1); .loc 2 795 # 795 dfl = d0_1*m0_1; .loc 2 796 # 796 dfh = asm("umulh %a0, %a1, %v0", d0_1,m0_1); .loc 2 797 # 797 p0 = pp[0]; ldq $6, 0($11) .loc 2 798 # 798 p1 = pp[1]; ldq $21, 8($11) .loc 2 799 # 799 p0 += c0; addq $6, $0, $6 .loc 2 800 # 800 ctmp1 = p0 < c0; cmpult $6, $0, $26 .loc 2 801 # 801 p1 += c1; addq $21, $12, $21 .loc 2 802 # 802 c2 = p1 < c1; cmpult $21, $12, $18 .loc 2 803 # 803 p1 += ctmp1; addq $21, $26, $21 .loc 2 804 # 804 c2 += p1 < ctmp1; cmpult $21, $26, $22 addq $18, $22, $18 .loc 2 805 # 805 p0 += d0m0l; mulq $14, $7, $2 addq $6, $2, $6 .loc 2 806 # 806 c1 = p0 < d0m0l; .loc 2 807 # 807 t0 = d0m0l+d1m1l; .loc 2 808 # 808 ctmp1 = t0 < d0m0l; .loc 2 809 # 809 t1 = d0m0h+d1m1h; .loc 2 810 # 810 t2 = t1 < d0m0h; .loc 2 811 # 811 t1 += ctmp1; .loc 2 812 # 812 t2 += t1 < ctmp1; umulh $15, $8, $10 addq $5, $10, $19 mulq $15, $8, $9 addq $2, $9, $4 cmpult $4, $2, $20 addq $19, $20, $16 cmpult $19, $5, $25 cmpult $16, $20, $27 addq $25, $27, $1 .loc 2 816 # 813 /* t2:t1:t0 = d0*m0 + d1*m1 */ # 814 /* dfh:dfl = - d0*m0 - d1*m1 + d0*m1 + d1*m0 */ # 815 /* compute: t2:t1:t0 = t2:t1:t0 + dfh:dfl */ # 816 t0 += dfl; .loc 2 817 # 817 ctmp1 = t0 < dfl; .loc 2 818 # 818 t1 += dfh; subq $8, $7, $3 ldq $23, 328($sp) xor $23, $3, $24 addq $16, $24, $17 .loc 2 819 # 819 t2 += t1 < dfh; umulh $13, $3, $22 cmpult $17, $22, $25 addq $1, $25, $1 .loc 2 820 # 820 t1 += ctmp1; mulq $13, $3, $16 addq $4, $16, $0 cmpult $0, $16, $19 addq $17, $19, $17 .loc 2 821 # 821 t2 += t1 < ctmp1; cmpult $17, $19, $27 addq $1, $27, $1 .loc 2 823 # 822 /* t2:t1:t0 = d0*m1 + d1*m0 */ # 823 ultra_parnoid(t0, t1, t2, d0, d1, m0, m1); .loc 2 824 # 824 d0m0h += c1; cmpult $6, $2, $23 addq $5, $23, $20 .loc 2 825 # 825 p1 += d0m0h; addq $21, $20, $21 .loc 2 826 # 826 c2 += p1 < d0m0h; cmpult $21, $20, $24 addq $18, $24, $18 .loc 2 827 # 827 p1 += t0; addq $21, $0, $21 .loc 2 828 # 828 c2 += p1 < t0; cmpult $21, $0, $22 addq $18, $22, $18 .loc 2 829 # 829 t1 += c2; addq $17, $18, $17 .loc 2 830 # 830 t2 += t1 < c2; cmpult $17, $18, $25 addq $1, $25, $1 .loc 2 831 # 831 c2 = t1 + d1m1l; addq $17, $9, $0 bis $0, $0, $18 .loc 2 832 # 832 c3 = t2 + d1m1h + (c2 < t1); addq $1, $10, $27 cmpult $0, $17, $23 addq $27, $23, $19 $81: ldq $16, 392($sp) .loc 2 835 # 833 } # 834 # 835 pp[0] = p0; stq $6, 0($11) .loc 2 836 # 836 pp[1] = p1; stq $21, 8($11) .loc 2 837 # 837 pp += 2; addq $11, 16, $11 .loc 2 838 # 838 pl -= 2; ldq $24, 376($sp) addq $24, -2, $22 stq $22, 376($sp) .loc 2 839 # 839 c0 = c2; bis $18, $18, $0 .loc 2 840 # 840 c1 = c3; bis $19, $19, $12 .loc 2 841 # 841 ml -= 2; addq $16, -2, $16 .loc 2 842 # 842 mm += 2; ldq $25, 384($sp) addq $25, 16, $27 stq $27, 384($sp) stq $16, 392($sp) bne $16, $79 br $31, $86 $82: .loc 2 846 # 843 } # 844 } # 845 else # 846 { .loc 2 848 # 847 BigNumDigit d0_1, c2, c3, ctmp1; # 848 d0_1 = d1-d0; subq $15, $14, $13 stq $13, 120($sp) .loc 2 850 # 849 # 850 while (ml != 0) beq $19, $86 stq $19, 392($sp) stq $9, 384($sp) $83: ldq $19, 392($sp) ldq $9, 384($sp) .loc 2 851 # 851 { .loc 2 853 # 852 BigNumDigit m0,m1; # 853 m0 = mm[0]; ldq $7, 0($9) .loc 2 854 # 854 m1 = mm[1]; ldq $8, 8($9) .loc 2 855 # 855 if (m0 >= m1) cmpult $7, $8, $23 bne $23, $84 .loc 2 856 # 856 { .loc 2 860 # 857 BigNumDigit m0_1; # 858 BigNumDigit d0m0l, d0m0h, d1m1l, d1m1h, dfl, dfh; # 859 BigNumDigit t0, t1, t2; # 860 d0m0l = d0*m0; .loc 2 861 # 861 d0m0h = asm("umulh %a0, %a1, %v0", d0,m0); umulh $14, $7, $5 bis $5, $5, $20 .loc 2 862 # 862 m0_1 = m0-m1; .loc 2 863 # 863 d1m1l = d1*m1; .loc 2 864 # 864 d1m1h = asm("umulh %a0, %a1, %v0", d1,m1); .loc 2 865 # 865 dfl = d0_1*m0_1; .loc 2 866 # 866 dfh = asm("umulh %a0, %a1, %v0", d0_1,m0_1); .loc 2 867 # 867 p0 = pp[0]; ldq $6, 0($11) .loc 2 868 # 868 p1 = pp[1]; ldq $21, 8($11) .loc 2 869 # 869 p0 += c0; addq $6, $0, $6 .loc 2 870 # 870 ctmp1 = p0 < c0; cmpult $6, $0, $26 .loc 2 871 # 871 p1 += c1; addq $21, $12, $21 .loc 2 872 # 872 c2 = p1 < c1; cmpult $21, $12, $18 .loc 2 873 # 873 p1 += ctmp1; addq $21, $26, $21 .loc 2 874 # 874 c2 += p1 < ctmp1; cmpult $21, $26, $24 addq $18, $24, $18 .loc 2 875 # 875 p0 += d0m0l; mulq $14, $7, $2 addq $6, $2, $6 .loc 2 876 # 876 c1 = p0 < d0m0l; .loc 2 878 # 877 /* compute: t2:t1:t0 = d0*m0 + d1*m1 */ # 878 t0 = d0m0l+d1m1l; .loc 2 879 # 879 ctmp1 = t0 < d0m0l; .loc 2 880 # 880 t1 = d0m0h+d1m1h; .loc 2 881 # 881 t2 = t1 < d0m0h; .loc 2 882 # 882 t1 += ctmp1; .loc 2 883 # 883 t2 += t1 < ctmp1; umulh $15, $8, $10 addq $5, $10, $19 mulq $15, $8, $9 addq $2, $9, $4 cmpult $4, $2, $20 addq $19, $20, $16 cmpult $19, $5, $22 cmpult $16, $20, $25 addq $22, $25, $1 .loc 2 887 # 884 /* t2:t1:t0 = d0*m0 + d1*m1 */ # 885 /* dfh:dfl = - d0*m0 - d1*m1 + d0*m1 + d1*m0 */ # 886 /* compute: t2:t1:t0 = t2:t1:t0 + dfh:dfl */ # 887 t0 += dfl; .loc 2 888 # 888 ctmp1 = t0 < dfl; .loc 2 889 # 889 t1 += dfh; subq $7, $8, $3 ldq $27, 120($sp) xor $27, $3, $23 addq $16, $23, $17 .loc 2 890 # 890 t2 += t1 < dfh; umulh $13, $3, $24 cmpult $17, $24, $22 addq $1, $22, $1 .loc 2 891 # 891 t1 += ctmp1; mulq $13, $3, $16 addq $4, $16, $0 cmpult $0, $16, $19 addq $17, $19, $17 .loc 2 892 # 892 t2 += t1 < ctmp1; cmpult $17, $19, $25 addq $1, $25, $1 .loc 2 894 # 893 /* t2:t1:t0 = d0*m1 + d1*m0 */ # 894 ultra_parnoid(t0, t1, t2, d0, d1, m0, m1); .loc 2 895 # 895 d0m0h += c1; cmpult $6, $2, $27 addq $5, $27, $20 .loc 2 896 # 896 p1 += d0m0h; addq $21, $20, $21 .loc 2 897 # 897 c2 += p1 < d0m0h; cmpult $21, $20, $23 addq $18, $23, $18 .loc 2 898 # 898 p1 += t0; addq $21, $0, $21 .loc 2 899 # 899 c2 += p1 < t0; cmpult $21, $0, $24 addq $18, $24, $18 .loc 2 900 # 900 t1 += c2; addq $17, $18, $17 .loc 2 901 # 901 t2 += t1 < c2; cmpult $17, $18, $22 addq $1, $22, $1 .loc 2 902 # 902 c2 = t1 + d1m1l; addq $17, $9, $0 bis $0, $0, $18 .loc 2 903 # 903 c3 = t2 + d1m1h + (c2 < t1); addq $1, $10, $25 cmpult $0, $17, $27 addq $25, $27, $19 br $31, $85 $84: .loc 2 906 # 904 } # 905 else # 906 { .loc 2 910 # 907 BigNumDigit m0_1; # 908 BigNumDigit d0m0l, d0m0h, d1m1l, d1m1h, dfl, dfh; # 909 BigNumDigit t0, t1, t2; # 910 d0m0l = d0*m0; .loc 2 911 # 911 d0m0h = asm("umulh %a0, %a1, %v0", d0,m0); umulh $14, $7, $5 bis $5, $5, $20 .loc 2 912 # 912 m0_1 = -m0+m1; .loc 2 913 # 913 d1m1l = d1*m1; .loc 2 914 # 914 d1m1h = asm("umulh %a0, %a1, %v0", d1,m1); .loc 2 915 # 915 dfl = d0_1*m0_1; .loc 2 916 # 916 dfh = asm("umulh %a0, %a1, %v0", d0_1,m0_1); .loc 2 917 # 917 p0 = pp[0]; ldq $6, 0($11) .loc 2 918 # 918 p1 = pp[1]; ldq $21, 8($11) .loc 2 919 # 919 p0 += c0; addq $6, $0, $6 .loc 2 920 # 920 ctmp1 = p0 < c0; cmpult $6, $0, $26 .loc 2 921 # 921 p1 += c1; addq $21, $12, $21 .loc 2 922 # 922 c2 = p1 < c1; cmpult $21, $12, $18 .loc 2 923 # 923 p1 += ctmp1; addq $21, $26, $21 .loc 2 924 # 924 c2 += p1 < ctmp1; cmpult $21, $26, $23 addq $18, $23, $18 .loc 2 925 # 925 p0 += d0m0l; mulq $14, $7, $2 addq $6, $2, $6 .loc 2 926 # 926 c1 = p0 < d0m0l; .loc 2 927 # 927 t0 = d0m0l+d1m1l; .loc 2 928 # 928 ctmp1 = t0 < d0m0l; .loc 2 929 # 929 t1 = d0m0h+d1m1h; .loc 2 930 # 930 t2 = t1 < d0m0h; .loc 2 931 # 931 t1 += ctmp1; umulh $15, $8, $10 addq $5, $10, $19 mulq $15, $8, $9 addq $2, $9, $4 cmpult $4, $2, $20 addq $19, $20, $16 bis $16, $16, $0 .loc 2 932 # 932 t2 += t1 < ctmp1; .loc 2 936 # 933 /* t2:t1:t0 = d0*m0 + d1*m1 */ # 934 /* dfh:dfl = d0*m0 + d1*m1 - d0*m1 - d1*m0 */ # 935 /* compute: t2:t1:t0 = t2:t1:t0 - dfh:dfl */ # 936 ctmp1 = t0 < dfl; .loc 2 937 # 937 t0 -= dfl; .loc 2 938 # 938 t2 -= t1 < dfh; subq $8, $7, $1 cmpult $19, $5, $24 cmpult $16, $20, $22 addq $24, $22, $25 ldq $27, 120($sp) xor $27, $1, $23 cmpult $16, $23, $24 subq $25, $24, $3 .loc 2 939 # 939 t1 -= dfh; umulh $13, $1, $22 subq $0, $22, $0 .loc 2 940 # 940 t2 -= t1 < ctmp1; mulq $13, $1, $16 cmpult $4, $16, $17 cmpult $0, $17, $27 subq $3, $27, $3 .loc 2 941 # 941 t1 -= ctmp1; subq $0, $17, $0 .loc 2 943 # 942 /* t2:t1:t0 = d0*m1 + d1*m0 */ # 943 ultra_parnoid(t0, t1, t2, d0, d1, m0, m1); .loc 2 944 # 944 d0m0h += c1; cmpult $6, $2, $23 addq $5, $23, $20 .loc 2 945 # 945 p1 += d0m0h; addq $21, $20, $21 .loc 2 946 # 946 c2 += p1 < d0m0h; cmpult $21, $20, $25 addq $18, $25, $18 .loc 2 947 # 947 p1 += t0; subq $4, $16, $19 addq $21, $19, $21 .loc 2 948 # 948 c2 += p1 < t0; cmpult $21, $19, $24 addq $18, $24, $18 .loc 2 949 # 949 t1 += c2; addq $0, $18, $0 .loc 2 950 # 950 t2 += t1 < c2; cmpult $0, $18, $22 addq $3, $22, $3 .loc 2 951 # 951 c2 = t1 + d1m1l; addq $0, $9, $16 bis $16, $16, $18 .loc 2 952 # 952 c3 = t2 + d1m1h + (c2 < t1); addq $3, $10, $27 cmpult $16, $0, $23 addq $27, $23, $19 $85: ldq $16, 392($sp) .loc 2 955 # 953 } # 954 # 955 pp[0] = p0; stq $6, 0($11) .loc 2 956 # 956 pp[1] = p1; stq $21, 8($11) .loc 2 957 # 957 pp += 2; addq $11, 16, $11 .loc 2 958 # 958 pl -= 2; ldq $25, 376($sp) addq $25, -2, $24 stq $24, 376($sp) .loc 2 959 # 959 c0 = c2; bis $18, $18, $0 .loc 2 960 # 960 c1 = c3; bis $19, $19, $12 .loc 2 961 # 961 ml -= 2; addq $16, -2, $16 .loc 2 962 # 962 mm += 2; ldq $22, 384($sp) addq $22, 16, $27 stq $27, 384($sp) stq $16, 392($sp) bne $16, $83 $86: .loc 2 965 # 963 } # 964 } # 965 p0 = pp[0]; ldq $6, 0($11) .loc 2 966 # 966 p1 = pp[1]; ldq $21, 8($11) .loc 2 967 # 967 p0 += c0; addq $6, $0, $6 .loc 2 968 # 968 pp[0] = p0; stq $6, 0($11) .loc 2 969 # 969 c1 += p0 < c0; cmpult $6, $0, $23 addq $12, $23, $12 .loc 2 970 # 970 p1 += c1; addq $21, $12, $21 .loc 2 971 # 971 pp[1] = p1; stq $21, 8($11) .loc 2 973 # 972 # 973 if (c1 <= p1) cmpult $21, $12, $25 bne $25, $87 .loc 2 974 # 974 { .loc 2 978 # 975 #ifdef PARANOID # 976 assert(sc == 0 && BnnCompare(sp, sl, rp, sl) == BN_EQ); # 977 #endif # 978 return (0); bis $31, $31, $0 br $31, $90 $87: ldq $17, 376($sp) .loc 2 981 # 979 } # 980 # 981 pl -= 2; addq $17, -2, $17 .loc 2 982 # 982 pp+=2; addq $11, 16, $11 .loc 2 983 # 983 while (pl != 0 && !(++(*pp++))) cmpeq $17, 0, $0 xor $0, 1, $0 beq $0, $89 ldq $24, 0($11) addq $24, 1, $22 stq $22, 0($11) ldq $16, 0($11) cmpeq $16, 0, $16 addq $11, 8, $11 beq $16, $89 $88: .loc 2 984 # 984 pl--; addq $17, -1, $17 cmpeq $17, 0, $0 xor $0, 1, $0 beq $0, $89 ldq $27, 0($11) addq $27, 1, $23 stq $23, 0($11) ldq $16, 0($11) cmpeq $16, 0, $16 addq $11, 8, $11 bne $16, $88 $89: .loc 2 990 # 985 # 986 #ifdef PARANOID # 987 assert(sc == (pl != 0 ? 0 : 1)); # 988 assert(BnnCompare(sp, sl, rp, sl) == BN_EQ); # 989 #endif # 990 return (pl != 0 ? 0 : 1); bis $31, $31, $16 cmoveq $0, 1, $16 bis $16, $16, $0 $90: .livereg 0xFC7F0002,0x3FC00000 ldq $26, 0($sp) ldq $9, 8($sp) ldq $10, 16($sp) ldq $11, 24($sp) ldq $12, 32($sp) ldq $13, 40($sp) ldq $14, 48($sp) ldq $15, 56($sp) lda $sp, 416($sp) ret $31, ($26), 1 .end BnnMultiply2Digit .text .align 4 .file 2 "c/KerN.c" .globl BnnDivideDigit .loc 2 1019 # 1019 { .ent BnnDivideDigit 2 BnnDivideDigit: .option O2 ldgp $gp, 0($27) lda $sp, -240($sp) stq $26, 0($sp) stq $9, 8($sp) stq $10, 16($sp) stq $11, 24($sp) stq $12, 32($sp) .mask 0x04001E00, -240 .frame $sp, 240, $26, 48 .prologue 1 bis $16, $16, $10 bis $17, $17, $12 bis $18, $18, $11 bis $19, $19, $5 .loc 2 1019 .loc 2 1021 # 1020 /* test computed at compile time */ # 1021 if (sizeof (BigNumProduct) > sizeof (BigNumDigit)) .loc 2 1042 # 1042 { .loc 2 1053 # 1053 k = BnnNumLeadingZeroBitsInDigit (d); bis $5, $5, $16 stq $5, 216($sp) .livereg 0x0001C002,0x00000000 jsr $26, BnnNumLeadingZeroBitsInDigit ldgp $gp, 0($26) ldq $5, 216($sp) addl $0, 0, $16 stl $16, 176($sp) .loc 2 1054 # 1054 if (k != 0) beq $16, $91 .loc 2 1055 # 1055 { .loc 2 1056 # 1056 prev_qq = qq[-1]; ldq $22, -8($10) stq $22, 104($sp) .loc 2 1057 # 1057 orig_nl = nl; stq $11, 168($sp) .loc 2 1058 # 1058 d <<= k; ldl $23, 176($sp) sll $5, $23, $5 .loc 2 1059 # 1059 BnnShiftLeft (nn, nl, k); bis $12, $12, $16 bis $11, $11, $17 bis $23, $23, $18 stq $5, 216($sp) .livereg 0x0001E002,0x00000000 jsr $26, BnnShiftLeft ldgp $gp, 0($26) ldq $5, 216($sp) $91: .loc 2 1062 # 1060 } # 1061 # 1062 nn += nl; s8addq $11, $12, $12 .loc 2 1063 # 1063 nl--; addq $11, -1, $11 .loc 2 1064 # 1064 qq += nl; s8addq $11, $10, $10 .loc 2 1066 # 1065 # 1066 ch = HIGH (d); srl $5, 32, $6 bis $6, $6, $26 .loc 2 1067 # 1067 cl = LOW (d); and $5, 4294967295, $8 bis $8, $8, $9 .loc 2 1069 # 1068 # 1069 rl = *(--nn); addq $12, -8, $12 ldq $7, 0($12) .loc 2 1071 # 1070 # 1071 while (nl != 0) beq $11, $103 $92: .loc 2 1072 # 1072 { .loc 2 1073 # 1073 nl--; addq $11, -1, $11 .loc 2 1074 # 1074 rh = rl; bis $7, $7, $1 .loc 2 1075 # 1075 rl = *(--nn); addq $12, -8, $12 ldq $7, 0($12) .loc 2 1076 # 1076 qa = rh / ch; /* appr. quotient */ divqu $1, $6, $0 bis $0, $0, $3 .loc 2 1079 # 1077 # 1078 /* Compute ph, pl */ # 1079 pl = cl * qa; .loc 2 1080 # 1080 ph = ch * qa; .loc 2 1081 # 1081 ph += HIGH (pl); mulq $9, $0, $18 mulq $6, $0, $24 srl $18, 32, $25 addq $24, $25, $19 bis $19, $19, $17 .loc 2 1082 # 1082 pl = L2H (pl); sll $18, 32, $20 bis $20, $20, $16 .loc 2 1085 # 1083 # 1084 /* While ph:pl > rh:rl, decrement qa, adjust qh:ql */ # 1085 while (ph > rh || ph == rh && pl > rl) cmpult $1, $19, $27 bne $27, $93 divqu $1, $26, $0 mulq $26, $0, $22 mulq $9, $0, $23 srl $23, 32, $24 addq $22, $24, $25 subq $25, $1, $27 bne $27, $96 cmpult $7, $20, $23 beq $23, $96 $93: .loc 2 1086 # 1086 { .loc 2 1087 # 1087 qa--; addq $3, -1, $3 .loc 2 1088 # 1088 SUB (ph, pl, ch, L2H (cl)); sll $8, 32, $0 cmpult $16, $0, $22 beq $22, $94 .loc 2 1088 .loc 2 1088 subq $16, $0, $16 .loc 2 1088 subq $17, $6, $17 addq $17, -1, $17 br $31, $95 $94: .loc 2 1088 .loc 2 1088 subq $16, $0, $16 .loc 2 1088 subq $17, $6, $17 $95: .loc 2 1088 cmpult $1, $17, $24 bne $24, $93 subq $17, $1, $25 bne $25, $96 cmpult $7, $16, $27 bne $27, $93 $96: .loc 2 1091 # 1089 } # 1090 # 1091 SUB (rh, rl, ph, pl); cmpult $7, $16, $23 beq $23, $97 .loc 2 1091 .loc 2 1091 subq $7, $16, $7 .loc 2 1091 subq $1, $17, $1 addq $1, -1, $1 br $31, $98 $97: .loc 2 1091 .loc 2 1091 subq $7, $16, $7 .loc 2 1091 subq $1, $17, $1 $98: .loc 2 1091 .loc 2 1094 # 1092 # 1093 /* Top half of quotient is correct; save it */ # 1094 *(--qq) = L2H (qa); addq $10, -8, $18 bis $18, $18, $2 bis $18, $18, $10 sll $3, 32, $22 stq $22, 0($2) .loc 2 1095 # 1095 qa = (L2H (rh) | HIGH (rl)) / ch; sll $1, 32, $24 srl $7, 32, $25 or $24, $25, $4 divqu $4, $6, $0 bis $0, $0, $3 .loc 2 1099 # 1096 # 1097 /* Approx low half of q */ # 1098 /* Compute ph, pl, again */ # 1099 pl = cl * qa; .loc 2 1100 # 1100 ph = ch * qa; .loc 2 1101 # 1101 ph += HIGH (pl); .loc 2 1102 # 1102 pl = LOW (pl) | L2H (LOW (ph)); mulq $9, $0, $19 mulq $6, $0, $27 srl $19, 32, $23 addq $27, $23, $20 and $19, 4294967295, $22 and $20, 4294967295, $24 sll $24, 32, $25 or $22, $25, $16 .loc 2 1103 # 1103 ph = HIGH (ph); srl $20, 32, $21 bis $21, $21, $17 .loc 2 1106 # 1104 # 1105 /* While ph:pl > rh:rl, decrement qa, adjust qh:ql */ # 1106 while (ph > rh || ph == rh && pl > rl) cmpult $1, $21, $27 bne $27, $99 divqu $4, $26, $0 mulq $26, $0, $23 mulq $9, $0, $24 srl $24, 32, $22 addq $23, $22, $25 srl $25, 32, $27 subq $27, $1, $24 bne $24, $102 cmpult $7, $16, $23 beq $23, $102 $99: .loc 2 1107 # 1107 { .loc 2 1108 # 1108 qa--; addq $3, -1, $3 .loc 2 1109 # 1109 SUB (ph, pl, 0, d); cmpult $16, $5, $22 beq $22, $100 .loc 2 1109 .loc 2 1109 subq $16, $5, $16 .loc 2 1109 addq $17, -1, $17 br $31, $101 $100: .loc 2 1109 .loc 2 1109 subq $16, $5, $16 .loc 2 1109 $101: .loc 2 1109 cmpult $1, $17, $25 bne $25, $99 subq $17, $1, $27 bne $27, $102 cmpult $7, $16, $24 bne $24, $99 $102: .loc 2 1113 # 1110 } # 1111 # 1112 /* Subtract ph:pl from rh:rl; we know rh will be 0 */ # 1113 rl -= pl; subq $7, $16, $7 .loc 2 1114 # 1114 *qq |= qa; ldq $23, 0($10) or $23, $3, $22 stq $22, 0($10) bne $11, $92 $103: .loc 2 1118 # 1115 } # 1116 # 1117 /* Denormalize dividend */ # 1118 if (k != 0) { ldl $25, 176($sp) beq $25, $106 .loc 2 1118 .loc 2 1119 # 1119 if((qq > nn) && (qq < &nn[orig_nl])) { cmpult $12, $10, $27 beq $27, $104 ldq $19, 168($sp) s8addq $19, $12, $24 cmpult $10, $24, $23 beq $23, $104 .loc 2 1119 .loc 2 1121 # 1120 /* Overlap between qq and nn. Care of *qq! */ # 1121 orig_nl = (qq - nn); .loc 2 1122 # 1122 BnnShiftRight (nn, orig_nl, k); bis $12, $12, $16 subq $10, $12, $17 sra $17, 3, $17 bis $25, $25, $18 stq $17, 88($sp) stq $7, 152($sp) .livereg 0x0001E002,0x00000000 jsr $26, BnnShiftRight ldgp $gp, 0($26) ldq $17, 88($sp) ldq $7, 152($sp) .loc 2 1123 # 1123 nn[orig_nl - 1] = prev_qq; ldq $22, 104($sp) addq $17, -1, $27 s8addq $27, $12, $24 stq $22, 0($24) br $31, $106 $104: ldq $19, 168($sp) .loc 2 1124 # 1124 } else if(qq == nn) { subq $10, $12, $23 bne $23, $105 .loc 2 1124 .loc 2 1125 # 1125 BnnShiftRight(&nn[orig_nl - 1], 1, k); addq $19, -1, $25 s8addq $25, $12, $16 ldiq $17, 1 ldl $18, 176($sp) stq $7, 152($sp) .livereg 0x0001E002,0x00000000 jsr $26, BnnShiftRight ldgp $gp, 0($26) ldq $7, 152($sp) br $31, $106 $105: .loc 2 1126 # 1126 } else { .loc 2 1127 # 1127 BnnShiftRight (nn, orig_nl, k); bis $12, $12, $16 bis $19, $19, $17 ldl $18, 176($sp) stq $7, 152($sp) .livereg 0x0001E002,0x00000000 jsr $26, BnnShiftRight ldgp $gp, 0($26) ldq $7, 152($sp) $106: .loc 2 1129 # 1128 } } # 1129 return (rl >> k); ldl $27, 176($sp) srl $7, $27, $0 .livereg 0xFC7F0002,0x3FC00000 ldq $26, 0($sp) ldq $9, 8($sp) ldq $10, 16($sp) ldq $11, 24($sp) ldq $12, 32($sp) lda $sp, 240($sp) ret $31, ($26), 1 .end BnnDivideDigit