diff options
Diffstat (limited to 'src/wasm/wasm-s-parser.cpp')
-rw-r--r-- | src/wasm/wasm-s-parser.cpp | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/src/wasm/wasm-s-parser.cpp b/src/wasm/wasm-s-parser.cpp index 044507e86..fd7c7e7ae 100644 --- a/src/wasm/wasm-s-parser.cpp +++ b/src/wasm/wasm-s-parser.cpp @@ -781,6 +781,7 @@ Expression* SExpressionWasmBuilder::makeExpression(Element& s) { abort_on(op); } case 'w': { + if (!strncmp(op, "wait", strlen("wait"))) return makeAtomicWait(s, type); if (op[1] == 'r') return makeUnary(s, UnaryOp::WrapInt64, type); abort_on(op); } @@ -866,6 +867,9 @@ Expression* SExpressionWasmBuilder::makeExpression(Element& s) { if (str[1] == 'n') return allocator.alloc<Unreachable>(); abort_on(str); } + case 'w': { + if (!strncmp(str, "wake", strlen("wake"))) return makeAtomicWake(s); + } default: abort_on(str); } } @@ -1241,6 +1245,26 @@ Expression* SExpressionWasmBuilder::makeAtomicCmpxchg(Element& s, WasmType type, return ret; } +Expression* SExpressionWasmBuilder::makeAtomicWait(Element& s, WasmType type) { + auto ret = allocator.alloc<AtomicWait>(); + ret->type = i32; + ret->expectedType = type; + ret->ptr = parseExpression(s[1]); + ret->expected = parseExpression(s[2]); + ret->timeout = parseExpression(s[3]); + ret->finalize(); + return ret; +} + +Expression* SExpressionWasmBuilder::makeAtomicWake(Element& s) { + auto ret = allocator.alloc<AtomicWake>(); + ret->type = i32; + ret->ptr = parseExpression(s[1]); + ret->wakeCount = parseExpression(s[2]); + ret->finalize(); + return ret; +} + Expression* SExpressionWasmBuilder::makeIf(Element& s) { auto ret = allocator.alloc<If>(); Index i = 1; |