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

Commit 73bbae8

Browse files
authored
Move simd operations out into a new file (#377)
* Move simd operations out into a new file * Rename Ternary to SimdTernary
1 parent 1839dc1 commit 73bbae8

File tree

10 files changed

+294
-271
lines changed

10 files changed

+294
-271
lines changed

interpreter/binary/encode.ml

+2-2
Original file line numberDiff line numberDiff line change
@@ -509,8 +509,6 @@ let encode m =
509509
| Binary (V128 V128Op.(V128 Or)) -> simd_op 0x50l
510510
| Binary (V128 V128Op.(V128 Xor)) -> simd_op 0x51l
511511

512-
| Ternary (V128Op.Bitselect) -> simd_op 0x52l
513-
514512
| Convert (I32 I32Op.ExtendSI32) -> assert false
515513
| Convert (I32 I32Op.ExtendUI32) -> assert false
516514
| Convert (I32 I32Op.WrapI64) -> op 0xa7
@@ -561,6 +559,8 @@ let encode m =
561559
| Convert (V128 (V128Op.F64x2 V128Op.Splat)) -> simd_op 0x14l;
562560
| Convert (V128 _) -> assert false
563561

562+
| SimdTernary (V128Op.Bitselect) -> simd_op 0x52l
563+
564564
| SimdExtract (V128Op.I8x16 (SX, imm)) -> simd_op 0x15l; u8 imm
565565
| SimdExtract (V128Op.I8x16 (ZX, imm)) -> simd_op 0x16l; u8 imm
566566
| SimdExtract (V128Op.I16x8 (SX, imm)) -> simd_op 0x18l; u8 imm

interpreter/exec/eval.ml

+8-8
Original file line numberDiff line numberDiff line change
@@ -281,28 +281,28 @@ let rec step (c : config) : config =
281281
(try Eval_numeric.eval_binop binop v1 v2 :: vs', []
282282
with exn -> vs', [Trapping (numeric_error e.at exn) @@ e.at])
283283

284-
| Ternary ternop, v3 :: v2 :: v1 :: vs' ->
285-
(try Eval_numeric.eval_ternop ternop v1 v2 v3 :: vs', []
286-
with exn -> vs', [Trapping (numeric_error e.at exn) @@ e.at])
287-
288284
| Convert cvtop, v :: vs' ->
289285
(try Eval_numeric.eval_cvtop cvtop v :: vs', []
290286
with exn -> vs', [Trapping (numeric_error e.at exn) @@ e.at])
291287

288+
| SimdTernary ternop, v3 :: v2 :: v1 :: vs' ->
289+
(try Eval_simd.eval_ternop ternop v1 v2 v3 :: vs', []
290+
with exn -> vs', [Trapping (numeric_error e.at exn) @@ e.at])
291+
292292
| SimdExtract extractop, v :: vs' ->
293-
(try Eval_numeric.eval_extractop extractop v :: vs', []
293+
(try Eval_simd.eval_extractop extractop v :: vs', []
294294
with exn -> vs', [Trapping (numeric_error e.at exn) @@ e.at])
295295

296296
| SimdReplace replaceop, r :: v :: vs' ->
297-
(try Eval_numeric.eval_replaceop replaceop v r :: vs', []
297+
(try Eval_simd.eval_replaceop replaceop v r :: vs', []
298298
with exn -> vs', [Trapping (numeric_error e.at exn) @@ e.at])
299299

300300
| SimdShift shiftop, s :: v :: vs' ->
301-
(try Eval_numeric.eval_shiftop shiftop v s :: vs', []
301+
(try Eval_simd.eval_shiftop shiftop v s :: vs', []
302302
with exn -> vs', [Trapping (numeric_error e.at exn) @@ e.at])
303303

304304
| SimdBitmask bitmaskop, v :: vs' ->
305-
(try Eval_numeric.eval_bitmaskop bitmaskop v :: vs', []
305+
(try Eval_simd.eval_bitmaskop bitmaskop v :: vs', []
306306
with exn -> vs', [Trapping (numeric_error e.at exn) @@ e.at])
307307

308308
| _ ->

interpreter/exec/eval_numeric.ml

+6-249
Original file line numberDiff line numberDiff line change
@@ -117,229 +117,6 @@ end
117117
module F32Op = FloatOp (F32) (Values.F32Value)
118118
module F64Op = FloatOp (F64) (Values.F64Value)
119119

120-
(* Simd operators *)
121-
122-
module SimdOp (SXX : Simd.S) (Value : ValueType with type t = SXX.t) =
123-
struct
124-
open Ast.SimdOp
125-
126-
let to_value = Value.to_value
127-
let of_value = of_arg Value.of_value
128-
129-
let unop (op : unop) =
130-
fun v -> match op with
131-
| I8x16 Neg -> to_value (SXX.I8x16.neg (of_value 1 v))
132-
| I8x16 Abs -> to_value (SXX.I8x16.abs (of_value 1 v))
133-
| I16x8 Neg -> to_value (SXX.I16x8.neg (of_value 1 v))
134-
| I16x8 Abs -> to_value (SXX.I16x8.abs (of_value 1 v))
135-
| I16x8 WidenLowS -> to_value (SXX.I16x8_convert.widen_low_s (of_value 1 v))
136-
| I16x8 WidenHighS -> to_value (SXX.I16x8_convert.widen_high_s (of_value 1 v))
137-
| I16x8 WidenLowU -> to_value (SXX.I16x8_convert.widen_low_u (of_value 1 v))
138-
| I16x8 WidenHighU -> to_value (SXX.I16x8_convert.widen_high_u (of_value 1 v))
139-
| I32x4 Abs -> to_value (SXX.I32x4.abs (of_value 1 v))
140-
| I32x4 Neg -> to_value (SXX.I32x4.neg (of_value 1 v))
141-
| I32x4 WidenLowS -> to_value (SXX.I32x4_convert.widen_low_s (of_value 1 v))
142-
| I32x4 WidenHighS -> to_value (SXX.I32x4_convert.widen_high_s (of_value 1 v))
143-
| I32x4 WidenLowU -> to_value (SXX.I32x4_convert.widen_low_u (of_value 1 v))
144-
| I32x4 WidenHighU -> to_value (SXX.I32x4_convert.widen_high_u (of_value 1 v))
145-
| I32x4 TruncSatF32x4S -> to_value (SXX.I32x4_convert.trunc_sat_f32x4_s (of_value 1 v))
146-
| I32x4 TruncSatF32x4U -> to_value (SXX.I32x4_convert.trunc_sat_f32x4_u (of_value 1 v))
147-
| I64x2 Neg -> to_value (SXX.I64x2.neg (of_value 1 v))
148-
| F32x4 Abs -> to_value (SXX.F32x4.abs (of_value 1 v))
149-
| F32x4 Neg -> to_value (SXX.F32x4.neg (of_value 1 v))
150-
| F32x4 Sqrt -> to_value (SXX.F32x4.sqrt (of_value 1 v))
151-
| F32x4 Ceil -> to_value (SXX.F32x4.ceil (of_value 1 v))
152-
| F32x4 Floor -> to_value (SXX.F32x4.floor (of_value 1 v))
153-
| F32x4 Trunc -> to_value (SXX.F32x4.trunc (of_value 1 v))
154-
| F32x4 Nearest -> to_value (SXX.F32x4.nearest (of_value 1 v))
155-
| F32x4 ConvertI32x4S -> to_value (SXX.F32x4_convert.convert_i32x4_s (of_value 1 v))
156-
| F32x4 ConvertI32x4U -> to_value (SXX.F32x4_convert.convert_i32x4_u (of_value 1 v))
157-
| F64x2 Abs -> to_value (SXX.F64x2.abs (of_value 1 v))
158-
| F64x2 Neg -> to_value (SXX.F64x2.neg (of_value 1 v))
159-
| F64x2 Sqrt -> to_value (SXX.F64x2.sqrt (of_value 1 v))
160-
| F64x2 Ceil -> to_value (SXX.F64x2.ceil (of_value 1 v))
161-
| F64x2 Floor -> to_value (SXX.F64x2.floor (of_value 1 v))
162-
| F64x2 Trunc -> to_value (SXX.F64x2.trunc (of_value 1 v))
163-
| F64x2 Nearest -> to_value (SXX.F64x2.nearest (of_value 1 v))
164-
| V128 Not -> to_value (SXX.V128.lognot (of_value 1 v))
165-
| _ -> assert false
166-
167-
let binop (op : binop) =
168-
let f = match op with
169-
| I8x16 Swizzle -> SXX.V8x16.swizzle
170-
| I8x16 (Shuffle imms) -> fun a b -> SXX.V8x16.shuffle a b imms
171-
| I8x16 Eq -> SXX.I8x16.eq
172-
| I8x16 Ne -> SXX.I8x16.ne
173-
| I8x16 LtS -> SXX.I8x16.lt_s
174-
| I8x16 LtU -> SXX.I8x16.lt_u
175-
| I8x16 LeS -> SXX.I8x16.le_s
176-
| I8x16 LeU -> SXX.I8x16.le_u
177-
| I8x16 GtS -> SXX.I8x16.gt_s
178-
| I8x16 GtU -> SXX.I8x16.gt_u
179-
| I8x16 GeS -> SXX.I8x16.ge_s
180-
| I8x16 GeU -> SXX.I8x16.ge_u
181-
| I8x16 NarrowS -> SXX.I8x16_convert.narrow_s
182-
| I8x16 NarrowU -> SXX.I8x16_convert.narrow_u
183-
| I8x16 Add -> SXX.I8x16.add
184-
| I8x16 AddSatS -> SXX.I8x16.add_sat_s
185-
| I8x16 AddSatU -> SXX.I8x16.add_sat_u
186-
| I8x16 Sub -> SXX.I8x16.sub
187-
| I8x16 SubSatS -> SXX.I8x16.sub_sat_s
188-
| I8x16 SubSatU -> SXX.I8x16.sub_sat_u
189-
| I8x16 MinS -> SXX.I8x16.min_s
190-
| I8x16 MinU -> SXX.I8x16.min_u
191-
| I8x16 MaxS -> SXX.I8x16.max_s
192-
| I8x16 MaxU -> SXX.I8x16.max_u
193-
| I8x16 AvgrU -> SXX.I8x16.avgr_u
194-
| I16x8 Eq -> SXX.I16x8.eq
195-
| I16x8 Ne -> SXX.I16x8.ne
196-
| I16x8 LtS -> SXX.I16x8.lt_s
197-
| I16x8 LtU -> SXX.I16x8.lt_u
198-
| I16x8 LeS -> SXX.I16x8.le_s
199-
| I16x8 LeU -> SXX.I16x8.le_u
200-
| I16x8 GtS -> SXX.I16x8.gt_s
201-
| I16x8 GtU -> SXX.I16x8.gt_u
202-
| I16x8 GeS -> SXX.I16x8.ge_s
203-
| I16x8 GeU -> SXX.I16x8.ge_u
204-
| I16x8 NarrowS -> SXX.I16x8_convert.narrow_s
205-
| I16x8 NarrowU -> SXX.I16x8_convert.narrow_u
206-
| I16x8 Add -> SXX.I16x8.add
207-
| I16x8 AddSatS -> SXX.I16x8.add_sat_s
208-
| I16x8 AddSatU -> SXX.I16x8.add_sat_u
209-
| I16x8 Sub -> SXX.I16x8.sub
210-
| I16x8 SubSatS -> SXX.I16x8.sub_sat_s
211-
| I16x8 SubSatU -> SXX.I16x8.sub_sat_u
212-
| I16x8 Mul -> SXX.I16x8.mul
213-
| I16x8 MinS -> SXX.I16x8.min_s
214-
| I16x8 MinU -> SXX.I16x8.min_u
215-
| I16x8 MaxS -> SXX.I16x8.max_s
216-
| I16x8 MaxU -> SXX.I16x8.max_u
217-
| I16x8 AvgrU -> SXX.I16x8.avgr_u
218-
| I32x4 Add -> SXX.I32x4.add
219-
| I32x4 Sub -> SXX.I32x4.sub
220-
| I32x4 MinS -> SXX.I32x4.min_s
221-
| I32x4 MinU -> SXX.I32x4.min_u
222-
| I32x4 MaxS -> SXX.I32x4.max_s
223-
| I32x4 MaxU -> SXX.I32x4.max_u
224-
| I32x4 Mul -> SXX.I32x4.mul
225-
| I32x4 Eq -> SXX.I32x4.eq
226-
| I32x4 Ne -> SXX.I32x4.ne
227-
| I32x4 LtS -> SXX.I32x4.lt_s
228-
| I32x4 LtU -> SXX.I32x4.lt_u
229-
| I32x4 LeS -> SXX.I32x4.le_s
230-
| I32x4 LeU -> SXX.I32x4.le_u
231-
| I32x4 GtS -> SXX.I32x4.gt_s
232-
| I32x4 GtU -> SXX.I32x4.gt_u
233-
| I32x4 GeS -> SXX.I32x4.ge_s
234-
| I32x4 GeU -> SXX.I32x4.ge_u
235-
| I64x2 Add -> SXX.I64x2.add
236-
| I64x2 Sub -> SXX.I64x2.sub
237-
| I64x2 Mul -> SXX.I64x2.mul
238-
| F32x4 Eq -> SXX.F32x4.eq
239-
| F32x4 Ne -> SXX.F32x4.ne
240-
| F32x4 Lt -> SXX.F32x4.lt
241-
| F32x4 Le -> SXX.F32x4.le
242-
| F32x4 Gt -> SXX.F32x4.gt
243-
| F32x4 Ge -> SXX.F32x4.ge
244-
| F32x4 Add -> SXX.F32x4.add
245-
| F32x4 Sub -> SXX.F32x4.sub
246-
| F32x4 Mul -> SXX.F32x4.mul
247-
| F32x4 Div -> SXX.F32x4.div
248-
| F32x4 Min -> SXX.F32x4.min
249-
| F32x4 Max -> SXX.F32x4.max
250-
| F32x4 Pmin -> SXX.F32x4.pmin
251-
| F32x4 Pmax -> SXX.F32x4.pmax
252-
| F64x2 Eq -> SXX.F64x2.eq
253-
| F64x2 Ne -> SXX.F64x2.ne
254-
| F64x2 Lt -> SXX.F64x2.lt
255-
| F64x2 Le -> SXX.F64x2.le
256-
| F64x2 Gt -> SXX.F64x2.gt
257-
| F64x2 Ge -> SXX.F64x2.ge
258-
| F64x2 Add -> SXX.F64x2.add
259-
| F64x2 Sub -> SXX.F64x2.sub
260-
| F64x2 Mul -> SXX.F64x2.mul
261-
| F64x2 Div -> SXX.F64x2.div
262-
| F64x2 Min -> SXX.F64x2.min
263-
| F64x2 Max -> SXX.F64x2.max
264-
| F64x2 Pmin -> SXX.F64x2.pmin
265-
| F64x2 Pmax -> SXX.F64x2.pmax
266-
| V128 And -> SXX.V128.and_
267-
| V128 Or -> SXX.V128.or_
268-
| V128 Xor -> SXX.V128.xor
269-
| V128 AndNot -> SXX.V128.andnot
270-
| _ -> assert false
271-
in fun v1 v2 -> to_value (f (of_value 1 v1) (of_value 2 v2))
272-
273-
let testop (op : testop) =
274-
let f = match op with
275-
| I8x16 AnyTrue -> SXX.I8x16.any_true
276-
| I8x16 AllTrue -> SXX.I8x16.all_true
277-
| I16x8 AnyTrue -> SXX.I16x8.any_true
278-
| I16x8 AllTrue -> SXX.I16x8.all_true
279-
| I32x4 AnyTrue -> SXX.I32x4.any_true
280-
| I32x4 AllTrue -> SXX.I32x4.all_true
281-
| _ -> assert false
282-
in fun v -> f (of_value 1 v)
283-
284-
let relop op = assert false
285-
286-
let extractop op v =
287-
let v128 = of_value 1 v in
288-
match op with
289-
| I8x16 (SX, imm) -> (I32Op.to_value (SXX.I8x16.extract_lane_s imm v128))
290-
| I8x16 (ZX, imm) -> (I32Op.to_value (SXX.I8x16.extract_lane_u imm v128))
291-
| I16x8 (SX, imm) -> (I32Op.to_value (SXX.I16x8.extract_lane_s imm v128))
292-
| I16x8 (ZX, imm) -> (I32Op.to_value (SXX.I16x8.extract_lane_u imm v128))
293-
| I32x4 (_, imm) -> (I32Op.to_value (SXX.I32x4.extract_lane_s imm v128))
294-
| I64x2 (_, imm) -> (I64Op.to_value (SXX.I64x2.extract_lane_s imm v128))
295-
| F32x4 (_, imm) -> (F32Op.to_value (SXX.F32x4.extract_lane imm v128))
296-
| F64x2 (_, imm) -> (F64Op.to_value (SXX.F64x2.extract_lane imm v128))
297-
| _ -> assert false
298-
299-
let replaceop op v (r : Values.value) =
300-
let v128 = of_value 1 v in
301-
match op, r with
302-
| I8x16 imm, I32 r -> to_value (SXX.I8x16.replace_lane imm v128 r)
303-
| I16x8 imm, I32 r -> to_value (SXX.I16x8.replace_lane imm v128 r)
304-
| I32x4 imm, I32 r -> to_value (SXX.I32x4.replace_lane imm v128 r)
305-
| I64x2 imm, I64 r -> to_value (SXX.I64x2.replace_lane imm v128 r)
306-
| F32x4 imm, F32 r -> to_value (SXX.F32x4.replace_lane imm v128 r)
307-
| F64x2 imm, F64 r -> to_value (SXX.F64x2.replace_lane imm v128 r)
308-
| _ -> assert false
309-
310-
let ternop op =
311-
let f = match op with
312-
| Bitselect -> SXX.V128.bitselect
313-
in fun v1 v2 v3 -> to_value (f (of_value 1 v1) (of_value 2 v2) (of_value 3 v3))
314-
315-
let shiftop (op : shiftop) =
316-
let f = match op with
317-
| I8x16 Shl -> SXX.I8x16.shl
318-
| I8x16 ShrS -> SXX.I8x16.shr_s
319-
| I8x16 ShrU -> SXX.I8x16.shr_u
320-
| I16x8 Shl -> SXX.I16x8.shl
321-
| I16x8 ShrS -> SXX.I16x8.shr_s
322-
| I16x8 ShrU -> SXX.I16x8.shr_u
323-
| I32x4 Shl -> SXX.I32x4.shl
324-
| I32x4 ShrS -> SXX.I32x4.shr_s
325-
| I32x4 ShrU -> SXX.I32x4.shr_u
326-
| I64x2 Shl -> SXX.I64x2.shl
327-
| I64x2 ShrS -> SXX.I64x2.shr_s
328-
| I64x2 ShrU -> SXX.I64x2.shr_u
329-
| _ -> failwith "unimplemented shr_u"
330-
in fun v s -> to_value (f (of_value 1 v) (of_arg I32Value.of_value 2 s))
331-
332-
let bitmaskop (op : bitmaskop) v =
333-
let f = match op with
334-
| I8x16 Bitmask -> SXX.I8x16.bitmask
335-
| I16x8 Bitmask -> SXX.I16x8.bitmask
336-
| I32x4 Bitmask -> SXX.I32x4.bitmask
337-
| _ -> assert false
338-
in I32 (f (of_value 1 v))
339-
end
340-
341-
module V128Op = SimdOp (V128) (Values.V128Value)
342-
343120
(* Conversion operators *)
344121

345122
module I32CvtOp =
@@ -412,27 +189,6 @@ struct
412189
| DemoteF64 -> raise (TypeError (1, v, F64Type))
413190
end
414191

415-
module V128CvtOp =
416-
struct
417-
open Ast.SimdOp
418-
419-
let cvtop op v : value =
420-
match op with
421-
| I8x16 Splat -> V128 (V128.I8x16.splat (I32Op.of_value 1 v))
422-
| I16x8 Splat -> V128 (V128.I16x8.splat (I32Op.of_value 1 v))
423-
| I32x4 Splat -> V128 (V128.I32x4.splat (I32Op.of_value 1 v))
424-
| I64x2 Splat -> V128 (V128.I64x2.splat (I64Op.of_value 1 v))
425-
| F32x4 Splat -> V128 (V128.F32x4.splat (F32Op.of_value 1 v))
426-
| F64x2 Splat -> V128 (V128.F64x2.splat (F64Op.of_value 1 v))
427-
| _ -> assert false
428-
end
429-
430-
let eval_extractop extractop v = V128Op.extractop extractop v
431-
let eval_replaceop replaceop = V128Op.replaceop replaceop
432-
let eval_ternop ternop v = V128Op.ternop ternop v
433-
let eval_shiftop shiftop v = V128Op.shiftop shiftop v
434-
let eval_bitmaskop bitmaskop v = V128Op.bitmaskop bitmaskop v
435-
436192
(* Dispatch *)
437193

438194
let op i32 i64 f32 f64 v128 = function
@@ -442,8 +198,9 @@ let op i32 i64 f32 f64 v128 = function
442198
| F64 x -> f64 x
443199
| V128 x -> v128 x
444200

445-
let eval_unop = op I32Op.unop I64Op.unop F32Op.unop F64Op.unop V128Op.unop
446-
let eval_binop = op I32Op.binop I64Op.binop F32Op.binop F64Op.binop V128Op.binop
447-
let eval_testop = op I32Op.testop I64Op.testop F32Op.testop F64Op.testop V128Op.testop
448-
let eval_relop = op I32Op.relop I64Op.relop F32Op.relop F64Op.relop V128Op.relop
449-
let eval_cvtop = op I32CvtOp.cvtop I64CvtOp.cvtop F32CvtOp.cvtop F64CvtOp.cvtop V128CvtOp.cvtop
201+
let eval_unop = op I32Op.unop I64Op.unop F32Op.unop F64Op.unop Eval_simd.unop
202+
let eval_binop = op I32Op.binop I64Op.binop F32Op.binop F64Op.binop Eval_simd.binop
203+
let eval_testop = op I32Op.testop I64Op.testop F32Op.testop F64Op.testop Eval_simd.testop
204+
let eval_relop = op I32Op.relop I64Op.relop F32Op.relop F64Op.relop Eval_simd.relop
205+
let eval_cvtop = op I32CvtOp.cvtop I64CvtOp.cvtop F32CvtOp.cvtop F64CvtOp.cvtop Eval_simd.cvtop
206+

interpreter/exec/eval_numeric.mli

-5
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,3 @@ val eval_binop : Ast.binop -> value -> value -> value
77
val eval_testop : Ast.testop -> value -> bool
88
val eval_relop : Ast.relop -> value -> value -> bool
99
val eval_cvtop : Ast.cvtop -> value -> value
10-
val eval_extractop : Ast.extractop -> value -> value
11-
val eval_replaceop : Ast.replaceop -> value -> value -> value
12-
val eval_ternop : Ast.ternop -> value -> value -> value -> value
13-
val eval_shiftop : Ast.shiftop -> value -> value -> value
14-
val eval_bitmaskop : Ast.bitmaskop -> value -> value

0 commit comments

Comments
 (0)