544 lines
8.1 KiB
ArmAsm
544 lines
8.1 KiB
ArmAsm
/* This assember is for R4000 and above machines. It takes advantage
|
|
* of the 64 bit registers present on these CPUs.
|
|
* Make sure that the SSLeay bignum library is compiled with
|
|
* SIXTY_FOUR_BIT set and BN_LLONG undefined.
|
|
* This must either be compiled with the system CC, or, if you use GNU gas,
|
|
* cc -E mips3.s|gas -o mips3.o
|
|
*/
|
|
.set reorder
|
|
.set noat
|
|
|
|
#define R1 $1
|
|
#define CC $2
|
|
#define R2 $3
|
|
#define R3 $8
|
|
#define R4 $9
|
|
#define L1 $10
|
|
#define L2 $11
|
|
#define L3 $12
|
|
#define L4 $13
|
|
#define H1 $14
|
|
#define H2 $15
|
|
#define H3 $24
|
|
#define H4 $25
|
|
|
|
#define P1 $4
|
|
#define P2 $5
|
|
#define P3 $6
|
|
#define P4 $7
|
|
|
|
.align 2
|
|
.ent bn_mul_add_words
|
|
.globl bn_mul_add_words
|
|
.text
|
|
bn_mul_add_words:
|
|
.frame $sp,0,$31
|
|
.mask 0x00000000,0
|
|
.fmask 0x00000000,0
|
|
|
|
#blt P3,4,$lab34
|
|
|
|
subu R1,P3,4
|
|
move CC,$0
|
|
bltz R1,$lab34
|
|
$lab2:
|
|
ld R1,0(P1)
|
|
ld L1,0(P2)
|
|
ld R2,8(P1)
|
|
ld L2,8(P2)
|
|
ld R3,16(P1)
|
|
ld L3,16(P2)
|
|
ld R4,24(P1)
|
|
ld L4,24(P2)
|
|
dmultu L1,P4
|
|
daddu R1,R1,CC
|
|
mflo L1
|
|
sltu CC,R1,CC
|
|
daddu R1,R1,L1
|
|
mfhi H1
|
|
sltu L1,R1,L1
|
|
sd R1,0(P1)
|
|
daddu CC,CC,L1
|
|
dmultu L2,P4
|
|
daddu CC,H1,CC
|
|
mflo L2
|
|
daddu R2,R2,CC
|
|
sltu CC,R2,CC
|
|
mfhi H2
|
|
daddu R2,R2,L2
|
|
daddu P2,P2,32
|
|
sltu L2,R2,L2
|
|
sd R2,8(P1)
|
|
daddu CC,CC,L2
|
|
dmultu L3,P4
|
|
daddu CC,H2,CC
|
|
mflo L3
|
|
daddu R3,R3,CC
|
|
sltu CC,R3,CC
|
|
mfhi H3
|
|
daddu R3,R3,L3
|
|
daddu P1,P1,32
|
|
sltu L3,R3,L3
|
|
sd R3,-16(P1)
|
|
daddu CC,CC,L3
|
|
dmultu L4,P4
|
|
daddu CC,H3,CC
|
|
mflo L4
|
|
daddu R4,R4,CC
|
|
sltu CC,R4,CC
|
|
mfhi H4
|
|
daddu R4,R4,L4
|
|
subu P3,P3,4
|
|
sltu L4,R4,L4
|
|
daddu CC,CC,L4
|
|
daddu CC,H4,CC
|
|
|
|
subu R1,P3,4
|
|
sd R4,-8(P1) # delay slot
|
|
bgez R1,$lab2
|
|
|
|
bleu P3,0,$lab3
|
|
.align 2
|
|
$lab33:
|
|
ld L1,0(P2)
|
|
ld R1,0(P1)
|
|
dmultu L1,P4
|
|
daddu R1,R1,CC
|
|
sltu CC,R1,CC
|
|
daddu P1,P1,8
|
|
mflo L1
|
|
mfhi H1
|
|
daddu R1,R1,L1
|
|
daddu P2,P2,8
|
|
sltu L1,R1,L1
|
|
subu P3,P3,1
|
|
daddu CC,CC,L1
|
|
sd R1,-8(P1)
|
|
daddu CC,H1,CC
|
|
bgtz P3,$lab33
|
|
j $31
|
|
.align 2
|
|
$lab3:
|
|
j $31
|
|
.align 2
|
|
$lab34:
|
|
bgt P3,0,$lab33
|
|
j $31
|
|
.end bn_mul_add_words
|
|
|
|
.align 2
|
|
# Program Unit: bn_mul_words
|
|
.ent bn_mul_words
|
|
.globl bn_mul_words
|
|
.text
|
|
bn_mul_words:
|
|
.frame $sp,0,$31
|
|
.mask 0x00000000,0
|
|
.fmask 0x00000000,0
|
|
|
|
subu P3,P3,4
|
|
move CC,$0
|
|
bltz P3,$lab45
|
|
$lab44:
|
|
ld L1,0(P2)
|
|
ld L2,8(P2)
|
|
ld L3,16(P2)
|
|
ld L4,24(P2)
|
|
dmultu L1,P4
|
|
subu P3,P3,4
|
|
mflo L1
|
|
mfhi H1
|
|
daddu L1,L1,CC
|
|
dmultu L2,P4
|
|
sltu CC,L1,CC
|
|
sd L1,0(P1)
|
|
daddu CC,H1,CC
|
|
mflo L2
|
|
mfhi H2
|
|
daddu L2,L2,CC
|
|
dmultu L3,P4
|
|
sltu CC,L2,CC
|
|
sd L2,8(P1)
|
|
daddu CC,H2,CC
|
|
mflo L3
|
|
mfhi H3
|
|
daddu L3,L3,CC
|
|
dmultu L4,P4
|
|
sltu CC,L3,CC
|
|
sd L3,16(P1)
|
|
daddu CC,H3,CC
|
|
mflo L4
|
|
mfhi H4
|
|
daddu L4,L4,CC
|
|
daddu P1,P1,32
|
|
sltu CC,L4,CC
|
|
daddu P2,P2,32
|
|
daddu CC,H4,CC
|
|
sd L4,-8(P1)
|
|
|
|
bgez P3,$lab44
|
|
b $lab45
|
|
$lab46:
|
|
ld L1,0(P2)
|
|
daddu P1,P1,8
|
|
dmultu L1,P4
|
|
daddu P2,P2,8
|
|
mflo L1
|
|
mfhi H1
|
|
daddu L1,L1,CC
|
|
subu P3,P3,1
|
|
sltu CC,L1,CC
|
|
sd L1,-8(P1)
|
|
daddu CC,H1,CC
|
|
bgtz P3,$lab46
|
|
j $31
|
|
$lab45:
|
|
addu P3,P3,4
|
|
bgtz P3,$lab46
|
|
j $31
|
|
.align 2
|
|
.end bn_mul_words
|
|
|
|
# Program Unit: bn_sqr_words
|
|
.ent bn_sqr_words
|
|
.globl bn_sqr_words
|
|
.text
|
|
bn_sqr_words:
|
|
.frame $sp,0,$31
|
|
.mask 0x00000000,0
|
|
.fmask 0x00000000,0
|
|
|
|
subu P3,P3,4
|
|
b $lab55
|
|
bltz P3,$lab55
|
|
$lab54:
|
|
ld L1,0(P2)
|
|
ld L2,8(P2)
|
|
ld L3,16(P2)
|
|
ld L4,24(P2)
|
|
|
|
dmultu L1,L1
|
|
subu P3,P3,4
|
|
mflo L1
|
|
mfhi H1
|
|
sd L1,0(P1)
|
|
sd H1,8(P1)
|
|
|
|
dmultu L2,L2
|
|
daddu P1,P1,32
|
|
mflo L2
|
|
mfhi H2
|
|
sd L2,-48(P1)
|
|
sd H2,-40(P1)
|
|
|
|
dmultu L3,L3
|
|
daddu P2,P2,32
|
|
mflo L3
|
|
mfhi H3
|
|
sd L3,-32(P1)
|
|
sd H3,-24(P1)
|
|
|
|
dmultu L4,L4
|
|
|
|
mflo L4
|
|
mfhi H4
|
|
sd L4,-16(P1)
|
|
sd H4,-8(P1)
|
|
|
|
bgtz P3,$lab54
|
|
b $lab55
|
|
$lab56:
|
|
ld L1,0(P2)
|
|
daddu P1,P1,16
|
|
dmultu L1,L1
|
|
daddu P2,P2,8
|
|
subu P3,P3,1
|
|
mflo L1
|
|
mfhi H1
|
|
sd L1,-16(P1)
|
|
sd H1,-8(P1)
|
|
|
|
bgtz P3,$lab56
|
|
j $31
|
|
$lab55:
|
|
daddu P3,P3,4
|
|
bgtz P3,$lab56
|
|
j $31
|
|
.align 2
|
|
.end bn_sqr_words
|
|
|
|
# Program Unit: bn_add_words
|
|
.ent bn_add_words
|
|
.globl bn_add_words
|
|
.text
|
|
bn_add_words: # 0x590
|
|
.frame $sp,0,$31
|
|
.mask 0x00000000,0
|
|
.fmask 0x00000000,0
|
|
|
|
subu P4,P4,4
|
|
move CC,$0
|
|
bltz P4,$lab65
|
|
$lab64:
|
|
ld L1,0(P2)
|
|
ld R1,0(P3)
|
|
ld L2,8(P2)
|
|
ld R2,8(P3)
|
|
|
|
daddu L1,L1,CC
|
|
ld L3,16(P2)
|
|
sltu CC,L1,CC
|
|
daddu L1,L1,R1
|
|
sltu R1,L1,R1
|
|
ld R3,16(P3)
|
|
daddu CC,CC,R1
|
|
ld L4,24(P2)
|
|
|
|
daddu L2,L2,CC
|
|
ld R4,24(P3)
|
|
sltu CC,L2,CC
|
|
daddu L2,L2,R2
|
|
sltu R2,L2,R2
|
|
sd L1,0(P1)
|
|
daddu CC,CC,R2
|
|
daddu P1,P1,32
|
|
daddu L3,L3,CC
|
|
sd L2,-24(P1)
|
|
|
|
sltu CC,L3,CC
|
|
daddu L3,L3,R3
|
|
sltu R3,L3,R3
|
|
daddu P2,P2,32
|
|
daddu CC,CC,R3
|
|
|
|
daddu L4,L4,CC
|
|
daddu P3,P3,32
|
|
sltu CC,L4,CC
|
|
daddu L4,L4,R4
|
|
sltu R4,L4,R4
|
|
subu P4,P4,4
|
|
sd L3,-16(P1)
|
|
daddu CC,CC,R4
|
|
sd L4,-8(P1)
|
|
|
|
bgtz P4,$lab64
|
|
b $lab65
|
|
$lab66:
|
|
ld L1,0(P2)
|
|
ld R1,0(P3)
|
|
daddu L1,L1,CC
|
|
daddu P1,P1,8
|
|
sltu CC,L1,CC
|
|
daddu P2,P2,8
|
|
daddu P3,P3,8
|
|
daddu L1,L1,R1
|
|
subu P4,P4,1
|
|
sltu R1,L1,R1
|
|
sd L1,-8(P1)
|
|
daddu CC,CC,R1
|
|
|
|
bgtz P4,$lab66
|
|
j $31
|
|
$lab65:
|
|
addu P4,P4,4
|
|
bgtz P4,$lab66
|
|
j $31
|
|
.end bn_add_words
|
|
|
|
#if 1
|
|
# Program Unit: bn_div64
|
|
.set at
|
|
.set reorder
|
|
.text
|
|
.align 2
|
|
.globl bn_div64
|
|
# 321 {
|
|
.ent bn_div64
|
|
bn_div64:
|
|
dsubu $sp, 64
|
|
sd $31, 56($sp)
|
|
sd $16, 48($sp)
|
|
.mask 0x80010000, -56
|
|
.frame $sp, 64, $31
|
|
move $9, $4
|
|
move $12, $5
|
|
move $16, $6
|
|
# 322 BN_ULONG dh,dl,q,ret=0,th,tl,t;
|
|
move $31, $0
|
|
# 323 int i,count=2;
|
|
li $13, 2
|
|
# 324
|
|
# 325 if (d == 0) return(BN_MASK2);
|
|
bne $16, 0, $80
|
|
dli $2, -1
|
|
b $93
|
|
$80:
|
|
# 326
|
|
# 327 i=BN_num_bits_word(d);
|
|
move $4, $16
|
|
sd $31, 16($sp)
|
|
sd $9, 24($sp)
|
|
sd $12, 32($sp)
|
|
sd $13, 40($sp)
|
|
.livereg 0x800ff0e,0xfff
|
|
jal BN_num_bits_word
|
|
dli $4, 64
|
|
ld $31, 16($sp)
|
|
ld $9, 24($sp)
|
|
ld $12, 32($sp)
|
|
ld $13, 40($sp)
|
|
move $3, $2
|
|
# 328 if ((i != BN_BITS2) && (h > (BN_ULONG)1<<i))
|
|
beq $2, $4, $81
|
|
dli $14, 1
|
|
dsll $15, $14, $2
|
|
bleu $9, $15, $81
|
|
# 329 {
|
|
# 330 #if !defined(NO_STDIO) && !defined(WIN16)
|
|
# 331 fprintf(stderr,"Division would overflow (%d)\n",i);
|
|
# 332 #endif
|
|
# 333 abort();
|
|
sd $3, 8($sp)
|
|
sd $31, 16($sp)
|
|
sd $9, 24($sp)
|
|
sd $12, 32($sp)
|
|
sd $13, 40($sp)
|
|
.livereg 0xff0e,0xfff
|
|
jal abort
|
|
dli $4, 64
|
|
ld $3, 8($sp)
|
|
ld $31, 16($sp)
|
|
ld $9, 24($sp)
|
|
ld $12, 32($sp)
|
|
ld $13, 40($sp)
|
|
# 334 }
|
|
$81:
|
|
# 335 i=BN_BITS2-i;
|
|
dsubu $3, $4, $3
|
|
# 336 if (h >= d) h-=d;
|
|
bltu $9, $16, $82
|
|
dsubu $9, $9, $16
|
|
$82:
|
|
# 337
|
|
# 338 if (i)
|
|
beq $3, 0, $83
|
|
# 339 {
|
|
# 340 d<<=i;
|
|
dsll $16, $16, $3
|
|
# 341 h=(h<<i)|(l>>(BN_BITS2-i));
|
|
dsll $24, $9, $3
|
|
dsubu $25, $4, $3
|
|
dsrl $14, $12, $25
|
|
or $9, $24, $14
|
|
# 342 l<<=i;
|
|
dsll $12, $12, $3
|
|
# 343 }
|
|
$83:
|
|
# 344 dh=(d&BN_MASK2h)>>BN_BITS4;
|
|
# 345 dl=(d&BN_MASK2l);
|
|
and $8, $16,0xFFFFFFFF00000000
|
|
dsrl $8, $8, 32
|
|
# dli $10,0xFFFFFFFF # Is this needed?
|
|
# and $10, $16, $10
|
|
dsll $10, $16, 32
|
|
dsrl $10, $10, 32
|
|
dli $6,0xFFFFFFFF00000000
|
|
$84:
|
|
# 346 for (;;)
|
|
# 347 {
|
|
# 348 if ((h>>BN_BITS4) == dh)
|
|
dsrl $15, $9, 32
|
|
bne $8, $15, $85
|
|
# 349 q=BN_MASK2l;
|
|
dli $5, 0xFFFFFFFF
|
|
b $86
|
|
$85:
|
|
# 350 else
|
|
# 351 q=h/dh;
|
|
ddivu $5, $9, $8
|
|
$86:
|
|
# 352
|
|
# 353 for (;;)
|
|
# 354 {
|
|
# 355 t=(h-q*dh);
|
|
dmul $4, $5, $8
|
|
dsubu $2, $9, $4
|
|
move $3, $2
|
|
# 356 if ((t&BN_MASK2h) ||
|
|
# 357 ((dl*q) <= (
|
|
# 358 (t<<BN_BITS4)+
|
|
# 359 ((l&BN_MASK2h)>>BN_BITS4))))
|
|
and $25, $2, $6
|
|
bne $25, $0, $87
|
|
dmul $24, $10, $5
|
|
dsll $14, $3, 32
|
|
and $15, $12, $6
|
|
dsrl $25, $15, 32
|
|
daddu $15, $14, $25
|
|
bgtu $24, $15, $88
|
|
$87:
|
|
# 360 break;
|
|
dmul $3, $10, $5
|
|
b $89
|
|
$88:
|
|
# 361 q--;
|
|
daddu $5, $5, -1
|
|
# 362 }
|
|
b $86
|
|
$89:
|
|
# 363 th=q*dh;
|
|
# 364 tl=q*dl;
|
|
# 365 t=(tl>>BN_BITS4);
|
|
# 366 tl=(tl<<BN_BITS4)&BN_MASK2h;
|
|
dsll $14, $3, 32
|
|
and $2, $14, $6
|
|
move $11, $2
|
|
# 367 th+=t;
|
|
dsrl $25, $3, 32
|
|
daddu $7, $4, $25
|
|
# 368
|
|
# 369 if (l < tl) th++;
|
|
bgeu $12, $2, $90
|
|
daddu $7, $7, 1
|
|
$90:
|
|
# 370 l-=tl;
|
|
dsubu $12, $12, $11
|
|
# 371 if (h < th)
|
|
bgeu $9, $7, $91
|
|
# 372 {
|
|
# 373 h+=d;
|
|
daddu $9, $9, $16
|
|
# 374 q--;
|
|
daddu $5, $5, -1
|
|
# 375 }
|
|
$91:
|
|
# 376 h-=th;
|
|
dsubu $9, $9, $7
|
|
# 377
|
|
# 378 if (--count == 0) break;
|
|
addu $13, $13, -1
|
|
beq $13, 0, $92
|
|
# 379
|
|
# 380 ret=q<<BN_BITS4;
|
|
dsll $31, $5, 32
|
|
# 381 h=((h<<BN_BITS4)|(l>>BN_BITS4))&BN_MASK2;
|
|
dsll $24, $9, 32
|
|
dsrl $15, $12, 32
|
|
or $9, $24, $15
|
|
# 382 l=(l&BN_MASK2l)<<BN_BITS4;
|
|
and $12, $12, 0xFFFFFFFF
|
|
dsll $12, $12, 32
|
|
# 383 }
|
|
b $84
|
|
$92:
|
|
# 384 ret|=q;
|
|
or $31, $31, $5
|
|
# 385 return(ret);
|
|
move $2, $31
|
|
$93:
|
|
ld $16, 48($sp)
|
|
ld $31, 56($sp)
|
|
daddu $sp, 64
|
|
j $31
|
|
.end bn_div64
|
|
#endif
|