diff options
Diffstat (limited to 'src/wasm.h')
-rw-r--r-- | src/wasm.h | 57 |
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); |