diff options
author | Alon Zakai <alonzakai@gmail.com> | 2015-11-05 14:14:58 -0800 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2015-11-05 14:14:58 -0800 |
commit | 842ed2be4c19fd72ba6c13457d59b58e9839027d (patch) | |
tree | 5aa26186d2f1687b8aabcc5742cb639c5e6396db | |
parent | a991641006b201ce99878d09d7c2ee61ab5d138f (diff) | |
download | binaryen-842ed2be4c19fd72ba6c13457d59b58e9839027d.tar.gz binaryen-842ed2be4c19fd72ba6c13457d59b58e9839027d.tar.bz2 binaryen-842ed2be4c19fd72ba6c13457d59b58e9839027d.zip |
unary ops
-rw-r--r-- | src/wasm-interpreter.h | 49 |
1 files changed, 44 insertions, 5 deletions
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"); |