Skip to content

Commit b7d3944

Browse files
committed
Add memory atomics to parser and VM
1 parent 456b52b commit b7d3944

File tree

10 files changed

+442
-42
lines changed

10 files changed

+442
-42
lines changed

Sources/WAT/BinaryInstructionEncoder.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,13 @@ extension BinaryInstructionEncoder {
125125
case .i64Load16U: opcode = [0x33]
126126
case .i64Load32S: opcode = [0x34]
127127
case .i64Load32U: opcode = [0x35]
128+
case .i32AtomicLoad: opcode = [0xFE, 0x10]
129+
case .i64AtomicLoad: opcode = [0xFE, 0x11]
130+
case .i32AtomicLoad8U: opcode = [0xFE, 0x12]
131+
case .i32AtomicLoad16U: opcode = [0xFE, 0x13]
132+
case .i64AtomicLoad8U: opcode = [0xFE, 0x14]
133+
case .i64AtomicLoad16U: opcode = [0xFE, 0x15]
134+
case .i64AtomicLoad32U: opcode = [0xFE, 0x16]
128135
}
129136

130137
try encodeInstruction(opcode)

Sources/WAT/ParseTextInstruction.swift

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,27 @@ func parseTextInstruction<V: InstructionVisitor>(keyword: String, expressionPars
333333
case "i64.trunc_sat_f64_s": return { return try $0.visitConversion(.i64TruncSatF64S) }
334334
case "i64.trunc_sat_f64_u": return { return try $0.visitConversion(.i64TruncSatF64U) }
335335
case "atomic.fence": return { return try $0.visitAtomicFence() }
336+
case "i32.atomic.load":
337+
let (memarg) = try expressionParser.visitLoad(.i32AtomicLoad, wat: &wat)
338+
return { return try $0.visitLoad(.i32AtomicLoad, memarg: memarg) }
339+
case "i64.atomic.load":
340+
let (memarg) = try expressionParser.visitLoad(.i64AtomicLoad, wat: &wat)
341+
return { return try $0.visitLoad(.i64AtomicLoad, memarg: memarg) }
342+
case "i32.atomic.load8_u":
343+
let (memarg) = try expressionParser.visitLoad(.i32AtomicLoad8U, wat: &wat)
344+
return { return try $0.visitLoad(.i32AtomicLoad8U, memarg: memarg) }
345+
case "i32.atomic.load16_u":
346+
let (memarg) = try expressionParser.visitLoad(.i32AtomicLoad16U, wat: &wat)
347+
return { return try $0.visitLoad(.i32AtomicLoad16U, memarg: memarg) }
348+
case "i64.atomic.load8_u":
349+
let (memarg) = try expressionParser.visitLoad(.i64AtomicLoad8U, wat: &wat)
350+
return { return try $0.visitLoad(.i64AtomicLoad8U, memarg: memarg) }
351+
case "i64.atomic.load16_u":
352+
let (memarg) = try expressionParser.visitLoad(.i64AtomicLoad16U, wat: &wat)
353+
return { return try $0.visitLoad(.i64AtomicLoad16U, memarg: memarg) }
354+
case "i64.atomic.load32_u":
355+
let (memarg) = try expressionParser.visitLoad(.i64AtomicLoad32U, wat: &wat)
356+
return { return try $0.visitLoad(.i64AtomicLoad32U, memarg: memarg) }
336357
default: return nil
337358
}
338359
}

Sources/WasmKit/Execution/DispatchInstruction.swift

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,20 @@ extension Execution {
213213
case 197: return self.execute_onEnter(sp: &sp, pc: &pc, md: &md, ms: &ms)
214214
case 198: return self.execute_onExit(sp: &sp, pc: &pc, md: &md, ms: &ms)
215215
case 199: return try self.execute_breakpoint(sp: &sp, pc: &pc, md: &md, ms: &ms)
216+
case 200: return try self.execute_i32AtomicLoad(sp: &sp, pc: &pc, md: &md, ms: &ms)
217+
case 201: return try self.execute_i64AtomicLoad(sp: &sp, pc: &pc, md: &md, ms: &ms)
218+
case 202: return try self.execute_i32AtomicLoad8U(sp: &sp, pc: &pc, md: &md, ms: &ms)
219+
case 203: return try self.execute_i32AtomicLoad16U(sp: &sp, pc: &pc, md: &md, ms: &ms)
220+
case 204: return try self.execute_i64AtomicLoad8U(sp: &sp, pc: &pc, md: &md, ms: &ms)
221+
case 205: return try self.execute_i64AtomicLoad16U(sp: &sp, pc: &pc, md: &md, ms: &ms)
222+
case 206: return try self.execute_i64AtomicLoad32U(sp: &sp, pc: &pc, md: &md, ms: &ms)
223+
case 207: return try self.execute_i32AtomicStore(sp: &sp, pc: &pc, md: &md, ms: &ms)
224+
case 208: return try self.execute_i64AtomicStore(sp: &sp, pc: &pc, md: &md, ms: &ms)
225+
case 209: return try self.execute_i32AtomicStore8(sp: &sp, pc: &pc, md: &md, ms: &ms)
226+
case 210: return try self.execute_i32AtomicStore16(sp: &sp, pc: &pc, md: &md, ms: &ms)
227+
case 211: return try self.execute_i64AtomicStore8(sp: &sp, pc: &pc, md: &md, ms: &ms)
228+
case 212: return try self.execute_i64AtomicStore16(sp: &sp, pc: &pc, md: &md, ms: &ms)
229+
case 213: return try self.execute_i64AtomicStore32(sp: &sp, pc: &pc, md: &md, ms: &ms)
216230
default: preconditionFailure("Unknown instruction!?")
217231

218232
}
@@ -1802,6 +1816,118 @@ extension Execution {
18021816
(pc.pointee, next) = try self.breakpoint(sp: &sp.pointee, pc: pc.pointee)
18031817
return next
18041818
}
1819+
@_silgen_name("wasmkit_execute_i32AtomicLoad") @inline(__always)
1820+
mutating func execute_i32AtomicLoad(sp: UnsafeMutablePointer<Sp>, pc: UnsafeMutablePointer<Pc>, md: UnsafeMutablePointer<Md>, ms: UnsafeMutablePointer<Ms>) throws -> CodeSlot {
1821+
let immediate = Instruction.LoadOperand.load(from: &pc.pointee)
1822+
try self.i32AtomicLoad(sp: sp.pointee, md: md.pointee, ms: ms.pointee, immediate: immediate)
1823+
let next = pc.pointee.pointee
1824+
pc.pointee = pc.pointee.advanced(by: 1)
1825+
return next
1826+
}
1827+
@_silgen_name("wasmkit_execute_i64AtomicLoad") @inline(__always)
1828+
mutating func execute_i64AtomicLoad(sp: UnsafeMutablePointer<Sp>, pc: UnsafeMutablePointer<Pc>, md: UnsafeMutablePointer<Md>, ms: UnsafeMutablePointer<Ms>) throws -> CodeSlot {
1829+
let immediate = Instruction.LoadOperand.load(from: &pc.pointee)
1830+
try self.i64AtomicLoad(sp: sp.pointee, md: md.pointee, ms: ms.pointee, immediate: immediate)
1831+
let next = pc.pointee.pointee
1832+
pc.pointee = pc.pointee.advanced(by: 1)
1833+
return next
1834+
}
1835+
@_silgen_name("wasmkit_execute_i32AtomicLoad8U") @inline(__always)
1836+
mutating func execute_i32AtomicLoad8U(sp: UnsafeMutablePointer<Sp>, pc: UnsafeMutablePointer<Pc>, md: UnsafeMutablePointer<Md>, ms: UnsafeMutablePointer<Ms>) throws -> CodeSlot {
1837+
let immediate = Instruction.LoadOperand.load(from: &pc.pointee)
1838+
try self.i32AtomicLoad8U(sp: sp.pointee, md: md.pointee, ms: ms.pointee, immediate: immediate)
1839+
let next = pc.pointee.pointee
1840+
pc.pointee = pc.pointee.advanced(by: 1)
1841+
return next
1842+
}
1843+
@_silgen_name("wasmkit_execute_i32AtomicLoad16U") @inline(__always)
1844+
mutating func execute_i32AtomicLoad16U(sp: UnsafeMutablePointer<Sp>, pc: UnsafeMutablePointer<Pc>, md: UnsafeMutablePointer<Md>, ms: UnsafeMutablePointer<Ms>) throws -> CodeSlot {
1845+
let immediate = Instruction.LoadOperand.load(from: &pc.pointee)
1846+
try self.i32AtomicLoad16U(sp: sp.pointee, md: md.pointee, ms: ms.pointee, immediate: immediate)
1847+
let next = pc.pointee.pointee
1848+
pc.pointee = pc.pointee.advanced(by: 1)
1849+
return next
1850+
}
1851+
@_silgen_name("wasmkit_execute_i64AtomicLoad8U") @inline(__always)
1852+
mutating func execute_i64AtomicLoad8U(sp: UnsafeMutablePointer<Sp>, pc: UnsafeMutablePointer<Pc>, md: UnsafeMutablePointer<Md>, ms: UnsafeMutablePointer<Ms>) throws -> CodeSlot {
1853+
let immediate = Instruction.LoadOperand.load(from: &pc.pointee)
1854+
try self.i64AtomicLoad8U(sp: sp.pointee, md: md.pointee, ms: ms.pointee, immediate: immediate)
1855+
let next = pc.pointee.pointee
1856+
pc.pointee = pc.pointee.advanced(by: 1)
1857+
return next
1858+
}
1859+
@_silgen_name("wasmkit_execute_i64AtomicLoad16U") @inline(__always)
1860+
mutating func execute_i64AtomicLoad16U(sp: UnsafeMutablePointer<Sp>, pc: UnsafeMutablePointer<Pc>, md: UnsafeMutablePointer<Md>, ms: UnsafeMutablePointer<Ms>) throws -> CodeSlot {
1861+
let immediate = Instruction.LoadOperand.load(from: &pc.pointee)
1862+
try self.i64AtomicLoad16U(sp: sp.pointee, md: md.pointee, ms: ms.pointee, immediate: immediate)
1863+
let next = pc.pointee.pointee
1864+
pc.pointee = pc.pointee.advanced(by: 1)
1865+
return next
1866+
}
1867+
@_silgen_name("wasmkit_execute_i64AtomicLoad32U") @inline(__always)
1868+
mutating func execute_i64AtomicLoad32U(sp: UnsafeMutablePointer<Sp>, pc: UnsafeMutablePointer<Pc>, md: UnsafeMutablePointer<Md>, ms: UnsafeMutablePointer<Ms>) throws -> CodeSlot {
1869+
let immediate = Instruction.LoadOperand.load(from: &pc.pointee)
1870+
try self.i64AtomicLoad32U(sp: sp.pointee, md: md.pointee, ms: ms.pointee, immediate: immediate)
1871+
let next = pc.pointee.pointee
1872+
pc.pointee = pc.pointee.advanced(by: 1)
1873+
return next
1874+
}
1875+
@_silgen_name("wasmkit_execute_i32AtomicStore") @inline(__always)
1876+
mutating func execute_i32AtomicStore(sp: UnsafeMutablePointer<Sp>, pc: UnsafeMutablePointer<Pc>, md: UnsafeMutablePointer<Md>, ms: UnsafeMutablePointer<Ms>) throws -> CodeSlot {
1877+
let immediate = Instruction.StoreOperand.load(from: &pc.pointee)
1878+
try self.i32AtomicStore(sp: sp.pointee, md: md.pointee, ms: ms.pointee, immediate: immediate)
1879+
let next = pc.pointee.pointee
1880+
pc.pointee = pc.pointee.advanced(by: 1)
1881+
return next
1882+
}
1883+
@_silgen_name("wasmkit_execute_i64AtomicStore") @inline(__always)
1884+
mutating func execute_i64AtomicStore(sp: UnsafeMutablePointer<Sp>, pc: UnsafeMutablePointer<Pc>, md: UnsafeMutablePointer<Md>, ms: UnsafeMutablePointer<Ms>) throws -> CodeSlot {
1885+
let immediate = Instruction.StoreOperand.load(from: &pc.pointee)
1886+
try self.i64AtomicStore(sp: sp.pointee, md: md.pointee, ms: ms.pointee, immediate: immediate)
1887+
let next = pc.pointee.pointee
1888+
pc.pointee = pc.pointee.advanced(by: 1)
1889+
return next
1890+
}
1891+
@_silgen_name("wasmkit_execute_i32AtomicStore8") @inline(__always)
1892+
mutating func execute_i32AtomicStore8(sp: UnsafeMutablePointer<Sp>, pc: UnsafeMutablePointer<Pc>, md: UnsafeMutablePointer<Md>, ms: UnsafeMutablePointer<Ms>) throws -> CodeSlot {
1893+
let immediate = Instruction.StoreOperand.load(from: &pc.pointee)
1894+
try self.i32AtomicStore8(sp: sp.pointee, md: md.pointee, ms: ms.pointee, immediate: immediate)
1895+
let next = pc.pointee.pointee
1896+
pc.pointee = pc.pointee.advanced(by: 1)
1897+
return next
1898+
}
1899+
@_silgen_name("wasmkit_execute_i32AtomicStore16") @inline(__always)
1900+
mutating func execute_i32AtomicStore16(sp: UnsafeMutablePointer<Sp>, pc: UnsafeMutablePointer<Pc>, md: UnsafeMutablePointer<Md>, ms: UnsafeMutablePointer<Ms>) throws -> CodeSlot {
1901+
let immediate = Instruction.StoreOperand.load(from: &pc.pointee)
1902+
try self.i32AtomicStore16(sp: sp.pointee, md: md.pointee, ms: ms.pointee, immediate: immediate)
1903+
let next = pc.pointee.pointee
1904+
pc.pointee = pc.pointee.advanced(by: 1)
1905+
return next
1906+
}
1907+
@_silgen_name("wasmkit_execute_i64AtomicStore8") @inline(__always)
1908+
mutating func execute_i64AtomicStore8(sp: UnsafeMutablePointer<Sp>, pc: UnsafeMutablePointer<Pc>, md: UnsafeMutablePointer<Md>, ms: UnsafeMutablePointer<Ms>) throws -> CodeSlot {
1909+
let immediate = Instruction.StoreOperand.load(from: &pc.pointee)
1910+
try self.i64AtomicStore8(sp: sp.pointee, md: md.pointee, ms: ms.pointee, immediate: immediate)
1911+
let next = pc.pointee.pointee
1912+
pc.pointee = pc.pointee.advanced(by: 1)
1913+
return next
1914+
}
1915+
@_silgen_name("wasmkit_execute_i64AtomicStore16") @inline(__always)
1916+
mutating func execute_i64AtomicStore16(sp: UnsafeMutablePointer<Sp>, pc: UnsafeMutablePointer<Pc>, md: UnsafeMutablePointer<Md>, ms: UnsafeMutablePointer<Ms>) throws -> CodeSlot {
1917+
let immediate = Instruction.StoreOperand.load(from: &pc.pointee)
1918+
try self.i64AtomicStore16(sp: sp.pointee, md: md.pointee, ms: ms.pointee, immediate: immediate)
1919+
let next = pc.pointee.pointee
1920+
pc.pointee = pc.pointee.advanced(by: 1)
1921+
return next
1922+
}
1923+
@_silgen_name("wasmkit_execute_i64AtomicStore32") @inline(__always)
1924+
mutating func execute_i64AtomicStore32(sp: UnsafeMutablePointer<Sp>, pc: UnsafeMutablePointer<Pc>, md: UnsafeMutablePointer<Md>, ms: UnsafeMutablePointer<Ms>) throws -> CodeSlot {
1925+
let immediate = Instruction.StoreOperand.load(from: &pc.pointee)
1926+
try self.i64AtomicStore32(sp: sp.pointee, md: md.pointee, ms: ms.pointee, immediate: immediate)
1927+
let next = pc.pointee.pointee
1928+
pc.pointee = pc.pointee.advanced(by: 1)
1929+
return next
1930+
}
18051931
}
18061932

18071933
extension Instruction {

Sources/WasmKit/Execution/Instructions/Instruction.swift

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -417,6 +417,34 @@ enum Instruction: Equatable {
417417
///
418418
/// This instruction is used in debugging scenarios.
419419
case breakpoint
420+
/// WebAssembly Core Instruction `i32.atomic.load`
421+
case i32AtomicLoad(Instruction.LoadOperand)
422+
/// WebAssembly Core Instruction `i64.atomic.load`
423+
case i64AtomicLoad(Instruction.LoadOperand)
424+
/// WebAssembly Core Instruction `i32.atomic.load8_u`
425+
case i32AtomicLoad8U(Instruction.LoadOperand)
426+
/// WebAssembly Core Instruction `i32.atomic.load16_u`
427+
case i32AtomicLoad16U(Instruction.LoadOperand)
428+
/// WebAssembly Core Instruction `i64.atomic.load8_u`
429+
case i64AtomicLoad8U(Instruction.LoadOperand)
430+
/// WebAssembly Core Instruction `i64.atomic.load16_u`
431+
case i64AtomicLoad16U(Instruction.LoadOperand)
432+
/// WebAssembly Core Instruction `i64.atomic.load32_u`
433+
case i64AtomicLoad32U(Instruction.LoadOperand)
434+
/// WebAssembly Core Instruction `i32.atomic.store`
435+
case i32AtomicStore(Instruction.StoreOperand)
436+
/// WebAssembly Core Instruction `i64.atomic.store`
437+
case i64AtomicStore(Instruction.StoreOperand)
438+
/// WebAssembly Core Instruction `i32.atomic.store8`
439+
case i32AtomicStore8(Instruction.StoreOperand)
440+
/// WebAssembly Core Instruction `i32.atomic.store16`
441+
case i32AtomicStore16(Instruction.StoreOperand)
442+
/// WebAssembly Core Instruction `i64.atomic.store8`
443+
case i64AtomicStore8(Instruction.StoreOperand)
444+
/// WebAssembly Core Instruction `i64.atomic.store16`
445+
case i64AtomicStore16(Instruction.StoreOperand)
446+
/// WebAssembly Core Instruction `i64.atomic.store32`
447+
case i64AtomicStore32(Instruction.StoreOperand)
420448
}
421449

422450
extension Instruction {
@@ -1066,6 +1094,20 @@ extension Instruction {
10661094
case .tableElementDrop(let immediate): return immediate
10671095
case .onEnter(let immediate): return immediate
10681096
case .onExit(let immediate): return immediate
1097+
case .i32AtomicLoad(let immediate): return immediate
1098+
case .i64AtomicLoad(let immediate): return immediate
1099+
case .i32AtomicLoad8U(let immediate): return immediate
1100+
case .i32AtomicLoad16U(let immediate): return immediate
1101+
case .i64AtomicLoad8U(let immediate): return immediate
1102+
case .i64AtomicLoad16U(let immediate): return immediate
1103+
case .i64AtomicLoad32U(let immediate): return immediate
1104+
case .i32AtomicStore(let immediate): return immediate
1105+
case .i64AtomicStore(let immediate): return immediate
1106+
case .i32AtomicStore8(let immediate): return immediate
1107+
case .i32AtomicStore16(let immediate): return immediate
1108+
case .i64AtomicStore8(let immediate): return immediate
1109+
case .i64AtomicStore16(let immediate): return immediate
1110+
case .i64AtomicStore32(let immediate): return immediate
10691111
default: return nil
10701112
}
10711113
}
@@ -1276,6 +1318,20 @@ extension Instruction {
12761318
case .onEnter: return 197
12771319
case .onExit: return 198
12781320
case .breakpoint: return 199
1321+
case .i32AtomicLoad: return 200
1322+
case .i64AtomicLoad: return 201
1323+
case .i32AtomicLoad8U: return 202
1324+
case .i32AtomicLoad16U: return 203
1325+
case .i64AtomicLoad8U: return 204
1326+
case .i64AtomicLoad16U: return 205
1327+
case .i64AtomicLoad32U: return 206
1328+
case .i32AtomicStore: return 207
1329+
case .i64AtomicStore: return 208
1330+
case .i32AtomicStore8: return 209
1331+
case .i32AtomicStore16: return 210
1332+
case .i64AtomicStore8: return 211
1333+
case .i64AtomicStore16: return 212
1334+
case .i64AtomicStore32: return 213
12791335
}
12801336
}
12811337
}
@@ -1487,6 +1543,20 @@ extension Instruction {
14871543
case 197: return .onEnter(Instruction.OnEnterOperand.load(from: &pc))
14881544
case 198: return .onExit(Instruction.OnExitOperand.load(from: &pc))
14891545
case 199: return .breakpoint
1546+
case 200: return .i32AtomicLoad(Instruction.LoadOperand.load(from: &pc))
1547+
case 201: return .i64AtomicLoad(Instruction.LoadOperand.load(from: &pc))
1548+
case 202: return .i32AtomicLoad8U(Instruction.LoadOperand.load(from: &pc))
1549+
case 203: return .i32AtomicLoad16U(Instruction.LoadOperand.load(from: &pc))
1550+
case 204: return .i64AtomicLoad8U(Instruction.LoadOperand.load(from: &pc))
1551+
case 205: return .i64AtomicLoad16U(Instruction.LoadOperand.load(from: &pc))
1552+
case 206: return .i64AtomicLoad32U(Instruction.LoadOperand.load(from: &pc))
1553+
case 207: return .i32AtomicStore(Instruction.StoreOperand.load(from: &pc))
1554+
case 208: return .i64AtomicStore(Instruction.StoreOperand.load(from: &pc))
1555+
case 209: return .i32AtomicStore8(Instruction.StoreOperand.load(from: &pc))
1556+
case 210: return .i32AtomicStore16(Instruction.StoreOperand.load(from: &pc))
1557+
case 211: return .i64AtomicStore8(Instruction.StoreOperand.load(from: &pc))
1558+
case 212: return .i64AtomicStore16(Instruction.StoreOperand.load(from: &pc))
1559+
case 213: return .i64AtomicStore32(Instruction.StoreOperand.load(from: &pc))
14901560
default: fatalError("Unknown instruction opcode: \(opcode)")
14911561
}
14921562
}
@@ -1701,6 +1771,20 @@ extension Instruction {
17011771
case 197: return "onEnter"
17021772
case 198: return "onExit"
17031773
case 199: return "breakpoint"
1774+
case 200: return "i32AtomicLoad"
1775+
case 201: return "i64AtomicLoad"
1776+
case 202: return "i32AtomicLoad8U"
1777+
case 203: return "i32AtomicLoad16U"
1778+
case 204: return "i64AtomicLoad8U"
1779+
case 205: return "i64AtomicLoad16U"
1780+
case 206: return "i64AtomicLoad32U"
1781+
case 207: return "i32AtomicStore"
1782+
case 208: return "i64AtomicStore"
1783+
case 209: return "i32AtomicStore8"
1784+
case 210: return "i32AtomicStore16"
1785+
case 211: return "i64AtomicStore8"
1786+
case 212: return "i64AtomicStore16"
1787+
case 213: return "i64AtomicStore32"
17041788
default: fatalError("Unknown instruction index: \(opcode)")
17051789
}
17061790
}

Sources/WasmParser/BinaryInstructionDecoder.swift

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -579,6 +579,27 @@ func parseBinaryInstruction(visitor: inout some InstructionVisitor, decoder: ino
579579
default:
580580
if try !visitor.visitUnknown([opcode0, opcode1, opcode2]) { try decoder.throwUnknown([opcode0, opcode1, opcode2]) }
581581
}
582+
case 0x10:
583+
let (memarg) = try decoder.visitLoad(.i32AtomicLoad)
584+
try visitor.visitLoad(.i32AtomicLoad, memarg: memarg)
585+
case 0x11:
586+
let (memarg) = try decoder.visitLoad(.i64AtomicLoad)
587+
try visitor.visitLoad(.i64AtomicLoad, memarg: memarg)
588+
case 0x12:
589+
let (memarg) = try decoder.visitLoad(.i32AtomicLoad8U)
590+
try visitor.visitLoad(.i32AtomicLoad8U, memarg: memarg)
591+
case 0x13:
592+
let (memarg) = try decoder.visitLoad(.i32AtomicLoad16U)
593+
try visitor.visitLoad(.i32AtomicLoad16U, memarg: memarg)
594+
case 0x14:
595+
let (memarg) = try decoder.visitLoad(.i64AtomicLoad8U)
596+
try visitor.visitLoad(.i64AtomicLoad8U, memarg: memarg)
597+
case 0x15:
598+
let (memarg) = try decoder.visitLoad(.i64AtomicLoad16U)
599+
try visitor.visitLoad(.i64AtomicLoad16U, memarg: memarg)
600+
case 0x16:
601+
let (memarg) = try decoder.visitLoad(.i64AtomicLoad32U)
602+
try visitor.visitLoad(.i64AtomicLoad32U, memarg: memarg)
582603
default:
583604
if try !visitor.visitUnknown([opcode0, opcode1]) { try decoder.throwUnknown([opcode0, opcode1]) }
584605
}

Sources/WasmParser/InstructionVisitor.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,13 @@ public enum Instruction: Equatable {
2020
case i64Load16U
2121
case i64Load32S
2222
case i64Load32U
23+
case i32AtomicLoad
24+
case i64AtomicLoad
25+
case i32AtomicLoad8U
26+
case i32AtomicLoad16U
27+
case i64AtomicLoad8U
28+
case i64AtomicLoad16U
29+
case i64AtomicLoad32U
2330
}
2431
public enum Store: Equatable {
2532
case i32Store

0 commit comments

Comments
 (0)