ref: b1aeaa391fac787fe8b9d8d662323aa8557baddf
parent: 10b4f7d216570e8a745f4758ed195348de50b4d5
author: Ori Bernstein <[email protected]>
date: Thu Sep 11 21:31:53 EDT 2014
Remove allocing/freeing a bigint wth small muls.
--- a/libstd/bigint.myr
+++ b/libstd/bigint.myr
@@ -533,41 +533,64 @@
FIXME: acually make this a performace improvement
*/
const bigaddi = {a, b
- var bigb
+ var bigb : bigint
+ var dig : uint32[2]
- bigb = mkbigint(b)
- bigadd(a, bigb)
- bigfree(bigb)
+ bigdigit(&bigb, b, dig[:])
+ bigadd(a, &bigb)
-> a
}
const bigsubi = {a, b
- var bigb
+ var bigb : bigint
+ var dig : uint32[2]
- bigb = mkbigint(b)
- bigsub(a, bigb)
- bigfree(bigb)
+ bigdigit(&bigb, b, dig[:])
+ bigsub(a, &bigb)
-> a
}
const bigmuli = {a, b
- var bigb
+ var bigb : bigint
+ var dig : uint32[2]
- bigb = mkbigint(b)
- bigmul(a, bigb)
- bigfree(bigb)
+ bigdigit(&bigb, b, dig[:])
+ bigmul(a, &bigb)
-> a
}
const bigdivi = {a, b
- var bigb
+ var bigb : bigint
+ var dig : uint32[2]
- bigb = mkbigint(b)
- bigdiv(a, bigb)
- bigfree(bigb)
+ bigdigit(&bigb, b, dig[:])
+ bigdiv(a, &bigb)
-> a
}
+const bigdigit = {v : bigint#, sval, dig
+ var val
+
+ if sval == 0
+ v.sign = 0
+ elif sval < 0
+ v.sign = -1
+ val = (-sval) castto(uint64)
+ else
+ v.sign = 1
+ val = sval castto(uint64)
+ ;;
+ if val == 0
+ v.dig = [][:]
+ elif val > Base
+ v.dig = dig[:1]
+ v.dig[0] = val castto(uint32)
+ else
+ v.dig = dig
+ v.dig[0] = val castto(uint32)
+ v.dig[1] = (val >> 32) castto(uint32)
+ ;;
+}
/*
a << s, with integer arg.