Also check for errors in x86_64-xlate.pl.
[oweals/openssl.git] / crypto / bn / asm / mips.pl
index 3b58fef9d7bdbf300852ccdd99e1c0c3ea905b52..cf67647f0da65158dfeab4dd2322ae65f5d1c75f 100644 (file)
@@ -1,12 +1,18 @@
-#!/usr/bin/env perl
+#! /usr/bin/env perl
+# Copyright 2010-2016 The OpenSSL Project Authors. All Rights Reserved.
+#
+# Licensed under the Apache License 2.0 (the "License").  You may not use
+# this file except in compliance with the License.  You can obtain a copy
+# in the file LICENSE in the source distribution or at
+# https://www.openssl.org/source/license.html
+
 #
 # ====================================================================
-# Written by Andy Polyakov <appro@fy.chalmers.se> for the OpenSSL
+# Written by Andy Polyakov <appro@openssl.org> for the OpenSSL
 # project.
 #
 # Rights for redistribution and usage in source and binary forms are
-# granted according to the OpenSSL license. Warranty of any kind is
-# disclaimed.
+# granted according to the License. Warranty of any kind is disclaimed.
 # ====================================================================
 
 
@@ -15,7 +21,7 @@
 # This is drop-in MIPS III/IV ISA replacement for crypto/bn/bn_asm.c.
 #
 # The module is designed to work with either of the "new" MIPS ABI(5),
-# namely N32 or N64, offered by IRIX 6.x. It's not ment to work under
+# namely N32 or N64, offered by IRIX 6.x. It's not meant to work under
 # IRIX 5.x not only because it doesn't support new ABIs but also
 # because 5.x kernels put R4x00 CPU into 32-bit mode and all those
 # 64-bit instructions (daddu, dmultu, etc.) found below gonna only
@@ -35,7 +41,7 @@
 # Performance improvement is astonishing! 'apps/openssl speed rsa dsa'
 # goes way over 3 times faster!
 #
-#                                      <appro@fy.chalmers.se>
+#                                      <appro@openssl.org>
 
 # October 2010
 #
 # has to content with 40-85% improvement depending on benchmark and
 # key length, more for longer keys.
 
-$flavour = shift || "o32";
-while (($output=shift) && ($output!~/^\w[\w\-]*\.\w+$/)) {}
-open STDOUT,">$output";
+# $output is the last argument if it looks like a file (it has an extension)
+# $flavour is the first argument if it doesn't look like a file
+$output = $#ARGV >= 0 && $ARGV[$#ARGV] =~ m|\.\w+$| ? pop : undef;
+$flavour = $#ARGV >= 0 && $ARGV[0] !~ m|\.| ? shift : "o32";
 
 if ($flavour =~ /64|n32/i) {
        $LD="ld";
@@ -82,9 +89,11 @@ if ($flavour =~ /64|n32/i) {
        $SZREG=4;
        $REG_S="sw";
        $REG_L="lw";
-       $code=".set     mips2\n";
+       $code="#if !(defined (__mips_isa_rev) && (__mips_isa_rev >= 6))\n.set     mips2\n#endif\n";
 }
 
+$output and open STDOUT,">$output";
+
 # Below is N32/64 register layout used in the original module.
 #
 ($zero,$at,$v0,$v1)=map("\$$_",(0..3));
@@ -102,6 +111,22 @@ $gp=$v1 if ($flavour =~ /nubi/i);
 $minus4=$v1;
 
 $code.=<<___;
+#include "mips_arch.h"
+
+#if defined(_MIPS_ARCH_MIPS64R6)
+# define ddivu(rs,rt)
+# define mfqt(rd,rs,rt)        ddivu   rd,rs,rt
+# define mfrm(rd,rs,rt)        dmodu   rd,rs,rt
+#elif defined(_MIPS_ARCH_MIPS32R6)
+# define divu(rs,rt)
+# define mfqt(rd,rs,rt)        divu    rd,rs,rt
+# define mfrm(rd,rs,rt)        modu    rd,rs,rt
+#else
+# define $DIVU(rs,rt)  $DIVU   $zero,rs,rt
+# define mfqt(rd,rs,rt)        mflo    rd
+# define mfrm(rd,rs,rt)        mfhi    rd
+#endif
+
 .rdata
 .asciiz        "mips3.s, Version 1.2"
 .asciiz        "MIPS II/III/IV ISA artwork by Andy Polyakov <appro\@fy.chalmers.se>"
@@ -140,11 +165,11 @@ $code.=<<___;
        .set    reorder
        li      $minus4,-4
        and     $ta0,$a2,$minus4
-       $LD     $t0,0($a1)
        beqz    $ta0,.L_bn_mul_add_words_tail
 
 .L_bn_mul_add_words_loop:
-       $MULTU  $t0,$a3
+       $LD     $t0,0($a1)
+       $MULTU  ($t0,$a3)
        $LD     $t1,0($a0)
        $LD     $t2,$BNSZ($a1)
        $LD     $t3,$BNSZ($a0)
@@ -154,11 +179,11 @@ $code.=<<___;
        sltu    $v0,$t1,$v0     # All manuals say it "compares 32-bit
                                # values", but it seems to work fine
                                # even on 64-bit registers.
-       mflo    $at
-       mfhi    $t0
+       mflo    ($at,$t0,$a3)
+       mfhi    ($t0,$t0,$a3)
        $ADDU   $t1,$at
        $ADDU   $v0,$t0
-        $MULTU $t2,$a3
+        $MULTU ($t2,$a3)
        sltu    $at,$t1,$at
        $ST     $t1,0($a0)
        $ADDU   $v0,$at
@@ -167,11 +192,11 @@ $code.=<<___;
        $LD     $ta3,3*$BNSZ($a0)
        $ADDU   $t3,$v0
        sltu    $v0,$t3,$v0
-       mflo    $at
-       mfhi    $t2
+       mflo    ($at,$t2,$a3)
+       mfhi    ($t2,$t2,$a3)
        $ADDU   $t3,$at
        $ADDU   $v0,$t2
-        $MULTU $ta0,$a3
+        $MULTU ($ta0,$a3)
        sltu    $at,$t3,$at
        $ST     $t3,$BNSZ($a0)
        $ADDU   $v0,$at
@@ -181,11 +206,11 @@ $code.=<<___;
        $PTR_ADD $a1,4*$BNSZ
        $ADDU   $ta1,$v0
        sltu    $v0,$ta1,$v0
-       mflo    $at
-       mfhi    $ta0
+       mflo    ($at,$ta0,$a3)
+       mfhi    ($ta0,$ta0,$a3)
        $ADDU   $ta1,$at
        $ADDU   $v0,$ta0
-        $MULTU $ta2,$a3
+        $MULTU ($ta2,$a3)
        sltu    $at,$ta1,$at
        $ST     $ta1,-2*$BNSZ($a0)
        $ADDU   $v0,$at
@@ -194,16 +219,15 @@ $code.=<<___;
        and     $ta0,$a2,$minus4
        $ADDU   $ta3,$v0
        sltu    $v0,$ta3,$v0
-       mflo    $at
-       mfhi    $ta2
+       mflo    ($at,$ta2,$a3)
+       mfhi    ($ta2,$ta2,$a3)
        $ADDU   $ta3,$at
        $ADDU   $v0,$ta2
        sltu    $at,$ta3,$at
        $ST     $ta3,-$BNSZ($a0)
-       $ADDU   $v0,$at
        .set    noreorder
-       bgtzl   $ta0,.L_bn_mul_add_words_loop
-       $LD     $t0,0($a1)
+       bgtz    $ta0,.L_bn_mul_add_words_loop
+       $ADDU   $v0,$at
 
        beqz    $a2,.L_bn_mul_add_words_return
        nop
@@ -211,13 +235,13 @@ $code.=<<___;
 .L_bn_mul_add_words_tail:
        .set    reorder
        $LD     $t0,0($a1)
-       $MULTU  $t0,$a3
+       $MULTU  ($t0,$a3)
        $LD     $t1,0($a0)
        subu    $a2,1
        $ADDU   $t1,$v0
        sltu    $v0,$t1,$v0
-       mflo    $at
-       mfhi    $t0
+       mflo    ($at,$t0,$a3)
+       mfhi    ($t0,$t0,$a3)
        $ADDU   $t1,$at
        $ADDU   $v0,$t0
        sltu    $at,$t1,$at
@@ -226,13 +250,13 @@ $code.=<<___;
        beqz    $a2,.L_bn_mul_add_words_return
 
        $LD     $t0,$BNSZ($a1)
-       $MULTU  $t0,$a3
+       $MULTU  ($t0,$a3)
        $LD     $t1,$BNSZ($a0)
        subu    $a2,1
        $ADDU   $t1,$v0
        sltu    $v0,$t1,$v0
-       mflo    $at
-       mfhi    $t0
+       mflo    ($at,$t0,$a3)
+       mfhi    ($t0,$t0,$a3)
        $ADDU   $t1,$at
        $ADDU   $v0,$t0
        sltu    $at,$t1,$at
@@ -241,12 +265,12 @@ $code.=<<___;
        beqz    $a2,.L_bn_mul_add_words_return
 
        $LD     $t0,2*$BNSZ($a1)
-       $MULTU  $t0,$a3
+       $MULTU  ($t0,$a3)
        $LD     $t1,2*$BNSZ($a0)
        $ADDU   $t1,$v0
        sltu    $v0,$t1,$v0
-       mflo    $at
-       mfhi    $t0
+       mflo    ($at,$t0,$a3)
+       mfhi    ($t0,$t0,$a3)
        $ADDU   $t1,$at
        $ADDU   $v0,$t0
        sltu    $at,$t1,$at
@@ -300,51 +324,50 @@ $code.=<<___;
        .set    reorder
        li      $minus4,-4
        and     $ta0,$a2,$minus4
-       $LD     $t0,0($a1)
        beqz    $ta0,.L_bn_mul_words_tail
 
 .L_bn_mul_words_loop:
-       $MULTU  $t0,$a3
+       $LD     $t0,0($a1)
+       $MULTU  ($t0,$a3)
        $LD     $t2,$BNSZ($a1)
        $LD     $ta0,2*$BNSZ($a1)
        $LD     $ta2,3*$BNSZ($a1)
-       mflo    $at
-       mfhi    $t0
+       mflo    ($at,$t0,$a3)
+       mfhi    ($t0,$t0,$a3)
        $ADDU   $v0,$at
        sltu    $t1,$v0,$at
-        $MULTU $t2,$a3
+        $MULTU ($t2,$a3)
        $ST     $v0,0($a0)
        $ADDU   $v0,$t1,$t0
 
        subu    $a2,4
        $PTR_ADD $a0,4*$BNSZ
        $PTR_ADD $a1,4*$BNSZ
-       mflo    $at
-       mfhi    $t2
+       mflo    ($at,$t2,$a3)
+       mfhi    ($t2,$t2,$a3)
        $ADDU   $v0,$at
        sltu    $t3,$v0,$at
-        $MULTU $ta0,$a3
+        $MULTU ($ta0,$a3)
        $ST     $v0,-3*$BNSZ($a0)
        $ADDU   $v0,$t3,$t2
 
-       mflo    $at
-       mfhi    $ta0
+       mflo    ($at,$ta0,$a3)
+       mfhi    ($ta0,$ta0,$a3)
        $ADDU   $v0,$at
        sltu    $ta1,$v0,$at
-        $MULTU $ta2,$a3
+        $MULTU ($ta2,$a3)
        $ST     $v0,-2*$BNSZ($a0)
        $ADDU   $v0,$ta1,$ta0
 
        and     $ta0,$a2,$minus4
-       mflo    $at
-       mfhi    $ta2
+       mflo    ($at,$ta2,$a3)
+       mfhi    ($ta2,$ta2,$a3)
        $ADDU   $v0,$at
        sltu    $ta3,$v0,$at
        $ST     $v0,-$BNSZ($a0)
-       $ADDU   $v0,$ta3,$ta2
        .set    noreorder
-       bgtzl   $ta0,.L_bn_mul_words_loop
-       $LD     $t0,0($a1)
+       bgtz    $ta0,.L_bn_mul_words_loop
+       $ADDU   $v0,$ta3,$ta2
 
        beqz    $a2,.L_bn_mul_words_return
        nop
@@ -352,10 +375,10 @@ $code.=<<___;
 .L_bn_mul_words_tail:
        .set    reorder
        $LD     $t0,0($a1)
-       $MULTU  $t0,$a3
+       $MULTU  ($t0,$a3)
        subu    $a2,1
-       mflo    $at
-       mfhi    $t0
+       mflo    ($at,$t0,$a3)
+       mfhi    ($t0,$t0,$a3)
        $ADDU   $v0,$at
        sltu    $t1,$v0,$at
        $ST     $v0,0($a0)
@@ -363,10 +386,10 @@ $code.=<<___;
        beqz    $a2,.L_bn_mul_words_return
 
        $LD     $t0,$BNSZ($a1)
-       $MULTU  $t0,$a3
+       $MULTU  ($t0,$a3)
        subu    $a2,1
-       mflo    $at
-       mfhi    $t0
+       mflo    ($at,$t0,$a3)
+       mfhi    ($t0,$t0,$a3)
        $ADDU   $v0,$at
        sltu    $t1,$v0,$at
        $ST     $v0,$BNSZ($a0)
@@ -374,9 +397,9 @@ $code.=<<___;
        beqz    $a2,.L_bn_mul_words_return
 
        $LD     $t0,2*$BNSZ($a1)
-       $MULTU  $t0,$a3
-       mflo    $at
-       mfhi    $t0
+       $MULTU  ($t0,$a3)
+       mflo    ($at,$t0,$a3)
+       mfhi    ($t0,$t0,$a3)
        $ADDU   $v0,$at
        sltu    $t1,$v0,$at
        $ST     $v0,2*$BNSZ($a0)
@@ -429,45 +452,44 @@ $code.=<<___;
        .set    reorder
        li      $minus4,-4
        and     $ta0,$a2,$minus4
-       $LD     $t0,0($a1)
        beqz    $ta0,.L_bn_sqr_words_tail
 
 .L_bn_sqr_words_loop:
-       $MULTU  $t0,$t0
+       $LD     $t0,0($a1)
+       $MULTU  ($t0,$t0)
        $LD     $t2,$BNSZ($a1)
        $LD     $ta0,2*$BNSZ($a1)
        $LD     $ta2,3*$BNSZ($a1)
-       mflo    $t1
-       mfhi    $t0
+       mflo    ($t1,$t0,$t0)
+       mfhi    ($t0,$t0,$t0)
        $ST     $t1,0($a0)
        $ST     $t0,$BNSZ($a0)
 
-       $MULTU  $t2,$t2
+       $MULTU  ($t2,$t2)
        subu    $a2,4
        $PTR_ADD $a0,8*$BNSZ
        $PTR_ADD $a1,4*$BNSZ
-       mflo    $t3
-       mfhi    $t2
+       mflo    ($t3,$t2,$t2)
+       mfhi    ($t2,$t2,$t2)
        $ST     $t3,-6*$BNSZ($a0)
        $ST     $t2,-5*$BNSZ($a0)
 
-       $MULTU  $ta0,$ta0
-       mflo    $ta1
-       mfhi    $ta0
+       $MULTU  ($ta0,$ta0)
+       mflo    ($ta1,$ta0,$ta0)
+       mfhi    ($ta0,$ta0,$ta0)
        $ST     $ta1,-4*$BNSZ($a0)
        $ST     $ta0,-3*$BNSZ($a0)
 
 
-       $MULTU  $ta2,$ta2
+       $MULTU  ($ta2,$ta2)
        and     $ta0,$a2,$minus4
-       mflo    $ta3
-       mfhi    $ta2
+       mflo    ($ta3,$ta2,$ta2)
+       mfhi    ($ta2,$ta2,$ta2)
        $ST     $ta3,-2*$BNSZ($a0)
-       $ST     $ta2,-$BNSZ($a0)
 
        .set    noreorder
-       bgtzl   $ta0,.L_bn_sqr_words_loop
-       $LD     $t0,0($a1)
+       bgtz    $ta0,.L_bn_sqr_words_loop
+       $ST     $ta2,-$BNSZ($a0)
 
        beqz    $a2,.L_bn_sqr_words_return
        nop
@@ -475,27 +497,27 @@ $code.=<<___;
 .L_bn_sqr_words_tail:
        .set    reorder
        $LD     $t0,0($a1)
-       $MULTU  $t0,$t0
+       $MULTU  ($t0,$t0)
        subu    $a2,1
-       mflo    $t1
-       mfhi    $t0
+       mflo    ($t1,$t0,$t0)
+       mfhi    ($t0,$t0,$t0)
        $ST     $t1,0($a0)
        $ST     $t0,$BNSZ($a0)
        beqz    $a2,.L_bn_sqr_words_return
 
        $LD     $t0,$BNSZ($a1)
-       $MULTU  $t0,$t0
+       $MULTU  ($t0,$t0)
        subu    $a2,1
-       mflo    $t1
-       mfhi    $t0
+       mflo    ($t1,$t0,$t0)
+       mfhi    ($t0,$t0,$t0)
        $ST     $t1,2*$BNSZ($a0)
        $ST     $t0,3*$BNSZ($a0)
        beqz    $a2,.L_bn_sqr_words_return
 
        $LD     $t0,2*$BNSZ($a1)
-       $MULTU  $t0,$t0
-       mflo    $t1
-       mfhi    $t0
+       $MULTU  ($t0,$t0)
+       mflo    ($t1,$t0,$t0)
+       mfhi    ($t0,$t0,$t0)
        $ST     $t1,4*$BNSZ($a0)
        $ST     $t0,5*$BNSZ($a0)
 
@@ -547,10 +569,10 @@ $code.=<<___;
        .set    reorder
        li      $minus4,-4
        and     $at,$a3,$minus4
-       $LD     $t0,0($a1)
        beqz    $at,.L_bn_add_words_tail
 
 .L_bn_add_words_loop:
+       $LD     $t0,0($a1)
        $LD     $ta0,0($a2)
        subu    $a3,4
        $LD     $t1,$BNSZ($a1)
@@ -583,17 +605,16 @@ $code.=<<___;
        sltu    $v0,$t2,$ta2
        $ST     $t2,-2*$BNSZ($a0)
        $ADDU   $v0,$t8
-       
+
        $ADDU   $ta3,$t3
        sltu    $t9,$ta3,$t3
        $ADDU   $t3,$ta3,$v0
        sltu    $v0,$t3,$ta3
        $ST     $t3,-$BNSZ($a0)
-       $ADDU   $v0,$t9
-       
+
        .set    noreorder
-       bgtzl   $at,.L_bn_add_words_loop
-       $LD     $t0,0($a1)
+       bgtz    $at,.L_bn_add_words_loop
+       $ADDU   $v0,$t9
 
        beqz    $a3,.L_bn_add_words_return
        nop
@@ -679,10 +700,10 @@ $code.=<<___;
        .set    reorder
        li      $minus4,-4
        and     $at,$a3,$minus4
-       $LD     $t0,0($a1)
        beqz    $at,.L_bn_sub_words_tail
 
 .L_bn_sub_words_loop:
+       $LD     $t0,0($a1)
        $LD     $ta0,0($a2)
        subu    $a3,4
        $LD     $t1,$BNSZ($a1)
@@ -722,11 +743,10 @@ $code.=<<___;
        $SUBU   $t3,$ta3,$v0
        sgtu    $v0,$t3,$ta3
        $ST     $t3,-$BNSZ($a0)
-       $ADDU   $v0,$t9
 
        .set    noreorder
-       bgtzl   $at,.L_bn_sub_words_loop
-       $LD     $t0,0($a1)
+       bgtz    $at,.L_bn_sub_words_loop
+       $ADDU   $v0,$t9
 
        beqz    $a3,.L_bn_sub_words_return
        nop
@@ -780,6 +800,11 @@ $code.=<<___;
        move    $a0,$v0
 .end   bn_sub_words_internal
 
+#if 0
+/*
+ * The bn_div_3_words entry point is re-used for constant-time interface.
+ * Implementation is retained as historical reference.
+ */
 .align 5
 .globl bn_div_3_words
 .ent   bn_div_3_words
@@ -790,7 +815,7 @@ bn_div_3_words:
                                # so that we can save two arguments
                                # and return address in registers
                                # instead of stack:-)
-                               
+
        $LD     $a0,($a3)
        move    $ta2,$a1
        bne     $a0,$a2,bn_div_3_words_internal
@@ -819,13 +844,13 @@ ___
 $code.=<<___;
        .set    reorder
        move    $ta3,$ra
-       bal     bn_div_words
+       bal     bn_div_words_internal
        move    $ra,$ta3
-       $MULTU  $ta2,$v0
+       $MULTU  ($ta2,$v0)
        $LD     $t2,-2*$BNSZ($a3)
        move    $ta0,$zero
-       mfhi    $t1
-       mflo    $t0
+       mfhi    ($t1,$ta2,$v0)
+       mflo    ($t0,$ta2,$v0)
        sltu    $t8,$t1,$a1
 .L_bn_div_3_words_inner_loop:
        bnez    $t8,.L_bn_div_3_words_inner_loop_done
@@ -840,8 +865,9 @@ $code.=<<___;
        sltu    $ta0,$a1,$a2
        or      $t8,$ta0
        .set    noreorder
-       beqzl   $at,.L_bn_div_3_words_inner_loop
+       beqz    $at,.L_bn_div_3_words_inner_loop
        $SUBU   $v0,1
+       $ADDU   $v0,1
        .set    reorder
 .L_bn_div_3_words_inner_loop_done:
        .set    noreorder
@@ -858,6 +884,7 @@ $code.=<<___;
        jr      $ra
        move    $a0,$v0
 .end   bn_div_3_words_internal
+#endif
 
 .align 5
 .globl bn_div_words
@@ -902,7 +929,8 @@ $code.=<<___;
        and     $t2,$a0
        $SRL    $at,$a1,$t1
        .set    noreorder
-       bnezl   $t2,.+8
+       beqz    $t2,.+12
+       nop
        break   6               # signal overflow
        .set    reorder
        $SLL    $a0,$t9
@@ -917,7 +945,8 @@ $code.=<<___;
        $SRL    $DH,$a2,4*$BNSZ # bits
        sgeu    $at,$a0,$a2
        .set    noreorder
-       bnezl   $at,.+8
+       beqz    $at,.+12
+       nop
        $SUBU   $a0,$a2
        .set    reorder
 
@@ -925,15 +954,15 @@ $code.=<<___;
        $SRL    $HH,$a0,4*$BNSZ # bits
        $SRL    $QT,4*$BNSZ     # q=0xffffffff
        beq     $DH,$HH,.L_bn_div_words_skip_div1
-       $DIVU   $zero,$a0,$DH
-       mflo    $QT
+       $DIVU   ($a0,$DH)
+       mfqt    ($QT,$a0,$DH)
 .L_bn_div_words_skip_div1:
-       $MULTU  $a2,$QT
+       $MULTU  ($a2,$QT)
        $SLL    $t3,$a0,4*$BNSZ # bits
        $SRL    $at,$a1,4*$BNSZ # bits
        or      $t3,$at
-       mflo    $t0
-       mfhi    $t1
+       mflo    ($t0,$a2,$QT)
+       mfhi    ($t1,$a2,$QT)
 .L_bn_div_words_inner_loop1:
        sltu    $t2,$t3,$t0
        seq     $t8,$HH,$t1
@@ -958,15 +987,15 @@ $code.=<<___;
        $SRL    $HH,$a0,4*$BNSZ # bits
        $SRL    $QT,4*$BNSZ     # q=0xffffffff
        beq     $DH,$HH,.L_bn_div_words_skip_div2
-       $DIVU   $zero,$a0,$DH
-       mflo    $QT
+       $DIVU   ($a0,$DH)
+       mfqt    ($QT,$a0,$DH)
 .L_bn_div_words_skip_div2:
-       $MULTU  $a2,$QT
+       $MULTU  ($a2,$QT)
        $SLL    $t3,$a0,4*$BNSZ # bits
        $SRL    $at,$a1,4*$BNSZ # bits
        or      $t3,$at
-       mflo    $t0
-       mfhi    $t1
+       mflo    ($t0,$a2,$QT)
+       mfhi    ($t1,$a2,$QT)
 .L_bn_div_words_inner_loop2:
        sltu    $t2,$t3,$t0
        seq     $t8,$HH,$t1
@@ -1065,592 +1094,592 @@ $code.=<<___;
        $LD     $b_0,0($a2)
        $LD     $a_1,$BNSZ($a1)
        $LD     $a_2,2*$BNSZ($a1)
-       $MULTU  $a_0,$b_0               # mul_add_c(a[0],b[0],c1,c2,c3);
+       $MULTU  ($a_0,$b_0)             # mul_add_c(a[0],b[0],c1,c2,c3);
        $LD     $a_3,3*$BNSZ($a1)
        $LD     $b_1,$BNSZ($a2)
        $LD     $b_2,2*$BNSZ($a2)
        $LD     $b_3,3*$BNSZ($a2)
-       mflo    $c_1
-       mfhi    $c_2
+       mflo    ($c_1,$a_0,$b_0)
+       mfhi    ($c_2,$a_0,$b_0)
 
        $LD     $a_4,4*$BNSZ($a1)
        $LD     $a_5,5*$BNSZ($a1)
-       $MULTU  $a_0,$b_1               # mul_add_c(a[0],b[1],c2,c3,c1);
+       $MULTU  ($a_0,$b_1)             # mul_add_c(a[0],b[1],c2,c3,c1);
        $LD     $a_6,6*$BNSZ($a1)
        $LD     $a_7,7*$BNSZ($a1)
        $LD     $b_4,4*$BNSZ($a2)
        $LD     $b_5,5*$BNSZ($a2)
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_0,$b_1)
+       mfhi    ($t_2,$a_0,$b_1)
        $ADDU   $c_2,$t_1
        sltu    $at,$c_2,$t_1
-       $MULTU  $a_1,$b_0               # mul_add_c(a[1],b[0],c2,c3,c1);
+       $MULTU  ($a_1,$b_0)             # mul_add_c(a[1],b[0],c2,c3,c1);
        $ADDU   $c_3,$t_2,$at
        $LD     $b_6,6*$BNSZ($a2)
        $LD     $b_7,7*$BNSZ($a2)
        $ST     $c_1,0($a0)     # r[0]=c1;
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_1,$b_0)
+       mfhi    ($t_2,$a_1,$b_0)
        $ADDU   $c_2,$t_1
        sltu    $at,$c_2,$t_1
-        $MULTU $a_2,$b_0               # mul_add_c(a[2],b[0],c3,c1,c2);
+        $MULTU ($a_2,$b_0)             # mul_add_c(a[2],b[0],c3,c1,c2);
        $ADDU   $t_2,$at
        $ADDU   $c_3,$t_2
        sltu    $c_1,$c_3,$t_2
        $ST     $c_2,$BNSZ($a0) # r[1]=c2;
 
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_2,$b_0)
+       mfhi    ($t_2,$a_2,$b_0)
        $ADDU   $c_3,$t_1
        sltu    $at,$c_3,$t_1
-       $MULTU  $a_1,$b_1               # mul_add_c(a[1],b[1],c3,c1,c2);
+       $MULTU  ($a_1,$b_1)             # mul_add_c(a[1],b[1],c3,c1,c2);
        $ADDU   $t_2,$at
        $ADDU   $c_1,$t_2
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_1,$b_1)
+       mfhi    ($t_2,$a_1,$b_1)
        $ADDU   $c_3,$t_1
        sltu    $at,$c_3,$t_1
-       $MULTU  $a_0,$b_2               # mul_add_c(a[0],b[2],c3,c1,c2);
+       $MULTU  ($a_0,$b_2)             # mul_add_c(a[0],b[2],c3,c1,c2);
        $ADDU   $t_2,$at
        $ADDU   $c_1,$t_2
        sltu    $c_2,$c_1,$t_2
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_0,$b_2)
+       mfhi    ($t_2,$a_0,$b_2)
        $ADDU   $c_3,$t_1
        sltu    $at,$c_3,$t_1
-        $MULTU $a_0,$b_3               # mul_add_c(a[0],b[3],c1,c2,c3);
+        $MULTU ($a_0,$b_3)             # mul_add_c(a[0],b[3],c1,c2,c3);
        $ADDU   $t_2,$at
        $ADDU   $c_1,$t_2
        sltu    $at,$c_1,$t_2
        $ADDU   $c_2,$at
        $ST     $c_3,2*$BNSZ($a0)       # r[2]=c3;
 
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_0,$b_3)
+       mfhi    ($t_2,$a_0,$b_3)
        $ADDU   $c_1,$t_1
        sltu    $at,$c_1,$t_1
-       $MULTU  $a_1,$b_2               # mul_add_c(a[1],b[2],c1,c2,c3);
+       $MULTU  ($a_1,$b_2)             # mul_add_c(a[1],b[2],c1,c2,c3);
        $ADDU   $t_2,$at
        $ADDU   $c_2,$t_2
        sltu    $c_3,$c_2,$t_2
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_1,$b_2)
+       mfhi    ($t_2,$a_1,$b_2)
        $ADDU   $c_1,$t_1
        sltu    $at,$c_1,$t_1
-       $MULTU  $a_2,$b_1               # mul_add_c(a[2],b[1],c1,c2,c3);
+       $MULTU  ($a_2,$b_1)             # mul_add_c(a[2],b[1],c1,c2,c3);
        $ADDU   $t_2,$at
        $ADDU   $c_2,$t_2
        sltu    $at,$c_2,$t_2
        $ADDU   $c_3,$at
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_2,$b_1)
+       mfhi    ($t_2,$a_2,$b_1)
        $ADDU   $c_1,$t_1
        sltu    $at,$c_1,$t_1
-       $MULTU  $a_3,$b_0               # mul_add_c(a[3],b[0],c1,c2,c3);
+       $MULTU  ($a_3,$b_0)             # mul_add_c(a[3],b[0],c1,c2,c3);
        $ADDU   $t_2,$at
        $ADDU   $c_2,$t_2
        sltu    $at,$c_2,$t_2
        $ADDU   $c_3,$at
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_3,$b_0)
+       mfhi    ($t_2,$a_3,$b_0)
        $ADDU   $c_1,$t_1
        sltu    $at,$c_1,$t_1
-        $MULTU $a_4,$b_0               # mul_add_c(a[4],b[0],c2,c3,c1);
+        $MULTU ($a_4,$b_0)             # mul_add_c(a[4],b[0],c2,c3,c1);
        $ADDU   $t_2,$at
        $ADDU   $c_2,$t_2
        sltu    $at,$c_2,$t_2
        $ADDU   $c_3,$at
        $ST     $c_1,3*$BNSZ($a0)       # r[3]=c1;
 
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_4,$b_0)
+       mfhi    ($t_2,$a_4,$b_0)
        $ADDU   $c_2,$t_1
        sltu    $at,$c_2,$t_1
-       $MULTU  $a_3,$b_1               # mul_add_c(a[3],b[1],c2,c3,c1);
+       $MULTU  ($a_3,$b_1)             # mul_add_c(a[3],b[1],c2,c3,c1);
        $ADDU   $t_2,$at
        $ADDU   $c_3,$t_2
        sltu    $c_1,$c_3,$t_2
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_3,$b_1)
+       mfhi    ($t_2,$a_3,$b_1)
        $ADDU   $c_2,$t_1
        sltu    $at,$c_2,$t_1
-       $MULTU  $a_2,$b_2               # mul_add_c(a[2],b[2],c2,c3,c1);
+       $MULTU  ($a_2,$b_2)             # mul_add_c(a[2],b[2],c2,c3,c1);
        $ADDU   $t_2,$at
        $ADDU   $c_3,$t_2
        sltu    $at,$c_3,$t_2
        $ADDU   $c_1,$at
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_2,$b_2)
+       mfhi    ($t_2,$a_2,$b_2)
        $ADDU   $c_2,$t_1
        sltu    $at,$c_2,$t_1
-       $MULTU  $a_1,$b_3               # mul_add_c(a[1],b[3],c2,c3,c1);
+       $MULTU  ($a_1,$b_3)             # mul_add_c(a[1],b[3],c2,c3,c1);
        $ADDU   $t_2,$at
        $ADDU   $c_3,$t_2
        sltu    $at,$c_3,$t_2
        $ADDU   $c_1,$at
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_1,$b_3)
+       mfhi    ($t_2,$a_1,$b_3)
        $ADDU   $c_2,$t_1
        sltu    $at,$c_2,$t_1
-       $MULTU  $a_0,$b_4               # mul_add_c(a[0],b[4],c2,c3,c1);
+       $MULTU  ($a_0,$b_4)             # mul_add_c(a[0],b[4],c2,c3,c1);
        $ADDU   $t_2,$at
        $ADDU   $c_3,$t_2
        sltu    $at,$c_3,$t_2
        $ADDU   $c_1,$at
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_0,$b_4)
+       mfhi    ($t_2,$a_0,$b_4)
        $ADDU   $c_2,$t_1
        sltu    $at,$c_2,$t_1
-        $MULTU $a_0,$b_5               # mul_add_c(a[0],b[5],c3,c1,c2);
+        $MULTU ($a_0,$b_5)             # mul_add_c(a[0],b[5],c3,c1,c2);
        $ADDU   $t_2,$at
        $ADDU   $c_3,$t_2
        sltu    $at,$c_3,$t_2
        $ADDU   $c_1,$at
        $ST     $c_2,4*$BNSZ($a0)       # r[4]=c2;
 
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_0,$b_5)
+       mfhi    ($t_2,$a_0,$b_5)
        $ADDU   $c_3,$t_1
        sltu    $at,$c_3,$t_1
-       $MULTU  $a_1,$b_4               # mul_add_c(a[1],b[4],c3,c1,c2);
+       $MULTU  ($a_1,$b_4)             # mul_add_c(a[1],b[4],c3,c1,c2);
        $ADDU   $t_2,$at
        $ADDU   $c_1,$t_2
        sltu    $c_2,$c_1,$t_2
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_1,$b_4)
+       mfhi    ($t_2,$a_1,$b_4)
        $ADDU   $c_3,$t_1
        sltu    $at,$c_3,$t_1
-       $MULTU  $a_2,$b_3               # mul_add_c(a[2],b[3],c3,c1,c2);
+       $MULTU  ($a_2,$b_3)             # mul_add_c(a[2],b[3],c3,c1,c2);
        $ADDU   $t_2,$at
        $ADDU   $c_1,$t_2
        sltu    $at,$c_1,$t_2
        $ADDU   $c_2,$at
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_2,$b_3)
+       mfhi    ($t_2,$a_2,$b_3)
        $ADDU   $c_3,$t_1
        sltu    $at,$c_3,$t_1
-       $MULTU  $a_3,$b_2               # mul_add_c(a[3],b[2],c3,c1,c2);
+       $MULTU  ($a_3,$b_2)             # mul_add_c(a[3],b[2],c3,c1,c2);
        $ADDU   $t_2,$at
        $ADDU   $c_1,$t_2
        sltu    $at,$c_1,$t_2
        $ADDU   $c_2,$at
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_3,$b_2)
+       mfhi    ($t_2,$a_3,$b_2)
        $ADDU   $c_3,$t_1
        sltu    $at,$c_3,$t_1
-       $MULTU  $a_4,$b_1               # mul_add_c(a[4],b[1],c3,c1,c2);
+       $MULTU  ($a_4,$b_1)             # mul_add_c(a[4],b[1],c3,c1,c2);
        $ADDU   $t_2,$at
        $ADDU   $c_1,$t_2
        sltu    $at,$c_1,$t_2
        $ADDU   $c_2,$at
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_4,$b_1)
+       mfhi    ($t_2,$a_4,$b_1)
        $ADDU   $c_3,$t_1
        sltu    $at,$c_3,$t_1
-       $MULTU  $a_5,$b_0               # mul_add_c(a[5],b[0],c3,c1,c2);
+       $MULTU  ($a_5,$b_0)             # mul_add_c(a[5],b[0],c3,c1,c2);
        $ADDU   $t_2,$at
        $ADDU   $c_1,$t_2
        sltu    $at,$c_1,$t_2
        $ADDU   $c_2,$at
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_5,$b_0)
+       mfhi    ($t_2,$a_5,$b_0)
        $ADDU   $c_3,$t_1
        sltu    $at,$c_3,$t_1
-        $MULTU $a_6,$b_0               # mul_add_c(a[6],b[0],c1,c2,c3);
+        $MULTU ($a_6,$b_0)             # mul_add_c(a[6],b[0],c1,c2,c3);
        $ADDU   $t_2,$at
        $ADDU   $c_1,$t_2
        sltu    $at,$c_1,$t_2
        $ADDU   $c_2,$at
        $ST     $c_3,5*$BNSZ($a0)       # r[5]=c3;
 
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_6,$b_0)
+       mfhi    ($t_2,$a_6,$b_0)
        $ADDU   $c_1,$t_1
        sltu    $at,$c_1,$t_1
-       $MULTU  $a_5,$b_1               # mul_add_c(a[5],b[1],c1,c2,c3);
+       $MULTU  ($a_5,$b_1)             # mul_add_c(a[5],b[1],c1,c2,c3);
        $ADDU   $t_2,$at
        $ADDU   $c_2,$t_2
        sltu    $c_3,$c_2,$t_2
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_5,$b_1)
+       mfhi    ($t_2,$a_5,$b_1)
        $ADDU   $c_1,$t_1
        sltu    $at,$c_1,$t_1
-       $MULTU  $a_4,$b_2               # mul_add_c(a[4],b[2],c1,c2,c3);
+       $MULTU  ($a_4,$b_2)             # mul_add_c(a[4],b[2],c1,c2,c3);
        $ADDU   $t_2,$at
        $ADDU   $c_2,$t_2
        sltu    $at,$c_2,$t_2
        $ADDU   $c_3,$at
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_4,$b_2)
+       mfhi    ($t_2,$a_4,$b_2)
        $ADDU   $c_1,$t_1
        sltu    $at,$c_1,$t_1
-       $MULTU  $a_3,$b_3               # mul_add_c(a[3],b[3],c1,c2,c3);
+       $MULTU  ($a_3,$b_3)             # mul_add_c(a[3],b[3],c1,c2,c3);
        $ADDU   $t_2,$at
        $ADDU   $c_2,$t_2
        sltu    $at,$c_2,$t_2
        $ADDU   $c_3,$at
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_3,$b_3)
+       mfhi    ($t_2,$a_3,$b_3)
        $ADDU   $c_1,$t_1
        sltu    $at,$c_1,$t_1
-       $MULTU  $a_2,$b_4               # mul_add_c(a[2],b[4],c1,c2,c3);
+       $MULTU  ($a_2,$b_4)             # mul_add_c(a[2],b[4],c1,c2,c3);
        $ADDU   $t_2,$at
        $ADDU   $c_2,$t_2
        sltu    $at,$c_2,$t_2
        $ADDU   $c_3,$at
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_2,$b_4)
+       mfhi    ($t_2,$a_2,$b_4)
        $ADDU   $c_1,$t_1
        sltu    $at,$c_1,$t_1
-       $MULTU  $a_1,$b_5               # mul_add_c(a[1],b[5],c1,c2,c3);
+       $MULTU  ($a_1,$b_5)             # mul_add_c(a[1],b[5],c1,c2,c3);
        $ADDU   $t_2,$at
        $ADDU   $c_2,$t_2
        sltu    $at,$c_2,$t_2
        $ADDU   $c_3,$at
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_1,$b_5)
+       mfhi    ($t_2,$a_1,$b_5)
        $ADDU   $c_1,$t_1
        sltu    $at,$c_1,$t_1
-       $MULTU  $a_0,$b_6               # mul_add_c(a[0],b[6],c1,c2,c3);
+       $MULTU  ($a_0,$b_6)             # mul_add_c(a[0],b[6],c1,c2,c3);
        $ADDU   $t_2,$at
        $ADDU   $c_2,$t_2
        sltu    $at,$c_2,$t_2
        $ADDU   $c_3,$at
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_0,$b_6)
+       mfhi    ($t_2,$a_0,$b_6)
        $ADDU   $c_1,$t_1
        sltu    $at,$c_1,$t_1
-        $MULTU $a_0,$b_7               # mul_add_c(a[0],b[7],c2,c3,c1);
+        $MULTU ($a_0,$b_7)             # mul_add_c(a[0],b[7],c2,c3,c1);
        $ADDU   $t_2,$at
        $ADDU   $c_2,$t_2
        sltu    $at,$c_2,$t_2
        $ADDU   $c_3,$at
        $ST     $c_1,6*$BNSZ($a0)       # r[6]=c1;
 
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_0,$b_7)
+       mfhi    ($t_2,$a_0,$b_7)
        $ADDU   $c_2,$t_1
        sltu    $at,$c_2,$t_1
-       $MULTU  $a_1,$b_6               # mul_add_c(a[1],b[6],c2,c3,c1);
+       $MULTU  ($a_1,$b_6)             # mul_add_c(a[1],b[6],c2,c3,c1);
        $ADDU   $t_2,$at
        $ADDU   $c_3,$t_2
        sltu    $c_1,$c_3,$t_2
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_1,$b_6)
+       mfhi    ($t_2,$a_1,$b_6)
        $ADDU   $c_2,$t_1
        sltu    $at,$c_2,$t_1
-       $MULTU  $a_2,$b_5               # mul_add_c(a[2],b[5],c2,c3,c1);
+       $MULTU  ($a_2,$b_5)             # mul_add_c(a[2],b[5],c2,c3,c1);
        $ADDU   $t_2,$at
        $ADDU   $c_3,$t_2
        sltu    $at,$c_3,$t_2
        $ADDU   $c_1,$at
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_2,$b_5)
+       mfhi    ($t_2,$a_2,$b_5)
        $ADDU   $c_2,$t_1
        sltu    $at,$c_2,$t_1
-       $MULTU  $a_3,$b_4               # mul_add_c(a[3],b[4],c2,c3,c1);
+       $MULTU  ($a_3,$b_4)             # mul_add_c(a[3],b[4],c2,c3,c1);
        $ADDU   $t_2,$at
        $ADDU   $c_3,$t_2
        sltu    $at,$c_3,$t_2
        $ADDU   $c_1,$at
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_3,$b_4)
+       mfhi    ($t_2,$a_3,$b_4)
        $ADDU   $c_2,$t_1
        sltu    $at,$c_2,$t_1
-       $MULTU  $a_4,$b_3               # mul_add_c(a[4],b[3],c2,c3,c1);
+       $MULTU  ($a_4,$b_3)             # mul_add_c(a[4],b[3],c2,c3,c1);
        $ADDU   $t_2,$at
        $ADDU   $c_3,$t_2
        sltu    $at,$c_3,$t_2
        $ADDU   $c_1,$at
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_4,$b_3)
+       mfhi    ($t_2,$a_4,$b_3)
        $ADDU   $c_2,$t_1
        sltu    $at,$c_2,$t_1
-       $MULTU  $a_5,$b_2               # mul_add_c(a[5],b[2],c2,c3,c1);
+       $MULTU  ($a_5,$b_2)             # mul_add_c(a[5],b[2],c2,c3,c1);
        $ADDU   $t_2,$at
        $ADDU   $c_3,$t_2
        sltu    $at,$c_3,$t_2
        $ADDU   $c_1,$at
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_5,$b_2)
+       mfhi    ($t_2,$a_5,$b_2)
        $ADDU   $c_2,$t_1
        sltu    $at,$c_2,$t_1
-       $MULTU  $a_6,$b_1               # mul_add_c(a[6],b[1],c2,c3,c1);
+       $MULTU  ($a_6,$b_1)             # mul_add_c(a[6],b[1],c2,c3,c1);
        $ADDU   $t_2,$at
        $ADDU   $c_3,$t_2
        sltu    $at,$c_3,$t_2
        $ADDU   $c_1,$at
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_6,$b_1)
+       mfhi    ($t_2,$a_6,$b_1)
        $ADDU   $c_2,$t_1
        sltu    $at,$c_2,$t_1
-       $MULTU  $a_7,$b_0               # mul_add_c(a[7],b[0],c2,c3,c1);
+       $MULTU  ($a_7,$b_0)             # mul_add_c(a[7],b[0],c2,c3,c1);
        $ADDU   $t_2,$at
        $ADDU   $c_3,$t_2
        sltu    $at,$c_3,$t_2
        $ADDU   $c_1,$at
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_7,$b_0)
+       mfhi    ($t_2,$a_7,$b_0)
        $ADDU   $c_2,$t_1
        sltu    $at,$c_2,$t_1
-        $MULTU $a_7,$b_1               # mul_add_c(a[7],b[1],c3,c1,c2);
+        $MULTU ($a_7,$b_1)             # mul_add_c(a[7],b[1],c3,c1,c2);
        $ADDU   $t_2,$at
        $ADDU   $c_3,$t_2
        sltu    $at,$c_3,$t_2
        $ADDU   $c_1,$at
        $ST     $c_2,7*$BNSZ($a0)       # r[7]=c2;
 
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_7,$b_1)
+       mfhi    ($t_2,$a_7,$b_1)
        $ADDU   $c_3,$t_1
        sltu    $at,$c_3,$t_1
-       $MULTU  $a_6,$b_2               # mul_add_c(a[6],b[2],c3,c1,c2);
+       $MULTU  ($a_6,$b_2)             # mul_add_c(a[6],b[2],c3,c1,c2);
        $ADDU   $t_2,$at
        $ADDU   $c_1,$t_2
        sltu    $c_2,$c_1,$t_2
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_6,$b_2)
+       mfhi    ($t_2,$a_6,$b_2)
        $ADDU   $c_3,$t_1
        sltu    $at,$c_3,$t_1
-       $MULTU  $a_5,$b_3               # mul_add_c(a[5],b[3],c3,c1,c2);
+       $MULTU  ($a_5,$b_3)             # mul_add_c(a[5],b[3],c3,c1,c2);
        $ADDU   $t_2,$at
        $ADDU   $c_1,$t_2
        sltu    $at,$c_1,$t_2
        $ADDU   $c_2,$at
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_5,$b_3)
+       mfhi    ($t_2,$a_5,$b_3)
        $ADDU   $c_3,$t_1
        sltu    $at,$c_3,$t_1
-       $MULTU  $a_4,$b_4               # mul_add_c(a[4],b[4],c3,c1,c2);
+       $MULTU  ($a_4,$b_4)             # mul_add_c(a[4],b[4],c3,c1,c2);
        $ADDU   $t_2,$at
        $ADDU   $c_1,$t_2
        sltu    $at,$c_1,$t_2
        $ADDU   $c_2,$at
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_4,$b_4)
+       mfhi    ($t_2,$a_4,$b_4)
        $ADDU   $c_3,$t_1
        sltu    $at,$c_3,$t_1
-       $MULTU  $a_3,$b_5               # mul_add_c(a[3],b[5],c3,c1,c2);
+       $MULTU  ($a_3,$b_5)             # mul_add_c(a[3],b[5],c3,c1,c2);
        $ADDU   $t_2,$at
        $ADDU   $c_1,$t_2
        sltu    $at,$c_1,$t_2
        $ADDU   $c_2,$at
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_3,$b_5)
+       mfhi    ($t_2,$a_3,$b_5)
        $ADDU   $c_3,$t_1
        sltu    $at,$c_3,$t_1
-       $MULTU  $a_2,$b_6               # mul_add_c(a[2],b[6],c3,c1,c2);
+       $MULTU  ($a_2,$b_6)             # mul_add_c(a[2],b[6],c3,c1,c2);
        $ADDU   $t_2,$at
        $ADDU   $c_1,$t_2
        sltu    $at,$c_1,$t_2
        $ADDU   $c_2,$at
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_2,$b_6)
+       mfhi    ($t_2,$a_2,$b_6)
        $ADDU   $c_3,$t_1
        sltu    $at,$c_3,$t_1
-       $MULTU  $a_1,$b_7               # mul_add_c(a[1],b[7],c3,c1,c2);
+       $MULTU  ($a_1,$b_7)             # mul_add_c(a[1],b[7],c3,c1,c2);
        $ADDU   $t_2,$at
        $ADDU   $c_1,$t_2
        sltu    $at,$c_1,$t_2
        $ADDU   $c_2,$at
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_1,$b_7)
+       mfhi    ($t_2,$a_1,$b_7)
        $ADDU   $c_3,$t_1
        sltu    $at,$c_3,$t_1
-        $MULTU $a_2,$b_7               # mul_add_c(a[2],b[7],c1,c2,c3);
+        $MULTU ($a_2,$b_7)             # mul_add_c(a[2],b[7],c1,c2,c3);
        $ADDU   $t_2,$at
        $ADDU   $c_1,$t_2
        sltu    $at,$c_1,$t_2
        $ADDU   $c_2,$at
        $ST     $c_3,8*$BNSZ($a0)       # r[8]=c3;
 
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_2,$b_7)
+       mfhi    ($t_2,$a_2,$b_7)
        $ADDU   $c_1,$t_1
        sltu    $at,$c_1,$t_1
-       $MULTU  $a_3,$b_6               # mul_add_c(a[3],b[6],c1,c2,c3);
+       $MULTU  ($a_3,$b_6)             # mul_add_c(a[3],b[6],c1,c2,c3);
        $ADDU   $t_2,$at
        $ADDU   $c_2,$t_2
        sltu    $c_3,$c_2,$t_2
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_3,$b_6)
+       mfhi    ($t_2,$a_3,$b_6)
        $ADDU   $c_1,$t_1
        sltu    $at,$c_1,$t_1
-       $MULTU  $a_4,$b_5               # mul_add_c(a[4],b[5],c1,c2,c3);
+       $MULTU  ($a_4,$b_5)             # mul_add_c(a[4],b[5],c1,c2,c3);
        $ADDU   $t_2,$at
        $ADDU   $c_2,$t_2
        sltu    $at,$c_2,$t_2
        $ADDU   $c_3,$at
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_4,$b_5)
+       mfhi    ($t_2,$a_4,$b_5)
        $ADDU   $c_1,$t_1
        sltu    $at,$c_1,$t_1
-       $MULTU  $a_5,$b_4               # mul_add_c(a[5],b[4],c1,c2,c3);
+       $MULTU  ($a_5,$b_4)             # mul_add_c(a[5],b[4],c1,c2,c3);
        $ADDU   $t_2,$at
        $ADDU   $c_2,$t_2
        sltu    $at,$c_2,$t_2
        $ADDU   $c_3,$at
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_5,$b_4)
+       mfhi    ($t_2,$a_5,$b_4)
        $ADDU   $c_1,$t_1
        sltu    $at,$c_1,$t_1
-       $MULTU  $a_6,$b_3               # mul_add_c(a[6],b[3],c1,c2,c3);
+       $MULTU  ($a_6,$b_3)             # mul_add_c(a[6],b[3],c1,c2,c3);
        $ADDU   $t_2,$at
        $ADDU   $c_2,$t_2
        sltu    $at,$c_2,$t_2
        $ADDU   $c_3,$at
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_6,$b_3)
+       mfhi    ($t_2,$a_6,$b_3)
        $ADDU   $c_1,$t_1
        sltu    $at,$c_1,$t_1
-       $MULTU  $a_7,$b_2               # mul_add_c(a[7],b[2],c1,c2,c3);
+       $MULTU  ($a_7,$b_2)             # mul_add_c(a[7],b[2],c1,c2,c3);
        $ADDU   $t_2,$at
        $ADDU   $c_2,$t_2
        sltu    $at,$c_2,$t_2
        $ADDU   $c_3,$at
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_7,$b_2)
+       mfhi    ($t_2,$a_7,$b_2)
        $ADDU   $c_1,$t_1
        sltu    $at,$c_1,$t_1
-        $MULTU $a_7,$b_3               # mul_add_c(a[7],b[3],c2,c3,c1);
+        $MULTU ($a_7,$b_3)             # mul_add_c(a[7],b[3],c2,c3,c1);
        $ADDU   $t_2,$at
        $ADDU   $c_2,$t_2
        sltu    $at,$c_2,$t_2
        $ADDU   $c_3,$at
        $ST     $c_1,9*$BNSZ($a0)       # r[9]=c1;
 
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_7,$b_3)
+       mfhi    ($t_2,$a_7,$b_3)
        $ADDU   $c_2,$t_1
        sltu    $at,$c_2,$t_1
-       $MULTU  $a_6,$b_4               # mul_add_c(a[6],b[4],c2,c3,c1);
+       $MULTU  ($a_6,$b_4)             # mul_add_c(a[6],b[4],c2,c3,c1);
        $ADDU   $t_2,$at
        $ADDU   $c_3,$t_2
        sltu    $c_1,$c_3,$t_2
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_6,$b_4)
+       mfhi    ($t_2,$a_6,$b_4)
        $ADDU   $c_2,$t_1
        sltu    $at,$c_2,$t_1
-       $MULTU  $a_5,$b_5               # mul_add_c(a[5],b[5],c2,c3,c1);
+       $MULTU  ($a_5,$b_5)             # mul_add_c(a[5],b[5],c2,c3,c1);
        $ADDU   $t_2,$at
        $ADDU   $c_3,$t_2
        sltu    $at,$c_3,$t_2
        $ADDU   $c_1,$at
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_5,$b_5)
+       mfhi    ($t_2,$a_5,$b_5)
        $ADDU   $c_2,$t_1
        sltu    $at,$c_2,$t_1
-       $MULTU  $a_4,$b_6               # mul_add_c(a[4],b[6],c2,c3,c1);
+       $MULTU  ($a_4,$b_6)             # mul_add_c(a[4],b[6],c2,c3,c1);
        $ADDU   $t_2,$at
        $ADDU   $c_3,$t_2
        sltu    $at,$c_3,$t_2
        $ADDU   $c_1,$at
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_4,$b_6)
+       mfhi    ($t_2,$a_4,$b_6)
        $ADDU   $c_2,$t_1
        sltu    $at,$c_2,$t_1
-       $MULTU  $a_3,$b_7               # mul_add_c(a[3],b[7],c2,c3,c1);
+       $MULTU  ($a_3,$b_7)             # mul_add_c(a[3],b[7],c2,c3,c1);
        $ADDU   $t_2,$at
        $ADDU   $c_3,$t_2
        sltu    $at,$c_3,$t_2
        $ADDU   $c_1,$at
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_3,$b_7)
+       mfhi    ($t_2,$a_3,$b_7)
        $ADDU   $c_2,$t_1
        sltu    $at,$c_2,$t_1
-       $MULTU  $a_4,$b_7               # mul_add_c(a[4],b[7],c3,c1,c2);
+       $MULTU  ($a_4,$b_7)             # mul_add_c(a[4],b[7],c3,c1,c2);
        $ADDU   $t_2,$at
        $ADDU   $c_3,$t_2
        sltu    $at,$c_3,$t_2
        $ADDU   $c_1,$at
        $ST     $c_2,10*$BNSZ($a0)      # r[10]=c2;
 
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_4,$b_7)
+       mfhi    ($t_2,$a_4,$b_7)
        $ADDU   $c_3,$t_1
        sltu    $at,$c_3,$t_1
-       $MULTU  $a_5,$b_6               # mul_add_c(a[5],b[6],c3,c1,c2);
+       $MULTU  ($a_5,$b_6)             # mul_add_c(a[5],b[6],c3,c1,c2);
        $ADDU   $t_2,$at
        $ADDU   $c_1,$t_2
        sltu    $c_2,$c_1,$t_2
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_5,$b_6)
+       mfhi    ($t_2,$a_5,$b_6)
        $ADDU   $c_3,$t_1
        sltu    $at,$c_3,$t_1
-       $MULTU  $a_6,$b_5               # mul_add_c(a[6],b[5],c3,c1,c2);
+       $MULTU  ($a_6,$b_5)             # mul_add_c(a[6],b[5],c3,c1,c2);
        $ADDU   $t_2,$at
        $ADDU   $c_1,$t_2
        sltu    $at,$c_1,$t_2
        $ADDU   $c_2,$at
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_6,$b_5)
+       mfhi    ($t_2,$a_6,$b_5)
        $ADDU   $c_3,$t_1
        sltu    $at,$c_3,$t_1
-       $MULTU  $a_7,$b_4               # mul_add_c(a[7],b[4],c3,c1,c2);
+       $MULTU  ($a_7,$b_4)             # mul_add_c(a[7],b[4],c3,c1,c2);
        $ADDU   $t_2,$at
        $ADDU   $c_1,$t_2
        sltu    $at,$c_1,$t_2
        $ADDU   $c_2,$at
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_7,$b_4)
+       mfhi    ($t_2,$a_7,$b_4)
        $ADDU   $c_3,$t_1
        sltu    $at,$c_3,$t_1
-        $MULTU $a_7,$b_5               # mul_add_c(a[7],b[5],c1,c2,c3);
+        $MULTU ($a_7,$b_5)             # mul_add_c(a[7],b[5],c1,c2,c3);
        $ADDU   $t_2,$at
        $ADDU   $c_1,$t_2
        sltu    $at,$c_1,$t_2
        $ADDU   $c_2,$at
        $ST     $c_3,11*$BNSZ($a0)      # r[11]=c3;
 
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_7,$b_5)
+       mfhi    ($t_2,$a_7,$b_5)
        $ADDU   $c_1,$t_1
        sltu    $at,$c_1,$t_1
-       $MULTU  $a_6,$b_6               # mul_add_c(a[6],b[6],c1,c2,c3);
+       $MULTU  ($a_6,$b_6)             # mul_add_c(a[6],b[6],c1,c2,c3);
        $ADDU   $t_2,$at
        $ADDU   $c_2,$t_2
        sltu    $c_3,$c_2,$t_2
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_6,$b_6)
+       mfhi    ($t_2,$a_6,$b_6)
        $ADDU   $c_1,$t_1
        sltu    $at,$c_1,$t_1
-       $MULTU  $a_5,$b_7               # mul_add_c(a[5],b[7],c1,c2,c3);
+       $MULTU  ($a_5,$b_7)             # mul_add_c(a[5],b[7],c1,c2,c3);
        $ADDU   $t_2,$at
        $ADDU   $c_2,$t_2
        sltu    $at,$c_2,$t_2
        $ADDU   $c_3,$at
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_5,$b_7)
+       mfhi    ($t_2,$a_5,$b_7)
        $ADDU   $c_1,$t_1
        sltu    $at,$c_1,$t_1
-        $MULTU $a_6,$b_7               # mul_add_c(a[6],b[7],c2,c3,c1);
+        $MULTU ($a_6,$b_7)             # mul_add_c(a[6],b[7],c2,c3,c1);
        $ADDU   $t_2,$at
        $ADDU   $c_2,$t_2
        sltu    $at,$c_2,$t_2
        $ADDU   $c_3,$at
        $ST     $c_1,12*$BNSZ($a0)      # r[12]=c1;
 
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_6,$b_7)
+       mfhi    ($t_2,$a_6,$b_7)
        $ADDU   $c_2,$t_1
        sltu    $at,$c_2,$t_1
-       $MULTU  $a_7,$b_6               # mul_add_c(a[7],b[6],c2,c3,c1);
+       $MULTU  ($a_7,$b_6)             # mul_add_c(a[7],b[6],c2,c3,c1);
        $ADDU   $t_2,$at
        $ADDU   $c_3,$t_2
        sltu    $c_1,$c_3,$t_2
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_7,$b_6)
+       mfhi    ($t_2,$a_7,$b_6)
        $ADDU   $c_2,$t_1
        sltu    $at,$c_2,$t_1
-       $MULTU  $a_7,$b_7               # mul_add_c(a[7],b[7],c3,c1,c2);
+       $MULTU  ($a_7,$b_7)             # mul_add_c(a[7],b[7],c3,c1,c2);
        $ADDU   $t_2,$at
        $ADDU   $c_3,$t_2
        sltu    $at,$c_3,$t_2
        $ADDU   $c_1,$at
        $ST     $c_2,13*$BNSZ($a0)      # r[13]=c2;
 
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_7,$b_7)
+       mfhi    ($t_2,$a_7,$b_7)
        $ADDU   $c_3,$t_1
        sltu    $at,$c_3,$t_1
        $ADDU   $t_2,$at
@@ -1711,144 +1740,144 @@ $code.=<<___;
        $LD     $b_0,0($a2)
        $LD     $a_1,$BNSZ($a1)
        $LD     $a_2,2*$BNSZ($a1)
-       $MULTU  $a_0,$b_0               # mul_add_c(a[0],b[0],c1,c2,c3);
+       $MULTU  ($a_0,$b_0)             # mul_add_c(a[0],b[0],c1,c2,c3);
        $LD     $a_3,3*$BNSZ($a1)
        $LD     $b_1,$BNSZ($a2)
        $LD     $b_2,2*$BNSZ($a2)
        $LD     $b_3,3*$BNSZ($a2)
-       mflo    $c_1
-       mfhi    $c_2
+       mflo    ($c_1,$a_0,$b_0)
+       mfhi    ($c_2,$a_0,$b_0)
        $ST     $c_1,0($a0)
 
-       $MULTU  $a_0,$b_1               # mul_add_c(a[0],b[1],c2,c3,c1);
-       mflo    $t_1
-       mfhi    $t_2
+       $MULTU  ($a_0,$b_1)             # mul_add_c(a[0],b[1],c2,c3,c1);
+       mflo    ($t_1,$a_0,$b_1)
+       mfhi    ($t_2,$a_0,$b_1)
        $ADDU   $c_2,$t_1
        sltu    $at,$c_2,$t_1
-       $MULTU  $a_1,$b_0               # mul_add_c(a[1],b[0],c2,c3,c1);
+       $MULTU  ($a_1,$b_0)             # mul_add_c(a[1],b[0],c2,c3,c1);
        $ADDU   $c_3,$t_2,$at
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_1,$b_0)
+       mfhi    ($t_2,$a_1,$b_0)
        $ADDU   $c_2,$t_1
        sltu    $at,$c_2,$t_1
-        $MULTU $a_2,$b_0               # mul_add_c(a[2],b[0],c3,c1,c2);
+        $MULTU ($a_2,$b_0)             # mul_add_c(a[2],b[0],c3,c1,c2);
        $ADDU   $t_2,$at
        $ADDU   $c_3,$t_2
        sltu    $c_1,$c_3,$t_2
        $ST     $c_2,$BNSZ($a0)
 
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_2,$b_0)
+       mfhi    ($t_2,$a_2,$b_0)
        $ADDU   $c_3,$t_1
        sltu    $at,$c_3,$t_1
-       $MULTU  $a_1,$b_1               # mul_add_c(a[1],b[1],c3,c1,c2);
+       $MULTU  ($a_1,$b_1)             # mul_add_c(a[1],b[1],c3,c1,c2);
        $ADDU   $t_2,$at
        $ADDU   $c_1,$t_2
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_1,$b_1)
+       mfhi    ($t_2,$a_1,$b_1)
        $ADDU   $c_3,$t_1
        sltu    $at,$c_3,$t_1
-       $MULTU  $a_0,$b_2               # mul_add_c(a[0],b[2],c3,c1,c2);
+       $MULTU  ($a_0,$b_2)             # mul_add_c(a[0],b[2],c3,c1,c2);
        $ADDU   $t_2,$at
        $ADDU   $c_1,$t_2
        sltu    $c_2,$c_1,$t_2
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_0,$b_2)
+       mfhi    ($t_2,$a_0,$b_2)
        $ADDU   $c_3,$t_1
        sltu    $at,$c_3,$t_1
-        $MULTU $a_0,$b_3               # mul_add_c(a[0],b[3],c1,c2,c3);
+        $MULTU ($a_0,$b_3)             # mul_add_c(a[0],b[3],c1,c2,c3);
        $ADDU   $t_2,$at
        $ADDU   $c_1,$t_2
        sltu    $at,$c_1,$t_2
        $ADDU   $c_2,$at
        $ST     $c_3,2*$BNSZ($a0)
 
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_0,$b_3)
+       mfhi    ($t_2,$a_0,$b_3)
        $ADDU   $c_1,$t_1
        sltu    $at,$c_1,$t_1
-       $MULTU  $a_1,$b_2               # mul_add_c(a[1],b[2],c1,c2,c3);
+       $MULTU  ($a_1,$b_2)             # mul_add_c(a[1],b[2],c1,c2,c3);
        $ADDU   $t_2,$at
        $ADDU   $c_2,$t_2
        sltu    $c_3,$c_2,$t_2
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_1,$b_2)
+       mfhi    ($t_2,$a_1,$b_2)
        $ADDU   $c_1,$t_1
        sltu    $at,$c_1,$t_1
-       $MULTU  $a_2,$b_1               # mul_add_c(a[2],b[1],c1,c2,c3);
+       $MULTU  ($a_2,$b_1)             # mul_add_c(a[2],b[1],c1,c2,c3);
        $ADDU   $t_2,$at
        $ADDU   $c_2,$t_2
        sltu    $at,$c_2,$t_2
        $ADDU   $c_3,$at
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_2,$b_1)
+       mfhi    ($t_2,$a_2,$b_1)
        $ADDU   $c_1,$t_1
        sltu    $at,$c_1,$t_1
-       $MULTU  $a_3,$b_0               # mul_add_c(a[3],b[0],c1,c2,c3);
+       $MULTU  ($a_3,$b_0)             # mul_add_c(a[3],b[0],c1,c2,c3);
        $ADDU   $t_2,$at
        $ADDU   $c_2,$t_2
        sltu    $at,$c_2,$t_2
        $ADDU   $c_3,$at
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_3,$b_0)
+       mfhi    ($t_2,$a_3,$b_0)
        $ADDU   $c_1,$t_1
        sltu    $at,$c_1,$t_1
-        $MULTU $a_3,$b_1               # mul_add_c(a[3],b[1],c2,c3,c1);
+        $MULTU ($a_3,$b_1)             # mul_add_c(a[3],b[1],c2,c3,c1);
        $ADDU   $t_2,$at
        $ADDU   $c_2,$t_2
        sltu    $at,$c_2,$t_2
        $ADDU   $c_3,$at
        $ST     $c_1,3*$BNSZ($a0)
 
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_3,$b_1)
+       mfhi    ($t_2,$a_3,$b_1)
        $ADDU   $c_2,$t_1
        sltu    $at,$c_2,$t_1
-       $MULTU  $a_2,$b_2               # mul_add_c(a[2],b[2],c2,c3,c1);
+       $MULTU  ($a_2,$b_2)             # mul_add_c(a[2],b[2],c2,c3,c1);
        $ADDU   $t_2,$at
        $ADDU   $c_3,$t_2
        sltu    $c_1,$c_3,$t_2
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_2,$b_2)
+       mfhi    ($t_2,$a_2,$b_2)
        $ADDU   $c_2,$t_1
        sltu    $at,$c_2,$t_1
-       $MULTU  $a_1,$b_3               # mul_add_c(a[1],b[3],c2,c3,c1);
+       $MULTU  ($a_1,$b_3)             # mul_add_c(a[1],b[3],c2,c3,c1);
        $ADDU   $t_2,$at
        $ADDU   $c_3,$t_2
        sltu    $at,$c_3,$t_2
        $ADDU   $c_1,$at
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_1,$b_3)
+       mfhi    ($t_2,$a_1,$b_3)
        $ADDU   $c_2,$t_1
        sltu    $at,$c_2,$t_1
-        $MULTU $a_2,$b_3               # mul_add_c(a[2],b[3],c3,c1,c2);
+        $MULTU ($a_2,$b_3)             # mul_add_c(a[2],b[3],c3,c1,c2);
        $ADDU   $t_2,$at
        $ADDU   $c_3,$t_2
        sltu    $at,$c_3,$t_2
        $ADDU   $c_1,$at
        $ST     $c_2,4*$BNSZ($a0)
 
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_2,$b_3)
+       mfhi    ($t_2,$a_2,$b_3)
        $ADDU   $c_3,$t_1
        sltu    $at,$c_3,$t_1
-       $MULTU  $a_3,$b_2               # mul_add_c(a[3],b[2],c3,c1,c2);
+       $MULTU  ($a_3,$b_2)             # mul_add_c(a[3],b[2],c3,c1,c2);
        $ADDU   $t_2,$at
        $ADDU   $c_1,$t_2
        sltu    $c_2,$c_1,$t_2
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_3,$b_2)
+       mfhi    ($t_2,$a_3,$b_2)
        $ADDU   $c_3,$t_1
        sltu    $at,$c_3,$t_1
-        $MULTU $a_3,$b_3               # mul_add_c(a[3],b[3],c1,c2,c3);
+        $MULTU ($a_3,$b_3)             # mul_add_c(a[3],b[3],c1,c2,c3);
        $ADDU   $t_2,$at
        $ADDU   $c_1,$t_2
        sltu    $at,$c_1,$t_2
        $ADDU   $c_2,$at
        $ST     $c_3,5*$BNSZ($a0)
 
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_3,$b_3)
+       mfhi    ($t_2,$a_3,$b_3)
        $ADDU   $c_1,$t_1
        sltu    $at,$c_1,$t_1
        $ADDU   $t_2,$at
@@ -1874,6 +1903,41 @@ ___
 
 ($a_4,$a_5,$a_6,$a_7)=($b_0,$b_1,$b_2,$b_3);
 
+sub add_c2 () {
+my ($hi,$lo,$c0,$c1,$c2,
+    $warm,      # !$warm denotes first call with specific sequence of
+                # $c_[XYZ] when there is no Z-carry to accumulate yet;
+    $an,$bn     # these two are arguments for multiplication which
+                # result is used in *next* step [which is why it's
+                # commented as "forward multiplication" below];
+    )=@_;
+$code.=<<___;
+       $ADDU   $c0,$lo
+       sltu    $at,$c0,$lo
+        $MULTU ($an,$bn)               # forward multiplication
+       $ADDU   $c0,$lo
+       $ADDU   $at,$hi
+       sltu    $lo,$c0,$lo
+       $ADDU   $c1,$at
+       $ADDU   $hi,$lo
+___
+$code.=<<___   if (!$warm);
+       sltu    $c2,$c1,$at
+       $ADDU   $c1,$hi
+___
+$code.=<<___   if ($warm);
+       sltu    $at,$c1,$at
+       $ADDU   $c1,$hi
+       $ADDU   $c2,$at
+___
+$code.=<<___;
+       sltu    $hi,$c1,$hi
+       $ADDU   $c2,$hi
+       mflo    ($lo,$an,$bn)
+       mfhi    ($hi,$an,$bn)
+___
+}
+
 $code.=<<___;
 
 .align 5
@@ -1900,21 +1964,21 @@ $code.=<<___;
        $LD     $a_2,2*$BNSZ($a1)
        $LD     $a_3,3*$BNSZ($a1)
 
-       $MULTU  $a_0,$a_0               # mul_add_c(a[0],b[0],c1,c2,c3);
+       $MULTU  ($a_0,$a_0)             # mul_add_c(a[0],b[0],c1,c2,c3);
        $LD     $a_4,4*$BNSZ($a1)
        $LD     $a_5,5*$BNSZ($a1)
        $LD     $a_6,6*$BNSZ($a1)
        $LD     $a_7,7*$BNSZ($a1)
-       mflo    $c_1
-       mfhi    $c_2
+       mflo    ($c_1,$a_0,$a_0)
+       mfhi    ($c_2,$a_0,$a_0)
        $ST     $c_1,0($a0)
 
-       $MULTU  $a_0,$a_1               # mul_add_c2(a[0],b[1],c2,c3,c1);
-       mflo    $t_1
-       mfhi    $t_2
+       $MULTU  ($a_0,$a_1)             # mul_add_c2(a[0],b[1],c2,c3,c1);
+       mflo    ($t_1,$a_0,$a_1)
+       mfhi    ($t_2,$a_0,$a_1)
        slt     $c_1,$t_2,$zero
        $SLL    $t_2,1
-        $MULTU $a_2,$a_0               # mul_add_c2(a[2],b[0],c3,c1,c2);
+        $MULTU ($a_2,$a_0)             # mul_add_c2(a[2],b[0],c3,c1,c2);
        slt     $a2,$t_1,$zero
        $ADDU   $t_2,$a2
        $SLL    $t_1,1
@@ -1922,480 +1986,153 @@ $code.=<<___;
        sltu    $at,$c_2,$t_1
        $ADDU   $c_3,$t_2,$at
        $ST     $c_2,$BNSZ($a0)
-
-       mflo    $t_1
-       mfhi    $t_2
-       slt     $c_2,$t_2,$zero
-       $SLL    $t_2,1
-       $MULTU  $a_1,$a_1               # mul_add_c(a[1],b[1],c3,c1,c2);
-       slt     $a2,$t_1,$zero
-       $ADDU   $t_2,$a2
-       $SLL    $t_1,1
-       $ADDU   $c_3,$t_1
-       sltu    $at,$c_3,$t_1
-       $ADDU   $t_2,$at
-       $ADDU   $c_1,$t_2
-       sltu    $at,$c_1,$t_2
-       $ADDU   $c_2,$at
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_2,$a_0)
+       mfhi    ($t_2,$a_2,$a_0)
+___
+       &add_c2($t_2,$t_1,$c_3,$c_1,$c_2,0,
+               $a_1,$a_1);             # mul_add_c(a[1],b[1],c3,c1,c2);
+$code.=<<___;
        $ADDU   $c_3,$t_1
        sltu    $at,$c_3,$t_1
-        $MULTU $a_0,$a_3               # mul_add_c2(a[0],b[3],c1,c2,c3);
+        $MULTU ($a_0,$a_3)             # mul_add_c2(a[0],b[3],c1,c2,c3);
        $ADDU   $t_2,$at
        $ADDU   $c_1,$t_2
        sltu    $at,$c_1,$t_2
        $ADDU   $c_2,$at
        $ST     $c_3,2*$BNSZ($a0)
-
-       mflo    $t_1
-       mfhi    $t_2
-       slt     $c_3,$t_2,$zero
-       $SLL    $t_2,1
-       $MULTU  $a_1,$a_2               # mul_add_c2(a[1],b[2],c1,c2,c3);
-       slt     $a2,$t_1,$zero
-       $ADDU   $t_2,$a2
-       $SLL    $t_1,1
-       $ADDU   $c_1,$t_1
-       sltu    $at,$c_1,$t_1
-       $ADDU   $t_2,$at
-       $ADDU   $c_2,$t_2
-       sltu    $at,$c_2,$t_2
-       $ADDU   $c_3,$at
-       mflo    $t_1
-       mfhi    $t_2
-       slt     $at,$t_2,$zero
-       $ADDU   $c_3,$at
-        $MULTU $a_4,$a_0               # mul_add_c2(a[4],b[0],c2,c3,c1);
-       $SLL    $t_2,1
-       slt     $a2,$t_1,$zero
-       $ADDU   $t_2,$a2
-       $SLL    $t_1,1
-       $ADDU   $c_1,$t_1
-       sltu    $at,$c_1,$t_1
-       $ADDU   $t_2,$at
-       $ADDU   $c_2,$t_2
-       sltu    $at,$c_2,$t_2
-       $ADDU   $c_3,$at
+       mflo    ($t_1,$a_0,$a_3)
+       mfhi    ($t_2,$a_0,$a_3)
+___
+       &add_c2($t_2,$t_1,$c_1,$c_2,$c_3,0,
+               $a_1,$a_2);             # mul_add_c2(a[1],b[2],c1,c2,c3);
+       &add_c2($t_2,$t_1,$c_1,$c_2,$c_3,1,
+               $a_4,$a_0);             # mul_add_c2(a[4],b[0],c2,c3,c1);
+$code.=<<___;
        $ST     $c_1,3*$BNSZ($a0)
-
-       mflo    $t_1
-       mfhi    $t_2
-       slt     $c_1,$t_2,$zero
-       $SLL    $t_2,1
-       $MULTU  $a_3,$a_1               # mul_add_c2(a[3],b[1],c2,c3,c1);
-       slt     $a2,$t_1,$zero
-       $ADDU   $t_2,$a2
-       $SLL    $t_1,1
-       $ADDU   $c_2,$t_1
-       sltu    $at,$c_2,$t_1
-       $ADDU   $t_2,$at
-       $ADDU   $c_3,$t_2
-       sltu    $at,$c_3,$t_2
-       $ADDU   $c_1,$at
-       mflo    $t_1
-       mfhi    $t_2
-       slt     $at,$t_2,$zero
-       $ADDU   $c_1,$at
-       $MULTU  $a_2,$a_2               # mul_add_c(a[2],b[2],c2,c3,c1);
-       $SLL    $t_2,1
-       slt     $a2,$t_1,$zero
-       $ADDU   $t_2,$a2
-       $SLL    $t_1,1
-       $ADDU   $c_2,$t_1
-       sltu    $at,$c_2,$t_1
-       $ADDU   $t_2,$at
-       $ADDU   $c_3,$t_2
-       sltu    $at,$c_3,$t_2
-       $ADDU   $c_1,$at
-       mflo    $t_1
-       mfhi    $t_2
+___
+       &add_c2($t_2,$t_1,$c_2,$c_3,$c_1,0,
+               $a_3,$a_1);             # mul_add_c2(a[3],b[1],c2,c3,c1);
+       &add_c2($t_2,$t_1,$c_2,$c_3,$c_1,1,
+               $a_2,$a_2);             # mul_add_c(a[2],b[2],c2,c3,c1);
+$code.=<<___;
        $ADDU   $c_2,$t_1
        sltu    $at,$c_2,$t_1
-        $MULTU $a_0,$a_5               # mul_add_c2(a[0],b[5],c3,c1,c2);
+        $MULTU ($a_0,$a_5)             # mul_add_c2(a[0],b[5],c3,c1,c2);
        $ADDU   $t_2,$at
        $ADDU   $c_3,$t_2
        sltu    $at,$c_3,$t_2
        $ADDU   $c_1,$at
        $ST     $c_2,4*$BNSZ($a0)
-
-       mflo    $t_1
-       mfhi    $t_2
-       slt     $c_2,$t_2,$zero
-       $SLL    $t_2,1
-       $MULTU  $a_1,$a_4               # mul_add_c2(a[1],b[4],c3,c1,c2);
-       slt     $a2,$t_1,$zero
-       $ADDU   $t_2,$a2
-       $SLL    $t_1,1
-       $ADDU   $c_3,$t_1
-       sltu    $at,$c_3,$t_1
-       $ADDU   $t_2,$at
-       $ADDU   $c_1,$t_2
-       sltu    $at,$c_1,$t_2
-       $ADDU   $c_2,$at
-       mflo    $t_1
-       mfhi    $t_2
-       slt     $at,$t_2,$zero
-       $ADDU   $c_2,$at
-       $MULTU  $a_2,$a_3               # mul_add_c2(a[2],b[3],c3,c1,c2);
-       $SLL    $t_2,1
-       slt     $a2,$t_1,$zero
-       $ADDU   $t_2,$a2
-       $SLL    $t_1,1
-       $ADDU   $c_3,$t_1
-       sltu    $at,$c_3,$t_1
-       $ADDU   $t_2,$at
-       $ADDU   $c_1,$t_2
-       sltu    $at,$c_1,$t_2
-       $ADDU   $c_2,$at
-       mflo    $t_1
-       mfhi    $t_2
-       slt     $at,$t_2,$zero
-        $MULTU $a_6,$a_0               # mul_add_c2(a[6],b[0],c1,c2,c3);
-       $ADDU   $c_2,$at
-       $SLL    $t_2,1
-       slt     $a2,$t_1,$zero
-       $ADDU   $t_2,$a2
-       $SLL    $t_1,1
-       $ADDU   $c_3,$t_1
-       sltu    $at,$c_3,$t_1
-       $ADDU   $t_2,$at
-       $ADDU   $c_1,$t_2
-       sltu    $at,$c_1,$t_2
-       $ADDU   $c_2,$at
+       mflo    ($t_1,$a_0,$a_5)
+       mfhi    ($t_2,$a_0,$a_5)
+___
+       &add_c2($t_2,$t_1,$c_3,$c_1,$c_2,0,
+               $a_1,$a_4);             # mul_add_c2(a[1],b[4],c3,c1,c2);
+       &add_c2($t_2,$t_1,$c_3,$c_1,$c_2,1,
+               $a_2,$a_3);             # mul_add_c2(a[2],b[3],c3,c1,c2);
+       &add_c2($t_2,$t_1,$c_3,$c_1,$c_2,1,
+               $a_6,$a_0);             # mul_add_c2(a[6],b[0],c1,c2,c3);
+$code.=<<___;
        $ST     $c_3,5*$BNSZ($a0)
-
-       mflo    $t_1
-       mfhi    $t_2
-       slt     $c_3,$t_2,$zero
-       $SLL    $t_2,1
-       $MULTU  $a_5,$a_1               # mul_add_c2(a[5],b[1],c1,c2,c3);
-       slt     $a2,$t_1,$zero
-       $ADDU   $t_2,$a2
-       $SLL    $t_1,1
-       $ADDU   $c_1,$t_1
-       sltu    $at,$c_1,$t_1
-       $ADDU   $t_2,$at
-       $ADDU   $c_2,$t_2
-       sltu    $at,$c_2,$t_2
-       $ADDU   $c_3,$at
-       mflo    $t_1
-       mfhi    $t_2
-       slt     $at,$t_2,$zero
-       $ADDU   $c_3,$at
-       $MULTU  $a_4,$a_2               # mul_add_c2(a[4],b[2],c1,c2,c3);
-       $SLL    $t_2,1
-       slt     $a2,$t_1,$zero
-       $ADDU   $t_2,$a2
-       $SLL    $t_1,1
-       $ADDU   $c_1,$t_1
-       sltu    $at,$c_1,$t_1
-       $ADDU   $t_2,$at
-       $ADDU   $c_2,$t_2
-       sltu    $at,$c_2,$t_2
-       $ADDU   $c_3,$at
-       mflo    $t_1
-       mfhi    $t_2
-       slt     $at,$t_2,$zero
-       $ADDU   $c_3,$at
-       $MULTU  $a_3,$a_3               # mul_add_c(a[3],b[3],c1,c2,c3);
-       $SLL    $t_2,1
-       slt     $a2,$t_1,$zero
-       $ADDU   $t_2,$a2
-       $SLL    $t_1,1
-       $ADDU   $c_1,$t_1
-       sltu    $at,$c_1,$t_1
-       $ADDU   $t_2,$at
-       $ADDU   $c_2,$t_2
-       sltu    $at,$c_2,$t_2
-       $ADDU   $c_3,$at
-       mflo    $t_1
-       mfhi    $t_2
+___
+       &add_c2($t_2,$t_1,$c_1,$c_2,$c_3,0,
+               $a_5,$a_1);             # mul_add_c2(a[5],b[1],c1,c2,c3);
+       &add_c2($t_2,$t_1,$c_1,$c_2,$c_3,1,
+               $a_4,$a_2);             # mul_add_c2(a[4],b[2],c1,c2,c3);
+       &add_c2($t_2,$t_1,$c_1,$c_2,$c_3,1,
+               $a_3,$a_3);             # mul_add_c(a[3],b[3],c1,c2,c3);
+$code.=<<___;
        $ADDU   $c_1,$t_1
        sltu    $at,$c_1,$t_1
-        $MULTU $a_0,$a_7               # mul_add_c2(a[0],b[7],c2,c3,c1);
+        $MULTU ($a_0,$a_7)             # mul_add_c2(a[0],b[7],c2,c3,c1);
        $ADDU   $t_2,$at
        $ADDU   $c_2,$t_2
        sltu    $at,$c_2,$t_2
        $ADDU   $c_3,$at
        $ST     $c_1,6*$BNSZ($a0)
-
-       mflo    $t_1
-       mfhi    $t_2
-       slt     $c_1,$t_2,$zero
-       $SLL    $t_2,1
-       $MULTU  $a_1,$a_6               # mul_add_c2(a[1],b[6],c2,c3,c1);
-       slt     $a2,$t_1,$zero
-       $ADDU   $t_2,$a2
-       $SLL    $t_1,1
-       $ADDU   $c_2,$t_1
-       sltu    $at,$c_2,$t_1
-       $ADDU   $t_2,$at
-       $ADDU   $c_3,$t_2
-       sltu    $at,$c_3,$t_2
-       $ADDU   $c_1,$at
-       mflo    $t_1
-       mfhi    $t_2
-       slt     $at,$t_2,$zero
-       $ADDU   $c_1,$at
-       $MULTU  $a_2,$a_5               # mul_add_c2(a[2],b[5],c2,c3,c1);
-       $SLL    $t_2,1
-       slt     $a2,$t_1,$zero
-       $ADDU   $t_2,$a2
-       $SLL    $t_1,1
-       $ADDU   $c_2,$t_1
-       sltu    $at,$c_2,$t_1
-       $ADDU   $t_2,$at
-       $ADDU   $c_3,$t_2
-       sltu    $at,$c_3,$t_2
-       $ADDU   $c_1,$at
-       mflo    $t_1
-       mfhi    $t_2
-       slt     $at,$t_2,$zero
-       $ADDU   $c_1,$at
-       $MULTU  $a_3,$a_4               # mul_add_c2(a[3],b[4],c2,c3,c1);
-       $SLL    $t_2,1
-       slt     $a2,$t_1,$zero
-       $ADDU   $t_2,$a2
-       $SLL    $t_1,1
-       $ADDU   $c_2,$t_1
-       sltu    $at,$c_2,$t_1
-       $ADDU   $t_2,$at
-       $ADDU   $c_3,$t_2
-       sltu    $at,$c_3,$t_2
-       $ADDU   $c_1,$at
-       mflo    $t_1
-       mfhi    $t_2
-       slt     $at,$t_2,$zero
-       $ADDU   $c_1,$at
-        $MULTU $a_7,$a_1               # mul_add_c2(a[7],b[1],c3,c1,c2);
-       $SLL    $t_2,1
-       slt     $a2,$t_1,$zero
-       $ADDU   $t_2,$a2
-       $SLL    $t_1,1
-       $ADDU   $c_2,$t_1
-       sltu    $at,$c_2,$t_1
-       $ADDU   $t_2,$at
-       $ADDU   $c_3,$t_2
-       sltu    $at,$c_3,$t_2
-       $ADDU   $c_1,$at
+       mflo    ($t_1,$a_0,$a_7)
+       mfhi    ($t_2,$a_0,$a_7)
+___
+       &add_c2($t_2,$t_1,$c_2,$c_3,$c_1,0,
+               $a_1,$a_6);             # mul_add_c2(a[1],b[6],c2,c3,c1);
+       &add_c2($t_2,$t_1,$c_2,$c_3,$c_1,1,
+               $a_2,$a_5);             # mul_add_c2(a[2],b[5],c2,c3,c1);
+       &add_c2($t_2,$t_1,$c_2,$c_3,$c_1,1,
+               $a_3,$a_4);             # mul_add_c2(a[3],b[4],c2,c3,c1);
+       &add_c2($t_2,$t_1,$c_2,$c_3,$c_1,1,
+               $a_7,$a_1);             # mul_add_c2(a[7],b[1],c3,c1,c2);
+$code.=<<___;
        $ST     $c_2,7*$BNSZ($a0)
-
-       mflo    $t_1
-       mfhi    $t_2
-       slt     $c_2,$t_2,$zero
-       $SLL    $t_2,1
-       $MULTU  $a_6,$a_2               # mul_add_c2(a[6],b[2],c3,c1,c2);
-       slt     $a2,$t_1,$zero
-       $ADDU   $t_2,$a2
-       $SLL    $t_1,1
-       $ADDU   $c_3,$t_1
-       sltu    $at,$c_3,$t_1
-       $ADDU   $t_2,$at
-       $ADDU   $c_1,$t_2
-       sltu    $at,$c_1,$t_2
-       $ADDU   $c_2,$at
-       mflo    $t_1
-       mfhi    $t_2
-       slt     $at,$t_2,$zero
-       $ADDU   $c_2,$at
-       $MULTU  $a_5,$a_3               # mul_add_c2(a[5],b[3],c3,c1,c2);
-       $SLL    $t_2,1
-       slt     $a2,$t_1,$zero
-       $ADDU   $t_2,$a2
-       $SLL    $t_1,1
-       $ADDU   $c_3,$t_1
-       sltu    $at,$c_3,$t_1
-       $ADDU   $t_2,$at
-       $ADDU   $c_1,$t_2
-       sltu    $at,$c_1,$t_2
-       $ADDU   $c_2,$at
-       mflo    $t_1
-       mfhi    $t_2
-       slt     $at,$t_2,$zero
-       $ADDU   $c_2,$at
-       $MULTU  $a_4,$a_4               # mul_add_c(a[4],b[4],c3,c1,c2);
-       $SLL    $t_2,1
-       slt     $a2,$t_1,$zero
-       $ADDU   $t_2,$a2
-       $SLL    $t_1,1
-       $ADDU   $c_3,$t_1
-       sltu    $at,$c_3,$t_1
-       $ADDU   $t_2,$at
-       $ADDU   $c_1,$t_2
-       sltu    $at,$c_1,$t_2
-       $ADDU   $c_2,$at
-       mflo    $t_1
-       mfhi    $t_2
+___
+       &add_c2($t_2,$t_1,$c_3,$c_1,$c_2,0,
+               $a_6,$a_2);             # mul_add_c2(a[6],b[2],c3,c1,c2);
+       &add_c2($t_2,$t_1,$c_3,$c_1,$c_2,1,
+               $a_5,$a_3);             # mul_add_c2(a[5],b[3],c3,c1,c2);
+       &add_c2($t_2,$t_1,$c_3,$c_1,$c_2,1,
+               $a_4,$a_4);             # mul_add_c(a[4],b[4],c3,c1,c2);
+$code.=<<___;
        $ADDU   $c_3,$t_1
        sltu    $at,$c_3,$t_1
-        $MULTU $a_2,$a_7               # mul_add_c2(a[2],b[7],c1,c2,c3);
+        $MULTU ($a_2,$a_7)             # mul_add_c2(a[2],b[7],c1,c2,c3);
        $ADDU   $t_2,$at
        $ADDU   $c_1,$t_2
        sltu    $at,$c_1,$t_2
        $ADDU   $c_2,$at
        $ST     $c_3,8*$BNSZ($a0)
-
-       mflo    $t_1
-       mfhi    $t_2
-       slt     $c_3,$t_2,$zero
-       $SLL    $t_2,1
-       $MULTU  $a_3,$a_6               # mul_add_c2(a[3],b[6],c1,c2,c3);
-       slt     $a2,$t_1,$zero
-       $ADDU   $t_2,$a2
-       $SLL    $t_1,1
-       $ADDU   $c_1,$t_1
-       sltu    $at,$c_1,$t_1
-       $ADDU   $t_2,$at
-       $ADDU   $c_2,$t_2
-       sltu    $at,$c_2,$t_2
-       $ADDU   $c_3,$at
-       mflo    $t_1
-       mfhi    $t_2
-       slt     $at,$t_2,$zero
-       $ADDU   $c_3,$at
-       $MULTU  $a_4,$a_5               # mul_add_c2(a[4],b[5],c1,c2,c3);
-       $SLL    $t_2,1
-       slt     $a2,$t_1,$zero
-       $ADDU   $t_2,$a2
-       $SLL    $t_1,1
-       $ADDU   $c_1,$t_1
-       sltu    $at,$c_1,$t_1
-       $ADDU   $t_2,$at
-       $ADDU   $c_2,$t_2
-       sltu    $at,$c_2,$t_2
-       $ADDU   $c_3,$at
-       mflo    $t_1
-       mfhi    $t_2
-       slt     $at,$t_2,$zero
-       $ADDU   $c_3,$at
-        $MULTU $a_7,$a_3               # mul_add_c2(a[7],b[3],c2,c3,c1);
-       $SLL    $t_2,1
-       slt     $a2,$t_1,$zero
-       $ADDU   $t_2,$a2
-       $SLL    $t_1,1
-       $ADDU   $c_1,$t_1
-       sltu    $at,$c_1,$t_1
-       $ADDU   $t_2,$at
-       $ADDU   $c_2,$t_2
-       sltu    $at,$c_2,$t_2
-       $ADDU   $c_3,$at
+       mflo    ($t_1,$a_2,$a_7)
+       mfhi    ($t_2,$a_2,$a_7)
+___
+       &add_c2($t_2,$t_1,$c_1,$c_2,$c_3,0,
+               $a_3,$a_6);             # mul_add_c2(a[3],b[6],c1,c2,c3);
+       &add_c2($t_2,$t_1,$c_1,$c_2,$c_3,1,
+               $a_4,$a_5);             # mul_add_c2(a[4],b[5],c1,c2,c3);
+       &add_c2($t_2,$t_1,$c_1,$c_2,$c_3,1,
+               $a_7,$a_3);             # mul_add_c2(a[7],b[3],c2,c3,c1);
+$code.=<<___;
        $ST     $c_1,9*$BNSZ($a0)
-
-       mflo    $t_1
-       mfhi    $t_2
-       slt     $c_1,$t_2,$zero
-       $SLL    $t_2,1
-       $MULTU  $a_6,$a_4               # mul_add_c2(a[6],b[4],c2,c3,c1);
-       slt     $a2,$t_1,$zero
-       $ADDU   $t_2,$a2
-       $SLL    $t_1,1
-       $ADDU   $c_2,$t_1
-       sltu    $at,$c_2,$t_1
-       $ADDU   $t_2,$at
-       $ADDU   $c_3,$t_2
-       sltu    $at,$c_3,$t_2
-       $ADDU   $c_1,$at
-       mflo    $t_1
-       mfhi    $t_2
-       slt     $at,$t_2,$zero
-       $ADDU   $c_1,$at
-       $MULTU  $a_5,$a_5               # mul_add_c(a[5],b[5],c2,c3,c1);
-       $SLL    $t_2,1
-       slt     $a2,$t_1,$zero
-       $ADDU   $t_2,$a2
-       $SLL    $t_1,1
-       $ADDU   $c_2,$t_1
-       sltu    $at,$c_2,$t_1
-       $ADDU   $t_2,$at
-       $ADDU   $c_3,$t_2
-       sltu    $at,$c_3,$t_2
-       $ADDU   $c_1,$at
-       mflo    $t_1
-       mfhi    $t_2
+___
+       &add_c2($t_2,$t_1,$c_2,$c_3,$c_1,0,
+               $a_6,$a_4);             # mul_add_c2(a[6],b[4],c2,c3,c1);
+       &add_c2($t_2,$t_1,$c_2,$c_3,$c_1,1,
+               $a_5,$a_5);             # mul_add_c(a[5],b[5],c2,c3,c1);
+$code.=<<___;
        $ADDU   $c_2,$t_1
        sltu    $at,$c_2,$t_1
-        $MULTU $a_4,$a_7               # mul_add_c2(a[4],b[7],c3,c1,c2);
+        $MULTU ($a_4,$a_7)             # mul_add_c2(a[4],b[7],c3,c1,c2);
        $ADDU   $t_2,$at
        $ADDU   $c_3,$t_2
        sltu    $at,$c_3,$t_2
        $ADDU   $c_1,$at
        $ST     $c_2,10*$BNSZ($a0)
-
-       mflo    $t_1
-       mfhi    $t_2
-       slt     $c_2,$t_2,$zero
-       $SLL    $t_2,1
-       $MULTU  $a_5,$a_6               # mul_add_c2(a[5],b[6],c3,c1,c2);
-       slt     $a2,$t_1,$zero
-       $ADDU   $t_2,$a2
-       $SLL    $t_1,1
-       $ADDU   $c_3,$t_1
-       sltu    $at,$c_3,$t_1
-       $ADDU   $t_2,$at
-       $ADDU   $c_1,$t_2
-       sltu    $at,$c_1,$t_2
-       $ADDU   $c_2,$at
-       mflo    $t_1
-       mfhi    $t_2
-       slt     $at,$t_2,$zero
-       $ADDU   $c_2,$at
-        $MULTU $a_7,$a_5               # mul_add_c2(a[7],b[5],c1,c2,c3);
-       $SLL    $t_2,1
-       slt     $a2,$t_1,$zero
-       $ADDU   $t_2,$a2
-       $SLL    $t_1,1
-       $ADDU   $c_3,$t_1
-       sltu    $at,$c_3,$t_1
-       $ADDU   $t_2,$at
-       $ADDU   $c_1,$t_2
-       sltu    $at,$c_1,$t_2
-       $ADDU   $c_2,$at
+       mflo    ($t_1,$a_4,$a_7)
+       mfhi    ($t_2,$a_4,$a_7)
+___
+       &add_c2($t_2,$t_1,$c_3,$c_1,$c_2,0,
+               $a_5,$a_6);             # mul_add_c2(a[5],b[6],c3,c1,c2);
+       &add_c2($t_2,$t_1,$c_3,$c_1,$c_2,1,
+               $a_7,$a_5);             # mul_add_c2(a[7],b[5],c1,c2,c3);
+$code.=<<___;
        $ST     $c_3,11*$BNSZ($a0)
-
-       mflo    $t_1
-       mfhi    $t_2
-       slt     $c_3,$t_2,$zero
-       $SLL    $t_2,1
-       $MULTU  $a_6,$a_6               # mul_add_c(a[6],b[6],c1,c2,c3);
-       slt     $a2,$t_1,$zero
-       $ADDU   $t_2,$a2
-       $SLL    $t_1,1
-       $ADDU   $c_1,$t_1
-       sltu    $at,$c_1,$t_1
-       $ADDU   $t_2,$at
-       $ADDU   $c_2,$t_2
-       sltu    $at,$c_2,$t_2
-       $ADDU   $c_3,$at
-       mflo    $t_1
-       mfhi    $t_2
+___
+       &add_c2($t_2,$t_1,$c_1,$c_2,$c_3,0,
+               $a_6,$a_6);             # mul_add_c(a[6],b[6],c1,c2,c3);
+$code.=<<___;
        $ADDU   $c_1,$t_1
        sltu    $at,$c_1,$t_1
-        $MULTU $a_6,$a_7               # mul_add_c2(a[6],b[7],c2,c3,c1);
+        $MULTU ($a_6,$a_7)             # mul_add_c2(a[6],b[7],c2,c3,c1);
        $ADDU   $t_2,$at
        $ADDU   $c_2,$t_2
        sltu    $at,$c_2,$t_2
        $ADDU   $c_3,$at
        $ST     $c_1,12*$BNSZ($a0)
-
-       mflo    $t_1
-       mfhi    $t_2
-       slt     $c_1,$t_2,$zero
-       $SLL    $t_2,1
-        $MULTU $a_7,$a_7               # mul_add_c(a[7],b[7],c3,c1,c2);
-       slt     $a2,$t_1,$zero
-       $ADDU   $t_2,$a2
-       $SLL    $t_1,1
-       $ADDU   $c_2,$t_1
-       sltu    $at,$c_2,$t_1
-       $ADDU   $t_2,$at
-       $ADDU   $c_3,$t_2
-       sltu    $at,$c_3,$t_2
-       $ADDU   $c_1,$at
+       mflo    ($t_1,$a_6,$a_7)
+       mfhi    ($t_2,$a_6,$a_7)
+___
+       &add_c2($t_2,$t_1,$c_2,$c_3,$c_1,0,
+               $a_7,$a_7);             # mul_add_c(a[7],b[7],c3,c1,c2);
+$code.=<<___;
        $ST     $c_2,13*$BNSZ($a0)
 
-       mflo    $t_1
-       mfhi    $t_2
        $ADDU   $c_3,$t_1
        sltu    $at,$c_3,$t_1
        $ADDU   $t_2,$at
@@ -2439,19 +2176,19 @@ $code.=<<___;
        .set    reorder
        $LD     $a_0,0($a1)
        $LD     $a_1,$BNSZ($a1)
-       $MULTU  $a_0,$a_0               # mul_add_c(a[0],b[0],c1,c2,c3);
+       $MULTU  ($a_0,$a_0)             # mul_add_c(a[0],b[0],c1,c2,c3);
        $LD     $a_2,2*$BNSZ($a1)
        $LD     $a_3,3*$BNSZ($a1)
-       mflo    $c_1
-       mfhi    $c_2
+       mflo    ($c_1,$a_0,$a_0)
+       mfhi    ($c_2,$a_0,$a_0)
        $ST     $c_1,0($a0)
 
-       $MULTU  $a_0,$a_1               # mul_add_c2(a[0],b[1],c2,c3,c1);
-       mflo    $t_1
-       mfhi    $t_2
+       $MULTU  ($a_0,$a_1)             # mul_add_c2(a[0],b[1],c2,c3,c1);
+       mflo    ($t_1,$a_0,$a_1)
+       mfhi    ($t_2,$a_0,$a_1)
        slt     $c_1,$t_2,$zero
        $SLL    $t_2,1
-        $MULTU $a_2,$a_0               # mul_add_c2(a[2],b[0],c3,c1,c2);
+        $MULTU ($a_2,$a_0)             # mul_add_c2(a[2],b[0],c3,c1,c2);
        slt     $a2,$t_1,$zero
        $ADDU   $t_2,$a2
        $SLL    $t_1,1
@@ -2459,106 +2196,49 @@ $code.=<<___;
        sltu    $at,$c_2,$t_1
        $ADDU   $c_3,$t_2,$at
        $ST     $c_2,$BNSZ($a0)
-
-       mflo    $t_1
-       mfhi    $t_2
-       slt     $c_2,$t_2,$zero
-       $SLL    $t_2,1
-       $MULTU  $a_1,$a_1               # mul_add_c(a[1],b[1],c3,c1,c2);
-       slt     $a2,$t_1,$zero
-       $ADDU   $t_2,$a2
-       $SLL    $t_1,1
-       $ADDU   $c_3,$t_1
-       sltu    $at,$c_3,$t_1
-       $ADDU   $t_2,$at
-       $ADDU   $c_1,$t_2
-       sltu    $at,$c_1,$t_2
-       $ADDU   $c_2,$at
-       mflo    $t_1
-       mfhi    $t_2
+       mflo    ($t_1,$a_2,$a_0)
+       mfhi    ($t_2,$a_2,$a_0)
+___
+       &add_c2($t_2,$t_1,$c_3,$c_1,$c_2,0,
+               $a_1,$a_1);             # mul_add_c(a[1],b[1],c3,c1,c2);
+$code.=<<___;
        $ADDU   $c_3,$t_1
        sltu    $at,$c_3,$t_1
-        $MULTU $a_0,$a_3               # mul_add_c2(a[0],b[3],c1,c2,c3);
+        $MULTU ($a_0,$a_3)             # mul_add_c2(a[0],b[3],c1,c2,c3);
        $ADDU   $t_2,$at
        $ADDU   $c_1,$t_2
        sltu    $at,$c_1,$t_2
        $ADDU   $c_2,$at
        $ST     $c_3,2*$BNSZ($a0)
-
-       mflo    $t_1
-       mfhi    $t_2
-       slt     $c_3,$t_2,$zero
-       $SLL    $t_2,1
-       $MULTU  $a_1,$a_2               # mul_add_c(a2[1],b[2],c1,c2,c3);
-       slt     $a2,$t_1,$zero
-       $ADDU   $t_2,$a2
-       $SLL    $t_1,1
-       $ADDU   $c_1,$t_1
-       sltu    $at,$c_1,$t_1
-       $ADDU   $t_2,$at
-       $ADDU   $c_2,$t_2
-       sltu    $at,$c_2,$t_2
-       $ADDU   $c_3,$at
-       mflo    $t_1
-       mfhi    $t_2
-       slt     $at,$t_2,$zero
-       $ADDU   $c_3,$at
-        $MULTU $a_3,$a_1               # mul_add_c2(a[3],b[1],c2,c3,c1);
-       $SLL    $t_2,1
-       slt     $a2,$t_1,$zero
-       $ADDU   $t_2,$a2
-       $SLL    $t_1,1
-       $ADDU   $c_1,$t_1
-       sltu    $at,$c_1,$t_1
-       $ADDU   $t_2,$at
-       $ADDU   $c_2,$t_2
-       sltu    $at,$c_2,$t_2
-       $ADDU   $c_3,$at
+       mflo    ($t_1,$a_0,$a_3)
+       mfhi    ($t_2,$a_0,$a_3)
+___
+       &add_c2($t_2,$t_1,$c_1,$c_2,$c_3,0,
+               $a_1,$a_2);             # mul_add_c2(a2[1],b[2],c1,c2,c3);
+       &add_c2($t_2,$t_1,$c_1,$c_2,$c_3,1,
+               $a_3,$a_1);             # mul_add_c2(a[3],b[1],c2,c3,c1);
+$code.=<<___;
        $ST     $c_1,3*$BNSZ($a0)
-
-       mflo    $t_1
-       mfhi    $t_2
-       slt     $c_1,$t_2,$zero
-       $SLL    $t_2,1
-       $MULTU  $a_2,$a_2               # mul_add_c(a[2],b[2],c2,c3,c1);
-       slt     $a2,$t_1,$zero
-       $ADDU   $t_2,$a2
-       $SLL    $t_1,1
-       $ADDU   $c_2,$t_1
-       sltu    $at,$c_2,$t_1
-       $ADDU   $t_2,$at
-       $ADDU   $c_3,$t_2
-       sltu    $at,$c_3,$t_2
-       $ADDU   $c_1,$at
-       mflo    $t_1
-       mfhi    $t_2
+___
+       &add_c2($t_2,$t_1,$c_2,$c_3,$c_1,0,
+               $a_2,$a_2);             # mul_add_c(a[2],b[2],c2,c3,c1);
+$code.=<<___;
        $ADDU   $c_2,$t_1
        sltu    $at,$c_2,$t_1
-        $MULTU $a_2,$a_3               # mul_add_c2(a[2],b[3],c3,c1,c2);
+        $MULTU ($a_2,$a_3)             # mul_add_c2(a[2],b[3],c3,c1,c2);
        $ADDU   $t_2,$at
        $ADDU   $c_3,$t_2
        sltu    $at,$c_3,$t_2
        $ADDU   $c_1,$at
        $ST     $c_2,4*$BNSZ($a0)
-
-       mflo    $t_1
-       mfhi    $t_2
-       slt     $c_2,$t_2,$zero
-       $SLL    $t_2,1
-        $MULTU $a_3,$a_3               # mul_add_c(a[3],b[3],c1,c2,c3);
-       slt     $a2,$t_1,$zero
-       $ADDU   $t_2,$a2
-       $SLL    $t_1,1
-       $ADDU   $c_3,$t_1
-       sltu    $at,$c_3,$t_1
-       $ADDU   $t_2,$at
-       $ADDU   $c_1,$t_2
-       sltu    $at,$c_1,$t_2
-       $ADDU   $c_2,$at
+       mflo    ($t_1,$a_2,$a_3)
+       mfhi    ($t_2,$a_2,$a_3)
+___
+       &add_c2($t_2,$t_1,$c_3,$c_1,$c_2,0,
+               $a_3,$a_3);             # mul_add_c(a[3],b[3],c1,c2,c3);
+$code.=<<___;
        $ST     $c_3,5*$BNSZ($a0)
 
-       mflo    $t_1
-       mfhi    $t_2
        $ADDU   $c_1,$t_1
        sltu    $at,$c_1,$t_1
        $ADDU   $t_2,$at
@@ -2582,4 +2262,4 @@ $code.=<<___;
 .end   bn_sqr_comba4
 ___
 print $code;
-close STDOUT;
+close STDOUT or die "error closing STDOUT: $!";