%PDF- %PDF-
| Direktori : /home/vacivi36/vittasync.vacivitta.com.br/vittasync/node/deps/v8/src/wasm/ |
| Current File : /home/vacivi36/vittasync.vacivitta.com.br/vittasync/node/deps/v8/src/wasm/wasm-init-expr.h |
// Copyright 2021 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.
#if !V8_ENABLE_WEBASSEMBLY
#error This header should only be included if WebAssembly is enabled.
#endif // !V8_ENABLE_WEBASSEMBLY
#ifndef V8_WASM_WASM_INIT_EXPR_H_
#define V8_WASM_WASM_INIT_EXPR_H_
#include <memory>
#include "src/wasm/value-type.h"
#include "src/zone/zone-containers.h"
namespace v8 {
namespace internal {
namespace wasm {
struct WasmModule;
class WasmFeatures;
// Representation of an constant expression. Unlike {ConstantExpression}, this
// does not use {WireBytesRef}, i.e., it does not depend on a wasm module's
// bytecode representation.
class WasmInitExpr : public ZoneObject {
public:
enum Operator {
kGlobalGet,
kI32Const,
kI64Const,
kF32Const,
kF64Const,
kS128Const,
kI32Add,
kI32Sub,
kI32Mul,
kI64Add,
kI64Sub,
kI64Mul,
kRefNullConst,
kRefFuncConst,
kStructNew,
kStructNewDefault,
kArrayNew,
kArrayNewDefault,
kArrayNewFixed,
kRefI31,
kStringConst,
kExternInternalize,
kExternExternalize
};
union Immediate {
int32_t i32_const;
int64_t i64_const;
float f32_const;
double f64_const;
std::array<uint8_t, kSimd128Size> s128_const;
uint32_t index;
HeapType::Representation heap_type;
};
explicit WasmInitExpr(int32_t v) : kind_(kI32Const), operands_(nullptr) {
immediate_.i32_const = v;
}
explicit WasmInitExpr(int64_t v) : kind_(kI64Const), operands_(nullptr) {
immediate_.i64_const = v;
}
explicit WasmInitExpr(float v) : kind_(kF32Const), operands_(nullptr) {
immediate_.f32_const = v;
}
explicit WasmInitExpr(double v) : kind_(kF64Const), operands_(nullptr) {
immediate_.f64_const = v;
}
explicit WasmInitExpr(uint8_t v[kSimd128Size])
: kind_(kS128Const), operands_(nullptr) {
memcpy(immediate_.s128_const.data(), v, kSimd128Size);
}
static WasmInitExpr Binop(Zone* zone, Operator op, WasmInitExpr lhs,
WasmInitExpr rhs) {
DCHECK(op == kI32Add || op == kI32Sub || op == kI32Mul || op == kI64Add ||
op == kI64Sub || op == kI64Mul);
return WasmInitExpr(zone, op, {lhs, rhs});
}
static WasmInitExpr GlobalGet(uint32_t index) {
WasmInitExpr expr(kGlobalGet);
expr.immediate_.index = index;
return expr;
}
static WasmInitExpr RefFuncConst(uint32_t index) {
WasmInitExpr expr(kRefFuncConst);
expr.immediate_.index = index;
return expr;
}
static WasmInitExpr RefNullConst(HeapType::Representation heap_type) {
WasmInitExpr expr(kRefNullConst);
expr.immediate_.heap_type = heap_type;
return expr;
}
static WasmInitExpr StructNew(uint32_t index,
ZoneVector<WasmInitExpr>* elements) {
WasmInitExpr expr(kStructNew, elements);
expr.immediate_.index = index;
return expr;
}
static WasmInitExpr StructNewDefault(uint32_t index) {
WasmInitExpr expr(kStructNewDefault);
expr.immediate_.index = index;
return expr;
}
static WasmInitExpr ArrayNew(Zone* zone, uint32_t index, WasmInitExpr initial,
WasmInitExpr length) {
WasmInitExpr expr(zone, kArrayNew, {initial, length});
expr.immediate_.index = index;
return expr;
}
static WasmInitExpr ArrayNewDefault(Zone* zone, uint32_t index,
WasmInitExpr length) {
WasmInitExpr expr(zone, kArrayNewDefault, {length});
expr.immediate_.index = index;
return expr;
}
static WasmInitExpr ArrayNewFixed(uint32_t index,
ZoneVector<WasmInitExpr>* elements) {
WasmInitExpr expr(kArrayNewFixed, elements);
expr.immediate_.index = index;
return expr;
}
static WasmInitExpr RefI31(Zone* zone, WasmInitExpr value) {
WasmInitExpr expr(zone, kRefI31, {value});
return expr;
}
static WasmInitExpr StringConst(uint32_t index) {
WasmInitExpr expr(kStringConst);
expr.immediate_.index = index;
return expr;
}
static WasmInitExpr ExternInternalize(Zone* zone, WasmInitExpr arg) {
return WasmInitExpr(zone, kExternInternalize, {arg});
}
static WasmInitExpr ExternExternalize(Zone* zone, WasmInitExpr arg) {
return WasmInitExpr(zone, kExternExternalize, {arg});
}
Immediate immediate() const { return immediate_; }
Operator kind() const { return kind_; }
const ZoneVector<WasmInitExpr>* operands() const { return operands_; }
bool operator==(const WasmInitExpr& other) const {
if (kind() != other.kind()) return false;
switch (kind()) {
case kGlobalGet:
case kRefFuncConst:
case kStringConst:
return immediate().index == other.immediate().index;
case kI32Const:
return immediate().i32_const == other.immediate().i32_const;
case kI64Const:
return immediate().i64_const == other.immediate().i64_const;
case kF32Const:
return immediate().f32_const == other.immediate().f32_const;
case kF64Const:
return immediate().f64_const == other.immediate().f64_const;
case kI32Add:
case kI32Sub:
case kI32Mul:
case kI64Add:
case kI64Sub:
case kI64Mul:
return operands_[0] == other.operands_[0] &&
operands_[1] == other.operands_[1];
case kS128Const:
return immediate().s128_const == other.immediate().s128_const;
case kRefNullConst:
return immediate().heap_type == other.immediate().heap_type;
case kStructNew:
case kStructNewDefault:
case kArrayNew:
case kArrayNewDefault:
if (immediate().index != other.immediate().index) return false;
DCHECK_EQ(operands()->size(), other.operands()->size());
for (uint32_t i = 0; i < operands()->size(); i++) {
if (operands()[i] != other.operands()[i]) return false;
}
return true;
case kArrayNewFixed:
if (immediate().index != other.immediate().index) return false;
if (operands()->size() != other.operands()->size()) return false;
for (uint32_t i = 0; i < operands()->size(); i++) {
if (operands()[i] != other.operands()[i]) return false;
}
return true;
case kRefI31:
case kExternInternalize:
case kExternExternalize:
return operands_[0] == other.operands_[0];
}
}
V8_INLINE bool operator!=(const WasmInitExpr& other) const {
return !(*this == other);
}
static WasmInitExpr DefaultValue(ValueType type) {
// No initializer, emit a default value.
switch (type.kind()) {
case kI8:
case kI16:
case kI32:
return WasmInitExpr(int32_t{0});
case kI64:
return WasmInitExpr(int64_t{0});
case kF32:
return WasmInitExpr(0.0f);
case kF64:
return WasmInitExpr(0.0);
case kRefNull:
return WasmInitExpr::RefNullConst(type.heap_representation());
case kS128: {
uint8_t value[kSimd128Size] = {0};
return WasmInitExpr(value);
}
case kVoid:
case kBottom:
case kRef:
case kRtt:
UNREACHABLE();
}
}
private:
WasmInitExpr(Operator kind, const ZoneVector<WasmInitExpr>* operands)
: kind_(kind), operands_(operands) {}
explicit WasmInitExpr(Operator kind) : kind_(kind), operands_(nullptr) {}
WasmInitExpr(Zone* zone, Operator kind,
std::initializer_list<WasmInitExpr> operands)
: kind_(kind),
operands_(zone->New<ZoneVector<WasmInitExpr>>(operands, zone)) {}
Immediate immediate_;
Operator kind_;
const ZoneVector<WasmInitExpr>* operands_;
};
ASSERT_TRIVIALLY_COPYABLE(WasmInitExpr);
} // namespace wasm
} // namespace internal
} // namespace v8
#endif // V8_WASM_WASM_INIT_EXPR_H_