// Copyright 2017 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef V8_WASM_VALUE_H_ #define V8_WASM_VALUE_H_ #include "src/boxed-float.h" #include "src/wasm/wasm-opcodes.h" #include "src/zone/zone-containers.h" namespace v8 { namespace internal { namespace wasm { // Macro for defining WasmValue methods for different types. // Elements: // - name (for to_<name>() method) // - wasm type // - c type // - how to get bit pattern from value {v} of type {c type} // - how to get value of type {c type} from bit pattern {p} #define FOREACH_WASMVAL_TYPE(V) \ V(i32, kWasmI32, int32_t, static_cast<uint32_t>(v), static_cast<int32_t>(p)) \ V(u32, kWasmI32, uint32_t, v, static_cast<uint32_t>(p)) \ V(i64, kWasmI64, int64_t, static_cast<uint64_t>(v), static_cast<int64_t>(p)) \ V(u64, kWasmI64, uint64_t, v, p) \ V(f32, kWasmF32, float, bit_cast<uint32_t>(v), \ bit_cast<float>(static_cast<uint32_t>(p))) \ V(f32_boxed, kWasmF32, Float32, v.get_bits(), \ Float32::FromBits(static_cast<uint32_t>(p))) \ V(f64, kWasmF64, double, bit_cast<uint64_t>(v), bit_cast<double>(p)) \ V(f64_boxed, kWasmF64, Float64, v.get_bits(), Float64::FromBits(p)) // A wasm value with type information. class WasmValue { public: WasmValue() : type_(kWasmStmt) {} #define DEFINE_TYPE_SPECIFIC_METHODS(name, localtype, ctype, v_to_p, p_to_v) \ explicit WasmValue(ctype v) : type_(localtype), bit_pattern_(v_to_p) {} \ ctype to_##name() const { \ DCHECK_EQ(localtype, type_); \ return to_##name##_unchecked(); \ } \ ctype to_##name##_unchecked() const { \ auto p = bit_pattern_; \ return p_to_v; \ } FOREACH_WASMVAL_TYPE(DEFINE_TYPE_SPECIFIC_METHODS) #undef DEFINE_TYPE_SPECIFIC_METHODS ValueType type() const { return type_; } // Checks equality of type and bit pattern (also for float and double values). bool operator==(const WasmValue& other) const { return type_ == other.type_ && bit_pattern_ == other.bit_pattern_; } template <typename T> inline T to() const; template <typename T> inline T to_unchecked() const; private: ValueType type_; uint64_t bit_pattern_; }; #define DECLARE_CAST(name, localtype, ctype, ...) \ template <> \ inline ctype WasmValue::to_unchecked() const { \ return to_##name(); \ } \ template <> \ inline ctype WasmValue::to() const { \ return to_##name##_unchecked(); \ } FOREACH_WASMVAL_TYPE(DECLARE_CAST) #undef DECLARE_CAST } // namespace wasm } // namespace internal } // namespace v8 #endif // V8_WASM_VALUE_H_