xref: /netbsd-src/crypto/external/bsd/openssl/lib/libcrypto/arch/mips/mips-mont.S (revision e0ea3921ea68e51b93ffc215f08ae1647c8e1796)
1*e0ea3921Schristos#include "mips_arch.h"
2*e0ea3921Schristos
376c4f342Schristos.text
476c4f342Schristos
576c4f342Schristos.set	noat
676c4f342Schristos.set	noreorder
776c4f342Schristos
876c4f342Schristos.align	5
976c4f342Schristos.globl	bn_mul_mont
1076c4f342Schristos.ent	bn_mul_mont
1176c4f342Schristosbn_mul_mont:
126410c867Schristos	lw	$8,16($29)
136410c867Schristos	lw	$9,20($29)
1476c4f342Schristos	slt	$1,$9,4
1576c4f342Schristos	bnez	$1,1f
1676c4f342Schristos	li	$2,0
1776c4f342Schristos	slt	$1,$9,17	# on in-order CPU
1876c4f342Schristos	bnez	$1,bn_mul_mont_internal
1976c4f342Schristos	nop
2076c4f342Schristos1:	jr	$31
2176c4f342Schristos	li	$4,0
2276c4f342Schristos.end	bn_mul_mont
2376c4f342Schristos
2476c4f342Schristos.align	5
2576c4f342Schristos.ent	bn_mul_mont_internal
2676c4f342Schristosbn_mul_mont_internal:
2776c4f342Schristos	.frame	$30,14*4,$31
2876c4f342Schristos	.mask	0x40000000|16711680,-4
29*e0ea3921Schristos	subu $29,14*4
3076c4f342Schristos	sw	$30,(14-1)*4($29)
3176c4f342Schristos	sw	$23,(14-2)*4($29)
3276c4f342Schristos	sw	$22,(14-3)*4($29)
3376c4f342Schristos	sw	$21,(14-4)*4($29)
3476c4f342Schristos	sw	$20,(14-5)*4($29)
3576c4f342Schristos	sw	$19,(14-6)*4($29)
3676c4f342Schristos	sw	$18,(14-7)*4($29)
3776c4f342Schristos	sw	$17,(14-8)*4($29)
3876c4f342Schristos	sw	$16,(14-9)*4($29)
3976c4f342Schristos	move	$30,$29
4076c4f342Schristos
4176c4f342Schristos	.set	reorder
4276c4f342Schristos	lw	$8,0($8)
4376c4f342Schristos	lw	$13,0($6)	# bp[0]
4476c4f342Schristos	lw	$12,0($5)	# ap[0]
4576c4f342Schristos	lw	$14,0($7)	# np[0]
4676c4f342Schristos
47*e0ea3921Schristos	subu $29,2*4	# place for two extra words
4876c4f342Schristos	sll	$9,2
4976c4f342Schristos	li	$1,-4096
50*e0ea3921Schristos	subu $29,$9
5176c4f342Schristos	and	$29,$1
5276c4f342Schristos
53*e0ea3921Schristos	multu	($12,$13)
54*e0ea3921Schristos	lw	$17,4($5)
55*e0ea3921Schristos	lw	$19,4($7)
56*e0ea3921Schristos	mflo	($10,$12,$13)
57*e0ea3921Schristos	mfhi	($11,$12,$13)
58*e0ea3921Schristos	multu	($10,$8)
59*e0ea3921Schristos	mflo	($23,$10,$8)
6076c4f342Schristos
61*e0ea3921Schristos	multu	($17,$13)
62*e0ea3921Schristos	mflo	($16,$17,$13)
63*e0ea3921Schristos	mfhi	($17,$17,$13)
6476c4f342Schristos
65*e0ea3921Schristos	multu	($14,$23)
66*e0ea3921Schristos	mflo	($24,$14,$23)
67*e0ea3921Schristos	mfhi	($25,$14,$23)
68*e0ea3921Schristos	multu	($19,$23)
6976c4f342Schristos	addu	$24,$10
7076c4f342Schristos	sltu	$1,$24,$10
7176c4f342Schristos	addu	$25,$1
72*e0ea3921Schristos	mflo	($18,$19,$23)
73*e0ea3921Schristos	mfhi	($19,$19,$23)
7476c4f342Schristos
7576c4f342Schristos	move	$15,$29
7676c4f342Schristos	li	$22,2*4
7776c4f342Schristos.align	4
7876c4f342Schristos.L1st:
7976c4f342Schristos	.set	noreorder
80*e0ea3921Schristos	addu $12,$5,$22
81*e0ea3921Schristos	addu $14,$7,$22
8276c4f342Schristos	lw	$12,($12)
8376c4f342Schristos	lw	$14,($14)
8476c4f342Schristos
85*e0ea3921Schristos	multu	($12,$13)
8676c4f342Schristos	addu	$10,$16,$11
8776c4f342Schristos	addu	$24,$18,$25
8876c4f342Schristos	sltu	$1,$10,$11
8976c4f342Schristos	sltu	$2,$24,$25
9076c4f342Schristos	addu	$11,$17,$1
9176c4f342Schristos	addu	$25,$19,$2
92*e0ea3921Schristos	mflo	($16,$12,$13)
93*e0ea3921Schristos	mfhi	($17,$12,$13)
9476c4f342Schristos
9576c4f342Schristos	addu	$24,$10
9676c4f342Schristos	sltu	$1,$24,$10
97*e0ea3921Schristos	multu	($14,$23)
9876c4f342Schristos	addu	$25,$1
9976c4f342Schristos	addu	$22,4
10076c4f342Schristos	sw	$24,($15)
10176c4f342Schristos	sltu	$2,$22,$9
102*e0ea3921Schristos	mflo	($18,$14,$23)
103*e0ea3921Schristos	mfhi	($19,$14,$23)
10476c4f342Schristos
10576c4f342Schristos	bnez	$2,.L1st
106*e0ea3921Schristos	addu $15,4
10776c4f342Schristos	.set	reorder
10876c4f342Schristos
10976c4f342Schristos	addu	$10,$16,$11
11076c4f342Schristos	sltu	$1,$10,$11
11176c4f342Schristos	addu	$11,$17,$1
11276c4f342Schristos
11376c4f342Schristos	addu	$24,$18,$25
11476c4f342Schristos	sltu	$2,$24,$25
11576c4f342Schristos	addu	$25,$19,$2
11676c4f342Schristos	addu	$24,$10
11776c4f342Schristos	sltu	$1,$24,$10
11876c4f342Schristos	addu	$25,$1
11976c4f342Schristos
12076c4f342Schristos	sw	$24,($15)
12176c4f342Schristos
12276c4f342Schristos	addu	$25,$11
12376c4f342Schristos	sltu	$1,$25,$11
12476c4f342Schristos	sw	$25,4($15)
12576c4f342Schristos	sw	$1,2*4($15)
12676c4f342Schristos
12776c4f342Schristos	li	$21,4
12876c4f342Schristos.align	4
12976c4f342Schristos.Louter:
130*e0ea3921Schristos	addu $13,$6,$21
13176c4f342Schristos	lw	$13,($13)
13276c4f342Schristos	lw	$12,($5)
133*e0ea3921Schristos	lw	$17,4($5)
13476c4f342Schristos	lw	$20,($29)
13576c4f342Schristos
136*e0ea3921Schristos	multu	($12,$13)
13776c4f342Schristos	lw	$14,($7)
138*e0ea3921Schristos	lw	$19,4($7)
139*e0ea3921Schristos	mflo	($10,$12,$13)
140*e0ea3921Schristos	mfhi	($11,$12,$13)
14176c4f342Schristos	addu	$10,$20
142*e0ea3921Schristos	multu	($10,$8)
14376c4f342Schristos	sltu	$1,$10,$20
14476c4f342Schristos	addu	$11,$1
145*e0ea3921Schristos	mflo	($23,$10,$8)
14676c4f342Schristos
147*e0ea3921Schristos	multu	($17,$13)
148*e0ea3921Schristos	mflo	($16,$17,$13)
149*e0ea3921Schristos	mfhi	($17,$17,$13)
15076c4f342Schristos
151*e0ea3921Schristos	multu	($14,$23)
152*e0ea3921Schristos	mflo	($24,$14,$23)
153*e0ea3921Schristos	mfhi	($25,$14,$23)
15476c4f342Schristos
155*e0ea3921Schristos	multu	($19,$23)
15676c4f342Schristos	addu	$24,$10
15776c4f342Schristos	sltu	$1,$24,$10
15876c4f342Schristos	addu	$25,$1
159*e0ea3921Schristos	mflo	($18,$19,$23)
160*e0ea3921Schristos	mfhi	($19,$19,$23)
16176c4f342Schristos
16276c4f342Schristos	move	$15,$29
16376c4f342Schristos	li	$22,2*4
16476c4f342Schristos	lw	$20,4($15)
16576c4f342Schristos.align	4
16676c4f342Schristos.Linner:
16776c4f342Schristos	.set	noreorder
168*e0ea3921Schristos	addu $12,$5,$22
169*e0ea3921Schristos	addu $14,$7,$22
17076c4f342Schristos	lw	$12,($12)
17176c4f342Schristos	lw	$14,($14)
17276c4f342Schristos
173*e0ea3921Schristos	multu	($12,$13)
17476c4f342Schristos	addu	$10,$16,$11
17576c4f342Schristos	addu	$24,$18,$25
17676c4f342Schristos	sltu	$1,$10,$11
17776c4f342Schristos	sltu	$2,$24,$25
17876c4f342Schristos	addu	$11,$17,$1
17976c4f342Schristos	addu	$25,$19,$2
180*e0ea3921Schristos	mflo	($16,$12,$13)
181*e0ea3921Schristos	mfhi	($17,$12,$13)
18276c4f342Schristos
18376c4f342Schristos	addu	$10,$20
18476c4f342Schristos	addu	$22,4
185*e0ea3921Schristos	multu	($14,$23)
18676c4f342Schristos	sltu	$1,$10,$20
18776c4f342Schristos	addu	$24,$10
18876c4f342Schristos	addu	$11,$1
18976c4f342Schristos	sltu	$2,$24,$10
19076c4f342Schristos	lw	$20,2*4($15)
19176c4f342Schristos	addu	$25,$2
19276c4f342Schristos	sltu	$1,$22,$9
193*e0ea3921Schristos	mflo	($18,$14,$23)
194*e0ea3921Schristos	mfhi	($19,$14,$23)
19576c4f342Schristos	sw	$24,($15)
19676c4f342Schristos	bnez	$1,.Linner
197*e0ea3921Schristos	addu $15,4
19876c4f342Schristos	.set	reorder
19976c4f342Schristos
20076c4f342Schristos	addu	$10,$16,$11
20176c4f342Schristos	sltu	$1,$10,$11
20276c4f342Schristos	addu	$11,$17,$1
20376c4f342Schristos	addu	$10,$20
20476c4f342Schristos	sltu	$2,$10,$20
20576c4f342Schristos	addu	$11,$2
20676c4f342Schristos
20776c4f342Schristos	lw	$20,2*4($15)
20876c4f342Schristos	addu	$24,$18,$25
20976c4f342Schristos	sltu	$1,$24,$25
21076c4f342Schristos	addu	$25,$19,$1
21176c4f342Schristos	addu	$24,$10
21276c4f342Schristos	sltu	$2,$24,$10
21376c4f342Schristos	addu	$25,$2
21476c4f342Schristos	sw	$24,($15)
21576c4f342Schristos
21676c4f342Schristos	addu	$24,$25,$11
21776c4f342Schristos	sltu	$25,$24,$11
21876c4f342Schristos	addu	$24,$20
21976c4f342Schristos	sltu	$1,$24,$20
22076c4f342Schristos	addu	$25,$1
22176c4f342Schristos	sw	$24,4($15)
22276c4f342Schristos	sw	$25,2*4($15)
22376c4f342Schristos
22476c4f342Schristos	addu	$21,4
22576c4f342Schristos	sltu	$2,$21,$9
22676c4f342Schristos	bnez	$2,.Louter
22776c4f342Schristos
22876c4f342Schristos	.set	noreorder
229*e0ea3921Schristos	addu $20,$29,$9	# &tp[num]
23076c4f342Schristos	move	$15,$29
23176c4f342Schristos	move	$5,$29
23276c4f342Schristos	li	$11,0		# clear borrow bit
23376c4f342Schristos
23476c4f342Schristos.align	4
23576c4f342Schristos.Lsub:	lw	$10,($15)
23676c4f342Schristos	lw	$24,($7)
237*e0ea3921Schristos	addu $15,4
238*e0ea3921Schristos	addu $7,4
23976c4f342Schristos	subu	$24,$10,$24	# tp[i]-np[i]
24076c4f342Schristos	sgtu	$1,$24,$10
24176c4f342Schristos	subu	$10,$24,$11
24276c4f342Schristos	sgtu	$11,$10,$24
24376c4f342Schristos	sw	$10,($4)
24476c4f342Schristos	or	$11,$1
24576c4f342Schristos	sltu	$1,$15,$20
24676c4f342Schristos	bnez	$1,.Lsub
247*e0ea3921Schristos	addu $4,4
24876c4f342Schristos
24976c4f342Schristos	subu	$11,$25,$11	# handle upmost overflow bit
25076c4f342Schristos	move	$15,$29
251*e0ea3921Schristos	subu $4,$9	# restore rp
25276c4f342Schristos	not	$25,$11
25376c4f342Schristos
254*e0ea3921Schristos.Lcopy:	lw	$14,($15)	# conditional move
255*e0ea3921Schristos	lw	$12,($4)
25676c4f342Schristos	sw	$0,($15)
257*e0ea3921Schristos	addu $15,4
258*e0ea3921Schristos	and	$14,$11
259*e0ea3921Schristos	and	$12,$25
260*e0ea3921Schristos	or	$12,$14
26176c4f342Schristos	sltu	$1,$15,$20
26276c4f342Schristos	sw	$12,($4)
26376c4f342Schristos	bnez	$1,.Lcopy
264*e0ea3921Schristos	addu $4,4
26576c4f342Schristos
26676c4f342Schristos	li	$4,1
26776c4f342Schristos	li	$2,1
26876c4f342Schristos
26976c4f342Schristos	.set	noreorder
27076c4f342Schristos	move	$29,$30
27176c4f342Schristos	lw	$30,(14-1)*4($29)
27276c4f342Schristos	lw	$23,(14-2)*4($29)
27376c4f342Schristos	lw	$22,(14-3)*4($29)
27476c4f342Schristos	lw	$21,(14-4)*4($29)
27576c4f342Schristos	lw	$20,(14-5)*4($29)
27676c4f342Schristos	lw	$19,(14-6)*4($29)
27776c4f342Schristos	lw	$18,(14-7)*4($29)
27876c4f342Schristos	lw	$17,(14-8)*4($29)
27976c4f342Schristos	lw	$16,(14-9)*4($29)
28076c4f342Schristos	jr	$31
281*e0ea3921Schristos	addu $29,14*4
28276c4f342Schristos.end	bn_mul_mont_internal
28376c4f342Schristos.rdata
28476c4f342Schristos.asciiz	"Montgomery Multiplication for MIPS, CRYPTOGAMS by <appro@openssl.org>"
285