1 /* This assember is for R2000/R3000 machines, or higher ones that do
2 * no want to do any 64 bit arithmatic.
3 * Make sure that the SSLeay bignum library is compiled with
5 * This must either be compiled with the system CC, or, if you use GNU gas,
6 * cc -E mips1.s|gas -o mips1.o
32 .globl bn_mul_add_words
97 sw R4,-4(P1) # delay slot
127 .end bn_mul_add_words
130 # Program Unit: bn_mul_words
202 # Program Unit: bn_sqr_words
269 # Program Unit: bn_add_words
273 bn_add_words: # 0x590
347 # Program Unit: bn_div64
359 .mask 0x80010000, -56
364 # 322 BN_ULONG dh,dl,q,ret=0,th,tl,t;
369 # 325 if (d == 0) return(BN_MASK2);
375 # 327 i=BN_num_bits_word(d);
381 .livereg 0x800ff0e,0xfff
389 # 328 if ((i != BN_BITS2) && (h > (BN_ULONG)1<<i))
395 # 330 #if !defined(NO_STDIO) && !defined(WIN16)
396 # 331 fprintf(stderr,"Division would overflow (%d)\n",i);
404 .livereg 0xff0e,0xfff
416 # 336 if (h >= d) h-=d;
426 # 341 h=(h<<i)|(l>>(BN_BITS2-i));
435 # 344 dh=(d&BN_MASK2h)>>BN_BITS4;
436 # 345 dl=(d&BN_MASK2l);
444 # 348 if ((h>>BN_BITS4) == dh)
462 # 356 if ((t&BN_MASK2h) ||
465 # 359 ((l&BN_MASK2h)>>BN_BITS4))))
486 # 365 t=(tl>>BN_BITS4);
487 # 366 tl=(tl<<BN_BITS4)&BN_MASK2h;
495 # 369 if (l < tl) th++;
513 # 378 if (--count == 0) break;
517 # 380 ret=q<<BN_BITS4;
519 # 381 h=((h<<BN_BITS4)|(l>>BN_BITS4))&BN_MASK2;
523 # 382 l=(l&BN_MASK2l)<<BN_BITS4;