summaryrefslogtreecommitdiff
path: root/src/wasm
diff options
context:
space:
mode:
Diffstat (limited to 'src/wasm')
-rw-r--r--src/wasm/literal.cpp4
-rw-r--r--src/wasm/wasm-s-parser.cpp2
-rw-r--r--src/wasm/wasm-type.cpp24
3 files changed, 19 insertions, 11 deletions
diff --git a/src/wasm/literal.cpp b/src/wasm/literal.cpp
index dca3d64b4..a6dcd17f0 100644
--- a/src/wasm/literal.cpp
+++ b/src/wasm/literal.cpp
@@ -249,8 +249,8 @@ Literal Literal::convertUToF64() const {
Literal Literal::neg() const {
switch (type) {
- case Type::i32: return Literal(i32 ^ 0x80000000);
- case Type::i64: return Literal(int64_t(i64 ^ 0x8000000000000000ULL));
+ case Type::i32: return Literal(-uint32_t(i32));
+ case Type::i64: return Literal(-uint64_t(i64));
case Type::f32: return Literal(i32 ^ 0x80000000).castToF32();
case Type::f64: return Literal(int64_t(i64 ^ 0x8000000000000000ULL)).castToF64();
default: WASM_UNREACHABLE();
diff --git a/src/wasm/wasm-s-parser.cpp b/src/wasm/wasm-s-parser.cpp
index a185e02c3..5635282f7 100644
--- a/src/wasm/wasm-s-parser.cpp
+++ b/src/wasm/wasm-s-parser.cpp
@@ -760,7 +760,7 @@ Expression* SExpressionWasmBuilder::makeExpression(Element& s) {
case 'r': {
if (op[1] == 'e') {
if (op[2] == 'm') return makeBinary(s, op[4] == 'u' ? BINARY_INT(RemU) : BINARY_INT(RemS), type);
- if (op[2] == 'i') return makeUnary(s, isTypeFloat(type) ? (type == f32 ? UnaryOp::ReinterpretInt32 : UnaryOp::ReinterpretInt64) : (type == i32 ? UnaryOp::ReinterpretFloat32 : UnaryOp::ReinterpretFloat64), type);
+ if (op[2] == 'i') return makeUnary(s, isFloatType(type) ? (type == f32 ? UnaryOp::ReinterpretInt32 : UnaryOp::ReinterpretInt64) : (type == i32 ? UnaryOp::ReinterpretFloat32 : UnaryOp::ReinterpretFloat64), type);
}
if (op[1] == 'o' && op[2] == 't') {
return makeBinary(s, op[3] == 'l' ? BINARY_INT(RotL) : BINARY_INT(RotR), type);
diff --git a/src/wasm/wasm-type.cpp b/src/wasm/wasm-type.cpp
index 4b159b6e2..b030e87ae 100644
--- a/src/wasm/wasm-type.cpp
+++ b/src/wasm/wasm-type.cpp
@@ -44,14 +44,6 @@ unsigned getTypeSize(Type type) {
}
}
-bool isTypeFloat(Type type) {
- switch (type) {
- case f32:
- case f64: return true;
- default: return false;
- }
-}
-
Type getType(unsigned size, bool float_) {
if (size < 4) return Type::i32;
if (size == 4) return float_ ? Type::f32 : Type::i32;
@@ -67,4 +59,20 @@ bool isConcreteType(Type type) {
return type != none && type != unreachable;
}
+bool isIntegerType(Type type) {
+ switch (type) {
+ case i32:
+ case i64: return true;
+ default: return false;
+ }
+}
+
+bool isFloatType(Type type) {
+ switch (type) {
+ case f32:
+ case f64: return true;
+ default: return false;
+ }
+}
+
} // namespace wasm