diff options
Diffstat (limited to 'src/wasm/wasm-s-parser.cpp')
-rw-r--r-- | src/wasm/wasm-s-parser.cpp | 28 |
1 files changed, 26 insertions, 2 deletions
diff --git a/src/wasm/wasm-s-parser.cpp b/src/wasm/wasm-s-parser.cpp index 322c36c45..9f1fe0044 100644 --- a/src/wasm/wasm-s-parser.cpp +++ b/src/wasm/wasm-s-parser.cpp @@ -1251,10 +1251,10 @@ static uint8_t parseMemBytes(const char*& s, uint8_t fallback) { static size_t parseMemAttributes(Element& s, Address* offset, Address* align, - Address fallback) { + Address fallbackAlign) { size_t i = 1; *offset = 0; - *align = fallback; + *align = fallbackAlign; while (!s[i]->isList()) { const char* str = s[i]->c_str(); const char* eq = strchr(str, '='); @@ -1493,6 +1493,30 @@ Expression* SExpressionWasmBuilder::makeSIMDShift(Element& s, SIMDShiftOp op) { return ret; } +Expression* SExpressionWasmBuilder::makeSIMDLoad(Element& s, SIMDLoadOp op) { + auto ret = allocator.alloc<SIMDLoad>(); + ret->op = op; + Address defaultAlign; + switch (op) { + case LoadSplatVec8x16: + defaultAlign = 1; + break; + case LoadSplatVec16x8: + defaultAlign = 2; + break; + case LoadSplatVec32x4: + defaultAlign = 4; + break; + case LoadSplatVec64x2: + defaultAlign = 8; + break; + } + size_t i = parseMemAttributes(s, &ret->offset, &ret->align, defaultAlign); + ret->ptr = parseExpression(s[i]); + ret->finalize(); + return ret; +} + Expression* SExpressionWasmBuilder::makeMemoryInit(Element& s) { auto ret = allocator.alloc<MemoryInit>(); ret->segment = atoi(s[1]->str().c_str()); |