| /* This assember is for R2000/R3000 machines, or higher ones that do | 
 |  * no want to do any 64 bit arithmatic. | 
 |  * Make sure that the SSLeay bignum library is compiled with  | 
 |  * THIRTY_TWO_BIT set. | 
 |  * This must either be compiled with the system CC, or, if you use GNU gas, | 
 |  * cc -E mips1.s|gas -o mips1.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:	 | 
 | 	lw	R1,0(P1) | 
 | 	 lw	L1,0(P2) | 
 | 	lw	R2,4(P1) | 
 | 	 lw	L2,4(P2) | 
 | 	lw	R3,8(P1) | 
 | 	 lw	L3,8(P2) | 
 | 	lw	R4,12(P1) | 
 | 	 lw	L4,12(P2) | 
 | 	multu	L1,P4 | 
 | 	 addu	R1,R1,CC | 
 | 	mflo	L1 | 
 | 	 sltu	CC,R1,CC | 
 | 	addu	R1,R1,L1 | 
 | 	 mfhi	H1 | 
 | 	sltu	L1,R1,L1 | 
 | 	 sw	R1,0(P1) | 
 | 	addu	CC,CC,L1 | 
 | 	 multu	L2,P4 | 
 | 	addu	CC,H1,CC | 
 | 	mflo	L2 | 
 | 	 addu	R2,R2,CC | 
 | 	sltu	CC,R2,CC | 
 | 	 mfhi	H2 | 
 | 	addu	R2,R2,L2 | 
 | 	 addu	P2,P2,16 | 
 | 	sltu	L2,R2,L2 | 
 | 	 sw	R2,4(P1) | 
 | 	addu	CC,CC,L2 | 
 | 	 multu	L3,P4 | 
 | 	addu	CC,H2,CC | 
 | 	mflo	L3 | 
 | 	 addu	R3,R3,CC | 
 | 	sltu	CC,R3,CC | 
 | 	 mfhi	H3 | 
 | 	addu	R3,R3,L3 | 
 | 	 addu	P1,P1,16 | 
 | 	sltu	L3,R3,L3 | 
 | 	 sw	R3,-8(P1) | 
 | 	addu	CC,CC,L3 | 
 | 	 multu	L4,P4 | 
 | 	addu	CC,H3,CC | 
 | 	mflo	L4 | 
 | 	 addu	R4,R4,CC | 
 | 	sltu	CC,R4,CC | 
 | 	 mfhi	H4 | 
 | 	addu	R4,R4,L4 | 
 | 	 subu	P3,P3,4 | 
 | 	sltu	L4,R4,L4 | 
 | 	addu	CC,CC,L4 | 
 | 	addu	CC,H4,CC | 
 |  | 
 | 	subu	R1,P3,4 | 
 | 	sw	R4,-4(P1)	# delay slot | 
 | 	bgez	R1,$lab2 | 
 |  | 
 | 	bleu	P3,0,$lab3 | 
 | 	.align	2 | 
 | $lab33:  | 
 | 	lw	L1,0(P2) | 
 | 	 lw	R1,0(P1) | 
 | 	multu	L1,P4 | 
 | 	 addu	R1,R1,CC | 
 | 	sltu	CC,R1,CC | 
 | 	 addu	P1,P1,4 | 
 | 	mflo	L1 | 
 | 	 mfhi	H1 | 
 | 	addu	R1,R1,L1 | 
 | 	 addu	P2,P2,4 | 
 | 	sltu	L1,R1,L1 | 
 | 	 subu	P3,P3,1 | 
 | 	addu	CC,CC,L1 | 
 | 	 sw	R1,-4(P1) | 
 | 	addu	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:	 | 
 | 	lw	L1,0(P2) | 
 | 	 lw	L2,4(P2) | 
 | 	lw	L3,8(P2) | 
 | 	 lw	L4,12(P2) | 
 | 	multu	L1,P4 | 
 | 	 subu	P3,P3,4 | 
 | 	mflo	L1 | 
 | 	 mfhi	H1 | 
 | 	addu	L1,L1,CC | 
 | 	 multu	L2,P4 | 
 | 	sltu	CC,L1,CC | 
 | 	 sw	L1,0(P1) | 
 | 	addu	CC,H1,CC | 
 | 	 mflo	L2 | 
 | 	mfhi	H2 | 
 | 	 addu	L2,L2,CC | 
 | 	multu	L3,P4 | 
 | 	 sltu	CC,L2,CC | 
 | 	sw	L2,4(P1) | 
 | 	 addu	CC,H2,CC | 
 | 	mflo	L3 | 
 | 	 mfhi	H3 | 
 | 	addu	L3,L3,CC | 
 | 	 multu	L4,P4 | 
 | 	sltu	CC,L3,CC | 
 | 	 sw	L3,8(P1) | 
 | 	addu	CC,H3,CC | 
 | 	 mflo	L4 | 
 | 	mfhi	H4 | 
 | 	 addu	L4,L4,CC | 
 | 	addu	P1,P1,16 | 
 | 	 sltu	CC,L4,CC | 
 | 	addu	P2,P2,16 | 
 | 	 addu	CC,H4,CC | 
 | 	sw	L4,-4(P1) | 
 |  | 
 | 	bgez	P3,$lab44 | 
 | 	b	$lab45 | 
 | $lab46: | 
 | 	lw	L1,0(P2) | 
 | 	 addu	P1,P1,4 | 
 | 	multu	L1,P4 | 
 | 	 addu	P2,P2,4 | 
 | 	mflo	L1 | 
 | 	 mfhi	H1 | 
 | 	addu	L1,L1,CC | 
 | 	 subu	P3,P3,1 | 
 | 	sltu	CC,L1,CC | 
 | 	 sw	L1,-4(P1) | 
 | 	addu	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 | 
 | 	bltz	P3,$lab55 | 
 | $lab54: | 
 | 	lw	L1,0(P2) | 
 | 	 lw	L2,4(P2) | 
 | 	lw	L3,8(P2) | 
 | 	 lw	L4,12(P2) | 
 |  | 
 | 	multu	L1,L1 | 
 | 	 subu	P3,P3,4 | 
 | 	mflo	L1 | 
 | 	 mfhi	H1 | 
 | 	sw	L1,0(P1) | 
 | 	 sw	H1,4(P1) | 
 |  | 
 | 	multu	L2,L2 | 
 | 	 addu	P1,P1,32 | 
 | 	mflo	L2 | 
 | 	 mfhi	H2 | 
 | 	sw	L2,-24(P1) | 
 | 	 sw	H2,-20(P1) | 
 |  | 
 | 	multu	L3,L3 | 
 | 	 addu	P2,P2,16 | 
 | 	mflo	L3 | 
 | 	 mfhi	H3 | 
 | 	sw	L3,-16(P1) | 
 | 	 sw	H3,-12(P1) | 
 |  | 
 | 	multu	L4,L4 | 
 |  | 
 | 	mflo	L4 | 
 | 	 mfhi	H4 | 
 | 	sw	L4,-8(P1) | 
 | 	 sw	H4,-4(P1) | 
 |  | 
 | 	bgtz	P3,$lab54 | 
 | 	b	$lab55 | 
 | $lab56:	 | 
 | 	lw	L1,0(P2) | 
 | 	addu	P1,P1,8 | 
 | 	multu	L1,L1 | 
 | 	addu	P2,P2,4 | 
 | 	subu	P3,P3,1 | 
 | 	mflo	L1 | 
 | 	mfhi	H1 | 
 | 	sw	L1,-8(P1) | 
 | 	sw	H1,-4(P1) | 
 |  | 
 | 	bgtz	P3,$lab56 | 
 | 	j	$31 | 
 | $lab55: | 
 | 	addu	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:	 | 
 | 	lw	L1,0(P2) | 
 | 	lw	R1,0(P3) | 
 | 	lw	L2,4(P2) | 
 | 	lw	R2,4(P3) | 
 |  | 
 | 	addu	L1,L1,CC | 
 | 	 lw	L3,8(P2) | 
 | 	sltu	CC,L1,CC | 
 | 	 addu	L1,L1,R1 | 
 | 	sltu	R1,L1,R1 | 
 | 	 lw	R3,8(P3) | 
 | 	addu	CC,CC,R1 | 
 | 	 lw	L4,12(P2) | 
 |  | 
 | 	addu	L2,L2,CC | 
 | 	 lw	R4,12(P3) | 
 | 	sltu	CC,L2,CC | 
 | 	 addu	L2,L2,R2 | 
 | 	sltu	R2,L2,R2 | 
 | 	 sw	L1,0(P1) | 
 | 	addu	CC,CC,R2 | 
 | 	 addu	P1,P1,16 | 
 | 	addu	L3,L3,CC | 
 | 	 sw	L2,-12(P1) | 
 |   | 
 | 	sltu	CC,L3,CC | 
 | 	 addu	L3,L3,R3 | 
 | 	sltu	R3,L3,R3 | 
 | 	 addu	P2,P2,16 | 
 | 	addu	CC,CC,R3 | 
 |  | 
 | 	addu	L4,L4,CC | 
 | 	 addu	P3,P3,16 | 
 | 	sltu	CC,L4,CC | 
 | 	 addu	L4,L4,R4 | 
 | 	subu	P4,P4,4 | 
 | 	 sltu	R4,L4,R4 | 
 | 	sw	L3,-8(P1) | 
 | 	 addu	CC,CC,R4 | 
 | 	sw	L4,-4(P1) | 
 |  | 
 | 	bgtz	P4,$lab64 | 
 | 	b	$lab65 | 
 | $lab66: | 
 | 	lw	L1,0(P2) | 
 | 	 lw	R1,0(P3) | 
 | 	addu	L1,L1,CC | 
 | 	 addu	P1,P1,4 | 
 | 	sltu	CC,L1,CC | 
 | 	 addu	P2,P2,4 | 
 | 	addu	P3,P3,4 | 
 | 	 addu	L1,L1,R1 | 
 | 	subu	P4,P4,1 | 
 | 	 sltu	R1,L1,R1 | 
 | 	sw	L1,-4(P1) | 
 | 	 addu	CC,CC,R1 | 
 |  | 
 | 	bgtz	P4,$lab66 | 
 | 	j	$31 | 
 | $lab65: | 
 | 	addu	P4,P4,4 | 
 | 	bgtz	P4,$lab66 | 
 | 	j	$31 | 
 | 	.end	bn_add_words | 
 |  | 
 | 	# Program Unit: bn_div64 | 
 | 	.set	at | 
 | 	.set	reorder | 
 | 	.text	 | 
 | 	.align	2 | 
 | 	.globl	bn_div64 | 
 |  # 321		{ | 
 | 	.ent	bn_div64 2 | 
 | bn_div64: | 
 | 	subu	$sp, 64 | 
 | 	sw	$31, 56($sp) | 
 | 	sw	$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 | 
 | 	li	$2, -1 | 
 | 	b	$93 | 
 | $80: | 
 |  # 326	 | 
 |  # 327		i=BN_num_bits_word(d); | 
 | 	move	$4, $16 | 
 | 	sw	$31, 16($sp) | 
 | 	sw	$9, 24($sp) | 
 | 	sw	$12, 32($sp) | 
 | 	sw	$13, 40($sp) | 
 | 	.livereg	0x800ff0e,0xfff | 
 | 	jal	BN_num_bits_word | 
 | 	li	$4, 32 | 
 | 	lw	$31, 16($sp) | 
 | 	lw	$9, 24($sp) | 
 | 	lw	$12, 32($sp) | 
 | 	lw	$13, 40($sp) | 
 | 	move	$3, $2 | 
 |  # 328		if ((i != BN_BITS2) && (h > (BN_ULONG)1<<i)) | 
 | 	beq	$2, $4, $81 | 
 | 	li	$14, 1 | 
 | 	sll	$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(); | 
 | 	sw	$3, 8($sp) | 
 | 	sw	$9, 24($sp) | 
 | 	sw	$12, 32($sp) | 
 | 	sw	$13, 40($sp) | 
 | 	sw	$31, 26($sp) | 
 | 	.livereg	0xff0e,0xfff | 
 | 	jal	abort | 
 | 	lw	$3, 8($sp) | 
 | 	li	$4, 32 | 
 | 	lw	$9, 24($sp) | 
 | 	lw	$12, 32($sp) | 
 | 	lw	$13, 40($sp) | 
 | 	lw	$31, 26($sp) | 
 |  # 334			} | 
 | $81: | 
 |  # 335		i=BN_BITS2-i; | 
 | 	subu	$3, $4, $3 | 
 |  # 336		if (h >= d) h-=d; | 
 | 	bltu	$9, $16, $82 | 
 | 	subu	$9, $9, $16 | 
 | $82: | 
 |  # 337	 | 
 |  # 338		if (i) | 
 | 	beq	$3, 0, $83 | 
 |  # 339			{ | 
 |  # 340			d<<=i; | 
 | 	sll	$16, $16, $3 | 
 |  # 341			h=(h<<i)|(l>>(BN_BITS2-i)); | 
 | 	sll	$24, $9, $3 | 
 | 	subu	$25, $4, $3 | 
 | 	srl	$14, $12, $25 | 
 | 	or	$9, $24, $14 | 
 |  # 342			l<<=i; | 
 | 	sll	$12, $12, $3 | 
 |  # 343			} | 
 | $83: | 
 |  # 344		dh=(d&BN_MASK2h)>>BN_BITS4; | 
 |  # 345		dl=(d&BN_MASK2l); | 
 | 	and	$8, $16, -65536 | 
 | 	srl	$8, $8, 16 | 
 | 	and	$10, $16, 65535 | 
 | 	li	$6, -65536 | 
 | $84: | 
 |  # 346		for (;;) | 
 |  # 347			{ | 
 |  # 348			if ((h>>BN_BITS4) == dh) | 
 | 	srl	$15, $9, 16 | 
 | 	bne	$8, $15, $85 | 
 |  # 349				q=BN_MASK2l; | 
 | 	li	$5, 65535 | 
 | 	b	$86 | 
 | $85: | 
 |  # 350			else | 
 |  # 351				q=h/dh; | 
 | 	divu	$5, $9, $8 | 
 | $86: | 
 |  # 352	 | 
 |  # 353			for (;;) | 
 |  # 354				{ | 
 |  # 355				t=(h-q*dh); | 
 | 	mul	$4, $5, $8 | 
 | 	subu	$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 | 
 | 	mul	$24, $10, $5 | 
 | 	sll	$14, $3, 16 | 
 | 	and	$15, $12, $6 | 
 | 	srl	$25, $15, 16 | 
 | 	addu	$15, $14, $25 | 
 | 	bgtu	$24, $15, $88 | 
 | $87: | 
 |  # 360					break; | 
 | 	mul	$3, $10, $5 | 
 | 	b	$89 | 
 | $88: | 
 |  # 361				q--; | 
 | 	addu	$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; | 
 | 	sll	$14, $3, 16 | 
 | 	and	$2, $14, $6 | 
 | 	move	$11, $2 | 
 |  # 367			th+=t; | 
 | 	srl	$25, $3, 16 | 
 | 	addu	$7, $4, $25 | 
 |  # 368	 | 
 |  # 369			if (l < tl) th++; | 
 | 	bgeu	$12, $2, $90 | 
 | 	addu	$7, $7, 1 | 
 | $90: | 
 |  # 370			l-=tl; | 
 | 	subu	$12, $12, $11 | 
 |  # 371			if (h < th) | 
 | 	bgeu	$9, $7, $91 | 
 |  # 372				{ | 
 |  # 373				h+=d; | 
 | 	addu	$9, $9, $16 | 
 |  # 374				q--; | 
 | 	addu	$5, $5, -1 | 
 |  # 375				} | 
 | $91: | 
 |  # 376			h-=th; | 
 | 	subu	$9, $9, $7 | 
 |  # 377	 | 
 |  # 378			if (--count == 0) break; | 
 | 	addu	$13, $13, -1 | 
 | 	beq	$13, 0, $92 | 
 |  # 379	 | 
 |  # 380			ret=q<<BN_BITS4; | 
 | 	sll	$31, $5, 16 | 
 |  # 381			h=((h<<BN_BITS4)|(l>>BN_BITS4))&BN_MASK2; | 
 | 	sll	$24, $9, 16 | 
 | 	srl	$15, $12, 16 | 
 | 	or	$9, $24, $15 | 
 |  # 382			l=(l&BN_MASK2l)<<BN_BITS4; | 
 | 	and	$12, $12, 65535 | 
 | 	sll	$12, $12, 16 | 
 |  # 383			} | 
 | 	b	$84 | 
 | $92: | 
 |  # 384		ret|=q; | 
 | 	or	$31, $31, $5 | 
 |  # 385		return(ret); | 
 | 	move	$2, $31 | 
 | $93: | 
 | 	lw	$16, 48($sp) | 
 | 	lw	$31, 56($sp) | 
 | 	addu	$sp, 64 | 
 | 	j	$31 | 
 | 	.end	bn_div64 | 
 |  |