Minor MIPS III/IV tune-up.
[openssl.git] / crypto / bn / asm / mips3.s
1 .rdata
2 .asciiz "mips3.s, Version 1.0"
3 .asciiz "MIPS III/IV ISA artwork by Andy Polyakov <appro@fy.chalmers.se>"
4
5 /*
6  * ====================================================================
7  * Written by Andy Polyakov <appro@fy.chalmers.se> for the OpenSSL
8  * project.
9  *
10  * Rights for redistribution and usage in source and binary forms are
11  * granted according to the OpenSSL license. Warranty of any kind is
12  * disclaimed.
13  * ====================================================================
14  */
15
16 /*
17  * This is my modest contributon to the OpenSSL project (see
18  * http://www.openssl.org/ for more information about it) and is
19  * a drop-in MIPS III/IV ISA replacement for crypto/bn/bn_asm.c
20  * module. For updates see http://fy.chalmers.se/~appro/hpe/.
21  *
22  * The module is designed to work with either of the "new" MIPS ABI(5),
23  * namely N32 or N64, offered by IRIX 6.x. It's not ment to work under
24  * IRIX 5.x not only because it doesn't support new ABIs but also
25  * because 5.x kernels put R4x00 CPU into 32-bit mode and all those
26  * 64-bit instructions (daddu, dmultu, etc.) found below gonna only
27  * cause illegal instruction exception:-(
28  *
29  * In addition the code depends on preprocessor flags set up by MIPSpro
30  * compiler driver (either as or cc) and therefore (probably?) can't be
31  * compiled by the GNU assembler. GNU C driver manages fine though...
32  * I mean as long as -mmips-as is specified or is the default option,
33  * because then it simply invokes /usr/bin/as which in turn takes
34  * perfect care of the preprocessor definitions. Another neat feature
35  * offered by the MIPSpro assembler is an optimization pass. This gave
36  * me the opportunity to have the code looking more regular as all those
37  * architecture dependent instruction rescheduling details were left to
38  * the assembler. Cool, huh?
39  *
40  * Performance improvement is astonishing! 'apps/openssl speed rsa dsa'
41  * goes way over 3 times faster!
42  *
43  *                                      <appro@fy.chalmers.se>
44  */
45 #include <asm.h>
46 #include <regdef.h>
47
48 #if _MIPS_ISA>=4
49 #define MOVNZ(cond,dst,src)     \
50         movn    dst,src,cond
51 #else
52 #define MOVNZ(cond,dst,src)     \
53         .set    noreorder;      \
54         bnezl   cond,.+8;       \
55         move    dst,src;        \
56         .set    reorder
57 #endif
58
59 .text
60
61 .set    noat
62 .set    reorder
63
64 #define MINUS4  v1
65
66 .align  5
67 LEAF(bn_mul_add_words)
68         .set    noreorder
69         bgtzl   a2,.L_bn_mul_add_words_proceed
70         ld      t0,0(a1)
71         jr      ra
72         move    v0,zero
73         .set    reorder
74
75 .L_bn_mul_add_words_proceed:
76         li      MINUS4,-4
77         and     ta0,a2,MINUS4
78         move    v0,zero
79         beqz    ta0,.L_bn_mul_add_words_tail
80
81 .L_bn_mul_add_words_loop:
82         dmultu  t0,a3
83         ld      t1,0(a0)
84         ld      t2,8(a1)
85         ld      t3,8(a0)
86         ld      ta0,16(a1)
87         ld      ta1,16(a0)
88         daddu   t1,v0
89         sltu    v0,t1,v0        /* All manuals say it "compares 32-bit
90                                  * values", but it seems to work fine
91                                  * even on 64-bit registers. */
92         mflo    AT
93         mfhi    t0
94         daddu   t1,AT
95         daddu   v0,t0
96         sltu    AT,t1,AT
97         sd      t1,0(a0)
98         daddu   v0,AT
99
100         dmultu  t2,a3
101         ld      ta2,24(a1)
102         ld      ta3,24(a0)
103         daddu   t3,v0
104         sltu    v0,t3,v0
105         mflo    AT
106         mfhi    t2
107         daddu   t3,AT
108         daddu   v0,t2
109         sltu    AT,t3,AT
110         sd      t3,8(a0)
111         daddu   v0,AT
112
113         dmultu  ta0,a3
114         subu    a2,4
115         PTR_ADD a0,32
116         PTR_ADD a1,32
117         daddu   ta1,v0
118         sltu    v0,ta1,v0
119         mflo    AT
120         mfhi    ta0
121         daddu   ta1,AT
122         daddu   v0,ta0
123         sltu    AT,ta1,AT
124         sd      ta1,-16(a0)
125         daddu   v0,AT
126
127
128         dmultu  ta2,a3
129         and     ta0,a2,MINUS4
130         daddu   ta3,v0
131         sltu    v0,ta3,v0
132         mflo    AT
133         mfhi    ta2
134         daddu   ta3,AT
135         daddu   v0,ta2
136         sltu    AT,ta3,AT
137         sd      ta3,-8(a0)
138         daddu   v0,AT
139         .set    noreorder
140         bgtzl   ta0,.L_bn_mul_add_words_loop
141         ld      t0,0(a1)
142
143         bnezl   a2,.L_bn_mul_add_words_tail
144         ld      t0,0(a1)
145         .set    reorder
146
147 .L_bn_mul_add_words_return:
148         jr      ra
149
150 .L_bn_mul_add_words_tail:
151         dmultu  t0,a3
152         ld      t1,0(a0)
153         subu    a2,1
154         daddu   t1,v0
155         sltu    v0,t1,v0
156         mflo    AT
157         mfhi    t0
158         daddu   t1,AT
159         daddu   v0,t0
160         sltu    AT,t1,AT
161         sd      t1,0(a0)
162         daddu   v0,AT
163         beqz    a2,.L_bn_mul_add_words_return
164
165         ld      t0,8(a1)
166         dmultu  t0,a3
167         ld      t1,8(a0)
168         subu    a2,1
169         daddu   t1,v0
170         sltu    v0,t1,v0
171         mflo    AT
172         mfhi    t0
173         daddu   t1,AT
174         daddu   v0,t0
175         sltu    AT,t1,AT
176         sd      t1,8(a0)
177         daddu   v0,AT
178         beqz    a2,.L_bn_mul_add_words_return
179
180         ld      t0,16(a1)
181         dmultu  t0,a3
182         ld      t1,16(a0)
183         daddu   t1,v0
184         sltu    v0,t1,v0
185         mflo    AT
186         mfhi    t0
187         daddu   t1,AT
188         daddu   v0,t0
189         sltu    AT,t1,AT
190         sd      t1,16(a0)
191         daddu   v0,AT
192         jr      ra
193 END(bn_mul_add_words)
194
195 .align  5
196 LEAF(bn_mul_words)
197         .set    noreorder
198         bgtzl   a2,.L_bn_mul_words_proceed
199         ld      t0,0(a1)
200         jr      ra
201         move    v0,zero
202         .set    reorder
203
204 .L_bn_mul_words_proceed:
205         li      MINUS4,-4
206         and     ta0,a2,MINUS4
207         move    v0,zero
208         beqz    ta0,.L_bn_mul_words_tail
209
210 .L_bn_mul_words_loop:
211         dmultu  t0,a3
212         ld      t2,8(a1)
213         ld      ta0,16(a1)
214         ld      ta2,24(a1)
215         mflo    AT
216         mfhi    t0
217         daddu   v0,AT
218         sltu    t1,v0,AT
219         sd      v0,0(a0)
220         daddu   v0,t1,t0
221
222         dmultu  t2,a3
223         subu    a2,4
224         PTR_ADD a0,32
225         PTR_ADD a1,32
226         mflo    AT
227         mfhi    t2
228         daddu   v0,AT
229         sltu    t3,v0,AT
230         sd      v0,-24(a0)
231         daddu   v0,t3,t2
232
233         dmultu  ta0,a3
234         mflo    AT
235         mfhi    ta0
236         daddu   v0,AT
237         sltu    ta1,v0,AT
238         sd      v0,-16(a0)
239         daddu   v0,ta1,ta0
240
241
242         dmultu  ta2,a3
243         and     ta0,a2,MINUS4
244         mflo    AT
245         mfhi    ta2
246         daddu   v0,AT
247         sltu    ta3,v0,AT
248         sd      v0,-8(a0)
249         daddu   v0,ta3,ta2
250         .set    noreorder
251         bgtzl   ta0,.L_bn_mul_words_loop
252         ld      t0,0(a1)
253
254         bnezl   a2,.L_bn_mul_words_tail
255         ld      t0,0(a1)
256         .set    reorder
257
258 .L_bn_mul_words_return:
259         jr      ra
260
261 .L_bn_mul_words_tail:
262         dmultu  t0,a3
263         subu    a2,1
264         mflo    AT
265         mfhi    t0
266         daddu   v0,AT
267         sltu    t1,v0,AT
268         sd      v0,0(a0)
269         daddu   v0,t1,t0
270         beqz    a2,.L_bn_mul_words_return
271
272         ld      t0,8(a1)
273         dmultu  t0,a3
274         subu    a2,1
275         mflo    AT
276         mfhi    t0
277         daddu   v0,AT
278         sltu    t1,v0,AT
279         sd      v0,8(a0)
280         daddu   v0,t1,t0
281         beqz    a2,.L_bn_mul_words_return
282
283         ld      t0,16(a1)
284         dmultu  t0,a3
285         mflo    AT
286         mfhi    t0
287         daddu   v0,AT
288         sltu    t1,v0,AT
289         sd      v0,16(a0)
290         daddu   v0,t1,t0
291         jr      ra
292 END(bn_mul_words)
293
294 .align  5
295 LEAF(bn_sqr_words)
296         .set    noreorder
297         bgtzl   a2,.L_bn_sqr_words_proceed
298         ld      t0,0(a1)
299         jr      ra
300         move    v0,zero
301         .set    reorder
302
303 .L_bn_sqr_words_proceed:
304         li      MINUS4,-4
305         and     ta0,a2,MINUS4
306         move    v0,zero
307         beqz    ta0,.L_bn_sqr_words_tail
308
309 .L_bn_sqr_words_loop:
310         dmultu  t0,t0
311         ld      t2,8(a1)
312         ld      ta0,16(a1)
313         ld      ta2,24(a1)
314         mflo    t1
315         mfhi    t0
316         sd      t1,0(a0)
317         sd      t0,8(a0)
318
319         dmultu  t2,t2
320         subu    a2,4
321         PTR_ADD a0,64
322         PTR_ADD a1,32
323         mflo    t3
324         mfhi    t2
325         sd      t3,-48(a0)
326         sd      t2,-40(a0)
327
328         dmultu  ta0,ta0
329         mflo    ta1
330         mfhi    ta0
331         sd      ta1,-32(a0)
332         sd      ta0,-24(a0)
333
334
335         dmultu  ta2,ta2
336         and     ta0,a2,MINUS4
337         mflo    ta3
338         mfhi    ta2
339         sd      ta3,-16(a0)
340         sd      ta2,-8(a0)
341
342         .set    noreorder
343         bgtzl   ta0,.L_bn_sqr_words_loop
344         ld      t0,0(a1)
345
346         bnezl   a2,.L_bn_sqr_words_tail
347         ld      t0,0(a1)
348         .set    reorder
349
350 .L_bn_sqr_words_return:
351         move    v0,zero
352         jr      ra
353
354 .L_bn_sqr_words_tail:
355         dmultu  t0,t0
356         subu    a2,1
357         mflo    t1
358         mfhi    t0
359         sd      t1,0(a0)
360         sd      t0,8(a0)
361         beqz    a2,.L_bn_sqr_words_return
362
363         ld      t0,8(a1)
364         dmultu  t0,t0
365         subu    a2,1
366         mflo    t1
367         mfhi    t0
368         sd      t1,16(a0)
369         sd      t0,24(a0)
370         beqz    a2,.L_bn_sqr_words_return
371
372         ld      t0,16(a1)
373         dmultu  t0,t0
374         mflo    t1
375         mfhi    t0
376         sd      t1,32(a0)
377         sd      t0,40(a0)
378         jr      ra
379 END(bn_sqr_words)
380
381 .align  5
382 LEAF(bn_add_words)
383         .set    noreorder
384         bgtzl   a3,.L_bn_add_words_proceed
385         ld      t0,0(a1)
386         jr      ra
387         move    v0,zero
388         .set    reorder
389
390 .L_bn_add_words_proceed:
391         li      MINUS4,-4
392         and     AT,a3,MINUS4
393         move    v0,zero
394         beqz    AT,.L_bn_add_words_tail
395
396 .L_bn_add_words_loop:
397         ld      ta0,0(a2)
398         subu    a3,4
399         ld      t1,8(a1)
400         and     AT,a3,MINUS4
401         ld      t2,16(a1)
402         PTR_ADD a2,32
403         ld      t3,24(a1)
404         PTR_ADD a0,32
405         ld      ta1,-24(a2)
406         PTR_ADD a1,32
407         ld      ta2,-16(a2)
408         ld      ta3,-8(a2)
409         daddu   ta0,t0
410         sltu    t8,ta0,t0
411         daddu   t0,ta0,v0
412         sltu    v0,t0,ta0
413         sd      t0,-32(a0)
414         daddu   v0,t8
415
416         daddu   ta1,t1
417         sltu    t9,ta1,t1
418         daddu   t1,ta1,v0
419         sltu    v0,t1,ta1
420         sd      t1,-24(a0)
421         daddu   v0,t9
422
423         daddu   ta2,t2
424         sltu    t8,ta2,t2
425         daddu   t2,ta2,v0
426         sltu    v0,t2,ta2
427         sd      t2,-16(a0)
428         daddu   v0,t8
429         
430         daddu   ta3,t3
431         sltu    t9,ta3,t3
432         daddu   t3,ta3,v0
433         sltu    v0,t3,ta3
434         sd      t3,-8(a0)
435         daddu   v0,t9
436         
437         .set    noreorder
438         bgtzl   AT,.L_bn_add_words_loop
439         ld      t0,0(a1)
440
441         bnezl   a3,.L_bn_add_words_tail
442         ld      t0,0(a1)
443         .set    reorder
444
445 .L_bn_add_words_return:
446         jr      ra
447
448 .L_bn_add_words_tail:
449         ld      ta0,0(a2)
450         daddu   ta0,t0
451         subu    a3,1
452         sltu    t8,ta0,t0
453         daddu   t0,ta0,v0
454         sltu    v0,t0,ta0
455         sd      t0,0(a0)
456         daddu   v0,t8
457         beqz    a3,.L_bn_add_words_return
458
459         ld      t1,8(a1)
460         ld      ta1,8(a2)
461         daddu   ta1,t1
462         subu    a3,1
463         sltu    t9,ta1,t1
464         daddu   t1,ta1,v0
465         sltu    v0,t1,ta1
466         sd      t1,8(a0)
467         daddu   v0,t9
468         beqz    a3,.L_bn_add_words_return
469
470         ld      t2,16(a1)
471         ld      ta2,16(a2)
472         daddu   ta2,t2
473         sltu    t8,ta2,t2
474         daddu   t2,ta2,v0
475         sltu    v0,t2,ta2
476         sd      t2,16(a0)
477         daddu   v0,t8
478         jr      ra
479 END(bn_add_words)
480
481 .align  5
482 LEAF(bn_sub_words)
483         .set    noreorder
484         bgtzl   a3,.L_bn_sub_words_proceed
485         ld      t0,0(a1)
486         jr      ra
487         move    v0,zero
488         .set    reorder
489
490 .L_bn_sub_words_proceed:
491         li      MINUS4,-4
492         and     AT,a3,MINUS4
493         move    v0,zero
494         beqz    AT,.L_bn_sub_words_tail
495
496 .L_bn_sub_words_loop:
497         ld      ta0,0(a2)
498         subu    a3,4
499         ld      t1,8(a1)
500         and     AT,a3,MINUS4
501         ld      t2,16(a1)
502         PTR_ADD a2,32
503         ld      t3,24(a1)
504         PTR_ADD a0,32
505         ld      ta1,-24(a2)
506         PTR_ADD a1,32
507         ld      ta2,-16(a2)
508         ld      ta3,-8(a2)
509         sltu    t8,t0,ta0
510         dsubu   t0,ta0
511         dsubu   ta0,t0,v0
512         sd      ta0,-32(a0)
513         MOVNZ   (t0,v0,t8)
514
515         sltu    t9,t1,ta1
516         dsubu   t1,ta1
517         dsubu   ta1,t1,v0
518         sd      ta1,-24(a0)
519         MOVNZ   (t1,v0,t9)
520
521
522         sltu    t8,t2,ta2
523         dsubu   t2,ta2
524         dsubu   ta2,t2,v0
525         sd      ta2,-16(a0)
526         MOVNZ   (t2,v0,t8)
527
528         sltu    t9,t3,ta3
529         dsubu   t3,ta3
530         dsubu   ta3,t3,v0
531         sd      ta3,-8(a0)
532         MOVNZ   (t3,v0,t9)
533
534         .set    noreorder
535         bgtzl   AT,.L_bn_sub_words_loop
536         ld      t0,0(a1)
537
538         bnezl   a3,.L_bn_sub_words_tail
539         ld      t0,0(a1)
540         .set    reorder
541
542 .L_bn_sub_words_return:
543         jr      ra
544
545 .L_bn_sub_words_tail:
546         ld      ta0,0(a2)
547         subu    a3,1
548         sltu    t8,t0,ta0
549         dsubu   t0,ta0
550         dsubu   ta0,t0,v0
551         MOVNZ   (t0,v0,t8)
552         sd      ta0,0(a0)
553         beqz    a3,.L_bn_sub_words_return
554
555         ld      t1,8(a1)
556         subu    a3,1
557         ld      ta1,8(a2)
558         sltu    t9,t1,ta1
559         dsubu   t1,ta1
560         dsubu   ta1,t1,v0
561         MOVNZ   (t1,v0,t9)
562         sd      ta1,8(a0)
563         beqz    a3,.L_bn_sub_words_return
564
565         ld      t2,16(a1)
566         ld      ta2,16(a2)
567         sltu    t8,t2,ta2
568         dsubu   t2,ta2
569         dsubu   ta2,t2,v0
570         MOVNZ   (t2,v0,t8)
571         sd      ta2,16(a0)
572         jr      ra
573 END(bn_sub_words)
574
575 #undef  MINUS4
576
577 .align 5
578 LEAF(bn_div_3_words)
579         .set    reorder
580         move    a3,a0           /* we know that bn_div_words doesn't
581                                  * touch a3, ta2, ta3 and preserves a2
582                                  * so that we can save two arguments
583                                  * and return address in registers
584                                  * instead of stack:-)
585                                  */
586         ld      a0,(a3)
587         move    ta2,a1
588         ld      a1,-8(a3)
589         move    ta3,ra
590         move    v1,zero
591         li      v0,-1
592         beq     a0,a2,.L_bn_div_3_words_skip_div
593         bal     bn_div_words
594         move    ra,ta3
595 .L_bn_div_3_words_skip_div:
596         dmultu  ta2,v0
597         ld      t2,-16(a3)
598         move    ta0,zero
599         mfhi    t1
600         mflo    t0
601         sltu    t8,t1,v1
602 .L_bn_div_3_words_inner_loop:
603         bnez    t8,.L_bn_div_3_words_inner_loop_done
604         sgeu    AT,t2,t0
605         seq     t9,t1,v1
606         and     AT,t9
607         sltu    t3,t0,ta2
608         daddu   v1,a2
609         dsubu   t1,t3
610         dsubu   t0,ta2
611         sltu    t8,t1,v1
612         sltu    ta0,v1,a2
613         or      t8,ta0
614         .set    noreorder
615         beqzl   AT,.L_bn_div_3_words_inner_loop
616         dsubu   v0,1
617         .set    reorder
618 .L_bn_div_3_words_inner_loop_done:
619         jr      ra
620 END(bn_div_3_words)
621
622 .align  5
623 LEAF(bn_div_words)
624         .set    noreorder
625         bnezl   a2,.L_bn_div_words_proceed
626         move    v1,zero
627         jr      ra
628         li      v0,-1           /* I'd rather signal div-by-zero
629                                  * which can be done with 'break 7' */
630
631 .L_bn_div_words_proceed:
632         bltz    a2,.L_bn_div_words_body
633         move    t9,v1
634         dsll    a2,1
635         bgtz    a2,.-4
636         addu    t9,1
637
638         .set    reorder
639         negu    t1,t9
640         li      t2,-1
641         dsll    t2,t1
642         and     t2,a0
643         dsrl    AT,a1,t1
644         .set    noreorder
645         bnezl   t2,.+8
646         break   6               /* signal overflow */
647         .set    reorder
648         dsll    a0,t9
649         dsll    a1,t9
650         or      a0,AT
651
652 #define QT      ta0
653 #define HH      ta1
654 #define DH      v1
655 .L_bn_div_words_body:
656         dsrl    DH,a2,32
657         sgeu    AT,a0,a2
658         .set    noreorder
659         bnezl   AT,.+8
660         dsubu   a0,a2
661         .set    reorder
662
663         li      QT,-1
664         dsrl    HH,a0,32
665         dsrl    QT,32   /* q=0xffffffff */
666         beq     DH,HH,.L_bn_div_words_skip_div1
667         ddivu   zero,a0,DH
668         mflo    QT
669 .L_bn_div_words_skip_div1:
670         dmultu  a2,QT
671         dsll    t3,a0,32
672         dsrl    AT,a1,32
673         or      t3,AT
674         mflo    t0
675         mfhi    t1
676 .L_bn_div_words_inner_loop1:
677         sltu    t2,t3,t0
678         seq     t8,HH,t1
679         sltu    AT,HH,t1
680         and     t2,t8
681         sltu    v0,t0,a2
682         or      AT,t2
683         .set    noreorder
684         beqz    AT,.L_bn_div_words_inner_loop1_done
685         dsubu   t1,v0
686         dsubu   t0,a2
687         b       .L_bn_div_words_inner_loop1
688         dsubu   QT,1
689         .set    reorder
690 .L_bn_div_words_inner_loop1_done:
691
692         dsll    a1,32
693         dsubu   a0,t3,t0
694         dsll    v0,QT,32
695
696         li      QT,-1
697         dsrl    HH,a0,32
698         dsrl    QT,32   /* q=0xffffffff */
699         beq     DH,HH,.L_bn_div_words_skip_div2
700         ddivu   zero,a0,DH
701         mflo    QT
702 .L_bn_div_words_skip_div2:
703 #undef  DH
704         dmultu  a2,QT
705         dsll    t3,a0,32
706         dsrl    AT,a1,32
707         or      t3,AT
708         mflo    t0
709         mfhi    t1
710 .L_bn_div_words_inner_loop2:
711         sltu    t2,t3,t0
712         seq     t8,HH,t1
713         sltu    AT,HH,t1
714         and     t2,t8
715         sltu    v1,t0,a2
716         or      AT,t2
717         .set    noreorder
718         beqz    AT,.L_bn_div_words_inner_loop2_done
719         dsubu   t1,v1
720         dsubu   t0,a2
721         b       .L_bn_div_words_inner_loop2
722         dsubu   QT,1
723         .set    reorder
724 .L_bn_div_words_inner_loop2_done:       
725 #undef  HH
726
727         dsubu   a0,t3,t0
728         or      v0,QT
729         dsrl    v1,a0,t9        /* v1 contains remainder if anybody wants it */
730         dsrl    a2,t9           /* restore a2 */
731         jr      ra
732 #undef  QT
733 END(bn_div_words)
734
735 #define a_0     t0
736 #define a_1     t1
737 #define a_2     t2
738 #define a_3     t3
739 #define b_0     ta0
740 #define b_1     ta1
741 #define b_2     ta2
742 #define b_3     ta3
743
744 #define a_4     s0
745 #define a_5     s2
746 #define a_6     s4
747 #define a_7     a1      /* once we load a[7] we don't need a anymore */
748 #define b_4     s1
749 #define b_5     s3
750 #define b_6     s5
751 #define b_7     a2      /* once we load b[7] we don't need b anymore */
752
753 #define t_1     t8
754 #define t_2     t9
755
756 #define c_1     v0
757 #define c_2     v1
758 #define c_3     a3
759
760 #define FRAME_SIZE      48
761
762 .align  5
763 LEAF(bn_mul_comba8)
764         .set    noreorder
765         PTR_SUB sp,FRAME_SIZE
766         .frame  sp,64,ra
767         .set    reorder
768         ld      a_0,0(a1)       /* If compiled with -mips3 option on
769                                  * R5000 box assembler barks on this
770                                  * line with "shouldn't have mult/div
771                                  * as last instruction in bb (R10K
772                                  * bug)" warning. If anybody out there
773                                  * has a clue about how to circumvent
774                                  * this do send me a note.
775                                  *              <appro@fy.chalmers.se>
776                                  */
777         ld      b_0,0(a2)
778         ld      a_1,8(a1)
779         ld      a_2,16(a1)
780         ld      a_3,24(a1)
781         ld      b_1,8(a2)
782         ld      b_2,16(a2)
783         ld      b_3,24(a2)
784         dmultu  a_0,b_0         /* mul_add_c(a[0],b[0],c1,c2,c3); */
785         sd      s0,0(sp)
786         sd      s1,8(sp)
787         sd      s2,16(sp)
788         sd      s3,24(sp)
789         sd      s4,32(sp)
790         sd      s5,40(sp)
791         mflo    c_1
792         mfhi    c_2
793
794         dmultu  a_0,b_1         /* mul_add_c(a[0],b[1],c2,c3,c1); */
795         ld      a_4,32(a1)
796         ld      a_5,40(a1)
797         ld      a_6,48(a1)
798         ld      a_7,56(a1)
799         ld      b_4,32(a2)
800         ld      b_5,40(a2)
801         mflo    t_1
802         mfhi    t_2
803         daddu   c_2,t_1
804         sltu    AT,c_2,t_1
805         daddu   c_3,t_2,AT
806         dmultu  a_1,b_0         /* mul_add_c(a[1],b[0],c2,c3,c1); */
807         ld      b_6,48(a2)
808         ld      b_7,56(a2)
809         sd      c_1,0(a0)       /* r[0]=c1; */
810         mflo    t_1
811         mfhi    t_2
812         daddu   c_2,t_1
813         sltu    AT,c_2,t_1
814         daddu   t_2,AT
815         daddu   c_3,t_2
816         sltu    c_1,c_3,t_2
817         sd      c_2,8(a0)       /* r[1]=c2; */
818
819         dmultu  a_2,b_0         /* mul_add_c(a[2],b[0],c3,c1,c2); */
820         mflo    t_1
821         mfhi    t_2
822         daddu   c_3,t_1
823         sltu    AT,c_3,t_1
824         daddu   t_2,AT
825         daddu   c_1,t_2
826         dmultu  a_1,b_1         /* mul_add_c(a[1],b[1],c3,c1,c2); */
827         mflo    t_1
828         mfhi    t_2
829         daddu   c_3,t_1
830         sltu    AT,c_3,t_1
831         daddu   t_2,AT
832         daddu   c_1,t_2
833         sltu    c_2,c_1,t_2
834         dmultu  a_0,b_2         /* mul_add_c(a[0],b[2],c3,c1,c2); */
835         mflo    t_1
836         mfhi    t_2
837         daddu   c_3,t_1
838         sltu    AT,c_3,t_1
839         daddu   t_2,AT
840         daddu   c_1,t_2
841         sltu    AT,c_1,t_2
842         daddu   c_2,AT
843         sd      c_3,16(a0)      /* r[2]=c3; */
844
845         dmultu  a_0,b_3         /* mul_add_c(a[0],b[3],c1,c2,c3); */
846         mflo    t_1
847         mfhi    t_2
848         daddu   c_1,t_1
849         sltu    AT,c_1,t_1
850         daddu   t_2,AT
851         daddu   c_2,t_2
852         dmultu  a_1,b_2         /* mul_add_c(a[1],b[2],c1,c2,c3); */
853         mflo    t_1
854         mfhi    t_2
855         daddu   c_1,t_1
856         sltu    AT,c_1,t_1
857         daddu   t_2,AT
858         daddu   c_2,t_2
859         sltu    c_3,c_2,t_2
860         dmultu  a_2,b_1         /* mul_add_c(a[2],b[1],c1,c2,c3); */
861         mflo    t_1
862         mfhi    t_2
863         daddu   c_1,t_1
864         sltu    AT,c_1,t_1
865         daddu   t_2,AT
866         daddu   c_2,t_2
867         sltu    AT,c_2,t_2
868         daddu   c_3,AT
869         dmultu  a_3,b_0         /* mul_add_c(a[3],b[0],c1,c2,c3); */
870         mflo    t_1
871         mfhi    t_2
872         daddu   c_1,t_1
873         sltu    AT,c_1,t_1
874         daddu   t_2,AT
875         daddu   c_2,t_2
876         sltu    AT,c_2,t_2
877         daddu   c_3,AT
878         sd      c_1,24(a0)      /* r[3]=c1; */
879
880         dmultu  a_4,b_0         /* mul_add_c(a[4],b[0],c2,c3,c1); */
881         mflo    t_1
882         mfhi    t_2
883         daddu   c_2,t_1
884         sltu    AT,c_2,t_1
885         daddu   t_2,AT
886         daddu   c_3,t_2
887         dmultu  a_3,b_1         /* mul_add_c(a[3],b[1],c2,c3,c1); */
888         mflo    t_1
889         mfhi    t_2
890         daddu   c_2,t_1
891         sltu    AT,c_2,t_1
892         daddu   t_2,AT
893         daddu   c_3,t_2
894         sltu    c_1,c_3,t_2
895         dmultu  a_2,b_2         /* mul_add_c(a[2],b[2],c2,c3,c1); */
896         mflo    t_1
897         mfhi    t_2
898         daddu   c_2,t_1
899         sltu    AT,c_2,t_1
900         daddu   t_2,AT
901         daddu   c_3,t_2
902         sltu    AT,c_3,t_2
903         daddu   c_1,AT
904         dmultu  a_1,b_3         /* mul_add_c(a[1],b[3],c2,c3,c1); */
905         mflo    t_1
906         mfhi    t_2
907         daddu   c_2,t_1
908         sltu    AT,c_2,t_1
909         daddu   t_2,AT
910         daddu   c_3,t_2
911         sltu    AT,c_3,t_2
912         daddu   c_1,AT
913         dmultu  a_0,b_4         /* mul_add_c(a[0],b[4],c2,c3,c1); */
914         mflo    t_1
915         mfhi    t_2
916         daddu   c_2,t_1
917         sltu    AT,c_2,t_1
918         daddu   t_2,AT
919         daddu   c_3,t_2
920         sltu    AT,c_3,t_2
921         daddu   c_1,AT
922         sd      c_2,32(a0)      /* r[4]=c2; */
923
924         dmultu  a_0,b_5         /* mul_add_c(a[0],b[5],c3,c1,c2); */
925         mflo    t_1
926         mfhi    t_2
927         daddu   c_3,t_1
928         sltu    AT,c_3,t_1
929         daddu   t_2,AT
930         daddu   c_1,t_2
931         dmultu  a_1,b_4         /* mul_add_c(a[1],b[4],c3,c1,c2); */
932         mflo    t_1
933         mfhi    t_2
934         daddu   c_3,t_1
935         sltu    AT,c_3,t_1
936         daddu   t_2,AT
937         daddu   c_1,t_2
938         sltu    c_2,c_1,t_2
939         dmultu  a_2,b_3         /* mul_add_c(a[2],b[3],c3,c1,c2); */
940         mflo    t_1
941         mfhi    t_2
942         daddu   c_3,t_1
943         sltu    AT,c_3,t_1
944         daddu   t_2,AT
945         daddu   c_1,t_2
946         sltu    AT,c_1,t_2
947         daddu   c_2,AT
948         dmultu  a_3,b_2         /* mul_add_c(a[3],b[2],c3,c1,c2); */
949         mflo    t_1
950         mfhi    t_2
951         daddu   c_3,t_1
952         sltu    AT,c_3,t_1
953         daddu   t_2,AT
954         daddu   c_1,t_2
955         sltu    AT,c_1,t_2
956         daddu   c_2,AT
957         dmultu  a_4,b_1         /* mul_add_c(a[4],b[1],c3,c1,c2); */
958         mflo    t_1
959         mfhi    t_2
960         daddu   c_3,t_1
961         sltu    AT,c_3,t_1
962         daddu   t_2,AT
963         daddu   c_1,t_2
964         sltu    AT,c_1,t_2
965         daddu   c_2,AT
966         dmultu  a_5,b_0         /* mul_add_c(a[5],b[0],c3,c1,c2); */
967         mflo    t_1
968         mfhi    t_2
969         daddu   c_3,t_1
970         sltu    AT,c_3,t_1
971         daddu   t_2,AT
972         daddu   c_1,t_2
973         sltu    AT,c_1,t_2
974         daddu   c_2,AT
975         sd      c_3,40(a0)      /* r[5]=c3; */
976
977         dmultu  a_6,b_0         /* mul_add_c(a[6],b[0],c1,c2,c3); */
978         mflo    t_1
979         mfhi    t_2
980         daddu   c_1,t_1
981         sltu    AT,c_1,t_1
982         daddu   t_2,AT
983         daddu   c_2,t_2
984         dmultu  a_5,b_1         /* mul_add_c(a[5],b[1],c1,c2,c3); */
985         mflo    t_1
986         mfhi    t_2
987         daddu   c_1,t_1
988         sltu    AT,c_1,t_1
989         daddu   t_2,AT
990         daddu   c_2,t_2
991         sltu    c_3,c_2,t_2
992         dmultu  a_4,b_2         /* mul_add_c(a[4],b[2],c1,c2,c3); */
993         mflo    t_1
994         mfhi    t_2
995         daddu   c_1,t_1
996         sltu    AT,c_1,t_1
997         daddu   t_2,AT
998         daddu   c_2,t_2
999         sltu    AT,c_2,t_2
1000         daddu   c_3,AT
1001         dmultu  a_3,b_3         /* mul_add_c(a[3],b[3],c1,c2,c3); */
1002         mflo    t_1
1003         mfhi    t_2
1004         daddu   c_1,t_1
1005         sltu    AT,c_1,t_1
1006         daddu   t_2,AT
1007         daddu   c_2,t_2
1008         sltu    AT,c_2,t_2
1009         daddu   c_3,AT
1010         dmultu  a_2,b_4         /* mul_add_c(a[2],b[4],c1,c2,c3); */
1011         mflo    t_1
1012         mfhi    t_2
1013         daddu   c_1,t_1
1014         sltu    AT,c_1,t_1
1015         daddu   t_2,AT
1016         daddu   c_2,t_2
1017         sltu    AT,c_2,t_2
1018         daddu   c_3,AT
1019         dmultu  a_1,b_5         /* mul_add_c(a[1],b[5],c1,c2,c3); */
1020         mflo    t_1
1021         mfhi    t_2
1022         daddu   c_1,t_1
1023         sltu    AT,c_1,t_1
1024         daddu   t_2,AT
1025         daddu   c_2,t_2
1026         sltu    AT,c_2,t_2
1027         daddu   c_3,AT
1028         dmultu  a_0,b_6         /* mul_add_c(a[0],b[6],c1,c2,c3); */
1029         mflo    t_1
1030         mfhi    t_2
1031         daddu   c_1,t_1
1032         sltu    AT,c_1,t_1
1033         daddu   t_2,AT
1034         daddu   c_2,t_2
1035         sltu    AT,c_2,t_2
1036         daddu   c_3,AT
1037         sd      c_1,48(a0)      /* r[6]=c1; */
1038
1039         dmultu  a_0,b_7         /* mul_add_c(a[0],b[7],c2,c3,c1); */
1040         mflo    t_1
1041         mfhi    t_2
1042         daddu   c_2,t_1
1043         sltu    AT,c_2,t_1
1044         daddu   t_2,AT
1045         daddu   c_3,t_2
1046         dmultu  a_1,b_6         /* mul_add_c(a[1],b[6],c2,c3,c1); */
1047         mflo    t_1
1048         mfhi    t_2
1049         daddu   c_2,t_1
1050         sltu    AT,c_2,t_1
1051         daddu   t_2,AT
1052         daddu   c_3,t_2
1053         sltu    c_1,c_3,t_2
1054         dmultu  a_2,b_5         /* mul_add_c(a[2],b[5],c2,c3,c1); */
1055         mflo    t_1
1056         mfhi    t_2
1057         daddu   c_2,t_1
1058         sltu    AT,c_2,t_1
1059         daddu   t_2,AT
1060         daddu   c_3,t_2
1061         sltu    AT,c_3,t_2
1062         daddu   c_1,AT
1063         dmultu  a_3,b_4         /* mul_add_c(a[3],b[4],c2,c3,c1); */
1064         mflo    t_1
1065         mfhi    t_2
1066         daddu   c_2,t_1
1067         sltu    AT,c_2,t_1
1068         daddu   t_2,AT
1069         daddu   c_3,t_2
1070         sltu    AT,c_3,t_2
1071         daddu   c_1,AT
1072         dmultu  a_4,b_3         /* mul_add_c(a[4],b[3],c2,c3,c1); */
1073         mflo    t_1
1074         mfhi    t_2
1075         daddu   c_2,t_1
1076         sltu    AT,c_2,t_1
1077         daddu   t_2,AT
1078         daddu   c_3,t_2
1079         sltu    AT,c_3,t_2
1080         daddu   c_1,AT
1081         dmultu  a_5,b_2         /* mul_add_c(a[5],b[2],c2,c3,c1); */
1082         mflo    t_1
1083         mfhi    t_2
1084         daddu   c_2,t_1
1085         sltu    AT,c_2,t_1
1086         daddu   t_2,AT
1087         daddu   c_3,t_2
1088         sltu    AT,c_3,t_2
1089         daddu   c_1,AT
1090         dmultu  a_6,b_1         /* mul_add_c(a[6],b[1],c2,c3,c1); */
1091         mflo    t_1
1092         mfhi    t_2
1093         daddu   c_2,t_1
1094         sltu    AT,c_2,t_1
1095         daddu   t_2,AT
1096         daddu   c_3,t_2
1097         sltu    AT,c_3,t_2
1098         daddu   c_1,AT
1099         dmultu  a_7,b_0         /* mul_add_c(a[7],b[0],c2,c3,c1); */
1100         mflo    t_1
1101         mfhi    t_2
1102         daddu   c_2,t_1
1103         sltu    AT,c_2,t_1
1104         daddu   t_2,AT
1105         daddu   c_3,t_2
1106         sltu    AT,c_3,t_2
1107         daddu   c_1,AT
1108         sd      c_2,56(a0)      /* r[7]=c2; */
1109
1110         dmultu  a_7,b_1         /* mul_add_c(a[7],b[1],c3,c1,c2); */
1111         mflo    t_1
1112         mfhi    t_2
1113         daddu   c_3,t_1
1114         sltu    AT,c_3,t_1
1115         daddu   t_2,AT
1116         daddu   c_1,t_2
1117         dmultu  a_6,b_2         /* mul_add_c(a[6],b[2],c3,c1,c2); */
1118         mflo    t_1
1119         mfhi    t_2
1120         daddu   c_3,t_1
1121         sltu    AT,c_3,t_1
1122         daddu   t_2,AT
1123         daddu   c_1,t_2
1124         sltu    c_2,c_1,t_2
1125         dmultu  a_5,b_3         /* mul_add_c(a[5],b[3],c3,c1,c2); */
1126         mflo    t_1
1127         mfhi    t_2
1128         daddu   c_3,t_1
1129         sltu    AT,c_3,t_1
1130         daddu   t_2,AT
1131         daddu   c_1,t_2
1132         sltu    AT,c_1,t_2
1133         daddu   c_2,AT
1134         dmultu  a_4,b_4         /* mul_add_c(a[4],b[4],c3,c1,c2); */
1135         mflo    t_1
1136         mfhi    t_2
1137         daddu   c_3,t_1
1138         sltu    AT,c_3,t_1
1139         daddu   t_2,AT
1140         daddu   c_1,t_2
1141         sltu    AT,c_1,t_2
1142         daddu   c_2,AT
1143         dmultu  a_3,b_5         /* mul_add_c(a[3],b[5],c3,c1,c2); */
1144         mflo    t_1
1145         mfhi    t_2
1146         daddu   c_3,t_1
1147         sltu    AT,c_3,t_1
1148         daddu   t_2,AT
1149         daddu   c_1,t_2
1150         sltu    AT,c_1,t_2
1151         daddu   c_2,AT
1152         dmultu  a_2,b_6         /* mul_add_c(a[2],b[6],c3,c1,c2); */
1153         mflo    t_1
1154         mfhi    t_2
1155         daddu   c_3,t_1
1156         sltu    AT,c_3,t_1
1157         daddu   t_2,AT
1158         daddu   c_1,t_2
1159         sltu    AT,c_1,t_2
1160         daddu   c_2,AT
1161         dmultu  a_1,b_7         /* mul_add_c(a[1],b[7],c3,c1,c2); */
1162         mflo    t_1
1163         mfhi    t_2
1164         daddu   c_3,t_1
1165         sltu    AT,c_3,t_1
1166         daddu   t_2,AT
1167         daddu   c_1,t_2
1168         sltu    AT,c_1,t_2
1169         daddu   c_2,AT
1170         sd      c_3,64(a0)      /* r[8]=c3; */
1171
1172         dmultu  a_2,b_7         /* mul_add_c(a[2],b[7],c1,c2,c3); */
1173         mflo    t_1
1174         mfhi    t_2
1175         daddu   c_1,t_1
1176         sltu    AT,c_1,t_1
1177         daddu   t_2,AT
1178         daddu   c_2,t_2
1179         dmultu  a_3,b_6         /* mul_add_c(a[3],b[6],c1,c2,c3); */
1180         mflo    t_1
1181         mfhi    t_2
1182         daddu   c_1,t_1
1183         sltu    AT,c_1,t_1
1184         daddu   t_2,AT
1185         daddu   c_2,t_2
1186         sltu    c_3,c_2,t_2
1187         dmultu  a_4,b_5         /* mul_add_c(a[4],b[5],c1,c2,c3); */
1188         mflo    t_1
1189         mfhi    t_2
1190         daddu   c_1,t_1
1191         sltu    AT,c_1,t_1
1192         daddu   t_2,AT
1193         daddu   c_2,t_2
1194         sltu    AT,c_2,t_2
1195         daddu   c_3,AT
1196         dmultu  a_5,b_4         /* mul_add_c(a[5],b[4],c1,c2,c3); */
1197         mflo    t_1
1198         mfhi    t_2
1199         daddu   c_1,t_1
1200         sltu    AT,c_1,t_1
1201         daddu   t_2,AT
1202         daddu   c_2,t_2
1203         sltu    AT,c_2,t_2
1204         daddu   c_3,AT
1205         dmultu  a_6,b_3         /* mul_add_c(a[6],b[3],c1,c2,c3); */
1206         mflo    t_1
1207         mfhi    t_2
1208         daddu   c_1,t_1
1209         sltu    AT,c_1,t_1
1210         daddu   t_2,AT
1211         daddu   c_2,t_2
1212         sltu    AT,c_2,t_2
1213         daddu   c_3,AT
1214         dmultu  a_7,b_2         /* mul_add_c(a[7],b[2],c1,c2,c3); */
1215         mflo    t_1
1216         mfhi    t_2
1217         daddu   c_1,t_1
1218         sltu    AT,c_1,t_1
1219         daddu   t_2,AT
1220         daddu   c_2,t_2
1221         sltu    AT,c_2,t_2
1222         daddu   c_3,AT
1223         sd      c_1,72(a0)      /* r[9]=c1; */
1224
1225         dmultu  a_7,b_3         /* mul_add_c(a[7],b[3],c2,c3,c1); */
1226         mflo    t_1
1227         mfhi    t_2
1228         daddu   c_2,t_1
1229         sltu    AT,c_2,t_1
1230         daddu   t_2,AT
1231         daddu   c_3,t_2
1232         dmultu  a_6,b_4         /* mul_add_c(a[6],b[4],c2,c3,c1); */
1233         mflo    t_1
1234         mfhi    t_2
1235         daddu   c_2,t_1
1236         sltu    AT,c_2,t_1
1237         daddu   t_2,AT
1238         daddu   c_3,t_2
1239         sltu    c_1,c_3,t_2
1240         dmultu  a_5,b_5         /* mul_add_c(a[5],b[5],c2,c3,c1); */
1241         mflo    t_1
1242         mfhi    t_2
1243         daddu   c_2,t_1
1244         sltu    AT,c_2,t_1
1245         daddu   t_2,AT
1246         daddu   c_3,t_2
1247         sltu    AT,c_3,t_2
1248         daddu   c_1,AT
1249         dmultu  a_4,b_6         /* mul_add_c(a[4],b[6],c2,c3,c1); */
1250         mflo    t_1
1251         mfhi    t_2
1252         daddu   c_2,t_1
1253         sltu    AT,c_2,t_1
1254         daddu   t_2,AT
1255         daddu   c_3,t_2
1256         sltu    AT,c_3,t_2
1257         daddu   c_1,AT
1258         dmultu  a_3,b_7         /* mul_add_c(a[3],b[7],c2,c3,c1); */
1259         mflo    t_1
1260         mfhi    t_2
1261         daddu   c_2,t_1
1262         sltu    AT,c_2,t_1
1263         daddu   t_2,AT
1264         daddu   c_3,t_2
1265         sltu    AT,c_3,t_2
1266         daddu   c_1,AT
1267         sd      c_2,80(a0)      /* r[10]=c2; */
1268
1269         dmultu  a_4,b_7         /* mul_add_c(a[4],b[7],c3,c1,c2); */
1270         mflo    t_1
1271         mfhi    t_2
1272         daddu   c_3,t_1
1273         sltu    AT,c_3,t_1
1274         daddu   t_2,AT
1275         daddu   c_1,t_2
1276         dmultu  a_5,b_6         /* mul_add_c(a[5],b[6],c3,c1,c2); */
1277         mflo    t_1
1278         mfhi    t_2
1279         daddu   c_3,t_1
1280         sltu    AT,c_3,t_1
1281         daddu   t_2,AT
1282         daddu   c_1,t_2
1283         sltu    c_2,c_1,t_2
1284         dmultu  a_6,b_5         /* mul_add_c(a[6],b[5],c3,c1,c2); */
1285         mflo    t_1
1286         mfhi    t_2
1287         daddu   c_3,t_1
1288         sltu    AT,c_3,t_1
1289         daddu   t_2,AT
1290         daddu   c_1,t_2
1291         sltu    AT,c_1,t_2
1292         daddu   c_2,AT
1293         dmultu  a_7,b_4         /* mul_add_c(a[7],b[4],c3,c1,c2); */
1294         mflo    t_1
1295         mfhi    t_2
1296         daddu   c_3,t_1
1297         sltu    AT,c_3,t_1
1298         daddu   t_2,AT
1299         daddu   c_1,t_2
1300         sltu    AT,c_1,t_2
1301         daddu   c_2,AT
1302         sd      c_3,88(a0)      /* r[11]=c3; */
1303
1304         dmultu  a_7,b_5         /* mul_add_c(a[7],b[5],c1,c2,c3); */
1305         mflo    t_1
1306         mfhi    t_2
1307         daddu   c_1,t_1
1308         sltu    AT,c_1,t_1
1309         daddu   t_2,AT
1310         daddu   c_2,t_2
1311         dmultu  a_6,b_6         /* mul_add_c(a[6],b[6],c1,c2,c3); */
1312         mflo    t_1
1313         mfhi    t_2
1314         daddu   c_1,t_1
1315         sltu    AT,c_1,t_1
1316         daddu   t_2,AT
1317         daddu   c_2,t_2
1318         sltu    c_3,c_2,t_2
1319         dmultu  a_5,b_7         /* mul_add_c(a[5],b[7],c1,c2,c3); */
1320         mflo    t_1
1321         mfhi    t_2
1322         daddu   c_1,t_1
1323         sltu    AT,c_1,t_1
1324         daddu   t_2,AT
1325         daddu   c_2,t_2
1326         sltu    AT,c_2,t_2
1327         daddu   c_3,AT
1328         sd      c_1,96(a0)      /* r[12]=c1; */
1329
1330         dmultu  a_6,b_7         /* mul_add_c(a[6],b[7],c2,c3,c1); */
1331         mflo    t_1
1332         mfhi    t_2
1333         daddu   c_2,t_1
1334         sltu    AT,c_2,t_1
1335         daddu   t_2,AT
1336         daddu   c_3,t_2
1337         dmultu  a_7,b_6         /* mul_add_c(a[7],b[6],c2,c3,c1); */
1338         mflo    t_1
1339         mfhi    t_2
1340         daddu   c_2,t_1
1341         sltu    AT,c_2,t_1
1342         daddu   t_2,AT
1343         daddu   c_3,t_2
1344         sltu    c_1,c_3,t_2
1345         sd      c_2,104(a0)     /* r[13]=c2; */
1346
1347         dmultu  a_7,b_7         /* mul_add_c(a[7],b[7],c3,c1,c2); */
1348         ld      s0,0(sp)
1349         ld      s1,8(sp)
1350         ld      s2,16(sp)
1351         ld      s3,24(sp)
1352         ld      s4,32(sp)
1353         ld      s5,40(sp)
1354         mflo    t_1
1355         mfhi    t_2
1356         daddu   c_3,t_1
1357         sltu    AT,c_3,t_1
1358         daddu   t_2,AT
1359         daddu   c_1,t_2
1360         sd      c_3,112(a0)     /* r[14]=c3; */
1361         sd      c_1,120(a0)     /* r[15]=c1; */
1362
1363         PTR_ADD sp,FRAME_SIZE
1364
1365         jr      ra
1366 END(bn_mul_comba8)
1367
1368 .align  5
1369 LEAF(bn_mul_comba4)
1370         .set    reorder
1371         ld      a_0,0(a1)
1372         ld      b_0,0(a2)
1373         ld      a_1,8(a1)
1374         ld      a_2,16(a1)
1375         dmultu  a_0,b_0         /* mul_add_c(a[0],b[0],c1,c2,c3); */
1376         ld      a_3,24(a1)
1377         ld      b_1,8(a2)
1378         ld      b_2,16(a2)
1379         ld      b_3,24(a2)
1380         mflo    c_1
1381         mfhi    c_2
1382         sd      c_1,0(a0)
1383
1384         dmultu  a_0,b_1         /* mul_add_c(a[0],b[1],c2,c3,c1); */
1385         mflo    t_1
1386         mfhi    t_2
1387         daddu   c_2,t_1
1388         sltu    AT,c_2,t_1
1389         daddu   c_3,t_2,AT
1390         dmultu  a_1,b_0         /* mul_add_c(a[1],b[0],c2,c3,c1); */
1391         mflo    t_1
1392         mfhi    t_2
1393         daddu   c_2,t_1
1394         sltu    AT,c_2,t_1
1395         daddu   t_2,AT
1396         daddu   c_3,t_2
1397         sltu    c_1,c_3,t_2
1398         sd      c_2,8(a0)
1399
1400         dmultu  a_2,b_0         /* mul_add_c(a[2],b[0],c3,c1,c2); */
1401         mflo    t_1
1402         mfhi    t_2
1403         daddu   c_3,t_1
1404         sltu    AT,c_3,t_1
1405         daddu   t_2,AT
1406         daddu   c_1,t_2
1407         dmultu  a_1,b_1         /* mul_add_c(a[1],b[1],c3,c1,c2); */
1408         mflo    t_1
1409         mfhi    t_2
1410         daddu   c_3,t_1
1411         sltu    AT,c_3,t_1
1412         daddu   t_2,AT
1413         daddu   c_1,t_2
1414         sltu    c_2,c_1,t_2
1415         dmultu  a_0,b_2         /* mul_add_c(a[0],b[2],c3,c1,c2); */
1416         mflo    t_1
1417         mfhi    t_2
1418         daddu   c_3,t_1
1419         sltu    AT,c_3,t_1
1420         daddu   t_2,AT
1421         daddu   c_1,t_2
1422         sltu    AT,c_1,t_2
1423         daddu   c_2,AT
1424         sd      c_3,16(a0)
1425
1426         dmultu  a_0,b_3         /* mul_add_c(a[0],b[3],c1,c2,c3); */
1427         mflo    t_1
1428         mfhi    t_2
1429         daddu   c_1,t_1
1430         sltu    AT,c_1,t_1
1431         daddu   t_2,AT
1432         daddu   c_2,t_2
1433         dmultu  a_1,b_2         /* mul_add_c(a[1],b[2],c1,c2,c3); */
1434         mflo    t_1
1435         mfhi    t_2
1436         daddu   c_1,t_1
1437         sltu    AT,c_1,t_1
1438         daddu   t_2,AT
1439         daddu   c_2,t_2
1440         sltu    c_3,c_2,t_2
1441         dmultu  a_2,b_1         /* mul_add_c(a[2],b[1],c1,c2,c3); */
1442         mflo    t_1
1443         mfhi    t_2
1444         daddu   c_1,t_1
1445         sltu    AT,c_1,t_1
1446         daddu   t_2,AT
1447         daddu   c_2,t_2
1448         sltu    AT,c_2,t_2
1449         daddu   c_3,AT
1450         dmultu  a_3,b_0         /* mul_add_c(a[3],b[0],c1,c2,c3); */
1451         mflo    t_1
1452         mfhi    t_2
1453         daddu   c_1,t_1
1454         sltu    AT,c_1,t_1
1455         daddu   t_2,AT
1456         daddu   c_2,t_2
1457         sltu    AT,c_2,t_2
1458         daddu   c_3,AT
1459         sd      c_1,24(a0)
1460
1461         dmultu  a_3,b_1         /* mul_add_c(a[3],b[1],c2,c3,c1); */
1462         mflo    t_1
1463         mfhi    t_2
1464         daddu   c_2,t_1
1465         sltu    AT,c_2,t_1
1466         daddu   t_2,AT
1467         daddu   c_3,t_2
1468         dmultu  a_2,b_2         /* mul_add_c(a[2],b[2],c2,c3,c1); */
1469         mflo    t_1
1470         mfhi    t_2
1471         daddu   c_2,t_1
1472         sltu    AT,c_2,t_1
1473         daddu   t_2,AT
1474         daddu   c_3,t_2
1475         sltu    c_1,c_3,t_2
1476         dmultu  a_1,b_3         /* mul_add_c(a[1],b[3],c2,c3,c1); */
1477         mflo    t_1
1478         mfhi    t_2
1479         daddu   c_2,t_1
1480         sltu    AT,c_2,t_1
1481         daddu   t_2,AT
1482         daddu   c_3,t_2
1483         sltu    AT,c_3,t_2
1484         daddu   c_1,AT
1485         sd      c_2,32(a0)
1486
1487         dmultu  a_2,b_3         /* mul_add_c(a[2],b[3],c3,c1,c2); */
1488         mflo    t_1
1489         mfhi    t_2
1490         daddu   c_3,t_1
1491         sltu    AT,c_3,t_1
1492         daddu   t_2,AT
1493         daddu   c_1,t_2
1494         dmultu  a_3,b_2         /* mul_add_c(a[3],b[2],c3,c1,c2); */
1495         mflo    t_1
1496         mfhi    t_2
1497         daddu   c_3,t_1
1498         sltu    AT,c_3,t_1
1499         daddu   t_2,AT
1500         daddu   c_1,t_2
1501         sltu    c_2,c_1,t_2
1502         sd      c_3,40(a0)
1503
1504         dmultu  a_3,b_3         /* mul_add_c(a[3],b[3],c1,c2,c3); */
1505         mflo    t_1
1506         mfhi    t_2
1507         daddu   c_1,t_1
1508         sltu    AT,c_1,t_1
1509         daddu   t_2,AT
1510         daddu   c_2,t_2
1511         sd      c_1,48(a0)
1512         sd      c_2,56(a0)
1513
1514         jr      ra
1515 END(bn_mul_comba4)
1516
1517 #undef  a_4
1518 #undef  a_5
1519 #undef  a_6
1520 #undef  a_7
1521 #define a_4     b_0
1522 #define a_5     b_1
1523 #define a_6     b_2
1524 #define a_7     b_3
1525
1526 .align  5
1527 LEAF(bn_sqr_comba8)
1528         .set    reorder
1529         ld      a_0,0(a1)
1530         ld      a_1,8(a1)
1531         ld      a_2,16(a1)
1532         ld      a_3,24(a1)
1533
1534         dmultu  a_0,a_0         /* mul_add_c(a[0],b[0],c1,c2,c3); */
1535         ld      a_4,32(a1)
1536         ld      a_5,40(a1)
1537         ld      a_6,48(a1)
1538         ld      a_7,56(a1)
1539         mflo    c_1
1540         mfhi    c_2
1541         sd      c_1,0(a0)
1542
1543         dmultu  a_0,a_1         /* mul_add_c2(a[0],b[1],c2,c3,c1); */
1544         mflo    t_1
1545         mfhi    t_2
1546         daddu   c_2,t_1
1547         sltu    AT,c_2,t_1
1548         daddu   c_3,t_2,AT
1549         daddu   c_2,t_1
1550         sltu    AT,c_2,t_1
1551         daddu   t_2,AT
1552         daddu   c_3,t_2
1553         sltu    c_1,c_3,t_2
1554         sd      c_2,8(a0)
1555
1556         dmultu  a_2,a_0         /* mul_add_c2(a[2],b[0],c3,c1,c2); */
1557         mflo    t_1
1558         mfhi    t_2
1559         daddu   c_3,t_1
1560         sltu    AT,c_3,t_1
1561         daddu   a2,t_2,AT
1562         daddu   c_1,a2
1563         daddu   c_3,t_1
1564         sltu    AT,c_3,t_1
1565         daddu   t_2,AT
1566         daddu   c_1,t_2
1567         sltu    c_2,c_1,t_2
1568         dmultu  a_1,a_1         /* mul_add_c(a[1],b[1],c3,c1,c2); */
1569         mflo    t_1
1570         mfhi    t_2
1571         daddu   c_3,t_1
1572         sltu    AT,c_3,t_1
1573         daddu   t_2,AT
1574         daddu   c_1,t_2
1575         sltu    AT,c_1,t_2
1576         daddu   c_2,AT
1577         sd      c_3,16(a0)
1578
1579         dmultu  a_0,a_3         /* mul_add_c2(a[0],b[3],c1,c2,c3); */
1580         mflo    t_1
1581         mfhi    t_2
1582         daddu   c_1,t_1
1583         sltu    AT,c_1,t_1
1584         daddu   a2,t_2,AT
1585         daddu   c_2,a2
1586         daddu   c_1,t_1
1587         sltu    AT,c_1,t_1
1588         daddu   t_2,AT
1589         daddu   c_2,t_2
1590         sltu    c_3,c_2,t_2
1591         dmultu  a_1,a_2         /* mul_add_c2(a[1],b[2],c1,c2,c3); */
1592         mflo    t_1
1593         mfhi    t_2
1594         daddu   c_1,t_1
1595         sltu    AT,c_1,t_1
1596         daddu   a2,t_2,AT
1597         daddu   c_2,a2
1598         sltu    AT,c_2,a2
1599         daddu   c_3,AT
1600         daddu   c_1,t_1
1601         sltu    AT,c_1,t_1
1602         daddu   t_2,AT
1603         daddu   c_2,t_2
1604         sltu    AT,c_2,t_2
1605         daddu   c_3,AT
1606         sd      c_1,24(a0)
1607
1608         dmultu  a_4,a_0         /* mul_add_c2(a[4],b[0],c2,c3,c1); */
1609         mflo    t_1
1610         mfhi    t_2
1611         daddu   c_2,t_1
1612         sltu    AT,c_2,t_1
1613         daddu   a2,t_2,AT
1614         daddu   c_3,a2
1615         daddu   c_2,t_1
1616         sltu    AT,c_2,t_1
1617         daddu   t_2,AT
1618         daddu   c_3,t_2
1619         sltu    c_1,c_3,t_2
1620         dmultu  a_3,a_1         /* mul_add_c2(a[3],b[1],c2,c3,c1); */
1621         mflo    t_1
1622         mfhi    t_2
1623         daddu   c_2,t_1
1624         sltu    AT,c_2,t_1
1625         daddu   a2,t_2,AT
1626         daddu   c_3,a2
1627         sltu    AT,c_3,a2
1628         daddu   c_1,AT
1629         daddu   c_2,t_1
1630         sltu    AT,c_2,t_1
1631         daddu   t_2,AT
1632         daddu   c_3,t_2
1633         sltu    AT,c_3,t_2
1634         daddu   c_1,AT
1635         dmultu  a_2,a_2         /* mul_add_c(a[2],b[2],c2,c3,c1); */
1636         mflo    t_1
1637         mfhi    t_2
1638         daddu   c_2,t_1
1639         sltu    AT,c_2,t_1
1640         daddu   t_2,AT
1641         daddu   c_3,t_2
1642         sltu    AT,c_3,t_2
1643         daddu   c_1,AT
1644         sd      c_2,32(a0)
1645
1646         dmultu  a_0,a_5         /* mul_add_c2(a[0],b[5],c3,c1,c2); */
1647         mflo    t_1
1648         mfhi    t_2
1649         daddu   c_3,t_1
1650         sltu    AT,c_3,t_1
1651         daddu   a2,t_2,AT
1652         daddu   c_1,a2
1653         daddu   c_3,t_1
1654         sltu    AT,c_3,t_1
1655         daddu   t_2,AT
1656         daddu   c_1,t_2
1657         sltu    c_2,c_1,t_2
1658         dmultu  a_1,a_4         /* mul_add_c2(a[1],b[4],c3,c1,c2); */
1659         mflo    t_1
1660         mfhi    t_2
1661         daddu   c_3,t_1
1662         sltu    AT,c_3,t_1
1663         daddu   a2,t_2,AT
1664         daddu   c_1,a2
1665         sltu    AT,c_1,a2
1666         daddu   c_2,AT
1667         daddu   c_3,t_1
1668         sltu    AT,c_3,t_1
1669         daddu   t_2,AT
1670         daddu   c_1,t_2
1671         sltu    AT,c_1,t_2
1672         daddu   c_2,AT
1673         dmultu  a_2,a_3         /* mul_add_c2(a[2],b[3],c3,c1,c2); */
1674         mflo    t_1
1675         mfhi    t_2
1676         daddu   c_3,t_1
1677         sltu    AT,c_3,t_1
1678         daddu   a2,t_2,AT
1679         daddu   c_1,a2
1680         sltu    AT,c_1,a2
1681         daddu   c_2,AT
1682         daddu   c_3,t_1
1683         sltu    AT,c_3,t_1
1684         daddu   t_2,AT
1685         daddu   c_1,t_2
1686         sltu    AT,c_1,t_2
1687         daddu   c_2,AT
1688         sd      c_3,40(a0)
1689
1690         dmultu  a_6,a_0         /* mul_add_c2(a[6],b[0],c1,c2,c3); */
1691         mflo    t_1
1692         mfhi    t_2
1693         daddu   c_1,t_1
1694         sltu    AT,c_1,t_1
1695         daddu   a2,t_2,AT
1696         daddu   c_2,a2
1697         daddu   c_1,t_1
1698         sltu    AT,c_1,t_1
1699         daddu   t_2,AT
1700         daddu   c_2,t_2
1701         sltu    c_3,c_2,t_2
1702         dmultu  a_5,a_1         /* mul_add_c2(a[5],b[1],c1,c2,c3); */
1703         mflo    t_1
1704         mfhi    t_2
1705         daddu   c_1,t_1
1706         sltu    AT,c_1,t_1
1707         daddu   a2,t_2,AT
1708         daddu   c_2,a2
1709         sltu    AT,c_2,a2
1710         daddu   c_3,AT
1711         daddu   c_1,t_1
1712         sltu    AT,c_1,t_1
1713         daddu   t_2,AT
1714         daddu   c_2,t_2
1715         sltu    AT,c_2,t_2
1716         daddu   c_3,AT
1717         dmultu  a_4,a_2         /* mul_add_c2(a[4],b[2],c1,c2,c3); */
1718         mflo    t_1
1719         mfhi    t_2
1720         daddu   c_1,t_1
1721         sltu    AT,c_1,t_1
1722         daddu   a2,t_2,AT
1723         daddu   c_2,a2
1724         sltu    AT,c_2,a2
1725         daddu   c_3,AT
1726         daddu   c_1,t_1
1727         sltu    AT,c_1,t_1
1728         daddu   t_2,AT
1729         daddu   c_2,t_2
1730         sltu    AT,c_2,t_2
1731         daddu   c_3,AT
1732         dmultu  a_3,a_3         /* mul_add_c(a[3],b[3],c1,c2,c3); */
1733         mflo    t_1
1734         mfhi    t_2
1735         daddu   c_1,t_1
1736         sltu    AT,c_1,t_1
1737         daddu   t_2,AT
1738         daddu   c_2,t_2
1739         sltu    AT,c_2,t_2
1740         daddu   c_3,AT
1741         sd      c_1,48(a0)
1742
1743         dmultu  a_0,a_7         /* mul_add_c2(a[0],b[7],c2,c3,c1); */
1744         mflo    t_1
1745         mfhi    t_2
1746         daddu   c_2,t_1
1747         sltu    AT,c_2,t_1
1748         daddu   a2,t_2,AT
1749         daddu   c_3,a2
1750         daddu   c_2,t_1
1751         sltu    AT,c_2,t_1
1752         daddu   t_2,AT
1753         daddu   c_3,t_2
1754         sltu    c_1,c_3,t_2
1755         dmultu  a_1,a_6         /* mul_add_c2(a[1],b[6],c2,c3,c1); */
1756         mflo    t_1
1757         mfhi    t_2
1758         daddu   c_2,t_1
1759         sltu    AT,c_2,t_1
1760         daddu   a2,t_2,AT
1761         daddu   c_3,a2
1762         sltu    AT,c_3,a2
1763         daddu   c_1,AT
1764         daddu   c_2,t_1
1765         sltu    AT,c_2,t_1
1766         daddu   t_2,AT
1767         daddu   c_3,t_2
1768         sltu    AT,c_3,t_2
1769         daddu   c_1,AT
1770         dmultu  a_2,a_5         /* mul_add_c2(a[2],b[5],c2,c3,c1); */
1771         mflo    t_1
1772         mfhi    t_2
1773         daddu   c_2,t_1
1774         sltu    AT,c_2,t_1
1775         daddu   a2,t_2,AT
1776         daddu   c_3,a2
1777         sltu    AT,c_3,a2
1778         daddu   c_1,AT
1779         daddu   c_2,t_1
1780         sltu    AT,c_2,t_1
1781         daddu   t_2,AT
1782         daddu   c_3,t_2
1783         sltu    AT,c_3,t_2
1784         daddu   c_1,AT
1785         dmultu  a_3,a_4         /* mul_add_c2(a[3],b[4],c2,c3,c1); */
1786         mflo    t_1
1787         mfhi    t_2
1788         daddu   c_2,t_1
1789         sltu    AT,c_2,t_1
1790         daddu   a2,t_2,AT
1791         daddu   c_3,a2
1792         sltu    AT,c_3,a2
1793         daddu   c_1,AT
1794         daddu   c_2,t_1
1795         sltu    AT,c_2,t_1
1796         daddu   t_2,AT
1797         daddu   c_3,t_2
1798         sltu    AT,c_3,t_2
1799         daddu   c_1,AT
1800         sd      c_2,56(a0)
1801
1802         dmultu  a_7,a_1         /* mul_add_c2(a[7],b[1],c3,c1,c2); */
1803         mflo    t_1
1804         mfhi    t_2
1805         daddu   c_3,t_1
1806         sltu    AT,c_3,t_1
1807         daddu   a2,t_2,AT
1808         daddu   c_1,a2
1809         daddu   c_3,t_1
1810         sltu    AT,c_3,t_1
1811         daddu   t_2,AT
1812         daddu   c_1,t_2
1813         sltu    c_2,c_1,t_2
1814         dmultu  a_6,a_2         /* mul_add_c2(a[6],b[2],c3,c1,c2); */
1815         mflo    t_1
1816         mfhi    t_2
1817         daddu   c_3,t_1
1818         sltu    AT,c_3,t_1
1819         daddu   a2,t_2,AT
1820         daddu   c_1,a2
1821         sltu    AT,c_1,a2
1822         daddu   c_2,AT
1823         daddu   c_3,t_1
1824         sltu    AT,c_3,t_1
1825         daddu   t_2,AT
1826         daddu   c_1,t_2
1827         sltu    AT,c_1,t_2
1828         daddu   c_2,AT
1829         dmultu  a_5,a_3         /* mul_add_c2(a[5],b[3],c3,c1,c2); */
1830         mflo    t_1
1831         mfhi    t_2
1832         daddu   c_3,t_1
1833         sltu    AT,c_3,t_1
1834         daddu   a2,t_2,AT
1835         daddu   c_1,a2
1836         sltu    AT,c_1,a2
1837         daddu   c_2,AT
1838         daddu   c_3,t_1
1839         sltu    AT,c_3,t_1
1840         daddu   t_2,AT
1841         daddu   c_1,t_2
1842         sltu    AT,c_1,t_2
1843         daddu   c_2,AT
1844         dmultu  a_4,a_4         /* mul_add_c(a[4],b[4],c3,c1,c2); */
1845         mflo    t_1
1846         mfhi    t_2
1847         daddu   c_3,t_1
1848         sltu    AT,c_3,t_1
1849         daddu   t_2,AT
1850         daddu   c_1,t_2
1851         sltu    AT,c_1,t_2
1852         daddu   c_2,AT
1853         sd      c_3,64(a0)
1854
1855         dmultu  a_2,a_7         /* mul_add_c2(a[2],b[7],c1,c2,c3); */
1856         mflo    t_1
1857         mfhi    t_2
1858         daddu   c_1,t_1
1859         sltu    AT,c_1,t_1
1860         daddu   a2,t_2,AT
1861         daddu   c_2,a2
1862         daddu   c_1,t_1
1863         sltu    AT,c_1,t_1
1864         daddu   t_2,AT
1865         daddu   c_2,t_2
1866         sltu    c_3,c_2,t_2
1867         dmultu  a_3,a_6         /* mul_add_c2(a[3],b[6],c1,c2,c3); */
1868         mflo    t_1
1869         mfhi    t_2
1870         daddu   c_1,t_1
1871         sltu    AT,c_1,t_1
1872         daddu   a2,t_2,AT
1873         daddu   c_2,a2
1874         sltu    AT,c_2,a2
1875         daddu   c_3,AT
1876         daddu   c_1,t_1
1877         sltu    AT,c_1,t_1
1878         daddu   t_2,AT
1879         daddu   c_2,t_2
1880         sltu    AT,c_2,t_2
1881         daddu   c_3,AT
1882         dmultu  a_4,a_5         /* mul_add_c2(a[4],b[5],c1,c2,c3); */
1883         mflo    t_1
1884         mfhi    t_2
1885         daddu   c_1,t_1
1886         sltu    AT,c_1,t_1
1887         daddu   a2,t_2,AT
1888         daddu   c_2,a2
1889         sltu    AT,c_2,a2
1890         daddu   c_3,AT
1891         daddu   c_1,t_1
1892         sltu    AT,c_1,t_1
1893         daddu   t_2,AT
1894         daddu   c_2,t_2
1895         sltu    AT,c_2,t_2
1896         daddu   c_3,AT
1897         sd      c_1,72(a0)
1898
1899         dmultu  a_7,a_3         /* mul_add_c2(a[7],b[3],c2,c3,c1); */
1900         mflo    t_1
1901         mfhi    t_2
1902         daddu   c_2,t_1
1903         sltu    AT,c_2,t_1
1904         daddu   a2,t_2,AT
1905         daddu   c_3,a2
1906         daddu   c_2,t_1
1907         sltu    AT,c_2,t_1
1908         daddu   t_2,AT
1909         daddu   c_3,t_2
1910         sltu    c_1,c_3,t_2
1911         dmultu  a_6,a_4         /* mul_add_c2(a[6],b[4],c2,c3,c1); */
1912         mflo    t_1
1913         mfhi    t_2
1914         daddu   c_2,t_1
1915         sltu    AT,c_2,t_1
1916         daddu   a2,t_2,AT
1917         daddu   c_3,a2
1918         sltu    AT,c_3,a2
1919         daddu   c_1,AT
1920         daddu   c_2,t_1
1921         sltu    AT,c_2,t_1
1922         daddu   t_2,AT
1923         daddu   c_3,t_2
1924         sltu    AT,c_3,t_2
1925         daddu   c_1,AT
1926         dmultu  a_5,a_5         /* mul_add_c(a[5],b[5],c2,c3,c1); */
1927         mflo    t_1
1928         mfhi    t_2
1929         daddu   c_2,t_1
1930         sltu    AT,c_2,t_1
1931         daddu   t_2,AT
1932         daddu   c_3,t_2
1933         sltu    AT,c_3,t_2
1934         daddu   c_1,AT
1935         sd      c_2,80(a0)
1936
1937         dmultu  a_4,a_7         /* mul_add_c2(a[4],b[7],c3,c1,c2); */
1938         mflo    t_1
1939         mfhi    t_2
1940         daddu   c_3,t_1
1941         sltu    AT,c_3,t_1
1942         daddu   a2,t_2,AT
1943         daddu   c_1,a2
1944         daddu   c_3,t_1
1945         sltu    AT,c_3,t_1
1946         daddu   t_2,AT
1947         daddu   c_1,t_2
1948         sltu    c_2,c_1,t_2
1949         dmultu  a_5,a_6         /* mul_add_c2(a[5],b[6],c3,c1,c2); */
1950         mflo    t_1
1951         mfhi    t_2
1952         daddu   c_3,t_1
1953         sltu    AT,c_3,t_1
1954         daddu   a2,t_2,AT
1955         daddu   c_1,a2
1956         sltu    AT,c_1,a2
1957         daddu   c_2,AT
1958         daddu   c_3,t_1
1959         sltu    AT,c_3,t_1
1960         daddu   t_2,AT
1961         daddu   c_1,t_2
1962         sltu    AT,c_1,t_2
1963         daddu   c_2,AT
1964         sd      c_3,88(a0)
1965
1966         dmultu  a_7,a_5         /* mul_add_c2(a[7],b[5],c1,c2,c3); */
1967         mflo    t_1
1968         mfhi    t_2
1969         daddu   c_1,t_1
1970         sltu    AT,c_1,t_1
1971         daddu   a2,t_2,AT
1972         daddu   c_2,a2
1973         daddu   c_1,t_1
1974         sltu    AT,c_1,t_1
1975         daddu   t_2,AT
1976         daddu   c_2,t_2
1977         sltu    c_3,c_2,t_2
1978         dmultu  a_6,a_6         /* mul_add_c(a[6],b[6],c1,c2,c3); */
1979         mflo    t_1
1980         mfhi    t_2
1981         daddu   c_1,t_1
1982         sltu    AT,c_1,t_1
1983         daddu   t_2,AT
1984         daddu   c_2,t_2
1985         sltu    AT,c_2,t_2
1986         daddu   c_3,AT
1987         sd      c_1,96(a0)
1988
1989         dmultu  a_6,a_7         /* mul_add_c2(a[6],b[7],c2,c3,c1); */
1990         mflo    t_1
1991         mfhi    t_2
1992         daddu   c_2,t_1
1993         sltu    AT,c_2,t_1
1994         daddu   a2,t_2,AT
1995         daddu   c_3,a2
1996         daddu   c_2,t_1
1997         sltu    AT,c_2,t_1
1998         daddu   t_2,AT
1999         daddu   c_3,t_2
2000         sltu    c_1,c_3,t_2
2001         sd      c_2,104(a0)
2002
2003         dmultu  a_7,a_7         /* mul_add_c(a[7],b[7],c3,c1,c2); */
2004         mflo    t_1
2005         mfhi    t_2
2006         daddu   c_3,t_1
2007         sltu    AT,c_3,t_1
2008         daddu   t_2,AT
2009         daddu   c_1,t_2
2010         sd      c_3,112(a0)
2011         sd      c_1,120(a0)
2012
2013         jr      ra
2014 END(bn_sqr_comba8)
2015
2016 .align  5
2017 LEAF(bn_sqr_comba4)
2018         .set    reorder
2019         ld      a_0,0(a1)
2020         ld      a_1,8(a1)
2021         ld      a_2,16(a1)
2022         ld      a_3,24(a1)
2023         dmultu  a_0,a_0         /* mul_add_c(a[0],b[0],c1,c2,c3); */
2024         mflo    c_1
2025         mfhi    c_2
2026         sd      c_1,0(a0)
2027
2028         dmultu  a_0,a_1         /* mul_add_c2(a[0],b[1],c2,c3,c1); */
2029         mflo    t_1
2030         mfhi    t_2
2031         daddu   c_2,t_1
2032         sltu    AT,c_2,t_1
2033         daddu   c_3,t_2,AT
2034         daddu   c_2,t_1
2035         sltu    AT,c_2,t_1
2036         daddu   t_2,AT
2037         daddu   c_3,t_2
2038         sltu    c_1,c_3,t_2
2039         sd      c_2,8(a0)
2040
2041         dmultu  a_2,a_0         /* mul_add_c2(a[2],b[0],c3,c1,c2); */
2042         mflo    t_1
2043         mfhi    t_2
2044         daddu   c_3,t_1
2045         sltu    AT,c_3,t_1
2046         daddu   a2,t_2,AT
2047         daddu   c_1,a2
2048         daddu   c_3,t_1
2049         sltu    AT,c_3,t_1
2050         daddu   t_2,AT
2051         daddu   c_1,t_2
2052         sltu    c_2,c_1,t_2
2053         dmultu  a_1,a_1         /* mul_add_c(a[1],b[1],c3,c1,c2); */
2054         mflo    t_1
2055         mfhi    t_2
2056         daddu   c_3,t_1
2057         sltu    AT,c_3,t_1
2058         daddu   t_2,AT
2059         daddu   c_1,t_2
2060         sltu    AT,c_1,t_2
2061         daddu   c_2,AT
2062         sd      c_3,16(a0)
2063
2064         dmultu  a_0,a_3         /* mul_add_c2(a[0],b[3],c1,c2,c3); */
2065         mflo    t_1
2066         mfhi    t_2
2067         daddu   c_1,t_1
2068         sltu    AT,c_1,t_1
2069         daddu   a2,t_2,AT
2070         daddu   c_2,a2
2071         daddu   c_1,t_1
2072         sltu    AT,c_1,t_1
2073         daddu   t_2,AT
2074         daddu   c_2,t_2
2075         sltu    c_3,c_2,t_2
2076         dmultu  a_1,a_2         /* mul_add_c(a2[1],b[2],c1,c2,c3); */
2077         mflo    t_1
2078         mfhi    t_2
2079         daddu   c_1,t_1
2080         sltu    AT,c_1,t_1
2081         daddu   a2,t_2,AT
2082         daddu   c_2,a2
2083         sltu    AT,c_2,a2
2084         daddu   c_3,AT
2085         daddu   c_1,t_1
2086         sltu    AT,c_1,t_1
2087         daddu   t_2,AT
2088         daddu   c_2,t_2
2089         sltu    AT,c_2,t_2
2090         daddu   c_3,AT
2091         sd      c_1,24(a0)
2092
2093         dmultu  a_3,a_1         /* mul_add_c2(a[3],b[1],c2,c3,c1); */
2094         mflo    t_1
2095         mfhi    t_2
2096         daddu   c_2,t_1
2097         sltu    AT,c_2,t_1
2098         daddu   a2,t_2,AT
2099         daddu   c_3,a2
2100         daddu   c_2,t_1
2101         sltu    AT,c_2,t_1
2102         daddu   t_2,AT
2103         daddu   c_3,t_2
2104         sltu    c_1,c_3,t_2
2105         dmultu  a_2,a_2         /* mul_add_c(a[2],b[2],c2,c3,c1); */
2106         mflo    t_1
2107         mfhi    t_2
2108         daddu   c_2,t_1
2109         sltu    AT,c_2,t_1
2110         daddu   t_2,AT
2111         daddu   c_3,t_2
2112         sltu    AT,c_3,t_2
2113         daddu   c_1,AT
2114         sd      c_2,32(a0)
2115
2116         dmultu  a_2,a_3         /* mul_add_c2(a[2],b[3],c3,c1,c2); */
2117         mflo    t_1
2118         mfhi    t_2
2119         daddu   c_3,t_1
2120         sltu    AT,c_3,t_1
2121         daddu   a2,t_2,AT
2122         daddu   c_1,a2
2123         daddu   c_3,t_1
2124         sltu    AT,c_3,t_1
2125         daddu   t_2,AT
2126         daddu   c_1,t_2
2127         sltu    c_2,c_1,t_2
2128         sd      c_3,40(a0)
2129
2130         dmultu  a_3,a_3         /* mul_add_c(a[3],b[3],c1,c2,c3); */
2131         mflo    t_1
2132         mfhi    t_2
2133         daddu   c_1,t_1
2134         sltu    AT,c_1,t_1
2135         daddu   t_2,AT
2136         daddu   c_2,t_2
2137         sd      c_1,48(a0)
2138         sd      c_2,56(a0)
2139
2140         jr      ra
2141 END(bn_sqr_comba4)