diff options
Diffstat (limited to 'src/wasm')
-rw-r--r-- | src/wasm/literal.cpp | 4 | ||||
-rw-r--r-- | src/wasm/wasm-s-parser.cpp | 2 | ||||
-rw-r--r-- | src/wasm/wasm-type.cpp | 24 |
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 |