Skip to content
This repository was archived by the owner on Dec 22, 2021. It is now read-only.

Commit ab14709

Browse files
authored
Merge pull request #334 from ngzhian/simd-loads-binary-encode
Implement binary<->text support for SIMD load splats and extends
2 parents b295c5d + 61085bd commit ab14709

File tree

3 files changed

+61
-7
lines changed

3 files changed

+61
-7
lines changed

interpreter/binary/decode.ml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,16 @@ let simd_prefix s =
222222
let pos = pos s in
223223
match vu32 s with
224224
| 0x00l -> let a, o = memop s in v128_load a o
225+
| 0x01l -> let a, o = memop s in i16x8_load8x8_s a o
226+
| 0x02l -> let a, o = memop s in i16x8_load8x8_u a o
227+
| 0x03l -> let a, o = memop s in i32x4_load16x4_s a o
228+
| 0x04l -> let a, o = memop s in i32x4_load16x4_u a o
229+
| 0x05l -> let a, o = memop s in i64x2_load32x2_s a o
230+
| 0x06l -> let a, o = memop s in i64x2_load32x2_u a o
231+
| 0x07l -> let a, o = memop s in v8x16_load_splat a o
232+
| 0x08l -> let a, o = memop s in v16x8_load_splat a o
233+
| 0x09l -> let a, o = memop s in v32x4_load_splat a o
234+
| 0x0al -> let a, o = memop s in v64x2_load_splat a o
225235
| 0x0bl -> let a, o = memop s in v128_store a o
226236
| 0x0cl -> v128_const (at v128 s)
227237
| 0x0dl -> v8x16_shuffle (List.init 16 (fun x -> u8 s))

interpreter/binary/encode.ml

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -197,8 +197,29 @@ let encode m =
197197
op 0x35; memop mo
198198
| Load {ty = F32Type | F64Type; sz = Some _; _} ->
199199
assert false
200-
| Load ({ty = V128Type; _} as mo) ->
200+
201+
| SimdLoad ({ty = V128Type; sz = None; _} as mo) ->
201202
simd_op 0x00l; memop mo
203+
| SimdLoad ({ty = V128Type; sz = Some (Pack64, Pack8x8 SX); _} as mo) ->
204+
simd_op 0x01l; memop mo
205+
| SimdLoad ({ty = V128Type; sz = Some (Pack64, Pack8x8 ZX); _} as mo) ->
206+
simd_op 0x02l; memop mo
207+
| SimdLoad ({ty = V128Type; sz = Some (Pack64, Pack16x4 SX); _} as mo) ->
208+
simd_op 0x03l; memop mo
209+
| SimdLoad ({ty = V128Type; sz = Some (Pack64, Pack16x4 ZX); _} as mo) ->
210+
simd_op 0x04l; memop mo
211+
| SimdLoad ({ty = V128Type; sz = Some (Pack64, Pack32x2 SX); _} as mo) ->
212+
simd_op 0x05l; memop mo
213+
| SimdLoad ({ty = V128Type; sz = Some (Pack64, Pack32x2 ZX); _} as mo) ->
214+
simd_op 0x06l; memop mo
215+
| SimdLoad ({ty= V128Type; sz = Some (Pack8, PackSplat); _} as mo) ->
216+
simd_op 0x07l; memop mo
217+
| SimdLoad ({ty= V128Type; sz = Some (Pack16, PackSplat); _} as mo) ->
218+
simd_op 0x08l; memop mo
219+
| SimdLoad ({ty= V128Type; sz = Some (Pack32, PackSplat); _} as mo) ->
220+
simd_op 0x09l; memop mo
221+
| SimdLoad ({ty= V128Type; sz = Some (Pack64, PackSplat); _} as mo) ->
222+
simd_op 0x0al; memop mo
202223

203224
| Store ({ty = I32Type; sz = None; _} as mo) -> op 0x36; memop mo
204225
| Store ({ty = I64Type; sz = None; _} as mo) -> op 0x37; memop mo
@@ -211,8 +232,8 @@ let encode m =
211232
| Store ({ty = I64Type; sz = Some Pack16; _} as mo) -> op 0x3d; memop mo
212233
| Store ({ty = I64Type; sz = Some Pack32; _} as mo) -> op 0x3e; memop mo
213234
| Store {ty = F32Type | F64Type; sz = Some _; _} -> assert false
214-
| Store ({ty = V128Type; _} as mo) ->
215-
simd_op 0x0bl; memop mo
235+
236+
| SimdStore ({ty = V128Type; _} as mo) -> simd_op 0x0bl; memop mo
216237

217238
| MemorySize -> op 0x3f; u8 0x00
218239
| MemoryGrow -> op 0x40; u8 0x00

interpreter/text/arrange.ml

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -408,8 +408,9 @@ let relop = oper (IntOp.relop, FloatOp.relop, SimdOp.relop)
408408
let cvtop = oper (IntOp.cvtop, FloatOp.cvtop, SimdOp.cvtop)
409409
let ternop = SimdOp.ternop
410410

411-
let memop name {ty; align; offset; _} sz =
412-
value_type ty ^ "." ^ name ^
411+
(* Temporary wart here while we finalize the names of SIMD loads and extends. *)
412+
let memop ?(type_in_name=true) name {ty; align; offset; _} sz =
413+
(if type_in_name then value_type ty ^ "." else "") ^ name ^
413414
(if offset = 0l then "" else " offset=" ^ nat32 offset) ^
414415
(if 1 lsl align = sz then "" else " align=" ^ nat (1 lsl align))
415416

@@ -419,11 +420,33 @@ let loadop op =
419420
| Some (sz, ext) ->
420421
memop ("load" ^ pack_size sz ^ extension ext) op (packed_size sz)
421422

423+
let simd_loadop (op : simd_loadop) =
424+
match op.sz with
425+
| None -> memop "load" op (size op.ty)
426+
| Some (sz, pack_simd) ->
427+
let prefix, suffix, ext =
428+
(match sz, pack_simd with
429+
| Pack64, Pack8x8 ext -> "i16x8", "8x8", extension ext
430+
| Pack64, Pack16x4 ext -> "i32x4", "16x4", extension ext
431+
| Pack64, Pack32x2 ext -> "i64x2", "32x2", extension ext
432+
| Pack8, PackSplat -> "v8x16", "_splat", ""
433+
| Pack16, PackSplat -> "v16x8", "_splat", ""
434+
| Pack32, PackSplat -> "v32x4", "_splat", ""
435+
| Pack64, PackSplat -> "v64x2", "_splat", ""
436+
| _ -> assert false
437+
) in
438+
memop ~type_in_name:false (prefix ^ ".load" ^ suffix ^ ext) op (packed_size sz)
439+
422440
let storeop op =
423441
match op.sz with
424442
| None -> memop "store" op (size op.ty)
425443
| Some sz -> memop ("store" ^ pack_size sz) op (packed_size sz)
426444

445+
let simd_storeop op =
446+
match op.sz with
447+
| None -> memop "store" op (size op.ty)
448+
| Some _ -> assert false
449+
427450

428451
(* Expressions *)
429452

@@ -464,8 +487,8 @@ let rec instr e =
464487
| GlobalGet x -> "global.get " ^ var x, []
465488
| GlobalSet x -> "global.set " ^ var x, []
466489
| Load op -> loadop op, []
467-
| SimdLoad op -> failwith "unimplemented SimdLoad arrange"
468-
| SimdStore op -> failwith "unimplemented SimdStore arrange"
490+
| SimdLoad op -> simd_loadop op, []
491+
| SimdStore op -> simd_storeop op, []
469492
| Store op -> storeop op, []
470493
| MemorySize -> "memory.size", []
471494
| MemoryGrow -> "memory.grow", []

0 commit comments

Comments
 (0)