diff options
author | Daniel Wirtz <dcode@dcode.io> | 2020-08-17 19:50:37 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-08-17 10:50:37 -0700 |
commit | 0fdbb1d33810d84bbd9a408b3486bff0d9015989 (patch) | |
tree | 54a0955fa5b4640ab0b7538a7c5ba96578de6b7d /src/wasm/literal.cpp | |
parent | 5f992018bf0e80a430d9a0169c7f8048e0a98b2b (diff) | |
download | binaryen-0fdbb1d33810d84bbd9a408b3486bff0d9015989.tar.gz binaryen-0fdbb1d33810d84bbd9a408b3486bff0d9015989.tar.bz2 binaryen-0fdbb1d33810d84bbd9a408b3486bff0d9015989.zip |
Prepare for compound types that are single but not basic (#3046)
As a follow-up to https://github.com/WebAssembly/binaryen/pull/3012#pullrequestreview-459686171 this PR prepares for the new compound Signature, Struct and Array types that are single but not basic.
This includes:
* Renames `Type::getSingle` to `Type::getBasic` (NFC). Previously, its name was not representing its implementation (`isSingle` excluded `none` and `unreachable` while `getSingle` didn't, i.e. `getSingle` really was `getBasic`). Note that a hypothetical `Type::getSingle` cannot return `ValueType` anyway (new compound types are single but don't map to `ValueType`), so I figured it's best to skip implementing it until we actually need it.
* Marks locations where we are (still) assuming that all single types are basic types, as suggested in https://github.com/WebAssembly/binaryen/pull/3012#discussion_r465356708, but using a macro, so we get useful errors once we start implementing the new types and can quickly traverse the affected locations.
The macro is added where
* there used to be a `switch (type.getSingle())` or similar that handled any basic type (NFC), but in the future will also have to handle single types that are not basic types.
* we are not dealing with `Unary`, `Binary`, `Load`, `Store` or `AtomicXY` instructions, since these don't deal with compound types anyway.
Diffstat (limited to 'src/wasm/literal.cpp')
-rw-r--r-- | src/wasm/literal.cpp | 100 |
1 files changed, 51 insertions, 49 deletions
diff --git a/src/wasm/literal.cpp b/src/wasm/literal.cpp index f0a065c45..699d3ea63 100644 --- a/src/wasm/literal.cpp +++ b/src/wasm/literal.cpp @@ -37,8 +37,8 @@ Literal::Literal(const Literal& other) { *this = other; } Literal& Literal::operator=(const Literal& other) { type = other.type; - assert(!type.isMulti()); - switch (type.getSingle()) { + TODO_SINGLE_COMPOUND(type); + switch (type.getBasic()) { case Type::i32: case Type::f32: i32 = other.i32; @@ -153,7 +153,7 @@ Literal Literal::castToI64() { } int64_t Literal::getInteger() const { - switch (type.getSingle()) { + switch (type.getBasic()) { case Type::i32: return i32; case Type::i64: @@ -164,7 +164,7 @@ int64_t Literal::getInteger() const { } double Literal::getFloat() const { - switch (type.getSingle()) { + switch (type.getBasic()) { case Type::f32: return getf32(); case Type::f64: @@ -176,7 +176,8 @@ double Literal::getFloat() const { void Literal::getBits(uint8_t (&buf)[16]) const { memset(buf, 0, 16); - switch (type.getSingle()) { + TODO_SINGLE_COMPOUND(type); + switch (type.getBasic()) { case Type::i32: case Type::f32: memcpy(buf, &i32, sizeof(i32)); @@ -317,7 +318,8 @@ void Literal::printVec128(std::ostream& o, const std::array<uint8_t, 16>& v) { std::ostream& operator<<(std::ostream& o, Literal literal) { prepareMinorColor(o); - switch (literal.type.getSingle()) { + TODO_SINGLE_COMPOUND(literal.type); + switch (literal.type.getBasic()) { case Type::none: o << "?"; break; @@ -558,7 +560,7 @@ Literal Literal::truncSatToUI64() const { } Literal Literal::eqz() const { - switch (type.getSingle()) { + switch (type.getBasic()) { case Type::i32: return eq(Literal(int32_t(0))); case Type::i64: @@ -580,7 +582,7 @@ Literal Literal::eqz() const { } Literal Literal::neg() const { - switch (type.getSingle()) { + switch (type.getBasic()) { case Type::i32: return Literal(-uint32_t(i32)); case Type::i64: @@ -602,7 +604,7 @@ Literal Literal::neg() const { } Literal Literal::abs() const { - switch (type.getSingle()) { + switch (type.getBasic()) { case Type::i32: return Literal(std::abs(i32)); case Type::i64: @@ -624,7 +626,7 @@ Literal Literal::abs() const { } Literal Literal::ceil() const { - switch (type.getSingle()) { + switch (type.getBasic()) { case Type::f32: return Literal(std::ceil(getf32())); case Type::f64: @@ -635,7 +637,7 @@ Literal Literal::ceil() const { } Literal Literal::floor() const { - switch (type.getSingle()) { + switch (type.getBasic()) { case Type::f32: return Literal(std::floor(getf32())); case Type::f64: @@ -646,7 +648,7 @@ Literal Literal::floor() const { } Literal Literal::trunc() const { - switch (type.getSingle()) { + switch (type.getBasic()) { case Type::f32: return Literal(std::trunc(getf32())); case Type::f64: @@ -657,7 +659,7 @@ Literal Literal::trunc() const { } Literal Literal::nearbyint() const { - switch (type.getSingle()) { + switch (type.getBasic()) { case Type::f32: return Literal(std::nearbyint(getf32())); case Type::f64: @@ -668,7 +670,7 @@ Literal Literal::nearbyint() const { } Literal Literal::sqrt() const { - switch (type.getSingle()) { + switch (type.getBasic()) { case Type::f32: return Literal(std::sqrt(getf32())); case Type::f64: @@ -707,7 +709,7 @@ Literal Literal::demote() const { } Literal Literal::add(const Literal& other) const { - switch (type.getSingle()) { + switch (type.getBasic()) { case Type::i32: return Literal(uint32_t(i32) + uint32_t(other.i32)); case Type::i64: @@ -729,7 +731,7 @@ Literal Literal::add(const Literal& other) const { } Literal Literal::sub(const Literal& other) const { - switch (type.getSingle()) { + switch (type.getBasic()) { case Type::i32: return Literal(uint32_t(i32) - uint32_t(other.i32)); case Type::i64: @@ -822,7 +824,7 @@ Literal Literal::subSatUI16(const Literal& other) const { } Literal Literal::mul(const Literal& other) const { - switch (type.getSingle()) { + switch (type.getBasic()) { case Type::i32: return Literal(uint32_t(i32) * uint32_t(other.i32)); case Type::i64: @@ -844,7 +846,7 @@ Literal Literal::mul(const Literal& other) const { } Literal Literal::div(const Literal& other) const { - switch (type.getSingle()) { + switch (type.getBasic()) { case Type::f32: { float lhs = getf32(), rhs = other.getf32(); float sign = std::signbit(lhs) == std::signbit(rhs) ? 0.f : -0.f; @@ -923,7 +925,7 @@ Literal Literal::div(const Literal& other) const { } Literal Literal::divS(const Literal& other) const { - switch (type.getSingle()) { + switch (type.getBasic()) { case Type::i32: return Literal(i32 / other.i32); case Type::i64: @@ -934,7 +936,7 @@ Literal Literal::divS(const Literal& other) const { } Literal Literal::divU(const Literal& other) const { - switch (type.getSingle()) { + switch (type.getBasic()) { case Type::i32: return Literal(uint32_t(i32) / uint32_t(other.i32)); case Type::i64: @@ -945,7 +947,7 @@ Literal Literal::divU(const Literal& other) const { } Literal Literal::remS(const Literal& other) const { - switch (type.getSingle()) { + switch (type.getBasic()) { case Type::i32: return Literal(i32 % other.i32); case Type::i64: @@ -956,7 +958,7 @@ Literal Literal::remS(const Literal& other) const { } Literal Literal::remU(const Literal& other) const { - switch (type.getSingle()) { + switch (type.getBasic()) { case Type::i32: return Literal(uint32_t(i32) % uint32_t(other.i32)); case Type::i64: @@ -984,7 +986,7 @@ Literal Literal::avgrUInt(const Literal& other) const { } Literal Literal::and_(const Literal& other) const { - switch (type.getSingle()) { + switch (type.getBasic()) { case Type::i32: return Literal(i32 & other.i32); case Type::i64: @@ -995,7 +997,7 @@ Literal Literal::and_(const Literal& other) const { } Literal Literal::or_(const Literal& other) const { - switch (type.getSingle()) { + switch (type.getBasic()) { case Type::i32: return Literal(i32 | other.i32); case Type::i64: @@ -1006,7 +1008,7 @@ Literal Literal::or_(const Literal& other) const { } Literal Literal::xor_(const Literal& other) const { - switch (type.getSingle()) { + switch (type.getBasic()) { case Type::i32: return Literal(i32 ^ other.i32); case Type::i64: @@ -1017,7 +1019,7 @@ Literal Literal::xor_(const Literal& other) const { } Literal Literal::shl(const Literal& other) const { - switch (type.getSingle()) { + switch (type.getBasic()) { case Type::i32: return Literal(uint32_t(i32) << Bits::getEffectiveShifts(other.i32, Type::i32)); @@ -1030,7 +1032,7 @@ Literal Literal::shl(const Literal& other) const { } Literal Literal::shrS(const Literal& other) const { - switch (type.getSingle()) { + switch (type.getBasic()) { case Type::i32: return Literal(i32 >> Bits::getEffectiveShifts(other.i32, Type::i32)); case Type::i64: @@ -1041,7 +1043,7 @@ Literal Literal::shrS(const Literal& other) const { } Literal Literal::shrU(const Literal& other) const { - switch (type.getSingle()) { + switch (type.getBasic()) { case Type::i32: return Literal(uint32_t(i32) >> Bits::getEffectiveShifts(other.i32, Type::i32)); @@ -1054,7 +1056,7 @@ Literal Literal::shrU(const Literal& other) const { } Literal Literal::rotL(const Literal& other) const { - switch (type.getSingle()) { + switch (type.getBasic()) { case Type::i32: return Literal(RotateLeft(uint32_t(i32), uint32_t(other.i32))); case Type::i64: @@ -1065,7 +1067,7 @@ Literal Literal::rotL(const Literal& other) const { } Literal Literal::rotR(const Literal& other) const { - switch (type.getSingle()) { + switch (type.getBasic()) { case Type::i32: return Literal(RotateRight(uint32_t(i32), uint32_t(other.i32))); case Type::i64: @@ -1076,7 +1078,7 @@ Literal Literal::rotR(const Literal& other) const { } Literal Literal::eq(const Literal& other) const { - switch (type.getSingle()) { + switch (type.getBasic()) { case Type::i32: return Literal(i32 == other.i32); case Type::i64: @@ -1098,7 +1100,7 @@ Literal Literal::eq(const Literal& other) const { } Literal Literal::ne(const Literal& other) const { - switch (type.getSingle()) { + switch (type.getBasic()) { case Type::i32: return Literal(i32 != other.i32); case Type::i64: @@ -1120,7 +1122,7 @@ Literal Literal::ne(const Literal& other) const { } Literal Literal::ltS(const Literal& other) const { - switch (type.getSingle()) { + switch (type.getBasic()) { case Type::i32: return Literal(i32 < other.i32); case Type::i64: @@ -1131,7 +1133,7 @@ Literal Literal::ltS(const Literal& other) const { } Literal Literal::ltU(const Literal& other) const { - switch (type.getSingle()) { + switch (type.getBasic()) { case Type::i32: return Literal(uint32_t(i32) < uint32_t(other.i32)); case Type::i64: @@ -1142,7 +1144,7 @@ Literal Literal::ltU(const Literal& other) const { } Literal Literal::lt(const Literal& other) const { - switch (type.getSingle()) { + switch (type.getBasic()) { case Type::f32: return Literal(getf32() < other.getf32()); case Type::f64: @@ -1153,7 +1155,7 @@ Literal Literal::lt(const Literal& other) const { } Literal Literal::leS(const Literal& other) const { - switch (type.getSingle()) { + switch (type.getBasic()) { case Type::i32: return Literal(i32 <= other.i32); case Type::i64: @@ -1164,7 +1166,7 @@ Literal Literal::leS(const Literal& other) const { } Literal Literal::leU(const Literal& other) const { - switch (type.getSingle()) { + switch (type.getBasic()) { case Type::i32: return Literal(uint32_t(i32) <= uint32_t(other.i32)); case Type::i64: @@ -1175,7 +1177,7 @@ Literal Literal::leU(const Literal& other) const { } Literal Literal::le(const Literal& other) const { - switch (type.getSingle()) { + switch (type.getBasic()) { case Type::f32: return Literal(getf32() <= other.getf32()); case Type::f64: @@ -1186,7 +1188,7 @@ Literal Literal::le(const Literal& other) const { } Literal Literal::gtS(const Literal& other) const { - switch (type.getSingle()) { + switch (type.getBasic()) { case Type::i32: return Literal(i32 > other.i32); case Type::i64: @@ -1197,7 +1199,7 @@ Literal Literal::gtS(const Literal& other) const { } Literal Literal::gtU(const Literal& other) const { - switch (type.getSingle()) { + switch (type.getBasic()) { case Type::i32: return Literal(uint32_t(i32) > uint32_t(other.i32)); case Type::i64: @@ -1208,7 +1210,7 @@ Literal Literal::gtU(const Literal& other) const { } Literal Literal::gt(const Literal& other) const { - switch (type.getSingle()) { + switch (type.getBasic()) { case Type::f32: return Literal(getf32() > other.getf32()); case Type::f64: @@ -1219,7 +1221,7 @@ Literal Literal::gt(const Literal& other) const { } Literal Literal::geS(const Literal& other) const { - switch (type.getSingle()) { + switch (type.getBasic()) { case Type::i32: return Literal(i32 >= other.i32); case Type::i64: @@ -1230,7 +1232,7 @@ Literal Literal::geS(const Literal& other) const { } Literal Literal::geU(const Literal& other) const { - switch (type.getSingle()) { + switch (type.getBasic()) { case Type::i32: return Literal(uint32_t(i32) >= uint32_t(other.i32)); case Type::i64: @@ -1241,7 +1243,7 @@ Literal Literal::geU(const Literal& other) const { } Literal Literal::ge(const Literal& other) const { - switch (type.getSingle()) { + switch (type.getBasic()) { case Type::f32: return Literal(getf32() >= other.getf32()); case Type::f64: @@ -1252,7 +1254,7 @@ Literal Literal::ge(const Literal& other) const { } Literal Literal::min(const Literal& other) const { - switch (type.getSingle()) { + switch (type.getBasic()) { case Type::f32: { auto l = getf32(), r = other.getf32(); if (l == r && l == 0) { @@ -1295,7 +1297,7 @@ Literal Literal::min(const Literal& other) const { } Literal Literal::max(const Literal& other) const { - switch (type.getSingle()) { + switch (type.getBasic()) { case Type::f32: { auto l = getf32(), r = other.getf32(); if (l == r && l == 0) { @@ -1338,7 +1340,7 @@ Literal Literal::max(const Literal& other) const { } Literal Literal::pmin(const Literal& other) const { - switch (type.getSingle()) { + switch (type.getBasic()) { case Type::f32: case Type::f64: return other.lt(*this).geti32() ? other : *this; @@ -1348,7 +1350,7 @@ Literal Literal::pmin(const Literal& other) const { } Literal Literal::pmax(const Literal& other) const { - switch (type.getSingle()) { + switch (type.getBasic()) { case Type::f32: case Type::f64: return this->lt(other).geti32() ? other : *this; @@ -1359,7 +1361,7 @@ Literal Literal::pmax(const Literal& other) const { Literal Literal::copysign(const Literal& other) const { // operate on bits directly, to avoid signalling bit being set on a float - switch (type.getSingle()) { + switch (type.getBasic()) { case Type::f32: return Literal((i32 & 0x7fffffff) | (other.i32 & 0x80000000)).castToF32(); break; |