Skip to content

Commit 7a7219d

Browse files
committed
Add atomic store instructions to the parser
1 parent b7d3944 commit 7a7219d

File tree

4 files changed

+56
-0
lines changed

4 files changed

+56
-0
lines changed

Sources/WAT/BinaryInstructionEncoder.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,13 @@ extension BinaryInstructionEncoder {
149149
case .i64Store8: opcode = [0x3C]
150150
case .i64Store16: opcode = [0x3D]
151151
case .i64Store32: opcode = [0x3E]
152+
case .i32AtomicStore: opcode = [0xFE, 0x17]
153+
case .i64AtomicStore: opcode = [0xFE, 0x18]
154+
case .i32AtomicStore8: opcode = [0xFE, 0x19]
155+
case .i32AtomicStore16: opcode = [0xFE, 0x1A]
156+
case .i64AtomicStore8: opcode = [0xFE, 0x1B]
157+
case .i64AtomicStore16: opcode = [0xFE, 0x1C]
158+
case .i64AtomicStore32: opcode = [0xFE, 0x1D]
152159
}
153160

154161
try encodeInstruction(opcode)

Sources/WAT/ParseTextInstruction.swift

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,27 @@ func parseTextInstruction<V: InstructionVisitor>(keyword: String, expressionPars
354354
case "i64.atomic.load32_u":
355355
let (memarg) = try expressionParser.visitLoad(.i64AtomicLoad32U, wat: &wat)
356356
return { return try $0.visitLoad(.i64AtomicLoad32U, memarg: memarg) }
357+
case "i32.atomic.store":
358+
let (memarg) = try expressionParser.visitStore(.i32AtomicStore, wat: &wat)
359+
return { return try $0.visitStore(.i32AtomicStore, memarg: memarg) }
360+
case "i64.atomic.store":
361+
let (memarg) = try expressionParser.visitStore(.i64AtomicStore, wat: &wat)
362+
return { return try $0.visitStore(.i64AtomicStore, memarg: memarg) }
363+
case "i32.atomic.store8":
364+
let (memarg) = try expressionParser.visitStore(.i32AtomicStore8, wat: &wat)
365+
return { return try $0.visitStore(.i32AtomicStore8, memarg: memarg) }
366+
case "i32.atomic.store16":
367+
let (memarg) = try expressionParser.visitStore(.i32AtomicStore16, wat: &wat)
368+
return { return try $0.visitStore(.i32AtomicStore16, memarg: memarg) }
369+
case "i64.atomic.store8":
370+
let (memarg) = try expressionParser.visitStore(.i64AtomicStore8, wat: &wat)
371+
return { return try $0.visitStore(.i64AtomicStore8, memarg: memarg) }
372+
case "i64.atomic.store16":
373+
let (memarg) = try expressionParser.visitStore(.i64AtomicStore16, wat: &wat)
374+
return { return try $0.visitStore(.i64AtomicStore16, memarg: memarg) }
375+
case "i64.atomic.store32":
376+
let (memarg) = try expressionParser.visitStore(.i64AtomicStore32, wat: &wat)
377+
return { return try $0.visitStore(.i64AtomicStore32, memarg: memarg) }
357378
default: return nil
358379
}
359380
}

Sources/WasmParser/BinaryInstructionDecoder.swift

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -600,6 +600,27 @@ func parseBinaryInstruction(visitor: inout some InstructionVisitor, decoder: ino
600600
case 0x16:
601601
let (memarg) = try decoder.visitLoad(.i64AtomicLoad32U)
602602
try visitor.visitLoad(.i64AtomicLoad32U, memarg: memarg)
603+
case 0x17:
604+
let (memarg) = try decoder.visitStore(.i32AtomicStore)
605+
try visitor.visitStore(.i32AtomicStore, memarg: memarg)
606+
case 0x18:
607+
let (memarg) = try decoder.visitStore(.i64AtomicStore)
608+
try visitor.visitStore(.i64AtomicStore, memarg: memarg)
609+
case 0x19:
610+
let (memarg) = try decoder.visitStore(.i32AtomicStore8)
611+
try visitor.visitStore(.i32AtomicStore8, memarg: memarg)
612+
case 0x1A:
613+
let (memarg) = try decoder.visitStore(.i32AtomicStore16)
614+
try visitor.visitStore(.i32AtomicStore16, memarg: memarg)
615+
case 0x1B:
616+
let (memarg) = try decoder.visitStore(.i64AtomicStore8)
617+
try visitor.visitStore(.i64AtomicStore8, memarg: memarg)
618+
case 0x1C:
619+
let (memarg) = try decoder.visitStore(.i64AtomicStore16)
620+
try visitor.visitStore(.i64AtomicStore16, memarg: memarg)
621+
case 0x1D:
622+
let (memarg) = try decoder.visitStore(.i64AtomicStore32)
623+
try visitor.visitStore(.i64AtomicStore32, memarg: memarg)
603624
default:
604625
if try !visitor.visitUnknown([opcode0, opcode1]) { try decoder.throwUnknown([opcode0, opcode1]) }
605626
}

Sources/WasmParser/InstructionVisitor.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,13 @@ public enum Instruction: Equatable {
3838
case i64Store8
3939
case i64Store16
4040
case i64Store32
41+
case i32AtomicStore
42+
case i64AtomicStore
43+
case i32AtomicStore8
44+
case i32AtomicStore16
45+
case i64AtomicStore8
46+
case i64AtomicStore16
47+
case i64AtomicStore32
4148
}
4249
public enum Cmp: Equatable {
4350
case i32Eq

0 commit comments

Comments
 (0)