Try to simplify the multiplication loop, to get better optimization, and add a bunch of missing test cases.

This commit is contained in:
2019-01-30 20:34:38 -08:00
parent 56fb154c90
commit d189331312
249 changed files with 904910 additions and 2 deletions

View File

@@ -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

File diff suppressed because it is too large Load Diff

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

File diff suppressed because it is too large Load Diff

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

File diff suppressed because it is too large Load Diff

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

File diff suppressed because it is too large Load Diff

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

File diff suppressed because it is too large Load Diff

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

File diff suppressed because it is too large Load Diff

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

File diff suppressed because it is too large Load Diff

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

File diff suppressed because it is too large Load Diff

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

File diff suppressed because it is too large Load Diff

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

File diff suppressed because it is too large Load Diff

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

File diff suppressed because it is too large Load Diff

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

File diff suppressed because it is too large Load Diff

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

File diff suppressed because it is too large Load Diff

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

File diff suppressed because it is too large Load Diff

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

File diff suppressed because it is too large Load Diff

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

File diff suppressed because it is too large Load Diff

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

File diff suppressed because it is too large Load Diff

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

File diff suppressed because it is too large Load Diff

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

File diff suppressed because it is too large Load Diff

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

File diff suppressed because it is too large Load Diff

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

File diff suppressed because it is too large Load Diff

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

File diff suppressed because it is too large Load Diff

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

File diff suppressed because it is too large Load Diff

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

File diff suppressed because it is too large Load Diff

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

File diff suppressed because it is too large Load Diff

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

File diff suppressed because it is too large Load Diff

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

File diff suppressed because it is too large Load Diff

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

File diff suppressed because it is too large Load Diff

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

File diff suppressed because it is too large Load Diff

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

File diff suppressed because it is too large Load Diff

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

File diff suppressed because it is too large Load Diff

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

File diff suppressed because it is too large Load Diff

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

File diff suppressed because it is too large Load Diff

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

File diff suppressed because it is too large Load Diff

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

File diff suppressed because it is too large Load Diff

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

File diff suppressed because it is too large Load Diff

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

File diff suppressed because it is too large Load Diff

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

File diff suppressed because it is too large Load Diff

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

File diff suppressed because it is too large Load Diff

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

File diff suppressed because it is too large Load Diff

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

File diff suppressed because it is too large Load Diff

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

File diff suppressed because it is too large Load Diff

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

File diff suppressed because it is too large Load Diff

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

File diff suppressed because it is too large Load Diff

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

File diff suppressed because it is too large Load Diff

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

File diff suppressed because it is too large Load Diff

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

File diff suppressed because it is too large Load Diff

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

File diff suppressed because it is too large Load Diff

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

File diff suppressed because it is too large Load Diff

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

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