diff options
author | Peter Dettman <peter.dettman@bouncycastle.org> | 2013-10-03 07:08:23 +0400 |
---|---|---|
committer | Peter Dettman <peter.dettman@bouncycastle.org> | 2013-10-03 07:08:23 +0400 |
commit | 3c5038351168638dae41006cb2010d3c56f1917b (patch) | |
tree | a8edde796ca35e31e692e0d1645d660dc8a69b09 /core/src/main/java/org/bouncycastle/math | |
parent | 2a3806269e4ff1b667c2ca2e9bbf30d51b7e7576 (diff) |
Use an extra "register" in multiply to save 1/4 the shift-adds
Diffstat (limited to 'core/src/main/java/org/bouncycastle/math')
-rw-r--r-- | core/src/main/java/org/bouncycastle/math/ec/IntArray.java | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/core/src/main/java/org/bouncycastle/math/ec/IntArray.java b/core/src/main/java/org/bouncycastle/math/ec/IntArray.java index fe5948a4..eb29d7c5 100644 --- a/core/src/main/java/org/bouncycastle/math/ec/IntArray.java +++ b/core/src/main/java/org/bouncycastle/math/ec/IntArray.java @@ -500,21 +500,26 @@ class IntArray int[] b = B.resizedInts(bLen); int[] c0 = new int[cLen]; int[] c1 = new int[cLen]; + int[] c01 = new int[cLen]; int bit1 = 1 << 16; for (;;) { - int bit2 = bit1 >>> 16; + int bit0 = bit1 >>> 16, bit01 = bit0 | bit1; for (int aPos = 0; aPos < aLen; ++aPos) { int aVal = a[aPos]; - if ((aVal & bit1) != 0) + if ((aVal & bit01) == bit01) + { + addShiftedByWordsQuick(c01, aPos, b); + } + else if ((aVal & bit1) != 0) { addShiftedByWordsQuick(c1, aPos, b); } - if ((aVal & bit2) != 0) + else if ((aVal & bit0) != 0) { addShiftedByWordsQuick(c0, aPos, b); } @@ -528,6 +533,9 @@ class IntArray shiftLeftQuick(b); } + addQuick(c1, c01, cLen); + addQuick(c0, c01, cLen); + addShiftedByBitsQuick(c0, c1, cLen, 16); return new IntArray(c0); |