diff options
Diffstat (limited to 'src/wasm/wasm-s-parser.cpp')
-rw-r--r-- | src/wasm/wasm-s-parser.cpp | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/src/wasm/wasm-s-parser.cpp b/src/wasm/wasm-s-parser.cpp index 6bf030302..38954af1f 100644 --- a/src/wasm/wasm-s-parser.cpp +++ b/src/wasm/wasm-s-parser.cpp @@ -663,6 +663,10 @@ Expression* SExpressionWasmBuilder::makeExpression(Element& s) { if (op[1] == 'b') return makeUnary(s, type == f32 ? UnaryOp::AbsFloat32 : UnaryOp::AbsFloat64, type); if (op[1] == 'd') return makeBinary(s, BINARY_INT_OR_FLOAT(Add), type); if (op[1] == 'n') return makeBinary(s, BINARY_INT(And), type); + if (op[1] == 't' && !strncmp(op, "atomic.", strlen("atomic."))) { + if (op[7] == 'l') return makeLoad(s, type, /*isAtomic=*/true); + if (op[7] == 's') return makeStore(s, type, /*isAtomic=*/true); + } abort_on(op); } case 'c': { @@ -721,7 +725,7 @@ Expression* SExpressionWasmBuilder::makeExpression(Element& s) { if (op[2] == '_') return makeBinary(s, op[3] == 'u' ? BINARY_INT(LeU) : BINARY_INT(LeS), type); if (op[2] == 0) return makeBinary(s, BINARY_FLOAT(Le), type); } - if (op[1] == 'o') return makeLoad(s, type); + if (op[1] == 'o') return makeLoad(s, type, /*isAtomic=*/false); abort_on(op); } case 'm': { @@ -764,7 +768,7 @@ Expression* SExpressionWasmBuilder::makeExpression(Element& s) { } if (op[1] == 'u') return makeBinary(s, BINARY_INT_OR_FLOAT(Sub), type); if (op[1] == 'q') return makeUnary(s, type == f32 ? UnaryOp::SqrtFloat32 : UnaryOp::SqrtFloat64, type); - if (op[1] == 't') return makeStore(s, type); + if (op[1] == 't') return makeStore(s, type, /*isAtomic=*/false); abort_on(op); } case 't': { @@ -1122,9 +1126,11 @@ Expression* SExpressionWasmBuilder::makeConst(Element& s, WasmType type) { } -Expression* SExpressionWasmBuilder::makeLoad(Element& s, WasmType type) { +Expression* SExpressionWasmBuilder::makeLoad(Element& s, WasmType type, bool isAtomic) { const char *extra = strchr(s[0]->c_str(), '.') + 5; // after "type.load" - auto ret = allocator.alloc<Load>(); + if (isAtomic) extra += 7; // after "type.atomic.load" + auto* ret = allocator.alloc<Load>(); + ret->isAtomic = isAtomic; ret->type = type; ret->bytes = getWasmTypeSize(type); if (extra[0] == '8') { @@ -1164,9 +1170,11 @@ Expression* SExpressionWasmBuilder::makeLoad(Element& s, WasmType type) { return ret; } -Expression* SExpressionWasmBuilder::makeStore(Element& s, WasmType type) { +Expression* SExpressionWasmBuilder::makeStore(Element& s, WasmType type, bool isAtomic) { const char *extra = strchr(s[0]->c_str(), '.') + 6; // after "type.store" + if (isAtomic) extra += 7; // after "type.atomic.store" auto ret = allocator.alloc<Store>(); + ret->isAtomic = isAtomic; ret->valueType = type; ret->bytes = getWasmTypeSize(type); if (extra[0] == '8') { |