From 842ed2be4c19fd72ba6c13457d59b58e9839027d Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 5 Nov 2015 14:14:58 -0800 Subject: unary ops --- src/wasm-interpreter.h | 49 ++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 44 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/wasm-interpreter.h b/src/wasm-interpreter.h index 13c476160..926d46ec2 100644 --- a/src/wasm-interpreter.h +++ b/src/wasm-interpreter.h @@ -286,12 +286,51 @@ public: if (flow.breaking()) return flow; Literal value = flow.value; NOTE_EVAL1(value); - switch (curr->op) { // rofl - case Clz: return Flow(Literal((int32_t)__builtin_clz(value.geti32()))); - case Neg: return Flow(Literal(-value.getf64())); - case Floor: return Flow(Literal(floor(value.getf64()))); - default: abort(); + if (value.type == i32) { + int32_t v = value.geti32(); + switch (curr->op) { + case Clz: return Literal((int32_t)__builtin_clz(v)); + case Ctz: return Literal((int32_t)__builtin_ctz(v)); + case Popcnt: return Literal((int32_t)__builtin_popcount(v)); + default: abort(); + } } + if (value.type == i64) { + int64_t v = value.geti64(); + switch (curr->op) { + case Clz: return Literal((int64_t)__builtin_clz(v)); + case Ctz: return Literal((int64_t)__builtin_ctz(v)); + case Popcnt: return Literal((int64_t)__builtin_popcount(v)); + default: abort(); + } + } + if (value.type == f32) { + float v = value.getf32(); + switch (curr->op) { + case Neg: return Literal(-v); + case Abs: return Literal(fabs(v)); + case Ceil: return Literal(ceil(v)); + case Floor: return Literal(floor(v)); + case Trunc: return Literal(trunc(v)); + case Nearest: return Literal(nearbyint(v)); + case Sqrt: return Literal(sqrtf(v)); + default: abort(); + } + } + if (value.type == f64) { + double v = value.getf64(); + switch (curr->op) { + case Neg: return Literal(-v); + case Abs: return Literal(std::abs(v)); + case Ceil: return Literal(ceil(v)); + case Floor: return Literal(floor(v)); + case Trunc: return Literal(trunc(v)); + case Nearest: return Literal(nearbyint(v)); + case Sqrt: return Literal(sqrt(v)); + default: abort(); + } + } + abort(); } Flow visitBinary(Binary *curr) override { NOTE_ENTER("Binary"); -- cgit v1.2.3