diff --git a/interpreter/binary/decode.ml b/interpreter/binary/decode.ml index 0ff11197e..f5802555e 100644 --- a/interpreter/binary/decode.ml +++ b/interpreter/binary/decode.ml @@ -424,6 +424,7 @@ let simd_prefix s = | 0xccl -> i64x2_shr_s | 0xcdl -> i64x2_shr_u | 0xcel -> i64x2_add + | 0xcfl -> i64x2_all_true | 0xd0l -> i64x2_ne | 0xd1l -> i64x2_sub | 0xd2l -> i64x2_extmul_low_i32x4_s diff --git a/interpreter/binary/encode.ml b/interpreter/binary/encode.ml index 56e3d9370..63f6be418 100644 --- a/interpreter/binary/encode.ml +++ b/interpreter/binary/encode.ml @@ -274,6 +274,7 @@ let encode m = | Test (V128 V128Op.(I8x16 AllTrue)) -> simd_op 0x63l | Test (V128 V128Op.(I16x8 AllTrue)) -> simd_op 0x83l | Test (V128 V128Op.(I32x4 AllTrue)) -> simd_op 0xa3l + | Test (V128 V128Op.(I64x2 AllTrue)) -> simd_op 0xcfl | Test (V128 _) -> assert false | Compare (I32 I32Op.Eq) -> op 0x46 diff --git a/interpreter/exec/eval_simd.ml b/interpreter/exec/eval_simd.ml index 2445f682a..7611401b7 100644 --- a/interpreter/exec/eval_simd.ml +++ b/interpreter/exec/eval_simd.ml @@ -187,6 +187,7 @@ module SimdOp (SXX : Simd.S) (Value : ValueType with type t = SXX.t) = struct | I8x16 AllTrue -> SXX.I8x16.all_true | I16x8 AllTrue -> SXX.I16x8.all_true | I32x4 AllTrue -> SXX.I32x4.all_true + | I64x2 AllTrue -> SXX.I64x2.all_true | _ -> assert false in fun v -> f (of_value 1 v) diff --git a/interpreter/syntax/operators.ml b/interpreter/syntax/operators.ml index e3351f844..c39efcd9c 100644 --- a/interpreter/syntax/operators.ml +++ b/interpreter/syntax/operators.ml @@ -410,6 +410,7 @@ let i64x2_ge_s = Binary (V128 V128Op.(I64x2 GeS)) let i64x2_abs = Unary (V128 V128Op.(I64x2 Abs)) let i64x2_neg = Unary (V128 V128Op.(I64x2 Neg)) let i64x2_bitmask = SimdBitmask Simd.I64x2 +let i64x2_all_true = Test (V128 V128Op.(I64x2 AllTrue)) 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 73422b6b0..86c9d62b5 100644 --- a/interpreter/text/arrange.ml +++ b/interpreter/text/arrange.ml @@ -194,6 +194,7 @@ struct | I8x16 AllTrue -> "i8x16.all_true" | I16x8 AllTrue -> "i16x8.all_true" | I32x4 AllTrue -> "i32x4.all_true" + | I64x2 AllTrue -> "i64x2.all_true" | V128 AnyTrue -> "v128.any_true" | _ -> assert false diff --git a/interpreter/text/lexer.mll b/interpreter/text/lexer.mll index d5f5ed121..7d1b8c83a 100644 --- a/interpreter/text/lexer.mll +++ b/interpreter/text/lexer.mll @@ -538,8 +538,7 @@ rule token = parse | "i8x16.popcnt" { UNARY i8x16_popcnt } | (simd_int_shape as s)".all_true" - { only ["i8x16"; "i16x8"; "i32x4"] s lexbuf; - UNARY (simd_int_op s i8x16_all_true i16x8_all_true i32x4_all_true unreachable) } + { UNARY (simd_int_op s i8x16_all_true i16x8_all_true i32x4_all_true i64x2_all_true) } | (simd_int_shape as s)".bitmask" { UNARY (simd_int_op s i8x16_bitmask i16x8_bitmask i32x4_bitmask i64x2_bitmask) } | (simd_int_shape as s)".shl" diff --git a/test/core/simd/simd_boolean.wast b/test/core/simd/simd_boolean.wast index 8eb0c8719..6ab330fe5 100644 --- a/test/core/simd/simd_boolean.wast +++ b/test/core/simd/simd_boolean.wast @@ -13,6 +13,7 @@ (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.all_true") (param $0 v128) (result i32) (i64x2.all_true (local.get $0))) (func (export "i64x2.bitmask") (param $0 v128) (result i32) (i64x2.bitmask (local.get $0))) ) @@ -158,6 +159,25 @@ (assert_return (invoke "i32x4.bitmask" (v128.const i32x4 -1 0 1 0xF)) (i32.const 0x00000001)) +;; i64x2 +(assert_return (invoke "i64x2.all_true" (v128.const i64x2 0 0)) + (i32.const 0)) +(assert_return (invoke "i64x2.all_true" (v128.const i64x2 0 1)) + (i32.const 0)) +(assert_return (invoke "i64x2.all_true" (v128.const i64x2 1 0)) + (i32.const 0)) +(assert_return (invoke "i64x2.all_true" (v128.const i64x2 1 1)) + (i32.const 1)) +(assert_return (invoke "i64x2.all_true" (v128.const i64x2 -1 0)) + (i32.const 0)) +(assert_return (invoke "i64x2.all_true" (v128.const i64x2 0x00 0x00)) + (i32.const 0)) +(assert_return (invoke "i64x2.all_true" (v128.const i64x2 0xFF 0xFF)) + (i32.const 1)) +(assert_return (invoke "i64x2.all_true" (v128.const i64x2 0xAB 0xAB)) + (i32.const 1)) +(assert_return (invoke "i64x2.all_true" (v128.const i64x2 0x55 0x55)) + (i32.const 1)) (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))