aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2012-02-14 21:36:59 -0500
committerAlon Zakai <alonzakai@gmail.com>2012-02-14 21:36:59 -0500
commitb16a890dc7e1435497a1b97b1a0fb7b0987faaef (patch)
tree93069e3ff4853e547a81b6a913eae1f6c84265f2
parent96a29d6e19bcd9617de7881d673f31a63e0728d6 (diff)
parse negative iBig numbers
-rw-r--r--src/parseTools.js22
-rw-r--r--tests/cases/legalizer_ta2.ll2
2 files changed, 21 insertions, 3 deletions
diff --git a/src/parseTools.js b/src/parseTools.js
index 071ed090..b401c1a5 100644
--- a/src/parseTools.js
+++ b/src/parseTools.js
@@ -602,6 +602,22 @@ function parseArbitraryInt(str, bits) {
}
}
+ function mul2(v) { // v *= 2
+ for (var i = v.length-1; i >= 0; i--) {
+ var d = v[i]*2;
+ r = d >= 10;
+ v[i] = d%10;
+ var j = i-1;
+ if (r) {
+ if (j < 0) {
+ v.unshift(1);
+ break;
+ }
+ v[j] += 0.5; // will be multiplied
+ }
+ }
+ }
+
function subtract(v, w) { // v -= w. we assume v >= w
while (v.length > w.length) w.splice(0, 0, 0);
for (var i = 0; i < v.length; i++) {
@@ -631,9 +647,11 @@ function parseArbitraryInt(str, bits) {
if (str[0] == '-') {
// twos-complement is needed
- assert(bits == 64, "we only support 64-bit two's complement so far");
str = str.substr(1);
- v = str2vec('18446744073709551616'); // 2^64
+ v = str2vec('1');
+ for (var i = 0; i < bits; i++) {
+ mul2(v);
+ }
subtract(v, str2vec(str));
} else {
v = str2vec(str);
diff --git a/tests/cases/legalizer_ta2.ll b/tests/cases/legalizer_ta2.ll
index 67cd9feb..1249c7eb 100644
--- a/tests/cases/legalizer_ta2.ll
+++ b/tests/cases/legalizer_ta2.ll
@@ -19,7 +19,7 @@ entry:
%temp.buffer = bitcast i8* %buffer to [0 x i8]*
%buffer1 = getelementptr [0 x i8]* %temp.buffer, i32 0, i32 1
%bundled1 = bitcast i8* %buffer1 to i104*
- store i104 31079605376604435891501163880, i104* %bundled1, align 1 ; unaligned
+ store i104 -20251329998275065988055750122136, i104* %bundled1, align 1 ; unaligned
call i32 (i8*)* @puts(i8* %buffer)
; shifts