shithub: mc

Download patch

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.