summaryrefslogtreecommitdiff
path: root/src/wasm-interpreter.h
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2015-12-23 15:07:48 -0800
committerAlon Zakai <alonzakai@gmail.com>2015-12-23 15:07:48 -0800
commit138dee6fb54ef464c0a674f359aff71ab9d0c868 (patch)
tree95af116fcef5e3c7378967d8d0464693d876e8a1 /src/wasm-interpreter.h
parent070b1102338a7baa8d0c5f0e5c6731b93cf0e09a (diff)
parent24c5e1807f583ecc5b6fdeb87eeba2c501f0bac4 (diff)
downloadbinaryen-138dee6fb54ef464c0a674f359aff71ab9d0c868.tar.gz
binaryen-138dee6fb54ef464c0a674f359aff71ab9d0c868.tar.bz2
binaryen-138dee6fb54ef464c0a674f359aff71ab9d0c868.zip
Merge pull request #34 from AndrewScheidecker/windows-fixes
Fix a few Windows/VS2013 compile errors
Diffstat (limited to 'src/wasm-interpreter.h')
-rw-r--r--src/wasm-interpreter.h27
1 files changed, 25 insertions, 2 deletions
diff --git a/src/wasm-interpreter.h b/src/wasm-interpreter.h
index 97958b041..76c3f66ba 100644
--- a/src/wasm-interpreter.h
+++ b/src/wasm-interpreter.h
@@ -35,6 +35,24 @@ using namespace cashew;
IString WASM("wasm");
+
+#ifdef WIN32
+#include <intrin.h>
+
+int32_t safe_clz(int32_t v) {
+ unsigned long result;
+ return _BitScanReverse(&result,v) ? result : 32;
+}
+
+int32_t safe_ctz(int32_t v) {
+ unsigned long result;
+ return _BitScanForward(&result,v) ? result : 32;
+}
+
+int32_t platform_popcount(int32_t v) {
+ return __popcnt(v);
+}
+#else
int32_t safe_clz(int32_t v) {
if (v == 0) return 32;
return __builtin_clz(v);
@@ -45,6 +63,11 @@ int32_t safe_ctz(int32_t v) {
return __builtin_ctz(v);
}
+int32_t platform_popcount(int32_t v) {
+ return __buildin_popcount(v);
+}
+#endif
+
enum {
pageSize = 64*1024,
maxCallDepth = 250
@@ -374,7 +397,7 @@ private:
if (v == 0) return Literal(32);
return Literal((int32_t)safe_ctz(v));
}
- case Popcnt: return Literal((int32_t)__builtin_popcount(v));
+ case Popcnt: return Literal((int32_t)platform_popcount(v));
case ReinterpretInt: {
float v = value.reinterpretf32();
if (isnan(v)) {
@@ -403,7 +426,7 @@ private:
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(low) + __builtin_popcount(high)));
+ case Popcnt: return Literal(int64_t(platform_popcount(low) + platform_popcount(high)));
case WrapInt64: return Literal(int32_t(value.geti64()));
case ReinterpretInt: {
return Literal(value.reinterpretf64());