@@ -117,229 +117,6 @@ end
117
117
module F32Op = FloatOp (F32 ) (Values. F32Value )
118
118
module F64Op = FloatOp (F64 ) (Values. F64Value )
119
119
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
-
343
120
(* Conversion operators *)
344
121
345
122
module I32CvtOp =
@@ -412,27 +189,6 @@ struct
412
189
| DemoteF64 -> raise (TypeError (1 , v, F64Type ))
413
190
end
414
191
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
-
436
192
(* Dispatch *)
437
193
438
194
let op i32 i64 f32 f64 v128 = function
@@ -442,8 +198,9 @@ let op i32 i64 f32 f64 v128 = function
442
198
| F64 x -> f64 x
443
199
| V128 x -> v128 x
444
200
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
+
0 commit comments