summaryrefslogtreecommitdiff
path: root/src/wasm-interpreter.h
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2015-11-05 20:55:56 -0800
committerAlon Zakai <alonzakai@gmail.com>2015-11-05 20:55:56 -0800
commitb78563b607f3a851dee9495ad21307b23e2c2666 (patch)
tree12a4a6740987a7abcbc360976cd5023ccca6d2c2 /src/wasm-interpreter.h
parent2298da8a685268e0f4bdf6a7a03e47429c39105a (diff)
downloadbinaryen-b78563b607f3a851dee9495ad21307b23e2c2666.tar.gz
binaryen-b78563b607f3a851dee9495ad21307b23e2c2666.tar.bz2
binaryen-b78563b607f3a851dee9495ad21307b23e2c2666.zip
64-bit popcnt
Diffstat (limited to 'src/wasm-interpreter.h')
-rw-r--r--src/wasm-interpreter.h5
1 files changed, 2 insertions, 3 deletions
diff --git a/src/wasm-interpreter.h b/src/wasm-interpreter.h
index 2c8a2bacd..0ca4d9674 100644
--- a/src/wasm-interpreter.h
+++ b/src/wasm-interpreter.h
@@ -334,20 +334,19 @@ public:
}
if (value.type == i64) {
int64_t v = value.geti64();
+ int32_t high = v >> 32, low = v;
switch (curr->op) {
case Clz: {
if (v == 0) return Literal((int64_t)64);
- int32_t high = v >> 32, low = v;
if (high == 0) return Literal(32+(int64_t)safe_clz(low));
return Literal((int64_t)safe_clz(high));
}
case Ctz: {
if (v == 0) return Literal((int64_t)64);
- int32_t high = v >> 32, low = v;
if (low == 0) return Literal(32+(int64_t)safe_ctz(high));
return Literal((int64_t)safe_ctz(low));
}
- case Popcnt: return Literal((int64_t)__builtin_popcount(v));
+ case Popcnt: return Literal(int64_t(__builtin_popcount(low) + __builtin_popcount(high)));
default: abort();
}
}