1289848Sjkim.rdata
2289848Sjkim.asciiz	"mips3.s, Version 1.1"
3289848Sjkim.asciiz	"MIPS III/IV ISA artwork by Andy Polyakov <appro@fy.chalmers.se>"
4289848Sjkim
5289848Sjkim/*
6289848Sjkim * ====================================================================
7289848Sjkim * Written by Andy Polyakov <appro@fy.chalmers.se> for the OpenSSL
8289848Sjkim * project.
9289848Sjkim *
10289848Sjkim * Rights for redistribution and usage in source and binary forms are
11289848Sjkim * granted according to the OpenSSL license. Warranty of any kind is
12289848Sjkim * disclaimed.
13289848Sjkim * ====================================================================
14289848Sjkim */
15289848Sjkim
16289848Sjkim/*
17289848Sjkim * This is my modest contributon to the OpenSSL project (see
18289848Sjkim * http://www.openssl.org/ for more information about it) and is
19289848Sjkim * a drop-in MIPS III/IV ISA replacement for crypto/bn/bn_asm.c
20289848Sjkim * module. For updates see http://fy.chalmers.se/~appro/hpe/.
21289848Sjkim *
22289848Sjkim * The module is designed to work with either of the "new" MIPS ABI(5),
23289848Sjkim * namely N32 or N64, offered by IRIX 6.x. It's not ment to work under
24289848Sjkim * IRIX 5.x not only because it doesn't support new ABIs but also
25289848Sjkim * because 5.x kernels put R4x00 CPU into 32-bit mode and all those
26289848Sjkim * 64-bit instructions (daddu, dmultu, etc.) found below gonna only
27289848Sjkim * cause illegal instruction exception:-(
28289848Sjkim *
29289848Sjkim * In addition the code depends on preprocessor flags set up by MIPSpro
30289848Sjkim * compiler driver (either as or cc) and therefore (probably?) can't be
31289848Sjkim * compiled by the GNU assembler. GNU C driver manages fine though...
32289848Sjkim * I mean as long as -mmips-as is specified or is the default option,
33289848Sjkim * because then it simply invokes /usr/bin/as which in turn takes
34289848Sjkim * perfect care of the preprocessor definitions. Another neat feature
35289848Sjkim * offered by the MIPSpro assembler is an optimization pass. This gave
36289848Sjkim * me the opportunity to have the code looking more regular as all those
37289848Sjkim * architecture dependent instruction rescheduling details were left to
38289848Sjkim * the assembler. Cool, huh?
39289848Sjkim *
40289848Sjkim * Performance improvement is astonishing! 'apps/openssl speed rsa dsa'
41289848Sjkim * goes way over 3 times faster!
42289848Sjkim *
43289848Sjkim *					<appro@fy.chalmers.se>
44289848Sjkim */
45289848Sjkim#include <asm.h>
46289848Sjkim#include <regdef.h>
47289848Sjkim
48289848Sjkim#if _MIPS_ISA>=4
49289848Sjkim#define	MOVNZ(cond,dst,src)	\
50289848Sjkim	movn	dst,src,cond
51289848Sjkim#else
52289848Sjkim#define	MOVNZ(cond,dst,src)	\
53289848Sjkim	.set	noreorder;	\
54289848Sjkim	bnezl	cond,.+8;	\
55289848Sjkim	move	dst,src;	\
56289848Sjkim	.set	reorder
57289848Sjkim#endif
58289848Sjkim
59289848Sjkim.text
60289848Sjkim
61289848Sjkim.set	noat
62289848Sjkim.set	reorder
63289848Sjkim
64289848Sjkim#define	MINUS4	v1
65289848Sjkim
66289848Sjkim.align	5
67289848SjkimLEAF(bn_mul_add_words)
68289848Sjkim	.set	noreorder
69289848Sjkim	bgtzl	a2,.L_bn_mul_add_words_proceed
70289848Sjkim	ld	t0,0(a1)
71289848Sjkim	jr	ra
72289848Sjkim	move	v0,zero
73289848Sjkim	.set	reorder
74289848Sjkim
75289848Sjkim.L_bn_mul_add_words_proceed:
76289848Sjkim	li	MINUS4,-4
77289848Sjkim	and	ta0,a2,MINUS4
78289848Sjkim	move	v0,zero
79289848Sjkim	beqz	ta0,.L_bn_mul_add_words_tail
80289848Sjkim
81289848Sjkim.L_bn_mul_add_words_loop:
82289848Sjkim	dmultu	t0,a3
83289848Sjkim	ld	t1,0(a0)
84289848Sjkim	ld	t2,8(a1)
85289848Sjkim	ld	t3,8(a0)
86289848Sjkim	ld	ta0,16(a1)
87289848Sjkim	ld	ta1,16(a0)
88289848Sjkim	daddu	t1,v0
89289848Sjkim	sltu	v0,t1,v0	/* All manuals say it "compares 32-bit
90289848Sjkim				 * values", but it seems to work fine
91289848Sjkim				 * even on 64-bit registers. */
92289848Sjkim	mflo	AT
93289848Sjkim	mfhi	t0
94289848Sjkim	daddu	t1,AT
95289848Sjkim	daddu	v0,t0
96289848Sjkim	sltu	AT,t1,AT
97289848Sjkim	sd	t1,0(a0)
98289848Sjkim	daddu	v0,AT
99289848Sjkim
100289848Sjkim	dmultu	t2,a3
101289848Sjkim	ld	ta2,24(a1)
102289848Sjkim	ld	ta3,24(a0)
103289848Sjkim	daddu	t3,v0
104289848Sjkim	sltu	v0,t3,v0
105289848Sjkim	mflo	AT
106289848Sjkim	mfhi	t2
107289848Sjkim	daddu	t3,AT
108289848Sjkim	daddu	v0,t2
109289848Sjkim	sltu	AT,t3,AT
110289848Sjkim	sd	t3,8(a0)
111289848Sjkim	daddu	v0,AT
112289848Sjkim
113289848Sjkim	dmultu	ta0,a3
114289848Sjkim	subu	a2,4
115289848Sjkim	PTR_ADD	a0,32
116289848Sjkim	PTR_ADD	a1,32
117289848Sjkim	daddu	ta1,v0
118289848Sjkim	sltu	v0,ta1,v0
119289848Sjkim	mflo	AT
120289848Sjkim	mfhi	ta0
121289848Sjkim	daddu	ta1,AT
122289848Sjkim	daddu	v0,ta0
123289848Sjkim	sltu	AT,ta1,AT
124289848Sjkim	sd	ta1,-16(a0)
125289848Sjkim	daddu	v0,AT
126289848Sjkim
127289848Sjkim
128289848Sjkim	dmultu	ta2,a3
129289848Sjkim	and	ta0,a2,MINUS4
130289848Sjkim	daddu	ta3,v0
131289848Sjkim	sltu	v0,ta3,v0
132289848Sjkim	mflo	AT
133289848Sjkim	mfhi	ta2
134289848Sjkim	daddu	ta3,AT
135289848Sjkim	daddu	v0,ta2
136289848Sjkim	sltu	AT,ta3,AT
137289848Sjkim	sd	ta3,-8(a0)
138289848Sjkim	daddu	v0,AT
139289848Sjkim	.set	noreorder
140289848Sjkim	bgtzl	ta0,.L_bn_mul_add_words_loop
141289848Sjkim	ld	t0,0(a1)
142289848Sjkim
143289848Sjkim	bnezl	a2,.L_bn_mul_add_words_tail
144289848Sjkim	ld	t0,0(a1)
145289848Sjkim	.set	reorder
146289848Sjkim
147289848Sjkim.L_bn_mul_add_words_return:
148289848Sjkim	jr	ra
149289848Sjkim
150289848Sjkim.L_bn_mul_add_words_tail:
151289848Sjkim	dmultu	t0,a3
152289848Sjkim	ld	t1,0(a0)
153289848Sjkim	subu	a2,1
154289848Sjkim	daddu	t1,v0
155289848Sjkim	sltu	v0,t1,v0
156289848Sjkim	mflo	AT
157289848Sjkim	mfhi	t0
158289848Sjkim	daddu	t1,AT
159289848Sjkim	daddu	v0,t0
160289848Sjkim	sltu	AT,t1,AT
161289848Sjkim	sd	t1,0(a0)
162289848Sjkim	daddu	v0,AT
163289848Sjkim	beqz	a2,.L_bn_mul_add_words_return
164289848Sjkim
165289848Sjkim	ld	t0,8(a1)
166289848Sjkim	dmultu	t0,a3
167289848Sjkim	ld	t1,8(a0)
168289848Sjkim	subu	a2,1
169289848Sjkim	daddu	t1,v0
170289848Sjkim	sltu	v0,t1,v0
171289848Sjkim	mflo	AT
172289848Sjkim	mfhi	t0
173289848Sjkim	daddu	t1,AT
174289848Sjkim	daddu	v0,t0
175289848Sjkim	sltu	AT,t1,AT
176289848Sjkim	sd	t1,8(a0)
177289848Sjkim	daddu	v0,AT
178289848Sjkim	beqz	a2,.L_bn_mul_add_words_return
179289848Sjkim
180289848Sjkim	ld	t0,16(a1)
181289848Sjkim	dmultu	t0,a3
182289848Sjkim	ld	t1,16(a0)
183289848Sjkim	daddu	t1,v0
184289848Sjkim	sltu	v0,t1,v0
185289848Sjkim	mflo	AT
186289848Sjkim	mfhi	t0
187289848Sjkim	daddu	t1,AT
188289848Sjkim	daddu	v0,t0
189289848Sjkim	sltu	AT,t1,AT
190289848Sjkim	sd	t1,16(a0)
191289848Sjkim	daddu	v0,AT
192289848Sjkim	jr	ra
193289848SjkimEND(bn_mul_add_words)
194289848Sjkim
195289848Sjkim.align	5
196289848SjkimLEAF(bn_mul_words)
197289848Sjkim	.set	noreorder
198289848Sjkim	bgtzl	a2,.L_bn_mul_words_proceed
199289848Sjkim	ld	t0,0(a1)
200289848Sjkim	jr	ra
201289848Sjkim	move	v0,zero
202289848Sjkim	.set	reorder
203289848Sjkim
204289848Sjkim.L_bn_mul_words_proceed:
205289848Sjkim	li	MINUS4,-4
206289848Sjkim	and	ta0,a2,MINUS4
207289848Sjkim	move	v0,zero
208289848Sjkim	beqz	ta0,.L_bn_mul_words_tail
209289848Sjkim
210289848Sjkim.L_bn_mul_words_loop:
211289848Sjkim	dmultu	t0,a3
212289848Sjkim	ld	t2,8(a1)
213289848Sjkim	ld	ta0,16(a1)
214289848Sjkim	ld	ta2,24(a1)
215289848Sjkim	mflo	AT
216289848Sjkim	mfhi	t0
217289848Sjkim	daddu	v0,AT
218289848Sjkim	sltu	t1,v0,AT
219289848Sjkim	sd	v0,0(a0)
220289848Sjkim	daddu	v0,t1,t0
221289848Sjkim
222289848Sjkim	dmultu	t2,a3
223289848Sjkim	subu	a2,4
224289848Sjkim	PTR_ADD	a0,32
225289848Sjkim	PTR_ADD	a1,32
226289848Sjkim	mflo	AT
227289848Sjkim	mfhi	t2
228289848Sjkim	daddu	v0,AT
229289848Sjkim	sltu	t3,v0,AT
230289848Sjkim	sd	v0,-24(a0)
231289848Sjkim	daddu	v0,t3,t2
232289848Sjkim
233289848Sjkim	dmultu	ta0,a3
234289848Sjkim	mflo	AT
235289848Sjkim	mfhi	ta0
236289848Sjkim	daddu	v0,AT
237289848Sjkim	sltu	ta1,v0,AT
238289848Sjkim	sd	v0,-16(a0)
239289848Sjkim	daddu	v0,ta1,ta0
240289848Sjkim
241289848Sjkim
242289848Sjkim	dmultu	ta2,a3
243289848Sjkim	and	ta0,a2,MINUS4
244289848Sjkim	mflo	AT
245289848Sjkim	mfhi	ta2
246289848Sjkim	daddu	v0,AT
247289848Sjkim	sltu	ta3,v0,AT
248289848Sjkim	sd	v0,-8(a0)
249289848Sjkim	daddu	v0,ta3,ta2
250289848Sjkim	.set	noreorder
251289848Sjkim	bgtzl	ta0,.L_bn_mul_words_loop
252289848Sjkim	ld	t0,0(a1)
253289848Sjkim
254289848Sjkim	bnezl	a2,.L_bn_mul_words_tail
255289848Sjkim	ld	t0,0(a1)
256289848Sjkim	.set	reorder
257289848Sjkim
258289848Sjkim.L_bn_mul_words_return:
259289848Sjkim	jr	ra
260289848Sjkim
261289848Sjkim.L_bn_mul_words_tail:
262289848Sjkim	dmultu	t0,a3
263289848Sjkim	subu	a2,1
264289848Sjkim	mflo	AT
265289848Sjkim	mfhi	t0
266289848Sjkim	daddu	v0,AT
267289848Sjkim	sltu	t1,v0,AT
268289848Sjkim	sd	v0,0(a0)
269289848Sjkim	daddu	v0,t1,t0
270289848Sjkim	beqz	a2,.L_bn_mul_words_return
271289848Sjkim
272289848Sjkim	ld	t0,8(a1)
273289848Sjkim	dmultu	t0,a3
274289848Sjkim	subu	a2,1
275289848Sjkim	mflo	AT
276289848Sjkim	mfhi	t0
277289848Sjkim	daddu	v0,AT
278289848Sjkim	sltu	t1,v0,AT
279289848Sjkim	sd	v0,8(a0)
280289848Sjkim	daddu	v0,t1,t0
281289848Sjkim	beqz	a2,.L_bn_mul_words_return
282289848Sjkim
283289848Sjkim	ld	t0,16(a1)
284289848Sjkim	dmultu	t0,a3
285289848Sjkim	mflo	AT
286289848Sjkim	mfhi	t0
287289848Sjkim	daddu	v0,AT
288289848Sjkim	sltu	t1,v0,AT
289289848Sjkim	sd	v0,16(a0)
290289848Sjkim	daddu	v0,t1,t0
291289848Sjkim	jr	ra
292289848SjkimEND(bn_mul_words)
293289848Sjkim
294289848Sjkim.align	5
295289848SjkimLEAF(bn_sqr_words)
296289848Sjkim	.set	noreorder
297289848Sjkim	bgtzl	a2,.L_bn_sqr_words_proceed
298289848Sjkim	ld	t0,0(a1)
299289848Sjkim	jr	ra
300289848Sjkim	move	v0,zero
301289848Sjkim	.set	reorder
302289848Sjkim
303289848Sjkim.L_bn_sqr_words_proceed:
304289848Sjkim	li	MINUS4,-4
305289848Sjkim	and	ta0,a2,MINUS4
306289848Sjkim	move	v0,zero
307289848Sjkim	beqz	ta0,.L_bn_sqr_words_tail
308289848Sjkim
309289848Sjkim.L_bn_sqr_words_loop:
310289848Sjkim	dmultu	t0,t0
311289848Sjkim	ld	t2,8(a1)
312289848Sjkim	ld	ta0,16(a1)
313289848Sjkim	ld	ta2,24(a1)
314289848Sjkim	mflo	t1
315289848Sjkim	mfhi	t0
316289848Sjkim	sd	t1,0(a0)
317289848Sjkim	sd	t0,8(a0)
318289848Sjkim
319289848Sjkim	dmultu	t2,t2
320289848Sjkim	subu	a2,4
321289848Sjkim	PTR_ADD	a0,64
322289848Sjkim	PTR_ADD	a1,32
323289848Sjkim	mflo	t3
324289848Sjkim	mfhi	t2
325289848Sjkim	sd	t3,-48(a0)
326289848Sjkim	sd	t2,-40(a0)
327289848Sjkim
328289848Sjkim	dmultu	ta0,ta0
329289848Sjkim	mflo	ta1
330289848Sjkim	mfhi	ta0
331289848Sjkim	sd	ta1,-32(a0)
332289848Sjkim	sd	ta0,-24(a0)
333289848Sjkim
334289848Sjkim
335289848Sjkim	dmultu	ta2,ta2
336289848Sjkim	and	ta0,a2,MINUS4
337289848Sjkim	mflo	ta3
338289848Sjkim	mfhi	ta2
339289848Sjkim	sd	ta3,-16(a0)
340289848Sjkim	sd	ta2,-8(a0)
341289848Sjkim
342289848Sjkim	.set	noreorder
343289848Sjkim	bgtzl	ta0,.L_bn_sqr_words_loop
344289848Sjkim	ld	t0,0(a1)
345289848Sjkim
346289848Sjkim	bnezl	a2,.L_bn_sqr_words_tail
347289848Sjkim	ld	t0,0(a1)
348289848Sjkim	.set	reorder
349289848Sjkim
350289848Sjkim.L_bn_sqr_words_return:
351289848Sjkim	move	v0,zero
352289848Sjkim	jr	ra
353289848Sjkim
354289848Sjkim.L_bn_sqr_words_tail:
355289848Sjkim	dmultu	t0,t0
356289848Sjkim	subu	a2,1
357289848Sjkim	mflo	t1
358289848Sjkim	mfhi	t0
359289848Sjkim	sd	t1,0(a0)
360289848Sjkim	sd	t0,8(a0)
361289848Sjkim	beqz	a2,.L_bn_sqr_words_return
362289848Sjkim
363289848Sjkim	ld	t0,8(a1)
364289848Sjkim	dmultu	t0,t0
365289848Sjkim	subu	a2,1
366289848Sjkim	mflo	t1
367289848Sjkim	mfhi	t0
368289848Sjkim	sd	t1,16(a0)
369289848Sjkim	sd	t0,24(a0)
370289848Sjkim	beqz	a2,.L_bn_sqr_words_return
371289848Sjkim
372289848Sjkim	ld	t0,16(a1)
373289848Sjkim	dmultu	t0,t0
374289848Sjkim	mflo	t1
375289848Sjkim	mfhi	t0
376289848Sjkim	sd	t1,32(a0)
377289848Sjkim	sd	t0,40(a0)
378289848Sjkim	jr	ra
379289848SjkimEND(bn_sqr_words)
380289848Sjkim
381289848Sjkim.align	5
382289848SjkimLEAF(bn_add_words)
383289848Sjkim	.set	noreorder
384289848Sjkim	bgtzl	a3,.L_bn_add_words_proceed
385289848Sjkim	ld	t0,0(a1)
386289848Sjkim	jr	ra
387289848Sjkim	move	v0,zero
388289848Sjkim	.set	reorder
389289848Sjkim
390289848Sjkim.L_bn_add_words_proceed:
391289848Sjkim	li	MINUS4,-4
392289848Sjkim	and	AT,a3,MINUS4
393289848Sjkim	move	v0,zero
394289848Sjkim	beqz	AT,.L_bn_add_words_tail
395289848Sjkim
396289848Sjkim.L_bn_add_words_loop:
397289848Sjkim	ld	ta0,0(a2)
398289848Sjkim	subu	a3,4
399289848Sjkim	ld	t1,8(a1)
400289848Sjkim	and	AT,a3,MINUS4
401289848Sjkim	ld	t2,16(a1)
402289848Sjkim	PTR_ADD	a2,32
403289848Sjkim	ld	t3,24(a1)
404289848Sjkim	PTR_ADD	a0,32
405289848Sjkim	ld	ta1,-24(a2)
406289848Sjkim	PTR_ADD	a1,32
407289848Sjkim	ld	ta2,-16(a2)
408289848Sjkim	ld	ta3,-8(a2)
409289848Sjkim	daddu	ta0,t0
410289848Sjkim	sltu	t8,ta0,t0
411289848Sjkim	daddu	t0,ta0,v0
412289848Sjkim	sltu	v0,t0,ta0
413289848Sjkim	sd	t0,-32(a0)
414289848Sjkim	daddu	v0,t8
415289848Sjkim
416289848Sjkim	daddu	ta1,t1
417289848Sjkim	sltu	t9,ta1,t1
418289848Sjkim	daddu	t1,ta1,v0
419289848Sjkim	sltu	v0,t1,ta1
420289848Sjkim	sd	t1,-24(a0)
421289848Sjkim	daddu	v0,t9
422289848Sjkim
423289848Sjkim	daddu	ta2,t2
424289848Sjkim	sltu	t8,ta2,t2
425289848Sjkim	daddu	t2,ta2,v0
426289848Sjkim	sltu	v0,t2,ta2
427289848Sjkim	sd	t2,-16(a0)
428289848Sjkim	daddu	v0,t8
429289848Sjkim
430289848Sjkim	daddu	ta3,t3
431289848Sjkim	sltu	t9,ta3,t3
432289848Sjkim	daddu	t3,ta3,v0
433289848Sjkim	sltu	v0,t3,ta3
434289848Sjkim	sd	t3,-8(a0)
435289848Sjkim	daddu	v0,t9
436289848Sjkim
437289848Sjkim	.set	noreorder
438289848Sjkim	bgtzl	AT,.L_bn_add_words_loop
439289848Sjkim	ld	t0,0(a1)
440289848Sjkim
441289848Sjkim	bnezl	a3,.L_bn_add_words_tail
442289848Sjkim	ld	t0,0(a1)
443289848Sjkim	.set	reorder
444289848Sjkim
445289848Sjkim.L_bn_add_words_return:
446289848Sjkim	jr	ra
447289848Sjkim
448289848Sjkim.L_bn_add_words_tail:
449289848Sjkim	ld	ta0,0(a2)
450289848Sjkim	daddu	ta0,t0
451289848Sjkim	subu	a3,1
452289848Sjkim	sltu	t8,ta0,t0
453289848Sjkim	daddu	t0,ta0,v0
454289848Sjkim	sltu	v0,t0,ta0
455289848Sjkim	sd	t0,0(a0)
456289848Sjkim	daddu	v0,t8
457289848Sjkim	beqz	a3,.L_bn_add_words_return
458289848Sjkim
459289848Sjkim	ld	t1,8(a1)
460289848Sjkim	ld	ta1,8(a2)
461289848Sjkim	daddu	ta1,t1
462289848Sjkim	subu	a3,1
463289848Sjkim	sltu	t9,ta1,t1
464289848Sjkim	daddu	t1,ta1,v0
465289848Sjkim	sltu	v0,t1,ta1
466289848Sjkim	sd	t1,8(a0)
467289848Sjkim	daddu	v0,t9
468289848Sjkim	beqz	a3,.L_bn_add_words_return
469289848Sjkim
470289848Sjkim	ld	t2,16(a1)
471289848Sjkim	ld	ta2,16(a2)
472289848Sjkim	daddu	ta2,t2
473289848Sjkim	sltu	t8,ta2,t2
474289848Sjkim	daddu	t2,ta2,v0
475289848Sjkim	sltu	v0,t2,ta2
476289848Sjkim	sd	t2,16(a0)
477289848Sjkim	daddu	v0,t8
478289848Sjkim	jr	ra
479289848SjkimEND(bn_add_words)
480289848Sjkim
481289848Sjkim.align	5
482289848SjkimLEAF(bn_sub_words)
483289848Sjkim	.set	noreorder
484289848Sjkim	bgtzl	a3,.L_bn_sub_words_proceed
485289848Sjkim	ld	t0,0(a1)
486289848Sjkim	jr	ra
487289848Sjkim	move	v0,zero
488289848Sjkim	.set	reorder
489289848Sjkim
490289848Sjkim.L_bn_sub_words_proceed:
491289848Sjkim	li	MINUS4,-4
492289848Sjkim	and	AT,a3,MINUS4
493289848Sjkim	move	v0,zero
494289848Sjkim	beqz	AT,.L_bn_sub_words_tail
495289848Sjkim
496289848Sjkim.L_bn_sub_words_loop:
497289848Sjkim	ld	ta0,0(a2)
498289848Sjkim	subu	a3,4
499289848Sjkim	ld	t1,8(a1)
500289848Sjkim	and	AT,a3,MINUS4
501289848Sjkim	ld	t2,16(a1)
502289848Sjkim	PTR_ADD	a2,32
503289848Sjkim	ld	t3,24(a1)
504289848Sjkim	PTR_ADD	a0,32
505289848Sjkim	ld	ta1,-24(a2)
506289848Sjkim	PTR_ADD	a1,32
507289848Sjkim	ld	ta2,-16(a2)
508289848Sjkim	ld	ta3,-8(a2)
509289848Sjkim	sltu	t8,t0,ta0
510289848Sjkim	dsubu	t0,ta0
511289848Sjkim	dsubu	ta0,t0,v0
512289848Sjkim	sd	ta0,-32(a0)
513289848Sjkim	MOVNZ	(t0,v0,t8)
514289848Sjkim
515289848Sjkim	sltu	t9,t1,ta1
516289848Sjkim	dsubu	t1,ta1
517289848Sjkim	dsubu	ta1,t1,v0
518289848Sjkim	sd	ta1,-24(a0)
519289848Sjkim	MOVNZ	(t1,v0,t9)
520289848Sjkim
521289848Sjkim
522289848Sjkim	sltu	t8,t2,ta2
523289848Sjkim	dsubu	t2,ta2
524289848Sjkim	dsubu	ta2,t2,v0
525289848Sjkim	sd	ta2,-16(a0)
526289848Sjkim	MOVNZ	(t2,v0,t8)
527289848Sjkim
528289848Sjkim	sltu	t9,t3,ta3
529289848Sjkim	dsubu	t3,ta3
530289848Sjkim	dsubu	ta3,t3,v0
531289848Sjkim	sd	ta3,-8(a0)
532289848Sjkim	MOVNZ	(t3,v0,t9)
533289848Sjkim
534289848Sjkim	.set	noreorder
535289848Sjkim	bgtzl	AT,.L_bn_sub_words_loop
536289848Sjkim	ld	t0,0(a1)
537289848Sjkim
538289848Sjkim	bnezl	a3,.L_bn_sub_words_tail
539289848Sjkim	ld	t0,0(a1)
540289848Sjkim	.set	reorder
541289848Sjkim
542289848Sjkim.L_bn_sub_words_return:
543289848Sjkim	jr	ra
544289848Sjkim
545289848Sjkim.L_bn_sub_words_tail:
546289848Sjkim	ld	ta0,0(a2)
547289848Sjkim	subu	a3,1
548289848Sjkim	sltu	t8,t0,ta0
549289848Sjkim	dsubu	t0,ta0
550289848Sjkim	dsubu	ta0,t0,v0
551289848Sjkim	MOVNZ	(t0,v0,t8)
552289848Sjkim	sd	ta0,0(a0)
553289848Sjkim	beqz	a3,.L_bn_sub_words_return
554289848Sjkim
555289848Sjkim	ld	t1,8(a1)
556289848Sjkim	subu	a3,1
557289848Sjkim	ld	ta1,8(a2)
558289848Sjkim	sltu	t9,t1,ta1
559289848Sjkim	dsubu	t1,ta1
560289848Sjkim	dsubu	ta1,t1,v0
561289848Sjkim	MOVNZ	(t1,v0,t9)
562289848Sjkim	sd	ta1,8(a0)
563289848Sjkim	beqz	a3,.L_bn_sub_words_return
564289848Sjkim
565289848Sjkim	ld	t2,16(a1)
566289848Sjkim	ld	ta2,16(a2)
567289848Sjkim	sltu	t8,t2,ta2
568289848Sjkim	dsubu	t2,ta2
569289848Sjkim	dsubu	ta2,t2,v0
570289848Sjkim	MOVNZ	(t2,v0,t8)
571289848Sjkim	sd	ta2,16(a0)
572289848Sjkim	jr	ra
573289848SjkimEND(bn_sub_words)
574289848Sjkim
575289848Sjkim#undef	MINUS4
576289848Sjkim
577289848Sjkim.align 5
578289848SjkimLEAF(bn_div_3_words)
579289848Sjkim	.set	reorder
580289848Sjkim	move	a3,a0		/* we know that bn_div_words doesn't
581289848Sjkim				 * touch a3, ta2, ta3 and preserves a2
582289848Sjkim				 * so that we can save two arguments
583289848Sjkim				 * and return address in registers
584289848Sjkim				 * instead of stack:-)
585289848Sjkim				 */
586289848Sjkim	ld	a0,(a3)
587289848Sjkim	move	ta2,a1
588289848Sjkim	ld	a1,-8(a3)
589289848Sjkim	bne	a0,a2,.L_bn_div_3_words_proceed
590289848Sjkim	li	v0,-1
591289848Sjkim	jr	ra
592289848Sjkim.L_bn_div_3_words_proceed:
593289848Sjkim	move	ta3,ra
594289848Sjkim	bal	bn_div_words
595289848Sjkim	move	ra,ta3
596289848Sjkim	dmultu	ta2,v0
597289848Sjkim	ld	t2,-16(a3)
598289848Sjkim	move	ta0,zero
599289848Sjkim	mfhi	t1
600289848Sjkim	mflo	t0
601289848Sjkim	sltu	t8,t1,v1
602289848Sjkim.L_bn_div_3_words_inner_loop:
603289848Sjkim	bnez	t8,.L_bn_div_3_words_inner_loop_done
604289848Sjkim	sgeu	AT,t2,t0
605289848Sjkim	seq	t9,t1,v1
606289848Sjkim	and	AT,t9
607289848Sjkim	sltu	t3,t0,ta2
608289848Sjkim	daddu	v1,a2
609289848Sjkim	dsubu	t1,t3
610289848Sjkim	dsubu	t0,ta2
611289848Sjkim	sltu	t8,t1,v1
612289848Sjkim	sltu	ta0,v1,a2
613289848Sjkim	or	t8,ta0
614289848Sjkim	.set	noreorder
615289848Sjkim	beqzl	AT,.L_bn_div_3_words_inner_loop
616289848Sjkim	dsubu	v0,1
617289848Sjkim	.set	reorder
618289848Sjkim.L_bn_div_3_words_inner_loop_done:
619289848Sjkim	jr	ra
620289848SjkimEND(bn_div_3_words)
621289848Sjkim
622289848Sjkim.align	5
623289848SjkimLEAF(bn_div_words)
624289848Sjkim	.set	noreorder
625289848Sjkim	bnezl	a2,.L_bn_div_words_proceed
626289848Sjkim	move	v1,zero
627289848Sjkim	jr	ra
628289848Sjkim	li	v0,-1		/* I'd rather signal div-by-zero
629289848Sjkim				 * which can be done with 'break 7' */
630289848Sjkim
631289848Sjkim.L_bn_div_words_proceed:
632289848Sjkim	bltz	a2,.L_bn_div_words_body
633289848Sjkim	move	t9,v1
634289848Sjkim	dsll	a2,1
635289848Sjkim	bgtz	a2,.-4
636289848Sjkim	addu	t9,1
637289848Sjkim
638289848Sjkim	.set	reorder
639289848Sjkim	negu	t1,t9
640289848Sjkim	li	t2,-1
641289848Sjkim	dsll	t2,t1
642289848Sjkim	and	t2,a0
643289848Sjkim	dsrl	AT,a1,t1
644289848Sjkim	.set	noreorder
645289848Sjkim	bnezl	t2,.+8
646289848Sjkim	break	6		/* signal overflow */
647289848Sjkim	.set	reorder
648289848Sjkim	dsll	a0,t9
649289848Sjkim	dsll	a1,t9
650289848Sjkim	or	a0,AT
651289848Sjkim
652289848Sjkim#define	QT	ta0
653289848Sjkim#define	HH	ta1
654289848Sjkim#define	DH	v1
655289848Sjkim.L_bn_div_words_body:
656289848Sjkim	dsrl	DH,a2,32
657289848Sjkim	sgeu	AT,a0,a2
658289848Sjkim	.set	noreorder
659289848Sjkim	bnezl	AT,.+8
660289848Sjkim	dsubu	a0,a2
661289848Sjkim	.set	reorder
662289848Sjkim
663289848Sjkim	li	QT,-1
664289848Sjkim	dsrl	HH,a0,32
665289848Sjkim	dsrl	QT,32	/* q=0xffffffff */
666289848Sjkim	beq	DH,HH,.L_bn_div_words_skip_div1
667289848Sjkim	ddivu	zero,a0,DH
668289848Sjkim	mflo	QT
669289848Sjkim.L_bn_div_words_skip_div1:
670289848Sjkim	dmultu	a2,QT
671289848Sjkim	dsll	t3,a0,32
672289848Sjkim	dsrl	AT,a1,32
673289848Sjkim	or	t3,AT
674289848Sjkim	mflo	t0
675289848Sjkim	mfhi	t1
676289848Sjkim.L_bn_div_words_inner_loop1:
677289848Sjkim	sltu	t2,t3,t0
678289848Sjkim	seq	t8,HH,t1
679289848Sjkim	sltu	AT,HH,t1
680289848Sjkim	and	t2,t8
681289848Sjkim	sltu	v0,t0,a2
682289848Sjkim	or	AT,t2
683289848Sjkim	.set	noreorder
684289848Sjkim	beqz	AT,.L_bn_div_words_inner_loop1_done
685289848Sjkim	dsubu	t1,v0
686289848Sjkim	dsubu	t0,a2
687289848Sjkim	b	.L_bn_div_words_inner_loop1
688289848Sjkim	dsubu	QT,1
689289848Sjkim	.set	reorder
690289848Sjkim.L_bn_div_words_inner_loop1_done:
691289848Sjkim
692289848Sjkim	dsll	a1,32
693289848Sjkim	dsubu	a0,t3,t0
694289848Sjkim	dsll	v0,QT,32
695289848Sjkim
696289848Sjkim	li	QT,-1
697289848Sjkim	dsrl	HH,a0,32
698289848Sjkim	dsrl	QT,32	/* q=0xffffffff */
699289848Sjkim	beq	DH,HH,.L_bn_div_words_skip_div2
700289848Sjkim	ddivu	zero,a0,DH
701289848Sjkim	mflo	QT
702289848Sjkim.L_bn_div_words_skip_div2:
703289848Sjkim#undef	DH
704289848Sjkim	dmultu	a2,QT
705289848Sjkim	dsll	t3,a0,32
706289848Sjkim	dsrl	AT,a1,32
707289848Sjkim	or	t3,AT
708289848Sjkim	mflo	t0
709289848Sjkim	mfhi	t1
710289848Sjkim.L_bn_div_words_inner_loop2:
711289848Sjkim	sltu	t2,t3,t0
712289848Sjkim	seq	t8,HH,t1
713289848Sjkim	sltu	AT,HH,t1
714289848Sjkim	and	t2,t8
715289848Sjkim	sltu	v1,t0,a2
716289848Sjkim	or	AT,t2
717289848Sjkim	.set	noreorder
718289848Sjkim	beqz	AT,.L_bn_div_words_inner_loop2_done
719289848Sjkim	dsubu	t1,v1
720289848Sjkim	dsubu	t0,a2
721289848Sjkim	b	.L_bn_div_words_inner_loop2
722289848Sjkim	dsubu	QT,1
723289848Sjkim	.set	reorder
724289848Sjkim.L_bn_div_words_inner_loop2_done:
725289848Sjkim#undef	HH
726289848Sjkim
727289848Sjkim	dsubu	a0,t3,t0
728289848Sjkim	or	v0,QT
729289848Sjkim	dsrl	v1,a0,t9	/* v1 contains remainder if anybody wants it */
730289848Sjkim	dsrl	a2,t9		/* restore a2 */
731289848Sjkim	jr	ra
732289848Sjkim#undef	QT
733289848SjkimEND(bn_div_words)
734289848Sjkim
735289848Sjkim#define	a_0	t0
736289848Sjkim#define	a_1	t1
737289848Sjkim#define	a_2	t2
738289848Sjkim#define	a_3	t3
739289848Sjkim#define	b_0	ta0
740289848Sjkim#define	b_1	ta1
741289848Sjkim#define	b_2	ta2
742289848Sjkim#define	b_3	ta3
743289848Sjkim
744289848Sjkim#define	a_4	s0
745289848Sjkim#define	a_5	s2
746289848Sjkim#define	a_6	s4
747289848Sjkim#define	a_7	a1	/* once we load a[7] we don't need a anymore */
748289848Sjkim#define	b_4	s1
749289848Sjkim#define	b_5	s3
750289848Sjkim#define	b_6	s5
751289848Sjkim#define	b_7	a2	/* once we load b[7] we don't need b anymore */
752289848Sjkim
753289848Sjkim#define	t_1	t8
754289848Sjkim#define	t_2	t9
755289848Sjkim
756289848Sjkim#define	c_1	v0
757289848Sjkim#define	c_2	v1
758289848Sjkim#define	c_3	a3
759289848Sjkim
760289848Sjkim#define	FRAME_SIZE	48
761289848Sjkim
762289848Sjkim.align	5
763289848SjkimLEAF(bn_mul_comba8)
764289848Sjkim	.set	noreorder
765289848Sjkim	PTR_SUB	sp,FRAME_SIZE
766289848Sjkim	.frame	sp,64,ra
767289848Sjkim	.set	reorder
768289848Sjkim	ld	a_0,0(a1)	/* If compiled with -mips3 option on
769289848Sjkim				 * R5000 box assembler barks on this
770289848Sjkim				 * line with "shouldn't have mult/div
771289848Sjkim				 * as last instruction in bb (R10K
772289848Sjkim				 * bug)" warning. If anybody out there
773289848Sjkim				 * has a clue about how to circumvent
774289848Sjkim				 * this do send me a note.
775289848Sjkim				 *		<appro@fy.chalmers.se>
776289848Sjkim				 */
777289848Sjkim	ld	b_0,0(a2)
778289848Sjkim	ld	a_1,8(a1)
779289848Sjkim	ld	a_2,16(a1)
780289848Sjkim	ld	a_3,24(a1)
781289848Sjkim	ld	b_1,8(a2)
782289848Sjkim	ld	b_2,16(a2)
783289848Sjkim	ld	b_3,24(a2)
784289848Sjkim	dmultu	a_0,b_0		/* mul_add_c(a[0],b[0],c1,c2,c3); */
785289848Sjkim	sd	s0,0(sp)
786289848Sjkim	sd	s1,8(sp)
787289848Sjkim	sd	s2,16(sp)
788289848Sjkim	sd	s3,24(sp)
789289848Sjkim	sd	s4,32(sp)
790289848Sjkim	sd	s5,40(sp)
791289848Sjkim	mflo	c_1
792289848Sjkim	mfhi	c_2
793289848Sjkim
794289848Sjkim	dmultu	a_0,b_1		/* mul_add_c(a[0],b[1],c2,c3,c1); */
795289848Sjkim	ld	a_4,32(a1)
796289848Sjkim	ld	a_5,40(a1)
797289848Sjkim	ld	a_6,48(a1)
798289848Sjkim	ld	a_7,56(a1)
799289848Sjkim	ld	b_4,32(a2)
800289848Sjkim	ld	b_5,40(a2)
801289848Sjkim	mflo	t_1
802289848Sjkim	mfhi	t_2
803289848Sjkim	daddu	c_2,t_1
804289848Sjkim	sltu	AT,c_2,t_1
805289848Sjkim	daddu	c_3,t_2,AT
806289848Sjkim	dmultu	a_1,b_0		/* mul_add_c(a[1],b[0],c2,c3,c1); */
807289848Sjkim	ld	b_6,48(a2)
808289848Sjkim	ld	b_7,56(a2)
809289848Sjkim	sd	c_1,0(a0)	/* r[0]=c1; */
810289848Sjkim	mflo	t_1
811289848Sjkim	mfhi	t_2
812289848Sjkim	daddu	c_2,t_1
813289848Sjkim	sltu	AT,c_2,t_1
814289848Sjkim	daddu	t_2,AT
815289848Sjkim	daddu	c_3,t_2
816289848Sjkim	sltu	c_1,c_3,t_2
817289848Sjkim	sd	c_2,8(a0)	/* r[1]=c2; */
818289848Sjkim
819289848Sjkim	dmultu	a_2,b_0		/* mul_add_c(a[2],b[0],c3,c1,c2); */
820289848Sjkim	mflo	t_1
821289848Sjkim	mfhi	t_2
822289848Sjkim	daddu	c_3,t_1
823289848Sjkim	sltu	AT,c_3,t_1
824289848Sjkim	daddu	t_2,AT
825289848Sjkim	daddu	c_1,t_2
826289848Sjkim	dmultu	a_1,b_1		/* mul_add_c(a[1],b[1],c3,c1,c2); */
827289848Sjkim	mflo	t_1
828289848Sjkim	mfhi	t_2
829289848Sjkim	daddu	c_3,t_1
830289848Sjkim	sltu	AT,c_3,t_1
831289848Sjkim	daddu	t_2,AT
832289848Sjkim	daddu	c_1,t_2
833289848Sjkim	sltu	c_2,c_1,t_2
834289848Sjkim	dmultu	a_0,b_2		/* mul_add_c(a[0],b[2],c3,c1,c2); */
835289848Sjkim	mflo	t_1
836289848Sjkim	mfhi	t_2
837289848Sjkim	daddu	c_3,t_1
838289848Sjkim	sltu	AT,c_3,t_1
839289848Sjkim	daddu	t_2,AT
840289848Sjkim	daddu	c_1,t_2
841289848Sjkim	sltu	AT,c_1,t_2
842289848Sjkim	daddu	c_2,AT
843289848Sjkim	sd	c_3,16(a0)	/* r[2]=c3; */
844289848Sjkim
845289848Sjkim	dmultu	a_0,b_3		/* mul_add_c(a[0],b[3],c1,c2,c3); */
846289848Sjkim	mflo	t_1
847289848Sjkim	mfhi	t_2
848289848Sjkim	daddu	c_1,t_1
849289848Sjkim	sltu	AT,c_1,t_1
850289848Sjkim	daddu	t_2,AT
851289848Sjkim	daddu	c_2,t_2
852289848Sjkim	sltu	c_3,c_2,t_2
853289848Sjkim	dmultu	a_1,b_2		/* mul_add_c(a[1],b[2],c1,c2,c3); */
854289848Sjkim	mflo	t_1
855289848Sjkim	mfhi	t_2
856289848Sjkim	daddu	c_1,t_1
857289848Sjkim	sltu	AT,c_1,t_1
858289848Sjkim	daddu	t_2,AT
859289848Sjkim	daddu	c_2,t_2
860289848Sjkim	sltu	AT,c_2,t_2
861289848Sjkim	daddu	c_3,AT
862289848Sjkim	dmultu	a_2,b_1		/* mul_add_c(a[2],b[1],c1,c2,c3); */
863289848Sjkim	mflo	t_1
864289848Sjkim	mfhi	t_2
865289848Sjkim	daddu	c_1,t_1
866289848Sjkim	sltu	AT,c_1,t_1
867289848Sjkim	daddu	t_2,AT
868289848Sjkim	daddu	c_2,t_2
869289848Sjkim	sltu	AT,c_2,t_2
870289848Sjkim	daddu	c_3,AT
871289848Sjkim	dmultu	a_3,b_0		/* mul_add_c(a[3],b[0],c1,c2,c3); */
872289848Sjkim	mflo	t_1
873289848Sjkim	mfhi	t_2
874289848Sjkim	daddu	c_1,t_1
875289848Sjkim	sltu	AT,c_1,t_1
876289848Sjkim	daddu	t_2,AT
877289848Sjkim	daddu	c_2,t_2
878289848Sjkim	sltu	AT,c_2,t_2
879289848Sjkim	daddu	c_3,AT
880289848Sjkim	sd	c_1,24(a0)	/* r[3]=c1; */
881289848Sjkim
882289848Sjkim	dmultu	a_4,b_0		/* mul_add_c(a[4],b[0],c2,c3,c1); */
883289848Sjkim	mflo	t_1
884289848Sjkim	mfhi	t_2
885289848Sjkim	daddu	c_2,t_1
886289848Sjkim	sltu	AT,c_2,t_1
887289848Sjkim	daddu	t_2,AT
888289848Sjkim	daddu	c_3,t_2
889289848Sjkim	sltu	c_1,c_3,t_2
890289848Sjkim	dmultu	a_3,b_1		/* mul_add_c(a[3],b[1],c2,c3,c1); */
891289848Sjkim	mflo	t_1
892289848Sjkim	mfhi	t_2
893289848Sjkim	daddu	c_2,t_1
894289848Sjkim	sltu	AT,c_2,t_1
895289848Sjkim	daddu	t_2,AT
896289848Sjkim	daddu	c_3,t_2
897289848Sjkim	sltu	AT,c_3,t_2
898289848Sjkim	daddu	c_1,AT
899289848Sjkim	dmultu	a_2,b_2		/* mul_add_c(a[2],b[2],c2,c3,c1); */
900289848Sjkim	mflo	t_1
901289848Sjkim	mfhi	t_2
902289848Sjkim	daddu	c_2,t_1
903289848Sjkim	sltu	AT,c_2,t_1
904289848Sjkim	daddu	t_2,AT
905289848Sjkim	daddu	c_3,t_2
906289848Sjkim	sltu	AT,c_3,t_2
907289848Sjkim	daddu	c_1,AT
908289848Sjkim	dmultu	a_1,b_3		/* mul_add_c(a[1],b[3],c2,c3,c1); */
909289848Sjkim	mflo	t_1
910289848Sjkim	mfhi	t_2
911289848Sjkim	daddu	c_2,t_1
912289848Sjkim	sltu	AT,c_2,t_1
913289848Sjkim	daddu	t_2,AT
914289848Sjkim	daddu	c_3,t_2
915289848Sjkim	sltu	AT,c_3,t_2
916289848Sjkim	daddu	c_1,AT
917289848Sjkim	dmultu	a_0,b_4		/* mul_add_c(a[0],b[4],c2,c3,c1); */
918289848Sjkim	mflo	t_1
919289848Sjkim	mfhi	t_2
920289848Sjkim	daddu	c_2,t_1
921289848Sjkim	sltu	AT,c_2,t_1
922289848Sjkim	daddu	t_2,AT
923289848Sjkim	daddu	c_3,t_2
924289848Sjkim	sltu	AT,c_3,t_2
925289848Sjkim	daddu	c_1,AT
926289848Sjkim	sd	c_2,32(a0)	/* r[4]=c2; */
927289848Sjkim
928289848Sjkim	dmultu	a_0,b_5		/* mul_add_c(a[0],b[5],c3,c1,c2); */
929289848Sjkim	mflo	t_1
930289848Sjkim	mfhi	t_2
931289848Sjkim	daddu	c_3,t_1
932289848Sjkim	sltu	AT,c_3,t_1
933289848Sjkim	daddu	t_2,AT
934289848Sjkim	daddu	c_1,t_2
935289848Sjkim	sltu	c_2,c_1,t_2
936289848Sjkim	dmultu	a_1,b_4		/* mul_add_c(a[1],b[4],c3,c1,c2); */
937289848Sjkim	mflo	t_1
938289848Sjkim	mfhi	t_2
939289848Sjkim	daddu	c_3,t_1
940289848Sjkim	sltu	AT,c_3,t_1
941289848Sjkim	daddu	t_2,AT
942289848Sjkim	daddu	c_1,t_2
943289848Sjkim	sltu	AT,c_1,t_2
944289848Sjkim	daddu	c_2,AT
945289848Sjkim	dmultu	a_2,b_3		/* mul_add_c(a[2],b[3],c3,c1,c2); */
946289848Sjkim	mflo	t_1
947289848Sjkim	mfhi	t_2
948289848Sjkim	daddu	c_3,t_1
949289848Sjkim	sltu	AT,c_3,t_1
950289848Sjkim	daddu	t_2,AT
951289848Sjkim	daddu	c_1,t_2
952289848Sjkim	sltu	AT,c_1,t_2
953289848Sjkim	daddu	c_2,AT
954289848Sjkim	dmultu	a_3,b_2		/* mul_add_c(a[3],b[2],c3,c1,c2); */
955289848Sjkim	mflo	t_1
956289848Sjkim	mfhi	t_2
957289848Sjkim	daddu	c_3,t_1
958289848Sjkim	sltu	AT,c_3,t_1
959289848Sjkim	daddu	t_2,AT
960289848Sjkim	daddu	c_1,t_2
961289848Sjkim	sltu	AT,c_1,t_2
962289848Sjkim	daddu	c_2,AT
963289848Sjkim	dmultu	a_4,b_1		/* mul_add_c(a[4],b[1],c3,c1,c2); */
964289848Sjkim	mflo	t_1
965289848Sjkim	mfhi	t_2
966289848Sjkim	daddu	c_3,t_1
967289848Sjkim	sltu	AT,c_3,t_1
968289848Sjkim	daddu	t_2,AT
969289848Sjkim	daddu	c_1,t_2
970289848Sjkim	sltu	AT,c_1,t_2
971289848Sjkim	daddu	c_2,AT
972289848Sjkim	dmultu	a_5,b_0		/* mul_add_c(a[5],b[0],c3,c1,c2); */
973289848Sjkim	mflo	t_1
974289848Sjkim	mfhi	t_2
975289848Sjkim	daddu	c_3,t_1
976289848Sjkim	sltu	AT,c_3,t_1
977289848Sjkim	daddu	t_2,AT
978289848Sjkim	daddu	c_1,t_2
979289848Sjkim	sltu	AT,c_1,t_2
980289848Sjkim	daddu	c_2,AT
981289848Sjkim	sd	c_3,40(a0)	/* r[5]=c3; */
982289848Sjkim
983289848Sjkim	dmultu	a_6,b_0		/* mul_add_c(a[6],b[0],c1,c2,c3); */
984289848Sjkim	mflo	t_1
985289848Sjkim	mfhi	t_2
986289848Sjkim	daddu	c_1,t_1
987289848Sjkim	sltu	AT,c_1,t_1
988289848Sjkim	daddu	t_2,AT
989289848Sjkim	daddu	c_2,t_2
990289848Sjkim	sltu	c_3,c_2,t_2
991289848Sjkim	dmultu	a_5,b_1		/* mul_add_c(a[5],b[1],c1,c2,c3); */
992289848Sjkim	mflo	t_1
993289848Sjkim	mfhi	t_2
994289848Sjkim	daddu	c_1,t_1
995289848Sjkim	sltu	AT,c_1,t_1
996289848Sjkim	daddu	t_2,AT
997289848Sjkim	daddu	c_2,t_2
998289848Sjkim	sltu	AT,c_2,t_2
999289848Sjkim	daddu	c_3,AT
1000289848Sjkim	dmultu	a_4,b_2		/* mul_add_c(a[4],b[2],c1,c2,c3); */
1001289848Sjkim	mflo	t_1
1002289848Sjkim	mfhi	t_2
1003289848Sjkim	daddu	c_1,t_1
1004289848Sjkim	sltu	AT,c_1,t_1
1005289848Sjkim	daddu	t_2,AT
1006289848Sjkim	daddu	c_2,t_2
1007289848Sjkim	sltu	AT,c_2,t_2
1008289848Sjkim	daddu	c_3,AT
1009289848Sjkim	dmultu	a_3,b_3		/* mul_add_c(a[3],b[3],c1,c2,c3); */
1010289848Sjkim	mflo	t_1
1011289848Sjkim	mfhi	t_2
1012289848Sjkim	daddu	c_1,t_1
1013289848Sjkim	sltu	AT,c_1,t_1
1014289848Sjkim	daddu	t_2,AT
1015289848Sjkim	daddu	c_2,t_2
1016289848Sjkim	sltu	AT,c_2,t_2
1017289848Sjkim	daddu	c_3,AT
1018289848Sjkim	dmultu	a_2,b_4		/* mul_add_c(a[2],b[4],c1,c2,c3); */
1019289848Sjkim	mflo	t_1
1020289848Sjkim	mfhi	t_2
1021289848Sjkim	daddu	c_1,t_1
1022289848Sjkim	sltu	AT,c_1,t_1
1023289848Sjkim	daddu	t_2,AT
1024289848Sjkim	daddu	c_2,t_2
1025289848Sjkim	sltu	AT,c_2,t_2
1026289848Sjkim	daddu	c_3,AT
1027289848Sjkim	dmultu	a_1,b_5		/* mul_add_c(a[1],b[5],c1,c2,c3); */
1028289848Sjkim	mflo	t_1
1029289848Sjkim	mfhi	t_2
1030289848Sjkim	daddu	c_1,t_1
1031289848Sjkim	sltu	AT,c_1,t_1
1032289848Sjkim	daddu	t_2,AT
1033289848Sjkim	daddu	c_2,t_2
1034289848Sjkim	sltu	AT,c_2,t_2
1035289848Sjkim	daddu	c_3,AT
1036289848Sjkim	dmultu	a_0,b_6		/* mul_add_c(a[0],b[6],c1,c2,c3); */
1037289848Sjkim	mflo	t_1
1038289848Sjkim	mfhi	t_2
1039289848Sjkim	daddu	c_1,t_1
1040289848Sjkim	sltu	AT,c_1,t_1
1041289848Sjkim	daddu	t_2,AT
1042289848Sjkim	daddu	c_2,t_2
1043289848Sjkim	sltu	AT,c_2,t_2
1044289848Sjkim	daddu	c_3,AT
1045289848Sjkim	sd	c_1,48(a0)	/* r[6]=c1; */
1046289848Sjkim
1047289848Sjkim	dmultu	a_0,b_7		/* mul_add_c(a[0],b[7],c2,c3,c1); */
1048289848Sjkim	mflo	t_1
1049289848Sjkim	mfhi	t_2
1050289848Sjkim	daddu	c_2,t_1
1051289848Sjkim	sltu	AT,c_2,t_1
1052289848Sjkim	daddu	t_2,AT
1053289848Sjkim	daddu	c_3,t_2
1054289848Sjkim	sltu	c_1,c_3,t_2
1055289848Sjkim	dmultu	a_1,b_6		/* mul_add_c(a[1],b[6],c2,c3,c1); */
1056289848Sjkim	mflo	t_1
1057289848Sjkim	mfhi	t_2
1058289848Sjkim	daddu	c_2,t_1
1059289848Sjkim	sltu	AT,c_2,t_1
1060289848Sjkim	daddu	t_2,AT
1061289848Sjkim	daddu	c_3,t_2
1062289848Sjkim	sltu	AT,c_3,t_2
1063289848Sjkim	daddu	c_1,AT
1064289848Sjkim	dmultu	a_2,b_5		/* mul_add_c(a[2],b[5],c2,c3,c1); */
1065289848Sjkim	mflo	t_1
1066289848Sjkim	mfhi	t_2
1067289848Sjkim	daddu	c_2,t_1
1068289848Sjkim	sltu	AT,c_2,t_1
1069289848Sjkim	daddu	t_2,AT
1070289848Sjkim	daddu	c_3,t_2
1071289848Sjkim	sltu	AT,c_3,t_2
1072289848Sjkim	daddu	c_1,AT
1073289848Sjkim	dmultu	a_3,b_4		/* mul_add_c(a[3],b[4],c2,c3,c1); */
1074289848Sjkim	mflo	t_1
1075289848Sjkim	mfhi	t_2
1076289848Sjkim	daddu	c_2,t_1
1077289848Sjkim	sltu	AT,c_2,t_1
1078289848Sjkim	daddu	t_2,AT
1079289848Sjkim	daddu	c_3,t_2
1080289848Sjkim	sltu	AT,c_3,t_2
1081289848Sjkim	daddu	c_1,AT
1082289848Sjkim	dmultu	a_4,b_3		/* mul_add_c(a[4],b[3],c2,c3,c1); */
1083289848Sjkim	mflo	t_1
1084289848Sjkim	mfhi	t_2
1085289848Sjkim	daddu	c_2,t_1
1086289848Sjkim	sltu	AT,c_2,t_1
1087289848Sjkim	daddu	t_2,AT
1088289848Sjkim	daddu	c_3,t_2
1089289848Sjkim	sltu	AT,c_3,t_2
1090289848Sjkim	daddu	c_1,AT
1091289848Sjkim	dmultu	a_5,b_2		/* mul_add_c(a[5],b[2],c2,c3,c1); */
1092289848Sjkim	mflo	t_1
1093289848Sjkim	mfhi	t_2
1094289848Sjkim	daddu	c_2,t_1
1095289848Sjkim	sltu	AT,c_2,t_1
1096289848Sjkim	daddu	t_2,AT
1097289848Sjkim	daddu	c_3,t_2
1098289848Sjkim	sltu	AT,c_3,t_2
1099289848Sjkim	daddu	c_1,AT
1100289848Sjkim	dmultu	a_6,b_1		/* mul_add_c(a[6],b[1],c2,c3,c1); */
1101289848Sjkim	mflo	t_1
1102289848Sjkim	mfhi	t_2
1103289848Sjkim	daddu	c_2,t_1
1104289848Sjkim	sltu	AT,c_2,t_1
1105289848Sjkim	daddu	t_2,AT
1106289848Sjkim	daddu	c_3,t_2
1107289848Sjkim	sltu	AT,c_3,t_2
1108289848Sjkim	daddu	c_1,AT
1109289848Sjkim	dmultu	a_7,b_0		/* mul_add_c(a[7],b[0],c2,c3,c1); */
1110289848Sjkim	mflo	t_1
1111289848Sjkim	mfhi	t_2
1112289848Sjkim	daddu	c_2,t_1
1113289848Sjkim	sltu	AT,c_2,t_1
1114289848Sjkim	daddu	t_2,AT
1115289848Sjkim	daddu	c_3,t_2
1116289848Sjkim	sltu	AT,c_3,t_2
1117289848Sjkim	daddu	c_1,AT
1118289848Sjkim	sd	c_2,56(a0)	/* r[7]=c2; */
1119289848Sjkim
1120289848Sjkim	dmultu	a_7,b_1		/* mul_add_c(a[7],b[1],c3,c1,c2); */
1121289848Sjkim	mflo	t_1
1122289848Sjkim	mfhi	t_2
1123289848Sjkim	daddu	c_3,t_1
1124289848Sjkim	sltu	AT,c_3,t_1
1125289848Sjkim	daddu	t_2,AT
1126289848Sjkim	daddu	c_1,t_2
1127289848Sjkim	sltu	c_2,c_1,t_2
1128289848Sjkim	dmultu	a_6,b_2		/* mul_add_c(a[6],b[2],c3,c1,c2); */
1129289848Sjkim	mflo	t_1
1130289848Sjkim	mfhi	t_2
1131289848Sjkim	daddu	c_3,t_1
1132289848Sjkim	sltu	AT,c_3,t_1
1133289848Sjkim	daddu	t_2,AT
1134289848Sjkim	daddu	c_1,t_2
1135289848Sjkim	sltu	AT,c_1,t_2
1136289848Sjkim	daddu	c_2,AT
1137289848Sjkim	dmultu	a_5,b_3		/* mul_add_c(a[5],b[3],c3,c1,c2); */
1138289848Sjkim	mflo	t_1
1139289848Sjkim	mfhi	t_2
1140289848Sjkim	daddu	c_3,t_1
1141289848Sjkim	sltu	AT,c_3,t_1
1142289848Sjkim	daddu	t_2,AT
1143289848Sjkim	daddu	c_1,t_2
1144289848Sjkim	sltu	AT,c_1,t_2
1145289848Sjkim	daddu	c_2,AT
1146289848Sjkim	dmultu	a_4,b_4		/* mul_add_c(a[4],b[4],c3,c1,c2); */
1147289848Sjkim	mflo	t_1
1148289848Sjkim	mfhi	t_2
1149289848Sjkim	daddu	c_3,t_1
1150289848Sjkim	sltu	AT,c_3,t_1
1151289848Sjkim	daddu	t_2,AT
1152289848Sjkim	daddu	c_1,t_2
1153289848Sjkim	sltu	AT,c_1,t_2
1154289848Sjkim	daddu	c_2,AT
1155289848Sjkim	dmultu	a_3,b_5		/* mul_add_c(a[3],b[5],c3,c1,c2); */
1156289848Sjkim	mflo	t_1
1157289848Sjkim	mfhi	t_2
1158289848Sjkim	daddu	c_3,t_1
1159289848Sjkim	sltu	AT,c_3,t_1
1160289848Sjkim	daddu	t_2,AT
1161289848Sjkim	daddu	c_1,t_2
1162289848Sjkim	sltu	AT,c_1,t_2
1163289848Sjkim	daddu	c_2,AT
1164289848Sjkim	dmultu	a_2,b_6		/* mul_add_c(a[2],b[6],c3,c1,c2); */
1165289848Sjkim	mflo	t_1
1166289848Sjkim	mfhi	t_2
1167289848Sjkim	daddu	c_3,t_1
1168289848Sjkim	sltu	AT,c_3,t_1
1169289848Sjkim	daddu	t_2,AT
1170289848Sjkim	daddu	c_1,t_2
1171289848Sjkim	sltu	AT,c_1,t_2
1172289848Sjkim	daddu	c_2,AT
1173289848Sjkim	dmultu	a_1,b_7		/* mul_add_c(a[1],b[7],c3,c1,c2); */
1174289848Sjkim	mflo	t_1
1175289848Sjkim	mfhi	t_2
1176289848Sjkim	daddu	c_3,t_1
1177289848Sjkim	sltu	AT,c_3,t_1
1178289848Sjkim	daddu	t_2,AT
1179289848Sjkim	daddu	c_1,t_2
1180289848Sjkim	sltu	AT,c_1,t_2
1181289848Sjkim	daddu	c_2,AT
1182289848Sjkim	sd	c_3,64(a0)	/* r[8]=c3; */
1183289848Sjkim
1184289848Sjkim	dmultu	a_2,b_7		/* mul_add_c(a[2],b[7],c1,c2,c3); */
1185289848Sjkim	mflo	t_1
1186289848Sjkim	mfhi	t_2
1187289848Sjkim	daddu	c_1,t_1
1188289848Sjkim	sltu	AT,c_1,t_1
1189289848Sjkim	daddu	t_2,AT
1190289848Sjkim	daddu	c_2,t_2
1191289848Sjkim	sltu	c_3,c_2,t_2
1192289848Sjkim	dmultu	a_3,b_6		/* mul_add_c(a[3],b[6],c1,c2,c3); */
1193289848Sjkim	mflo	t_1
1194289848Sjkim	mfhi	t_2
1195289848Sjkim	daddu	c_1,t_1
1196289848Sjkim	sltu	AT,c_1,t_1
1197289848Sjkim	daddu	t_2,AT
1198289848Sjkim	daddu	c_2,t_2
1199289848Sjkim	sltu	AT,c_2,t_2
1200289848Sjkim	daddu	c_3,AT
1201289848Sjkim	dmultu	a_4,b_5		/* mul_add_c(a[4],b[5],c1,c2,c3); */
1202289848Sjkim	mflo	t_1
1203289848Sjkim	mfhi	t_2
1204289848Sjkim	daddu	c_1,t_1
1205289848Sjkim	sltu	AT,c_1,t_1
1206289848Sjkim	daddu	t_2,AT
1207289848Sjkim	daddu	c_2,t_2
1208289848Sjkim	sltu	AT,c_2,t_2
1209289848Sjkim	daddu	c_3,AT
1210289848Sjkim	dmultu	a_5,b_4		/* mul_add_c(a[5],b[4],c1,c2,c3); */
1211289848Sjkim	mflo	t_1
1212289848Sjkim	mfhi	t_2
1213289848Sjkim	daddu	c_1,t_1
1214289848Sjkim	sltu	AT,c_1,t_1
1215289848Sjkim	daddu	t_2,AT
1216289848Sjkim	daddu	c_2,t_2
1217289848Sjkim	sltu	AT,c_2,t_2
1218289848Sjkim	daddu	c_3,AT
1219289848Sjkim	dmultu	a_6,b_3		/* mul_add_c(a[6],b[3],c1,c2,c3); */
1220289848Sjkim	mflo	t_1
1221289848Sjkim	mfhi	t_2
1222289848Sjkim	daddu	c_1,t_1
1223289848Sjkim	sltu	AT,c_1,t_1
1224289848Sjkim	daddu	t_2,AT
1225289848Sjkim	daddu	c_2,t_2
1226289848Sjkim	sltu	AT,c_2,t_2
1227289848Sjkim	daddu	c_3,AT
1228289848Sjkim	dmultu	a_7,b_2		/* mul_add_c(a[7],b[2],c1,c2,c3); */
1229289848Sjkim	mflo	t_1
1230289848Sjkim	mfhi	t_2
1231289848Sjkim	daddu	c_1,t_1
1232289848Sjkim	sltu	AT,c_1,t_1
1233289848Sjkim	daddu	t_2,AT
1234289848Sjkim	daddu	c_2,t_2
1235289848Sjkim	sltu	AT,c_2,t_2
1236289848Sjkim	daddu	c_3,AT
1237289848Sjkim	sd	c_1,72(a0)	/* r[9]=c1; */
1238289848Sjkim
1239289848Sjkim	dmultu	a_7,b_3		/* mul_add_c(a[7],b[3],c2,c3,c1); */
1240289848Sjkim	mflo	t_1
1241289848Sjkim	mfhi	t_2
1242289848Sjkim	daddu	c_2,t_1
1243289848Sjkim	sltu	AT,c_2,t_1
1244289848Sjkim	daddu	t_2,AT
1245289848Sjkim	daddu	c_3,t_2
1246289848Sjkim	sltu	c_1,c_3,t_2
1247289848Sjkim	dmultu	a_6,b_4		/* mul_add_c(a[6],b[4],c2,c3,c1); */
1248289848Sjkim	mflo	t_1
1249289848Sjkim	mfhi	t_2
1250289848Sjkim	daddu	c_2,t_1
1251289848Sjkim	sltu	AT,c_2,t_1
1252289848Sjkim	daddu	t_2,AT
1253289848Sjkim	daddu	c_3,t_2
1254289848Sjkim	sltu	AT,c_3,t_2
1255289848Sjkim	daddu	c_1,AT
1256289848Sjkim	dmultu	a_5,b_5		/* mul_add_c(a[5],b[5],c2,c3,c1); */
1257289848Sjkim	mflo	t_1
1258289848Sjkim	mfhi	t_2
1259289848Sjkim	daddu	c_2,t_1
1260289848Sjkim	sltu	AT,c_2,t_1
1261289848Sjkim	daddu	t_2,AT
1262289848Sjkim	daddu	c_3,t_2
1263289848Sjkim	sltu	AT,c_3,t_2
1264289848Sjkim	daddu	c_1,AT
1265289848Sjkim	dmultu	a_4,b_6		/* mul_add_c(a[4],b[6],c2,c3,c1); */
1266289848Sjkim	mflo	t_1
1267289848Sjkim	mfhi	t_2
1268289848Sjkim	daddu	c_2,t_1
1269289848Sjkim	sltu	AT,c_2,t_1
1270289848Sjkim	daddu	t_2,AT
1271289848Sjkim	daddu	c_3,t_2
1272289848Sjkim	sltu	AT,c_3,t_2
1273289848Sjkim	daddu	c_1,AT
1274289848Sjkim	dmultu	a_3,b_7		/* mul_add_c(a[3],b[7],c2,c3,c1); */
1275289848Sjkim	mflo	t_1
1276289848Sjkim	mfhi	t_2
1277289848Sjkim	daddu	c_2,t_1
1278289848Sjkim	sltu	AT,c_2,t_1
1279289848Sjkim	daddu	t_2,AT
1280289848Sjkim	daddu	c_3,t_2
1281289848Sjkim	sltu	AT,c_3,t_2
1282289848Sjkim	daddu	c_1,AT
1283289848Sjkim	sd	c_2,80(a0)	/* r[10]=c2; */
1284289848Sjkim
1285289848Sjkim	dmultu	a_4,b_7		/* mul_add_c(a[4],b[7],c3,c1,c2); */
1286289848Sjkim	mflo	t_1
1287289848Sjkim	mfhi	t_2
1288289848Sjkim	daddu	c_3,t_1
1289289848Sjkim	sltu	AT,c_3,t_1
1290289848Sjkim	daddu	t_2,AT
1291289848Sjkim	daddu	c_1,t_2
1292289848Sjkim	sltu	c_2,c_1,t_2
1293289848Sjkim	dmultu	a_5,b_6		/* mul_add_c(a[5],b[6],c3,c1,c2); */
1294289848Sjkim	mflo	t_1
1295289848Sjkim	mfhi	t_2
1296289848Sjkim	daddu	c_3,t_1
1297289848Sjkim	sltu	AT,c_3,t_1
1298289848Sjkim	daddu	t_2,AT
1299289848Sjkim	daddu	c_1,t_2
1300289848Sjkim	sltu	AT,c_1,t_2
1301289848Sjkim	daddu	c_2,AT
1302289848Sjkim	dmultu	a_6,b_5		/* mul_add_c(a[6],b[5],c3,c1,c2); */
1303289848Sjkim	mflo	t_1
1304289848Sjkim	mfhi	t_2
1305289848Sjkim	daddu	c_3,t_1
1306289848Sjkim	sltu	AT,c_3,t_1
1307289848Sjkim	daddu	t_2,AT
1308289848Sjkim	daddu	c_1,t_2
1309289848Sjkim	sltu	AT,c_1,t_2
1310289848Sjkim	daddu	c_2,AT
1311289848Sjkim	dmultu	a_7,b_4		/* mul_add_c(a[7],b[4],c3,c1,c2); */
1312289848Sjkim	mflo	t_1
1313289848Sjkim	mfhi	t_2
1314289848Sjkim	daddu	c_3,t_1
1315289848Sjkim	sltu	AT,c_3,t_1
1316289848Sjkim	daddu	t_2,AT
1317289848Sjkim	daddu	c_1,t_2
1318289848Sjkim	sltu	AT,c_1,t_2
1319289848Sjkim	daddu	c_2,AT
1320289848Sjkim	sd	c_3,88(a0)	/* r[11]=c3; */
1321289848Sjkim
1322289848Sjkim	dmultu	a_7,b_5		/* mul_add_c(a[7],b[5],c1,c2,c3); */
1323289848Sjkim	mflo	t_1
1324289848Sjkim	mfhi	t_2
1325289848Sjkim	daddu	c_1,t_1
1326289848Sjkim	sltu	AT,c_1,t_1
1327289848Sjkim	daddu	t_2,AT
1328289848Sjkim	daddu	c_2,t_2
1329289848Sjkim	sltu	c_3,c_2,t_2
1330289848Sjkim	dmultu	a_6,b_6		/* mul_add_c(a[6],b[6],c1,c2,c3); */
1331289848Sjkim	mflo	t_1
1332289848Sjkim	mfhi	t_2
1333289848Sjkim	daddu	c_1,t_1
1334289848Sjkim	sltu	AT,c_1,t_1
1335289848Sjkim	daddu	t_2,AT
1336289848Sjkim	daddu	c_2,t_2
1337289848Sjkim	sltu	AT,c_2,t_2
1338289848Sjkim	daddu	c_3,AT
1339289848Sjkim	dmultu	a_5,b_7		/* mul_add_c(a[5],b[7],c1,c2,c3); */
1340289848Sjkim	mflo	t_1
1341289848Sjkim	mfhi	t_2
1342289848Sjkim	daddu	c_1,t_1
1343289848Sjkim	sltu	AT,c_1,t_1
1344289848Sjkim	daddu	t_2,AT
1345289848Sjkim	daddu	c_2,t_2
1346289848Sjkim	sltu	AT,c_2,t_2
1347289848Sjkim	daddu	c_3,AT
1348289848Sjkim	sd	c_1,96(a0)	/* r[12]=c1; */
1349289848Sjkim
1350289848Sjkim	dmultu	a_6,b_7		/* mul_add_c(a[6],b[7],c2,c3,c1); */
1351289848Sjkim	mflo	t_1
1352289848Sjkim	mfhi	t_2
1353289848Sjkim	daddu	c_2,t_1
1354289848Sjkim	sltu	AT,c_2,t_1
1355289848Sjkim	daddu	t_2,AT
1356289848Sjkim	daddu	c_3,t_2
1357289848Sjkim	sltu	c_1,c_3,t_2
1358289848Sjkim	dmultu	a_7,b_6		/* mul_add_c(a[7],b[6],c2,c3,c1); */
1359289848Sjkim	mflo	t_1
1360289848Sjkim	mfhi	t_2
1361289848Sjkim	daddu	c_2,t_1
1362289848Sjkim	sltu	AT,c_2,t_1
1363289848Sjkim	daddu	t_2,AT
1364289848Sjkim	daddu	c_3,t_2
1365289848Sjkim	sltu	AT,c_3,t_2
1366289848Sjkim	daddu	c_1,AT
1367289848Sjkim	sd	c_2,104(a0)	/* r[13]=c2; */
1368289848Sjkim
1369289848Sjkim	dmultu	a_7,b_7		/* mul_add_c(a[7],b[7],c3,c1,c2); */
1370289848Sjkim	ld	s0,0(sp)
1371289848Sjkim	ld	s1,8(sp)
1372289848Sjkim	ld	s2,16(sp)
1373289848Sjkim	ld	s3,24(sp)
1374289848Sjkim	ld	s4,32(sp)
1375289848Sjkim	ld	s5,40(sp)
1376289848Sjkim	mflo	t_1
1377289848Sjkim	mfhi	t_2
1378289848Sjkim	daddu	c_3,t_1
1379289848Sjkim	sltu	AT,c_3,t_1
1380289848Sjkim	daddu	t_2,AT
1381289848Sjkim	daddu	c_1,t_2
1382289848Sjkim	sd	c_3,112(a0)	/* r[14]=c3; */
1383289848Sjkim	sd	c_1,120(a0)	/* r[15]=c1; */
1384289848Sjkim
1385289848Sjkim	PTR_ADD	sp,FRAME_SIZE
1386289848Sjkim
1387289848Sjkim	jr	ra
1388289848SjkimEND(bn_mul_comba8)
1389289848Sjkim
1390289848Sjkim.align	5
1391289848SjkimLEAF(bn_mul_comba4)
1392289848Sjkim	.set	reorder
1393289848Sjkim	ld	a_0,0(a1)
1394289848Sjkim	ld	b_0,0(a2)
1395289848Sjkim	ld	a_1,8(a1)
1396289848Sjkim	ld	a_2,16(a1)
1397289848Sjkim	dmultu	a_0,b_0		/* mul_add_c(a[0],b[0],c1,c2,c3); */
1398289848Sjkim	ld	a_3,24(a1)
1399289848Sjkim	ld	b_1,8(a2)
1400289848Sjkim	ld	b_2,16(a2)
1401289848Sjkim	ld	b_3,24(a2)
1402289848Sjkim	mflo	c_1
1403289848Sjkim	mfhi	c_2
1404289848Sjkim	sd	c_1,0(a0)
1405289848Sjkim
1406289848Sjkim	dmultu	a_0,b_1		/* mul_add_c(a[0],b[1],c2,c3,c1); */
1407289848Sjkim	mflo	t_1
1408289848Sjkim	mfhi	t_2
1409289848Sjkim	daddu	c_2,t_1
1410289848Sjkim	sltu	AT,c_2,t_1
1411289848Sjkim	daddu	c_3,t_2,AT
1412289848Sjkim	dmultu	a_1,b_0		/* mul_add_c(a[1],b[0],c2,c3,c1); */
1413289848Sjkim	mflo	t_1
1414289848Sjkim	mfhi	t_2
1415289848Sjkim	daddu	c_2,t_1
1416289848Sjkim	sltu	AT,c_2,t_1
1417289848Sjkim	daddu	t_2,AT
1418289848Sjkim	daddu	c_3,t_2
1419289848Sjkim	sltu	c_1,c_3,t_2
1420289848Sjkim	sd	c_2,8(a0)
1421289848Sjkim
1422289848Sjkim	dmultu	a_2,b_0		/* mul_add_c(a[2],b[0],c3,c1,c2); */
1423289848Sjkim	mflo	t_1
1424289848Sjkim	mfhi	t_2
1425289848Sjkim	daddu	c_3,t_1
1426289848Sjkim	sltu	AT,c_3,t_1
1427289848Sjkim	daddu	t_2,AT
1428289848Sjkim	daddu	c_1,t_2
1429289848Sjkim	dmultu	a_1,b_1		/* mul_add_c(a[1],b[1],c3,c1,c2); */
1430289848Sjkim	mflo	t_1
1431289848Sjkim	mfhi	t_2
1432289848Sjkim	daddu	c_3,t_1
1433289848Sjkim	sltu	AT,c_3,t_1
1434289848Sjkim	daddu	t_2,AT
1435289848Sjkim	daddu	c_1,t_2
1436289848Sjkim	sltu	c_2,c_1,t_2
1437289848Sjkim	dmultu	a_0,b_2		/* mul_add_c(a[0],b[2],c3,c1,c2); */
1438289848Sjkim	mflo	t_1
1439289848Sjkim	mfhi	t_2
1440289848Sjkim	daddu	c_3,t_1
1441289848Sjkim	sltu	AT,c_3,t_1
1442289848Sjkim	daddu	t_2,AT
1443289848Sjkim	daddu	c_1,t_2
1444289848Sjkim	sltu	AT,c_1,t_2
1445289848Sjkim	daddu	c_2,AT
1446289848Sjkim	sd	c_3,16(a0)
1447289848Sjkim
1448289848Sjkim	dmultu	a_0,b_3		/* mul_add_c(a[0],b[3],c1,c2,c3); */
1449289848Sjkim	mflo	t_1
1450289848Sjkim	mfhi	t_2
1451289848Sjkim	daddu	c_1,t_1
1452289848Sjkim	sltu	AT,c_1,t_1
1453289848Sjkim	daddu	t_2,AT
1454289848Sjkim	daddu	c_2,t_2
1455289848Sjkim	sltu	c_3,c_2,t_2
1456289848Sjkim	dmultu	a_1,b_2		/* mul_add_c(a[1],b[2],c1,c2,c3); */
1457289848Sjkim	mflo	t_1
1458289848Sjkim	mfhi	t_2
1459289848Sjkim	daddu	c_1,t_1
1460289848Sjkim	sltu	AT,c_1,t_1
1461289848Sjkim	daddu	t_2,AT
1462289848Sjkim	daddu	c_2,t_2
1463289848Sjkim	sltu	AT,c_2,t_2
1464289848Sjkim	daddu	c_3,AT
1465289848Sjkim	dmultu	a_2,b_1		/* mul_add_c(a[2],b[1],c1,c2,c3); */
1466289848Sjkim	mflo	t_1
1467289848Sjkim	mfhi	t_2
1468289848Sjkim	daddu	c_1,t_1
1469289848Sjkim	sltu	AT,c_1,t_1
1470289848Sjkim	daddu	t_2,AT
1471289848Sjkim	daddu	c_2,t_2
1472289848Sjkim	sltu	AT,c_2,t_2
1473289848Sjkim	daddu	c_3,AT
1474289848Sjkim	dmultu	a_3,b_0		/* mul_add_c(a[3],b[0],c1,c2,c3); */
1475289848Sjkim	mflo	t_1
1476289848Sjkim	mfhi	t_2
1477289848Sjkim	daddu	c_1,t_1
1478289848Sjkim	sltu	AT,c_1,t_1
1479289848Sjkim	daddu	t_2,AT
1480289848Sjkim	daddu	c_2,t_2
1481289848Sjkim	sltu	AT,c_2,t_2
1482289848Sjkim	daddu	c_3,AT
1483289848Sjkim	sd	c_1,24(a0)
1484289848Sjkim
1485289848Sjkim	dmultu	a_3,b_1		/* mul_add_c(a[3],b[1],c2,c3,c1); */
1486289848Sjkim	mflo	t_1
1487289848Sjkim	mfhi	t_2
1488289848Sjkim	daddu	c_2,t_1
1489289848Sjkim	sltu	AT,c_2,t_1
1490289848Sjkim	daddu	t_2,AT
1491289848Sjkim	daddu	c_3,t_2
1492289848Sjkim	sltu	c_1,c_3,t_2
1493289848Sjkim	dmultu	a_2,b_2		/* mul_add_c(a[2],b[2],c2,c3,c1); */
1494289848Sjkim	mflo	t_1
1495289848Sjkim	mfhi	t_2
1496289848Sjkim	daddu	c_2,t_1
1497289848Sjkim	sltu	AT,c_2,t_1
1498289848Sjkim	daddu	t_2,AT
1499289848Sjkim	daddu	c_3,t_2
1500289848Sjkim	sltu	AT,c_3,t_2
1501289848Sjkim	daddu	c_1,AT
1502289848Sjkim	dmultu	a_1,b_3		/* mul_add_c(a[1],b[3],c2,c3,c1); */
1503289848Sjkim	mflo	t_1
1504289848Sjkim	mfhi	t_2
1505289848Sjkim	daddu	c_2,t_1
1506289848Sjkim	sltu	AT,c_2,t_1
1507289848Sjkim	daddu	t_2,AT
1508289848Sjkim	daddu	c_3,t_2
1509289848Sjkim	sltu	AT,c_3,t_2
1510289848Sjkim	daddu	c_1,AT
1511289848Sjkim	sd	c_2,32(a0)
1512289848Sjkim
1513289848Sjkim	dmultu	a_2,b_3		/* mul_add_c(a[2],b[3],c3,c1,c2); */
1514289848Sjkim	mflo	t_1
1515289848Sjkim	mfhi	t_2
1516289848Sjkim	daddu	c_3,t_1
1517289848Sjkim	sltu	AT,c_3,t_1
1518289848Sjkim	daddu	t_2,AT
1519289848Sjkim	daddu	c_1,t_2
1520289848Sjkim	sltu	c_2,c_1,t_2
1521289848Sjkim	dmultu	a_3,b_2		/* mul_add_c(a[3],b[2],c3,c1,c2); */
1522289848Sjkim	mflo	t_1
1523289848Sjkim	mfhi	t_2
1524289848Sjkim	daddu	c_3,t_1
1525289848Sjkim	sltu	AT,c_3,t_1
1526289848Sjkim	daddu	t_2,AT
1527289848Sjkim	daddu	c_1,t_2
1528289848Sjkim	sltu	AT,c_1,t_2
1529289848Sjkim	daddu	c_2,AT
1530289848Sjkim	sd	c_3,40(a0)
1531289848Sjkim
1532289848Sjkim	dmultu	a_3,b_3		/* mul_add_c(a[3],b[3],c1,c2,c3); */
1533289848Sjkim	mflo	t_1
1534289848Sjkim	mfhi	t_2
1535289848Sjkim	daddu	c_1,t_1
1536289848Sjkim	sltu	AT,c_1,t_1
1537289848Sjkim	daddu	t_2,AT
1538289848Sjkim	daddu	c_2,t_2
1539289848Sjkim	sd	c_1,48(a0)
1540289848Sjkim	sd	c_2,56(a0)
1541289848Sjkim
1542289848Sjkim	jr	ra
1543289848SjkimEND(bn_mul_comba4)
1544289848Sjkim
1545289848Sjkim#undef	a_4
1546289848Sjkim#undef	a_5
1547289848Sjkim#undef	a_6
1548289848Sjkim#undef	a_7
1549289848Sjkim#define	a_4	b_0
1550289848Sjkim#define	a_5	b_1
1551289848Sjkim#define	a_6	b_2
1552289848Sjkim#define	a_7	b_3
1553289848Sjkim
1554289848Sjkim.align	5
1555289848SjkimLEAF(bn_sqr_comba8)
1556289848Sjkim	.set	reorder
1557289848Sjkim	ld	a_0,0(a1)
1558289848Sjkim	ld	a_1,8(a1)
1559289848Sjkim	ld	a_2,16(a1)
1560289848Sjkim	ld	a_3,24(a1)
1561289848Sjkim
1562289848Sjkim	dmultu	a_0,a_0		/* mul_add_c(a[0],b[0],c1,c2,c3); */
1563289848Sjkim	ld	a_4,32(a1)
1564289848Sjkim	ld	a_5,40(a1)
1565289848Sjkim	ld	a_6,48(a1)
1566289848Sjkim	ld	a_7,56(a1)
1567289848Sjkim	mflo	c_1
1568289848Sjkim	mfhi	c_2
1569289848Sjkim	sd	c_1,0(a0)
1570289848Sjkim
1571289848Sjkim	dmultu	a_0,a_1		/* mul_add_c2(a[0],b[1],c2,c3,c1); */
1572289848Sjkim	mflo	t_1
1573289848Sjkim	mfhi	t_2
1574289848Sjkim	slt	c_1,t_2,zero
1575289848Sjkim	dsll	t_2,1
1576289848Sjkim	slt	a2,t_1,zero
1577289848Sjkim	daddu	t_2,a2
1578289848Sjkim	dsll	t_1,1
1579289848Sjkim	daddu	c_2,t_1
1580289848Sjkim	sltu	AT,c_2,t_1
1581289848Sjkim	daddu	c_3,t_2,AT
1582289848Sjkim	sd	c_2,8(a0)
1583289848Sjkim
1584289848Sjkim	dmultu	a_2,a_0		/* mul_add_c2(a[2],b[0],c3,c1,c2); */
1585289848Sjkim	mflo	t_1
1586289848Sjkim	mfhi	t_2
1587289848Sjkim	slt	c_2,t_2,zero
1588289848Sjkim	dsll	t_2,1
1589289848Sjkim	slt	a2,t_1,zero
1590289848Sjkim	daddu	t_2,a2
1591289848Sjkim	dsll	t_1,1
1592289848Sjkim	daddu	c_3,t_1
1593289848Sjkim	sltu	AT,c_3,t_1
1594289848Sjkim	daddu	t_2,AT
1595289848Sjkim	daddu	c_1,t_2
1596289848Sjkim	sltu	AT,c_1,t_2
1597289848Sjkim	daddu	c_2,AT
1598289848Sjkim	dmultu	a_1,a_1		/* mul_add_c(a[1],b[1],c3,c1,c2); */
1599289848Sjkim	mflo	t_1
1600289848Sjkim	mfhi	t_2
1601289848Sjkim	daddu	c_3,t_1
1602289848Sjkim	sltu	AT,c_3,t_1
1603289848Sjkim	daddu	t_2,AT
1604289848Sjkim	daddu	c_1,t_2
1605289848Sjkim	sltu	AT,c_1,t_2
1606289848Sjkim	daddu	c_2,AT
1607289848Sjkim	sd	c_3,16(a0)
1608289848Sjkim
1609289848Sjkim	dmultu	a_0,a_3		/* mul_add_c2(a[0],b[3],c1,c2,c3); */
1610289848Sjkim	mflo	t_1
1611289848Sjkim	mfhi	t_2
1612289848Sjkim	slt	c_3,t_2,zero
1613289848Sjkim	dsll	t_2,1
1614289848Sjkim	slt	a2,t_1,zero
1615289848Sjkim	daddu	t_2,a2
1616289848Sjkim	dsll	t_1,1
1617289848Sjkim	daddu	c_1,t_1
1618289848Sjkim	sltu	AT,c_1,t_1
1619289848Sjkim	daddu	t_2,AT
1620289848Sjkim	daddu	c_2,t_2
1621289848Sjkim	sltu	AT,c_2,t_2
1622289848Sjkim	daddu	c_3,AT
1623289848Sjkim	dmultu	a_1,a_2		/* mul_add_c2(a[1],b[2],c1,c2,c3); */
1624289848Sjkim	mflo	t_1
1625289848Sjkim	mfhi	t_2
1626289848Sjkim	slt	AT,t_2,zero
1627289848Sjkim	daddu	c_3,AT
1628289848Sjkim	dsll	t_2,1
1629289848Sjkim	slt	a2,t_1,zero
1630289848Sjkim	daddu	t_2,a2
1631289848Sjkim	dsll	t_1,1
1632289848Sjkim	daddu	c_1,t_1
1633289848Sjkim	sltu	AT,c_1,t_1
1634289848Sjkim	daddu	t_2,AT
1635289848Sjkim	daddu	c_2,t_2
1636289848Sjkim	sltu	AT,c_2,t_2
1637289848Sjkim	daddu	c_3,AT
1638289848Sjkim	sd	c_1,24(a0)
1639289848Sjkim
1640289848Sjkim	dmultu	a_4,a_0		/* mul_add_c2(a[4],b[0],c2,c3,c1); */
1641289848Sjkim	mflo	t_1
1642289848Sjkim	mfhi	t_2
1643289848Sjkim	slt	c_1,t_2,zero
1644289848Sjkim	dsll	t_2,1
1645289848Sjkim	slt	a2,t_1,zero
1646289848Sjkim	daddu	t_2,a2
1647289848Sjkim	dsll	t_1,1
1648289848Sjkim	daddu	c_2,t_1
1649289848Sjkim	sltu	AT,c_2,t_1
1650289848Sjkim	daddu	t_2,AT
1651289848Sjkim	daddu	c_3,t_2
1652289848Sjkim	sltu	AT,c_3,t_2
1653289848Sjkim	daddu	c_1,AT
1654289848Sjkim	dmultu	a_3,a_1		/* mul_add_c2(a[3],b[1],c2,c3,c1); */
1655289848Sjkim	mflo	t_1
1656289848Sjkim	mfhi	t_2
1657289848Sjkim	slt	AT,t_2,zero
1658289848Sjkim	daddu	c_1,AT
1659289848Sjkim	dsll	t_2,1
1660289848Sjkim	slt	a2,t_1,zero
1661289848Sjkim	daddu	t_2,a2
1662289848Sjkim	dsll	t_1,1
1663289848Sjkim	daddu	c_2,t_1
1664289848Sjkim	sltu	AT,c_2,t_1
1665289848Sjkim	daddu	t_2,AT
1666289848Sjkim	daddu	c_3,t_2
1667289848Sjkim	sltu	AT,c_3,t_2
1668289848Sjkim	daddu	c_1,AT
1669289848Sjkim	dmultu	a_2,a_2		/* mul_add_c(a[2],b[2],c2,c3,c1); */
1670289848Sjkim	mflo	t_1
1671289848Sjkim	mfhi	t_2
1672289848Sjkim	daddu	c_2,t_1
1673289848Sjkim	sltu	AT,c_2,t_1
1674289848Sjkim	daddu	t_2,AT
1675289848Sjkim	daddu	c_3,t_2
1676289848Sjkim	sltu	AT,c_3,t_2
1677289848Sjkim	daddu	c_1,AT
1678289848Sjkim	sd	c_2,32(a0)
1679289848Sjkim
1680289848Sjkim	dmultu	a_0,a_5		/* mul_add_c2(a[0],b[5],c3,c1,c2); */
1681289848Sjkim	mflo	t_1
1682289848Sjkim	mfhi	t_2
1683289848Sjkim	slt	c_2,t_2,zero
1684289848Sjkim	dsll	t_2,1
1685289848Sjkim	slt	a2,t_1,zero
1686289848Sjkim	daddu	t_2,a2
1687289848Sjkim	dsll	t_1,1
1688289848Sjkim	daddu	c_3,t_1
1689289848Sjkim	sltu	AT,c_3,t_1
1690289848Sjkim	daddu	t_2,AT
1691289848Sjkim	daddu	c_1,t_2
1692289848Sjkim	sltu	AT,c_1,t_2
1693289848Sjkim	daddu	c_2,AT
1694289848Sjkim	dmultu	a_1,a_4		/* mul_add_c2(a[1],b[4],c3,c1,c2); */
1695289848Sjkim	mflo	t_1
1696289848Sjkim	mfhi	t_2
1697289848Sjkim	slt	AT,t_2,zero
1698289848Sjkim	daddu	c_2,AT
1699289848Sjkim	dsll	t_2,1
1700289848Sjkim	slt	a2,t_1,zero
1701289848Sjkim	daddu	t_2,a2
1702289848Sjkim	dsll	t_1,1
1703289848Sjkim	daddu	c_3,t_1
1704289848Sjkim	sltu	AT,c_3,t_1
1705289848Sjkim	daddu	t_2,AT
1706289848Sjkim	daddu	c_1,t_2
1707289848Sjkim	sltu	AT,c_1,t_2
1708289848Sjkim	daddu	c_2,AT
1709289848Sjkim	dmultu	a_2,a_3		/* mul_add_c2(a[2],b[3],c3,c1,c2); */
1710289848Sjkim	mflo	t_1
1711289848Sjkim	mfhi	t_2
1712289848Sjkim	slt	AT,t_2,zero
1713289848Sjkim	daddu	c_2,AT
1714289848Sjkim	dsll	t_2,1
1715289848Sjkim	slt	a2,t_1,zero
1716289848Sjkim	daddu	t_2,a2
1717289848Sjkim	dsll	t_1,1
1718289848Sjkim	daddu	c_3,t_1
1719289848Sjkim	sltu	AT,c_3,t_1
1720289848Sjkim	daddu	t_2,AT
1721289848Sjkim	daddu	c_1,t_2
1722289848Sjkim	sltu	AT,c_1,t_2
1723289848Sjkim	daddu	c_2,AT
1724289848Sjkim	sd	c_3,40(a0)
1725289848Sjkim
1726289848Sjkim	dmultu	a_6,a_0		/* mul_add_c2(a[6],b[0],c1,c2,c3); */
1727289848Sjkim	mflo	t_1
1728289848Sjkim	mfhi	t_2
1729289848Sjkim	slt	c_3,t_2,zero
1730289848Sjkim	dsll	t_2,1
1731289848Sjkim	slt	a2,t_1,zero
1732289848Sjkim	daddu	t_2,a2
1733289848Sjkim	dsll	t_1,1
1734289848Sjkim	daddu	c_1,t_1
1735289848Sjkim	sltu	AT,c_1,t_1
1736289848Sjkim	daddu	t_2,AT
1737289848Sjkim	daddu	c_2,t_2
1738289848Sjkim	sltu	AT,c_2,t_2
1739289848Sjkim	daddu	c_3,AT
1740289848Sjkim	dmultu	a_5,a_1		/* mul_add_c2(a[5],b[1],c1,c2,c3); */
1741289848Sjkim	mflo	t_1
1742289848Sjkim	mfhi	t_2
1743289848Sjkim	slt	AT,t_2,zero
1744289848Sjkim	daddu	c_3,AT
1745289848Sjkim	dsll	t_2,1
1746289848Sjkim	slt	a2,t_1,zero
1747289848Sjkim	daddu	t_2,a2
1748289848Sjkim	dsll	t_1,1
1749289848Sjkim	daddu	c_1,t_1
1750289848Sjkim	sltu	AT,c_1,t_1
1751289848Sjkim	daddu	t_2,AT
1752289848Sjkim	daddu	c_2,t_2
1753289848Sjkim	sltu	AT,c_2,t_2
1754289848Sjkim	daddu	c_3,AT
1755289848Sjkim	dmultu	a_4,a_2		/* mul_add_c2(a[4],b[2],c1,c2,c3); */
1756289848Sjkim	mflo	t_1
1757289848Sjkim	mfhi	t_2
1758289848Sjkim	slt	AT,t_2,zero
1759289848Sjkim	daddu	c_3,AT
1760289848Sjkim	dsll	t_2,1
1761289848Sjkim	slt	a2,t_1,zero
1762289848Sjkim	daddu	t_2,a2
1763289848Sjkim	dsll	t_1,1
1764289848Sjkim	daddu	c_1,t_1
1765289848Sjkim	sltu	AT,c_1,t_1
1766289848Sjkim	daddu	t_2,AT
1767289848Sjkim	daddu	c_2,t_2
1768289848Sjkim	sltu	AT,c_2,t_2
1769289848Sjkim	daddu	c_3,AT
1770289848Sjkim	dmultu	a_3,a_3		/* mul_add_c(a[3],b[3],c1,c2,c3); */
1771289848Sjkim	mflo	t_1
1772289848Sjkim	mfhi	t_2
1773289848Sjkim	daddu	c_1,t_1
1774289848Sjkim	sltu	AT,c_1,t_1
1775289848Sjkim	daddu	t_2,AT
1776289848Sjkim	daddu	c_2,t_2
1777289848Sjkim	sltu	AT,c_2,t_2
1778289848Sjkim	daddu	c_3,AT
1779289848Sjkim	sd	c_1,48(a0)
1780289848Sjkim
1781289848Sjkim	dmultu	a_0,a_7		/* mul_add_c2(a[0],b[7],c2,c3,c1); */
1782289848Sjkim	mflo	t_1
1783289848Sjkim	mfhi	t_2
1784289848Sjkim	slt	c_1,t_2,zero
1785289848Sjkim	dsll	t_2,1
1786289848Sjkim	slt	a2,t_1,zero
1787289848Sjkim	daddu	t_2,a2
1788289848Sjkim	dsll	t_1,1
1789289848Sjkim	daddu	c_2,t_1
1790289848Sjkim	sltu	AT,c_2,t_1
1791289848Sjkim	daddu	t_2,AT
1792289848Sjkim	daddu	c_3,t_2
1793289848Sjkim	sltu	AT,c_3,t_2
1794289848Sjkim	daddu	c_1,AT
1795289848Sjkim	dmultu	a_1,a_6		/* mul_add_c2(a[1],b[6],c2,c3,c1); */
1796289848Sjkim	mflo	t_1
1797289848Sjkim	mfhi	t_2
1798289848Sjkim	slt	AT,t_2,zero
1799289848Sjkim	daddu	c_1,AT
1800289848Sjkim	dsll	t_2,1
1801289848Sjkim	slt	a2,t_1,zero
1802289848Sjkim	daddu	t_2,a2
1803289848Sjkim	dsll	t_1,1
1804289848Sjkim	daddu	c_2,t_1
1805289848Sjkim	sltu	AT,c_2,t_1
1806289848Sjkim	daddu	t_2,AT
1807289848Sjkim	daddu	c_3,t_2
1808289848Sjkim	sltu	AT,c_3,t_2
1809289848Sjkim	daddu	c_1,AT
1810289848Sjkim	dmultu	a_2,a_5		/* mul_add_c2(a[2],b[5],c2,c3,c1); */
1811289848Sjkim	mflo	t_1
1812289848Sjkim	mfhi	t_2
1813289848Sjkim	slt	AT,t_2,zero
1814289848Sjkim	daddu	c_1,AT
1815289848Sjkim	dsll	t_2,1
1816289848Sjkim	slt	a2,t_1,zero
1817289848Sjkim	daddu	t_2,a2
1818289848Sjkim	dsll	t_1,1
1819289848Sjkim	daddu	c_2,t_1
1820289848Sjkim	sltu	AT,c_2,t_1
1821289848Sjkim	daddu	t_2,AT
1822289848Sjkim	daddu	c_3,t_2
1823289848Sjkim	sltu	AT,c_3,t_2
1824289848Sjkim	daddu	c_1,AT
1825289848Sjkim	dmultu	a_3,a_4		/* mul_add_c2(a[3],b[4],c2,c3,c1); */
1826289848Sjkim	mflo	t_1
1827289848Sjkim	mfhi	t_2
1828289848Sjkim	slt	AT,t_2,zero
1829289848Sjkim	daddu	c_1,AT
1830289848Sjkim	dsll	t_2,1
1831289848Sjkim	slt	a2,t_1,zero
1832289848Sjkim	daddu	t_2,a2
1833289848Sjkim	dsll	t_1,1
1834289848Sjkim	daddu	c_2,t_1
1835289848Sjkim	sltu	AT,c_2,t_1
1836289848Sjkim	daddu	t_2,AT
1837289848Sjkim	daddu	c_3,t_2
1838289848Sjkim	sltu	AT,c_3,t_2
1839289848Sjkim	daddu	c_1,AT
1840289848Sjkim	sd	c_2,56(a0)
1841289848Sjkim
1842289848Sjkim	dmultu	a_7,a_1		/* mul_add_c2(a[7],b[1],c3,c1,c2); */
1843289848Sjkim	mflo	t_1
1844289848Sjkim	mfhi	t_2
1845289848Sjkim	slt	c_2,t_2,zero
1846289848Sjkim	dsll	t_2,1
1847289848Sjkim	slt	a2,t_1,zero
1848289848Sjkim	daddu	t_2,a2
1849289848Sjkim	dsll	t_1,1
1850289848Sjkim	daddu	c_3,t_1
1851289848Sjkim	sltu	AT,c_3,t_1
1852289848Sjkim	daddu	t_2,AT
1853289848Sjkim	daddu	c_1,t_2
1854289848Sjkim	sltu	AT,c_1,t_2
1855289848Sjkim	daddu	c_2,AT
1856289848Sjkim	dmultu	a_6,a_2		/* mul_add_c2(a[6],b[2],c3,c1,c2); */
1857289848Sjkim	mflo	t_1
1858289848Sjkim	mfhi	t_2
1859289848Sjkim	slt	AT,t_2,zero
1860289848Sjkim	daddu	c_2,AT
1861289848Sjkim	dsll	t_2,1
1862289848Sjkim	slt	a2,t_1,zero
1863289848Sjkim	daddu	t_2,a2
1864289848Sjkim	dsll	t_1,1
1865289848Sjkim	daddu	c_3,t_1
1866289848Sjkim	sltu	AT,c_3,t_1
1867289848Sjkim	daddu	t_2,AT
1868289848Sjkim	daddu	c_1,t_2
1869289848Sjkim	sltu	AT,c_1,t_2
1870289848Sjkim	daddu	c_2,AT
1871289848Sjkim	dmultu	a_5,a_3		/* mul_add_c2(a[5],b[3],c3,c1,c2); */
1872289848Sjkim	mflo	t_1
1873289848Sjkim	mfhi	t_2
1874289848Sjkim	slt	AT,t_2,zero
1875289848Sjkim	daddu	c_2,AT
1876289848Sjkim	dsll	t_2,1
1877289848Sjkim	slt	a2,t_1,zero
1878289848Sjkim	daddu	t_2,a2
1879289848Sjkim	dsll	t_1,1
1880289848Sjkim	daddu	c_3,t_1
1881289848Sjkim	sltu	AT,c_3,t_1
1882289848Sjkim	daddu	t_2,AT
1883289848Sjkim	daddu	c_1,t_2
1884289848Sjkim	sltu	AT,c_1,t_2
1885289848Sjkim	daddu	c_2,AT
1886289848Sjkim	dmultu	a_4,a_4		/* mul_add_c(a[4],b[4],c3,c1,c2); */
1887289848Sjkim	mflo	t_1
1888289848Sjkim	mfhi	t_2
1889289848Sjkim	daddu	c_3,t_1
1890289848Sjkim	sltu	AT,c_3,t_1
1891289848Sjkim	daddu	t_2,AT
1892289848Sjkim	daddu	c_1,t_2
1893289848Sjkim	sltu	AT,c_1,t_2
1894289848Sjkim	daddu	c_2,AT
1895289848Sjkim	sd	c_3,64(a0)
1896289848Sjkim
1897289848Sjkim	dmultu	a_2,a_7		/* mul_add_c2(a[2],b[7],c1,c2,c3); */
1898289848Sjkim	mflo	t_1
1899289848Sjkim	mfhi	t_2
1900289848Sjkim	slt	c_3,t_2,zero
1901289848Sjkim	dsll	t_2,1
1902289848Sjkim	slt	a2,t_1,zero
1903289848Sjkim	daddu	t_2,a2
1904289848Sjkim	dsll	t_1,1
1905289848Sjkim	daddu	c_1,t_1
1906289848Sjkim	sltu	AT,c_1,t_1
1907289848Sjkim	daddu	t_2,AT
1908289848Sjkim	daddu	c_2,t_2
1909289848Sjkim	sltu	AT,c_2,t_2
1910289848Sjkim	daddu	c_3,AT
1911289848Sjkim	dmultu	a_3,a_6		/* mul_add_c2(a[3],b[6],c1,c2,c3); */
1912289848Sjkim	mflo	t_1
1913289848Sjkim	mfhi	t_2
1914289848Sjkim	slt	AT,t_2,zero
1915289848Sjkim	daddu	c_3,AT
1916289848Sjkim	dsll	t_2,1
1917289848Sjkim	slt	a2,t_1,zero
1918289848Sjkim	daddu	t_2,a2
1919289848Sjkim	dsll	t_1,1
1920289848Sjkim	daddu	c_1,t_1
1921289848Sjkim	sltu	AT,c_1,t_1
1922289848Sjkim	daddu	t_2,AT
1923289848Sjkim	daddu	c_2,t_2
1924289848Sjkim	sltu	AT,c_2,t_2
1925289848Sjkim	daddu	c_3,AT
1926289848Sjkim	dmultu	a_4,a_5		/* mul_add_c2(a[4],b[5],c1,c2,c3); */
1927289848Sjkim	mflo	t_1
1928289848Sjkim	mfhi	t_2
1929289848Sjkim	slt	AT,t_2,zero
1930289848Sjkim	daddu	c_3,AT
1931289848Sjkim	dsll	t_2,1
1932289848Sjkim	slt	a2,t_1,zero
1933289848Sjkim	daddu	t_2,a2
1934289848Sjkim	dsll	t_1,1
1935289848Sjkim	daddu	c_1,t_1
1936289848Sjkim	sltu	AT,c_1,t_1
1937289848Sjkim	daddu	t_2,AT
1938289848Sjkim	daddu	c_2,t_2
1939289848Sjkim	sltu	AT,c_2,t_2
1940289848Sjkim	daddu	c_3,AT
1941289848Sjkim	sd	c_1,72(a0)
1942289848Sjkim
1943289848Sjkim	dmultu	a_7,a_3		/* mul_add_c2(a[7],b[3],c2,c3,c1); */
1944289848Sjkim	mflo	t_1
1945289848Sjkim	mfhi	t_2
1946289848Sjkim	slt	c_1,t_2,zero
1947289848Sjkim	dsll	t_2,1
1948289848Sjkim	slt	a2,t_1,zero
1949289848Sjkim	daddu	t_2,a2
1950289848Sjkim	dsll	t_1,1
1951289848Sjkim	daddu	c_2,t_1
1952289848Sjkim	sltu	AT,c_2,t_1
1953289848Sjkim	daddu	t_2,AT
1954289848Sjkim	daddu	c_3,t_2
1955289848Sjkim	sltu	AT,c_3,t_2
1956289848Sjkim	daddu	c_1,AT
1957289848Sjkim	dmultu	a_6,a_4		/* mul_add_c2(a[6],b[4],c2,c3,c1); */
1958289848Sjkim	mflo	t_1
1959289848Sjkim	mfhi	t_2
1960289848Sjkim	slt	AT,t_2,zero
1961289848Sjkim	daddu	c_1,AT
1962289848Sjkim	dsll	t_2,1
1963289848Sjkim	slt	a2,t_1,zero
1964289848Sjkim	daddu	t_2,a2
1965289848Sjkim	dsll	t_1,1
1966289848Sjkim	daddu	c_2,t_1
1967289848Sjkim	sltu	AT,c_2,t_1
1968289848Sjkim	daddu	t_2,AT
1969289848Sjkim	daddu	c_3,t_2
1970289848Sjkim	sltu	AT,c_3,t_2
1971289848Sjkim	daddu	c_1,AT
1972289848Sjkim	dmultu	a_5,a_5		/* mul_add_c(a[5],b[5],c2,c3,c1); */
1973289848Sjkim	mflo	t_1
1974289848Sjkim	mfhi	t_2
1975289848Sjkim	daddu	c_2,t_1
1976289848Sjkim	sltu	AT,c_2,t_1
1977289848Sjkim	daddu	t_2,AT
1978289848Sjkim	daddu	c_3,t_2
1979289848Sjkim	sltu	AT,c_3,t_2
1980289848Sjkim	daddu	c_1,AT
1981289848Sjkim	sd	c_2,80(a0)
1982289848Sjkim
1983289848Sjkim	dmultu	a_4,a_7		/* mul_add_c2(a[4],b[7],c3,c1,c2); */
1984289848Sjkim	mflo	t_1
1985289848Sjkim	mfhi	t_2
1986289848Sjkim	slt	c_2,t_2,zero
1987289848Sjkim	dsll	t_2,1
1988289848Sjkim	slt	a2,t_1,zero
1989289848Sjkim	daddu	t_2,a2
1990289848Sjkim	dsll	t_1,1
1991289848Sjkim	daddu	c_3,t_1
1992289848Sjkim	sltu	AT,c_3,t_1
1993289848Sjkim	daddu	t_2,AT
1994289848Sjkim	daddu	c_1,t_2
1995289848Sjkim	sltu	AT,c_1,t_2
1996289848Sjkim	daddu	c_2,AT
1997289848Sjkim	dmultu	a_5,a_6		/* mul_add_c2(a[5],b[6],c3,c1,c2); */
1998289848Sjkim	mflo	t_1
1999289848Sjkim	mfhi	t_2
2000289848Sjkim	slt	AT,t_2,zero
2001289848Sjkim	daddu	c_2,AT
2002289848Sjkim	dsll	t_2,1
2003289848Sjkim	slt	a2,t_1,zero
2004289848Sjkim	daddu	t_2,a2
2005289848Sjkim	dsll	t_1,1
2006289848Sjkim	daddu	c_3,t_1
2007289848Sjkim	sltu	AT,c_3,t_1
2008289848Sjkim	daddu	t_2,AT
2009289848Sjkim	daddu	c_1,t_2
2010289848Sjkim	sltu	AT,c_1,t_2
2011289848Sjkim	daddu	c_2,AT
2012289848Sjkim	sd	c_3,88(a0)
2013289848Sjkim
2014289848Sjkim	dmultu	a_7,a_5		/* mul_add_c2(a[7],b[5],c1,c2,c3); */
2015289848Sjkim	mflo	t_1
2016289848Sjkim	mfhi	t_2
2017289848Sjkim	slt	c_3,t_2,zero
2018289848Sjkim	dsll	t_2,1
2019289848Sjkim	slt	a2,t_1,zero
2020289848Sjkim	daddu	t_2,a2
2021289848Sjkim	dsll	t_1,1
2022289848Sjkim	daddu	c_1,t_1
2023289848Sjkim	sltu	AT,c_1,t_1
2024289848Sjkim	daddu	t_2,AT
2025289848Sjkim	daddu	c_2,t_2
2026289848Sjkim	sltu	AT,c_2,t_2
2027289848Sjkim	daddu	c_3,AT
2028289848Sjkim	dmultu	a_6,a_6		/* mul_add_c(a[6],b[6],c1,c2,c3); */
2029289848Sjkim	mflo	t_1
2030289848Sjkim	mfhi	t_2
2031289848Sjkim	daddu	c_1,t_1
2032289848Sjkim	sltu	AT,c_1,t_1
2033289848Sjkim	daddu	t_2,AT
2034289848Sjkim	daddu	c_2,t_2
2035289848Sjkim	sltu	AT,c_2,t_2
2036289848Sjkim	daddu	c_3,AT
2037289848Sjkim	sd	c_1,96(a0)
2038289848Sjkim
2039289848Sjkim	dmultu	a_6,a_7		/* mul_add_c2(a[6],b[7],c2,c3,c1); */
2040289848Sjkim	mflo	t_1
2041289848Sjkim	mfhi	t_2
2042289848Sjkim	slt	c_1,t_2,zero
2043289848Sjkim	dsll	t_2,1
2044289848Sjkim	slt	a2,t_1,zero
2045289848Sjkim	daddu	t_2,a2
2046289848Sjkim	dsll	t_1,1
2047289848Sjkim	daddu	c_2,t_1
2048289848Sjkim	sltu	AT,c_2,t_1
2049289848Sjkim	daddu	t_2,AT
2050289848Sjkim	daddu	c_3,t_2
2051289848Sjkim	sltu	AT,c_3,t_2
2052289848Sjkim	daddu	c_1,AT
2053289848Sjkim	sd	c_2,104(a0)
2054289848Sjkim
2055289848Sjkim	dmultu	a_7,a_7		/* mul_add_c(a[7],b[7],c3,c1,c2); */
2056289848Sjkim	mflo	t_1
2057289848Sjkim	mfhi	t_2
2058289848Sjkim	daddu	c_3,t_1
2059289848Sjkim	sltu	AT,c_3,t_1
2060289848Sjkim	daddu	t_2,AT
2061289848Sjkim	daddu	c_1,t_2
2062289848Sjkim	sd	c_3,112(a0)
2063289848Sjkim	sd	c_1,120(a0)
2064289848Sjkim
2065289848Sjkim	jr	ra
2066289848SjkimEND(bn_sqr_comba8)
2067289848Sjkim
2068289848Sjkim.align	5
2069289848SjkimLEAF(bn_sqr_comba4)
2070289848Sjkim	.set	reorder
2071289848Sjkim	ld	a_0,0(a1)
2072289848Sjkim	ld	a_1,8(a1)
2073289848Sjkim	ld	a_2,16(a1)
2074289848Sjkim	ld	a_3,24(a1)
2075289848Sjkim	dmultu	a_0,a_0		/* mul_add_c(a[0],b[0],c1,c2,c3); */
2076289848Sjkim	mflo	c_1
2077289848Sjkim	mfhi	c_2
2078289848Sjkim	sd	c_1,0(a0)
2079289848Sjkim
2080289848Sjkim	dmultu	a_0,a_1		/* mul_add_c2(a[0],b[1],c2,c3,c1); */
2081289848Sjkim	mflo	t_1
2082289848Sjkim	mfhi	t_2
2083289848Sjkim	slt	c_1,t_2,zero
2084289848Sjkim	dsll	t_2,1
2085289848Sjkim	slt	a2,t_1,zero
2086289848Sjkim	daddu	t_2,a2
2087289848Sjkim	dsll	t_1,1
2088289848Sjkim	daddu	c_2,t_1
2089289848Sjkim	sltu	AT,c_2,t_1
2090289848Sjkim	daddu	c_3,t_2,AT
2091289848Sjkim	sd	c_2,8(a0)
2092289848Sjkim
2093289848Sjkim	dmultu	a_2,a_0		/* mul_add_c2(a[2],b[0],c3,c1,c2); */
2094289848Sjkim	mflo	t_1
2095289848Sjkim	mfhi	t_2
2096289848Sjkim	slt	c_2,t_2,zero
2097289848Sjkim	dsll	t_2,1
2098289848Sjkim	slt	a2,t_1,zero
2099289848Sjkim	daddu	t_2,a2
2100289848Sjkim	dsll	t_1,1
2101289848Sjkim	daddu	c_3,t_1
2102289848Sjkim	sltu	AT,c_3,t_1
2103289848Sjkim	daddu	t_2,AT
2104289848Sjkim	daddu	c_1,t_2
2105289848Sjkim	sltu	AT,c_1,t_2
2106289848Sjkim	daddu	c_2,AT
2107289848Sjkim	dmultu	a_1,a_1		/* mul_add_c(a[1],b[1],c3,c1,c2); */
2108289848Sjkim	mflo	t_1
2109289848Sjkim	mfhi	t_2
2110289848Sjkim	daddu	c_3,t_1
2111289848Sjkim	sltu	AT,c_3,t_1
2112289848Sjkim	daddu	t_2,AT
2113289848Sjkim	daddu	c_1,t_2
2114289848Sjkim	sltu	AT,c_1,t_2
2115289848Sjkim	daddu	c_2,AT
2116289848Sjkim	sd	c_3,16(a0)
2117289848Sjkim
2118289848Sjkim	dmultu	a_0,a_3		/* mul_add_c2(a[0],b[3],c1,c2,c3); */
2119289848Sjkim	mflo	t_1
2120289848Sjkim	mfhi	t_2
2121289848Sjkim	slt	c_3,t_2,zero
2122289848Sjkim	dsll	t_2,1
2123289848Sjkim	slt	a2,t_1,zero
2124289848Sjkim	daddu	t_2,a2
2125289848Sjkim	dsll	t_1,1
2126289848Sjkim	daddu	c_1,t_1
2127289848Sjkim	sltu	AT,c_1,t_1
2128289848Sjkim	daddu	t_2,AT
2129289848Sjkim	daddu	c_2,t_2
2130289848Sjkim	sltu	AT,c_2,t_2
2131289848Sjkim	daddu	c_3,AT
2132289848Sjkim	dmultu	a_1,a_2		/* mul_add_c(a2[1],b[2],c1,c2,c3); */
2133289848Sjkim	mflo	t_1
2134289848Sjkim	mfhi	t_2
2135289848Sjkim	slt	AT,t_2,zero
2136289848Sjkim	daddu	c_3,AT
2137289848Sjkim	dsll	t_2,1
2138289848Sjkim	slt	a2,t_1,zero
2139289848Sjkim	daddu	t_2,a2
2140289848Sjkim	dsll	t_1,1
2141289848Sjkim	daddu	c_1,t_1
2142289848Sjkim	sltu	AT,c_1,t_1
2143289848Sjkim	daddu	t_2,AT
2144289848Sjkim	daddu	c_2,t_2
2145289848Sjkim	sltu	AT,c_2,t_2
2146289848Sjkim	daddu	c_3,AT
2147289848Sjkim	sd	c_1,24(a0)
2148289848Sjkim
2149289848Sjkim	dmultu	a_3,a_1		/* mul_add_c2(a[3],b[1],c2,c3,c1); */
2150289848Sjkim	mflo	t_1
2151289848Sjkim	mfhi	t_2
2152289848Sjkim	slt	c_1,t_2,zero
2153289848Sjkim	dsll	t_2,1
2154289848Sjkim	slt	a2,t_1,zero
2155289848Sjkim	daddu	t_2,a2
2156289848Sjkim	dsll	t_1,1
2157289848Sjkim	daddu	c_2,t_1
2158289848Sjkim	sltu	AT,c_2,t_1
2159289848Sjkim	daddu	t_2,AT
2160289848Sjkim	daddu	c_3,t_2
2161289848Sjkim	sltu	AT,c_3,t_2
2162289848Sjkim	daddu	c_1,AT
2163289848Sjkim	dmultu	a_2,a_2		/* mul_add_c(a[2],b[2],c2,c3,c1); */
2164289848Sjkim	mflo	t_1
2165289848Sjkim	mfhi	t_2
2166289848Sjkim	daddu	c_2,t_1
2167289848Sjkim	sltu	AT,c_2,t_1
2168289848Sjkim	daddu	t_2,AT
2169289848Sjkim	daddu	c_3,t_2
2170289848Sjkim	sltu	AT,c_3,t_2
2171289848Sjkim	daddu	c_1,AT
2172289848Sjkim	sd	c_2,32(a0)
2173289848Sjkim
2174289848Sjkim	dmultu	a_2,a_3		/* mul_add_c2(a[2],b[3],c3,c1,c2); */
2175289848Sjkim	mflo	t_1
2176289848Sjkim	mfhi	t_2
2177289848Sjkim	slt	c_2,t_2,zero
2178289848Sjkim	dsll	t_2,1
2179289848Sjkim	slt	a2,t_1,zero
2180289848Sjkim	daddu	t_2,a2
2181289848Sjkim	dsll	t_1,1
2182289848Sjkim	daddu	c_3,t_1
2183289848Sjkim	sltu	AT,c_3,t_1
2184289848Sjkim	daddu	t_2,AT
2185289848Sjkim	daddu	c_1,t_2
2186289848Sjkim	sltu	AT,c_1,t_2
2187289848Sjkim	daddu	c_2,AT
2188289848Sjkim	sd	c_3,40(a0)
2189289848Sjkim
2190289848Sjkim	dmultu	a_3,a_3		/* mul_add_c(a[3],b[3],c1,c2,c3); */
2191289848Sjkim	mflo	t_1
2192289848Sjkim	mfhi	t_2
2193289848Sjkim	daddu	c_1,t_1
2194289848Sjkim	sltu	AT,c_1,t_1
2195289848Sjkim	daddu	t_2,AT
2196289848Sjkim	daddu	c_2,t_2
2197289848Sjkim	sd	c_1,48(a0)
2198289848Sjkim	sd	c_2,56(a0)
2199289848Sjkim
2200289848Sjkim	jr	ra
2201289848SjkimEND(bn_sqr_comba4)
2202