diff --git a/interpreter/binary/decode.ml b/interpreter/binary/decode.ml index e1764be68..8238a93c3 100644 --- a/interpreter/binary/decode.ml +++ b/interpreter/binary/decode.ml @@ -395,6 +395,7 @@ let simd_prefix s = | 0xbfl -> i32x4_extmul_high_i16x8_u | 0xc0l -> i64x2_eq | 0xc1l -> i64x2_neg + | 0xc4l -> i64x2_bitmask | 0xcbl -> i64x2_shl | 0xccl -> i64x2_shr_s | 0xcdl -> i64x2_shr_u diff --git a/interpreter/binary/encode.ml b/interpreter/binary/encode.ml index 662b0bd5a..3fee6eaae 100644 --- a/interpreter/binary/encode.ml +++ b/interpreter/binary/encode.ml @@ -622,6 +622,7 @@ let encode m = | SimdBitmask Simd.I8x16 -> simd_op 0x64l | SimdBitmask Simd.I16x8 -> simd_op 0x84l | SimdBitmask Simd.I32x4 -> simd_op 0xa4l + | SimdBitmask Simd.I64x2 -> simd_op 0xc4l | SimdBitmask (_) -> assert false | _ -> assert false diff --git a/interpreter/exec/eval_simd.ml b/interpreter/exec/eval_simd.ml index 6ab68766f..a5745af75 100644 --- a/interpreter/exec/eval_simd.ml +++ b/interpreter/exec/eval_simd.ml @@ -233,6 +233,7 @@ module SimdOp (SXX : Simd.S) (Value : ValueType with type t = SXX.t) = struct | Simd.I8x16 -> SXX.I8x16.bitmask | Simd.I16x8 -> SXX.I16x8.bitmask | Simd.I32x4 -> SXX.I32x4.bitmask + | Simd.I64x2 -> SXX.I64x2.bitmask | _ -> assert false in I32 (f (of_value 1 v)) diff --git a/interpreter/syntax/operators.ml b/interpreter/syntax/operators.ml index 936c0f791..7ad59a8d3 100644 --- a/interpreter/syntax/operators.ml +++ b/interpreter/syntax/operators.ml @@ -390,6 +390,7 @@ let i64x2_replace_lane imm = SimdReplace (V128Op.I64x2 imm) let i64x2_eq = Binary (V128 V128Op.(I64x2 Eq)) let i64x2_ne = Binary (V128 V128Op.(I64x2 Ne)) let i64x2_neg = Unary (V128 V128Op.(I64x2 Neg)) +let i64x2_bitmask = SimdBitmask Simd.I64x2 let i64x2_add = Binary (V128 V128Op.(I64x2 Add)) let i64x2_sub = Binary (V128 V128Op.(I64x2 Sub)) let i64x2_mul = Binary (V128 V128Op.(I64x2 Mul)) diff --git a/interpreter/text/arrange.ml b/interpreter/text/arrange.ml index cb53033c7..c20515a1e 100644 --- a/interpreter/text/arrange.ml +++ b/interpreter/text/arrange.ml @@ -406,6 +406,7 @@ struct | Simd.I8x16 -> "i8x16.bitmask" | Simd.I16x8 -> "i16x8.bitmask" | Simd.I32x4 -> "i32x4.bitmask" + | Simd.I64x2 -> "i64x2.bitmask" | _ -> assert false end diff --git a/interpreter/text/lexer.mll b/interpreter/text/lexer.mll index 9058de503..04707f059 100644 --- a/interpreter/text/lexer.mll +++ b/interpreter/text/lexer.mll @@ -536,8 +536,7 @@ rule token = parse { only ["i8x16"; "i16x8"; "i32x4"] s lexbuf; UNARY (simd_int_op s i8x16_all_true i16x8_all_true i32x4_all_true unreachable) } | (simd_int_shape as s)".bitmask" - { only ["i8x16"; "i16x8"; "i32x4"] s lexbuf; - UNARY (simd_int_op s i8x16_bitmask i16x8_bitmask i32x4_bitmask unreachable) } + { UNARY (simd_int_op s i8x16_bitmask i16x8_bitmask i32x4_bitmask i64x2_bitmask) } | (simd_int_shape as s)".shl" { SHIFT (simd_int_op s i8x16_shl i16x8_shl i32x4_shl i64x2_shl) } | (simd_int_shape as s)".shr_s" diff --git a/test/core/simd/simd_boolean.wast b/test/core/simd/simd_boolean.wast index 3fee25207..8eb0c8719 100644 --- a/test/core/simd/simd_boolean.wast +++ b/test/core/simd/simd_boolean.wast @@ -12,6 +12,8 @@ (func (export "i32x4.any_true") (param $0 v128) (result i32) (v128.any_true (local.get $0))) (func (export "i32x4.all_true") (param $0 v128) (result i32) (i32x4.all_true (local.get $0))) (func (export "i32x4.bitmask") (param $0 v128) (result i32) (i32x4.bitmask (local.get $0))) + + (func (export "i64x2.bitmask") (param $0 v128) (result i32) (i64x2.bitmask (local.get $0))) ) ;; i8x16 @@ -156,6 +158,11 @@ (assert_return (invoke "i32x4.bitmask" (v128.const i32x4 -1 0 1 0xF)) (i32.const 0x00000001)) +(assert_return (invoke "i64x2.bitmask" (v128.const i64x2 0xFFFFFFFF_FFFFFFFF 0xFFFFFFFF_FFFFFFFF)) + (i32.const 0x00000003)) +(assert_return (invoke "i64x2.bitmask" (v128.const i64x2 -1 0xF)) + (i32.const 0x00000001)) + ;; Combination (module (memory 1)