summaryrefslogtreecommitdiff
path: root/src/literal.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/literal.h')
-rw-r--r--src/literal.h85
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);