diff options
Diffstat (limited to 'src/wasm/wasm-binary.cpp')
-rw-r--r-- | src/wasm/wasm-binary.cpp | 37 |
1 files changed, 31 insertions, 6 deletions
diff --git a/src/wasm/wasm-binary.cpp b/src/wasm/wasm-binary.cpp index 813810016..1a5c8a0f4 100644 --- a/src/wasm/wasm-binary.cpp +++ b/src/wasm/wasm-binary.cpp @@ -3160,72 +3160,90 @@ void WasmBinaryBuilder::readMemoryAccess(Address& alignment, Address& offset) { bool WasmBinaryBuilder::maybeVisitLoad(Expression*& out, uint8_t code, bool isAtomic) { - auto* curr = allocator.alloc<Load>(); - // The signed field does not matter in some cases (where the size of the load - // is equal to the size of the type, in which case we do not extend), but give - // it a default value nonetheless, to make hashing and other code simpler, so - // that they do not need to consider whether the sign matters or not. - curr->signed_ = false; + Load* curr; + auto allocate = [&]() { + curr = allocator.alloc<Load>(); + // The signed field does not matter in some cases (where the size of the + // load is equal to the size of the type, in which case we do not extend), + // but give it a default value nonetheless, to make hashing and other code + // simpler, so that they do not need to consider whether the sign matters or + // not. + curr->signed_ = false; + }; if (!isAtomic) { switch (code) { case BinaryConsts::I32LoadMem8S: + allocate(); curr->bytes = 1; curr->type = Type::i32; curr->signed_ = true; break; case BinaryConsts::I32LoadMem8U: + allocate(); curr->bytes = 1; curr->type = Type::i32; break; case BinaryConsts::I32LoadMem16S: + allocate(); curr->bytes = 2; curr->type = Type::i32; curr->signed_ = true; break; case BinaryConsts::I32LoadMem16U: + allocate(); curr->bytes = 2; curr->type = Type::i32; break; case BinaryConsts::I32LoadMem: + allocate(); curr->bytes = 4; curr->type = Type::i32; break; case BinaryConsts::I64LoadMem8S: + allocate(); curr->bytes = 1; curr->type = Type::i64; curr->signed_ = true; break; case BinaryConsts::I64LoadMem8U: + allocate(); curr->bytes = 1; curr->type = Type::i64; break; case BinaryConsts::I64LoadMem16S: + allocate(); curr->bytes = 2; curr->type = Type::i64; curr->signed_ = true; break; case BinaryConsts::I64LoadMem16U: + allocate(); curr->bytes = 2; curr->type = Type::i64; break; case BinaryConsts::I64LoadMem32S: + allocate(); curr->bytes = 4; curr->type = Type::i64; curr->signed_ = true; break; case BinaryConsts::I64LoadMem32U: + allocate(); curr->bytes = 4; curr->type = Type::i64; break; case BinaryConsts::I64LoadMem: + allocate(); curr->bytes = 8; curr->type = Type::i64; break; case BinaryConsts::F32LoadMem: + allocate(); curr->bytes = 4; curr->type = Type::f32; break; case BinaryConsts::F64LoadMem: + allocate(); curr->bytes = 8; curr->type = Type::f64; break; @@ -3236,30 +3254,37 @@ bool WasmBinaryBuilder::maybeVisitLoad(Expression*& out, } else { switch (code) { case BinaryConsts::I32AtomicLoad8U: + allocate(); curr->bytes = 1; curr->type = Type::i32; break; case BinaryConsts::I32AtomicLoad16U: + allocate(); curr->bytes = 2; curr->type = Type::i32; break; case BinaryConsts::I32AtomicLoad: + allocate(); curr->bytes = 4; curr->type = Type::i32; break; case BinaryConsts::I64AtomicLoad8U: + allocate(); curr->bytes = 1; curr->type = Type::i64; break; case BinaryConsts::I64AtomicLoad16U: + allocate(); curr->bytes = 2; curr->type = Type::i64; break; case BinaryConsts::I64AtomicLoad32U: + allocate(); curr->bytes = 4; curr->type = Type::i64; break; case BinaryConsts::I64AtomicLoad: + allocate(); curr->bytes = 8; curr->type = Type::i64; break; |