Skip to content

Commit 961e583

Browse files
committed
Implement i64x2.bitmask (WebAssembly#368)
This was accepted into this proposal in WebAssembly#410.
1 parent 20e914b commit 961e583

File tree

7 files changed

+13
-2
lines changed

7 files changed

+13
-2
lines changed

interpreter/binary/decode.ml

+1
Original file line numberDiff line numberDiff line change
@@ -372,6 +372,7 @@ let simd_prefix s =
372372
| 0xb9l -> i32x4_max_u
373373
| 0xbal -> i32x4_dot_i16x8_s
374374
| 0xc1l -> i64x2_neg
375+
| 0xc4l -> i64x2_bitmask
375376
| 0xcbl -> i64x2_shl
376377
| 0xccl -> i64x2_shr_s
377378
| 0xcdl -> i64x2_shr_u

interpreter/binary/encode.ml

+1
Original file line numberDiff line numberDiff line change
@@ -601,6 +601,7 @@ let encode m =
601601
| SimdBitmask Simd.I8x16 -> simd_op 0x64l
602602
| SimdBitmask Simd.I16x8 -> simd_op 0x84l
603603
| SimdBitmask Simd.I32x4 -> simd_op 0xa4l
604+
| SimdBitmask Simd.I64x2 -> simd_op 0xc4l
604605
| SimdBitmask (_) -> assert false
605606

606607
| _ -> assert false

interpreter/exec/eval_simd.ml

+1
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,7 @@ module SimdOp (SXX : Simd.S) (Value : ValueType with type t = SXX.t) = struct
221221
| Simd.I8x16 -> SXX.I8x16.bitmask
222222
| Simd.I16x8 -> SXX.I16x8.bitmask
223223
| Simd.I32x4 -> SXX.I32x4.bitmask
224+
| Simd.I64x2 -> SXX.I64x2.bitmask
224225
| _ -> assert false
225226
in I32 (f (of_value 1 v))
226227

interpreter/syntax/operators.ml

+1
Original file line numberDiff line numberDiff line change
@@ -379,6 +379,7 @@ let i64x2_mul = Binary (V128 V128Op.(I64x2 Mul))
379379
let i64x2_shl = SimdShift V128Op.(I64x2 Shl)
380380
let i64x2_shr_s = SimdShift V128Op.(I64x2 ShrS)
381381
let i64x2_shr_u = SimdShift V128Op.(I64x2 ShrU)
382+
let i64x2_bitmask = SimdBitmask Simd.I64x2
382383

383384
let f32x4_splat = Convert (V128 V128Op.(F32x4 Splat))
384385
let f32x4_extract_lane imm = SimdExtract (V128Op.F32x4 (ZX, imm))

interpreter/text/arrange.ml

+1
Original file line numberDiff line numberDiff line change
@@ -394,6 +394,7 @@ struct
394394
| Simd.I8x16 -> "i8x16.bitmask"
395395
| Simd.I16x8 -> "i16x8.bitmask"
396396
| Simd.I32x4 -> "i32x4.bitmask"
397+
| Simd.I64x2 -> "i64x2.bitmask"
397398
| _ -> assert false
398399

399400
end

interpreter/text/lexer.mll

+1-2
Original file line numberDiff line numberDiff line change
@@ -532,8 +532,7 @@ rule token = parse
532532
{ only ["i8x16"; "i16x8"; "i32x4"] s lexbuf;
533533
UNARY (simd_int_op s i8x16_all_true i16x8_all_true i32x4_all_true unreachable) }
534534
| (simd_int_shape as s)".bitmask"
535-
{ only ["i8x16"; "i16x8"; "i32x4"] s lexbuf;
536-
UNARY (simd_int_op s i8x16_bitmask i16x8_bitmask i32x4_bitmask unreachable) }
535+
{ UNARY (simd_int_op s i8x16_bitmask i16x8_bitmask i32x4_bitmask i64x2_bitmask) }
537536
| (simd_int_shape as s)".shl"
538537
{ SHIFT (simd_int_op s i8x16_shl i16x8_shl i32x4_shl i64x2_shl) }
539538
| (simd_int_shape as s)".shr_s"

test/core/simd/simd_boolean.wast

+7
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
(func (export "i32x4.any_true") (param $0 v128) (result i32) (i32x4.any_true (local.get $0)))
1313
(func (export "i32x4.all_true") (param $0 v128) (result i32) (i32x4.all_true (local.get $0)))
1414
(func (export "i32x4.bitmask") (param $0 v128) (result i32) (i32x4.bitmask (local.get $0)))
15+
16+
(func (export "i64x2.bitmask") (param $0 v128) (result i32) (i64x2.bitmask (local.get $0)))
1517
)
1618

1719
;; i8x16
@@ -156,6 +158,11 @@
156158
(assert_return (invoke "i32x4.bitmask" (v128.const i32x4 -1 0 1 0xF))
157159
(i32.const 0x00000001))
158160

161+
(assert_return (invoke "i64x2.bitmask" (v128.const i64x2 0xFFFFFFFF_FFFFFFFF 0xFFFFFFFF_FFFFFFFF))
162+
(i32.const 0x00000003))
163+
(assert_return (invoke "i64x2.bitmask" (v128.const i64x2 -1 0xF))
164+
(i32.const 0x00000001))
165+
159166
;; Combination
160167

161168
(module (memory 1)

0 commit comments

Comments
 (0)