summaryrefslogtreecommitdiff
path: root/src/wasm.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/wasm.h')
-rw-r--r--src/wasm.h57
1 files changed, 14 insertions, 43 deletions
diff --git a/src/wasm.h b/src/wasm.h
index a16dab478..ab9d7c816 100644
--- a/src/wasm.h
+++ b/src/wasm.h
@@ -35,49 +35,10 @@
#include "mixed_arena.h"
#include "support/name.h"
#include "wasm-type.h"
+#include "wasm-features.h"
namespace wasm {
-struct FeatureSet {
- enum Feature : uint32_t {
- MVP = 0,
- Atomics = 1 << 0,
- MutableGlobals = 1 << 1,
- TruncSat = 1 << 2,
- SIMD = 1 << 3,
- BulkMemory = 1 << 4,
- All = Atomics | MutableGlobals | TruncSat | SIMD | BulkMemory
- };
-
- FeatureSet() : features(MVP) {}
- FeatureSet(uint32_t features) : features(features) {}
-
- bool isMVP() const { return features == MVP; }
- bool has(Feature f) { return (features & f) == f; }
- bool hasAtomics() const { return features & Atomics; }
- bool hasMutableGlobals() const { return features & MutableGlobals; }
- bool hasTruncSat() const { return features & TruncSat; }
- bool hasSIMD() const { return features & SIMD; }
- bool hasBulkMemory() const { return features & BulkMemory; }
- bool hasAll() const { return features & All; }
-
- void makeMVP() { features = MVP; }
- void set(Feature f, bool v = true) { features = v ? (features | f) : (features & ~f); }
- void setAtomics(bool v = true) { set(Atomics, v); }
- void setMutableGlobals(bool v = true) { set(MutableGlobals, v); }
- void setTruncSat(bool v = true) { set(TruncSat, v); }
- void setSIMD(bool v = true) { set(SIMD, v); }
- void setBulkMemory(bool v = true) { set(BulkMemory, v); }
- void setAll(bool v = true) { features = v ? All : MVP; }
-
- bool operator<=(const FeatureSet& other) {
- return !(features & ~other.features);
- }
-
-private:
- uint32_t features;
-};
-
// An index in a wasm module
typedef uint32_t Index;
@@ -114,7 +75,6 @@ enum UnaryOp {
PromoteFloat32, // f32 to f64
DemoteFloat64, // f64 to f32
ReinterpretInt32, ReinterpretInt64, // reinterpret bits to float
- // The following sign-extention operators go along with wasm atomics support.
// Extend signed subword-sized integer. This differs from e.g. ExtendSInt32
// because the input integer is in an i64 value insetad of an i32 value.
ExtendS8Int32, ExtendS16Int32, ExtendS8Int64, ExtendS16Int64, ExtendS32Int64,
@@ -268,7 +228,7 @@ public:
void finalize() {}
template<class T>
- bool is() {
+ bool is() const {
return int(_id) == int(T::SpecificId);
}
@@ -277,11 +237,22 @@ public:
return int(_id) == int(T::SpecificId) ? (T*)this : nullptr;
}
+ template <class T>
+ const T* dynCast() const {
+ return int(_id) == int(T::SpecificId) ? (const T*)this : nullptr;
+ }
+
template<class T>
T* cast() {
assert(int(_id) == int(T::SpecificId));
return (T*)this;
}
+
+ template<class T>
+ const T* cast() const {
+ assert(int(_id) == int(T::SpecificId));
+ return (const T*)this;
+ }
};
const char* getExpressionName(Expression* curr);
@@ -956,7 +927,7 @@ private:
std::map<Name, Global*> globalsMap;
public:
- Module() = default;;
+ Module() = default;
FunctionType* getFunctionType(Name name);
Export* getExport(Name name);