diff options
Diffstat (limited to 'src/literal.h')
-rw-r--r-- | src/literal.h | 85 |
1 files changed, 80 insertions, 5 deletions
diff --git a/src/literal.h b/src/literal.h index eedccabcc..33300c920 100644 --- a/src/literal.h +++ b/src/literal.h @@ -96,7 +96,57 @@ public: } return false; } + bool isZero() const { + switch (type.getBasic()) { + case Type::i32: + return i32 == 0; + case Type::i64: + return i64 == 0LL; + case Type::f32: + return bit_cast<float>(i32) == 0.0f; + case Type::f64: + return bit_cast<double>(i64) == 0.0; + case Type::v128: { + uint8_t zeros[16] = {0}; + return memcmp(&v128, zeros, 16) == 0; + } + default: + WASM_UNREACHABLE("unexpected type"); + } + } + bool isSignedMin() const { + switch (type.getBasic()) { + case Type::i32: + return i32 == std::numeric_limits<int32_t>::min(); + case Type::i64: + return i64 == std::numeric_limits<int64_t>::min(); + default: + WASM_UNREACHABLE("unexpected type"); + } + } + bool isSignedMax() const { + switch (type.getBasic()) { + case Type::i32: + return i32 == std::numeric_limits<int32_t>::max(); + case Type::i64: + return i64 == std::numeric_limits<int64_t>::max(); + default: + WASM_UNREACHABLE("unexpected type"); + } + } + bool isUnsignedMax() const { + switch (type.getBasic()) { + case Type::i32: + return uint32_t(i32) == std::numeric_limits<uint32_t>::max(); + case Type::i64: + return uint64_t(i64) == std::numeric_limits<uint64_t>::max(); + default: + WASM_UNREACHABLE("unexpected type"); + } + } + static Literals makeZero(Type type); + static Literal makeSingleZero(Type type); static Literal makeFromInt32(int32_t x, Type type) { switch (type.getBasic()) { case Type::i32: @@ -116,7 +166,6 @@ public: WASM_UNREACHABLE("unexpected type"); } } - static Literal makeFromUInt64(uint64_t x, Type type) { switch (type.getBasic()) { case Type::i32: @@ -131,10 +180,36 @@ public: WASM_UNREACHABLE("unexpected type"); } } - - static Literals makeZero(Type type); - static Literal makeSingleZero(Type type); - + static Literal makeSignedMin(Type type) { + switch (type.getBasic()) { + case Type::i32: + return Literal(std::numeric_limits<int32_t>::min()); + case Type::i64: + return Literal(std::numeric_limits<int64_t>::min()); + default: + WASM_UNREACHABLE("unexpected type"); + } + } + static Literal makeSignedMax(Type type) { + switch (type.getBasic()) { + case Type::i32: + return Literal(std::numeric_limits<int32_t>::max()); + case Type::i64: + return Literal(std::numeric_limits<int64_t>::max()); + default: + WASM_UNREACHABLE("unexpected type"); + } + } + static Literal makeUnsignedMax(Type type) { + switch (type.getBasic()) { + case Type::i32: + return Literal(std::numeric_limits<uint32_t>::max()); + case Type::i64: + return Literal(std::numeric_limits<uint64_t>::max()); + default: + WASM_UNREACHABLE("unexpected type"); + } + } static Literal makeNull(Type type) { assert(type.isNullable()); return Literal(type); |