Skip to content

Commit d391d96

Browse files
authored
Rebase threads parsing/syntax (#201)
* Rebase threads parsing/syntax * Formatting
1 parent eaf4d7e commit d391d96

11 files changed

Lines changed: 1286 additions & 0 deletions

File tree

interpreter/binary/decode.ml

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -775,6 +775,89 @@ let rec instr s =
775775
| n -> illegal s pos (I32.to_int_u n)
776776
)
777777

778+
| 0xfe ->
779+
let open Values in
780+
(match op s with
781+
| 0x00 -> let a, o = memop s in memory_atomic_notify a o
782+
| 0x01 -> let a, o = memop s in memory_atomic_wait32 a o
783+
| 0x02 -> let a, o = memop s in memory_atomic_wait64 a o
784+
| 0x03 -> expect 0x00 s "zero flag expected"; atomic_fence
785+
786+
| 0x10 -> let a, o = memop s in i32_atomic_load a o
787+
| 0x11 -> let a, o = memop s in i64_atomic_load a o
788+
| 0x12 -> let a, o = memop s in i32_atomic_load8_u a o
789+
| 0x13 -> let a, o = memop s in i32_atomic_load16_u a o
790+
| 0x14 -> let a, o = memop s in i64_atomic_load8_u a o
791+
| 0x15 -> let a, o = memop s in i64_atomic_load16_u a o
792+
| 0x16 -> let a, o = memop s in i64_atomic_load32_u a o
793+
| 0x17 -> let a, o = memop s in i32_atomic_store a o
794+
| 0x18 -> let a, o = memop s in i64_atomic_store a o
795+
| 0x19 -> let a, o = memop s in i32_atomic_store8 a o
796+
| 0x1a -> let a, o = memop s in i32_atomic_store16 a o
797+
| 0x1b -> let a, o = memop s in i64_atomic_store8 a o
798+
| 0x1c -> let a, o = memop s in i64_atomic_store16 a o
799+
| 0x1d -> let a, o = memop s in i64_atomic_store32 a o
800+
801+
| 0x1e -> let a, o = memop s in i32_atomic_rmw (I32 I32Op.RmwAdd) a o
802+
| 0x1f -> let a, o = memop s in i64_atomic_rmw (I64 I64Op.RmwAdd) a o
803+
| 0x20 -> let a, o = memop s in i32_atomic_rmw8_u (I32 I32Op.RmwAdd) a o
804+
| 0x21 -> let a, o = memop s in i32_atomic_rmw16_u (I32 I32Op.RmwAdd) a o
805+
| 0x22 -> let a, o = memop s in i64_atomic_rmw8_u (I64 I64Op.RmwAdd) a o
806+
| 0x23 -> let a, o = memop s in i64_atomic_rmw16_u (I64 I64Op.RmwAdd) a o
807+
| 0x24 -> let a, o = memop s in i64_atomic_rmw32_u (I64 I64Op.RmwAdd) a o
808+
809+
| 0x25 -> let a, o = memop s in i32_atomic_rmw (I32 I32Op.RmwSub) a o
810+
| 0x26 -> let a, o = memop s in i64_atomic_rmw (I64 I64Op.RmwSub) a o
811+
| 0x27 -> let a, o = memop s in i32_atomic_rmw8_u (I32 I32Op.RmwSub) a o
812+
| 0x28 -> let a, o = memop s in i32_atomic_rmw16_u (I32 I32Op.RmwSub) a o
813+
| 0x29 -> let a, o = memop s in i64_atomic_rmw8_u (I64 I64Op.RmwSub) a o
814+
| 0x2a -> let a, o = memop s in i64_atomic_rmw16_u (I64 I64Op.RmwSub) a o
815+
| 0x2b -> let a, o = memop s in i64_atomic_rmw32_u (I64 I64Op.RmwSub) a o
816+
817+
| 0x2c -> let a, o = memop s in i32_atomic_rmw (I32 I32Op.RmwAnd) a o
818+
| 0x2d -> let a, o = memop s in i64_atomic_rmw (I64 I64Op.RmwAnd) a o
819+
| 0x2e -> let a, o = memop s in i32_atomic_rmw8_u (I32 I32Op.RmwAnd) a o
820+
| 0x2f -> let a, o = memop s in i32_atomic_rmw16_u (I32 I32Op.RmwAnd) a o
821+
| 0x30 -> let a, o = memop s in i64_atomic_rmw8_u (I64 I64Op.RmwAnd) a o
822+
| 0x31 -> let a, o = memop s in i64_atomic_rmw16_u (I64 I64Op.RmwAnd) a o
823+
| 0x32 -> let a, o = memop s in i64_atomic_rmw32_u (I64 I64Op.RmwAnd) a o
824+
825+
| 0x33 -> let a, o = memop s in i32_atomic_rmw (I32 I32Op.RmwOr) a o
826+
| 0x34 -> let a, o = memop s in i64_atomic_rmw (I64 I64Op.RmwOr) a o
827+
| 0x35 -> let a, o = memop s in i32_atomic_rmw8_u (I32 I32Op.RmwOr) a o
828+
| 0x36 -> let a, o = memop s in i32_atomic_rmw16_u (I32 I32Op.RmwOr) a o
829+
| 0x37 -> let a, o = memop s in i64_atomic_rmw8_u (I64 I64Op.RmwOr) a o
830+
| 0x38 -> let a, o = memop s in i64_atomic_rmw16_u (I64 I64Op.RmwOr) a o
831+
| 0x39 -> let a, o = memop s in i64_atomic_rmw32_u (I64 I64Op.RmwOr) a o
832+
833+
| 0x3a -> let a, o = memop s in i32_atomic_rmw (I32 I32Op.RmwXor) a o
834+
| 0x3b -> let a, o = memop s in i64_atomic_rmw (I64 I64Op.RmwXor) a o
835+
| 0x3c -> let a, o = memop s in i32_atomic_rmw8_u (I32 I32Op.RmwXor) a o
836+
| 0x3d -> let a, o = memop s in i32_atomic_rmw16_u (I32 I32Op.RmwXor) a o
837+
| 0x3e -> let a, o = memop s in i64_atomic_rmw8_u (I64 I64Op.RmwXor) a o
838+
| 0x3f -> let a, o = memop s in i64_atomic_rmw16_u (I64 I64Op.RmwXor) a o
839+
| 0x40 -> let a, o = memop s in i64_atomic_rmw32_u (I64 I64Op.RmwXor) a o
840+
841+
| 0x41 -> let a, o = memop s in i32_atomic_rmw (I32 I32Op.RmwXchg) a o
842+
| 0x42 -> let a, o = memop s in i64_atomic_rmw (I64 I64Op.RmwXchg) a o
843+
| 0x43 -> let a, o = memop s in i32_atomic_rmw8_u (I32 I32Op.RmwXchg) a o
844+
| 0x44 -> let a, o = memop s in i32_atomic_rmw16_u (I32 I32Op.RmwXchg) a o
845+
| 0x45 -> let a, o = memop s in i64_atomic_rmw8_u (I64 I64Op.RmwXchg) a o
846+
| 0x46 -> let a, o = memop s in i64_atomic_rmw16_u (I64 I64Op.RmwXchg) a o
847+
| 0x47 -> let a, o = memop s in i64_atomic_rmw32_u (I64 I64Op.RmwXchg) a o
848+
849+
| 0x48 -> let a, o = memop s in i32_atomic_rmw_cmpxchg a o
850+
| 0x49 -> let a, o = memop s in i64_atomic_rmw_cmpxchg a o
851+
| 0x4a -> let a, o = memop s in i32_atomic_rmw8_u_cmpxchg a o
852+
| 0x4b -> let a, o = memop s in i32_atomic_rmw16_u_cmpxchg a o
853+
| 0x4c -> let a, o = memop s in i64_atomic_rmw8_u_cmpxchg a o
854+
| 0x4d -> let a, o = memop s in i64_atomic_rmw16_u_cmpxchg a o
855+
| 0x4e -> let a, o = memop s in i64_atomic_rmw32_u_cmpxchg a o
856+
857+
| b -> illegal s (pos + 1) b
858+
)
859+
860+
778861
| b -> illegal s pos b
779862

780863
and instr_block s = List.rev (instr_block' s [])

interpreter/binary/encode.ml

Lines changed: 171 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,177 @@ struct
288288
vecop 0x5al; memop mo; byte i;
289289
| VecStoreLane ({ty = V128Type; pack = Pack64; _} as mo, i) ->
290290
vecop 0x5bl; memop mo; byte i;
291+
292+
| MemoryAtomicNotify ({ty = I32Type; pack = None; _} as mo) ->
293+
op 0xfe; op 0x00; memop mo
294+
| MemoryAtomicNotify {ty = I32Type; pack = Some _; _} -> assert false
295+
| MemoryAtomicNotify {ty = I64Type | F32Type | F64Type; _} -> assert false
296+
297+
| MemoryAtomicWait ({ty = I32Type; pack = None; _} as mo) ->
298+
op 0xfe; op 0x01; memop mo
299+
| MemoryAtomicWait ({ty = I64Type; pack = None; _} as mo) ->
300+
op 0xfe; op 0x02; memop mo
301+
| MemoryAtomicWait {ty = I32Type | I64Type; pack = Some _; _} ->
302+
assert false
303+
| MemoryAtomicWait {ty = F32Type | F64Type; _} -> assert false
304+
305+
| AtomicFence ->
306+
op 0xfe; op 0x03; op 0x00
307+
308+
| AtomicLoad ({ty = I32Type; pack = None; _} as mo) ->
309+
op 0xfe; op 0x10; memop mo
310+
| AtomicLoad ({ty = I64Type; pack = None; _} as mo) ->
311+
op 0xfe; op 0x11; memop mo
312+
| AtomicLoad ({ty = I32Type; pack = Some Pack8; _} as mo) ->
313+
op 0xfe; op 0x12; memop mo
314+
| AtomicLoad ({ty = I32Type; pack = Some Pack16; _} as mo) ->
315+
op 0xfe; op 0x13; memop mo
316+
| AtomicLoad {ty = I32Type; pack = Some Pack32; _} -> assert false
317+
| AtomicLoad {ty = I32Type; pack = Some Pack64; _} -> assert false
318+
| AtomicLoad ({ty = I64Type; pack = Some Pack8; _} as mo) ->
319+
op 0xfe; op 0x14; memop mo
320+
| AtomicLoad ({ty = I64Type; pack = Some Pack16; _} as mo) ->
321+
op 0xfe; op 0x15; memop mo
322+
| AtomicLoad ({ty = I64Type; pack = Some Pack32; _} as mo) ->
323+
op 0xfe; op 0x16; memop mo
324+
| AtomicLoad ({ty = I64Type; pack = Some Pack64; _}) -> assert false
325+
| AtomicLoad {ty = F32Type | F64Type; _} -> assert false
326+
327+
| AtomicStore ({ty = I32Type; pack = None; _} as mo) ->
328+
op 0xfe; op 0x17; memop mo
329+
| AtomicStore ({ty = I64Type; pack = None; _} as mo) ->
330+
op 0xfe; op 0x18; memop mo
331+
| AtomicStore ({ty = I32Type; pack = Some Pack8; _} as mo) ->
332+
op 0xfe; op 0x19; memop mo
333+
| AtomicStore ({ty = I32Type; pack = Some Pack16; _} as mo) ->
334+
op 0xfe; op 0x1a; memop mo
335+
| AtomicStore {ty = I32Type; pack = Some Pack32; _} -> assert false
336+
| AtomicStore {ty = I32Type; pack = Some Pack64; _} -> assert false
337+
| AtomicStore ({ty = I64Type; pack = Some Pack8; _} as mo) ->
338+
op 0xfe; op 0x1b; memop mo
339+
| AtomicStore ({ty = I64Type; pack = Some Pack16; _} as mo) ->
340+
op 0xfe; op 0x1c; memop mo
341+
| AtomicStore ({ty = I64Type; pack = Some Pack32; _} as mo) ->
342+
op 0xfe; op 0x1d; memop mo
343+
| AtomicStore ({ty = I64Type; pack = Some Pack64; _}) -> assert false
344+
| AtomicStore {ty = F32Type | F64Type; _} -> assert false
345+
346+
| AtomicRmw (I32 I32Op.RmwAdd, ({ty = I32Type; pack = None; _} as mo)) ->
347+
op 0xfe; op 0x1e; memop mo
348+
| AtomicRmw (I64 I64Op.RmwAdd, ({ty = I64Type; pack = None; _} as mo)) ->
349+
op 0xfe; op 0x1f; memop mo
350+
| AtomicRmw (I32 I32Op.RmwAdd, ({ty = I32Type; pack = Some Pack8; _} as mo)) ->
351+
op 0xfe; op 0x20; memop mo
352+
| AtomicRmw (I32 I32Op.RmwAdd, ({ty = I32Type; pack = Some Pack16; _} as mo)) ->
353+
op 0xfe; op 0x21; memop mo
354+
| AtomicRmw (I64 I64Op.RmwAdd, ({ty = I64Type; pack = Some Pack8; _} as mo)) ->
355+
op 0xfe; op 0x22; memop mo
356+
| AtomicRmw (I64 I64Op.RmwAdd, ({ty = I64Type; pack = Some Pack16; _} as mo)) ->
357+
op 0xfe; op 0x23; memop mo
358+
| AtomicRmw (I64 I64Op.RmwAdd, ({ty = I64Type; pack = Some Pack32; _} as mo)) ->
359+
op 0xfe; op 0x24; memop mo
360+
361+
| AtomicRmw (I32 I32Op.RmwSub, ({ty = I32Type; pack = None; _} as mo)) ->
362+
op 0xfe; op 0x25; memop mo
363+
| AtomicRmw (I64 I64Op.RmwSub, ({ty = I64Type; pack = None; _} as mo)) ->
364+
op 0xfe; op 0x26; memop mo
365+
| AtomicRmw (I32 I32Op.RmwSub, ({ty = I32Type; pack = Some Pack8; _} as mo)) ->
366+
op 0xfe; op 0x27; memop mo
367+
| AtomicRmw (I32 I32Op.RmwSub, ({ty = I32Type; pack = Some Pack16; _} as mo)) ->
368+
op 0xfe; op 0x28; memop mo
369+
| AtomicRmw (I64 I64Op.RmwSub, ({ty = I64Type; pack = Some Pack8; _} as mo)) ->
370+
op 0xfe; op 0x29; memop mo
371+
| AtomicRmw (I64 I64Op.RmwSub, ({ty = I64Type; pack = Some Pack16; _} as mo)) ->
372+
op 0xfe; op 0x2a; memop mo
373+
| AtomicRmw (I64 I64Op.RmwSub, ({ty = I64Type; pack = Some Pack32; _} as mo)) ->
374+
op 0xfe; op 0x2b; memop mo
375+
376+
| AtomicRmw (I32 I32Op.RmwAnd, ({ty = I32Type; pack = None; _} as mo)) ->
377+
op 0xfe; op 0x2c; memop mo
378+
| AtomicRmw (I64 I64Op.RmwAnd, ({ty = I64Type; pack = None; _} as mo)) ->
379+
op 0xfe; op 0x2d; memop mo
380+
| AtomicRmw (I32 I32Op.RmwAnd, ({ty = I32Type; pack = Some Pack8; _} as mo)) ->
381+
op 0xfe; op 0x2e; memop mo
382+
| AtomicRmw (I32 I32Op.RmwAnd, ({ty = I32Type; pack = Some Pack16; _} as mo)) ->
383+
op 0xfe; op 0x2f; memop mo
384+
| AtomicRmw (I64 I64Op.RmwAnd, ({ty = I64Type; pack = Some Pack8; _} as mo)) ->
385+
op 0xfe; op 0x30; memop mo
386+
| AtomicRmw (I64 I64Op.RmwAnd, ({ty = I64Type; pack = Some Pack16; _} as mo)) ->
387+
op 0xfe; op 0x31; memop mo
388+
| AtomicRmw (I64 I64Op.RmwAnd, ({ty = I64Type; pack = Some Pack32; _} as mo)) ->
389+
op 0xfe; op 0x32; memop mo
390+
391+
| AtomicRmw (I32 I32Op.RmwOr, ({ty = I32Type; pack = None; _} as mo)) ->
392+
op 0xfe; op 0x33; memop mo
393+
| AtomicRmw (I64 I64Op.RmwOr, ({ty = I64Type; pack = None; _} as mo)) ->
394+
op 0xfe; op 0x34; memop mo
395+
| AtomicRmw (I32 I32Op.RmwOr, ({ty = I32Type; pack = Some Pack8; _} as mo)) ->
396+
op 0xfe; op 0x35; memop mo
397+
| AtomicRmw (I32 I32Op.RmwOr, ({ty = I32Type; pack = Some Pack16; _} as mo)) ->
398+
op 0xfe; op 0x36; memop mo
399+
| AtomicRmw (I64 I64Op.RmwOr, ({ty = I64Type; pack = Some Pack8; _} as mo)) ->
400+
op 0xfe; op 0x37; memop mo
401+
| AtomicRmw (I64 I64Op.RmwOr, ({ty = I64Type; pack = Some Pack16; _} as mo)) ->
402+
op 0xfe; op 0x38; memop mo
403+
| AtomicRmw (I64 I64Op.RmwOr, ({ty = I64Type; pack = Some Pack32; _} as mo)) ->
404+
op 0xfe; op 0x39; memop mo
405+
406+
| AtomicRmw (I32 I32Op.RmwXor, ({ty = I32Type; pack = None; _} as mo)) ->
407+
op 0xfe; op 0x3a; memop mo
408+
| AtomicRmw (I64 I64Op.RmwXor, ({ty = I64Type; pack = None; _} as mo)) ->
409+
op 0xfe; op 0x3b; memop mo
410+
| AtomicRmw (I32 I32Op.RmwXor, ({ty = I32Type; pack = Some Pack8; _} as mo)) ->
411+
op 0xfe; op 0x3c; memop mo
412+
| AtomicRmw (I32 I32Op.RmwXor, ({ty = I32Type; pack = Some Pack16; _} as mo)) ->
413+
op 0xfe; op 0x3d; memop mo
414+
| AtomicRmw (I64 I64Op.RmwXor, ({ty = I64Type; pack = Some Pack8; _} as mo)) ->
415+
op 0xfe; op 0x3e; memop mo
416+
| AtomicRmw (I64 I64Op.RmwXor, ({ty = I64Type; pack = Some Pack16; _} as mo)) ->
417+
op 0xfe; op 0x3f; memop mo
418+
| AtomicRmw (I64 I64Op.RmwXor, ({ty = I64Type; pack = Some Pack32; _} as mo)) ->
419+
op 0xfe; op 0x40; memop mo
420+
421+
| AtomicRmw (I32 I32Op.RmwXchg, ({ty = I32Type; pack = None; _} as mo)) ->
422+
op 0xfe; op 0x41; memop mo
423+
| AtomicRmw (I64 I64Op.RmwXchg, ({ty = I64Type; pack = None; _} as mo)) ->
424+
op 0xfe; op 0x42; memop mo
425+
| AtomicRmw (I32 I32Op.RmwXchg, ({ty = I32Type; pack = Some Pack8; _} as mo)) ->
426+
op 0xfe; op 0x43; memop mo
427+
| AtomicRmw (I32 I32Op.RmwXchg, ({ty = I32Type; pack = Some Pack16; _} as mo)) ->
428+
op 0xfe; op 0x44; memop mo
429+
| AtomicRmw (I64 I64Op.RmwXchg, ({ty = I64Type; pack = Some Pack8; _} as mo)) ->
430+
op 0xfe; op 0x45; memop mo
431+
| AtomicRmw (I64 I64Op.RmwXchg, ({ty = I64Type; pack = Some Pack16; _} as mo)) ->
432+
op 0xfe; op 0x46; memop mo
433+
| AtomicRmw (I64 I64Op.RmwXchg, ({ty = I64Type; pack = Some Pack32; _} as mo)) ->
434+
op 0xfe; op 0x47; memop mo
435+
436+
| AtomicRmw (I32 _, {ty = I64Type; _}) -> assert false
437+
| AtomicRmw (I64 _, {ty = I32Type; _}) -> assert false
438+
| AtomicRmw ((F32 _ | F64 _), _) -> assert false
439+
| AtomicRmw (_, {ty = I32Type; pack = Some Pack32; _}) -> assert false
440+
| AtomicRmw (_, {ty = I32Type; pack = Some Pack64; _}) -> assert false
441+
| AtomicRmw (_, {ty = I64Type; pack = Some Pack64; _}) -> assert false
442+
| AtomicRmw (_, {ty = F32Type | F64Type; _}) -> assert false
443+
444+
| AtomicRmwCmpXchg ({ty = I32Type; pack = None; _} as mo) ->
445+
op 0xfe; op 0x48; memop mo
446+
| AtomicRmwCmpXchg ({ty = I64Type; pack = None; _} as mo) ->
447+
op 0xfe; op 0x49; memop mo
448+
| AtomicRmwCmpXchg ({ty = I32Type; pack = Some Pack8; _} as mo) ->
449+
op 0xfe; op 0x4a; memop mo
450+
| AtomicRmwCmpXchg ({ty = I32Type; pack = Some Pack16; _} as mo) ->
451+
op 0xfe; op 0x4b; memop mo
452+
| AtomicRmwCmpXchg {ty = I32Type; pack = Some Pack32; _} -> assert false
453+
| AtomicRmwCmpXchg {ty = I32Type; pack = Some Pack64; _} -> assert false
454+
| AtomicRmwCmpXchg ({ty = I64Type; pack = Some Pack8; _} as mo) ->
455+
op 0xfe; op 0x4c; memop mo
456+
| AtomicRmwCmpXchg ({ty = I64Type; pack = Some Pack16; _} as mo) ->
457+
op 0xfe; op 0x4d; memop mo
458+
| AtomicRmwCmpXchg ({ty = I64Type; pack = Some Pack32; _} as mo) ->
459+
op 0xfe; op 0x4e; memop mo
460+
| AtomicRmwCmpXchg ({ty = I64Type; pack = Some Pack64; _}) -> assert false
461+
| AtomicRmwCmpXchg {ty = F32Type | F64Type; _} -> assert false
291462

292463
| MemorySize -> op 0x3f; byte 0x00
293464
| MemoryGrow -> op 0x40; byte 0x00

interpreter/syntax/ast.ml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ struct
3434
| TruncSF32 | TruncUF32 | TruncSF64 | TruncUF64
3535
| TruncSatSF32 | TruncSatUF32 | TruncSatSF64 | TruncSatUF64
3636
| ReinterpretFloat
37+
type rmwop = RmwAdd | RmwSub | RmwAnd | RmwOr | RmwXor | RmwXchg
3738
end
3839

3940
module FloatOp =
@@ -45,6 +46,7 @@ struct
4546
type cvtop = ConvertSI32 | ConvertUI32 | ConvertSI64 | ConvertUI64
4647
| PromoteF32 | DemoteF64
4748
| ReinterpretInt
49+
type rmwop
4850
end
4951

5052
module I32Op = IntOp
@@ -100,6 +102,7 @@ type unop = (I32Op.unop, I64Op.unop, F32Op.unop, F64Op.unop) Values.op
100102
type binop = (I32Op.binop, I64Op.binop, F32Op.binop, F64Op.binop) Values.op
101103
type relop = (I32Op.relop, I64Op.relop, F32Op.relop, F64Op.relop) Values.op
102104
type cvtop = (I32Op.cvtop, I64Op.cvtop, F32Op.cvtop, F64Op.cvtop) Values.op
105+
type rmwop = (I32Op.rmwop, I64Op.rmwop, F32Op.rmwop, F64Op.rmwop) Values.op
103106

104107
type vec_testop = (V128Op.testop) Values.vecop
105108
type vec_relop = (V128Op.relop) Values.vecop
@@ -119,6 +122,7 @@ type vec_replaceop = (V128Op.replaceop) Values.vecop
119122
type ('t, 'p) memop = {ty : 't; align : int; offset : int32; pack : 'p}
120123
type loadop = (num_type, (pack_size * extension) option) memop
121124
type storeop = (num_type, pack_size option) memop
125+
type atomicop = (num_type, pack_size option) memop
122126

123127
type vec_loadop = (vec_type, (pack_size * vec_extension) option) memop
124128
type vec_storeop = (vec_type, unit) memop
@@ -198,6 +202,13 @@ and instr' =
198202
| VecSplat of vec_splatop (* number to vector conversion *)
199203
| VecExtract of vec_extractop (* extract lane from vector *)
200204
| VecReplace of vec_replaceop (* replace lane in vector *)
205+
| MemoryAtomicWait of atomicop (* atomically wait for notification at address *)
206+
| MemoryAtomicNotify of atomicop (* atomically notify all waiters at address *)
207+
| AtomicFence (* perform an atomic fence *)
208+
| AtomicLoad of atomicop (* atomically read memory at address *)
209+
| AtomicStore of atomicop (* atomically write memory at address *)
210+
| AtomicRmw of rmwop * atomicop (* atomically read, modify, write memory at address *)
211+
| AtomicRmwCmpXchg of atomicop (* atomically compare and exchange memory at address *)
201212

202213

203214
(* Globals & Functions *)

interpreter/syntax/free.ml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,14 @@ let rec instr (e : instr) =
9595
memories zero
9696
| MemoryInit x -> memories zero ++ datas (var x)
9797
| DataDrop x -> datas (var x)
98+
| MemoryAtomicWait _
99+
| MemoryAtomicNotify _
100+
| AtomicFence
101+
| AtomicLoad _
102+
| AtomicStore _
103+
| AtomicRmw _
104+
| AtomicRmwCmpXchg _ ->
105+
memories zero
98106

99107
and block (es : instr list) =
100108
let free = list instr es in {free with labels = shift free.labels}

0 commit comments

Comments
 (0)