summaryrefslogtreecommitdiff
path: root/src/wasm2asm.h
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2015-12-04 17:35:27 -0800
committerAlon Zakai <alonzakai@gmail.com>2015-12-04 17:35:27 -0800
commita834d6e9523d65710c09cd61e5d95c1a2a5a8d34 (patch)
tree48b74cf3b2d72eb8cbf579a3e1ed2d30081ebd53 /src/wasm2asm.h
parent396d4c0466819235464f379d19f93399121400da (diff)
downloadbinaryen-a834d6e9523d65710c09cd61e5d95c1a2a5a8d34.tar.gz
binaryen-a834d6e9523d65710c09cd61e5d95c1a2a5a8d34.tar.bz2
binaryen-a834d6e9523d65710c09cd61e5d95c1a2a5a8d34.zip
start to handle f32 in wasm2asm
Diffstat (limited to 'src/wasm2asm.h')
-rw-r--r--src/wasm2asm.h24
1 files changed, 15 insertions, 9 deletions
diff --git a/src/wasm2asm.h b/src/wasm2asm.h
index 489b360da..1c0047c5e 100644
--- a/src/wasm2asm.h
+++ b/src/wasm2asm.h
@@ -648,19 +648,25 @@ Ref Wasm2AsmBuilder::processFunctionBody(Expression* curr, IString result) {
default: abort();
}
}
+ case f32:
case f64: {
+ Ref ret;
switch (curr->op) {
- case Neg: return ValueBuilder::makeBinary(ValueBuilder::makeDouble(0), MINUS, value);
- case Abs: return ValueBuilder::makeCall(MATH_ABS, value);
- case Ceil: return ValueBuilder::makeCall(MATH_CEIL, value);
- case Floor: return ValueBuilder::makeCall(MATH_FLOOR, value);
- case Trunc: return ValueBuilder::makeCall(MATH_TRUNC, value);
- case Nearest: return ValueBuilder::makeCall(MATH_NEAREST, value);
- case Sqrt: return ValueBuilder::makeCall(MATH_SQRT, value);
- case TruncSFloat32: return ValueBuilder::makePrefix(B_NOT, ValueBuilder::makePrefix(B_NOT, value));
- case ConvertSInt32: return ValueBuilder::makePrefix(PLUS, value);
+ case Neg: ret = ValueBuilder::makeBinary(ValueBuilder::makeDouble(0), MINUS, value); break;
+ case Abs: ret = ValueBuilder::makeCall(MATH_ABS, value); break;
+ case Ceil: ret = ValueBuilder::makeCall(MATH_CEIL, value); break;
+ case Floor: ret = ValueBuilder::makeCall(MATH_FLOOR, value); break;
+ case Trunc: ret = ValueBuilder::makeCall(MATH_TRUNC, value); break;
+ case Nearest: ret = ValueBuilder::makeCall(MATH_NEAREST, value); break;
+ case Sqrt: ret = ValueBuilder::makeCall(MATH_SQRT, value); break;
+ case TruncSFloat32: ret = ValueBuilder::makePrefix(B_NOT, ValueBuilder::makePrefix(B_NOT, value)); break;
+ case ConvertSInt32: ret = ValueBuilder::makePrefix(PLUS, value); break;
default: std::cerr << curr->op << '\n'; abort();
}
+ if (curr->type == f32) { // doubles need much less coercing
+ return makeAsmCoercion(ret, ASM_FLOAT);
+ }
+ return ret;
}
default: abort();
}