Try to simplify the multiplication loop, to get better optimization, and add a bunch of missing test cases.
This commit is contained in:
@@ -1,22 +1,26 @@
|
||||
pub fn multiply(dest: &mut [u64], left: &[u64], right: &[u64])
|
||||
{
|
||||
let len = right.len();
|
||||
let mut i = 0;
|
||||
|
||||
assert_eq!(left.len(), len, "Uneven argument lengths in multiply");
|
||||
assert_eq!(dest.len(), len*2, "Bad destination size in multiply");
|
||||
|
||||
for i in 0..len {
|
||||
while i < len {
|
||||
let mut carry = 0;
|
||||
let mut j = 0;
|
||||
|
||||
for j in 0..len {
|
||||
while j < len {
|
||||
let old = dest[i+j] as u128;
|
||||
let l128 = left[j] as u128;
|
||||
let r128 = right[i] as u128;
|
||||
let uv = old + (l128 * r128) + carry;
|
||||
dest[i+j] = uv as u64;
|
||||
carry = uv >> 64;
|
||||
j += 1;
|
||||
}
|
||||
dest[i+len] = carry as u64;
|
||||
i += 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
3003
testdata/add/00960.test
vendored
Normal file
3003
testdata/add/00960.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3003
testdata/add/01536.test
vendored
Normal file
3003
testdata/add/01536.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3003
testdata/add/01664.test
vendored
Normal file
3003
testdata/add/01664.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3003
testdata/add/01728.test
vendored
Normal file
3003
testdata/add/01728.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3003
testdata/add/01792.test
vendored
Normal file
3003
testdata/add/01792.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3003
testdata/add/02304.test
vendored
Normal file
3003
testdata/add/02304.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3003
testdata/add/02368.test
vendored
Normal file
3003
testdata/add/02368.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3003
testdata/add/02432.test
vendored
Normal file
3003
testdata/add/02432.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3003
testdata/add/02496.test
vendored
Normal file
3003
testdata/add/02496.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3003
testdata/add/02560.test
vendored
Normal file
3003
testdata/add/02560.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3003
testdata/add/04608.test
vendored
Normal file
3003
testdata/add/04608.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3003
testdata/add/04672.test
vendored
Normal file
3003
testdata/add/04672.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3003
testdata/add/04736.test
vendored
Normal file
3003
testdata/add/04736.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3003
testdata/barrett_gen/00448.test
vendored
Normal file
3003
testdata/barrett_gen/00448.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3003
testdata/barrett_gen/00768.test
vendored
Normal file
3003
testdata/barrett_gen/00768.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3003
testdata/barrett_gen/00832.test
vendored
Normal file
3003
testdata/barrett_gen/00832.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3003
testdata/barrett_gen/01216.test
vendored
Normal file
3003
testdata/barrett_gen/01216.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3003
testdata/barrett_gen/02304.test
vendored
Normal file
3003
testdata/barrett_gen/02304.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
5005
testdata/barrett_reduce/00448.test
vendored
Normal file
5005
testdata/barrett_reduce/00448.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
5005
testdata/barrett_reduce/00768.test
vendored
Normal file
5005
testdata/barrett_reduce/00768.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
5005
testdata/barrett_reduce/00832.test
vendored
Normal file
5005
testdata/barrett_reduce/00832.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
5005
testdata/barrett_reduce/01216.test
vendored
Normal file
5005
testdata/barrett_reduce/01216.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
5005
testdata/barrett_reduce/02304.test
vendored
Normal file
5005
testdata/barrett_reduce/02304.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
8008
testdata/base/01728.test
vendored
Normal file
8008
testdata/base/01728.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
8008
testdata/base/01856.test
vendored
Normal file
8008
testdata/base/01856.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
8008
testdata/base/01920.test
vendored
Normal file
8008
testdata/base/01920.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
8008
testdata/base/02368.test
vendored
Normal file
8008
testdata/base/02368.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
8008
testdata/base/02496.test
vendored
Normal file
8008
testdata/base/02496.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
8008
testdata/base/02624.test
vendored
Normal file
8008
testdata/base/02624.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
8008
testdata/base/03328.test
vendored
Normal file
8008
testdata/base/03328.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
8008
testdata/base/03456.test
vendored
Normal file
8008
testdata/base/03456.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
8008
testdata/base/04608.test
vendored
Normal file
8008
testdata/base/04608.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
8008
testdata/base/04672.test
vendored
Normal file
8008
testdata/base/04672.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
8008
testdata/base/04736.test
vendored
Normal file
8008
testdata/base/04736.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
8008
testdata/base/04800.test
vendored
Normal file
8008
testdata/base/04800.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
8008
testdata/base/04864.test
vendored
Normal file
8008
testdata/base/04864.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
8008
testdata/base/04992.test
vendored
Normal file
8008
testdata/base/04992.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
8008
testdata/base/09216.test
vendored
Normal file
8008
testdata/base/09216.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
8008
testdata/base/09344.test
vendored
Normal file
8008
testdata/base/09344.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
5005
testdata/cmp/01728.test
vendored
Normal file
5005
testdata/cmp/01728.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
5005
testdata/cmp/01856.test
vendored
Normal file
5005
testdata/cmp/01856.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
5005
testdata/cmp/01920.test
vendored
Normal file
5005
testdata/cmp/01920.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
5005
testdata/cmp/02368.test
vendored
Normal file
5005
testdata/cmp/02368.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
5005
testdata/cmp/02496.test
vendored
Normal file
5005
testdata/cmp/02496.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
5005
testdata/cmp/02624.test
vendored
Normal file
5005
testdata/cmp/02624.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
5005
testdata/cmp/03328.test
vendored
Normal file
5005
testdata/cmp/03328.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
5005
testdata/cmp/03456.test
vendored
Normal file
5005
testdata/cmp/03456.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
5005
testdata/cmp/04608.test
vendored
Normal file
5005
testdata/cmp/04608.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
5005
testdata/cmp/04672.test
vendored
Normal file
5005
testdata/cmp/04672.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
5005
testdata/cmp/04736.test
vendored
Normal file
5005
testdata/cmp/04736.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
5005
testdata/cmp/04800.test
vendored
Normal file
5005
testdata/cmp/04800.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
5005
testdata/cmp/04864.test
vendored
Normal file
5005
testdata/cmp/04864.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
5005
testdata/cmp/04992.test
vendored
Normal file
5005
testdata/cmp/04992.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
5005
testdata/cmp/09216.test
vendored
Normal file
5005
testdata/cmp/09216.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
5005
testdata/cmp/09344.test
vendored
Normal file
5005
testdata/cmp/09344.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
4004
testdata/div/00960.test
vendored
Normal file
4004
testdata/div/00960.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
4004
testdata/div/01664.test
vendored
Normal file
4004
testdata/div/01664.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
4004
testdata/div/01728.test
vendored
Normal file
4004
testdata/div/01728.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
4004
testdata/div/02304.test
vendored
Normal file
4004
testdata/div/02304.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
4004
testdata/div/02368.test
vendored
Normal file
4004
testdata/div/02368.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
4004
testdata/div/02432.test
vendored
Normal file
4004
testdata/div/02432.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
4004
testdata/div/02496.test
vendored
Normal file
4004
testdata/div/02496.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
4004
testdata/div/04608.test
vendored
Normal file
4004
testdata/div/04608.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
4004
testdata/div/04672.test
vendored
Normal file
4004
testdata/div/04672.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
5005
testdata/egcd/00448.test
vendored
Normal file
5005
testdata/egcd/00448.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
5005
testdata/egcd/00768.test
vendored
Normal file
5005
testdata/egcd/00768.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
5005
testdata/egcd/00832.test
vendored
Normal file
5005
testdata/egcd/00832.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
5005
testdata/egcd/01216.test
vendored
Normal file
5005
testdata/egcd/01216.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
5005
testdata/egcd/02304.test
vendored
Normal file
5005
testdata/egcd/02304.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
4004
testdata/moddiv/00448.test
vendored
Normal file
4004
testdata/moddiv/00448.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
4004
testdata/moddiv/00768.test
vendored
Normal file
4004
testdata/moddiv/00768.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
4004
testdata/moddiv/00832.test
vendored
Normal file
4004
testdata/moddiv/00832.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
4004
testdata/moddiv/01024.test
vendored
Normal file
4004
testdata/moddiv/01024.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
4004
testdata/moddiv/01216.test
vendored
Normal file
4004
testdata/moddiv/01216.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
4004
testdata/moddiv/01536.test
vendored
Normal file
4004
testdata/moddiv/01536.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
4004
testdata/moddiv/02304.test
vendored
Normal file
4004
testdata/moddiv/02304.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3003
testdata/modinv/00448.test
vendored
Normal file
3003
testdata/modinv/00448.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3003
testdata/modinv/00768.test
vendored
Normal file
3003
testdata/modinv/00768.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3003
testdata/modinv/00832.test
vendored
Normal file
3003
testdata/modinv/00832.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3003
testdata/modinv/01216.test
vendored
Normal file
3003
testdata/modinv/01216.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3003
testdata/modinv/01536.test
vendored
Normal file
3003
testdata/modinv/01536.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3003
testdata/modinv/02304.test
vendored
Normal file
3003
testdata/modinv/02304.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3003
testdata/mul/00960.test
vendored
Normal file
3003
testdata/mul/00960.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3003
testdata/mul/01664.test
vendored
Normal file
3003
testdata/mul/01664.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3003
testdata/mul/01728.test
vendored
Normal file
3003
testdata/mul/01728.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3003
testdata/mul/02304.test
vendored
Normal file
3003
testdata/mul/02304.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3003
testdata/mul/02368.test
vendored
Normal file
3003
testdata/mul/02368.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3003
testdata/mul/02432.test
vendored
Normal file
3003
testdata/mul/02432.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3003
testdata/mul/02496.test
vendored
Normal file
3003
testdata/mul/02496.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3003
testdata/mul/04608.test
vendored
Normal file
3003
testdata/mul/04608.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3003
testdata/mul/04672.test
vendored
Normal file
3003
testdata/mul/04672.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3003
testdata/scale/00960.test
vendored
Normal file
3003
testdata/scale/00960.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3003
testdata/scale/01664.test
vendored
Normal file
3003
testdata/scale/01664.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3003
testdata/scale/01728.test
vendored
Normal file
3003
testdata/scale/01728.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3003
testdata/scale/02304.test
vendored
Normal file
3003
testdata/scale/02304.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3003
testdata/scale/02368.test
vendored
Normal file
3003
testdata/scale/02368.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3003
testdata/scale/02432.test
vendored
Normal file
3003
testdata/scale/02432.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3003
testdata/scale/02496.test
vendored
Normal file
3003
testdata/scale/02496.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3003
testdata/scale/04608.test
vendored
Normal file
3003
testdata/scale/04608.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user