This fixes "Spurious test failures on IRIX?" reported in April. Apparently
authorAndy Polyakov <appro@openssl.org>
Fri, 22 Jun 2001 19:17:42 +0000 (19:17 +0000)
committerAndy Polyakov <appro@openssl.org>
Fri, 22 Jun 2001 19:17:42 +0000 (19:17 +0000)
I was wrong in conclusions about when addition starts overflowing in combaX
routines.

crypto/bn/asm/mips3.s

index 45786c0..dca4105 100644 (file)
@@ -1,5 +1,5 @@
 .rdata
-.asciiz "mips3.s, Version 1.0"
+.asciiz        "mips3.s, Version 1.1"
 .asciiz        "MIPS III/IV ISA artwork by Andy Polyakov <appro@fy.chalmers.se>"
 
 /*
@@ -849,6 +849,7 @@ LEAF(bn_mul_comba8)
        sltu    AT,c_1,t_1
        daddu   t_2,AT
        daddu   c_2,t_2
+       sltu    c_3,c_2,t_2
        dmultu  a_1,b_2         /* mul_add_c(a[1],b[2],c1,c2,c3); */
        mflo    t_1
        mfhi    t_2
@@ -856,7 +857,8 @@ LEAF(bn_mul_comba8)
        sltu    AT,c_1,t_1
        daddu   t_2,AT
        daddu   c_2,t_2
-       sltu    c_3,c_2,t_2
+       sltu    AT,c_2,t_2
+       daddu   c_3,AT
        dmultu  a_2,b_1         /* mul_add_c(a[2],b[1],c1,c2,c3); */
        mflo    t_1
        mfhi    t_2
@@ -884,6 +886,7 @@ LEAF(bn_mul_comba8)
        sltu    AT,c_2,t_1
        daddu   t_2,AT
        daddu   c_3,t_2
+       sltu    c_1,c_3,t_2
        dmultu  a_3,b_1         /* mul_add_c(a[3],b[1],c2,c3,c1); */
        mflo    t_1
        mfhi    t_2
@@ -891,7 +894,8 @@ LEAF(bn_mul_comba8)
        sltu    AT,c_2,t_1
        daddu   t_2,AT
        daddu   c_3,t_2
-       sltu    c_1,c_3,t_2
+       sltu    AT,c_3,t_2
+       daddu   c_1,AT
        dmultu  a_2,b_2         /* mul_add_c(a[2],b[2],c2,c3,c1); */
        mflo    t_1
        mfhi    t_2
@@ -928,6 +932,7 @@ LEAF(bn_mul_comba8)
        sltu    AT,c_3,t_1
        daddu   t_2,AT
        daddu   c_1,t_2
+       sltu    c_2,c_1,t_2
        dmultu  a_1,b_4         /* mul_add_c(a[1],b[4],c3,c1,c2); */
        mflo    t_1
        mfhi    t_2
@@ -935,7 +940,8 @@ LEAF(bn_mul_comba8)
        sltu    AT,c_3,t_1
        daddu   t_2,AT
        daddu   c_1,t_2
-       sltu    c_2,c_1,t_2
+       sltu    AT,c_1,t_2
+       daddu   c_2,AT
        dmultu  a_2,b_3         /* mul_add_c(a[2],b[3],c3,c1,c2); */
        mflo    t_1
        mfhi    t_2
@@ -981,6 +987,7 @@ LEAF(bn_mul_comba8)
        sltu    AT,c_1,t_1
        daddu   t_2,AT
        daddu   c_2,t_2
+       sltu    c_3,c_2,t_2
        dmultu  a_5,b_1         /* mul_add_c(a[5],b[1],c1,c2,c3); */
        mflo    t_1
        mfhi    t_2
@@ -988,7 +995,8 @@ LEAF(bn_mul_comba8)
        sltu    AT,c_1,t_1
        daddu   t_2,AT
        daddu   c_2,t_2
-       sltu    c_3,c_2,t_2
+       sltu    AT,c_2,t_2
+       daddu   c_3,AT
        dmultu  a_4,b_2         /* mul_add_c(a[4],b[2],c1,c2,c3); */
        mflo    t_1
        mfhi    t_2
@@ -1043,6 +1051,7 @@ LEAF(bn_mul_comba8)
        sltu    AT,c_2,t_1
        daddu   t_2,AT
        daddu   c_3,t_2
+       sltu    c_1,c_3,t_2
        dmultu  a_1,b_6         /* mul_add_c(a[1],b[6],c2,c3,c1); */
        mflo    t_1
        mfhi    t_2
@@ -1050,7 +1059,8 @@ LEAF(bn_mul_comba8)
        sltu    AT,c_2,t_1
        daddu   t_2,AT
        daddu   c_3,t_2
-       sltu    c_1,c_3,t_2
+       sltu    AT,c_3,t_2
+       daddu   c_1,AT
        dmultu  a_2,b_5         /* mul_add_c(a[2],b[5],c2,c3,c1); */
        mflo    t_1
        mfhi    t_2
@@ -1114,6 +1124,7 @@ LEAF(bn_mul_comba8)
        sltu    AT,c_3,t_1
        daddu   t_2,AT
        daddu   c_1,t_2
+       sltu    c_2,c_1,t_2
        dmultu  a_6,b_2         /* mul_add_c(a[6],b[2],c3,c1,c2); */
        mflo    t_1
        mfhi    t_2
@@ -1121,7 +1132,8 @@ LEAF(bn_mul_comba8)
        sltu    AT,c_3,t_1
        daddu   t_2,AT
        daddu   c_1,t_2
-       sltu    c_2,c_1,t_2
+       sltu    AT,c_1,t_2
+       daddu   c_2,AT
        dmultu  a_5,b_3         /* mul_add_c(a[5],b[3],c3,c1,c2); */
        mflo    t_1
        mfhi    t_2
@@ -1176,6 +1188,7 @@ LEAF(bn_mul_comba8)
        sltu    AT,c_1,t_1
        daddu   t_2,AT
        daddu   c_2,t_2
+       sltu    c_3,c_2,t_2
        dmultu  a_3,b_6         /* mul_add_c(a[3],b[6],c1,c2,c3); */
        mflo    t_1
        mfhi    t_2
@@ -1183,7 +1196,8 @@ LEAF(bn_mul_comba8)
        sltu    AT,c_1,t_1
        daddu   t_2,AT
        daddu   c_2,t_2
-       sltu    c_3,c_2,t_2
+       sltu    AT,c_2,t_2
+       daddu   c_3,AT
        dmultu  a_4,b_5         /* mul_add_c(a[4],b[5],c1,c2,c3); */
        mflo    t_1
        mfhi    t_2
@@ -1229,6 +1243,7 @@ LEAF(bn_mul_comba8)
        sltu    AT,c_2,t_1
        daddu   t_2,AT
        daddu   c_3,t_2
+       sltu    c_1,c_3,t_2
        dmultu  a_6,b_4         /* mul_add_c(a[6],b[4],c2,c3,c1); */
        mflo    t_1
        mfhi    t_2
@@ -1236,7 +1251,8 @@ LEAF(bn_mul_comba8)
        sltu    AT,c_2,t_1
        daddu   t_2,AT
        daddu   c_3,t_2
-       sltu    c_1,c_3,t_2
+       sltu    AT,c_3,t_2
+       daddu   c_1,AT
        dmultu  a_5,b_5         /* mul_add_c(a[5],b[5],c2,c3,c1); */
        mflo    t_1
        mfhi    t_2
@@ -1273,6 +1289,7 @@ LEAF(bn_mul_comba8)
        sltu    AT,c_3,t_1
        daddu   t_2,AT
        daddu   c_1,t_2
+       sltu    c_2,c_1,t_2
        dmultu  a_5,b_6         /* mul_add_c(a[5],b[6],c3,c1,c2); */
        mflo    t_1
        mfhi    t_2
@@ -1280,7 +1297,8 @@ LEAF(bn_mul_comba8)
        sltu    AT,c_3,t_1
        daddu   t_2,AT
        daddu   c_1,t_2
-       sltu    c_2,c_1,t_2
+       sltu    AT,c_1,t_2
+       daddu   c_2,AT
        dmultu  a_6,b_5         /* mul_add_c(a[6],b[5],c3,c1,c2); */
        mflo    t_1
        mfhi    t_2
@@ -1308,6 +1326,7 @@ LEAF(bn_mul_comba8)
        sltu    AT,c_1,t_1
        daddu   t_2,AT
        daddu   c_2,t_2
+       sltu    c_3,c_2,t_2
        dmultu  a_6,b_6         /* mul_add_c(a[6],b[6],c1,c2,c3); */
        mflo    t_1
        mfhi    t_2
@@ -1315,7 +1334,8 @@ LEAF(bn_mul_comba8)
        sltu    AT,c_1,t_1
        daddu   t_2,AT
        daddu   c_2,t_2
-       sltu    c_3,c_2,t_2
+       sltu    AT,c_2,t_2
+       daddu   c_3,AT
        dmultu  a_5,b_7         /* mul_add_c(a[5],b[7],c1,c2,c3); */
        mflo    t_1
        mfhi    t_2
@@ -1334,6 +1354,7 @@ LEAF(bn_mul_comba8)
        sltu    AT,c_2,t_1
        daddu   t_2,AT
        daddu   c_3,t_2
+       sltu    c_1,c_3,t_2
        dmultu  a_7,b_6         /* mul_add_c(a[7],b[6],c2,c3,c1); */
        mflo    t_1
        mfhi    t_2
@@ -1341,7 +1362,8 @@ LEAF(bn_mul_comba8)
        sltu    AT,c_2,t_1
        daddu   t_2,AT
        daddu   c_3,t_2
-       sltu    c_1,c_3,t_2
+       sltu    AT,c_3,t_2
+       daddu   c_1,AT
        sd      c_2,104(a0)     /* r[13]=c2; */
 
        dmultu  a_7,b_7         /* mul_add_c(a[7],b[7],c3,c1,c2); */
@@ -1430,6 +1452,7 @@ LEAF(bn_mul_comba4)
        sltu    AT,c_1,t_1
        daddu   t_2,AT
        daddu   c_2,t_2
+       sltu    c_3,c_2,t_2
        dmultu  a_1,b_2         /* mul_add_c(a[1],b[2],c1,c2,c3); */
        mflo    t_1
        mfhi    t_2
@@ -1437,7 +1460,8 @@ LEAF(bn_mul_comba4)
        sltu    AT,c_1,t_1
        daddu   t_2,AT
        daddu   c_2,t_2
-       sltu    c_3,c_2,t_2
+       sltu    AT,c_2,t_2
+       daddu   c_3,AT
        dmultu  a_2,b_1         /* mul_add_c(a[2],b[1],c1,c2,c3); */
        mflo    t_1
        mfhi    t_2
@@ -1465,6 +1489,7 @@ LEAF(bn_mul_comba4)
        sltu    AT,c_2,t_1
        daddu   t_2,AT
        daddu   c_3,t_2
+       sltu    c_1,c_3,t_2
        dmultu  a_2,b_2         /* mul_add_c(a[2],b[2],c2,c3,c1); */
        mflo    t_1
        mfhi    t_2
@@ -1472,7 +1497,8 @@ LEAF(bn_mul_comba4)
        sltu    AT,c_2,t_1
        daddu   t_2,AT
        daddu   c_3,t_2
-       sltu    c_1,c_3,t_2
+       sltu    AT,c_3,t_2
+       daddu   c_1,AT
        dmultu  a_1,b_3         /* mul_add_c(a[1],b[3],c2,c3,c1); */
        mflo    t_1
        mfhi    t_2
@@ -1491,6 +1517,7 @@ LEAF(bn_mul_comba4)
        sltu    AT,c_3,t_1
        daddu   t_2,AT
        daddu   c_1,t_2
+       sltu    c_2,c_1,t_2
        dmultu  a_3,b_2         /* mul_add_c(a[3],b[2],c3,c1,c2); */
        mflo    t_1
        mfhi    t_2
@@ -1498,7 +1525,8 @@ LEAF(bn_mul_comba4)
        sltu    AT,c_3,t_1
        daddu   t_2,AT
        daddu   c_1,t_2
-       sltu    c_2,c_1,t_2
+       sltu    AT,c_1,t_2
+       daddu   c_2,AT
        sd      c_3,40(a0)
 
        dmultu  a_3,b_3         /* mul_add_c(a[3],b[3],c1,c2,c3); */
@@ -1543,28 +1571,30 @@ LEAF(bn_sqr_comba8)
        dmultu  a_0,a_1         /* mul_add_c2(a[0],b[1],c2,c3,c1); */
        mflo    t_1
        mfhi    t_2
+       slt     c_1,t_2,zero
+       dsll    t_2,1
+       slt     a2,t_1,zero
+       daddu   t_2,a2
+       dsll    t_1,1
        daddu   c_2,t_1
        sltu    AT,c_2,t_1
        daddu   c_3,t_2,AT
-       daddu   c_2,t_1
-       sltu    AT,c_2,t_1
-       daddu   t_2,AT
-       daddu   c_3,t_2
-       sltu    c_1,c_3,t_2
        sd      c_2,8(a0)
 
        dmultu  a_2,a_0         /* mul_add_c2(a[2],b[0],c3,c1,c2); */
        mflo    t_1
        mfhi    t_2
-       daddu   c_3,t_1
-       sltu    AT,c_3,t_1
-       daddu   a2,t_2,AT
-       daddu   c_1,a2
+       slt     c_2,t_2,zero
+       dsll    t_2,1
+       slt     a2,t_1,zero
+       daddu   t_2,a2
+       dsll    t_1,1
        daddu   c_3,t_1
        sltu    AT,c_3,t_1
        daddu   t_2,AT
        daddu   c_1,t_2
-       sltu    c_2,c_1,t_2
+       sltu    AT,c_1,t_2
+       daddu   c_2,AT
        dmultu  a_1,a_1         /* mul_add_c(a[1],b[1],c3,c1,c2); */
        mflo    t_1
        mfhi    t_2
@@ -1579,24 +1609,26 @@ LEAF(bn_sqr_comba8)
        dmultu  a_0,a_3         /* mul_add_c2(a[0],b[3],c1,c2,c3); */
        mflo    t_1
        mfhi    t_2
-       daddu   c_1,t_1
-       sltu    AT,c_1,t_1
-       daddu   a2,t_2,AT
-       daddu   c_2,a2
+       slt     c_3,t_2,zero
+       dsll    t_2,1
+       slt     a2,t_1,zero
+       daddu   t_2,a2
+       dsll    t_1,1
        daddu   c_1,t_1
        sltu    AT,c_1,t_1
        daddu   t_2,AT
        daddu   c_2,t_2
-       sltu    c_3,c_2,t_2
+       sltu    AT,c_2,t_2
+       daddu   c_3,AT
        dmultu  a_1,a_2         /* mul_add_c2(a[1],b[2],c1,c2,c3); */
        mflo    t_1
        mfhi    t_2
-       daddu   c_1,t_1
-       sltu    AT,c_1,t_1
-       daddu   a2,t_2,AT
-       daddu   c_2,a2
-       sltu    AT,c_2,a2
+       slt     AT,t_2,zero
        daddu   c_3,AT
+       dsll    t_2,1
+       slt     a2,t_1,zero
+       daddu   t_2,a2
+       dsll    t_1,1
        daddu   c_1,t_1
        sltu    AT,c_1,t_1
        daddu   t_2,AT
@@ -1608,24 +1640,26 @@ LEAF(bn_sqr_comba8)
        dmultu  a_4,a_0         /* mul_add_c2(a[4],b[0],c2,c3,c1); */
        mflo    t_1
        mfhi    t_2
-       daddu   c_2,t_1
-       sltu    AT,c_2,t_1
-       daddu   a2,t_2,AT
-       daddu   c_3,a2
+       slt     c_1,t_2,zero
+       dsll    t_2,1
+       slt     a2,t_1,zero
+       daddu   t_2,a2
+       dsll    t_1,1
        daddu   c_2,t_1
        sltu    AT,c_2,t_1
        daddu   t_2,AT
        daddu   c_3,t_2
-       sltu    c_1,c_3,t_2
+       sltu    AT,c_3,t_2
+       daddu   c_1,AT
        dmultu  a_3,a_1         /* mul_add_c2(a[3],b[1],c2,c3,c1); */
        mflo    t_1
        mfhi    t_2
-       daddu   c_2,t_1
-       sltu    AT,c_2,t_1
-       daddu   a2,t_2,AT
-       daddu   c_3,a2
-       sltu    AT,c_3,a2
+       slt     AT,t_2,zero
        daddu   c_1,AT
+       dsll    t_2,1
+       slt     a2,t_1,zero
+       daddu   t_2,a2
+       dsll    t_1,1
        daddu   c_2,t_1
        sltu    AT,c_2,t_1
        daddu   t_2,AT
@@ -1646,24 +1680,26 @@ LEAF(bn_sqr_comba8)
        dmultu  a_0,a_5         /* mul_add_c2(a[0],b[5],c3,c1,c2); */
        mflo    t_1
        mfhi    t_2
-       daddu   c_3,t_1
-       sltu    AT,c_3,t_1
-       daddu   a2,t_2,AT
-       daddu   c_1,a2
+       slt     c_2,t_2,zero
+       dsll    t_2,1
+       slt     a2,t_1,zero
+       daddu   t_2,a2
+       dsll    t_1,1
        daddu   c_3,t_1
        sltu    AT,c_3,t_1
        daddu   t_2,AT
        daddu   c_1,t_2
-       sltu    c_2,c_1,t_2
+       sltu    AT,c_1,t_2
+       daddu   c_2,AT
        dmultu  a_1,a_4         /* mul_add_c2(a[1],b[4],c3,c1,c2); */
        mflo    t_1
        mfhi    t_2
-       daddu   c_3,t_1
-       sltu    AT,c_3,t_1
-       daddu   a2,t_2,AT
-       daddu   c_1,a2
-       sltu    AT,c_1,a2
+       slt     AT,t_2,zero
        daddu   c_2,AT
+       dsll    t_2,1
+       slt     a2,t_1,zero
+       daddu   t_2,a2
+       dsll    t_1,1
        daddu   c_3,t_1
        sltu    AT,c_3,t_1
        daddu   t_2,AT
@@ -1673,12 +1709,12 @@ LEAF(bn_sqr_comba8)
        dmultu  a_2,a_3         /* mul_add_c2(a[2],b[3],c3,c1,c2); */
        mflo    t_1
        mfhi    t_2
-       daddu   c_3,t_1
-       sltu    AT,c_3,t_1
-       daddu   a2,t_2,AT
-       daddu   c_1,a2
-       sltu    AT,c_1,a2
+       slt     AT,t_2,zero
        daddu   c_2,AT
+       dsll    t_2,1
+       slt     a2,t_1,zero
+       daddu   t_2,a2
+       dsll    t_1,1
        daddu   c_3,t_1
        sltu    AT,c_3,t_1
        daddu   t_2,AT
@@ -1690,24 +1726,26 @@ LEAF(bn_sqr_comba8)
        dmultu  a_6,a_0         /* mul_add_c2(a[6],b[0],c1,c2,c3); */
        mflo    t_1
        mfhi    t_2
-       daddu   c_1,t_1
-       sltu    AT,c_1,t_1
-       daddu   a2,t_2,AT
-       daddu   c_2,a2
+       slt     c_3,t_2,zero
+       dsll    t_2,1
+       slt     a2,t_1,zero
+       daddu   t_2,a2
+       dsll    t_1,1
        daddu   c_1,t_1
        sltu    AT,c_1,t_1
        daddu   t_2,AT
        daddu   c_2,t_2
-       sltu    c_3,c_2,t_2
+       sltu    AT,c_2,t_2
+       daddu   c_3,AT
        dmultu  a_5,a_1         /* mul_add_c2(a[5],b[1],c1,c2,c3); */
        mflo    t_1
        mfhi    t_2
-       daddu   c_1,t_1
-       sltu    AT,c_1,t_1
-       daddu   a2,t_2,AT
-       daddu   c_2,a2
-       sltu    AT,c_2,a2
+       slt     AT,t_2,zero
        daddu   c_3,AT
+       dsll    t_2,1
+       slt     a2,t_1,zero
+       daddu   t_2,a2
+       dsll    t_1,1
        daddu   c_1,t_1
        sltu    AT,c_1,t_1
        daddu   t_2,AT
@@ -1717,12 +1755,12 @@ LEAF(bn_sqr_comba8)
        dmultu  a_4,a_2         /* mul_add_c2(a[4],b[2],c1,c2,c3); */
        mflo    t_1
        mfhi    t_2
-       daddu   c_1,t_1
-       sltu    AT,c_1,t_1
-       daddu   a2,t_2,AT
-       daddu   c_2,a2
-       sltu    AT,c_2,a2
+       slt     AT,t_2,zero
        daddu   c_3,AT
+       dsll    t_2,1
+       slt     a2,t_1,zero
+       daddu   t_2,a2
+       dsll    t_1,1
        daddu   c_1,t_1
        sltu    AT,c_1,t_1
        daddu   t_2,AT
@@ -1743,24 +1781,26 @@ LEAF(bn_sqr_comba8)
        dmultu  a_0,a_7         /* mul_add_c2(a[0],b[7],c2,c3,c1); */
        mflo    t_1
        mfhi    t_2
-       daddu   c_2,t_1
-       sltu    AT,c_2,t_1
-       daddu   a2,t_2,AT
-       daddu   c_3,a2
+       slt     c_1,t_2,zero
+       dsll    t_2,1
+       slt     a2,t_1,zero
+       daddu   t_2,a2
+       dsll    t_1,1
        daddu   c_2,t_1
        sltu    AT,c_2,t_1
        daddu   t_2,AT
        daddu   c_3,t_2
-       sltu    c_1,c_3,t_2
+       sltu    AT,c_3,t_2
+       daddu   c_1,AT
        dmultu  a_1,a_6         /* mul_add_c2(a[1],b[6],c2,c3,c1); */
        mflo    t_1
        mfhi    t_2
-       daddu   c_2,t_1
-       sltu    AT,c_2,t_1
-       daddu   a2,t_2,AT
-       daddu   c_3,a2
-       sltu    AT,c_3,a2
+       slt     AT,t_2,zero
        daddu   c_1,AT
+       dsll    t_2,1
+       slt     a2,t_1,zero
+       daddu   t_2,a2
+       dsll    t_1,1
        daddu   c_2,t_1
        sltu    AT,c_2,t_1
        daddu   t_2,AT
@@ -1770,12 +1810,12 @@ LEAF(bn_sqr_comba8)
        dmultu  a_2,a_5         /* mul_add_c2(a[2],b[5],c2,c3,c1); */
        mflo    t_1
        mfhi    t_2
-       daddu   c_2,t_1
-       sltu    AT,c_2,t_1
-       daddu   a2,t_2,AT
-       daddu   c_3,a2
-       sltu    AT,c_3,a2
+       slt     AT,t_2,zero
        daddu   c_1,AT
+       dsll    t_2,1
+       slt     a2,t_1,zero
+       daddu   t_2,a2
+       dsll    t_1,1
        daddu   c_2,t_1
        sltu    AT,c_2,t_1
        daddu   t_2,AT
@@ -1785,12 +1825,12 @@ LEAF(bn_sqr_comba8)
        dmultu  a_3,a_4         /* mul_add_c2(a[3],b[4],c2,c3,c1); */
        mflo    t_1
        mfhi    t_2
-       daddu   c_2,t_1
-       sltu    AT,c_2,t_1
-       daddu   a2,t_2,AT
-       daddu   c_3,a2
-       sltu    AT,c_3,a2
+       slt     AT,t_2,zero
        daddu   c_1,AT
+       dsll    t_2,1
+       slt     a2,t_1,zero
+       daddu   t_2,a2
+       dsll    t_1,1
        daddu   c_2,t_1
        sltu    AT,c_2,t_1
        daddu   t_2,AT
@@ -1802,24 +1842,26 @@ LEAF(bn_sqr_comba8)
        dmultu  a_7,a_1         /* mul_add_c2(a[7],b[1],c3,c1,c2); */
        mflo    t_1
        mfhi    t_2
-       daddu   c_3,t_1
-       sltu    AT,c_3,t_1
-       daddu   a2,t_2,AT
-       daddu   c_1,a2
+       slt     c_2,t_2,zero
+       dsll    t_2,1
+       slt     a2,t_1,zero
+       daddu   t_2,a2
+       dsll    t_1,1
        daddu   c_3,t_1
        sltu    AT,c_3,t_1
        daddu   t_2,AT
        daddu   c_1,t_2
-       sltu    c_2,c_1,t_2
+       sltu    AT,c_1,t_2
+       daddu   c_2,AT
        dmultu  a_6,a_2         /* mul_add_c2(a[6],b[2],c3,c1,c2); */
        mflo    t_1
        mfhi    t_2
-       daddu   c_3,t_1
-       sltu    AT,c_3,t_1
-       daddu   a2,t_2,AT
-       daddu   c_1,a2
-       sltu    AT,c_1,a2
+       slt     AT,t_2,zero
        daddu   c_2,AT
+       dsll    t_2,1
+       slt     a2,t_1,zero
+       daddu   t_2,a2
+       dsll    t_1,1
        daddu   c_3,t_1
        sltu    AT,c_3,t_1
        daddu   t_2,AT
@@ -1829,12 +1871,12 @@ LEAF(bn_sqr_comba8)
        dmultu  a_5,a_3         /* mul_add_c2(a[5],b[3],c3,c1,c2); */
        mflo    t_1
        mfhi    t_2
-       daddu   c_3,t_1
-       sltu    AT,c_3,t_1
-       daddu   a2,t_2,AT
-       daddu   c_1,a2
-       sltu    AT,c_1,a2
+       slt     AT,t_2,zero
        daddu   c_2,AT
+       dsll    t_2,1
+       slt     a2,t_1,zero
+       daddu   t_2,a2
+       dsll    t_1,1
        daddu   c_3,t_1
        sltu    AT,c_3,t_1
        daddu   t_2,AT
@@ -1855,24 +1897,26 @@ LEAF(bn_sqr_comba8)
        dmultu  a_2,a_7         /* mul_add_c2(a[2],b[7],c1,c2,c3); */
        mflo    t_1
        mfhi    t_2
-       daddu   c_1,t_1
-       sltu    AT,c_1,t_1
-       daddu   a2,t_2,AT
-       daddu   c_2,a2
+       slt     c_3,t_2,zero
+       dsll    t_2,1
+       slt     a2,t_1,zero
+       daddu   t_2,a2
+       dsll    t_1,1
        daddu   c_1,t_1
        sltu    AT,c_1,t_1
        daddu   t_2,AT
        daddu   c_2,t_2
-       sltu    c_3,c_2,t_2
+       sltu    AT,c_2,t_2
+       daddu   c_3,AT
        dmultu  a_3,a_6         /* mul_add_c2(a[3],b[6],c1,c2,c3); */
        mflo    t_1
        mfhi    t_2
-       daddu   c_1,t_1
-       sltu    AT,c_1,t_1
-       daddu   a2,t_2,AT
-       daddu   c_2,a2
-       sltu    AT,c_2,a2
+       slt     AT,t_2,zero
        daddu   c_3,AT
+       dsll    t_2,1
+       slt     a2,t_1,zero
+       daddu   t_2,a2
+       dsll    t_1,1
        daddu   c_1,t_1
        sltu    AT,c_1,t_1
        daddu   t_2,AT
@@ -1882,12 +1926,12 @@ LEAF(bn_sqr_comba8)
        dmultu  a_4,a_5         /* mul_add_c2(a[4],b[5],c1,c2,c3); */
        mflo    t_1
        mfhi    t_2
-       daddu   c_1,t_1
-       sltu    AT,c_1,t_1
-       daddu   a2,t_2,AT
-       daddu   c_2,a2
-       sltu    AT,c_2,a2
+       slt     AT,t_2,zero
        daddu   c_3,AT
+       dsll    t_2,1
+       slt     a2,t_1,zero
+       daddu   t_2,a2
+       dsll    t_1,1
        daddu   c_1,t_1
        sltu    AT,c_1,t_1
        daddu   t_2,AT
@@ -1899,24 +1943,26 @@ LEAF(bn_sqr_comba8)
        dmultu  a_7,a_3         /* mul_add_c2(a[7],b[3],c2,c3,c1); */
        mflo    t_1
        mfhi    t_2
-       daddu   c_2,t_1
-       sltu    AT,c_2,t_1
-       daddu   a2,t_2,AT
-       daddu   c_3,a2
+       slt     c_1,t_2,zero
+       dsll    t_2,1
+       slt     a2,t_1,zero
+       daddu   t_2,a2
+       dsll    t_1,1
        daddu   c_2,t_1
        sltu    AT,c_2,t_1
        daddu   t_2,AT
        daddu   c_3,t_2
-       sltu    c_1,c_3,t_2
+       sltu    AT,c_3,t_2
+       daddu   c_1,AT
        dmultu  a_6,a_4         /* mul_add_c2(a[6],b[4],c2,c3,c1); */
        mflo    t_1
        mfhi    t_2
-       daddu   c_2,t_1
-       sltu    AT,c_2,t_1
-       daddu   a2,t_2,AT
-       daddu   c_3,a2
-       sltu    AT,c_3,a2
+       slt     AT,t_2,zero
        daddu   c_1,AT
+       dsll    t_2,1
+       slt     a2,t_1,zero
+       daddu   t_2,a2
+       dsll    t_1,1
        daddu   c_2,t_1
        sltu    AT,c_2,t_1
        daddu   t_2,AT
@@ -1937,24 +1983,26 @@ LEAF(bn_sqr_comba8)
        dmultu  a_4,a_7         /* mul_add_c2(a[4],b[7],c3,c1,c2); */
        mflo    t_1
        mfhi    t_2
-       daddu   c_3,t_1
-       sltu    AT,c_3,t_1
-       daddu   a2,t_2,AT
-       daddu   c_1,a2
+       slt     c_2,t_2,zero
+       dsll    t_2,1
+       slt     a2,t_1,zero
+       daddu   t_2,a2
+       dsll    t_1,1
        daddu   c_3,t_1
        sltu    AT,c_3,t_1
        daddu   t_2,AT
        daddu   c_1,t_2
-       sltu    c_2,c_1,t_2
+       sltu    AT,c_1,t_2
+       daddu   c_2,AT
        dmultu  a_5,a_6         /* mul_add_c2(a[5],b[6],c3,c1,c2); */
        mflo    t_1
        mfhi    t_2
-       daddu   c_3,t_1
-       sltu    AT,c_3,t_1
-       daddu   a2,t_2,AT
-       daddu   c_1,a2
-       sltu    AT,c_1,a2
+       slt     AT,t_2,zero
        daddu   c_2,AT
+       dsll    t_2,1
+       slt     a2,t_1,zero
+       daddu   t_2,a2
+       dsll    t_1,1
        daddu   c_3,t_1
        sltu    AT,c_3,t_1
        daddu   t_2,AT
@@ -1966,15 +2014,17 @@ LEAF(bn_sqr_comba8)
        dmultu  a_7,a_5         /* mul_add_c2(a[7],b[5],c1,c2,c3); */
        mflo    t_1
        mfhi    t_2
-       daddu   c_1,t_1
-       sltu    AT,c_1,t_1
-       daddu   a2,t_2,AT
-       daddu   c_2,a2
+       slt     c_3,t_2,zero
+       dsll    t_2,1
+       slt     a2,t_1,zero
+       daddu   t_2,a2
+       dsll    t_1,1
        daddu   c_1,t_1
        sltu    AT,c_1,t_1
        daddu   t_2,AT
        daddu   c_2,t_2
-       sltu    c_3,c_2,t_2
+       sltu    AT,c_2,t_2
+       daddu   c_3,AT
        dmultu  a_6,a_6         /* mul_add_c(a[6],b[6],c1,c2,c3); */
        mflo    t_1
        mfhi    t_2
@@ -1989,15 +2039,17 @@ LEAF(bn_sqr_comba8)
        dmultu  a_6,a_7         /* mul_add_c2(a[6],b[7],c2,c3,c1); */
        mflo    t_1
        mfhi    t_2
-       daddu   c_2,t_1
-       sltu    AT,c_2,t_1
-       daddu   a2,t_2,AT
-       daddu   c_3,a2
+       slt     c_1,t_2,zero
+       dsll    t_2,1
+       slt     a2,t_1,zero
+       daddu   t_2,a2
+       dsll    t_1,1
        daddu   c_2,t_1
        sltu    AT,c_2,t_1
        daddu   t_2,AT
        daddu   c_3,t_2
-       sltu    c_1,c_3,t_2
+       sltu    AT,c_3,t_2
+       daddu   c_1,AT
        sd      c_2,104(a0)
 
        dmultu  a_7,a_7         /* mul_add_c(a[7],b[7],c3,c1,c2); */
@@ -2028,28 +2080,30 @@ LEAF(bn_sqr_comba4)
        dmultu  a_0,a_1         /* mul_add_c2(a[0],b[1],c2,c3,c1); */
        mflo    t_1
        mfhi    t_2
+       slt     c_1,t_2,zero
+       dsll    t_2,1
+       slt     a2,t_1,zero
+       daddu   t_2,a2
+       dsll    t_1,1
        daddu   c_2,t_1
        sltu    AT,c_2,t_1
        daddu   c_3,t_2,AT
-       daddu   c_2,t_1
-       sltu    AT,c_2,t_1
-       daddu   t_2,AT
-       daddu   c_3,t_2
-       sltu    c_1,c_3,t_2
        sd      c_2,8(a0)
 
        dmultu  a_2,a_0         /* mul_add_c2(a[2],b[0],c3,c1,c2); */
        mflo    t_1
        mfhi    t_2
-       daddu   c_3,t_1
-       sltu    AT,c_3,t_1
-       daddu   a2,t_2,AT
-       daddu   c_1,a2
+       slt     c_2,t_2,zero
+       dsll    t_2,1
+       slt     a2,t_1,zero
+       daddu   t_2,a2
+       dsll    t_1,1
        daddu   c_3,t_1
        sltu    AT,c_3,t_1
        daddu   t_2,AT
        daddu   c_1,t_2
-       sltu    c_2,c_1,t_2
+       sltu    AT,c_1,t_2
+       daddu   c_2,AT
        dmultu  a_1,a_1         /* mul_add_c(a[1],b[1],c3,c1,c2); */
        mflo    t_1
        mfhi    t_2
@@ -2064,24 +2118,26 @@ LEAF(bn_sqr_comba4)
        dmultu  a_0,a_3         /* mul_add_c2(a[0],b[3],c1,c2,c3); */
        mflo    t_1
        mfhi    t_2
-       daddu   c_1,t_1
-       sltu    AT,c_1,t_1
-       daddu   a2,t_2,AT
-       daddu   c_2,a2
+       slt     c_3,t_2,zero
+       dsll    t_2,1
+       slt     a2,t_1,zero
+       daddu   t_2,a2
+       dsll    t_1,1
        daddu   c_1,t_1
        sltu    AT,c_1,t_1
        daddu   t_2,AT
        daddu   c_2,t_2
-       sltu    c_3,c_2,t_2
+       sltu    AT,c_2,t_2
+       daddu   c_3,AT
        dmultu  a_1,a_2         /* mul_add_c(a2[1],b[2],c1,c2,c3); */
        mflo    t_1
        mfhi    t_2
-       daddu   c_1,t_1
-       sltu    AT,c_1,t_1
-       daddu   a2,t_2,AT
-       daddu   c_2,a2
-       sltu    AT,c_2,a2
+       slt     AT,t_2,zero
        daddu   c_3,AT
+       dsll    t_2,1
+       slt     a2,t_1,zero
+       daddu   t_2,a2
+       dsll    t_1,1
        daddu   c_1,t_1
        sltu    AT,c_1,t_1
        daddu   t_2,AT
@@ -2093,15 +2149,17 @@ LEAF(bn_sqr_comba4)
        dmultu  a_3,a_1         /* mul_add_c2(a[3],b[1],c2,c3,c1); */
        mflo    t_1
        mfhi    t_2
-       daddu   c_2,t_1
-       sltu    AT,c_2,t_1
-       daddu   a2,t_2,AT
-       daddu   c_3,a2
+       slt     c_1,t_2,zero
+       dsll    t_2,1
+       slt     a2,t_1,zero
+       daddu   t_2,a2
+       dsll    t_1,1
        daddu   c_2,t_1
        sltu    AT,c_2,t_1
        daddu   t_2,AT
        daddu   c_3,t_2
-       sltu    c_1,c_3,t_2
+       sltu    AT,c_3,t_2
+       daddu   c_1,AT
        dmultu  a_2,a_2         /* mul_add_c(a[2],b[2],c2,c3,c1); */
        mflo    t_1
        mfhi    t_2
@@ -2116,15 +2174,17 @@ LEAF(bn_sqr_comba4)
        dmultu  a_2,a_3         /* mul_add_c2(a[2],b[3],c3,c1,c2); */
        mflo    t_1
        mfhi    t_2
-       daddu   c_3,t_1
-       sltu    AT,c_3,t_1
-       daddu   a2,t_2,AT
-       daddu   c_1,a2
+       slt     c_2,t_2,zero
+       dsll    t_2,1
+       slt     a2,t_1,zero
+       daddu   t_2,a2
+       dsll    t_1,1
        daddu   c_3,t_1
        sltu    AT,c_3,t_1
        daddu   t_2,AT
        daddu   c_1,t_2
-       sltu    c_2,c_1,t_2
+       sltu    AT,c_1,t_2
+       daddu   c_2,AT
        sd      c_3,40(a0)
 
        dmultu  a_3,a_3         /* mul_add_c(a[3],b[3],c1,c2,c3); */